Scala+POIでExcelをいじる

xlsxにも対応しているらしいのだけど、今回は普通に。

import org.apache.poi.hssf.usermodel._
import java.io._

object PoiTest {
  def main(args: Array[String]) {
    val wb = new HSSFWorkbook
    val sheet = wb.createSheet("日本語OK")

    for (i <- 0 to 9) {
      val row = sheet.createRow(i)
      for(j <- 0 to 9 ) row.createCell(j).setCellValue(10*i+j)
    }

    val filename = "workbook.xls"
    val out = new FileOutputStream(filename)
    wb.write(out)
    out.close()
  }
}

for

forをまわすところを

for (i <- 0 to 9; j <- 0 to 9) {
  sheet.createRow(i).createCell(j).setCellValue(10*i+j)
}

とやると9,19,29...99という列しか入力されないのだけど、理由がわからん。

scala-mode

環境変数にclasspathを設定しててもscala-run-scalaでは読んでくれてないっぽい。そのため、端末からコンパイルして動かすためにmainメソッドを定義したけど、本当はEmacsからスクリプトっぽく対話チックにいじりたい。

chemoinformaics in Scala

朝から、openbabelのjavaインターフェースを使えるようにしようといじっていたのだけど、java.lang.UnsatisfiedLinkErrorを解決することができないまま夕方になってしまった。

んーCDK使うことになるのかなぁと思ったがMXのほうが楽そうなので今回はこっちを使った。

import com.metamolecular.mx.calc.MassCalculator
import com.metamolecular.mx.io.daylight.SMILESReader

object MxTest {
  def main(args: Array[String]) {
    val calc = new MassCalculator
    for (mol <- args) {
      val mw = calc.findAveragedMass(SMILESReader.read(mol))
      println(mol + ": " + mw)
    }
  }
}

実行してみる

scalac mxtest.scala 
scala MxTest "CCC" "CO" "CNC"
CCC: 44.09562
CO: 32.04186
CNC: 45.08368

Liftを使って構造関係を扱えるWikiを作ってみたい。

ProductName Scalaスケーラブルプログラミング[コンセプト&コーディング] (Programming in Scala)
Martin Odersky,Lex Spoon、Bill Venners
インプレスジャパン / ¥ 4,830 ()
在庫あり。

Scalaプログラミング入門 6-9章

一通り読んだ。

次の2章は内容がついて行けないとこがあったので、また読み返すことになると思う。

  • 6章 アクターと並行処理
  • 7章 トレイトと型、アーキテクトの秘密道具

7章でドウェムジーのRubyのやつをScalaに移植するっていう話があったんだけどRubyの元ネタ知らんかったので。

8章はパーサーで、よくある四則演算だったのでわかりやすかった。後半でJSONパーサ書いてtwitterにアクセスするというサンプルがあったのだけど、後で手動かしてみる。

ProductName Scalaプログラミング入門
デイビッド・ポラック
日経BP社 / ¥ 3,360 ()
在庫あり。

入門ってかいてあるけど、最初に読む本としてはつらいかも。Scalaスケーラブルプログラミングのほうが入門には適してる。

ProductName Scalaスケーラブルプログラミング[コンセプト&コーディング] (Programming in Scala)
Martin Odersky,Lex Spoon、Bill Venners
インプレスジャパン / ¥ 4,830 ()
在庫あり。

Scalaプログラミング入門 1-5章

5章まで。6章はアクターで難しい(急激にスピードが落ちた)

ProductName Scalaプログラミング入門
デイビッド・ポラック
日経BP社 / ¥ 3,360 ()
在庫あり。

名前渡し(p.36)

