MongoDB(v2.6.5)が–repairでも起動しない。

猫の写真を貼れば許されるという風潮。

猫の写真を貼れば許されるという風潮。


11/22に送られてきたLogWatch(つまり11/21に発生分のエラー)で、crontabがエラーを起こしまくっていたので原因を調べてみたら、はっしゅたんぐら。のpost用スクリプトがmongoDBにアクセスできてなくて死んでました。
とりあえず下記コマンドでリペアして起動させようとしたのですが、“dbpath (/data/db/) does not exist”エラーで起動せず。

$mongod --repair

/data/dbをdbpathに指定した覚えはなかったため、Google先生にお尋ねしたところ下記の記事と同じ症状でした。
島を買うまでのとんでもなく遠回りな道のり

対処方法としては下記の方法で解決しました。

$sudo chown -R mongodb dbまでのパス
$mongod -f .confまでのパス --repair

なんでmongodbが落ちたかがわかってないので、これは追々調べたいと思います。

twitterに#でタグつけてつぶやいた時に日時を取得してtumblr.に投稿するWebアプリ。

はっしゅたんぐら。 – twitter # to tumblr.
リリースしました。

つかったフレームワーク

WAFはあいかわらずのMojolicious::Liteで、CSSフレームワークについてはPureを使用しました。Blogレイアウトをそのまま拝借するという手の抜きようです。
Railsで同じもの実装しようとすると半年かかっても全く終わらない自信があるので正直手を出したくないです。半年かかってもいいアプリで挑戦したいですね(ふるえながら)。

つかったDBとドライバ

使用したDBはMongoDBで、ドライバはMangoを使用しました。
MangoはMojoliciousに最適化されたノンブロッキングI/OなMongoDBドライバです。詳細は以下。
oliwer/mango

最新の安定版のMongoDBしかサポートしていないので、なにも考えずにapt-getでインストールしたMongoDBだと動きません。(最初これでMangoが動かなかった)
Debianだとリポジトリ追加するだけでインストール出来たので、拍子抜けしました。
Install MongoDB ? MongoDB Manual 2.6.4
MongoDBめちゃくちゃ楽だし使いやすいですね。JSONは偉大だと思いました。(小学生並みの感想)

つかったWeb API叩く用モジュール

TwitterはNet::Twitter::Lite一択なので詳細割愛。
Tumblrはtumbperlに「get_authorization_url」と「get_access_token」メソッドを追加して、Webアプリケーション経由でアクセストークンが取得できるようにしておきました。
実際のソースはgithubにおいておきました。(forkあんまりしたくない人間なので、最初はcloneしたものにコミットしてたんですが、公開するのにそれはどうなのよって気がしたのでforkしました。)
retrorocket/tumbperl at for_web_app

暗号化とか

アクセストークンを暗号化してDBに保存する必要があるので、Crypt::CBCで暗号化しています。
暗号化方式は(自分が使ったことないものを試したかったので)Crypt::OpenSSL::AESを使いました。
AESで暗号化したものはバイナリになるので、Base64エンコードしないとDBに保存できません。これに気づかず、全く復号化できなくて1時間無駄にしました。
MIME::Base64::encode_base64でエンコード、decode_base64でデコードできます。

実装した結果

retrorocket/tag

すぐ実装できるだろ―と思ってたのですが、MongoDBにアクセスできなかったり、復号化上手くいかなかったり、Twitter側のアクセストークンをセットし忘れて400が出てるのにそれの原因がわからなくて30分作業が止まったり、全然すぐ実装できなくて凹みました。
Mangoの使い方は下記をものすごい参考にさせていただきました。(めんどくさいのでメソッド名もそのまま使用させていただきました。)
MojoliciousでMongoDB – Qiita