Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Web技術勉強会 第38回

1,429 views

Published on

Web技術勉強会 第38回

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Web技術勉強会 第38回

  1. 1. Web技術勉強会 第38回 2chから世相を占う 「rankforce」 rev.2 Ryuichi TANAKA. Twitter:@mapserver2007 1
  2. 2. 前回からの続き http://www.slideshare.net/mapserver2007/web-37 2
  3. 3. ・速報がほしい ・速報=2ch(Twitterも?) ・会社にいても速報がほしい ・「有名人が逮捕」→キタ━━━━━━(゚∀゚)━━━━━━ !!!!! ・せめて末席で参加したい 3
  4. 4. 前回まででiPhoneに 通知ができた。 4
  5. 5. しかし… 5
  6. 6. ・kayacのAPIの動作がおかしい ->認証エラー多発(設定に問題なし、エラー発生のパターンが よくわからない) ・なんだかんだで Webで見れたほうが楽ということ が判明 ->会社でいちいちiPhone開くこと自体面倒(笑) 6
  7. 7. 方針変更 7
  8. 8. Twitterに流す Web上で表示 いつものパターンかよ 8
  9. 9. 実行している処理について 9
  10. 10. 1.勢いを収集 10
  11. 11. ・スレタイ・URL・勢いを取得 ・2chの勢いまとめサイトから取得(怒られない範囲で…) ・Hpricotで楽々取得 ・データをcronで定期的に取得 11
  12. 12. 12
  13. 13. 2.Twitterに流す 13
  14. 14. アカウント取得 @rankforce 勢いをひたすら垂れ流すbot 14
  15. 15. botを作る 15
  16. 16. Twitter4Rを使うと簡単 t = Twitter::Client.new(:login => @login, :password => @password) status = t.status(:post, message) messageにPOSTするメッセージ。statusには ユーザ情報、投稿内容などが成功すれば返る bot自体は数十行でできる。 16
  17. 17. 3.取得したデータをDBに格納 17
  18. 18. 方針: DB使用は任意にする ->DBを使用するのは「オプション」にするため。つまりDBがなく ても動作するようにする。 テーブルは正規化しない ->つまりActiveRecord級の複雑さは要求しない。Sequelで できる範囲のDB処理しかしない。 18
  19. 19. その前に… 開発ではDBのマイグレーションを多用するので以下のようなツ ールを準備すると便利 (SequelにはARのように自動migrateができないので作る) down:テーブルの消去 up:テーブルの生成 19
  20. 20. Sequelを直接たたくのではなく、間にクラスを作る (Facadeパターン) DB:CRUDを実行。Sequelをシンプルにラップすることで簡単に 扱えるようにする。使用できる機能は制限されている。 (Something class):DBクラスを継承して使用。複雑な条件を指定するとき ここにカスタマイズする必要がある(具象化)。実装は使用するクラス にまかせる。 20
  21. 21. (Something class)#custom_select 例: def custom_select(where, grep) begin ds = select.grep(:thread_date, "#{grep}%").order(:thread_date) ds = ds.filter({:board_id => where}) unless where.nil? return ds rescue => e DB#select error(e) end end (Something class)#custom_selectを呼び出すだけでselect処理が完了 するので、呼び出し元(Controller)で複雑なコードを書かずにすむ。 同様にcustom_xxxを実装すればある程度複雑な処理も簡単に呼び出せる。 21
  22. 22. 4.グラフを作る 22
  23. 23. Web上で表示するとき、「グラフ」にすると 格好がいい。 どう実装する? ・Google Chart API ・jQuery系 ・その他フリー系 ・独自実装 23
  24. 24. Web上で表示するとき、「グラフ」にすると 格好がいい。 どう実装する? ・Google Chart API ・jQuery系 ・その他フリー系 -> 「amCharts」 ・独自実装 24
  25. 25. “amCharts” http://www.amcharts.com/ Flashベースのグラフ。見た目がかなり綺麗。 25
  26. 26. XMLかCSV形式のデータを作成し、JavaScript経由で読み込ま せる。また、FlashのAPIとしてJavaScript関数が使える。 <?xml version="1.0" encoding="UTF-8"?> <chart> <series> <value xid="0">12:58</value> <value xid="1">13:01</value> <value xid="2">14:15</value> </series> <graphs> <graph gid="1" title="ニュース速報+"> <value xid="0" bullet="round_outlined" url="http://tsushima.2ch.net/test/read.cgi/newsplus/1265169486/" description="【小沢問題】 特捜部、民主・ <value xid="1" bullet="round_outlined" 小沢氏を「不起訴処分」する方針で検討…現状では「立証困難」★10">3054</value> url="http://tsushima.2ch.net/test/read.cgi/newsplus/1265169665/" description="【トヨタ】新型プリウス、ブ <value xid="2" bullet="round_outlined" レーキ苦情が米で102件 日本でも 「横断歩道で止まれない」★3">3073</value> url="http://tsushima.2ch.net/test/read.cgi/newsplus/1265174114/" description="【裁判】 女子高生レイプで服 役→19歳女性レイプで服役→鬼畜レイプ魔、今度は犬の散歩中の女性レイプ、首切り殺害→無期懲役求刑★ </graph> 2">3650</value> </graphs> </chart> 26
  27. 27. JavaScriptでグラフをコール var so = new SWFObject("/graph/amline.swf", "amline", "900", "400", "8", "#FFFFFF"); so.addVariable("path", "/graph/"); so.addVariable("settings_file", encodeURIComponent("/graph/amline_settings.xml")); so.addVariable("data_file", encodeURIComponent("/xml/rankforce_xml_#{@board}_#{@date}.xml"), 0); so.write("graph"); //div#id 27
  28. 28. 28
  29. 29. rankforceの仕様 (収集機能) 29
  30. 30. # スレが登録されていない場合はInsertする # スレが登録されている場合は、勢いがを確認し、勢いが高い場合にUpdateする def custom_insert(data = nil) unless insert(data) ds = select.filter({:title => data[:title]}) ds.each do |e| if data[:ikioi].to_i > e[:ikioi].to_i update({:ikioi => data[:ikioi]}, {:id => e[:id]}) end end false else true end end こうすることで、最大の勢いをカウントすることができる。 30
  31. 31. -r [--register-threshold integer] -i [--im-threshold integer] 取得するスレの勢いの閾値 -t [--tweet tweet-threshold Im.kayac.comのIMを送信する閾値 integer] 取得したスレ情報をTwitterにPOSTする閾値 -b [--board String[,String,…]] -d [--database] 取得する板名(カンマ区切りで複数可能) -g [--graph] 取得したスレ情報をDBに格納するかどうか 取得したスレ情報をグラフ化するかどうか 設定例 ruby rankforce.rb –r 3000 –t 6000 –b newsplus –d -g 運用時はこれをcronで実行。 10分に1回収集が妥当 (TwitterAPIの70post/hに引っかからないようにする) 31
  32. 32. rankforceの仕様 (表示機能) 32
  33. 33. def describe @board ||= ‘newsplus’ # default board @date ||= Time.now.strftime(“%Y%m%d”) calendar = RankForce::Calendar.new(@board, @date) @calendar = calendar.generate history = RankForce::History.new @history = history.exec haml :index end # main method get ‘/’ do describe end Webの実装は「Sinatra」。 画面が1つしかないのでRailsを使う必要はないため。 シンプルに作るにはSinatraがやはり向いている。 33
  34. 34. ・APサーバは「thin」 thin start –C config/server.yml -d ・個人的にRailsでもSinatraでもthinを利用中。 34
  35. 35. 使ってみた 35
  36. 36. rankforce@Twitter ・即時性は低いがTLで追える ・ちょっとした休憩に見て確認 ・使い心地はまずまず? 36
  37. 37. rankforce@Web ・常時座席で確認できる (確認は3秒程度でできる ので仕事上影響なし) ・グラフなので一発で重要 ニュースがわかる (例:朝青龍引退 勢いが通常の10倍 程度あったので 一発でわかった) ・使い勝手は最高 37
  38. 38. 結論と今後 38
  39. 39. 結論 ・グラフ表示することでニュースの重要度が一目瞭然 有名人逮捕 ↓ グラフで確認 ↓ (時間差で)キタ━━━━━━(゚∀゚)━━━━━━ !!!!! ↓ 祭り参加inトイレ 注:まだやったことはない 今後 ・gem化したい ・自動ビルドするためにrakefileを作る 39
  40. 40. おまけ 40
  41. 41. rankforceをフォローしているおもな人たち。 (2010/2/6現在) 41
  42. 42. 広瀬香美 (@kohmi) NHKニュース (@nhk_rss) なぜフォローしたし。フォロー数/被フォロー数 bot。書いていないが個人っぽい? が凄まじすぎる。 菊池雄星 (@kikuchi_yusei) アルファモザイク (@alfamosaic) 高木美帆 (@takagi_miho) 痛いニュース (@itai_news) いつも見てます。 浅田真央 (@mao_asada) 本人じゃ当然ありません。bot。 趣味botかと思いきや、どうやら会社が というか、どんどん増えてる。 運用しているbotらしい。 フォロー thx!!!! 42
  43. 43. ソースはgithubに置きました。 43
  44. 44. http://github.com/mapserver2007/rankforce 44

×