
これは Ruby逆引きレシピAdvent Calendar の参加エントリです。12月17日を担当します。前日の担当は @y_ogagaga さんで iCalendar形式のデータを読み書きしたいでした。
職場とか学校で、Rubyに詳しい頼りになる先輩がいるっていうのは、こんな感じなんじゃなかろーかと想像する。「こういうことしたいんですけど?」と聞いてみると「ああ、これでできるよ」と一瞬で返ってくるような。
レシピ先輩(仮称)はいろいろなライブラリを知ってる。だから第1章の1.1に書いてあるのはRubyのコードの書き方じゃあなくて、有無をいわさずrubygemsをインストールして使う、ということだ。レシピ先輩はIRCをばりばり使う。だから第6章 ネットワーク処理のはじめは、ウェブじゃなくってIRC BOTのつくりかただ。レシピ先輩はいろいろなコミュニティに参加している。だから最後の第24章で伝えるのはコミュニティに参加する方法だ。
2つの逆引き本「Ruby逆引きレシピ」「Ruby逆引きハンドブック」 – きりかノート 2冊め
レシピ先輩の魂のライムに酔いしれろー!!

Web ページを取得して解析したい / Web サイトから情報を抽出したい
今回は、惚れさすレシピ124「Web ページを取得して解析したい」と、惚れさすレシピ152「Web サイトから情報を抽出したい」を参考にして、お手軽な画像ダウンローダを作ってみます。正義の味方たこ焼き仮面が作ってくれた Nokogiri を使えば、とっても簡単に Web から情報を抜き出せちゃいます。
Web Scraping
Web Scraping、つまり「Web ページからの情報抽出」の手順は、ざっと以下の通りです。これは、Web API などの正面玄関がない場合を想定しています。玄関がある場合は、お行儀よく玄関から入りましょう。その方が楽ですし、Web ページの中の人にも迷惑を掛けません。
- ターゲットを決める
- 所望の情報が記載されている Web ページを探す
- 対象の Web サイトのソースを見て、HTML 構造とにらめっこする
- 対象の Web サイトにアクセスして、所望の情報を抜き出すプログラムを書く
- ページングやエラー処理等の処理を追加し、プログラムを仕上げる
- プログラムを動かす
惚れさせ画像ダウンローダ

地獄のミサワの「女に惚れさす名言集」のすべての惚れさせ画像をダウンロードするプログラムを書きました。
horesasu の each で meigen を新しいものから順番に渡してくれるので、それに対する処理をブロックで与えてやるとよいです。今回はダウンローダなので、ファイルとして保存する処理を書きました。
えっ、なんか今日のエントリはいつもと違うって?ふふふ… 今までタイピングしていた手は、利き腕ではない。

惚れさせを、いつも側に
すべての惚れさせ名言が、あなたの手元に届きました。


ファイル名にタイトルとキャラクター名を含めてあるので、検索できて便利です。

おおっと… コードとブログを書いているとすぐに時間が過ぎちゃうな。僕が今シャブやってるからっていうのもあるけどね。

わかってんのかよ
さて!「500枚近くの画像をダウンロードしたいんだけど、とても手作業じゃあ無理だなあ。どうすれば…」そんな日常のちょっと困った場面で、惚れさすレシピ集はとっても心強い1冊です。まるで、身近にいる頼りになる先輩みたいに、あなたを助けてくれることでしょう。試しにRuby逆引きレシピ レシピ一覧をご覧なさいな。お品書きの充実っぷりに驚くこと間違いなしです。
Ruby逆引きレシピに載っているレシピを利用して、何かちょっとしたプログラムを作ってみてAmazonのRuby逆引きレシピのページにレビューを投稿するというイベントです。
Ruby逆引きレシピAdvent Calendar : ATND
そうそう、プログラムを書いて、ブログを書いて、レビューを書くまでがこの企画でしたね。今からレビューを書いてきます!Ruby逆引きレシピAdvent Calendar の明日の担当は mikeneck さんです!

おまけ
惚れさせレシピ225に、実はあたしも出演しています。お手元のレシピ本をどうぞご確認ください。

まずいな〜!睡眠時間を削ってこんなエントリを書いてるのバレたら、心配されちゃってまずいな〜!

もう RubyKaigi2009 が終わってから何日も経ってしまいました.

