タグ

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

  • 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のメモ置き場
    nippondanji
    nippondanji 2014/02/20
    理論的(論理的ではなく)で面白い話。関数内の複雑度とコールグラフの複雑度は別のレイヤーの話なので直接比較は難しいと思うんだけど、それは経験とかセンスで判断するということなんだろうか。
  • 「今日使われているプログラミング言語の多くは、なぜ1990年前後に誕生したものなのか」に関する一考察 - kazuhoのメモ置き場

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

    「今日使われているプログラミング言語の多くは、なぜ1990年前後に誕生したものなのか」に関する一考察 - kazuhoのメモ置き場
    nippondanji
    nippondanji 2013/12/21
    ナイス考察。歴史にたらればはないのでタイミングって重要なんだなあとしみじも思う。
  • ソフトウェアのアップデートとウェブサービス運用における継続性リスクについて - kazuhoのメモ置き場

    Webサービスのようなプロダクトについての議論について教えて下さい - Kentaro Kuribayashi's blog で呼ばれたような気がしてたけど放置してた。でも今日、express という node.js 上で動作するメジャーなウェブアプリケーションフレームワークを作っているチームが、次世代の製品に取り組み始めたと聞いたので、メモを以下に貼ります。 ------------------------------ ✂ ------------------------------ ソフトウェア技術の配布手法のトレンドは以下のように推移してきた。 プロプライエタリ(仕様も実装もベンダー固有) オープンシステム(仕様は共通、実装はベンダー固有) オープンソース(実装を皆で共有) ハードウェアにしても、プロプライエタリから業界標準主導なアプローチにかわってきている。 つまり、時代とともに、

    ソフトウェアのアップデートとウェブサービス運用における継続性リスクについて - kazuhoのメモ置き場
    nippondanji
    nippondanji 2013/12/19
    "ただ、野良犬じゃあるまいし、おいしそうなものが公開されたからって片っ端から拾い食いするのが良くないのは言うまでもない。"
  • mmapのほうがreadより速いという迷信について - kazuhoのメモ置き場

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

    mmapのほうがreadより速いという迷信について - kazuhoのメモ置き場
  • MySQL用にランキング専用ストレージエンジンを作る話 - kazuhoのメモ置き場

    前提: ゲームに限らずランキング機能が必要になるケースは多い つまり需要はある だが、MySQLで高速なランキング表示は難しい 具体的に言うと、以下の要件を満たすのが不可能 1行の更新コストが要素数Nに対して O(log N) 以下 任意のランキング位置周辺のSELECTコストが O(log N) 以下 ならば、専用のストレージエンジンを作ればいいのではないか いつやるか? 今でしょ! 以下理由 MySQL 5.5以降?だとストレージエンジンをまたぐトランザクションがまともになってるはず*1 ランキング専用でいいから、テーブル構造とか固定でいい(つまり実装が簡単!) ランキング専用だから、テーブル・ロックで十分(つまり実装が簡単!) 更新すると順位がずれる(つまりテーブルの大部分に影響がある)ので行ロック実装するメリットが小さい*2 ランキング専用でいいから、全データをメモリにもっても問題

    MySQL用にランキング専用ストレージエンジンを作る話 - kazuhoのメモ置き場
  • 同時にwrite(2)すると混ざるかどうか - kazuhoのメモ置き場

    Linux のシステムコールである write(2) の ドキュメントを読むと Atomic/non-atomic: A write is atomic if the whole amount written in one operation is not interleaved with data from any other process. This is useful when there are multiple writers sending data to a single reader. Applications need to know how large a write request can be expected to be performed atomically. This maximum is called {PIPE_BUF}. This volume of

    同時にwrite(2)すると混ざるかどうか - kazuhoのメモ置き場
  • Monoceros雑感 - kazuhoのメモ置き場

    Monoceros は @kazeburo さんが開発してる Plack 用ウェブサーバ。prefork型だけど、待機中の接続をイベントドリブンのマネージャで管理することで、同時接続10,000とか行ける(ソケットの受け渡しは SCM_RIGHTS とか使う)。 で、雑感 大好き!!! Starletより遅い問題は、以下のようにすれば解決できると思う listen するソケットに TCP_DEFER_ACCEPT つけて、accept(2) は worker でのみ実行する worker は HTTP レスポンス送信後に read(2) してみて、後続のリクエストが来てない場合にのみ、マネージャプロセスにソケットを返還する (追記) 「返還」ではなく、マネージャプロセスが管理しているソケットのいずれかにデータがきている場合のみ、そのソケットとworkerのソケットを「交換」する、とすれば

    Monoceros雑感 - kazuhoのメモ置き場
  • haXe と JSX の最大の違いは null と undefined の扱い - kazuhoのメモ置き場

    JavaScript のコードをデバッグ中、突然出現する null や undefined に苦しめられている方も多いのではないでしょうか。haXe と JSX の一番大きな差は、個人的には、その null (と undefined) の扱いにあると考えています。 haXe の JavaScript 実装では、全ての基型が nullable とされています*1。つまり、たとえば haXe の Bool 型は true, false, null の3つの値を取りうることになります*2。null が入っているかどうかはプログラマがいちいち確認する必要があります。 // haXe class Test { static function f(b : Bool) : Void { if (b == true) { // b is true } else if (b == false) { //

    haXe と JSX の最大の違いは null と undefined の扱い - kazuhoのメモ置き場
    nippondanji
    nippondanji 2012/06/06
    素晴らしい。3VLは心が折れる。
  • Amazon AWS と NIFTY や Rackspace のクラウド (IaaS) は、技術的にどう違うのか - kazuhoのメモ置き場

    AWS はコンポーネント指向の IaaS 現時点でのクラウドコンピューティングの大勢は、リソースをオールインワンで提供すること。一般ユーザーにとっての SaaS なアプリケーションは、もちろんそうだし、開発者にとっての Google App Engine も然り。 Amazon AWS も、EC2 や S3, Relational Database Service, Elastic Load Balancer といったサービスコンポーネントを Amazon が提供し、それを開発者が組み合わせて可用性の高いサービスを構築するようになっている。 コンピューティングリソースと、基盤ソフトウェアコンポーネントがセットで提供されているというのは、IBM PC以前のパソコンを思い出すような... Rackspace Cloud や NIFTY Cloud は VM 指向 一方、AWS に継ぐ IaaS

    Amazon AWS と NIFTY や Rackspace のクラウド (IaaS) は、技術的にどう違うのか - kazuhoのメモ置き場
  • MySQL や PostgreSQL でトリガーベースの実体化ビューを後から追加する方法 (もしくは無停止での CREATE INDEX) - kazuhoのメモ置き場

    読み込み>書き込みなデータベースだと、実体化ビュー (materialized view) を使って読み込み速度を上げるってのは有効な手法 ちなみに MySQL や PostgreSQL だと実体化ビューはトリガーを使って書く *1 では、トリガーベースの実体化ビューを後から追加した場合に、どうやって既存データを新しいビューに反映させるのか。 UPDATE トリガを、ビューの側に対応するデータがない場合は INSERT トリガと同様の動作をするように実装すればいい (典型的には REPLACE INTO 文を使う)。ビューの初期データ充填は UPDATE src_table SET id=id; MySQL だと CREATE INDEX CONCURRENTLY がないから副インデックス作成はスレーブでやったりする*2けど、上の UPDATE を LIMIT つきで回すことで、ビューをイ

    MySQL や PostgreSQL でトリガーベースの実体化ビューを後から追加する方法 (もしくは無停止での CREATE INDEX) - kazuhoのメモ置き場
  • 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のメモ置き場
  • InnoDB で fsync しない方法と、そのメリット - kazuhoのメモ置き場

    InnoDB はデフォルトでは同期I/O *1だけど、 innodb_flush_method=nosyncっていう隠しオプションがあって、それを有効にすると MyISAM みたく fsync しなくなるよ。ってソースコードちら見した自分が言ってた。 この設定がうれしいのって、どういう時だろう? MySQLWikipedia にも書いてあるけど、スレーブ運用してて「クラッシュしたらリカバリで数時間かかるし、データ一貫性チェックするくらいだったらバックアップからリストアして再開しちゃうもんね〜」的な向きにはおすすめなのかしらん。 とは言え、fsync しないってことは OS のページキャッシュに書込みデータが滞留することになる → buffer_pool 削る必要が出てくる → 無駄な I/O が増える、わけで、設定するメリットがあるかどうかは知らない。swappiness=0 にしと

    InnoDB で fsync しない方法と、そのメリット - kazuhoのメモ置き場
  • nopan っていうレポジトリから直接ソフトウェアをインストールするインストーラを作り始めた件 - kazuhoのメモ置き場

    perl の場合、CPAN モジュールは sudo cpan -i Module の1コマンドでインストールできる。でも、svn や git レポジトリのコードは、チェックアウトして perl Makefile.PL && make all test && sudo make install とか、めんどくさい。 なので、svn や git レポジトリからソースコードをダウンロードしてインストールするツールを作り始めた。名前は、CPAN モジュール以外も簡単にインストールできるところから、Not-only CPAN、略して nopan。 こんな感じで動きます。まだ適当だけど。 $ sudo nopan http://github.com/kazuho/kaztools.git downloading files from URL:http://github.com/kazuho/kazto

    nopan っていうレポジトリから直接ソフトウェアをインストールするインストーラを作り始めた件 - kazuhoのメモ置き場
    nippondanji
    nippondanji 2010/01/15
    しゃぶしゃぶ食べに行きましょう。
  • Perlでマルチプロセスデーモンを作るためのモジュール「Parallel::Prefork」に(Min|Max)SpareServers対応を追加した話 (もしくは read(2) / write(2) の atomicity) - kazuhoのメモ置き場

    Perl で複数のワーカープロセスを制御するためのモジュールとしては Parallel::ForkManager が古参なんだけど、このモジュールはプロセスを fork するだけで、シグナルを受信したらワーカープロセスを再起動とかそういうことができないので、自分は Parallel::Prefork というモジュールを自作して、たとえば Plack の Server::Standalone::Prefork とかで使っています。 で、まあ、prefork なサーバとか書いてると、(Min|Max)SpareServers 対応してないんすか? というのは FAQ なわけで。プロのサーバ管理者の間では存在価値が疑問視されて久しい (Min|Max)SpareServers だと思うんですが、まあ書いてみるのもいいかと思って Parallel::Prefork のディストリビューションに Pa

    Perlでマルチプロセスデーモンを作るためのモジュール「Parallel::Prefork」に(Min|Max)SpareServers対応を追加した話 (もしくは read(2) / write(2) の atomicity) - kazuhoのメモ置き場
  • ウェブアプリケーションサーバを複数台構成とか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のメモ置き場
    nippondanji
    nippondanji 2009/12/27
    もっとコンピュータ一台あたりの性能が上がればそのうちクラウドとかも要らなくなると思う。
  • RDBMSでもNoSQLでもなく、「手段としてのMySQL」について。12/18(金)のイベントで話します - kazuhoのメモ置き場

    「NoSQL」というバズワードが注目を集める昨今、私も「http://shibuya.pm.org/blosxom/techtalks/200911.html」に登壇の機会をいただき、SQL派の立場で発表したりしています (発表資料)。 ですが、言うまでもないことですが、RDBMSやKVSに限らず、全てのソフトウェアは(アプリケーションを開発するとかサービスを運用するといった)目的を達成するための「手段」にすぎません。 明日開催の「日MySQLユーザ会(MyNA)会 2009冬」では、そんな話、「RDBMSとしてのMySQL」ではなく、「目的を達成する手段としてのMySQL」がどのような特徴をもっているか、自分の使い方をベースに話をさせていただく予定です。 まだ会場には余裕があるようなので、バズワードではなく目的を達成するツールとしてのRDBMSに興味をお持ちの方、あるいはアンチRDBM

    RDBMSでもNoSQLでもなく、「手段としてのMySQL」について。12/18(金)のイベントで話します - kazuhoのメモ置き場
  • 彼氏がMyISAM使ってた。別れたい… - kazuhoのメモ置き場

    追記: マジメな比較はこちら:Open database life: MyISAMとInnoDBのどちらを使うべきか MyISAMだとPostgreSQLと並べられた時なんか恥ずかしいww 下向いちゃうしww ウェブサイトにはせめてInnoDB使って欲しい・・・ 勉強会とかで発表されたら・・・・もう最悪ww せめて普通にトランザクションやMVCCぐらいは対応して欲しい。 常識的に考えて欲しいだけなんです! MyISAMでテーブルロックしちゃった時の遅さとか分かる? あのね?たとえばピーク時10〜20並行ぐらいで書込みとか行くでしょ? それぞれ別の接続で来るわけじゃない? みんな普通にグループコミットやアシッドネス期待してるわけでしょ? MyISAMでテーブル壊れてリペアしてたら大恥かくでしょうがww じゃあ MyISAM はどういう用途に適しているのか。待て! 次号!*1 参考: 彼氏が軽

    彼氏がMyISAM使ってた。別れたい… - kazuhoのメモ置き場
  • 「テキストプロトコルは遅くないよ」という話 - kazuhoのメモ置き場

    「バイナリプロトコルは速い」「テキストプロトコルは遅い」という言説を、ときおり目にするけど、それって当なのか。個人的には、それって昔の話だと思ってる。 SMTP みたいな、ペイロードについてもターミネータ(とエスケープ)を使うプロトコル*1は確かに遅い。で、FTPプロトコルでは、大容量のデータを「高速」に転送するために、制御用のTCPコネクションと転送用のコネクションを分けたりしてた。 だけど、HTTPプロトコルは、テキストプロトコルだけど、ペイロードについてはターミネータを使わない。keep-alive を行う際には、Content-Length ヘッダ(あるいはchunkedエンコーディング)を使うことで、ペイロードのパース/変換処理を不要にしている。別の言い方をすると、テキストプロトコルだからと言って、バイナリプトロコルよりペイロードの処理時間が長くなるとは限らない。HTTP 以降

    「テキストプロトコルは遅くないよ」という話 - kazuhoのメモ置き場
    nippondanji
    nippondanji 2009/09/28
    memcached MLの中心で叫ぶわけですね。分かります。
  • シングルマスタ/マルチスレーブ構成に興味がない理由 - kazuhoのメモ置き場

    システム全体で必要な書き込みパフォーマンスが、RDBMSノード1基の IOPS の W% の場合、シングルマスタ+スレーブn台構成のシステム全体のパフォーマンスは、 書き込みパフォーマンス: W 読み込みパフォーマンス: R=(1-w)*(n+1) になる。この n=R/(1-w)-1 って w が増加するとスレーブ増設のメリットが加速度的に失われていく点がイヤ。 例えば、システム全体で要求される書き込みパフォーマンスが W=0.3 で、読み込みパフォーマンスが 3 ならば、シングルマスタ/マルチスレーブ構成で必要なノード数は5台。マルチマスタ構成を採った場合でも理想値は4台なので、そう遜色があるわけではない。 しかし、仮に必要なパフォーマンスが2倍 (W=0.6, R=6) になると、必要ノード数はマルチマスタ構成での8台に対し、シングルマスタ/マルチスレーブ構成では16台と、一気にコス

    シングルマスタ/マルチスレーブ構成に興味がない理由 - kazuhoのメモ置き場
    nippondanji
    nippondanji 2009/08/10
    独り言を残して去る。
  • innodb_flush_method=O_DIRECT を Mac OS X で使えるようにしてみた - kazuhoのメモ置き場

    久しぶりに MySQL のパッチ書いた。実用的な意味もあるけど (開発環境 Mac なので)、それよりは (天保山並みに低い) 山があるから登ってみた的な。 Kazuho at Work: Using O_DIRECT on Mac OS X

    innodb_flush_method=O_DIRECT を Mac OS X で使えるようにしてみた - kazuhoのメモ置き場
  • 1