シンプソン積分をScalaで

Pythonで書いたシンプソン積分をScalaでも書いてみたのだけどfor yieldで総和を求めるやり方が分からなかったので(RandomAccessSeq.Projectionとかいうのが出た)結局var変数で。

def simpson(f: Double => Double, a: Double, b: Double, n: Int): Double = {
  val h = (b - a)/n
  var sum = 0.0
  for (i <- 0 to n-1) {
    sum = sum + f(a+i*h) + 4.0 * f(a+i*h+h/2) + f(a+i*h+h)
  }
  sum * h / 6
}

def func(x: Double): Double = {
  1.0 / (1 + Math.pow(x,2))
}

実行

scala> simpson(func, 0, 1, 1000)
res24: Double = 0.7853981633974496

Int,Double,Floatとかの型の使い方もいまいちわかってないな。

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出版センター / ¥ 3,360 ()
近日発売 予約可

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はインタプリタが遅いのがたまに気になる。

本を購入

本をまとめ買いした。

ProductName 入門Git
濱野 純(Junio C Hamano)
秀和システム / ¥ 2,310 ()
在庫あり。

ProductName Linux-DB システム構築/運用入門 (DB Magazine SELECTION)
松信 嘉範
翔泳社 / ¥ 2,814 ()
在庫あり。

ProductName ビューティフルアーキテクチャ

オライリージャパン / ¥ 3,150 ()
在庫あり。

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

ProductName Linuxカーネル2.6解読室
高橋浩和,小田逸郎,山幡為佐久
ソフトバンククリエイティブ / ¥ 5,670 ()
在庫あり。

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

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

ProductName [改訂第4版] LaTeX2ε美文書作成入門
奥村 晴彦
技術評論社 / ¥ 3,339 ()
在庫あり。

Next Page