IBMにて2008年2月より毎月開催されている勉強会「IBM Japan Geeks」。40名以上の“Geek”が登録しているというこの会では、さまざまな言語や最新技術をディープに情報交換しています。そこで CodeZineがこの勉強会に参加し、これまで発表のあったもののうち、反響のあった4編をバージョンアップして再現していただきました。この会の模様を2回に分けてレポートします。
IBM Japan Geeksとは
まず、「IBM Japan Geeks」(Geeks)発足の経緯から現在までの活動内容について、伊尾木氏から発表がありました。Geeks発足のきっかけは、2007年に社内で開催された「ITLMC RoR(Ruby on Rails)勉強会」だったと言います。この勉強会には”とがった”人がたくさん集まっており、このまま別れていくのももったいないということで、Geeksが発足しました。
現在、40名以上が登録しているGeeksは、「主にプログラミング言語を中心とした最新技術動向の情報交換を行うための社内コミュニティ」として、定期的に勉強会を開催しています。社内にもすごい人たちがたくさんいることを知り、その人たちとコミュニケーションを取れる場として気楽に参加できることを旨とし、メンバーがおもしろいと思うことを発表しています。
Geeksは2008年2月のキックオフミーティングで活動方針が決定され、以降毎月1回、さまざまなテーマが発表されています。リモート参加を含めて参加人数は安定しており、参加者は仕事内容にとらわれることなく積極的に発表を行い、発表内容への興味も高まっています。今後の目標としては、外部講師を招くことや、メンバー同士のコミュニケーションを深くすること、さらに女性も含めメンバーを増やすために、社内で役立つものや簡単なものも取り上げることなどを挙げています。
今回は、これまでに開催されたGeeks定例会から、反響の多かった「Scala:宮本氏」「Android:小山氏」「Google基盤について:根本氏」「オブジェクト指向とカリー化:津田氏」の4編を再現していただきました。これらの内容を2回にわけてお送りします。
Scala入門
最初に登場したGeekは宮本隆志氏。「Scala入門」と題し、プログラミング言語Scala(スカラ)について発表した。
Scalaとは
Scalaは、スイスのローザンヌ工科大学のMartin Odersky教授によって設計されたJavaプラットフォーム(Java仮想マシン)上で動作する言語。
冒頭で宮本氏は、JavaプログラマのDavid Rupp氏のScalaに対する言葉“The Next Next Java!”を紹介した。Javaの次の言語として、RubyやErlangが挙げられるが、Rupp氏はScalaについてさらにその次の言語であると評していて、最近注目を集め始めている。
Scalaの設計者であるMartin Odersky氏は、スケーラビリティのある言語(Scalable Language)を目指し、冒頭の文字をとって「Scala」とした。スケーラビリティを実現するには、関数型言語であり、かつオブジェクト指向の概念を持つ必要があると言っている。なお、Odersky氏は今後10年はScalaの開発を続けるとしている。
Scalaの特徴
ScalaはJVM上で動作するため、Javaのライブラリを利用でき、またJavaからScalaを呼び出すことも可能。Javaバイトコードでコンパイルするので、Javaと同程度の速度が出るといったメリットがあるが、Erasureで型情報が消える場合もあるなどの短所もあるという。
関数型言語であり、オブジェクト型の言語であるため、静的型、推論型、無名関数、代数データ型、パターンマッチ、遅延評価などが利用でき、すべてがオブジェクトである特徴も持つ。また、DSL(Domain Specific Language)向けの構文規則を持ち、暗黙の型変換を定義すると、既存クラスの拡張のような振る舞いが可能である。
新しい言語であるため、文法なども未整理で、便利な記法があるにもかかわらず、ドキュメント化が追いついていないという状況もあるという。宮本氏は、“実務レベルの安定性”と“ワクワク感”は相反するので、「逆に発展途上なのがいい」と受け止めているとした。
Scalaの用途としては、もともとの型理論などの研究目的のほか、“Better Java”とも言われているとおり、Javaの代わりに使われることも多くなってきたという。またDSLやフレームワーク作成についても表現力ではScalaの方があるが、逆にLL(Lightweight Language)的な1行スクリプトはコンパイルが必要なため向いていないともした。現状では、何のための言語かは定まっていないが、宮本氏は、JVM上の関数型言語としてとらえているという。
Scalaの開発環境と開発サンプル
Scalaのインストールは、サイトからダウンロードして行う。JDK 1.4以上が必要で、JDK 1.5推奨とされている。
Windows環境では、『IzPack Java Installer』やEclipseのPlug-in使用もおすすめだという。
開発環境の説明の後は、宮本氏はいくつかのコードを解説した。まずはHelloWorld。クラスではなくオブジェクトで始まっているなどの違いはあるが「Javaを知っている人なら、すぐに理解できるのでは?」とした。続いてJavaからScalaを呼び出す方法、関数型のようなプログラム方法、パターンマッチングで場合分けを簡潔に記述できるCase Classの使用、実装も書けるインターフェイスのTrait(RubyのMix-inのようなもの)を解説した。
さらにScalaの一番の特徴である暗黙の型変換を行うImplicit Conversion
を紹介した。JavaではBooleanにifTrue
メソッドを追加できないが、Scalaの場合は、RichiBoolean
というクラスを使ってそこにifTrue
メソッドを作って既存クラスにメソッドを追加したような振る舞いをするコードができるという。
このほか、nullに対するdefaultを与える『Elvis Operator』(Implicit Conversionの応用例)やFizzBuzz(1から順に数を数え、3で割り切れるなら数字の代わりにFizz、5で割り切れるならBuzz、3でも5でも割り切れる場合は、FizzBuzzという世界のナベアツのギャグのようなゲーム)をExtractorで記述する方法、パッケージ管理システムの『Scala Bazaars』、テストフレームワークの『Scalacheck』などを解説した。
もっとScalaを知るには
トップバッターからいきなりスケーラブルな発表であったが、宮本氏は、今回紹介しなかった遅延評価、for記法、XML処理構文、Web frameworkなどについて機会があれば解説したいとして発表を締めくくった。なお、宮本氏おすすめの中級者向け資料は次のとおり。
- Rainy Day Codings
- Inforno
- Ryugateの日記
- Scala Wiki : さまざまな例とかあり
- Scala-sandbox-docs
- Scala for Java programmers(構文の対照表)
- Code commit
Android
宮本氏の次に登場したGeekは、小山圭氏。Google社が提供する携帯電話向けのプラットフォーム『Android』のプログラミングについて発表した。
Androidの特徴
Androidは、OSではなくプラットフォームであり、周知のようにGoogleが主催するOpen Handset AllianceにはドコモやKDDIが参加し、Willcomは試験機を公開している。Linux部分はGPLにて公開済みで、その他を含んだ正式版は、実機公開後にすべてApache 2.0にてリリースする予定とのこと。
小山氏がAndroidに興味を持ったのは、Java SE(Java Platform, Standard Edition)に対応しているからだという。これは、既存の携帯端末向けのJava ME(Java Platform, Micro Edition)が、Java SEと互換していなかったり、Doja、IMP、MIDPなど、多種多様なプロファイルが乱立していて分かりにくいという背景があるからだ。
AndroidはJava SE 5に対応しており、基底のクラスはすべて同じで、annotationやgenerics、enumも使える。XPathなどの一部のクラスが含まれないものの、apacheのHTTP Client等も標準装備しているので、開発における生産性が全然違うという。
AndroidのSDKは、Googleのサイトからダウンロードできる。Eclipseプラグインによる開発が推奨されているが、CUIでも開発が可能だ(SDKの場所をプラグインに設定する必要がある)。
Androidアプリケーションの4つの構成要素
開発にあたり、Androidアプリケーションの4つの構成要素を理解する必要があるとし、「Activity」「Intent」「Service」「Content Provider」のそれぞれの要素を順に解説した。
Activity
Activityとは、画面(UI)を持つアプリの基本構成要素で、Javaで言うアプレットのようなもの。携帯の壁紙を設定するなどのたくさんの機能があらかじめ用意されている。またActivityのライフサイクルはシステムが管理するようになっている。これは、電話の受信やアラームのオン、アラートなどを割り込ませる必要があるためだ。加えて、バッテリーを重要視した設計を行っているため、大切な情報はコールバックにて退避できるようにする必要もあるとした。
小山氏は、ここでHello World!を表示するサンプルコードを提示した。しかし、Hello World!の文字列はどこにも見当たらない。Androidアプリケーションのディレクトリ構造は固定となっており、src配下にあるR.javaは自動的に作成される、識別子の集合を持つクラスだ。プログラムのリソースは「res」ディレクトリ内にあり、ここにはさらにActivityの画面設計を担当する「layout」、イメージなどが置かれる「drawable」、可読リソースやメッセージなどを格納する「values」がある。
先に挙げたHello World!の文字列は「layout」にあるxmlファイルにて設定していたことになる。これらのリソースファイルやXMLファイルのタグは、自動生成クラスのR.javaから直接参照できるようになっている。なお、「AndroidManifest.xml」は、アプリケーション名やアイコンの登録、セキュリティ上の許可を記述するファイルだが、最初は自動的に生成される。
着信などの割り込み処理に対応するため、Activityのライフサイクルには注意が必要であると説明した。このうちアプリ(再)スタート地点である「onCreate」、アプリが画面から消える時に呼ばれ必要なデータを保存する「onPause」、Activityが殺される前に状態保存を行うために呼ばれる「onSaveInstanceState」が大切だとした。Activityについてはこのほか、Layout(コンテナ)とView(コンポーネント)の関係や、Animationなどについて解説を行った。
Intent
第二の構成要素であるIntentとは、Activity間の(非)同期通信パラメータのこと。Activityは通常1画面のため、次の画面に移るときは別のActivityを実行する必要がある。Intentには実行ActivityのClassインスタンス、またはアクションとURIの指定を行い、実行先Activityへのパラメータを保持できるとした。ここで小山氏は、Intentの使用例としてURLを指定したWebサイトの閲覧やGoogleマップの表示デモを行った。
Service
第三の構成要素Serviceは、画面がなく独立した常駐型プロセスのこと。Inter Poccess Communicationという分散オブジェクト指向により異なるプロセスのオブジェクト間でメソッド呼出が直接実行できるよう設計されているとした。
Content Provider
最後の構成要素Content Providerは、システムデータストレージへのアクセスを提供するもの。電話帳やSDカード内のMP3ファイルなどのデータはすべてデータベースで管理しており、これらのデータにURI形式でアクセスできるようになっている。
Androidのサンプルアプリケーション
と、ここまで解説を行った時点で発表の制限時間を超えてしまった小山氏。しかし、残り時間を少々延長し、発表の1時間前に完成したばかりというアプリケーションのデモを披露した。発表したアプリケーションは、これまで解説したServiceやContent Providerといった特徴をおさえたMP3プレイヤーで、SDカード内のMP3ファイルを再生するというもの。
Androidでは、SDカードが挿入されたことを確認すると、MediaScannerというプログラムが自動的に起動し、すべてDBに自動的に登録する。プログラマは、Content Providerを用意してアクセスするだけでよい。他のプラットフォームであればこうした処理はデータの種類ごとにアクセス方法が異なるが、URIの種類と使い方さえ覚えれば、どんなデータも同じように扱えることが素晴らしいと説明した。
デモでは無事にMP3ファイルの楽曲を再生できた。Serviceとして実行しているので、Activityを閉じてほかの画面になっても演奏を続けていた。ほかにもServiceサービス実行中であることを明示したり、Serviceの一覧を表示したりできるNotification機能も実装していた。
作り手も楽しめる携帯プラットフォーム「Android」
途中何度も伊尾木氏から発表時間超過のアラートに割り込まれながらも、その都度コールバックしてデモのプログラムまで発表した小山氏。Androidは非常に高レベルな携帯プラットフォームであるとし、「作っていて楽しいので、実機が出る前に試しておいても損はないです」と太鼓判をおしてプレゼンを終了した。
次回
各プレゼンターの熱い思いが伝わる「IBM Japan Geeks」。後半では、根本和郎氏による「Google基盤について」と津田嘉孝氏による「オブジェクト指向とカリー化」のプレゼンの模様を紹介します。