携帯電話に Scala を活用する

Android、Scala、そして Eclipse を利用してモバイル・アプリケーションを作成する

Android オペレーティング・システムは、モバイル・アプリケーションを開発するための強力なオープンソースのプラットフォームです。Android は Java™ プログラミング言語と Eclipse ツール・プラットフォームの強力さを活用しています。その組み合わせの中に、今度は Scala プログラミング言語を追加することができます。この記事では、Android での基本的な開発言語として Scala を使用する方法を説明します。Android で Scala を使用すると、より表現力豊かでありながらタイプ・セーフでもあるプログラミング言語を使ってモバイル・アプリケーションを作成することができます。

Michael Galpin, Software architect, eBay

Michael_GalpinMichael Galpin は eBay のアーキテクトであり、developerWorks に頻繁に寄稿しています。彼は JavaOne、EclipseCon、AjaxWorld など、さまざまな技術カンファレンスで講演を行っています。彼が現在取り組んでいることを知るには、Twitter で @michaelg をフォローしてください。



2009年 6月 30日

前提条件

この記事では任意の Android 機器上で実行するモバイル・アプリケーションを作成します。そのためには Android SDK をインストールする必要があります。ここでは Android V1.5 SDK を使用しました。この記事で作成するアプリケーションのコードは Scala プログラミング言語で書かれています。今まで Scala を見たことがない方でも、Scala コードについては説明するので問題ありません。ただし Scala に馴染みがないとしても、少なくとも Java 言語を理解していることが推奨条件です。この記事のコードの作成には Scala V2.7.5 を使用しました。Android と Scala に関しては優れた Eclipse プラグインがあります。ここでは Eclipse V3.4.2、ADT (Android Development Tools) V0.9.1、そして Scala IDE プラグインの V2.7.5 を使用しました。これらのツールに関しては「参考文献」を参照してください。


セットアップ

Android アプリケーションの作成と聞くと、厄介な話のように思えるかもしれません。Android アプリケーションは、Dalvik 仮想マシンという独自の仮想マシンの内部で実行されます。ただし Android アプリケーションはさまざまな方法でビルドすることができます。この記事で使用する基本的なビルド手法は下記のとおりです。

図 1. Android で Scala をビルドする手法
Android で Scala をビルドする手法

考え方としては、最初にすべての Scala コードを Java クラス・ファイルにコンパイルします。これは Scala コンパイラーが行うことなので、あまり複雑なことはありません。次に、Android の dex コンパイラーを使って、これらの Java クラス・ファイルを Android 機器上の Dalvik VM で使われるフォーマットにコンパイルします。これは dexing と呼ばれ、Android アプリケーションでは通常のコンパイル手法です。通常は、.java ファイル群を .class ファイル群にし、さらにその .class ファイル群を 1 つの .dex ファイルにします。この記事でこれと唯一異なるのは、.scala ファイル群から始まる点です。最後に、.dex ファイルと他のアプリケーション・リソースは APK ファイルとして zip され、その APK ファイルを Android 機器にインストールします。

では、こうしたことをどのようにして実現すればよいのでしょう。面倒な作業の大部分は Eclipse が処理してくれますが、注意が必要なステップが 1 つあります。それは、この記事のコードを実行するためには、標準の Scala ライブラリーのコードも必要であるということです。典型的な Scala のインストールの場合、そのライブラリーは /lib/scala-library.jar の中にある 1 つの JAR です。しかしこの JAR には、Android でサポートされていないコードも一部含まれています。一部のコードには少し調整が必要であり、また一部のコードは削除する必要があります。ここではとりあえず、scala-library.jar をカスタム・ビルドする方法が最も適切です。ここで利用したカスタム・ビルドについては「参考文献」を参照してください。ここではこの JAR を、Android ライブラリー JAR と呼ぶことにします。

この JAR が用意できると、他の部分は非常に簡単です。あとは Eclipse 用の ADT プラグインを使って Android プロジェクトを作成すればよいだけです。次に、このプロジェクトに Scala の性質を追加します。そして標準の Scala ライブラリーを上記の Android ライブラリーと置き換えます。最後に、出力ディレクトリーをクラスパスに追加します。これで準備完了です。この手順は Scala のメイン・サイトで詳細に説明されています (「参考文献」を参照)。これで基本的なセットアップができたので、これから作成する、Scala を使った Android アプリケーションを調べることにしましょう。


UnitsConverter

