Scala Days 2011に行ってきた(2)
どうも、鹿島和郎(かしまかずお)です。最近ではScalaもいろいろな人からdisられる程度にメジャーになってきたようなので、個人的には嬉しく思います。今回は前回に引き続きScala Days 2011のレポートを書こうと思います。
ところで、今回のイベント中、メモがてら現地からTwitterで実況中継をしていたのですが、それを @hishidama さんが Togetter にまとめてくれました。本原稿を書く際にこのまとめは非常に役に立ちましたので、ここでお礼を述べたいと思います。
今回は予告どおり、Akkaの話を中心に書こうと思います。
■Akka
○並列・分散時代の高機能ライブラリ
今回のScala Daysではconcurrencyというキーワードがかなり強調されていて、それに関連するセッションも多くみられました。Scalaの開発側としては世間で耳目を集める「concurrency」に対する答えとしてScalaを普及させていきたいという考えが見えました。また、Scalaを使う側としてもその部分に注目して使っている人が多いように思えます。
Akkaに関して簡単に説明しますと、AkkaはもともとScalaとJavaで使える汎用ライブラリで、以下のような機能を備えています。
- Actor (含Remote Actor)
- STM (Software Transactional Memory)
- Agent
各機能に関してはAkkaのWebサイトを見ていただきたいのですが、分散環境で必須となる耐障害性、負荷分散が組み込まれた高機能なライブラリとなっています。
前回も少し書いたとおり、Scala界隈では約1カ月前にScalaの開発チームが中心となってTypesafeという会社を立ち上げたというニュースが話題になりましたが、そのTypesafe社にAkkaの開発チームが参加していることから、今後はAkkaの機能がScala本体に取り込まれていくものと思われます。
さて、今回Akka関連のセッションは3つあったのですが、そのうちの2つを見てきました。
○Above the Clouds: Introducing Cloudy Akka
「Cloud」に対応したAkkaの紹介、という感じでしょうか。内容としては最初の10分くらいはAkkaの基本的な機能のうち「分散」に関連するものの説明でした。この辺りはAkkaのサイトにあるドキュメントを読んでいれば知っている事なので、特に目新しいことはありませんでした。
その後Akka 2.0で導入予定の新機能についての紹介があったのですが、こちらはかなり期待できそうな内容でした。
ところで、Actorに関してご存じない方もいらっしゃるかと思いますので、ここで簡単に説明します。Actorとは、他からメッセージを受け取ってそれに応じて処理をする、1つの独立した処理のユニットです。Actorの利用者はActorに対してメッセージを投げ、結果が返ってくるまで待ってもいいですし(同期処理)、非同期で後続の処理に進み結果が返ってきた時点でそれに対する処理を実施する、ということもできます。
Javaで並列処理を書こうとすると、 生のスレッドを直接扱う事が多いかと思いますが(※)、Actorモデルの場合、Actorでの処理は自動的に別スレッドで動くことになり、抽象化のレベルが一段階高くなっています。スレッドを意識しないことにより、簡潔かつ安全な並列処理が書けるようになる事が期待されます。
※その他、EJBで処理を記述してアプリケーションサーバーのスレッドプールで並列化する方法などもありますが。
また、AkkaのRemote Actorは、その名の通りActorを分散環境で実現したものですが、プログラマーはActorがローカルにあるのかリモートにあるのかを全く意識せずに扱うことが出来ます。ノードへのActorの割当て、フェイルオーバー、ロードバランスなども下のレイヤーで行われるようで、プログラマとしては分散処理を行うシステムを従来より楽に作れるようになると思われます。
なお、本稿執筆時点ではScala Days 2011の公式サイトには発表者のスライドやビデオがアップされていないのですが、このセッションのスライドは(本人の?)Dropboxにすべにアップロードされていましたので、リンクを紹介しておきます。
実は、先日Scala勉強会で時間をいただいてこのセッションの紹介をしたのですが、その時に
「Message Driven Bean(MDB)とどう違うのか」
という質問がありました。先ほどの資料を見てみると、Akka 2.0で実現しようとしている機能のうち、Java EEアプリケーションサーバーやその他のミドルウェアで実現している機能と重なる部分が結構あることに気づきます。
複数の選択肢の中からある1つの技術を選択するというのは、色々な要素が絡んできますし知識と経験が求められる所だと思いますが、Akka 2.0に関しては今後もう少し調査して、使いどころを見極めていきたいと考えています。
○The Promising Future of Akka
こちらは前のセッションとは打って変わって、プログラミングに関するもので、"Future"というクラス(正確にはtrait)に関する説明・紹介でした。
FutureはAkkaのActorを使用したプログラミングの際によく出てくるもので、Actorに対してメッセージを投げると(正確には !!! メソッドで投げた場合)Futureクラスのインスタンスが返されます。名前から想像できるとおり、将来Actor側での処理が終わった段階で、Futureクラスには処理結果がセットされます。
これを使用すると、例えば2つのActorに異なるメッセージを投げて、2つの処理が完了した時点で次に進む、というような処理が簡潔に記述できます。(上述のAkkaのドキュメントから例を抜粋します)
// 以下の2行はnon-blockingな処理
val f1 = actor1 !!! msg1 // actor1 に msg1 を投げ、Futureを得る
val f2 = actor2 !!! msg2 // actor2 に msg2 を投げ、Futureを得る
// この時点では actor1, actor2 の処理は終わっていない
// f3 は actor3 にメッセージを投げた結果のFuture
val f3 = for {
a: Int <- f1 // actor1 からの処理結果を a に入れる
b: Int <- f2 // actor2 からの処理結果を b に入れる
// actor1, actor2 の処理が終わった時点でactor3 に a+b を投げる
c: String <- actor3 !!! (a + b)
} yield c
val result = f3.get() // actor3 の処理が終わった時点で、result に結果が入る
※ソース中のコメントは筆者が入れたもの。間違いなどがあればご指摘ください。
ActorやFutureを使用したプログラミングは従来のプログラミングスタイルと異なる部分も多く、これも「パラダイム・シフト」の一つなのだと思います。我々プログラマとしては、そうした変化に付いていかないと仕事が無くなる確率が高くなるので、日々勉強が必要だと感じました。
■その他のセッション
最後に、Akka以外のセッションもいくつか紹介します。
○Rogue: A Type-safe Query Language for MongoDB
ここ1~2年でRDBMSではない新しい形のデータストアが注目されていて、それらはまとめてNoSQLと呼ばれている事はご存知だと思いますが、MongoDBはその中でもドキュメントDBと呼ばれているものの1つです。
MongoDBの主な特徴としてはスキーマレスで、データはJSONを拡張したBSONという形式で保存されます。ただ、「スキーマレス」とは言え実際に使う場合には何らかのモデルクラスを用意して扱う事が殆どですし、データ自体は何らかの構造を持っているはずです。Rogueはそうした構造化されたデータに対して、型安全な形で問い合わせなどを行うためのライブラリ(DSL)です。
Rogueを作ったのはFoursquareの開発チームなのですが、本発表はFoursquareの開発リーダー(細かい肩書きは忘れました)のJorge Ortizさんが行いました。
スライドはSlideShareで既に公開されています。
上述のスライドからの例を引用しますが、以下のようなデータの場合を考えます。
{
"_id" :
{ "oid" : "4ddbd194686148110d5c1ccc" },
"venuename" : "Starbucks",
"mayorid" : 464,
"tags" : ["coffee", "wifi", "snacks"],
"latlng" : [39.0, -74.0]
}
mayoridには整数のみ、venuenameは文字列のみが入って欲しいところです。それに対して、Scala側で以下のようなスキーマを定義する事により、型安全な問い合わせが可能です。
class Venue extends MongoRecord[Venue] {
object _id extends ObjectIdField(this)
object venuename extends StringField(this)
object mayorid extends LongField(this)
object tags extends ListField[String](this)
object latlng extends LatLngField(this)
}
私自身は実際にMongoDB + Rogueは使ったことないのですが、Rogueのコードサンプルを見る限りでは非常に使いやすいライブラリのようですし、他の言語でのコードと見比べても型安全かつ分かりやすいという点で、他の選択肢に引けを取らないように見えました。MongoDBの使用を検討している場合にはScala + Rogueは選択肢に含めてもいいと思います。
また、MongoDBは日本のコミュニティも積極的に活動しているようです。何かあったときに誰かに聞けるというのはある技術を選ぶ際の大きな要素ですので、Scala + MongoDB + Rogueという組み合わせは今後注目していきたいと思います。
○Node.scala - Implementing Scalable Async IO using Delimited Continuations
ここ最近各所で話題になっているnode.jsですが、Scalaで似たような事をやってみました、という発表。
非同期I/O+イベントドリブンというのはnode.jsと一緒ですが、それにScalaの限定継続を組み合わせることにより、node.jsのような機能を見通しがよいコードで実装できるという内容でした。
本プログラムはまだ実験段階のようですが、Scalaという言語自体の潜在能力の高さを証明していると思います。
○Porting my own programming language Onion's code from Java to Scala
日本人唯一の発表者である水島さんの発表。彼が作ったオリジナルのプログラミング言語であるOnionをJavaからScalaに移植する際に発生した問題点や解決方法について発表しました。
Onionは型推論を備えた静的型付け言語で、Javaのバイトコードにコンパイルされるとの事で、Scalaと似た面が多いとも言えます。ソースはこちらで公開されています。
同時間帯に行われていた別のセッションが注目を集めるような内容だったため、残念ながら聴きに来た方は少なかったのですが、このようなプログラミング言語を作ることは、プログラミング言語、JVMの仕様についての高度な理解がないと難しいですし、研究としては面白い内容だと思いました。
ただ、水島さん本人も仰っていたとおり、昨年に比べて今回のScala Days 2011は実用的な側面に焦点を当てたセッションが多く、参加者の多くもそうしたものを期待していましたので、研究寄りのセッションの発表者にとっては若干厳しかったようです。
○Managing Binary Compatability in Scala
1日目のKeynoteでもScalaのバージョン間でのバイナリ非互換についての話があり、バイトコードの非互換を検知してそれを書き換える事によって互換性を持たせると言っていたのですが、2日目のこのセッションではそれを実現させるための具体的な方法に関して説明があったようです。
私は本セッションは聞いていないので、後日公開される予定のビデオを楽しみに待とうと思います。
■2日間の感想
○Scalaを「どのように使うか」という段階に入っている
いくつかのセッションの所でも述べた通り、海外ではScalaを単に使うだけでなく、「どのように使うか」、「他の技術に対するアドバンテージはどうか」と言った話が話題の中心であり、日本より少し先を行っているという印象を受けました。
日本でも徐々にScalaの適用事例が出ているようですが、今後さらに事例が出て来る事を期待すると共に、そうした情報を積極的に公開していってもらえればと思います。よく例に出されるFoursqureは、Scalaを使った開発を行って事例を随時公開すると共に、前述のRogueのようなオープンソースソフトも公開してコミュニティに貢献していますが、そういった面も期待したいです。
私自身の話をしますと、Scalaは実験的なプロジェクトでしか使っていないので、今後は実際のプロジェクトに適用していき、成果をコミュニティにフィードバックできるようになりたいと考えています。
○Scala, Akkaは要注目の技術
昨年のScala Daysと異なり、「実用的」な点を強調したセッションが多かったと書きましたが、サーバーサイドを中心にScalaは一気にブレークしたという印象があります。初日のKeynoteでOdersky博士も触れていた通り、Scala関連の書籍がここ1年で随分増えてきており、日本語の書籍だけでも10冊近く出ています。
Scala関連の求人はまだまだ少ないですが、ここ最近は順調に伸びているようですし、今後も注目していきたいと思います。
そうした賑わいを見せるScala関連の中でも、とりわけAkkaは注目に値すると思います。上の方でも触れたとおり、Typesafe社のリソースの約半分をAkkaに投入しているそうですが、並列・分散に対するニーズの高まりの中、Akkaに対する期待は高まっているようです。
実際、Scala Days 2011でのAkkaに関するセッションは部屋がほぼ満員になってました。また、上で少し触れたScala勉強会 in 秋葉原でも、Akkaに関して興味を持っている方が多いようでした。
○日本ではあまり話題になっていない技術に触れられた
具体的にこれ、という名前は挙げませんが、日本では殆ど注目されていない技術をいくつか知ることが出来たのも良かったです。恐らく、日本にいても色々アンテナを張っていればそうした情報に触れられたのかもしれませんが、日本のトレンドと海外のトレンドが違うことが往々にしてありますので、たまに海外の状況を見に行くというのはなかなか有意義だと思います。
■まとめ
Scala、アツいです。日本でも海外でも。
Scalaは日本のコミュニティもそこそこ活発なので、まだ試していない方は是非体験してみて下さい。日本の各所で勉強会が実施されてますので、都合が付けば参加してみてはどうでしょうか。知ってる範囲(※1)で以下にいくつか紹介します。
- Scala勉強会in渋谷(&秋葉原):Scalaが絡めば何でもありの勉強会。私はほぼ毎週参加してます。
- Scala本読書会:関Javaというアイドルプログラマーの方達が始められた勉強会で、関西で月一程度で実施していくようです。@IT仲間の粕谷さんも参加しています。
- 名古屋Scala勉強会:日本の関数型言語のメッカ(※2)である名古屋で頻繁に開催されている勉強会です。
- 天領倉敷Scala勉強会:岡山で開催されている勉強会。大都市以外の勉強会は「人が集まりにくい」という共通の悩みがあると想像されますが、定期的に開催されているようです。
- Scala勉強会 横浜:月1程度で実施のようです。
- Scala勉強会@東北 (現在お休み中):2008年から毎週圧倒的な質で実施されているオンライン勉強会。毎週欠かさずあの質の高さを保つのはスゴいの一言。東日本大震災の影響で現在はお休み中ですが、復活が待たれます。
それではまた。
※1 ここに載っていない勉強会の関係者の方、私が知らないだけなんですみません。
※2 どういう経緯でメッカになったのかはよく知りません。