@nukokusa_bot を支える技術
@nukokusa_bot
●
Twitter Bot
– https://twitter.com/nukokusa_bot
– https://github.com/Joe-noh/nukokusa_bot
●
@sogoru_straybot に次ぐ二代目
●
機能
– ジャンプ買ってこい
– Twitter してないで働け など
言語
●
Scala
– OOP + FP
– Ver. 2.10.0
●
Java → Ruby → JRuby( 実運用せず ) → Scala
– 大学プロキシ越え & Streaming API
– 試してて最初にできたのがジャバだった
– 次があるなら Elixir
ビルド
●
sbt
– http://www.scala-sbt.org
– 依存性解決とか起動とかしてくれる
– Simple Build Tool
●
Simple であるかは甚だ疑問
( 再 ) 起動
●
launch.sh
#!/bin/bash
pid=`ps x | grep -v grep | grep sbt | awk '{ print $1 }'`
kill $pid
sleep 10
nohup sbt run &
お住まい
●
某 VPS
– Ubuntu 64bit
– HDD 50GB
– メモリ 1GB
●
変遷
– 研究室個人 PC → 研究室サーバ → VPS
お世話になっているライブラリ
●
twitter4j
– 鉄板
●
scalatest
– ウニットテスト
●
Holidays
– https://github.com/t2v/holidays
– 祝日判定
お世話になっている API
●
Amazon Product Ads
– 「〇〇が欲しい」→ Amazon 検索
●
今日は何の日
– http://www.mizunotomoaki.com/wikipedia_daytopic_api.html
お世話になっているライブラリ
●
twitter4j
– 鉄板
●
scalatest
– ウニットテスト
●
Holidays
– https://github.com/t2v/holidays
– 祝日判定
スケジューラ
val s1 = new Schedule {
def task = try { ... } catch { ... }
}
s1.wdayRange = Calendar.MONDAY to Calendar.FRIDAY
s1.hourRange = 6 to 6
s1.minRange = 0 to 0
new Scheduler(List[Schedule](s1, s2, ...))
// 1 分間隔で s.isMatch(calendar) == true なヤツを実行
レスポンス
val r1 = new ResponseRule {
def isMatch(status: Status): Boolean = { ... }
def respondTo(status: Status): Unit = { ... }
}
List[ResponseRule](r1, r2, ... )
new UserStreamListener {
def onStatus(status: Status) = { ... }
}
所感
●
改めてソース読むとへたくそ
– あの頃はキレイにできたと思っていた
– s.hourRange = 6 to 6 ふざけすぎ
– 命名シッチャカメッチャカ
●
respondTo ってなんだ
●
己の英語力に見合った名前を付けろ
– WeeklyJUMP とかの責任範囲が微妙
– FP 的な所はどこがへたくそか分かんないくらいへたくそ
所感
●
これホントに自分で書いたのかって印象
– 「あー、こうやって書いたんだっけ」
●
もう一度書くことは不可能
– Scala 忘れた
– まじで
●
設定ファイル3つが全部フォーマット違っててウケた
– Properties, XML, conf
まとめ
●
こんな感じで @nukokusa_bot はできています
●
ライブラリ、 API 提供者に感謝
●
復習とっても大事
– 日々の精進と記憶力の衰えの戦い
– 我々は確実に老化している

@nukokusa_botを支える技術