Click here to load reader
Upload
ryuichi-tanaka
View
1.162
Download
3
Embed Size (px)
DESCRIPTION
Web技術勉強会 第37回
Citation preview
Web技術勉強会 第37回2chから世相を占う
「rankforce」
とにかく速報がほしい
Twitterもあるけどやっぱり、
速報=2ch
会社にいても速報がほしい
仕事中に堂々とメールは見辛い。
携帯でネットはさすがに…。いや見るけど。
でも速報が欲しい。それを実現したい!
例えば…
「有名人が逮捕された」↓
キタ━━━━━━(゚∀゚)━━━━━━ !!!!!↓
社会人、祭りに参加出来ず↓
ニート大勝利
正直悔しい。せめて祭りを外から眺めたい!
駄目なパターン
・常時2ch監視→できるわけねえだろ。・定期的に2ch監視→そんな時間あるわけねえだろ
・休み時間に2chを監視→まさに後の祭り・仕事中に小窓で2ch→バレたらさすがにやべえ
・というか会社から2ch見れないぜ!
共通して言えること
人間が能動的に情報を取りに行く時点でだめ。なぜならいつ事件が起きるかわからない。プログラムで定期監視をしないといけない。それを人間に通知しなければ要件は達成できない。
つまり、定期的かつ受動的に速報を取得することがゴール!
こうすれば簡単
定期的→cron
受動的→kayac通知API(要iPhone)
言語選定
Rubyに決定 条件として「スクレイピング」が簡単、
「過去のロジックの使い回し」が可能
はじめにJavaと迷うも、Javaはスクレイピングが糞。例によってコード量が多くなる。却下。次にPerl。ロジックの使いまわしが効かない(新規につくらないといけないところが多かった)ので却下。あとORMが糞なので却下。その点Rubyはすべて満たした。PHPは…残念な
がら今回は用なしだった。
スクレイピングは超簡単
Hpricotでらくらく。
html = timeout(TIMEOUT) do Hpricot(open(URL).read) endres = (html.search("//table[@class='forces']/tr")).each_with_object [] do |e, r| ikioi = e.search("[@class='ikioi']").inner_text.toutf8end
DBにつっこむ
これもSequelでらくらく
@db = Sequel.connect(...)@db[:table] << data
IMを送る
普通にNet::HTTPとかでPOSTするだけ(すでに作ったものをコピペで終わり)
HOST = 'im.kayac.com'PATH = '/api/post/'data, header = {}, {}Net::HTTP.version_1_2Net::HTTP.start(HOST, 80) do |http| response = http.post(PATH, data, header)end
実行
rankforce.rb -b newsplus -r 10000 -i 20000 -d
Cronに登録
実は苦労した…。cdが必要とは。
*/5 * * * * cd /usr/local/apache2/htdocs/rankforce/; /usr/local/bin/ruby rankforce.rb -r 10000 -i 20000 -d
あとはiPhoneで通知をまつべし
通知してくれる!
まとめ
製作時間:たぶん10時間くらいPerlでも同等のものを同等の
コード量で作れるはず。今後はちょこちょこ改造予定。