Runner in the High

技術のことをかくこころみ

プログラミング

Golangではinterfaceはどのパッケージに属するのか

Golangを使い始めてinterfaceでDIPっぽいことをしようとするとたしかに湧きがちな疑問のひとつ。結論から言うと、interfaceはそれを使う側のパッケージに所属させるのがセオリーらしい。なるほど。 Go interfaces generally belong in the package that uses…

依存関係について再び考える

izumisy-tech.hatenablog.com あとからこの過去記事を読み返して「ムム」と思うところがあったので改めて。 CategoryId ではなく Category を引数として渡すことでデータ構造が隠蔽されているという旨の説明をしているが、これは fetchArtclesByCategory を…

JavaScriptにおける配列操作の計算量オーダー

日本語だとググっても出てこなかったのでまとめた 操作 計算量 添字アクセス O(1) 挿入(splice) O(n) 削除(splice) O(n) 削除(delete) O(1) 最後に追加 O(1) 先頭に追加 O(n) スワップ O(1) 添字アクセスがO(1)だったりするのは、JavaScriptの配列は連結リス…

AnyValを継承する意味

ScalaでDDDなコードのアプリケーションを作ろうとしているときに UserId など値型はどうするべきか の記事を読み、「専用の値クラスを作る」のパターンでふと 「ここでケースクラスが AnyVal を継承する理由ってなんだ...?」 と思ったので調べた。 case cla…

Rubyにおけるポリモーフィズムとダック・タイピング

自分がOOPをそれっぽく学んだのは、サンディ・メッツの「オブジェクト指向設計実践ガイド」だが、この本だとダック・タイピングはバキバキにでてくる一方であまりポリモーフィズムについては詳しく書かれていない。thoughtbotのブログの記事、Rubyとポリモー…

D言語で作るTCPサーバの最小構成

