全世界のtweetをリアルタイムにマッピング 〜socket.ioやらnode.jsやら〜

全世界のtweetをリアルタイムにマッピングするページを作りました。……というとちょっと大げさですが。


http://bugsrock.com/twistmap/


↑のページの、簡単な技術的説明です。ぶっちゃけ負荷のこととか考えて無くて、動いてない時も多いかもなんで、そのうちYouTubeに動画アップします。

つかったもの

ライブラリ
web API

簡単なしくみ

node.jsとsocket.ioでstreaming APIからデータを引っ張ってパースして全クライアントにbroadcastするサーバを立て、そいつを各クライアントが受け取り、google map APIを使って特定座標にマップしているだけです。ぶっちゃけ、難しいことは何もしていない(考えてない)です。なので、よく落ちます。

ポイント

node.jsとsocket.io

楽しす。マジ楽しす。脳汁出まくりんぐで最高です。

twitter streaming API

filterメソッド使ってます。検索指定は、「日本全域を囲む四角形の範囲のツイート」OR「4sqを含むツイート」。なので、海外のtweetは4sqしか取ってません。全世界に及ぶ範囲指定をするとどうなるかは不明。多分動かないだろうなーってことで試してないです。ジオタグついてないtweetは当然スルーです。日本全域を囲む件については、昔は面積がもっと狭かったらしいですが、最近制限が緩くなったみたいです……よ? 実はちょっと英語のマニュアルの翻訳に自信がないです。一応日本全域取れてるから大丈夫かな、って感じで; 四角形なので、ロシアの一部とか韓国のも拾ってきます。

Google Map API

これが無かったら公開はもっと遅れてました。実は初めて使ったんですが、こんなに自由度高いと思ってなかったです。jQueryとも親和性が高いですね。アニメーションするマーカが結構いい感じに作れて満足してます。

