RSPiでMongoDBを動かし、Twitter Post Alertを作った話
κeenです。ここのところ寒い日が続いてますね。寒いと家に扃(ひきこも)ってTweet数が急上昇します。 すると一日に何postしてるか気になるのでカウンタを作りました。
そのときの苦労話です。
ただ、どうせ記録取るなら色々やりたいのでRspberry Piで一日のpost数、fav数、そしてメンヘラなことにフォロー/フォロワー全員のidを毎日記録することにしました。これで誰にリムられたかブロられたか一目瞭然ですね。
ここで一つ問題が。post, fav数は良いのですがフォロー/フォロワーのid一覧は毎日変わるのでmysqlで管理するのはちょっと面倒かなと。なのでMongoDBで管理することにしたいんですが、raspbianのapt
にないんですよね。仕方ないので手動ビルドで対応しました。
MongoDBのビルド
ここを参考に
cd ~/compile
sudo apt-get install build-essential libboost-filesystem-dev libboost-program-options-dev libboost-system-dev libboost-thread-dev scons libboost-all-dev python-pymongo git
git clone https://github.com/skrabban/mongo-nonx86
cd mongo-nonx86
sudo scons
としました。が、scons
に一晩かかるとのことなので放置してたら何故かraspberry piが落ちてる…
気をとりなおして再起動。もう一度sudo scons
すると今度はエラー終了。sig 9 killed
…いや、私なにもしてないですよ?ダメ元で今度は
sudo scons install
したら完走。良ク分カラン。狂想曲感が出てますね。
MongoDBのインストール
さっきのでインストール終わったと思うでしょ?違うんですよ。init.d
だとかmongodb.conf
だとかは配置されてないんですよ。debian/
以下に色々入ってるので
cd debian
sudo cp mongodb.conf /etc/mongodb.conf
までは良いのですが、init.d
とmongodb.upstart
のmongod
のパスが/usr/bin/mongod
でハードコードされてるんですよ。上のsudo scons install
だと/usr/local/bin/mongod
です。さらに起動オプションに--dbpadh /var/lib/mongodb
と--logpath /var/log/mongodb/mongodb.log
が指定されていて、mongodb.conf
で上書きしているにも係らずそこまでのパスが存在しないとエラー吐いて起動してくれないので修正。
mongodb.upstart
は直ぐ分かるので良いとして、init.d
は
1 2 3 4 5 6 7 8 9 10 |
|
な感じの修正です。なんか空行が一つ減ってますが気にしない。
ここまでしたらようやく
chmod +x init.d mongodb.upstart
sudo cp init.d /etc/init.d/mongodb
sudo cp mongodb.upstart /etc/init/mongodb
で完了です。man
とかもあるのですが配置の仕方が分からないので放置←
sudo service mongodb start
mongo
で接続確認できます。
Twitterのpostを集約する
ビックリするくらい簡単。twitterのAPI keyを持ってる前提ですが。
sudo gem install twitter mongo
で必要なgemをインストールし、~/.twitter.rb
に
1 2 3 4 5 6 |
|
と保存しておきます。昔と形式が変わりましたね。この形式になってからスレッドセーフになり、Twitter Stream APIにも対応してるようです。いつか扱ってみたい
集計ですが
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
で全部です。Rubyのハッシュ+配列がそのままinsert/selectできるのでぜんぜんMongoDBを意識しなくて良いですね。
ところでdatetime
型が無さげだったのでtimestamp
をソートキー兼idにするためにYYYYMMDDHHMMSS
形式の文字列で格納してます(整数は8bitまでっぽかったです)。他に良い方法があると思うのですが思いつきませんでした。