Android 機器上で実行されるバイナリー・フォーマットに Scala コードを変換する方法は理解できたので、今度は Scala を使ってモバイル・アプリケーションを作成します。ここで作成するアプリケーションは簡単な単位変換アプリケーションです。このアプリケーションを使うと、英国単位からメートル法単位に、あるいはその逆に、容易に変換することができます。これは非常に単純なアプリケーションですが、最も単純なアプリケーションの場合でさえ Scala を使うとメリットがあるのです。まず、UnitsConverter のレイアウト要素を調べてみましょう。

レイアウトを作成する

携帯電話上で実行する Scala を作成する、と聞くとワクワクする人もいるかもしれませんが、モバイル・アプリケーション開発のコーディングをすべて Scala (あるいは Java ) 言語で行うわけではありません。Android SDK には、ユーザー・インターフェース・コードとアプリケーション・ロジックとを XML ベースのレイアウト・システムを使って分離する便利な方法が用意されています。このアプリケーションのメインのレイアウト・ファイルを見てみましょう (リスト 1)。

リスト 1. Converter アプリケーションのメイン・レイアウト
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    android:gravity="center_horizontal" android:padding="10px"
    >
    <TextView android:id="@+id/prompt_label" android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:text="@string/prompt_metric"/>
    <EditText android:id="@+id/amount" android:layout_below="@id/prompt_label"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"/>
    <TextView android:id="@+id/uom_label"  
        android:layout_below="@id/amount"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:text="@string/uom"/>
    <Spinner android:id="@+id/uom_value"
        android:layout_below="@id/uom_label"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <Button android:id="@+id/convert_button"
        android:layout_below="@id/uom_value"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/convert_button_label"/>
    <TextView android:id="@+id/result_value"
        android:layout_below="@id/convert_button"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"/>        
</RelativeLayout>

上記のコードによって、このアプリケーションのメインの UI が非常に簡潔に作成されています。この UI のルート・ノードは RelativeLayout というコンテナー要素です。Android SDK にはレイアウトに関するオプションがたくさんあります。RelativeLayout は単純に、さまざまな UI ウィジェットを相対配置でレイアウトするようにランタイムに指示します。相対配置を使うために、目に見える要素 (この場合は TextView 要素) を追加します。TextView はテキストを表示するための単純な要素です。TextView 要素には prompt_label という ID が割り当てられています。この ID は、次の要素である EditText 要素 (テキスト入力ボックス) に使われます。この要素には layout_below 属性があり、この属性の値は prompt_label という ID と同じです。つまり、EditTextprompt_label という要素の下に配置する必要があります。

それ以外のレイアウト・コードは非常に単純です。全体をまとめて言えば、ラベルの付いたテキスト入力ボックスがあり、ラベルの付いたスピナー (コンボ・ボックスまたはドロップダウン) があり、1 つのボタンがあり、そして出力用に別のテキスト領域があります。図 2 はこのアプリケーションが実行されている様子を示しており、各要素を明示してあります。

図 2. Android のレイアウトの詳細
Android のレイアウトの詳細

では、上で表示されている、さまざまなテキスト値はどこから来るのでしょう。リスト 1 のいくつかの要素に text 属性があることに注目してください。例えば、prompt_label 要素には @string/prompt_metric という値を持つ text 属性があります。これは、Android アプリケーションの標準リソース・ファイルの 1 つ、strings.xml ファイルを使っているということです (リスト 2)。

リスト 2. strings.xml リソース
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="prompt_metric">Enter amount (KM, g, L, C)</string>
    <string name="prompt_english">Enter amount (miles, lbs, gallons, 
F)</string>
    <string name="uom">Units of Measure</string>
    <string name="convert_button_label">Convert</string>
    <string name="app_name">Converter</string>
    <string name="english_units">English</string>
    <string name="metric_units">Metric</string>
</resources>

これで、図 2 に表示されたテキストがどこから来るのかがわかりました。スピナーには、使用可能な測定単位のドロップダウンがあり、これらの単位はリスト 2 の中にはなく、arrays.xml という別のファイルの中にあります (リスト 3)。

リスト 3. arrays.xml リソース
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <array name="english_units">
        <item>Fahrenheit</item>
        <item>Pounds</item>
        <item>Ounces</item>
        <item>Fluid Ounces</item>
        <item>Gallons</item>
        <item>Miles</item>
        <item>Inches</item>
    </array>
    <array name="metric_units">
        <item>Celsius</item>
        <item>Kilograms</item>
        <item>Grams</item>
        <item>Millileters</item>
        <item>Liters</item>
        <item>Kilometers</item>
        <item>Centimeters</item>
    </array>    