RubyKaigi2009にKaigiFreaksとして参加します – 準二級.jp
ボクにとっては去年に続いて2回目の RubyKaigi.普通の参加者,お客さんとして楽しませてもらった RubyKaigi2008 と,スタッフの一員として参加できた RubyKaigi2009.ちょっと遅めのふりかえり.
発表とか
どの発表がどうだったとか,そんなものは gihyo.jp のスペシャルレポートに全部書きましたよー!もうこれ以上書けません,ってくらいに書きました.他の配信チームのメンバーや実行委員の皆さんは,ほとんど発表を楽しむヒマがなかったと思いますが,ボクはレポート係という立場だったので,多くの発表を見ることができました.
聞けてよかったなぁと思うのは Sinatra の発表です.そもそも Sinatra が大好きだから!ってのもありますが,ただただライブラリの使い方・特長をチュートリアル的に説明するだけじゃなく,「なぜ Sinatra なのか」という思想が多く語られていて,とても楽しかったです.

成果物としてのライブラリを見て,ユーザとして利用するだけに留まらず,どのような想いで「その作品が創られたか」を追いかけていくことで,自分も,少しでもよい物作りをしていきたいと強く感じました.
実は Sinatra の発表があったセッション,見ようか見まいか迷っていたんです.ただただライブラリの使い方を説明されるだけだったら,生で見る必要もないよなーと思っていました.いやいや,生でしか見られない痺れる発表がありましたよ.ステキな発表をありがとうございました.
それと… レポートを担当しながら,まったくレポートとして仕上げられなかった角谷さんの発表 Take the Red Pill について.発表者ご本人からも「レポートとしては壊れている」とお言葉をいただいて,ボクもそう思います.発表中にあった「楽しさで生き延びていく」という言葉がずっと心に響いていて,これを勝手に「ガンバってもいいんだよ」という意味だと捉えました.そんなこんなで,やっぱり文章の形で言えることは,まだありません.
スタッフとして

初日の朝の会場設営から,閉会後の打ち上げまで,たっぷり楽しめた約3日間でした!

どこかで見たことのある人,見慣れた顔の人.こちらが一方的に知っていて,お話ししてみたいなーと思っていた人.この場で初めて会った人.仲間として同じ3日間を共に過ごすことができました.とても嬉しいこと.素晴らしい出会いの機会をありがとう.ここで会えた皆さんとは,これからも色んな場所でご一緒したいな.そう思わせてくれるような,Nice な人たちばかりだった.


参加者として来場していたお友だちにもいっぱい会えました.スタッフとして,彼ら彼女らをおもてなしできて,スタッフ T シャツがとても誇らしかったです.みんなに楽しんでもらえていたらいいなぁ.
さらりと
全体としてさらりとした,お行儀の良いエントリになってしまった.それもそのはず,ボクはまだ Ruby 札幌の話をしていない.
会期中もそうだし,終了から2週間ほど経った今も,「なぜ自分があの特別な場所にいられたか」を繰り返し考えています.
去年の RubyKaigi2008 には一般参加者として参加しました.
RubyKaigi2008に参加してきた – 準二級.jp
あの不思議な興奮から1年.今年の RubyKaigi2009 には,ありがたいことにスタッフ(KaigiFreaks)として参加させていただけることになりました!スタッフのページにも名前が載って,とても嬉しいです.
ボクの担当するお仕事は2つ!
- 一橋記念講堂チームの一員として,メイン会場で行われる発表の映像を配信・録画する
- 技術評論社さんのレポート係として,写真と文章を随時更新でお届けする
現地参加できない方にも RubyKaigi の熱気をお伝えできるように尽力します.特等席で発表を見られるわけですからね,ちゃんとレポートしないとバチがあたるってもんです!
また,直前レポートとして書かせていただいた RubyKaigi2009 の紹介記事が,gihyo.jp に掲載されています.こちらもどうぞご覧ください.
RubyKaigi2009 スペシャルレポート:Ruby会議2009 直前レポート|gihyo.jp … 技術評論社
今週末から始まります!
もういよいよですね!実行委員の皆さん,他の当日スタッフの皆さん,どうぞよろしくお願いします.参加者の皆さん,RubyKaigi2009 でお会いしましょう!楽しみ!
ちょーお手軽に試せちゃう Web アプリケーションフレームワークであるところの Sinatra で遊んでみました.
Sinatra is a DSL for quickly creating web-applications in Ruby with minimal effort
Sinatra: README
“minimal effort” と謳っているのは伊達じゃなくて,Web サイトに書かれている通りに進めていけば,すぐに動くものができちゃいます.けっこうな衝撃体験でした!最初に Sinatra を知ったのはusericonsリニューアルとソース公開 – SWDYHを読んだときで,でもこのときはソースコードを見てもどの部分が Sinatra の処理に当たるかよく分かりませんでした.最近になって,改めて触ってみようと思ったときにRuby Sapporo Night vol.10 にてSinatraのお話をしました – dara日記があって,手を動かしてみるに至りました.
習作
練習用に,ということで,ボクが Tiarra のログとして貯め込んでいる Twitter のアーカイブを検索したりできるものを作ってみました.初めて触れるフレームワークなので学習コストも発生するわけですが,それでも数時間でひとまず動くモノができちゃうんだからすごいなー.
june29′s tiarrar at master – GitHub

