あざらしとペンギンの問題

主に漫画、数値計算、幾何計算、TCS、一鰭旅、水族館、鰭脚類のことを書きます。

やはり\アッカリーン/しようかな

やはり twitter4j でやるには厳しいものがあることのは感じていたのです。

おかしなこととして、interface StreamListener がなぜか Scala から見えない(なぜかプライベート扱いになっていて、コンパイル時にアクセス権がないと怒られる。interface のくせに。Groovy からは普通に見えるしアクセスもできる)ので、解決のために少しの Java コードを書かなければいけなかったのは、私としては美しくないと思いました。(sbt では Java ファイルも一緒にコンパイルしてくれるので実用上の問題はありませんでしたが。)

ライブラリとしてのより深刻な問題は、ネットワークが切断された場合の挙動です。ストリーム API で接続しているときにそれが起こると、最悪復旧できないのでアプリケーションを再起動する必要が出てくるということでした。連続的な運用を考えると、これは由々しき問題です。

twitter4j が比較的元の Twitter API に忠実で、Java 用のライブラリとして標準的な設計であること(良いとは言わないが妥当ではある)は評価できるのですが、Java 7 で非推奨となった API が使われていたり、media/upload (chunked) をサポートしていなかったりと、既に古くなった印象は否めません。なにしろ最初に作られたのが10年も前、Twitter が日本でそれほど普及していなかった頃です。また、少なくない設計が私の好みでなかったこと(そりゃまぁ Java 用のライブラリなので)もあります。その上で、開発版の更新が半年前から止まっていることを見て、これ以上を望むのは厳しいと思いました。*1

その辺りを考慮すると、Scala でそれらの問題を解決するためには、やはり新しいライブラリを書く必要があるという結論に至らざるを得ないようです。もちろん検索はしてみましたが、わざわざ Scala でそんなことをやろうとしている人はいないようでした。HTTP リクエストを投げてパースするだけならもっと簡単な方法があるので、そんな面倒なことをする必要もないということでしょう。しかし、それではストリームを安全に扱うという要求に対しては不十分です。ないものは作るという精神でいくと、やはりここは自分で作らないといけないと思いました。

現在、bot のタスクマネージャの実装に用いている akka は、アクターモデルの実装を中核として、並行・分散処理を行うための複数のライブラリを提供しています。その中には HTTP タスク処理用のライブラリなども含んでいます。ドキュメントを読んだ限り、SNS や Web クライアント/サーバでの使用が最初から意図されているように思われます。

akka は Scala 本体に含まれてこそいないものの、事実上の標準ライブラリのひとつと考えられます。Scala の並行処理は、元々は akka が提供するようなアクターモデルを並行処理の中核としていて、それが言語の特徴のひとつでもありました。しかし、Scala 本体の Actor 実装は既に非推奨となっていて、akka を使うようにと公式ドキュメントに書いてありました。Scala 自体には並行処理を直接扱う API が少ないのです。Future などはどちらかといえば時間のかかる処理を非同期に行うためのものです。そんなわけで、Scala で並行処理を行うためには、 akka を利用するのが当たり前になっています。なにしろ公式が使えと言っているわけで。

というわけで、書く書く詐欺に終わらなければ、akka を用いた純粋な Scala での Twitter ライブラリを作ることにしました。

名前は、akka にちなんで\アッカリーン/とか、まぁそれでは Twitter との関係性が見えないですが、プロジェクトを作ってから決めます。

*1:ビルド時に mvn のテストに落ちるのでスキップ必須なのはさすがにどうかと