</resources>

これで、スピナーに使われる値がわかりました。これらの値はスピナーで実際にどのように利用され、またアプリケーションは英国単位とメートル法単位とをどのように切り換えるのでしょう。その答えを知るためには、アプリケーションのコードそのものを調べる必要があります。


Scala アプリケーションのコード

この Converter アプリケーションのコードは、(どのような言語を使用した場合も) 非常に単純です。もちろん、Java 言語でも比較的容易にこのコードを作成できますが、Scala を使ったほうが Java を使うよりも単純になります。実際、これから説明するように、Scala を使うと多くのことが非常に単純になるのです。まず、これまで検証してきた UI のコードを調べてみましょう。

ビューのコード

UI の作成を支援する Scala コードを説明する最も容易な方法は、実際にそのコードを詳細に調べてみることです。どのようなアプリケーションの場合も、そのアプリケーションのデフォルトのアクティビティーは、AndroidManifest.xml ファイルの中で定義されます。すべての UI には、それを支える Activity クラスがあります。また、アプリケーションが最初にロードされたときに実行される Activity クラスは、デフォルトの Activity によって定義されます。この記事のアプリケーションのように単純な場合には、デフォルトのアクティビティー以外は必要ありません。このアプリケーションの場合には Converter というクラスが用意されています。このクラスのソース・コードをリスト 4 に示します。

リスト 4. Converter アクティビティー・クラス
class Converter extends Activity{
    import ConverterHelper._
    private[this] var amountValue:EditText = null
    private[this] var uom:Spinner= null
    private[this] var convertButton:Button = null
    private[this] var resultValue:TextView = null
    
    override def onCreate(savedInstanceState:Bundle){
      super.onCreate(savedInstanceState)
      setContentView(R.layout.main)
      uom = findViewById(R.id.uom_value).asInstanceOf[Spinner]
      this.setUomChoice(ENGLISH)
      amountValue = findViewById(R.id.amount).asInstanceOf[EditText]
      convertButton = findViewById(R.id.convert_button).asInstanceOf[Button]
      resultValue = findViewById(R.id.result_value).asInstanceOf[TextView]
      convertButton.setOnClickListener( () => {
          val unit = uom.getSelectedItem.asInstanceOf[String]
          val amount = parseDouble(amountValue.getText.toString)
          val result = UnitsConverter.convert(Measurement(unit,amount))
          resultValue.setText(result)
      })
    }
    override def onCreateOptionsMenu(menu:Menu) = {
      super.onCreateOptionsMenu(menu)
      menu.add(NONE, 0, 0, R.string.english_units)
      menu.add(NONE, 1, 1, R.string.metric_units)
      true
    }
    override def onMenuItemSelected(featureId:Int, item:MenuItem) = {
      super.onMenuItemSelected(featureId, item)
      setUomChoice(if (item.getItemId == 1) METRIC else ENGLISH)
      true
    }
    private 
    def setUomChoice(unitOfMeasure:UnitsSystem){
      if (uom == null){
        uom = findViewById(R.id.uom_value).asInstanceOf[Spinner]
      }
      val arrayId = unitOfMeasure match {
        case METRIC => R.array.metric_units
        case _ => R.array.english_units
      }
      val units = new ArrayAdapter[String](this, R.layout.spinner_view, 
        getResources.getStringArray(arrayId))
      uom.setAdapter(units)      
    }
}

まず、このクラスの先頭から見て行きましょう。このクラスは android.app.Activity を継承しています。android.app.Activity は Java クラスですが、Scala から Java クラスをサブクラス化することは容易です。次に、このクラスにはいくつかのインスタンス変数があります。これらの各インスタンス変数は、先ほど定義した UI 要素に対応します。各インスタンス変数のスコープが private[this] でもあることに注目してください。これは Scala で利用可能なアクセス制御のレベルを示しており、Java 言語にはないものです。これらの変数は単に private であるだけではなく、Converter クラスの特定のインスタンスに対しても private です。このレベルのアクセス制御はモバイル・アプリケーションには過剰かもしれませんが、皆さんが Scala 開発者であれば、これまで使い慣れてきた構文がすべて Android アプリケーションでもそのまま利用できることは心強いはずです。