コネクションプーリングとかワーカスレッドの多重化とかやってないめっちゃ簡易版。 import std.stdio; import std.socket; import core.thread; void main() { Socket server = new TcpSocket(); server.setOption(SocketOptionLevel.SOCKET, SocketOption.…

なんらかの処理において、できるだけその処理は依存するモデルのデータ構造をしりすぎないほうがよい?

たとえばSPAにおいて 「あるカテゴリに紐づく記事一覧を取得する」 という実装があるとする このような処理を実装するにあたっては、各レイヤによって知ってよいことと、知っててはいけないものが変わってくる。 例えばバックエンドが、RDBMSのようなIDによ…

入門ROM.rb 第3回: Repository

さーて、お待ちかねのROM.rb入門の第3回はRepositoryから。 前回の記事はRelationを説明していますので、読んでない人は参考までに。 izumisy-tech.hatenablog.com Repository リポジトリと聞くと文脈的にPoEAAやDDDっぽい雰囲気を感じる人が多いのではない…

入門ROM.rb 第2回: Relation

さて、入門ROM.rbの第2回は、まずRelationから。 ROM.rbとはなんぞやという方は第1回の下の記事からどうぞ。 izumisy-tech.hatenablog.com 入門なのでいきなりSinatraやRailsとどう使うか、ではなくワンソースでどういうAPIがあって、どう使うのか、というと…

D言語でforkを使う

core.sys.posix.unistdの中にある。使い方はforkそのまま。 import std.stdio; import core.thread; import core.stdc.stdlib; import core.sys.posix.unistd; void main() { auto pid = core.sys.posix.unistd.fork(); if (pid == 0) { writeln("child work…

D言語でstd.signalsを使ったオブザーバー実装

std.signalsというモジュールを使うとオブザーバー・パターンの実装が簡単にできる。 この例ではひとつのオブザーバーしか登録していないが、複数のオブザーバーを登録した上で一気にシグナルを発行できる。 dlang.org import std.signals; import std.stdio…

D言語でCtrl-Cのシグナルハンドラを登録する

whileループからCtrl-Cで抜ける処理を横取りしたいときに。 import std.stdio; import core.thread; import core.stdc.stdlib; import core.sys.posix.signal; extern (C) { void cleanup(int signal) { writeln("cleanup"); exit(1); } } void main() { sig…

SAMパターンの大雑把な理解

SAMパターンというのを勉強している。 www.infoq.com この記事は少しだけはてブでバズったが、実際コレを読んだだけでは例えば実際に実装に落としたときにどういうデータ・フローになるのか、というところまでは若干理解しづらい。この記事の作者のDubrayはs…

Yeomanに代わるNode.jsのスキャフォルディングツール4選

ハッカソンや個人開発でよく使う自分でこしらえたアプリケーションのスケルトン・コードをGithubに置いて、それを気軽にスキャフォルディングしたい。こんな欲求はだれしもあると思う。スキャフォルディング・ツールの王道といえばYeomanだが、ちょっとYeoma…

Reactの優位性は関数っぽいアプローチができるところなのではないかと思う

何が言いたいのかというと、Vue.js, React, Angularなどここ最近のフロントエンド界隈を賑わせているフレームワークはたくさんあるけれども、その中でビューレイヤという責務に対して最も薄いアプローチをしているのがReactで、もっとも関数らしい副作用のな…

入門ROM.rb 第1回: イントロダクション

RubyといえばRails、RailsといえばActiveRecordというくらいに、事実上ActiveRecordはRuby界隈におけるORマッパのデファクトスタンダードだ。しかしながら、Piotr Solnicaというソフトウェア・エンジニアは、ActiveRecordパターンが常にスケーラブルなアプリ…

validatable-recordについて

www.npmjs.com validatable-recordというモジュールをすこし前に作った。Twitterでは軽く流したが、実際にはこれを作ろうと思ったモチベーションが少なからずあったので、自分自身の学びやのちのちの振り返りのためにも、そのモチベーションについてここに書…

フレームワーク・ライブラリを選ぶということ

「とりあえず、ググったら大抵解決しそうなんでReduxを使おうと思います」 2016年の夏、僕はあるフリマアプリで有名なECスタートアップでインターン生として、商品を販売するユーザー向けのアプリケーションのプロトタイピングをしていた。ほとんどすべての…

モデルの中でセッションを使う

ときたまセッションに関連するロジックをモデルの中に作りたいときがある。ところが、原則的にRailsではセッションをモデルの中で操作することができない。 この問題を解決する最も簡単な方法は、モデルに生やしたメソッドへセッションのインスタンスを渡す…

コントローラを名前空間で分離して責務の分割をする

Deviseなどを使って、ひとつ以上のスコープを持つアプリケーションを開発している際に、RESTfulなコントローラとビューが1対1対応をしていると、コントローラがどうしても複数のスコープが絡みついた見通しの悪いコードになりがちである。 たとえば、ECカー…

Chrome Extensionのbackground pageでconstを使うのに気をつけよ

Chrome Extensionではbackgroundを使っている方々各位にお伝えしたいのがなんといつのまにやらconstで定義した変数がextension.getBackgroundPageメソッドから取れなくなっているということ background.js ...const NOTIFY_ID = "default";const ITEMS_ID = …

loadstop イベントより細かい request.onCompleted を使う

Chrome API の WebView にはページのロードが終了した時に発生する loadstop というイベントが存在する。これを用いたサンプルが公式のドキュメントにあるのだが、ここにひとつ注意したい点がある。 onload = function() { var webview = document.getElemen…

Webview 内のデータを取得するメモ

webview を用いて表示させたページのソースやらなにやらのようなデータを取得する手段がドキュメントのどこにも書かれていないので困ったが、いろいろ調べたら見つかった。 var view = document.getElementById("web-view-test");view.executeScript({ code:…

Chrome Dev EditorではGitで512kb以上のコミットをプッシュできない

Error whilst pushing changes #3456 - Chrome Dev EditorGit push fails for huge changes. #2553 - Chrome Dev Editor詳しくは上の2つのチケットを参照のこと。Chrome Dev Editor(CDE)ではjs-gitというGitをJavaScriptで実装したものを利用してコミット…

chrome.browsingDataの呼び出し回数制限

どうやらchrome.browsingDataには規定時間内の呼び出し回数制限があるらしい。確かにコンマ何秒位の差で何度も呼び出されちゃオーバーヘッドも大きそうだしね。みたところ、1秒未満の間に何度も呼びだそうとすると、エラーになるらしい。もしかすると他にも…

Chrome.storage.syncを使ってみる

Chrome.storageを使うと、異なるマシン上のChromeブラウザ間で同じ拡張機能が保存しているstorageを同期してくれる。このサンプルの機能は、テキストボックスに入力された文字列をChrome.storage.sync.setでストア。起動時にChrome.storage.sync.getで読み込…

履歴への記録を防ぐChrome拡張機能「History Blocker」を作った

History Blocker 気づいたらエロサイトを見始めてた、という状況になってからシークレットウィンドウに切り替えてももう遅い。履歴にはばっちり残っちゃってる。こんなトラブルを防いでくれるのが History Blocker(IzumiSy/HistoryBlocker)拡張機能をONにし…

CUIでWeblioを使う

LTN with VX Connect LifetouchNOTE用の手頃な日英辞書がなくて困っていたので作った。HTML::TreeBuilderでweblioの単語検索結果ページをスクレイピングしているだけ。単語の大まかな意味だけでもわかれば充分なので、割りといいハックだと思う。 #!/usr/bin…

QtMultimediaを使ってメディアファイルに埋め込まれたアルバムアートを取得

coverImage = player->metaData(QMediaMetaData::ThumbnailImage).value(); こうすると、変数player(QMediaPlayer型)にセットされているメディアファイルの埋め込みサムネイルがQImage型で変数coverImageに代入される。QMediaMetaData Namespace のページを…

ターミナルからGoogle検索をかける

ターミナルから直接Web検索をかけるられるようにperlでスクリプト組んだらすごい便利だった。 #!/usr/bin/perluse strict;use warnings;use utf8;use Encode;our $args = decode_utf8($ARGV[0]);foreach my $i (1 .. $#ARGV) { $args = $args . "+" . decode…