変数名と型の間に =>を記述 def delayed (t: => long) {とか

これは結局クロージャみたいなもんを渡してるのかな?

scala> val x = () => "test"
x: () => java.lang.String = <function>
scala> x
res0: () => java.lang.String = <function>
scala> x()
res1: java.lang.String = test

scala> def y() = { "tttt" }
y: ()java.lang.String    
scala> y
res2: java.lang.String = tttt

いまいちわからん。

部分適用と関数(p.104)

Haskellでは(Int, Int) => StringとInt => Int => => Stringは同じですが、Scalaでは違います。

これってHaskellも違うんでは。uncurry,curryとかあるし。

「Scalaプログラミング入門」を予約した

早くこないかな

ProductName Scalaプログラミング入門
デイビッド・ポラック
日経BP社 / 3360円 ( 2010-03-18 )


ScalaでXML

ScalaそのままXMLを取り込める。ダブルクォーテーションで囲むと文字列として認識する。

scala> val a = <p><name>kzfm</name><address>fuji</address></p>
a: scala.xml.Elem = <p><name>kzfm</name><address>fuji</address></p>

scala> val b = "<p><name>kzfm</name><address>fuji</address></p>"
b: java.lang.String = <p><name>kzfm</name><address>fuji</address></p>

これは、さらにXPath風のメソッドが使える

scala> a \ "name"
res1: scala.xml.NodeSeq = <name>kzfm</name>

型を変換したり、要素の中身を取り出してみる。

scala> a \ "name" toString                                      
res2: String = <name>kzfm</name>

scala> a \ "name" text    
res3: String = kzfm

ProductName Scalaスケーラブルプログラミング[コンセプト&コーディング] (Programming in Scala)
Martin Odersky,Lex Spoon、Bill Venners
インプレスジャパン / ¥ 4,830 ()
在庫あり。

Scalaのzipが

なんか慣れない。

scala> Array(1,2,3) zip Array(4,5,6)
res1: Array[(Int, Int)] = Array((1,4), (2,5), (3,6))

Haskellだとこんな感じでしょ。

Prelude> [1,2,3] `zip` [4,5,6]
[(1,4),(2,5),(3,6)]

Pythonだと

[1,2,3].zip([4,5,6])

とはできない。

>>> zip([1,2,3],[4,5,6])
[(1, 4), (2, 5), (3, 6)]

Monads in Scala

Scalaスケーラブルプログラミングを11章まで読んで、構文を多少理解したので、Monads in Scalaを読んだ。

要するにモナドはforに宿るってことでいいのかな。

bind [e1] (\v1 -> bind [e2] (\v2 -> unit(v1 + v2)))

というbindが出てきてこれはScalaのforだと。

for {v1 <- e1; v2 <- e2} yield v1 + v2

みたいな。

なるほどと思ったのであった。

ProductName Scalaスケーラブルプログラミング[コンセプト&コーディング] (Programming in Scala)
Martin Odersky,Lex Spoon、Bill Venners
インプレスジャパン / ¥ 4,830 ()
在庫あり。

Scalaはインタプリタが遅いのがたまに気になる。

HaskellかScalaか

うーん両方とも欲しい

ProductName Real World Haskell―実戦で学ぶ関数型言語プログラミング
Bryan O'Sullivan,John Goerzen,Don Stewart
オライリージャパン / ¥ 3,990 ()
在庫あり。

ProductName Scalaスケーラブルプログラミング[コンセプト&コーディング] (Programming in Scala)
Martin Odersky,Lex Spoon、Bill Venners
インプレスジャパン / ¥ 4,830 ()
在庫あり。

本を購入

本をまとめ買いした。

ProductName 入門Git
濱野 純(Junio C Hamano)
秀和システム / 2310円 ( 2009-09-19 )


ProductName Linux-DB システム構築/運用入門 (DB Magazine SELECTION)
松信 嘉範
翔泳社 / 2814円 ( 2009-09-17 )


ProductName ビューティフルアーキテクチャ (THEORY/IN/PRACTICE)

オライリージャパン / 3150円 ( 2009-11-27 )


ProductName Linuxカーネル2.6解読室
高橋浩和
ソフトバンククリエイティブ / 5670円 ( 2006-11-18 )


LOLは今回は買わないでおいた。

美文書作成入門は新版でるっていう噂を聞いたのでそれまで待つ。

ProductName [改訂第4版] LaTeX2ε美文書作成入門
奥村 晴彦
技術評論社 / ?円 ( 2006-12-12 )