リスト 4 のコードに戻り、onCreate メソッドをオーバーライドしていることに注目してください。これは Activity クラスの中で定義されるメソッドであり、通常は任意のカスタム Activity によってオーバーライドされます。このコードを Java 言語で作成した場合には、@Override アノテーションを追加する必要があります。Scala では override はキーワードであり、これがないと正しいコードになりません。こうすることで、メソッド名のタイプミスなどの一般的な誤りを防ぐことができます。タイプミスをすると、Scala コンパイラーはそのタイプミスを検出し、エラーを生成します。このメソッドに対しても、他のメソッドの場合と同様に、戻り型を宣言する必要がないことに注目してください。Scala のコンパイラーは戻り型の情報を容易に推論できるため、戻り型を宣言して冗長にする必要はありません。

onCreate のコードの大部分は Java 言語で作成された場合のコードと似ていますが、いくつか興味深い部分があります。(スーパークラス Activity の中で定義される) findViewById というメソッドを使って、さまざまな UI 要素を操作していることに注目してください。このメソッドはタイプ・セーフではないため、キャストが必要です。Scala で型キャストするためには、パラメーター化されたメソッド asInstanceOf[T] を使います (T はキャスト後の型です)。このキャストは機能的には Java 言語の場合と同じであり、Scala の構文の方がスマートであるにすぎません。次に、setUomChoice を呼び出していることに注目してください (このメソッドについては、このすぐ後に詳しく説明します)。最後に、レイアウト XML の中で作成したボタンを操作し、クリック・イベント・ハンドラーを追加していることに注目してください。

これを Java 言語で作成したとすると、Android インターフェース OnClickListener の実装を渡す必要があります。このインターフェースは onClick という 1 つのメソッドを定義します。実際はこのメソッドのみが関心対象なのですが、Java 言語にはメソッドを直接渡す方法がありません。Scala の場合には、そんなことはなく、メソッド・リテラルつまりクロージャーを渡すことができます。ここでは、() => { ... } という構文を使うことでクロージャーを表現しています (メソッド本体は中括弧の中身です)。開き/閉じ括弧は引数なしの関数を表現しています。ただしここでは、このクロージャーを、(Android SDK の中で定義される Java クラスである) Button のインスタンスの setOnClickListener メソッドに渡しています。どのようにして Scala のクロージャーを Java API に渡すのでしょう。それを調べることにします。


Android での関数型プログラミング

Android API で関数型リテラルを処理する方法を理解するために、Converter クラスの定義の最初の行を見てみましょう。最初の行にあるのは import 文です。これも、Scala の優れた特徴の 1 つです。パッケージ、クラス、等々をコードの任意の場所にインポートすることができ、しかもインポートしたところがそれらのスコープとして設定されるのです。この場合には、すべてのものを ConverterHelper からインポートしています。ConverterHelper のコードをリスト 5 に示します。

リスト 5. ConverterHelper
object ConverterHelper{
  import android.view.View.OnClickListener
  implicit def funcToClicker(f:View => Unit):OnClickListener = 
    new OnClickListener(){ def onClick(v:View)=f.apply(v)}
  implicit def funcToClicker0(f:() => Unit):OnClickListener = 
    new OnClickListener() { def onClick(v:View)=f.apply}
}

この ConverterHelper はクラス宣言の代わりにオブジェクト宣言を使っているので、Scala のシングルトンです。このシングルトン・パターンは直接 Scala に適用され、Java 言語の場合ならば静的なメソッドや変数を使う、すべての場所に使われます。この場合には、このシングルトンは単純に funcToClickerfuncToClicker0 という関数のペアを保持します。これらの関数は入力パラメーターに関数を取り、Android SDK で定義されるインターフェースである、OnClickListener のインスタンスを返します。例えば、funcToClickerf という関数を引数に取ると定義されています。関数 f は (Android の別のクラスである) View 型の入力パラメーターを 1 つ取る関数型であり、Scala では void に相当する Unit を返します。次に関数 funcToClickerOnClickListener の実装を返します (この実装では、単純に入力関数 fView パラメーターに適用することで、OnClickListener インターフェースの onClick メソッドが実装されています)。もう一方の関数、funcToClick0 も同じことをしますが、入力パラメーターのない関数を引数に取ります。