クロスブラウザ(てかOpera

Socket.ioとjQuery使ったおかげで偶然にも半クロスブラウザ達成してて、「やったろうやないか」と意気込んだはいいものの、Operaで動かず。調べたら、Operaはポート違うとクロスドメインに引っかかるということが判明。知らんかった。「クロスして無いやん!」とツッコミを入れる。
最初はApacheの80ポートとnode.jsの8080ポートでやってたので、リバースプロキシで対応してやろうかと思ったらプロキシがWebSocketに対応してなくて(そりゃそうだ)、ChromeがWebSocketじゃなくXHRポーリングするようになったので、そりゃねーわってことでApacheをカット。結局今はpure javascriptで動いています。
余談ですが、IE6でも動きました。思わずしたり顔になりました。すごいのはSocket.ioとjQueryだけど。

公開後にサーバが落ちまくった

主にSocket.ioの不具合。Socket.ioのコードを弄って、nullチェックを追加しまくりました。Socket.ioのバージョンを上げればいいのかもだけど、まだそこまではやれてないです。

その他

サーバの設定って難しいですよね。。さくらインターネットの社長のブログがとても役立ちました。田中さんありがとうございます。

TODO

  • 死活監視とdaemon化(ぉぃ
  • つぶやきをドラッグで動かせるようにする
  • グリグリやってるとたまにマーカがずれるのを直す
  • 範囲指定できるようにする
  • どの仕組みで繋いでるかをユーザに見せる(websocketなのか、xhr-pollingなのか)
  • サーバをEC2にするとか考える
  • streaming APIの限界を調べる
  • Socket.ioのバージョンアップ

あとがき・余談

若干駆け足で適当な説明ですが、詳しいところはnode.jsが盛り上がってるおかげでいろいろ出てますし(というかそれのおかげで完成したようなもん)、こんなところで。
当初の予定では、WebSocketの勉強をするつもりだったのですが、Socket.ioが楽しすぎて結局これで一つ作ってしまいました。webkit系の方ならwebsocket通信になるはずです。
想定よりスムーズな動きを見せてくれて、個人的には満足です。

さて、明後日から5日ほど台湾に行くので、その間にサーバ死んでたらごめんなさいorz

草を生やして温暖化を防止するUserScriptを書いた

これはひどい
万が一インストールしたければこちらから。
google chromeでしか動作確認してませんが、firefoxでも動く……はず。
ちなみに俺は即無効化しました。ウザ過ぎる。

どうしてこんなスクリプトを!

というツイートを見かけて、ずっと作りたかったのですが、どうにも文字列がうまい具合に分割してくれなくて、とはいえこんな一発ネタでYahoo!形態素解析API使って……とか有り得ないだろってことで、お蔵入りしてました。
しかし本日、↓のようなライブラリの存在を知りまして。

わずか25kバイトのソースコードで、日本語の新聞記事であれば文字単位で95%程度の精度で分かち書きが行えます。

http://chasen.org/~taku/software/TinySegmenter/

ktkr。
素晴らしく要件を満たしたライブラリでした。

製作時間は2〜30分程度? ぶっちゃけ「textnodeだけを取得するxpath」を考えるのが一番時間かかってます。
こんなふざけたスクリプトだけど、テキスト弄る系のスクリプトを作るときにまた見直しそうなスクリプト。いい勉強になった。

いいw勉強にwなったwとかwワロスwww

つれづれなるままに、ひぐらしtwitterにむかひて、おもつたこと

祝!twitter歴530日!(ぇー

ということで、いつのまにやらtwitter始めて500日+α経ってたんで、ざっくり記録してみる。

2010/8/30現在のスペック

[twitter:@mirutover]

フォロー 143
フォロワー 193
リスト 34
ツイート数 3161

平均して1日6ツイート。でも指数関数的に増えてて、twilogによると最近は平均20以上はありそう。

他の人とのスタンス

  • 自分からフォローするのは、リアルであった人と好きな漫画家などの著名人。
  • フォロー返しは、相手のTL見て適当に。割と返す方。
  • リストは一切使ってない。どういうものかも実はイマイチ分かってないw
  • ブロックはスパム以外使ってない。フォローしない・リムーブで対応。

発言内容

HeartRails Graph

発言内容 パーセント
日常 25%
IT 20%
ネタ 20%
ゲーム 15%
漫画 10%
アニメ 5%
「カラオケ行きたい」 3%
その他 2%

※ざっくりとtwilog見て。正確ではない。

  • リプライはあまりしてない。
    • 最近意図的に増やしてます。でも基本根暗ついったら。
  • 失言率は思った以上に高い。
    • オタクカミングアウトし過ぎ。リアルで知り合った子がツイッターやってても迂闊にIDは教えられないぜ!
  • 30回に1回の割合で「カラオケ行きたい」発言をしている。
    • 結構、病気である。
  • タツイートが嫌になるほど多い
    • なんだよって。夢見るのも大概にしろ。
    • ツイートで訂正してたみたいだけど、正しくは17歳教
  • URL付きの発言多め

外部サービス

  • ATND by Media Technology Labs
  • TweetIrcGateway
  • Twitter for iPhone by atebits
  • ふぁぼるっく by osapon
  • TwitThis by Chuug
  • Twitter for Facebook by Twitter
  • oauth - jsdo.it
  • Tweetvite by Simpletastic Inc.
  • ニコニコ生放送
  • mixi ボイス by 株式会社 ミクシィ
  • Twilog by ropross.net
  • Hatena by Hatena
  • Twilk.com by Congo Labs
  • www.movatwi.jp by f-shin
  • favotter by ono_matope
  • jigtwi by 株式会社jig.jp
  • twicca(deprecated) by R246Design
  • Twitpic by Twitpic Inc
  • ついっぷる by NEC Biglobe
  • Chromed Bird by Cezar S〓 Espinola
  • コレカモネット
  • TwitIQ by HanPerson.com
  • TweetMeme by Favorit Ltd.
  • 携帯百景 by 運営うさぎ

俺はホイホイOAuth許可する人間じゃない(キリッ
……とか思ってたけど、結構「こんなの登録したっけ?」ってのがw今度整理しよう。

まとめ

  • twitter依存が強まっている。
  • twilogはもっと早く使い出すべきだった。
  • もっとlogっぽく行こうぜ。
    • 「うめぇ」3文字だけとかやめようぜ。何食ったか書けよ俺。
    • 位置情報はやっぱもっとツイートすべき。
    • 5w1hを多少意識しよう。
      • 意識しすぎて固くなるのも嫌だけどさ。
  • リプライはしよう。
    • 義務になると自分に取ってのtwitterの良さが失われるから、バランス大事かな。
  • OAuthサービスはもうちょっと計画的に。
    • 計画的にしてるつもりだったんだけどなぁ。
  • 「やっとtwitter記法使えましたね」
    • 今更すぎる
  • twitter系のサービス作るって言ってませんでしたっけ?」

おまけ

twilog付け出した日の1ツイート↓


なんぞ

ニコ動のナポリタン東方がやばい面白い

ブログ更新が滞るなぁ。技術系の話題に拘らず更新してくべきか。

ということで、ナポリタン東方

結構怖い&ちょっとグロいので、苦手な人は見ないが吉。あと東方の二次設定知らないとイミフです。

2chの有名コピペ「ナポリタン問題」が元ネタの動画。
絵の雰囲気と音楽チョイス(谷山浩子さん)が素晴らしいです。
1本目が問題提出、2本目以降が解答編なんだけど、その解答編すらもナポリタン問題になっている。
ぶっちゃけ1本目の1問目はネタみたいなもんなんだけど、2本目を理解するのが難しい。

「google 左 うざい」ので左を消してみた

なんか結構反応されてるみたいなので、スクリプト修正して公開します。てかうちのblogが4番目に……;

google急上昇が「google 左 うざい」ってなんて皮肉。
ということで、左を消すグリモン作りました。

optionをクリックすると表示させたり消したりできます。

  1. chrome以外の人はgreasemonkey拡張を入れる
  2. ソースコード右下のview rawをクリックしてインストール

画像検索でも効くようにしました。(注意:chromeで更新する場合は、一度スクリプトをアンインストールする必要があります)

ムシャクシャしてTwitterユーザ回してみた

GAE/Jで作ろうとしてたサービスがもろ被りだったので、ムシャクシャしてTwitterプロフィール画像を回してみた(謎

……ごめん。俺もよくわかんない。

回したい方(?)は以下の右下の view raw からどうぞ。chromeでしか見てないけど、たぶんfirefoxとかsafariのグリモンでも動くんじゃないかなー?
目が回ったら、無効にするか、アンインストールしましょう。そうしましょう。

まぁ、CumStudioを使ってみたかっただけだったりする。

pixiv検索結果をソートして見やすくするグリモン書いた

概要

pixiv検索結果の横一列をブックマーク数でソートするgreasemonkey script
を書きました。google chrome最新版とfirefox最新版で動作確認しています。

AutoPagerizeとの組み合わせ

AutoPagerize
この拡張orグリモンは、縦スクロールするだけで、自動的に次のページを読み込んでくれるものです。
pixivへも対応していて、検索結果ページでマウスホイールを下にくるくる回すだけで、次のページを次々と読み込んでくれるので、これだけでもpixivがすばらしく使いやすくなります。

初めは一画面丸々ソートするグリモンだったのですが、私がAutoPagerizeを使うようになり、一画面でソートしても見づらいだけになってしまったので、横一列でソートをするように変更されました。
これと本グリモンを組み合わせることで、左端を眺めながらマウスホイールを下にくるくるするだけで(笑)、ブックマーク数の多い画像をチェックすることができます。どんだけ不精だよ俺w

インストール

ソースコード右下の view raw をクリックしてください。
Chromeでは、アンインストール後に再インストールする必要があります

ソースコード

たまに表示されない……? ↓に表示されてなかったらリロードしてください。


スクリーンショット

AutoPagerizeと組み合わせたところ。若干分かりにくいですが、左側にブックマーク数の多いものが固まってます。


余談

AutoPagerizeと組み合わせるために、500ミリ秒毎にソートすべき要素がないかチェックするという結構強引な手段をとっています。
私の環境では導入後も特に変化ないですが、人によっては若干重いかもしれません。でもxpathの動くモダンブラウザならまぁ問題ないはず。。

なぜこんなにブクマされてるし、と思いながら微妙に修正。挙動は一緒。

pixiv大幅更新に対応しました。ただ、AutoPagerizeの対応がまだなので、それが来たらまた修正必要かも

AutoPagerizeをどなたか対応してくれたみたいなので、再修正しました。

今さらですが、AutoPage『r』izeだったんですね。。