Scalaで何か作ってみよう1
プロジェクトフォルダを作る
scalaでの開発にもMavenが使えるらしいです。MavenはJavaの開発で色々とお世話になってすっごく便利だったので使ってみよう。
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は必要なライブラリを自動的にかき集めてきてくれるので非常に楽です。今回はtwitterのbotを作るのでjakartaプロジェクトのcommons-httpclientが必要になるだろうと思いました。
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)) } }