この 2 つの関数 (funcToClickerfuncToClicker0) は、どちらも implicit と定義されています。これは Scala の便利な機能です。こうしておくと、型はコンパイラーによって暗黙的に別の型に変換されます。この場合には、コンパイラーが Converter クラスの onCreate メソッドを解析すると、コンパイラーは setOnClickListener の呼び出しを検出します。これは OnClickListener のインスタンスを要求するメソッドです。ところがコンパイラーは OnClickListener のインスタンスがない場合は、代わりにある関数を検出します。つまりコンパイラーは OnClickListener が無いためにコンパイルに失敗することになる前に、OnClickListener に変換できる暗黙的な関数がスコープ内にないかどうかをチェックするのです。ここではそうした関数が実際に存在するため、コンパイラーはその関数を OnClickListener に変換し、すべてがうまく行きます。これで Android でのクロージャーの使い方を理解できたので、アプリケーションのロジックを調べることにしましょう。特に、単位の変換計算がどのように実行されるのかを調べてみましょう。

単位の変換と計算

リスト 4 に戻りましょう。onClickListener に渡された関数は、ユーザーが入力した測定単位と値を取得します。この関数は次に、Measurement インスタンスを作成し、これを UnitsConverter というオブジェクトに渡します。これらのエンティティーのコードをリスト 6 に示します。

リスト 6. MeasurementUnitsConverter
case class Measurement(uom:String, amount:Double)

object UnitsConverter{
      // constants
    val lbToKg = 0.45359237D
      val ozToG = 28.3495231
      val fOzToMl = 29.5735296
      val galToL = 3.78541178
      val milesToKm = 1.609344
      val inchToCm = 2.54  
   
      def convert (measure:Measurement)= measure.uom match {
          case "Fahrenheit" => (5.0/9.0)*(measure.amount - 32.0) + " C"
            case "Pounds" => lbToKg*measure.amount + " kg"
            case "Ounces" => ozToG*measure.amount + " g"
            case "Fluid Ounces" => fOzToMl*measure.amount + " mL"
            case "Gallons" => galToL*measure.amount + " L"
            case "Miles" => milesToKm*measure.amount + " km"
            case "Inches" => inchToCm*measure.amount + " cm"
            case "Celsius" => (9.0/5.0*measure.amount + 32.0) + " F"
            case "Kilograms" => measure.amount/lbToKg + " lbs"
            case "Grams" => measure.amount/ozToG + " oz"
            case "Millileters" => measure.amount/fOzToMl + " fl. oz."
            case "Liters" => measure.amount/galToL + " gallons"
            case "Kilometers" => measure.amount/milesToKm + " miles"
            case "Centimeters" => measure.amount/inchToCm + " inches"
            case _ => ""
      }
}

Measurement は case クラスです。これは Scala の便利な機能です。”case” を使ってクラスを修飾すると、そのクラスの属性、そして equalshashCodetoString の実装を要求するコンストラクターが生成されます。これは Measurement のようなデータ構造のクラスにとって最適です。また case で修飾すると、指定された属性 (この場合は uomamount) に対するゲッターも生成されます。これらの属性を var (可変変数) として定義することもでき、その場合にはセッターも生成されます。この 1 行の Scala コードで、非常にたくさんのことを行っているのです。

次の UnitsConverter も (object キーワードを使って定義されているので) シングルトンです。UnitsConverter の持つ 1 つのメソッドが convert です。convert が 1 つの文 (match 文) と等価なものとして定義されていることに注目してください。これは 1 つの式であるため、余分な中括弧は必要ありません。convert は Scala のパターン・マッチングを使っています。これは関数型プログラミング言語に共通の強力な機能であり、Java 言語や他のさまざまな言語での switch 文と似ています。ただし、Scala の場合、ストリングに対して突き合わせを行えるのです (実際には、これよりもはるかに高度な突き合わせも可能です)。ストリングに対して突き合わせが行われ、適切な計算が実行され、フォーマットが設定されたストリングが返されて表示されます。そして最後に、最後の case によって _ との突き合わせが行われていることに注目してください。Scala では、アンダーバーはワイルドカードとして、さまざまな場所で使われます。この場合には、アンダーバーは任意のものと突き合わせることを示しています。これは Java 言語における default 文と似ています。

これで、アプリケーションで行われている計算を理解できたので、UI セットアップとメニューの残り部分を調べてアプリケーションを終わることにしましょう。


UI の初期化とメニュー

