先月の29日に、全文検索エンジンgroongaを囲む夕べ #1が開催されました。内容はgroonga本体について、groongaとRubyについて、groongaとMySQLについて、groongaとPostgreSQLについて、とgroonga三昧の内容でした。
groongaとRubyについての資料は以降で紹介します。groongaとPostgreSQLについてはすでに資料が公開されています(textsearch groonga v0.1)。参加できなかった方は参考にしてください。
それでは、groongaとRubyについての資料を簡単な解説付きで紹介します。
Ustreamで配信したものの録画もあります。Ruby枠は49分くらいからです。
開催日当日の29日、groongaの新しいバージョン1.0.4がリリースされました。もちろん、この夕べに合わせたものです。
さらに、groongaをRubyから使うためのライブラリrroongaも新しいバージョンがリリースされました。もちろん、これもこの夕べに合わせたものです。
興味がある方はぜひ最新版を利用してください。
Rubyからgroongaを使う、ということが実に手になじむということを重点的に話します。これはgroongaをRubyらしく使えるライブラリが提供されているためです。そして、そのライブラリを提供しているのがラングバプロジェクトです。
groongaをRubyらしく使えるライブラリや周辺ライブラリ・ツールなど、groongaとRubyに関連するソフトウェアなどを提供しているのがラングバプロジェクトです。WebサイトはRubyForgeにホスティングしてもらっていて、ソースコードはGitHubにホスティングしてもらっています。以降で紹介するライブラリ・ツールはすべてGitHub上にあります。
ラングバプロジェクトの目標は「使いやすい検索システムを手早く、簡単に」実現できるようにすることです。
そのために、ラングバプロジェクトは全文検索システムを提供します。しかし、1つの全文検索システムですべてのケースをカバーすることはできません。そのため、全文検索システムを作るために必要な部品も再利用できる形で提供します。部品を組み合わせることで環境に合わせた全文検索システムを構築することができます。
このようにして「使いやすい検索システムを手早く、簡単に」という目標の実現を目指します。
まずは、ラングバプロジェクトがどのような名前のライブラリ・ツールを提供しているかを紹介します。それぞれのライブラリ・ツールが全文検索システムのどの部分の機能を提供するかは図で示します。
まず、全文検索システムにはどのような機能があるかを確認しておきましょう。
全文検索システムは、まず、「検索対象」から文書を収集します。これが「クローラー」と呼ばれる機能です。次に、収集してきた文書からテキスト情報やタイトル・更新時刻などといったメタ情報を抽出し、全文検索エンジンに登録します。この文書を登録する機能を「インデクサー」と呼びます。最後に、全文検索エンジンに登録されている文書を簡単・便利にユーザが検索できるインターフェイスが必要です。これが「検索インターフェイス」です。最近はWebアプリケーションとして「検索インターフェイス」を提供することが多いです。
それでは、ラングバプロジェクトが提供する機能の紹介です。
全文検索エンジンgroonga(ぐるんが)をRubyから利用するためのライブラリであるrroonga(るるんが)を提供します。
インデクサーで必要になる、文書からテキストとメタ情報を抽出するライブラリ・ツールがChupaText(ちゅぱてきすと)です。
ChupaTextをRubyのライブラリとして使えるようにするのがChupaRuby(ちゅぱるびー)です。
rroongaをRuby on Rails 3から簡単に使えるようにするのがActiveGroonga(あくてぃぶぐるんが)です。
Rails 3も含むRackアプリケーションで使えるユーティリティを集めたのがracknga(らくんが)です。
これらのライブラリ・ツールを利用した全文検索システムが文書検索ラングバです。プロジェクトが提供するライブラリ・ツールを集結したものなので、プロジェクトと同じ名前が付いています。
それでは、それぞれのツールについて紹介します。
rronngaはRubyからgroongaの全文検索エンジンの機能を使えるようにするためのライブラリです。groongaの機能をRubyらしい書き方で書けることを重視したAPIになっていることが特徴です。
例えば、groongaのスキーマを言語内DSLとして書けるようになっています。groonga自体もスキーマを定義するための言語を持っていますが、rroongaではこのように通常のRubyの式としてスキーマを書けるようにしています。Rubyでスキーマを書けるため、新しくgroongaのスキーマ定義用の文法を覚える必要がありません。
検索条件も通常のRubyの式で書けます。Rubyでは「=~」は「マッチさせる」場合に使われる演算子ですが、rroongaでも「マッチ(キーワードを全文検索してキーワードが含まれる文書を返す)」という意味で使っています。自然な書き方ですね。
もう少し複雑な条件も自然に書くことができます。例では「タイトルか説明から本文に"Ruby"と"検索"という単語を含んでいる1ヶ月以内のサイト」を検索しています*1。この条件でもRubyで使われている演算子を同じ意味で使っているので、自然に書くことができます。
検索条件をRubyで指定すると検索が遅くなるのではと思うかもしれません。しかし、その心配は不要です。ブロックの中身は1度だけ評価され、groongaの条件式オブジェクトにコンパイルされます。groongaはそのC言語で記述された条件式オブジェクトを使って検索を行うので、rroongaを使わない場合と同様に高速に検索します。
ORマッパーでは検索条件はSQL文字列を組み立てることに相当しますが、rroongaでは直接groongaの条件式を作ります。検索エンジンがSQL文字列をパースする必要がないため、より少ないコストで検索のための下準備をすることができます。
rroongaは様々な場面で有用です。例えば、データを加工しながらgroongaに登録するインデクサーを作る場合です。サイト検索システムなら各ページで共通のヘッダー部分とフッター部分は検索対象から外したいでしょう。そのとき、Rubyでそのあたりの処理を実装してそのままgroongaに登録できると便利です。
他にも、groongaに入っているデータを利用しながら新しいデータを登録する場合もrroongaを使うと便利です。
rroongaはるりまサーチでも利用されているので、実際にどのように使われているかを調べたいときは、るりまサーチのソースコードを見てください。
rroongaは以下のコマンドでインストールできます。
% sudo gem install rroonga
groongaがインストールされていない場合は自動的にダウンロード・ビルドして利用します。便利ですね。
ChupaTextはテキスト抽出ツールです。「複数の入力形式を1つの操作方法」で扱えることを目標に開発が進められています。
ChupaTextはchupatextコマンドとC言語用のAPIを提供しています。chupatextコマンドは抽出したテキストをMIME形式で出力します。MIME形式を採用したのは以下の理由からです。
入力形式はこれからも増えていくでしょう。それに対応するため、ChupaTextは拡張しやすい設計になっています。ChupaText本体を変更しなくても新しい入力形式に対応するためのモジュールを後付けで追加することができます。
現在はC言語で共有ライブラリを作成するか、Rubyスクリプトを作成して、所定の位置に置くことで入力形式を追加することができます。Rubyスクリプトでも拡張できるのは、ChupaText内にRubyインタプリタが組み込まれているからです。
ChupaTextはaptitudeでインストールできます。
% sudo aptitude install chupatext
詳細はChupaTextのインストールドキュメントを見てください。
ChupaRubyはChupaTextをRubyのライブラリとして使用できるようにします。ChupaTextをHTTP経由で利用するためのインターフェイスを追加する予定です。これが追加されると、「テキスト抽出Webサービス」を構築することができるようになります。
ChupaRubyは以下でインストールすることができます。
% sudo gem install chuparuby
ChupaTextは自動的にインストールされないので、事前にインストールしておいてください。
ActiveGroongaはRails 3用のモデルライブラリです。groongaをモデルのデータストアとして利用することができます。ActiveRecordが提供しているような以下の機能を提供します。
ActiveGroongaは以下でインストールすることができます。
% sudo gem install activegroonga
ActiveGroongaに関するより詳しいことは別の機会に紹介します。
rackngaは上記のパッケージに入れるには適切ではないな、というものが詰まっているユーティリティパッケージです。RackのミドルウェアやPassenger用Muninプラグインなどがここに入っています。
rackngaは以下でインストールすることができます。
% sudo gem install racknga
文書検索ラングバはこれまで紹介したライブラリ・ツールを利用した全文検索システムです。groongaの特徴を活かしたWebベースの検索インターフェイスを提供します。例えば、るりまサーチでも提供しているドリルダウン機能などです。
文書検索ラングバはそろそろリリースされる予定です。もうしばらくお待ちください。
groongaのRuby関連の情報を紹介しました。便利なライブラリやツールが充実していっているので、ぜひ、Rubyとgroongaを使って全文検索システムを作ってみてください。
*1 この資料を使ったのは2010年11月29日です。
12月4日に開催された札幌Ruby会議03に参加し、ライトニングトークで少し話しました。話さなかったことと感じたことを残しておきます。
文書検索ラングバの話をするつもりでしたが、もっと話したいことができたのでそっちを話すことにしました*1。それが「デバッグ力」についてです。
「デバッグ力」とは一般的な用語ではありません。実際、検索してもほとんど使っている人はいません。札幌で伝えたいことを表す言葉に一番しっくりくるのが「デバッグ力」だったので、そう呼ぶことにしました*2。
コンピュータの世界では、「バグ」は「不具合」とか「問題」といった意味で使われます。デバッグとはバグを取り除くこと、つまり、問題を解決する作業です。プログラマは問題を解決していくことで、徐々に目的を達成するプログラムに近づけていきます。「デバッグ力」には、目的のものへ近づくための力、前へ進む力という意味をこめています。
デバッグ力を発揮するために大事なことはひとつずつ問題を解決していくことです。便利なツールやtipsなどはいろいろありますが、一番大事なことはこの姿勢です。ひとつずつ、問題と向き合って、事実から目を逸らさずに、ていねいに、順番に、解決していきます。この姿勢で問題と向かい合えるようになったら、あとは、テクニックやツールなどを覚えながら少しずつうまくなっていけばよいのです。ひとつずつ、ひとつずつ、ひとつずつ。順番に解決していきます。簡単そうに聞こえますが、けっこう難しいことです。わりとすぐに忘れてしまいます。大変なことなのでなかなか勧めづらいくらいです。しかし、正しい方向に進んでいるかの判断基準になるくらい覚えておきたいことです。
このデバッグ力の基本はプログラムに限定されません。もっと広く応用できるものです。デバッグ力を使って、前へ進んで欲しい、誰かが前へ進むことを助けてほしい、誰かが前へ進むことを助けようとしている人を助けてほしい、そういうことはステージでは話しませんでした。まだ、自分ができていないというのもありますし、みんなの前で話すには少し恥ずかし過ぎました。もう少し自信がでてきたら、個別にもっとていねいに伝えたいと思っています。
札幌Ruby会議03では、しまださんがよく使う「感極まった」を、多くの参加者も使っていました。冗談の意味合いも多くあるでしょうが、これは、参加者がしまださんと同じ視点に立ったからではないかと思っています。しまださんの想いが伝わったのだと思います。しまださんの発表者紹介はとても想いがこもっていますが、参加者も同じくらい想いをこめて誰かを紹介できるようになっているのではないでしょうか。だとしたら、これはとてもステキなことです。
ところで、札幌由来の人たちは頑張りすぎではないでしょうか。彼らを助けることができるようになりたいと思います。
先輩芸人より。
注: この記事にライセンスは設定されていません。
これはRuby Advent Calendar jp: 2010の参加エントリです。前日はysakakiさんでした。
今年のAdvent Calender界隈では惚れさせを集めたり、惚れさせを作ったり、忙しい人でも惚れさせを見れるようにしたりしているので、もう一歩先を行くことにしました。
名札には名前を大きく書きましょうジェネレータに「地獄モード」が追加されました。
これを使うと札幌Ruby会議03のプロの無職を楽しむことができます。
地獄の名札ジェネレータはTwitterのプロフィール画像や説明文から惚れさせ名札を生成します。フォームに自分のTwitter IDを(カチャカチャカチャ…)と入力して(ッターン!)と「生成!」できるのでお手軽ですが、もっと惚れさせるために試行錯誤したい場合は少し不便ですね。
ということで、ささたつさんが作ったmisawa gemを画像生成に対応させました。
% sudo gem install gtk2 % wget https://github.com/kou/misawa/raw/master/lib/misawa.rb % wget -O misawa_background.jpg http://a2.twimg.com/profile_images/461389564/aaa.jpg % ruby -r misawa -e 'misawa("俺ってそんなに\n唐揚げとたいやき食べてる\nイメージあるー?\n\nそれどこ情報?どこ情報よー?")' % display misawa.png
名言はPangoとcairoで描画しています。この2つのフリーソフトウェアを組み合わせることにより日本語の縦書きも描画できます。「ー」など単純に回転させるだけだと問題が起こる文字も、フォントが対応していれば*1きちんと描画できます。
ポイントはPangoGravityとcairo_rotate()です。
Pangoにはpango-viewというPangoのオプションを簡単に試せるツールがついています。これを使ってオプションの効果を確認します。
まず、そのまま描画した場合です。横書きになっていますね。
% pango-view --output normal.png --font "MotoyaLMaru 48" --text "つれーわー"
次に、PangoGravityにPANGO_GRAVITY_EASTを指定した場合です。横に転がっていますが縦書きになっています。
% pango-view --output east.png --font "MotoyaLMaru 48" --text "つれーわー" --gravity east
ここまでくればあとは実質回転させるだけだからつれーわー。最後に、-90度回転させれば縦書きが完成です。
% pango-view --output east-rotate.png --font "MotoyaLMaru 48" --text "つれーわー" --gravity east --rotate -90
この縦書き機能はPango 1.16からサポートされています。Pango 1.16は2007年にリリースされているので、4年くらい前に見て、一番先に飽きた人もいるのではないでしょうか。
もちろん、Ruby/PangoでもPangoGravityを使うことができます。具体的な使い方は名札ジェネレータかmisawa gemを見てください。misawa gemの方がシンプルでわかりやすいでしょう。
名言を描画するところでは、文字を縦書きで描画するだけではなく、縦書きの文字に白い影もつけています。そのあたりのやり方もソースを見ればわかるでしょう。
惚れさせるために必要なRubyで縦書きを描画する方法を紹介しました。みなさんもRuby/Pangoとrcairoを使って縦書きなクリスマスカードや年賀状をRubyで生成してみてはいかがでしょうか。
明日のRuby Advent Calendar jp: 2010はtmaedaさんです。最後なのでとてもすごいのがくるはずですよ!
*1 たぶん。フォントによって問題が起きたり起きなかったりするから。
早いもので今年も最後の肉の日になりました。クリアコードのメンバーが2人増え、第三者割当増資実施も行い、少しずつですが会社が成長してきた一年でした。
今回はククログ上で公開した今年の活動をまとめてみます。
あしたのオープンソース研究所でオープンソースのマルチメディアフレームワークであるGStreamerを紹介しました。今のところ、GStreamerに関する日本語の情報があまりないので、だれかの役にたてているのではないでしょうか。
また、Debianパッケージの作り方と公開方法も紹介しました。これはCutterやmilter manager、groongaなどで使っている仕組みをまとめたものです。
1月の肉の日はUxU 0.7.6をリリースしました。非同期な処理(イベントのコールバックなど)を簡単にテストするための機能が追加され、より使いやすくなりました。
2月はmilterについて2回話してきました。1回目は通信事業者さんの迷惑メール対策に関する勉強会でmilterとmilterで問題になることについて話しました。2回目は札幌で行われたLOCAL DEVELOPER DAY '10 Winterで、Rubyでmilterを作る方法について話しました。(途中から全文検索の話が入ってきます。)
2月はメールの月でしたね。
3月はどこかで話すということはありませんでした。Debian GNU/Linux上でRPMパッケージを作る方法とYumリポジトリの公開方法もCutter、milter manager、groongaなどで使っている方法をまとめたものです。
4月もふだん開発している内容をまとめていました。Muninプラグインの作り方やfat gemの作り方をまとめました。fat gemとは複数のRuby用のバイナリが入ったgemのことです。例えば、Ruby 1.8でも1.9でも同じgemを使えるようにしたい場合はfat gemにします。
また、Rubyのリファレンスマニュアルを全文検索するるりまサーチを公開したのも4月でした。
5月はgit用コミットメール生成スクリプトgit-utils 0.0.1をリリースしました。(その後、リポジトリをGitHubに移行しました。9月の話。)
6月はクリアコードのgitリポジトリを公開しました。
また無事に第4期が終わりました。ありがとうございます。
7月はRails関連のことをいくつか書いています。Rails 2.3.8に対応したActiveLdap 1.2.2についてとRails 3.0でDeviseでOpenIDを使う方法についてです。
8月はRuby会議の必需品である名前が大きく書かれた名札を生成するWebアプリケーションを改良しました。
9月は日本Ruby会議2010で話したるりまサーチについての資料を公開*1したり、hbstudy#15でmilter managerについて話しました。hbstudy#15の内容は具体的な例を出しながら説明するスタイルなので、milterを知らない人でもわかりやすい内容になっています。
3月から外で話していなかったのですが、8月からまた外で話はじめました。
10月はCPUの使用率とメモリの使用量を表示するFirefoxアドオン「システムモニター」を更新していました。
第三者割当増資実施のお知らせをしたのは10月の肉の日です*2。
11月はPDFやオフィス文書からテキストを抜き出すツール「ChupaText」を公開しました。
また、NICT情報通信ベンチャ支援センターのインタビューも公開されました。会社としてインタビューされるのは、はじめてのことでした。クリアコードも成長しましたね。
12月は「全文検索エンジンgroongaを囲む夕べ #1」のRuby枠の資料を公開しました*3。
また、札幌Ruby会議03でデバッグ力について話しました。
Ruby Advent Calendar jp: 2010にも参加しました。Ruby Advent Calendar jpは今年が初参加です。Rubyで縦書き画像を生成する方法を地獄のジェネレータを例にして説明しました。
月ごとに今年のクリアコードの活動をまとめました。
去年より発表する機会は減りましたが、毎月いろいろやっていたようです。今年のクリアコードはいかがだったでしょうか。
来年もクリアコードをよろしくお願いします。
*1 日本Ruby会議2010は8月に開催。
*2 実際は2010年8月31日付けで実施していたが、プレスリリースは肉の日まで待った。
*3 「全文検索エンジンgroongaを囲む夕べ #1」は11月の肉の日に開催。