タグ

ブックマーク / labs.cybozu.co.jp (14)

  • Kazuho@Cybozu Labs: Text::MicroTemplate - テンプレートエンジンのセキュリティと利便性

    « MySQL の order by 〜 limit を高速化する方法 | メイン | MySQL Conference & Expo 2009 で Q4M の話をします » 2008年12月16日 Text::MicroTemplate - テンプレートエンジンのセキュリティと利便性 先月開催された Shibuya.pm #10 でプレゼンテーションがあった MENTA や NanoA では、Mojo 由来のテンプレートエンジンを拡張して使用してきたのですが、Perl モジュールとして独立させるべきだよね、ということになり、このたび Text::MicroTemplate として CPAN にアップロードしました。 そのことを告知するとともに、作業の過程で興味深く感じた、テンプレートエンジンのセキュリティと利便性に関する話題をブログに書いておこうと思います。 テンプレートエンジンのエスケ

  • Kazuho@Cybozu Labs: MySQL の order by 〜 limit を高速化する方法

    « なぜサイボウズ・ラボで働くのか | メイン | Text::MicroTemplate - テンプレートエンジンのセキュリティと利便性 » 2008年12月12日 MySQL の order by 〜 limit を高速化する方法 filesort が回避できない場合に、MySQL の order by 〜 limit を高速化する方法というのを書いてみました。半分は効果測定が目的の実装のため、UDF になっていたりと、利用にはある程度のスキルが必要だとは思いますが、興味のある方はどうぞ。

  • Kazuho@Cybozu Labs: ウェブアプリケーションのインストーラジェネレータ

    « ウェブサービスにおけるダメージコントロール (MySQL のスロークエリを自動的に kill する方法) | メイン | サイボウズの新卒採用説明会に参加します » 2008年11月19日 ウェブアプリケーションのインストーラジェネレータ CGI や PHP などの小さなウェブアプリケーションを配置(デプロイ)する際、アーカイブをインターネットからダウンロードして、適切な展開ツールで展開したのち、文字コードをあわせてディレクトリ丸ごとアップロード、というのは結構煩雑な手続きです。そこで、tar.gz から自己展開型の CGI を作成するインストーラジェネレータ tgz2cgi.pl を作ってみました。以下のような感じで使います。 % tgz2cgi.pl \ --title='MyApp インストーラー' \ --start='インストールを開始します' \ --end='インストール

  • Kazuho@Cybozu Labs: ウェブサービスにおけるダメージコントロール (MySQL のスロークエリを自動的に kill する方法)

    « ウェブサービスにおける SSD 導入にむけて〜検索サービスの可能性 | メイン | ウェブアプリケーションのインストーラジェネレータ » 2008年11月04日 ウェブサービスにおけるダメージコントロール (MySQL のスロークエリを自動的に kill する方法) 適切な設計によって、信頼性の高いソフトウェアやサービスを構築することが重要なのは、言うまでもないことです。一方で、なんらかの原因で問題が発生した際に、障害を局所化し、損害を小さくい止める「ダメージコントロール」という概念もあります。ウェブサービスの場合も、特に検索や集計といった、計算量がクエリの種類によって大幅に異なるようなケースでは、次善の策として後者の手法が有効に働く場合もあるかと思います。 ともかくそういうわけで、MySQL のスロークエリを強制終了するようなタスクを書きやすくする Perl モジュール MySQL

  • Kazuho@Cybozu Labs: SSD (フラッシュメモリ) のベンチマークと選定基準

    ベンチマークに使用したのは、一般的な 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 の書き込みバッファをオフにした場合の値はこちらの表を参照のこと)。また、SD

  • Kazuho@Cybozu Labs: Filter::SQL を使って掲示板を書いてみました

    « Perl で埋め込み SQL を使って楽をする話 | メイン | C++ テンプレートで(いまさら)FizzBuzz » 2008年04月17日 Filter::SQL を使って掲示板を書いてみました 必要最小限、見た目無視です。動作確認は Filter::SQL 0.05 で行いました。 #! /usr/bin/perl use strict; use warnings; use CGI qw/escapeHTML/; use DBI; use Filter::SQL; use POSIX qw/strftime/; # SQLite に接続 Filter::SQL->dbh(DBI->connect( 'dbi:SQLite:dbname=/tmp/bbs.db', )) or die DBI->errstr; { # テーブル作成 (既存の場合はエラーを無視して継続) local

  • Kazuho@Cybozu Labs: Perl で埋め込み SQL を使って楽をする話

    « Japanize for IE バージョンアップのおしらせ | メイン | Filter::SQL を使って掲示板を書いてみました » 2008年04月16日 Perl で埋め込み SQL を使って楽をする話 DSL (ドメイン固有言語) は、プログラム開発の生産性を向上させる有力な手段です。そして、よく使われる DSL の代表例が正規表現と SQL だと思うのですが、前者に比して後者を嫌いな人が多いようです。なぜだろうと思ってつぶやいたところ、「SQL はリテラルじゃないから!」という答えが tokuhirom さんから返ってきました。そういえば例えば Pro*C のように C で Embedded SQL というのは良く聞く話なのに、Perl では同様の例がないような感じだったので、作ってみました。Perl で埋め込み SQL を実現するソースフィルター Filter::SQL

  • Kazuho@Cybozu Labs: MySQL (InnoDB) に直接アクセスしてタイムライン処理を高速化する話

    « フレンド・タイムライン処理の原理と実践 | メイン | MySQL の ORDER BY を高速化 » 2008年06月12日 MySQL (InnoDB) に直接アクセスしてタイムライン処理を高速化する話 フレンド・タイムライン処理の原理と実践 の続きです。 先のエントリでは、プルモデルの速度が当初予測していたよりも遅かった (というより SQL レイヤでのオーバーヘッドが大きそうだった) ので、MySQL Internals メーリングリストで質問したりしながら、C++ で直接 InnoDB にアクセスするようなコードを書いてみました。 タイムライン構築速度 タイムライン/秒 SQL そしたら、10倍以上高速に! ベンチマークを perl ベースのものから mysqlslap に変えたのですが、プッシュモデルの 2/3 の速度が出ています。これなら、データサイズが約 1/10 にな

  • Kazuho@Cybozu Labs: Parallel::Prefork - Perl でマルチプロセスなサーバを書く方法

    « Q4M (Queue for MySQL) 0.3 リリース | メイン | Q4M Version 0.4 で高速なクローラを書いてみた » 2008年04月04日 Parallel::Prefork - Perl でマルチプロセスなサーバを書く方法 Perl でマルチプロセス処理を行う場合は Parallel::ForkManager を使うというのが定番かと思います。しかし、このモジュールはシグナル処理を前提とした作りになっていない注1ため、シグナルを受信するまで動き続けるようなサーバを書きづらい、という問題がありました。 そこで、Parallel::ForkManager の API は、ほぼそのままに、シグナル処理が可能なプロセス管理モジュールを作ることにしました。それが Parallel::Prefork です。Parallel::Prefork を使うことで、Gracef

    sugizou
    sugizou 2008/04/09
    "Parallel::ForkManager の API は、ほぼそのままに、シグナル処理が可能なプロセス管理モジュールを作ることにしました。"
  • ブログパーツゲーム companula を公開しました (powered by flowr) (nakatani @ cybozu labs)

    companula(カンパニュラ) http://flowr.31tools.com/companula/ companula は、「おもしろい」と感じたブログとブログをゆるくつないで楽しんでもらうゲームです。 companula のブログパーツから、おもしろいと思ったブログ記事を他のブログ記事に「投資」、その投資内容を元にブログの「資産価値」が計算されるので、そのランキングを競うというもの。 より詳しくは companula のサイトを見ていただきたいのですが、この中谷のブログの右側にももちろん貼り付けてありますので、早速ポチポチっと試してもらえると嬉しいです。 もちろん自分のブログを自分のブログに投資しても意味がないので、companula を貼ってある他のブログに行かないといけませんね。というわけで以下に companula を貼っていただけたブログをご紹介。 秋元@サイボウズラボ・

  • Kazuho@Cybozu Labs: Tritonn (MySQL+Senna) の join を高速化

    « setlock を使って cron をぶんまわす方法 | メイン | Range Coder の終了処理 » 2008年02月05日 Tritonn (MySQL+Senna) の join を高速化 自分の利用形態において、Tritonn の処理を最適化するパッチを書きました。具体的には、2種類の最適化を行いました。ひょっとするとバグがあるかもしれませんが、興味がある方は、以下のパッチ (tritonn-1.0.9用) とあわせてごらんください。 1. 全文索引内にプライマリキーを格納 SQL クエリを最適化する際、アクセスしたい全カラムを格納したインデックスを作成することで行データへのアクセスを抑止して速度を稼ぐ、というのは定石のひとつです。しかし、MySQL の全文索引 (フルテキストインデックス) では、他のカラムと組み合わせた複合キーを作成することができません。このことが、T

  • Javascriptでdiffる ( with 形態素解析 ) (nakatani @ cybozu labs)

    Javascript で diff というのはいくつか試された例はあるようですが、まだこれといった決定打は出ていない様子です。 実は diff は見た目ほど軽い処理ではないので、Javascript にやらせるのはこれが結構大変…… diff の計算量は、おおざっぱに言うと比較対象の要素数の二乗に比例し(実際にはそれより小さくすることができるのですが、まあ話のイメージとして)、かつメモリを大量に消費するので、バッチ的な処理に最適化されていない Javascript にはどうしても荷が重いものとなってしまいます。 比較対象の要素数を減らせば当然計算量は減りますが、行単位で比較してもあまり嬉しくない(わざわざ Javascript で処理するということは自然文が対象と思って良いでしょう)。最小の文字単位だとギブアップ。 ということは形態素解析で分かち書きして、単語単位で diff するのが J

  • PHP Stompライブラリを呼び出す消費者スクリプトを書く | 秋元@サイボウズラボ・プログラマー・ブログ

    消費側はこんな感じで。 <?php /** キューの消費側サンプル */ // ライブラリ読み込み require_once 'Stomp.php'; // ローカルホストのStompサーバに接続 $connection = new StompConnection("localhost"); // TBA: エラー処理。ライブラリ中でdieしてるのでライブラリも要修正 // 接続パスワードは今は何でも通し $handler = $connection->connect("akky", "dummypassword"); // TBA: エラー処理 //print_r($handler); // キューの識別子を与えて、メッセージを受ける $connection->subscribe("/queue/miaumiau"); // 無限ループで受信を続ける while (true) { //

  • log4ZIGOROu : Gearmanを使ってみた

    daemonの起動 下記のようにdaemonとして起動します。 daemon起動オプションに関してですが、PODの記載は誤りで--daemonizeでは無く--daemonです。 $ sudo gearmand --daemon --pidfile=/var/log/gearmand.pid --debug=1 関数の登録 次にgearmanに実行させたい処理を予め登録し、さらにjob queを待ち受けるworkerを記述します。 #!/usr/bin/perl use strict; use warnings; use Data::Dump qw(dump); use Gearman::Worker; use Storable qw(thaw); use List::Util qw(sum); my $worker = Gearman::Worker->new; $worker->job

  • 1