※Web フィードはリダイレクトされるようになっています
]]>サービスをスケールアウトする話は、意外と聞かなかったように思います。今回が初参加だったので間違っているのかもしれませんが、単純な「スケールアウトできるよね」という話ではなく、むしろ、アプリケーションデベロッパに負担をかけずにスケールアウト (もしくはスケールアップ) するデータベースを、どのように作るか、というところが盛り上がっていたように思います。一方で、クラウドコンピューティングに関しては、サービスをスケールさせる道具というよりは、(リソースの確保が)柔軟で安定したインフラストラクチャとして期待されている側面が大きいように感じました。今後は、両者をどう組み合わせていくか、というのが課題になってくるのかもしれません。
カンファレンスにおいて、私は Q4M の発表 (Q4M (and Pathtraq) at MySQL Conference & Expo 2009) を行いました。Q4M の設計方針から使い方にはじまり、事例までをカバーした (かつてない) 丁寧な資料になっていますので、Q4M を使ってみようかな、という方はごらんください。また、既にお使いいただいている皆さんには、あらためて御礼申し上げさせていただきたいと思います。事例は引き続き絶賛募集中です。
また、併催されていた Percona Performance Conference (プレゼン資料一覧) でパストラックのバックエンドに関する発表 (Running a Realtime Stats Service on MySQL) を行い、こちらも好評を得ることができ、ほっとしています。
なかなか密度が濃くてつかれましたが、充実した一週間でした。お世話になったサンマイクロシステムズの方々をはじめ皆さん、ありがとうございました。
]]>自分も今回、弾さんのモジュールを試すまで知らなかったのですが、FreeBSD では ptrace をそのような目的で使うことはできないと思います。というのは、私の理解が正しければ、linux とは異なり、FreeBSD の ptrace でシステムコールの実行を検出し PT_KILL を発行しても、そのプロセスが停止するのはシステムコールの終了直後になるからです。
具体例を挙げると、たとえば unlink(2) の実行を検出しトレース対象のプロセスを殺そうとしたところで、そのプロセスが停止するのは unlink システムコールの実行後となるため、ファイルの削除を抑制することはできません。
さらに、vfork(2) は、仕様として、生成された子プロセスが execve(2) を呼び出すか、あるいは終了するまで、システムコールの実行が完了しません (つまりそれまでトレース対象のプロセス (実際はプロセスグループなんじゃないかな) を停止できない)。その結果、ptrace によるシステムコールの監視下にあっても、
vfork(); // 以下は生成された子プロセスでのみ実行される 複数個の任意のシステムコールを含むコード ... _exit(0); // 子プロセスの終了直後に親プロセスが PT_KILL されるのような形で、任意のプログラムが実行可能となってしまいます。
以上は、手元の FreeBSD 6.3R で検証した結果ですが、最新リリースでも当該部分の動作は変わっていないのではないかと思います。
参考: Deny system call using ptrace | KernelTrap, geordi - C++ eval bot ]]>今回の変更は、唯一、linux (i386) 上において、テーブルサイズが 2GB を超えようとする際にクラッシュする問題の修正です。他の環境においては、変更はありません。
]]>Read (MB/sec) | Write (MB/sec) | |
---|---|---|
HDD (Maxtor 7L250S0) | 2.64 | 12.0 |
SSD (Intel X25-M) | 38.0 | 46.4 |
SSD (STEC 32GB) | 26.7 | 0.88 |
SDHCカード | 9.46 | 0.11 |
USBメモリ | 11.7 | 0.08 |
ベンチマークに使用したのは、一般的な HDD、高速性で有名な Intel の SSD、ネットブック (DELL Inspiron Mini 9) の内蔵 SSD (STEC 製, 32GB)、および SanDisk の SDHC カード (SanDisk Extreme III) です注。
この表を見て2つの SSD を比較すると、読み込みパフォーマンスの差がそれほど大きくないことに気づきます。また、SD カードの読み込み速度も、HDD を大きく上回っています。つまり、ランダムリードについては、メーカーや SSD 間の差は、あまり大きくない、ということになります。
一方で、書き込みパフォーマンスについては、非常に大きな差があります。X25-M と STEC の SSD の差は、実に 50 倍にのぼります (SSD の書き込みバッファをオフにした場合の値はこちらの表を参照のこと)。また、SDHC カードに至っては、更に遅く 110KB/sec、書き込み回数に換算すると毎秒約7回と、フロッピーディスクを思い出すようなレイテンシになっています。ただ、これは、SDHC カードの一般的な用途、あるいは、実装面積が限られていてメモリを並列に実装できないこと、等を考えるとしょうがない、とするべきでしょう。
まとめ。サーバ用に SSD を選定する場合、以下のように考えればいいのではないか、と思っています。
バックアップや冗長化が必要なのは (SSD に限ったことではないですが) 言うまでもないかと思います。適切なベンチマーク基準の作成方法や運用ノウハウ等につきましては、各参考リンクをごらんください。
参考:
ウェブサービスの SSD 化について話してきました
ウェブサービスにおける SSD 導入にむけて〜検索サービスの可能性
Benchmarking SSD for MySQL
注: (2月10日) USB メモリ (BUFFALO RUF2-J8GS) を追加
]]>なお、中で出てくる「情報は自由を欲している (Information Wants to Be Free)」というフレーズについては、情報は自由を欲しているけれど - steps to phantasienの訳を参考にさせていただきました。この場を借りて、御礼申し上げます。
PS. Greasemetal につきましては、Google Chrome 本体で userscript がサポートされる方向なので (そのほうが技術的にも筋がいい)、そちらをお使いいただきますようお願いいたします (参考: HOW TO: Install Google Chrome Greasemonkey Scripts (Windows Only) - Mashable)。
]]>「MySQL のカンファレンス」なので、運用や実装面について、相当突っ込んだ話ができそう (というかツッコミが怖い...)。自分にとってもいい成長のチャンスだと思うので、しっかり準備していきたいと思います。
]]>Using Q4M - a Message Queue Storage Engine for MySQL
Q4M is a message queue that works as a pluggable storage engine of MySQL 5.1.
Originally developed for Pathtraq (one of Japan’s largest web access stats service), the performance and stability of Q4M is highly renowned within the nation, and other organizations have started using it, including Mixi (Japan’s largest SNS provider).
In the presentation, the original developer of Q4M will explain:
so that the audiences can understand and start using Q4M to offload, modularize, stabilize web services, and/or to create loosely-coupled services using the message queue.
- the design goals and architecure of Q4M
- how to use Q4M
- various usage senarios
- real-world use cases
そのことを告知するとともに、作業の過程で興味深く感じた、テンプレートエンジンのセキュリティと利便性に関する話題をブログに書いておこうと思います。
テンプレートエンジンのエスケープ機能の歴史
]]> 初期のテンプレートエンジンは、手動でエスケープを指定する必要がありました。この点については XSS の温床になるとして、「デフォルトでエスケープされるように作られていたらよかったのに」(高木浩光@自宅の日記) という批判があり、新しいテンプレートエンジンでは、テンプレートのタグ内で明示的に指定しない限り、渡された文字列を HTML エスケープするものが増えていると思います。ただ、埋め込みタグによりエスケープ手法を決定する方式では、HTML タグが二重にエスケープされてしまったり、あるいはそれを回避しようとして XSS が発生するなどの問題が残ってしまいます。この問題を回避するために、Django 等のテンプレートエンジンでは、通常の文字列型とは別に「HTML エンコードされた文字列型」を用意し、置換文字列の型を元にエスケープするかしないかを決定するようになっています (テンプレート内の位置ではなく、実行時の型情報にもとづいてエスケープを行う、と説明すべきかもしれません)。
このような「自動エスケープ」手法を使うことで、ウェブアプリケーション開発者は、エスケープの必要性を (ほぼ) 気にすることなく、作業を行うことができるようになります。Text::MicroTemplate でも、この考え方に基づき自動エスケープ機能を実装しました。
スニペットの問題
一方で、実際のウェブアプリケーションにおいては、テンプレートエンジンだけが HTML を生成しているわけではありません。パン屑リストのような小規模な HTML スニペットやちょっとしたリンクタグを生成するために、いちいちファイルベースのテンプレートエンジンを使うのは面倒なので、プログラマは、ついつい自分で文字列連結をしてしまいがちです。が、これが XSS の温床になることは、言うまでもありません。
Perl の代表的なテンプレートエンジンである Template-Toolkit には、そういった状況下でテンプレートエンジンが使用できるよう、(ファイルベースではなく) 文字列ベースのテンプレート機能 (String::TT) があります (一方で Template-Toolkit には、原則手動エスケープだという問題があります)。
Text::MicroTemplate では String::TT 同様の、スニペットを生成するための関数 build_mt を提供しており、以下のように書くことができます。
$oneline_message = render_mt( '<?= $_[0] ?> さん、お買い上げありがとうございます', $username, );
この例では、ユーザー名が HTML エスケープされる一方、$online_message は「HTML エンコードされた文字列型」になるので、そのままテンプレートエンジンに渡しても二重エスケープは発生しません。
最後に
自分が最近、あまり興味をもってこなかった分野でないからかもしれませんが、今回テンプレートエンジンをいじってみて、いろいろ勉強になりました。上記の要素は、テンプレートエンジンを実装する際の、あるいは評価する際の尺度にもなると思うので、参考にしていただければ幸いです。また、欠落している要素があれば、指摘していただければありがたく存じます。
本当は Text::MicroTemplate のチュートリアルも書くべきななんだけど力つきたのでこれでおしまい...
12月17日追記:
ところで、HTML エンコードされた文字列型を使う必要のある場面というとどんなところだろうか はてなブックマーク - HiromitsuTakagiのブックマーク
たとえば以下のようなケースはどうでしょうか。
一般に、ウェブアプリケーションの View - Controller 分離では、コントローラ側で必要な情報を全て準備してから、テンプレートのレンダリングを行うと思います。このような環境下で、例えば2ペイン構成のサイドバーに様々なガジェットを表示することを考えてみます。この場合、ガジェットを生成する手法は、
ふだん、しなれていない類いの話なので、うまく伝わったか、正直不安です。ただ、自分自身にとっては、何が好きなのか、何がやりたいのか、ということを改めて見つめ直すいい機会になりました。また、来場者の方々といろいろ話をできたことも、自分にとっていい刺激になったと感じています。
ですので、ご来場いただいた方々には、サイボウズに興味をもっていただいたことに対して御礼を申し上げると同時に、個人的にもありがとうございましたと、ブログで失礼ですが、お伝えしたいと思います。
当日使用したスライドはこちらになります。よろしければご覧ください。
]]>なお、スライドで紹介した各成果は、いずれも自分が始めたものですが、実現にあたっては多くの方々との共同作業やご協力があってのことだ、ということはここに明記しておきたいと思います。friends の地図表示は O さんと T さんの仕事ですし、Palm OS 関連の仕事においては Y さんにとてもお世話になりましたし、未踏ソフトウェア創造事業は、IPA やプロジェクトマネージャの支援の下、共同開発者とともに携わったプロジェクトです。また、Japanize と Pathtraq は、自分やサイボウズ・ラボ内外の技術者のみならず、むしろ翻訳者やサンプルユーザーの皆様のおかげをもって成り立っているサービスと言えるかもしれません。皆様には、この場を借りて、改めて御礼申し上げたいと思います。
ちなみに、新卒採用説明会は今後も開催が予定されており、今週末 (12/13) にはサイボウズ・ラボの社長である畑が話をすることになっております。興味がおありの方はこちらからお申し込みいただければと幸いに存じます。
]]>末筆となりますが、Shibuya.pm の実行委員(?)の方々、ありがとうございました&おつかれさまです。 (まだ終わってないけど ^^;)
]]>あともうひとつ話さないと。
]]>「専門技術を極め、新たな価値や技術を生み出すエンジニアの物語」というテーマで話をする、というのは気恥ずかしいものがありますが、自分が何を考えて Japanize や パストラック といったサービスを作っているのか、サイボウズ・ラボで日々働いている面白さ、楽しさといったものを伝えられればいいな、と思います。
サイボウズに興味がある学生の方には、ぜひ参加していただければと思います。来場者の皆さんと少人数でお話しさせていただくこともできるようなので、これを機会にいろいろな話ができればいいな、と楽しみにしています。
説明会の詳細については、下記の URL をごらんください。参加をお待ちしております。
% tgz2cgi.pl \ --title='MyApp インストーラー' \ --start='インストールを開始します' \ --end='インストールが終了しました。<a href="setup.cgi">次へ進む</a>' \ --delete --nph \ < myapp.tar.gz > nph-myapp-installer.cgi
このようにしてmyapp.tar.gz を展開するインストーラ nph-myapp-installer.cgi を作成することができます。上の例では、終了時のメッセージに「次へ」ボタンをつけて、展開されたパッケージの setup.cgi へユーザーを誘導しています。他のオプションは、以下のとおり。インストール終了後に自分自身を消去するモードもあります。特定のファイルが既に存在するかチェックして、見つかった場合はインストールを中止する --check-files オプションを使えば、誤って複数回実行してしまうこともありません。
$ ./tgz2cgi.pl --help Usage: ./tgz2cgi.pl [options] < package.tar.gz > installer.cgi Options: --title=title title when run as a CGI --start=msg start message --end=msg end message --nph create nph CGI --delete delete installer cgi on success --help show help
また、生成されるインストーラは、コマンドラインから直接実行することも可能です。この場合は、tar xzvf と同じ動作になります。生成されるインストーラの依存先は、perl (たぶん4以上), uudecode, tar, gzcat という、あまり時代を感じさせない、環境依存の少ない構成にしたつもりです。ぜひ、自己責任でお楽しみください。
15:41追記: uu(en|de)code は最近のディストリビューションでは標準インストールではないようなので、MIME::Base64 に変更しましたorz
]]>use MySQL::KillQuery qw/mysql_killquery/; # ルート権限で mysql に接続 my $dbh = DBI->connect( 'DBI:mysql:database=foo', 'root', 'root-password', ) or die $DBI::errstr; # 10 秒以上経過した、ロック状態にない root 以外の権限の SELECT クエリを強制終了 while (1) { mysql_killquery({ dbh => $dbh, should_kill => sub { my $proc = shift; $proc->{User} ne 'root' && $proc->{Time} && $proc->{Time} >= 10 && $proc->{Command} && $proc->{Command} ne 'Killed' && $proc->{State} eq 'Locked' && $proc->{Info} && $proc->{Info} =~ /^select /i; }, }); sleep 5; }
備えあれば憂いなし。Tritonn を SSD ベースで運用したりする場合は、[Tritonn-dev 126] 全文検索中に KILL CONNECTION を有効にするパッチ と併せて運用するのがいいかな、と思っています。後者は、(中長期的にはブロックデバイスむけのチューニングを行うべきという話は脇におくとしても) まだ不完全ですが...
]]>