先日、るびま0026号がリリースされました。
今回はRegionalRubyKaigi特集のようで、5Kaigiのレポートが載っています。5Kaigiのうち、仙台Ruby会議01に参加しましたが、そのレポートもあります。
仙台Ruby会議01のレポートはid:monyakataさんが丁寧にすっきりとまとめてくれています。とても読みやすいので参加できなかった人は読んでみてはいかがでしょうか。
レポートによるとまず好きなこと、そしてそれを続けることのセッションが一番参加者が多かったそうです。参加してくれた皆さん、関係者の皆さん、ありがとうございました。
レポート中にある通り、仙台Ruby会議01のサイトには東北・仙台情報が豊富にあります。もし、レポートを読んで仙台を感じたくなったときはサイトにある情報が役に立つことでしょう。お菓子やたいやき情報もあるので、甘いものが好きな人はぜひ参考にしてください。
あまり話題にのぼらない感がある常設コーナーのRubyNewsですが、毎回充実しています。読むと、Ruby界隈では思ったよりいろんなことがあったなぁと感じることができます。今回のRubyNewsはいつも以上に充実しています。読んでみると知らないことも多いかもしれません。
最近は助田さんがruby-talkでリリースアナウンスのあったソフトウェアを紹介していて、海外のRuby関連ソフトウェアに関する情報源としてとても貴重です。実は、RubyNewsにはruby-listでリリースアナウンスのあったソフトウェアが載っているので、日本でのRuby関連ソフトウェアのとても貴重な情報源になっています。
もちろん、肉リリースされたRabbitの情報も載っていますし、RSS Parserのリリースも載っています。ソフトウェアをリリースしたときはruby-listでもリリースアナウンスをしてみてはいかがでしょうか。きっとRubyNewsに載せてもらえます。
るびま0026号がリリースされました。るびまは今回のRegionalRubyKaigiレポートのように毎号変わるコーナーにも有用な記事が多くありますが、実は常設コーナーの中にも有用な情報があります。常設コーナーを読み飛ばしている方はもったいないですよ。
高橋編集長の巻頭言はよく読まれていると思いますが、編集後記もわりとおもしろいですよ。
仙台Ruby会議01レポートだけではなく、zundaさん編集のRubyNewsも紹介してみました。
日本Ruby会議2009のセッション詳細が公開されました。
日本Ruby会議2009は3トラックで3日間の開催のため、たくさんのセッションがありますが、このうち、2セッションで発表します。
1つ目は2回目のライトニングトークの一番最後です。
ライトニングトークではActiveLdap(チュートリアル)について話します。ActiveLdapの開発に関わるようになってから約3年経ちますが、ついに発表する機会に恵まれました。
クリアコードは今月から第四期に入っていますが、ActiveLdapはクリアコード設立初期にLDAPを利用する機会があったことがきっかけで開発に関わるようになったフリーソフトウェアです。当時は多くの問題を抱えていたActiveLdapですが、そのときからコツコツ開発を続けていたため現在では当時よりもかなり便利なライブラリとなりました。その成果を日本Ruby会議で発表できることはとても感慨深いものです。
2つ目は同じ日の同じ会場の次の枠で、CとRubyとその間です。
クリアコードではActiveLdap以外にもたくさんのフリーソフトウェアの開発に関わっていますが、その中でもCとRubyそれぞれのよいところを活かしたフリーソフトウェアについて話します。この発表ではそのようなフリーソフトウェアの例としてmilter managerとActiveGroongaを紹介しながら、CとRubyを活かすことのメリットについて話します。
Rubyから使える高速なkey-valueストアとしてはTokyo Cabinetや Localmemcacheが有名です。
ActiveGroonga(とその下の層のRuby/groongaは)これらと同様に高速なkey-valueストア機能も備えるgroongaをよりRubyらしく使いやすいAPIで提供します。
milter managerについては最近いろいろなところで話しましたが、ActiveGroongaについて話すことは今回が初めてです。
日本Ruby会議2009で発表するセッションを紹介しました。他にも興味深いセッションがたくさんあるので迷うと思いますが、興味があれば上記のセッションにも参加してみてください。
クリアコードはスポンサーとなっているため、スポンサーブースを出します。セッションには参加できなかった方も、ぜひ、足を運んでください。
Subversionでバージョン管理されているソフトウェアの開発をWindows上で行う場合に、TortoiseSVNを使っている人は多いのではないでしょうか。TortoiseSVNはシェル(エクスプローラ)に機能が統合されるため、フォルダ上の右クリックからチェックアウトやコミット、差分の表示などを行うことができ、コマンドライン操作に不慣れな人でも簡単にSubversionを使うことができます。
このTortoiseSVNと同じ使い勝手で分散型バージョン管理システムのgitを利用できるようにするgitクライアントが、TortoiseGitです。
参考:実用レベルに達したWindows向けGitクライアント「TortoiseGit」でGitを始めよう
TortoiseGitの導入手順は上記リンク先をご覧いただくとして、ここでは、SSHを使用してリポジトリにアクセスする際の手順を紹介したいと思います。なお、以下の説明はWindows XP環境にmsysgit、TortoiseGit 0.8.1.0をインストールした場合に基づいていますので、必要に応じて説明を読み替えてください。
TortoiseSVNではPuTTY形式とOpenSSH形式の2つの形式のSSH鍵を使うことができます。使いたい鍵がOpenSSH形式である場合、以下のようにすることになります。
この状態で、適当なフォルダの中でコンテキストメニューから「Git Clone...」を選択してclone用のダイアログを開きます。ここでクローン元のリポジトリのURLにSSHを使用するURL(例: ssh://git.example.com/project )を入力して「OK」ボタンをクリックすると、秘密鍵を使用するためのパスフレーズの入力を求められます。パスフレーズを入力すれば、データが送信され、リポジトリがローカルに複製されます。この場合、「Pull」でoriginから変更点を取得する際などにも、その都度パスフレーズの入力を求められることになります。
上記手順でOpenSSHの秘密鍵を使う場合、pullやpushなどの度に毎回パスフレーズの入力を求められるという問題があります。パスフレーズの入力を最小限だけで済ませたい場合は、秘密鍵をPuTTY形式に変換してPageantに登録すると良いでしょう。
PageantはOpenSSHでいうssh-agentに相当する常駐型のソフトウェアで、これが常駐している間はパスフレーズの入力の手間を最小限に省くことができます。この状態で、ssh://git.example.com/project のようなSSHを使うURLのリポジトリからcloneする際に、ダイアログで「Load Putty Key」にチェックを入れて先ほどのPuTTY形式の秘密鍵を選択しておくと、cloneやpull、pushなどの実行時にいちいちパスフレーズを聞かれずとも通信できるようになります。
WindowsでTortoiseGitを使う場合、OpenSSH形式の秘密鍵はそのままで使うのではなく、PuTTY形式に変換してから使うようにしましょう。
せっかくの機会なので、日本Ruby会議2009期間中にフリーソフトウェアをいくつかリリースする予定です。
以下のフリーソフトウェアはリリース準備ができているので、会場のネットワーク環境をうまく使えれば期間中にリリースします。
午前11時頃か午後3時頃にスポンサーブース内でリリース作業をする予定です。 日本Ruby会議2009は3日間あるので、リリース作業はそれぞれの日に分散させる予定です。
もしかしたら、以下のフリーソフトウェアもリリースできるかもしれません。
1つ実装したい機能が残っているので、それが実装できればリリースします。が、時間的に厳しそうです。
以下のフリーソフトウェアもリリースしたかったのですが、準備が十分ではないので、おそらくリリースできないと思います。残念です。
Ruby/Libglade2にGC関連のSEGVバグがあり、それを修正する時間がとれなかったので、日本Ruby会議2009のタイミングではリリースできそうにありません。
また、ソフトウェアではありませんが、GUI関連でRuby GUI調査2008のレポートを日本語に翻訳したものもリリースしたかった*1のですが、間に合いませんでした。Alexさんからは編集可能な形で原文をもらっているので、もし、協力してくれる方がいればkou@clear-code.comまでご連絡ください。
日本Ruby会議2009期間中にリリースを予定しているフリーソフトウェアを紹介しました。
RSS Parserやrcairoなど、ここに挙げたフリーソフトウェア以外でも構いませんので、なにかコメントなどがあればスポンサーブースで声をかけてください。
*1 永井さんがLightning TalksでRuby/Tkは本当にダメな子なのか?というお話をするようですし。
日本Ruby会議2009で発表した資料を公開しました。
発表を聞いてくれたみなさん、ブースにきてくれたみなさん、スタッフのみなさん、ありがとうございました。
Python用の書きやすくデバッグしやすい単体テスティングフレームワークPikzie 0.9.5をリリースしました。
easy_installでもpipでもインストールできます。
% sudo easy_install Pikzie
または
% sudo pip install Pikzie
今回は、Windowsでもある程度動くようになったのでリリースしました。
新機能はテストを省略するomitの追加です。
Ruby/groongaのサンプルアプリケーションのデモを用意しました。
RailsなどのWebアプリケーションフレームワークを使うほどのものではないので、ActiveGroongaは使わずに、Ruby/groongaとRackの組み合わせになっています。Rackについてはyharaさんの5分でわかるRackなどを読んでみてください。
デモはPassengerで動かしています。PassengerにRackを設置したことがある人なら10分もかからずにサンプルを動かせるのではないかと思います。
デモを見てもらえばわかる通り、小さなサンプルですが以下のように一通りの機能は備えています。
それぞれ、もう少し詳しく見ていきましょう。
通常の検索サイトでは空白で複数のキーワードを区切ることによって検索結果を絞り込むことができます。例えば、「Ruby クリアコード」で検索すると、「Ruby」と「クリアコード」両方にマッチするページがヒットします。いわゆるAND検索です。
まず、1つのキーワードだけを扱う場合のコードを示して、次に複数のキーワードを扱うコードを示します。
1つのキーワードだけを扱う場合はとても単純です。3行です。
1 2 3 4 5 6 7 8 |
# 文書が格納されたテーブルを取得 documents = Groonga::Context.default["documents"] # 文書テーブルから指定されたキーワードにマッチするレコードを検索 records = documents.select do |record| # HTTPの"query"パラメータで指定された単語が # "content"カラムにマッチするかチェック record["content"] =~ request["query"] end |
全文検索を指示するために「=~」演算子を使うなんてとてもRubyらしい書き方ですね。
複数のキーワードで絞り込みを行う場合はrecord["content"] =~ "keyword"
という条件をANDでつなげていきます。イメージは以下の通りです。
1 2 3 4 5 |
records = documents.select do |record| (record["content"] =~ keyword1) & (record["content"] =~ keyword2) & ... end |
サンプルではこのようなコードになっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
words = request["query"].split records = documents.select do |record| expression = nil words.each do |word| sub_expression = record["content"] =~ word if expression.nil? expression = sub_expression else expression &= sub_expression end end expression end |
ちなみに、inject
を使うとこうなります。
1 2 3 4 5 6 7 8 9 10 |
records = documents.select do |record| words.inject(nil) do |expression, word| sub_expression = record["content"] =~ word if expression.nil? sub_expression else expression & sub_expression end end end |
お好みでどうぞ。
このサンプルでは、「同じ文書中に何回キーワードが出現するか」をスコアとして扱っています。スコアは検索結果のレコードが持っているので、それを使って並び替えます。1行です。
1 2 |
# スコアの大きい順に並び替えて、上位20件だけ使う。 records = records.sort([[".:score", "descending"]], :limit => 20) |
groongaでは「:」から始まる特別なアクセス用の名前があります。「:score」もその1つでスコアの値にアクセスするために使います。「:score」の他にはレコードのキーにアクセスする「:key」などがあります。
groongaは、全文検索用の索引を作るときにキーワードを正規化することができます。これにより大文字小文字を区別せず「Ruby」でも「ruby」でも同じように検索することができます。
正規化するためにしなければいけないことは、索引用テーブルを作成する時に:key_normalize => true
オプションを指定するだけです。
Ruby/groongaではテーブルやカラムを定義するためのDSLを用意しています。サンプルのためのテーブル・カラム定義は以下のようになっています。少しActiveRecord風です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# スキーマ定義開始 Groonga::Schema.define do |schema| # 文書格納用テーブル作成 schema.create_table("documents") do |table| table.string("title") # 文書のタイトル table.text("content") # 文書の内容 table.string("path") # 文書の置き場所 table.time("last-modified") # 文書の最終更新時刻 end # 索引用テーブル作成 schema.create_table("terms", :type => :patricia_trie, :key_normalize = true, # キーワードを正規化 :default_tokenizer => "TokenBigram") do |table| table.index("documents.title") # 文書のタイトルの索引を作成 table.index("documents.content") # 文書の内容の索引を作成 end end |
一応コメントを入れましたが、コメントがなくても何をしているのかがわかったのではないでしょうか。
:key_normalize => true
を指定しておくと、あとはgroongaがうまいことやってくれるので、検索時には特に何もする必要はありません。
キーワード周辺の文章を表示することにより、その文書が探している文書かどうかを判断しやすくなります。
たとえば、「Ruby」で検索するとRuby-GNOME2 0.18.0リリース*1がヒットしますが、その場合は「...されました。 Ruby-GNOME2はGTK+を含むGNOME関連ライブラリのRubyバインディング...」という文章も一緒に表示されます。これがあれば、文書を全部読まなくてもおおよその内容を想像しやすくなります。
この機能はKWICやスニペットなどと呼ばれていて、groongaではスニペットと呼んでいます。
スニペットの生成は以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# キーワードを囲むタグ open_tag = "<span class=\"keyword\">" close_tag = "</span>" # スニペットオブジェクトの作成 snippet = Groonga::Snippet.new(:width => 100, :default_open_tag => open_tag, :default_close_tag => close_tag, :html_escape => true, :normalize => true) # キーワードを正規化 # 検索キーワードを登録 request["query"].split.each do |word| snippet.add_keyword(word) end # 本文からスニペットを生成 segments = snippet.execute(record[".content"]) # 整形 separator = "\n<span class='separator'>...</span>\n" snippet_text = segments.join(separator) response.write("<p class=\"snippet\">#{snippet_text}</p>") |
整形用のタグを入れるコードも一緒になっているので多少長くなっていますが、スニペット作成のための処理は以下の3ステップだということがわかります。
簡単ですね。
サンプルアプリケーションを例にして、Ruby/groongaを使うと実用的な機能が揃った検索ページを簡単に作成できることを紹介しました。
サンプルアプリケーションはリリースされたばかりのRuby/groonga 0.0.6の中に入っています。
サンプルアプリケーションを参考にしながらgroongaを使った全文検索ページを作ってみてはいかがでしょうか。
最後に、コマンド列でサンプルアプリケーションのセットアップの方法を示します。
% sudo gem install groonga % cp -r `gem environment gemdir`/gems/groonga-0.0.6/example/ ./ % cd example/search % ../index-html.rb data/database ~/public_html/ # 最後の引数はHTMLのあるディレクトリ % rackup config.ru % firefox http://localhost:9292/
*1 そういえば、先日、Ruby-GNOME2 0.19.1がリリースされました。