この記事はピクシブ株式会社 Advent Calendar 2017の20日目です。
昨日はおしゃれな動画を作るマンであるまつらいの
でした。かっこよくてずるいですね。
こんにちは、Atomです。普段はiOS EngineerとしてSwiftを書いたり、9%チューハイを片手に街を散歩したりしています。
さて、弊社ではesaを利用したポエム駆動開発が活発に行われています。esaは、
esaは「情報を育てる」という視点で作られた 自律的なチームのためのドキュメント共有サービスです。
というサービスで、社内での情報共有を気軽に行うことができます。詳しい利用事例やポエム駆動開発についてはこちらの記事をご参照ください。
esaはとても優れたサービスで、だれでも気軽にポエム、思考、ノウハウなどを共有することができます。弊社では今年1年で1617件の記事が投稿されており、とても活発に利用されていることが分かります。
一方で、記事が多くあるとすべてを読み尽くすのは厳しくなってきます。Twitterやはてなブックマークに加えて、esaの新着記事もすべて読んでいては仕事する時間がなくなってしまいます。
そこで、今熱い記事がわかるyakitoriというWebアプリを作りました。
加えて、社内Slackにも6時間毎に通知するようにしました。
実装
yakitoriはHeroku上に下記3つのアプリケーションを動かすことで構築されています。ちなみに全てRuby製で、無料の範囲でやりくりしています。
- App1: 定期的にesaの全記事取得しスコアを計算してRedisに保存する君
- App2: SinatraでRedisから取得したデータを表示するだけ君
- App3: 定期的にRedisから取得したデータをSlackに投げる君
という構成になっています。マイクロサービシーズっていうやつですね(笑顔)。App2, App3は非常にシンプルな構成なので、キモであるApp1について簡単に解説します。
詳しいコードは https://github.com/FromAtom/Yakitori にあるので、コアの部分だけ解説をします。
time_diff = Time.now - Time.parse(created_at) duration_hour = time_diff / (60 * 60) point = COMMENT_GRAVITY * comments_count + STAR_GRAVITY * stars_count + WATCHERS_GRAVITY * watchers_count score = (point - 1.0) / ((duration_hour + 2.0) ** GRAVITY) # この数値をもとにランキングを作る
このコードで各記事のスコアを計算しています。数式で表すとこのようになります。なお、この計算式はHacker Newsのものを参考にしています。
- t: 投稿からの経過時間[h]
- G: 重み付け係数(1.8ぐらいがちょうどよい)
となっていて、この時のp
は
と設定しています。
esaでは記事に星をつけるスター、記事の更新を通知で受け取るウォッチ、そしてコメントがあり、これらを利用して記事を書いた人にフィードバックを送ることができます。なので、これら3つの数値を重み付け(1.0, 1.2, 0.2の定数がそれ)をしながら記事のスコアとして利用しました。ちなみに、コメントをするとウォッチも自動的にされるので、ウォッチは弱めにしてあります。
そして、投稿からの経過時間(t)が増えていくことで、古い記事のスコアは低くなるようになっています。
やってみて
今までであれば見ることがなかった記事も見るようになり、新着記事を全部みる必要もなくなったのでとても便利になりました。また、普段Swiftばかり書いているので、こういった小さなサービスやツールをRubyでササッと書くのは楽しかったです。(本当はSwiftで書こうと思ったけどRedis周りが面倒でやめた……)
esaはAPIも用意されているので、記事を簡単に取得することができてとても助かります。
最後に
明日はverno3632がAndroidの話をしてくれるようです。楽しみですね!
そしてピクシブ株式会社では、仕事の合間に小さなツールを作るのが好きな人や、焼き鳥が好きなスマートフォンアプリエンジニアを募集しています。焼き鳥が好きではないスマートフォンエンジニアも応募しています。