タグ

ブックマーク / kazuhooku.hatenadiary.org (44)

  • DRY(don't repeat yourself)するかしないか、その判断基準について - kazuhoのメモ置き場

    「過剰なDRYが技術的負債を生む」みたいな内容の記事を書きたいが、うまく言語化できない。「過剰な事制限が健康を損なう」程度の内容に成り下がりそうだけど、そんなんじゃないんだよ… @methane 実装におけるDRYみたいなものを考えていて、そうすると前者のDRYというのがどこに位置づけられるかはわからないんですが、とにかく暗黙知みたいなものを過剰に増やすDRYは良くないよね、というような話なんです という@moriyoshitさんのツイート(1, 2)を見かけたので、僕の考え方をコメント。moriyoshitさんの考えたい問題とは、ずれてるかも。 DRY化の功罪とは何か? 僕の理解で言うと、共通するコード片をDRY化することには以下の変化をもたらす。 循環的複雑度は変化しない コールグラフは複雑化する モジュールをまたぐDRY化を行うと、モジュール間の依存関係も複雑化する*1 関数内の複

    DRY(don't repeat yourself)するかしないか、その判断基準について - kazuhoのメモ置き場
    yuiseki
    yuiseki 2014/02/20
  • テストファーストなGitワークフローについて - kazuhoのメモ置き場

    Gitのワークフローに関する話題が、また盛り上がっているようなので、僕が好んで使っているワークフローについて書きます。 対象としているソフトウェアは、GitHubGitHub Enterprise等を使って開発されている、リリースブランチを切らずにmasterにリリースタグを打っていくだけで十分な程度の、ウェブサービス(の部品)やオープンソースプロジェクトです。 まず、以下の2点を原則として考えています。 origin masterを壊さない origin masterの(1st parentをたどるツリー)にテストを通らないcommitを入れないよう努めます 変更の主題を常に明確にする 前者の理由は、masterをいつでもリリース可能な品質に保つためと(←12:44追記)git bisectするときに困らないようにするため。そして、これらの原則から、以下のようなワークフローで作業するこ

    テストファーストなGitワークフローについて - kazuhoのメモ置き場
  • WebSocket(RFC 6455)上で使用するプロトコル設計についての備忘録 - kazuhoのメモ置き場

    一般論として、全二重の通信プロトコルを実装するにあたっては、いくつか注意すべき点があって、具体的には、到達確認と切断シーケンスについて定めておかないと、送達されたはずのメッセージがロストしていたり、切断タイミングによってエラーが発生*1したりする。 具体例をあげると、たとえばTCP/IPにおいてshutdown(2)を用いずに、いきなりclose(2)を呼んでいると、read(2)やwrite(2)がエラー(ECONNRESET)を返す場合がある。 翻って、WebSocket (RFC6455)の場合はどうなってるか? だいたい以下のような感じっぽい。 ws.close()が呼び出されるとWebSocketをCLOSING状態に変更し、Closeフレームを送信する ws.onmessageはWebCosketがCLOSING状態にある間も呼ばれるかもしれない*2 相手からCloseフレーム

    WebSocket(RFC 6455)上で使用するプロトコル設計についての備忘録 - kazuhoのメモ置き場
    yuiseki
    yuiseki 2014/01/28
  • 「今日使われているプログラミング言語の多くは、なぜ1990年前後に誕生したものなのか」に関する一考察 - kazuhoのメモ置き場

    若い人たちは、「文字列型」があるプログラミング言語しか知らないかもしれない。だが、汎用的な文字列型が一般的になったのは、プログラミング言語の歴史の中でも比較的最近のことである。 たとえば、1972年に誕生したC言語には文字列型がない。1980年代に良く使われていたPascalの文字列型は最大255文字しか格納できなかった。 なぜか? それはメモリが貴重なリソースだったから。 1980年代のPCの搭載メモリは多くて数メガバイト。これに対し、長編小説の長さは1MB程度に達する*1。 当時、メモリはとても貴重な資源であり、テキストを処理するプログラムを開発するにあたっては、文字列をどのようにメモリ内に展開するかプログラマが細かくコーディングする必要があった。 だから、汎用的な「文字列型」というのは「夢」にすぎなかった。CあるいはPascalにおける文字列(CのASCIIZ文字列あるいはPasca

    「今日使われているプログラミング言語の多くは、なぜ1990年前後に誕生したものなのか」に関する一考察 - kazuhoのメモ置き場
    yuiseki
    yuiseki 2013/12/21
  • mmapのほうがreadより速いという迷信について - kazuhoのメモ置き場

    @ITに以下のような記事が出て、 今回からしばらくの間は、まったく逆の例、つまり使うとプログラムの処理性能が上がるというシステムコールを紹介していく。システムコールを呼ぶ回数は少ない方が処理性能は高くなるという原則は変わらないが、呼び出しておくと処理性能が向上するシステムコールというものが存在するのだ。こうしたシステムコールを使わないでいることは、とてももったいない。 今回紹介するシステムコールは「mmap(2)」だ。ここでは詳しく仕組みを解説しないが、mmap(2)は、プログラムの処理性能に必ず良い影響を与える。 やはりあった? 高速化に効くシステムコール (1/2):知ってトクするシステムコール(3) - @IT それを真に受けたのか、「Go言語でmmapシステムコールを使ったファイル読み込みの高速化検討とC言語のコンパイラの話 - ryochack.blog」のようなブログエントリも

    mmapのほうがreadより速いという迷信について - kazuhoのメモ置き場
    yuiseki
    yuiseki 2013/11/30
  • ディレクトリの変更を監視して、任意のコマンドを再起動する話 - kazuhoのメモ置き場

    plackup -R とか grunt-contrib-watch とか、ウェブアプリケーションの処理系とかビルドツールには、割とこの手のものが組み込まれているんだけど、Windows を無視できるなら、*1外部ツールを使えばいいわけで。 具体的には App-watcher-0.11 - watch the file updates - metacpan.org をインストールして % watcher --dir src -- cmd args...みたいな感じで起動すれば、src ディレクトリに変更があると cmd を SIGTERM で終了して再起動してくれるから捗ると #soozy で聞きました。 参考文献: Plack::Loader::RestarterとPlack::Loader::Shotgun - すぎゃーんメモ grunt-contrib-watch が重いので grun

    ディレクトリの変更を監視して、任意のコマンドを再起動する話 - kazuhoのメモ置き場
    yuiseki
    yuiseki 2013/10/18
    gruntは単にコマンド再起動だけじゃなくて更新ファイルの条件に応じて任意のタスクをトリガーできるのが便利 このwatcherとやらを10個別々に起動しないといけないような事がコマンド一発でできる
  • LTSV のもうひとつのメリット、あるいは、プログラムでログを出力する際に気をつけるべきこと - kazuhoのメモ置き場

    Labeled Tab-separated Values (LTSV) がブームのようです。 LTSV については、ラベルをつけることで柔軟に拡張できるという点が、その特徴として取り上げられますが、もう一点、タブをセパレータに使うことでログのパースが簡単になった、という点を忘れるべきではないでしょう。 特に httpd のログは NCSA httpd という HTTP/0.9 時代のWebサーバのログフォーマットがベースに拡張されてきたため、以下のようにセパレータとして空白、[]、ダブルクォート ("")*1が混在するという、とても処理しづらいものになっていました。どれほど複雑かは「404 Blog Not Found:perl - Apache Combined Log を LTSV に」の実装を見れば明らかでしょう。 127.0.0.1 - - [08/Feb/2012:23:52:4

    LTSV のもうひとつのメリット、あるいは、プログラムでログを出力する際に気をつけるべきこと - kazuhoのメモ置き場
    yuiseki
    yuiseki 2013/02/10
  • JavaScript(V8)で避けるべき(だった?)クロージャの使い方 - kazuhoのメモ置き場

    Grokking V8 closures for fun (and profit?) に、ほんの少しだけ触れられている話なんですが。 ごく最近まで V8 には、オブジェクトリテラルの中で関数リテラルを使った場合に非常に遅くなる(というかGCが多発する)問題があった。 たとえば、 function doit() { for (var i = 0; i < 1000; ++i) { for (var j = 0; j < 1000; ++j) { var o = { f: function () { return i + j; } }; } } } doit(); というコードを node-0.6.19 で実行すると、以下のように mark-sweep GC が大量に発生して処理に時間がかかっていることが分かる。 $ time /usr/local/node-0.6.19/bin/node -

    JavaScript(V8)で避けるべき(だった?)クロージャの使い方 - kazuhoのメモ置き場
    yuiseki
    yuiseki 2012/12/19
  • ZERO WIDTH SPACE を使って Unicode ステガノグラフィ - kazuhoのメモ置き場

    inspired by Yappo id:T​​​​​​K​​​​​S​​​​​​K​​​ かっこいい 上のテキスト、一見 id:TKSK を褒めているいるようですが、実は別の人をほめています。下線のリンクが無いでしょ? ちなみに、以下の perl スクリプトを通すと、誰をほめているのかわかります。 perl -Mutf8 -MEncode -we 'undef $/; $s = decode_utf8(<STDIN>); $s =~ s!([\x{200b}|\x{feff}]+)!pack("B*", join("", map { $_ eq "\x{200b}" ? 0 : 1 } split("", $1)))!eg; print encode_utf8($s)'この隠しデータを作るには、以下のようにします。 echo "you can see here (

    ZERO WIDTH SPACE を使って Unicode ステガノグラフィ - kazuhoのメモ置き場
    yuiseki
    yuiseki 2012/08/15
  • JSX はなぜ「速い」のか - kazuhoのメモ置き場

    なぜ「速い」のか、について JSX 開発者の立場から。 たとえば、シューティングゲームで一番重たい処理は何か。言うまでもなく衝突判定。多数の弾や敵機の衝突判定を毎フレームごとに行う必要があり、この演算が重たい。 JSX に同梱されている web/example/shooting.jsx には衝突判定のコードが複数あるが、一番重たいのは Bullet#update 関数で、その処理は以下のようになっている*1。 for (var rockKey in st.rocks) { var rock = st.rocks[rockKey]; if (this.detectCollision(rock)) { if (rock.hp == 0) return false; inDisplay = false; if (--rock.hp == 0) { st.score = Math.min(st.s

    JSX はなぜ「速い」のか - kazuhoのメモ置き場
    yuiseki
    yuiseki 2012/06/03
  • node.js におけるエラー処理のコーディングパターン (もしくは非同期 JavaScript における例外処理) - kazuhoのメモ置き場

    node.js を代表とする JavaScript を用いた非同期プログラミング環境においては、コーディングパターンのベストプラクティスが共有されておらず、結果として品質の低いコードが多くなるという問題があるように思います。そこで、特にエラー処理をどう書くべきか、既存のライブラリを使う方法を紹介してみることにしました。 いきなりですが、ファイルの文字数を返す関数を作ることを考えてみます。Java だと以下のような感じになるでしょうか。countChars メソッドに注目すると、エラーを例外として扱っていて、モジュラーかつ簡潔になっていることがわかります。 class FileCounter { static long countChars(String filename) throws IOException { FileInputStream is = new FileInputStre

    node.js におけるエラー処理のコーディングパターン (もしくは非同期 JavaScript における例外処理) - kazuhoのメモ置き場
    yuiseki
    yuiseki 2012/04/20
  • TwitterやFacebookのURLには、なぜ#!が含まれるのか (SEOとAjaxのおいしい関係) - kazuhoのメモ置き場

    Ajaxを使うためにはページ内リンク (hash fragment=URLの#以降) を使うのが一般的*1 hash fragmentはサーバに送信されないから、JavaScript非対応のブラウザだと動作しない 特にサーチエンジンのクローラ等で問題になる*2 そこで Google は、#! が含まれる URL を hash を含まないものに読み替える仕組みを提唱している。例えば「www.example.com/ajax.html#!key=value」のサーチエンジン用URLは「www.example.com/ajax.html?_escaped_fragment_=key=value」になる。 TwitterやFacebookはこの仕様に従うことで、Ajax な UISEO を同時に実現している、というわけ。ということを調べたなう。 参照: Getting Started  | 

    TwitterやFacebookのURLには、なぜ#!が含まれるのか (SEOとAjaxのおいしい関係) - kazuhoのメモ置き場
    yuiseki
    yuiseki 2010/10/13
  • 彼氏が LIKE 検索使ってた。別れたい… (もしくは Solr 入門とか Tritonn のインクリメンタルバックアップとか) - kazuhoのメモ置き場

    LIKE 検索だとデータ増えてきた時なんか恥ずかしいwww 下向いちゃうしww 男にはせめて全文検索エンジン使ってほしい・・・ 検索が遅すぎてユーザー帰っちゃったら・・・・もう最悪www せめて普通 Tritonn や Solr くらいは使って欲しい。 常識的に考えて欲しいだけなんです! 「%」検索されて全件マッチしちゃった時の恥ずかしさとか分かる? あのね?たとえば1年間で10万件とか文書がたまるでしょ? それを格納して検索するわけじゃない? みんな普通に形態素解析とかn-gramとか期待してるわけでしょ? LIKE検索でタイムアウトしてたら大恥かくでしょうがww とまあ、検索するなら全文検索エンジン使うしかないわけですが。じゃあ何を使うべきか。 自分は、ながらく Senna をベースにした MySQL の全文検索拡張 Tritonn のユーザーで、自分で機能追加のパッチも書いたりしてい

    彼氏が LIKE 検索使ってた。別れたい… (もしくは Solr 入門とか Tritonn のインクリメンタルバックアップとか) - kazuhoのメモ置き場
    yuiseki
    yuiseki 2010/06/26
  • XenServer と KVM のネットワークレイテンシ比較 - kazuhoのメモ置き場

    どちらのサーバも、秒間数十の HTTP 接続をハンドリングしている状態で、ping -c 100 で測定した平均値。 ホスト ゲスト XenServer*1 0.138 1.295 KVM*2 0.130 10.590 KVM のゲストだけが遅い。常に遅いっていうんじゃなくて、時々ひっかかる感じ。ping の出力 (rtt min/avg/max/mdev) を並べてみると以下のとおり。RTT で 0.1 秒以上かかったりする (しかもそういう状態が続く) ので、ssh を使ってると、まるで海外のサーバにつないでるみたいな感じになったり。 xen host: 0.095/0.138/1.238/0.116 ms xen guest: 0.111/1.295/42.471/6.023 ms kvm host: 0.060/0.130/0.334/0.070 ms kvm guest: 0.2

    XenServer と KVM のネットワークレイテンシ比較 - kazuhoのメモ置き場
    yuiseki
    yuiseki 2010/04/12
  • TCPサーバのテスト用に、空きポートを見つける方法 - kazuhoのメモ置き場

    Perl でサーバをテストするためのモジュール Test::TCP の作者 id:tokuhirom が言ってたことだけど、テスト用に空きポートを見つけるのは、bind の port 番号に 0 を渡すのが一番簡単。Perl で書くなら、こんな感じ。 my $unused_port = do { my $l = IO::Socket::INET->new( Listen => 5, LocalHost => '127.0.0.1', LocalPort => 0, Proto => 'tcp', ReuseAddr => 1, ) or die $!; $l->sockport; }; これで確保されるのは emphemeral port なので、取得したポート番号を再び使おうとする間に他のプログラムが (outgoing TCP connection のために) 使っちゃう可能性は論理的

    TCPサーバのテスト用に、空きポートを見つける方法 - kazuhoのメモ置き場
    yuiseki
    yuiseki 2010/02/20
  • Cosmic っていうネットワークストレージを作り始めた - kazuhoのメモ置き場

    GitHub - kazuho/cosmic: fail-safe management tools for network-based software RAID, using mdadm + iSCSI 概要 (というか近場の目標) は、以下のとおり。 fail-safe な network RAID 多重マウントが発生しないプロトコルを実装 RAID だから DRBD や MySQL の async replication のような lost updates 問題がない software RAID + NBD を使用 (NBD は遅いから iSCSI 対応するかも) RDBMS レベルのレプリケーションや DRBD と異なり、高可用性のあるブロックデバイスを提供するソフトウェアレイヤとして機能 様々なストレージミドルウェアを統一的に管理可能なので、管理コストが低い バックアップとかも

    Cosmic っていうネットワークストレージを作り始めた - kazuhoのメモ置き場
    yuiseki
    yuiseki 2010/02/05
  • 死んだプロセスのスタックトレースを自動収集するデーモンを書いた (そして、その出力を開発者に送ってあげると喜ばれるよという話) - kazuhoのメモ置き場

    死んだプロセス (あるいは kill したプロセス) の core イメージから自動的にスタックトレースを収集するデーモンを書いたので、これをセットアップしてサーバにインストールしとくといいかもです (kaztools/bt_cores at master · kazuho/kaztools · GitHub)。Linux のみ対応*1。使い方は bt_cores --help とするか、perl Makefile.PL && make install して man bt_cores。 具体的にいうと、Q4M とか Incline とか kazuho product が落ちたり固まったりしたらスタックトレース送ってくれると、私がうれしいです (古いバージョンのスタックトレースだととても悲しいです)。コアファイルは内部データがいろいろ入ってるから外部の人には見せられないけど、スタックトレース

    死んだプロセスのスタックトレースを自動収集するデーモンを書いた (そして、その出力を開発者に送ってあげると喜ばれるよという話) - kazuhoのメモ置き場
    yuiseki
    yuiseki 2010/01/23
  • ウェブアプリケーションサーバを複数台構成とか2010年代には流行らない - kazuhoのメモ置き場

    タイトルは煽り入ってますが。 仮に動的ページを生成するのにかかる時間が1秒、そのうちデータベースやmemcached等リモートサーバへの問い合わせ時間を除くいたCPUの処理時間が0.1秒とする。また、ピークのリクエスト処理量は、平均の2倍とする。 そうすると、クアッドコアのアプリケーションサーバで処理できるリクエストは、 4 core * 10 reqs/sec * 86,400 sec/day * 30 day/mon / 2 = 51,840,000 reqs/mon と、約5,000万PV/月を1台で捌けることになる。 CPUが動いている時間は全処理時間の10倍と仮定したわけだから、アプリケーションサーバの最大同時接続数は 4 core * 10 = 40 程度あればいいことになる。実際には、安全係数を2倍かけて 80 とか。リクエストの処理に必要なメモリ量を 100MB とすると、

    ウェブアプリケーションサーバを複数台構成とか2010年代には流行らない - kazuhoのメモ置き場
    yuiseki
    yuiseki 2009/12/27
  • 自作って得なのかなと思って計算してみた (自作サーバカンファレンス感想) - kazuhoのメモ置き場

    一昨日、自作サーバカンファレンスに参加してきました。とてもおもしろく色々刺激をうけました。はてなの田中さん楽天の方々始め、スピーカーの皆さんありがとうございました。ただ分からなかったのは、サーバを自作する必然性がどの程度あるのかな、という点でした。 確かに、発表者の方々が構築されているような、1CPU, 8GBメモリのような構成では、自作サーバには(少なくとも原価ベースでは)価格競争力があるようです。はてなさんは Core 2 Quad + 8GBメモリ + X25-M (SSD) で10万円という目安を提示してらっしゃいましたが、同等の構成をベンダーから購入するとなると、1.5〜2倍の価格になるのかな、と思います。例えばDELLのオンライン価格*1は以下のようになっています*2。 DELL PowerEdge R200 - \145,900- Xeon X3330 (2.66GHz, Q

    自作って得なのかなと思って計算してみた (自作サーバカンファレンス感想) - kazuhoのメモ置き場
    yuiseki
    yuiseki 2009/11/27
  • (特にMyISAMを使っていた)ウェブ屋さんがInnoDBを使う場合の設定項目 - kazuhoのメモ置き場

    InnoDBはMyISAMと比較して安全(OSクラッシュや電源断が発生してもテーブルが壊れない)分、書き込みが遅い。データベース屋さんからすると、それは当然のことでMyISAMがおかしいんだ、ということになり、だからバッテリバックアップ機能のついたRAIDカードを使うんだ、という話になる。でも、MyISAMを使っているウェブ屋さんの現場では、場合によって多少データが消えてもかまわないから、安いハードウェアで大量のアクセスを捌きたい... って乖離があるんじゃないかなーと思ってる。 そのような場合には、my.cnf の innodb_flush_log_at_trx_commit パラメータを調整することで、MyISAMに比肩する書き込み速度を得ることができる(そのかわり、クラッシュや電源断の場合は、設定によって直近1秒以内の変更が失われる)。 他のパラメータも含めて書いておくと、データベー

    (特にMyISAMを使っていた)ウェブ屋さんがInnoDBを使う場合の設定項目 - kazuhoのメモ置き場
    yuiseki
    yuiseki 2009/10/29