tkm2261's blog

研究員(OR屋) → データ分析官 → MLエンジニア → ニート → 米国CS PhDが諸々書いてます

kaggle slackの過去ログ閲覧アプリをGAEで構築した話

こんにちは、tkmです。

今日は、kaggle slackの過去ログ閲覧アプリをGAEで構築したときのハマった点とかの話を書いていこうと思います。

kaggle slack過去ログ閲覧アプリ on GAE

https://kaggler-ja-slack-archive.appspot.com/

手前味噌だけど結構良いアプリになっていると思う。

チャンネル創立当初のログにまた逢えると思ってなかったので感慨深いですね。

Slackの無料枠では1万メッセージしか見れない

https://kaggler-ja.slack.com/intl/ja-jp/plans

1万件というのは多いようでかなり少ないです。Kaggle slackの場合6月末時点で5月までのログしか保存されていませんでした。

このままだと、kaggle slackではコンペ解法や質問回答という貴重な知見がロストしていってしまうので対策が急務でした。

Slack APIも過去1万件しか見れない

当たり前のようですが、APIで叩いても1万件しか取れません。また、誰がどのチャネルに入ったとかもメッセージとしてカウントされているようで、1万件が体感より少ない理由にも納得しました。

またAPIを使って、Google Spread Sheetにログを継続保存するのはかなり簡単で、

こちらのブログのコードをコピペするだけでOKです。

motemen.hatenablog.com

一応現在でも、Kaggler slackのコードはここに保存され続けています。

https://drive.google.com/drive/u/4/folders/17HBT50oa-Kow4127xhCwU0uEKrr33X90

Slack APIで見るべきデータ

SlackのAPIのページには様々なAPIがあり、一見メッセージログ収集に必要なデータがわかりずらいです。

Slack API | Slack

一応私が使ったAPIを列挙しておきます

何故かGUIでダウンロードすると、過去全てのメッセージが見れた!

get.slack.help

ここに従ってエクスポートすると、publicチャネルに限った話ですが、過去のメッセージを全て見ることが出来ました!

もともとKaggler slackはパブリックチャネルなのでこれで十分

最初はこれに気づかず意気消沈してましたが、結果全てのログを閲覧できるようになりました!

ただしUIでダウンロードしたログのタイムスタンプはintでmsecまで入ってません。

メッセージの差分管理をタイムスタンプでやってると、APIで来たメッセージはmsecまで入っているため、二重保存されるので注意してください。

お金もかけず運用も頑張りたくないのでGAEを選択

スプレッドシートでも最低限ログは見れましたが、やはり見づらい事この上ないためアプリを構築することに

次々来るログの差分管理が必要なためDBを導入したいが、

色々調べてもDB立てると高額になるし、運用手間的にインスタンス内に自分で立てたくない。。。

ということで、完全無料に組めるGAE+Datastoreで組むことに

Python2.7になるけどGAE Standardを選択

flexibleだと色々やりやすいが、大したことやらないので無料枠の多いStandardを選択

今回は開発しやすさよりも、運用負荷を優先

工数の9割はdatastoreに吸われた

GCPではCloud SQLといった普通のDBに無料枠はないが、datastoreには無料枠があり、

昔からGAE使ってる人にはお馴染みだと思います。

こいつはNoSQL的なDBで、インデックスをしっかり貼らないとクエリ自体が失敗する他、

ドキュメントも少なく仕様把握に時間がかかりました。

今回みたいな簡単なアプリにはいいですが、しっかりrelationをやるようなアプリでは大人しくCloud SQLとかを使ったほうが良さそうです。

WebフレームワークはFlaskを採用

個人的にはDjango派でしたが、ORマッパがdatastore独自になるので軽量かつGAEのサンプルコードが多いFlaskを採用しました。

コード見て頂ければわかりますが、ページ一個でGETだけ、パラメータもGETで渡すだけなのでかなり適当に書いてます。

UIを頑張ってslackに似せた

こういうアプリはUI悪いと敬遠されて使われないので、UIは可能な限りslackに似せて作りました。

f:id:tkm2261:20180705114143p:plain

https://kaggler-ja-slack-archive.appspot.com/

配色とかフォントはネットで「slack css」とかググって出てきた物を拝借して、

デザイン全体にはBootstrap4を採用しました。

昔みたいに「col-xs-3, col-md-3, ...」みたいに延々書く必要がなくなり、「col-3」だけで良いので大分書きやすくなっていました。

一応スマホでも見れるようにしてますが、専用の調整はしていません。

メッセージにリンクを付けた

実際に作ったアプリを使ってると、特定の発言を引用したいなーと思う事が多く

メッセージ上部に[link to this message]を追加した

f:id:tkm2261:20180705114927p:plain

元々datastoreの仕様上ページングの実装が面倒くさいことになっており、

ページの最初と最後のtimestampでページを表示していたので、表示したいメッセージのタイムスタンプをGETパラメータに渡すだけで実現できました。

便利な機能な割に、簡単に実装できてなにより

作成期間は2日

土日で作り上げましたが、元々Slackのログ仕様は目を通していたのと、

大体の設計が頭にあったので一回の週末だけで作れました。

ただこれは自分で全て決められたからなので、お仕事で受けるなら2~3ヶ月は取ると思います。

企業で開発を内製化したほうが良いのは、この辺りからも見えますね。

プルリク待ってます!

github.com

一番必要なのは検索機能で、GAEのsearch APIで実現しようと思ってます。

もしやってみたい方はプルリクお待ちしております!