第42回 Ruby/Rails勉強会@関西

Ruby/Railsの勉強会に参加してきました。
時間を勘違いしていたため、開始5分後に到着してしまいましたが、発表には間に合いました。

実践スクレイピング(ふるかわだいすけさん)

ふるかわさんは「モバイラーズオアシス」を運営していらっしゃいます。
モバイラーズオアシスは「コンセントを貸してくださる喫茶店、ネットカフェなどを検索できるサイト」で、ベースとなる店舗情報をスクレイピングという方法で取得しているとのことでした。
今回はRubyを用いたスクレイピングの方法と、実際にデータを取得する上でのTipsを紹介して頂きました。

スクレイピングについて

スクレイピング(scraping)の意味を調べてみると・・・

scraping:削ること、こすること(アルクの「英辞郎 on the WEB」より)

Webでいうスクレイピングとは、Webページから情報を取得することです。

スクレイピングの仕方

対象HPのHTML解析に「Hpricot」を使用。
HpricotRubyで実装されたHTMLパーサ。XPathで取得対象のデータを指定する。

  • Firebug」を使用してデータを取得

Firefox」のアドイン「Firebug」を使って取得することも可能。ただし、Firefox向けに編集されてしまう場合があるので注意が必要。

XPathは仕事で(NeoCoreのデータ検索時)使っているので、すぐにイメージできました。
Firebug」はJavaScriptデバッグができたり、HTMLの構造を解析できるということでインストールしたけれど、使い方が良くわからず、ほとんど使っていません・・・
これを機にオーソドックスな使い方は押さえておいた方がいいかな。

スクレイピングの実践
  • URL一覧型
  1. URLを取得
  2. 「1」で取得したURLにアクセスし、店名を取得
  • 改ページ型

「次へ」「前へ」に設定されているURLを取得し、後は他の場合と同様に処理する。
ドトールのように、XPathでは取得できない場合、正規表現を使用して取得する。

改ページ型の場合、HTTPのPostメソッドが呼ばれるようになっている場合もありますが、Postメソッドに対応したモジュールもあるようです。

スクレイピングする際のTips
  • 自動的に対象データを取得する際、「User-Agent」に連絡先を設定すると良い
  • AJAXで動的にページを生成している場合、取得できない
  • URLのパターンからサイトの構成を推測する
  • データ取得時は、適度に「sleep」をはさむこと

自動的にデータを取得されるのを嫌がるサイト運営者もいるので、「User-Agent」に連絡先を設定するそうです。
エチケットとしての意味合いもありますね。

AJAXを使用しているサイトの場合は、どうしているのでしょう・・・
人力なのかな。

店番号が含まれているようなURLの場合、繰り返し処理で処理するそうです。
ところが、地図サービスと提携しているサイトもあるそうで、URLに含まれる番号が地図のIDになっている場合もあるようです。
この場合、繰り返し処理で処理すると大変なことに・・・

sleep処理を挟まずにスクリプティング処理を実装すると、ブラウザでアクセスする場合は考えられない頻度でアクセスすることになるので、サイトが落ちてしまう可能性があるとのこと。
必ず、sleep処理を挟みましょう!

Rubyで描く折り紙展開図(志村さんid:hs9587

TokyoRubyKaigi03」のハンズオンワークショップ「Ruby で作る Ruby の折り紙」で発表された内容とのこと。
みんなで折り紙を折りました。
Rubyillustratorを操作していて驚きました。

IOクラスについて(cuzicさん)

RubyのIOは高レベル、低レベルとも対応されている。
以下のメソッドは、bufferの読み込み方が異なっている。

  • read
  • readpartial
  • read_nonblock

まだRubyの勉強を始めたばかりなので、詳しいことはわかりませんでしたが、イメージとしては
「たまるの待つ?それとも読み込む?」
ってことだと思ってます。
そして「これらを適材適所で使いましょう」と。
間違っているようでしたら、突っ込みをお願いします。

RubyWebCam非実在なこと(にしたかおさん

処理の流れ

  1. マーカーの検出(OpenCV*1
  2. 特徴点抽出(OpenCV
  3. ピンホールパラメータ計算(Ruby/GSL)
  4. 回帰分析(Ruby/GSL)
  5. モデル合成(Ruby:NArray)
  6. 作画(OpenGL

※ 「unable to remap 問題」があるのでCygwinでforkはしない方が良い

マーカを用いた「AR(Augmented Reality:拡張現実)」という技術を、Rubyをベースに実装していらっしゃいました。
具体的には、WebCamで認識した特定のマークに応じて動画内に3DCGを表示していらっしゃいました。
Rubyはもちろん、画像処理、画像認識、3DCGも全くわかっていない僕は、単純に「スゲー」って思いました。

最近、マークを使わないAR「PTAM」を実現するコードが公開されたようです。*2
YouTubeに動画がアップされています。
http://www.youtube.com/watch?v=Y9HMn6bd-v8&feature=player_embedded

DRYを拡大解釈せずに、車輪を作ろう

何度となく車輪を作る話をし、自ら「車輪男」を標榜していらっしゃいました。
僕は大賛成です。
既にあるものを作っても仕方ないという話もありますが、「より良い車輪を作る」という考え方もありますし、何より車輪を作ったことがないと車輪が壊れたときに対応できないと思います。
個人的な経験則ではありますが、IT業界では「車輪が壊れた場合は車輪の専門家へ」という訳にはいかないことが多いと思います。
オープンソースを利用した場合は、特に顕著だと思います。
そんな時に役立つのは、車輪の仕組みであり、車輪を作ったことがある経験だとおもいます。
そういう意味でも「車輪を作る」というのはとても大事なことだと思うわけです。
Matzさんも「多様性は善」とおっしゃってますしね。*3

「作るべき車輪かどうか」を判断するのが難しいですけれど。

懇親会

Rubyを勉強始めたばかりなので、Ruby談義には加わることができませんでしたが、貴重な話を聞くことができました。
ソフトウェア開発に携わっている人達だけでなく、業務を改善するためにRubyを使っている人達もいて興味深かったです。
アセンブラでの開発話なども出てきて驚きました

小波先生からどんなことをして欲しいかと尋ねられました。
そこで以下の点について、勉強会で取り上げて頂きたい旨、お答えしました。

  • Ruby」らしい実装について
  • Rubyの可能性について
  • Railsの動向
Rubyらしい実装について

僕はJavaしか知らないので、せっかくRubyで実装しても「JavaRubyで置き換えただけ」の実装になるんじゃないかと気にしています。
普段、Javaで実装するときも、好ましくないコーディングになっていないか気になっていて、なおかつ確認することもできないので、Rubyなんてどうなることやら。
そこで、Rubyで開発する際に気をつけなければいけないことを、参加者が普段使っている言語と比べる形で教えて頂けたら助かる旨、お答えしました。

Rubyの可能性

Rubyの未来というよりは、「Rubyでこんなことできる」「Rubyだからこんなことができるはずだ」ということを紹介して頂きたいです。
どなたか忘れてしまいましたが、「動的型付け言語は動的なものを作ってなんぼ」という話を耳にしました。
そこでRubyの特色を挙げた上で、その特徴を生かすようなこととして、どんなことが考えられるのか紹介して頂きたいです。

Railsの動向

Railsを使ったことはないけれども、今年に入ってから「Rails 3.0」のβ版がリリースされたようなので、今までとの違いが知りたいです。
また、以下のことについても知りたいです。

*1:最近、OpenCVのバイナリがリリースされたらしい

*2:http://www.robots.ox.ac.uk/~gk/PTAM/

*3:「RubyKaigi'08」の基調講演「プログラミング梁山泊