リスト 4 に戻りましょう。先ほど、後で setUomChoice を調べると約束しました。このメソッドは UnitsSystem 型のパラメーターを引数に取ると定義されています。この型がどのように定義されているのかを調べてみましょう。

リスト 7. UnitsSystem
sealed case class UnitsSystem()
case object ENGLISH extends UnitsSystem
case object METRIC extends UnitsSystem

UnitsSystem は属性を持たない sealed case クラスであることがわかります。これはあまり有用とは思えません。次に、2 つの case オブジェクトがあります。Scala では object がシングルトンを表すことを思い出してください。この場合には 2 つの case オブジェクトがあり、それぞれが UnitsSystem を継承しています。これは Scala での一般的なイディオムであり、より単純で、よりタイプ・セーフな方法で列挙を行うことができます。

これで、setUomChoice の実装がより妥当なものに思えてきたのではないでしょうか。スピナーを操作した後、渡された UnitsSystem のタイプに対して突き合わせを行います。この突き合わせによって、先ほど見た arrays.xml の、どの配列を使うのかを特定することができます。ここでは、リソース (arrays.xml ファイルなど) を表現するために Android SDK が生成する、R クラスを使っています。どの配列を使うのかがわかると、スピナーに渡すためのアダプター (この場合には ArrayAdapter) を作成し、その配列をスピナーのデータ・ソースとして使います。

最後に、リスト 4 の onCreateOptionsMenu メソッドと onMenuItemSelected メソッドを見てください。これらは Activity で定義されるメソッドであり、Converter アクティビティーの中でオーバーライドされます。onCreateOptionsMenu メソッドはメニューを作成します。onMenuItemSelected メソッドは、メニューから英国単位またはメートル法単位を選択するユーザー・イベントを扱います。onMenuItemSelected メソッドでは単純に再度 setUomChoice を呼び出します。これによってユーザーは、英国単位からメートル法単位に変換するのか、あるいはメートル法単位から英国単位に変換するのかを切り換えることができます。


まとめ

Android プラットフォームのアーキテクチャーでは、JVM (Java Virtual Machine: Java VM 仮想マシン) 上で実行される任意のプログラミング言語を使用することができます。この記事では、Scala コードを扱えるように Android プロジェクトをセットアップする方法を説明しました。この種の手順は、Groovy、JRuby、Fan など、他の JVM プログラミング言語にも拡張することができます。Scala プログラミング言語を使いこなせるようになると、Android アプリケーションの作成は一層容易になります。しかも今までどおり Eclipse を使って開発を行うことができます。デバッグは、エミュレーターを使う場合も機器を使う場合も Eclipse から直接行うことができます。あらゆるツール、そしてより生産性の高いプログラミング言語を利用できるのです。


ダウンロード

内容ファイル名サイズ
Converter sampleos-eclipse-scala-Converter.zip2KB

参考文献

学ぶために

製品や技術を入手するために

  • Android 開発者のための正式サイトから Android SDK をダウンロードし、API の資料にアクセスし、そして最新ニュースを入手してください。
  • この記事で使用したカスタム・ビルドをダウンロードしてください。
  • Android はオープンソースです。これは Android のソース・コードを Android Open Source Project から入手できるということです。
  • IBM alphaWorks に用意された最新の Eclipse technology downloads を調べてください。
  • Eclipse Foundation から Eclipse Platform や他のプロジェクトをダウンロードしてください。
  • IBM 製品の試用版をダウンロードするか、あるいはオンラインで IBM SOA Sandbox を試し、DB2®、Lotus®、Rational®、Tivoli®、WebSphere® などが提供するアプリケーション開発ツールやミドルウェア製品を試してみてください。
  • 皆さんの次期オープンソース開発プロジェクトを IBM ソフトウェアの試用版を使って革新してください。ダウンロード、あるいは DVD で入手することができます。

議論するために

  • Eclipse に関する質問を議論するための最初の場所として、Eclipse Platform newsgroups があります (このリンクをクリックすると、デフォルトの Usenet ニュース・リーダー・アプリケーションが起動し、eclipse.platform が開きます)。
  • Eclipse newsgroupsには、Eclipse を利用し、拡張することに関心を持つ人達のために、さまざまなリソースが用意されています。
  • developerWorks blogs から developerWorks のコミュニティーに加わってください。

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Open source
ArticleID=416750
ArticleTitle=携帯電話に Scala を活用する
publish-date=06302009