Twitterのしつこいフェ○アイコンを自動でブロックするサービスを作ったよ

こちらでーす.

ふぇらふぇらほいほい

名前に関してはいろいろありますが, とりあえずBritney Fuckedのせいにしておいてください. あ, ごめんなさいすみません, あ, あ. 悪ふざけです.

使い方はOAuthの方で許可していただければそれだけでOKです. 詳しいコトはふぇらほいの方に書いてありますけどね.

使ったもの

せっかくなんで書いておきます. 余力があったらソースコードでも公開します.

Web側

全部Rubyで書いてあります. コントローラにSinatra, ビューにHamlを使っています. データベースへのアクセスはSQLを直接書いているので, 特にどうこうはありません. あとはグラフを描画するためにGruffを使っています.

サーバーはURLからもわかりますが, さくらさんです. データベースはMySQL. 最初はcoreserverの方でやっていましたけど, Gruffが利用するRMagickをインストールするコトができなかったので, しぶしぶ乗り換えた次第. ご迷惑をおかけしております.

バックグラウンド側

バックグラウンドはすべてErlangで書いています. 動作自体は各ユーザーさんのフォロワーを取得して, 例のスパムがいたらブロックするだけです.

ちなみにボクのマシンで動作させています. 当然Web側のデータベースともやり取りを行わなければいけない(ユーザーさんの取得, ブロック情報の更新)ので, その間はSSHを介してごちゃごちゃやっています*1.

ハマったところ

Web側は特に問題もないのですが, クローラなどのバックグラウンドで動作するやつを書いたコトがないので, 紆余曲折ありました.

最初の作りがあまく, 200ユーザー数を超えたあたりでとあるプロセスがヒープ領域を大量に消費してしまったり, プロセスの死亡をトラップせず, それが影響して全体が死んだり…… ユーザー数も予想外の増加数だったのでけっこう焦ったー. 公開して1日経たずにバックグラウンドのプログラムを書き換えるはめになりました.

学んだコトは:

  • いくらErlangのプロセスが軽いとは言え, そのプロセスに引き連れている値(loop(A, B, C)など)によっては考えモノ
  • メモリ的には問題なくても, 他にボトルネックとなる部分がある. 今回はTwitter APIへのリクエスト. 並列数多すぎてタイムアウトが頻発してた

とかでしょうか. 現在は並列数を最大でも20程度に抑え, プロセスも逐次spawn_linkするようにしてあります.

とりあえず

うっとうしくて, でも無視できなくて, 毎回手動で対処しているという方は一度どうでしょうかー.

*1:本当は同じネットワークにおいて, MySQLのデータベースと直接やりとりしたひ……