Scalaで何か作ってみよう1

プロジェクトフォルダを作る

scalaでの開発にもMavenが使えるらしいです。MavenJavaの開発で色々とお世話になってすっごく便利だったので使ってみよう。
DOSプロンプトから以下の長ーいコマンドを入力する。

mvn archetype:generate
  -DarchetypeGroupId=org.scala-tools.archetypes
  -DarchetypeArtifactId=scala-archetype-simple
  -DarchetypeVersion=1.2
  -DremoteRepositories=http://scala-tools.org/repo-releases
  -DgroupId=syttru.twitter
  -DartifactId=scalabot

(ホントは一行)


そうするとコマンドラインから質問される。

Define value for version:  1.0-SNAPSHOT: :
Confirm properties configuration:
groupId: syttru.twitter
artifactId: scalabot
version: 1.0-SNAPSHOT
package: syttru.twitter
 Y: :

英語で質問されるので何を言ってるのかよくわからない。「イエースイエース」とか言いながらエンターキーを押します。
scalaのプロジェクトフォルダができた。便利!

pom.xmlをいじる

pom.xmlファイルができたので中身を見てみました。
scala.version」という項目に「2.7.0」とあります。こないだ2.7.3-finalがリリースされてたので「2.7.3」に置き換えておきましょう。


変更前

  <properties>
    <scala.version>2.7.0</scala.version>
  </properties>

変更後

  <properties>
    <scala.version>2.7.3</scala.version>
  </properties>

pom.xmlに必要なライブラリを書く

Mavenは必要なライブラリを自動的にかき集めてきてくれるので非常に楽です。今回はtwitterbotを作るのでjakartaプロジェクトのcommons-httpclientが必要になるだろうと思いました。


http://hc.apache.org/


httpclientはいつの間にかjakartaプロジェクトから独立してHTTPComponentsという名前になってました。なんてこったい。
以下の一文をpom.xmlに追加します。

    <dependency>
      <groupId>org.apache.httpcomponents</groupId>
      <artifactId>httpclient</artifactId>
      <version>4.0-beta2</version>
      <scope>compile</scope>
    </dependency>

HTTPClient試運転

実装する前にHTTPClientライブラリを試してみようと思い、testフォルダで適当に書いてみました。
書いてて気がついたのですが、バージョン4になって使い方が大幅に変更されたようです。
HttpClientクラスがインターフェースになってて、DefaultHttpClientという実装クラスを使うみたいです。
GetMethodクラスやPostMethodクラスは、それぞれHttpGet HttpPostという名前になってました。
/(^o^)\ナンテコッタイ

package syttru.twitter

import org.junit._
import Assert._

import org.apache.http.client.methods.HttpGet
import org.apache.http.impl.client.BasicResponseHandler
import org.apache.http.impl.client.DefaultHttpClient

import java.io.{BufferedReader,InputStreamReader}

@Test
class HttpClientTest {

    @Test
    def testGet() = {
      val client = new DefaultHttpClient
      val get = new HttpGet("http://search.twitter.com/search.atom?lang=ja&q=scala")
      
      val response = client.execute(get)
      val entity = response.getEntity
      
      val input = new BufferedReader(new InputStreamReader(entity.getContent))
      var line = ""
      while({line=input.readLine; line != null}) {
        println(line)
      }
      
      client.getConnectionManager.shutdown
    }

}

うーん。。。
急にscalaの世界からJavaの世界に連れ戻されたような感覚です。Javaのライブラリをそのまんま使うのはよくないなあ。勉強のためにラッパーを書きたいなあ。既にあるのかなあ。探してみよう。


今日はここまで

追記

寝る前にぐぐったらHttpClientとか使わずに1行で実現できることが判明しました。私は悲しい。

import scala.io.Source

object Main {
  def main(argv: Array[String]) {
    Source fromURL "http://search.twitter.com/search.atom?lang=ja&q=scala" foreach (c=>print(c))
  }
}