Tiarra のログファイルをパースするところは置いておくとして,Sinatra の処理に当たるコードは以下のような感じです.これだけで URL に対する挙動を割り当てられます.必要な情報だけ集めて,あとは view 側に渡してやるのですね.
get "/" do
@groups = tiarrar.groups.keys
@statuses = tiarrar.recent
haml :index
end
get "/groups/:group" do
@group = params[:group]
@statuses = tiarrar.group(@group)
haml :statuses
end
get "/search/" do
@word = params[:word]
redirect "/search/#{URI.encode(@word)}"
end
get "/search/:word" do
@word = params[:word]
@statuses = tiarrar.search(@word)
haml :statuses
end
内容は
- 「/」へのアクセスは,最近の status を表示する index のビュー
- 「/groups/:group」へのアクセスは,指定グループに含まれる人の status だけを抜き出した statuses のビュー
- 「/search」への word パラメータ付きアクセス(検索フォームの向き先がこれ)は「/search/:word」にリダイレクト
- 「/search/:word」へのアクセスは,指定の文字列を含む status だけを抜き出した statuses のビュー
と,これだけです.
実現したい機能に対して,書かなきゃいけないコードの量が最小限で済むなぁ.もともと,Tiarra のログをブラウザから閲覧できるようにしたいとは思っていて,そうしておくと iPhone の Safari からもパッとアクセスできますしね,だけど,HTML に組み立てるのがけっこう面倒で,なかなか手が進まずにいました.
ボクがこれまで作ったものだと,TumbLens や iReblog も Sinatra でキレイに置き換えられそうです.特に iReblog の方は,cgi.rb で API 部分を作っていて,設定が面倒だったりしたので,これからは Sinatra が代替になってくれそうで嬉しいです.
そうそう,cgi.rb だと小さすぎるけど,Rails だと大袈裟すぎる,Sinatra は間に入ってくれて,上手に使い分けると幸せになれますね.
雑感
Rails に触れたことがある,ってのが大きかったと思います.Sinatra の処理を書いているときは「Rails でいう routes.rb と controller を書いている」って感じでした.view はそのまま view ですね.今回,Haml に触れるのも初めてで,これまたキモカワイイなーと思ってしまいました.はむはむカワイイ!Haml は,慣れるまでは大変だけど,慣れてしまえばすいすい書けちゃいそう.each に対応する end を書いたりしてハマりました.
まとめ
Sinatra の世界に入門してみました.正しい使いどころで使えば強力な武器になりそうです.最初のビューまでサクッといけちゃうのがいいですね.プロトタイピングに向いていそう.Haml や Sass と合わせて活用すればさらに少ないコード量でとりあえず動くモノができちゃう.
Sinatra 面白いです!
フリーのかわいいアイコンを見つけるたびに,ダウンロードしてニヤニヤしてしまう june29 です.しかし集めた大量の画像ファイルは,OS 組み込みのファイルビューアではなかなか一望しにくくて困ります.かといってよさげな画像管理アプリを探し出して導入するほどのモチベーションもなかったり.Mac で使えるステキなアプリがあったらぜひ教えてください.
今回は Web ブラウザで閲覧できるように,下記のスクリプトで1枚の HTML を生成してみました.
引数にディレクトリを与えると,そのディレクトリ以下にあるすべての画像(実際にはスクリプト内で拡張子をリストしている)を含む HTML を吐き出します.
$ ruby images2html.rb ~/icons > images.html
スクリーンショット.

「どのアイコンセットを使おうかなー」なんてフラフラしたいときにはよさそうです.