これは何?
インターネットの世界が常に気になるけれども、ずっと見ているわけにはいけません。例えば私は仕事をしているときはTwitterをずっと眺めているわけには行きません。
そんな人に向けたサービスが「毎時新聞」です。
Twitterで盛り上がっている画像や、トレンドワードを1時間ごとに集約します。
寝る前に今日のページを見ると 大まかなインターネットの盛り上がり方を知ることができます。
実はこれ、以前も作ったことがあります。
数年運用したのですが、最近Closeさせてしまいました。で、今回また作りました。
デモ
こちらからアクセスすることができます。
こんな感じで、1時間ごとにTwitterで流行った画像を閲覧できるサービスです。
ちょうど10/20の8時で、シンカリオンの画像がはやっている様子がわかります。
もうひとつ10/21 9時、皆さんご存知ニチアサタイムが観測できます。
仕組み
今回はKubernetesクラスタ上で動かすマイクロサービス群として実装してみました。
Kubernetesクラスタは以前紹介した方法で作成したものです。
トレンド取得部分(trend-checker)
肝となるトレンド取得は、TwitterのStreaming APIを利用しています。
GET statuses/sample — Twitter Developers
一般利用なので、すべてのTwitのストリームを取得できませんが、そこそこたくさんのデータが流れてくるので、ここに流れてくる画像を含むTwitの数を数え続けるアプリケーションをGo言語で書きました。
このアプリケーションはメモリ内にランキングを保持しており、外からHTTPでアクセスすることで、このランキングを取得することができるようになっています。
ランキング取得とスコアリングのバッチ処理
上記トレンド取得のAPIを1時間ごとに呼び出して、その結果をファイルとして保存する仕組みです。これにはKubernetesのCronJobの仕組みを利用しています。
さらに、いかがわしい画像などを判定するためのスコアリングを計算するために後述のNFSW APIを呼び出して、ランキングデータにスコアデータを付け足します。
NSFW API
毎時新聞を作った時に気づいたのは「エロ画像が多い」ということでした。
まぁそれも毎時新聞の醍醐味なのかもしれませんが、せっかくなら分類してみたい、、ということで調べているとYahooが公開しているOpen NSFWというモデルがあることを知りました。
これは最近はやりの機械学習の仕組みで、エロ画像など職場で見るにはふさわしくない(NSFW:Not Safe For Work)な度合いを判定してくれるものです。
さらに、このOpen NSFWをWebサーバとして利用できるように改造したものを作ってくれた方がいたのでこれを利用することにしました。
フロントエンド
ここまでで、NSFWのスコアのついた毎時の画像ランキングデータがファイルサーバに格納できました。後は表示するだけです。フロントエンドはJavaScriptを使って、ブラウザ上で画面を組み立てるようにしました。
NSFWのスコアによる表示の有無もブラウザで判定しています。
図解
図にすると結構壮大な感じになりました。
まとめ
以前作ったものと同じ内容のサービスですが、Kubernetesを利用したマイクロサービスとして作ることで新たな学びがたくさんありました。
このように役割ごとにマイクロサービス化することで、改良もしやすく、また別の何かを作るときもここで作ったマイクロサービスを機能として取り込みやすい作りになったと思います。
おまけ
ここまでの説明で、気づいたかもしれませんが、フロントエンドのコードをちょっと変えるだけで「裏モード」を作ることができます。「裏モード」とはつまりNSFWのスコアの高いものだけを表示するようにした毎時新聞です。 いろいろまずい画像が表示されますので、注意してアクセスしてください。