今日の畑(111001)

ニンニクを植えつけたのと、ほうれん草の種をまいた。もう少し葉物を植えてもいいかもしれない。

人参の目が出てきたけど、人参って発芽率が低いよね。

1317543683

浅葱は去年植えたのが増えたので、今年は結構取れそう。去年は畝に植えて、春に他のものを植えられなくて困ったたので、今回は畑の端の方にうつしておいた。

1317543691 1317543700

先々週に植えたスティックセニョール。育て方がよくわからん。

1317543706

花陽浴 純米吟醸

爽やかフルーティー系、旨いというよりは美味い。

1317459760

音的にはNetskyか。

ProductName Netsky
Netsky
Hospital / ?円 ( 2010-06-01 )


Ninety-Nine Scala Problems (P33-P34)

S-99を解く。互いに素かどうか判定する問題と、それをつかってオイラーのφ関数を求める

class IntWrapper(n:scala.Int){
  def gcd(a:scala.Int, b:scala.Int): scala.Int =  if (b == 0) a else gcd(b, a % b)
  def isCoprimeTo(i:scala.Int): Boolean = gcd(n,i) == 1
  def totient: scala.Int = (1 to n) filter {(new IntWrapper(n)).isCoprimeTo(_)} length
}

implicit def int2IntWrapper(n:scala.Int) = new IntWrapper(n)

println("s33: " + 35.isCoprimeTo(64))
println("s34: " + 10.totient)

ProductName Scalaスケーラブルプログラミング第2版
Martin Odersky
インプレスジャパン / 4830円 ( 2011-09-27 )


PBPKのこと

今日のPBPKのセミナーはおもしろかったけどつまらなかった。

おもしろかった部分はまぁどうでもいいとして、つまらなかった部分を書いとくが、例えるならば、セミエンピリカルな分子軌道法を肯定してる的な。

今日の発表の全てからab initio的な理論計算の至高が感じられなかった。

PBPKにフィッテイング許したらそれは論理コンパートメントモデルと同じレベルに堕ちちゃうじゃん、堕落じゃねーの?と。自分でPBPKモデリングをやったときに、実測のlogDとかcLogPとかけ離れたパラメータを投入しないと、実測のPKに合わなくて、非常に気持ち悪いと感じていたのだけど、どこもそんな感じでやっていた。

理論計算やっているひとから見ると非常に気持ち悪いですね、そもそもチョイスしたモデルがダメなんじゃねーの?みたいな。

結局そういうダメなモデルをフィッテイングで合わせるんだったらin vitroのデータ必要ないじゃんとか思うんだけど。QSPRと整合性の取れないモデルってことは結局in vitroとin vivoの関係性を捕まえてないってことだしなぁ。

そこを肯定しちゃうと前進なんてしないんじゃないかなぁ。in vivoを排除するからこそのPBPKだ!みたいな気概が感じられなかった、プラクティカルでイイじゃんみたいな。

ProductName Pharmacokinetic-Pharmacodynamic Modeling and Simulation
Peter L. Bonate
Springer / 10339円 ( 2011-06-30 )


Structure-PBPK relationshipは遠いなと思った。

デリーのコルマカレー

東大でセミナーだったので久々にデリーへ。

1317381519

コルマの酸味がヤバイ、カシミールは辛さに耐えて終わってしまうが、コルマは深さを味わえる。

1317381516

Ninety-Nine Scala Problems (P32)

S-99を解く。GCD実装するだけ、楽勝とおもったらへんなとこではまった。

対話環境では動く

scala> def gcd(a:Int, b:Int): Int =  if (b == 0) a else gcd(b, a % b)
gcd: (a: Int, b: Int)Int

scala> gcd(36,63)
res0: Int = 9

でも、スクリプトにして呼ぶとvalue % is not a member of Intっていうエラー

$ scala p32.scala 
/Users/kzfm/scala/p32.scala:2: error: value % is not a member of Int
def gcd(a:Int, b:Int): Int =  if (b == 0) a else gcd(b, a % b)

/Users/kzfm/scala/p32.scala:4: error: type mismatch;
 found   : scala.Int(36)
 required: Int
println(gcd(36, 63))

scala.Intって何?ってことで型の定義を変更したら動いた

def gcd(a:scala.Int, b:scala.Int): scala.Int =  if (b == 0) a else gcd(b, a % b)

println(gcd(36, 63))

よくわからん。

ProductName Scalaスケーラブルプログラミング第2版
Martin Odersky
インプレスジャパン / 4830円 ( 2011-09-27 )


Ninety-Nine Scala Problems (P31)

S-99を解く。Int型にisPrimeっていう素数かどうかを判定するメソッドを組み込む問題。

implicit defをつかえばいい。

ProductName Scalaスケーラブルプログラミング第2版
Martin Odersky
インプレスジャパン / 4830円 ( 2011-09-27 )


class IntWrapper(n:Int){
 def isPrime():Boolean = (n != 1) &&
(List.range(2,math.sqrt(n).toInt+1) forall (i => n % i != 0))
}

implicit def int2IntWrapper(n:Int) = new IntWrapper(n)

for (n <- 1 to 10)
 println(n + ": " + n.isPrime)

ところで、解答見たらstream使った例が載ってたんだけどこれ動かないんだけどナニが悪いの?

/Users/kzfm/scala/p31.scala:3: error: not found: value primes
    (start > 1) && (primes takeWhile { _ <= Math.sqrt(start) } forall { start % _ != 0 })
                    ^
/Users/kzfm/scala/p31.scala:7: error: value isPrime is not a member of Int
  val primes = Stream.cons(2, Stream.from(3, 2) filter { _.isPrime })

コード

class S99Int(val start: Int) {
  def isPrime: Boolean =
    (start > 1) && (primes takeWhile { _ <= Math.sqrt(start) } forall { start % _ != 0 })
}

object S99Int {
  val primes = Stream.cons(2, Stream.from(3, 2) filter { _.isPrime })
}

shizudevつくる会#3をやります

静岡デベロッパーズつくる会は手を動かしてなにかをつくる会です。

  • やりたいことがあるけど、モチベーションが上がらなくてスイッチが入らない
  • なんかやりたいけど、取り組む対象がみつからない

なんて人は参加するといいかもしれません。みんな結構面白そうな取り組みをしているので、インスパイアされまくりです。

それからコミュニティfのいいところは

あたりかな。

飛び入りも歓迎なので、連休最終日に「暇だなー」と思ったら遊びに来てください。

Ninety-Nine Scala Problems (P21 - P28)

S-99を解く。P25から先がちょいむず。

P26

組み合わせを求めるというオーソドックスな問題。n個からr個を選ぶ組み合わせは再帰的に考えると

  • (取り出したものを加える場合)は n-1個からr-1個を選ぶ
  • (取り出したものを加えない場合)はn-1個からr個を選ぶ

上記2つのパターンの和になるので、これで再帰させる。

def flatten(ls: List[Any]): List[Any] = ls flatMap {
 case ms: List[_] => flatten(ms)
 case e => List(e)
}

def combinations(n:Int, ls:List[Any]): List[List[Any]] =
 if (n==0) List(Nil)
 else if (ls == Nil) List(Nil)
 else ((combinations(n-1,ls.tail) map ((e:List[Any]) => ls.head :: flatten(e))) ::: combinations(n,ls.tail))

println(combinations(3, List('a, 'b, 'c, 'd)) filter (l => l.length == 3))
println(combinations(3, List('a, 'b, 'c, 'd)))

結局r個以下の組み合わせを出力する関数になってしまった。しょうがないのでfilterかましてるけど。 あと、型がうまく決められなかったので、Anyとか使っちゃったけどあんまり良くない気がする。

ProductName Scalaスケーラブルプログラミング第2版
Martin Odersky
インプレスジャパン / 4830円 ( 2011-09-27 )


//21
def insertAt[A](e:A, n:Int, ls:List[A]): List[A] = {
  val v = ls.splitAt(n)
  v._1 ::: e :: v._2
}

println("s21: "+ insertAt('new, 1, List('a, 'b, 'c, 'd)))

//22
def range(s:Int, e:Int): List[Int] = List.range(s,e+1)

println("s22: " + range(4, 9))

//23 Randomの使い方を知らなかった
def removeAt[A](n:Int, ls:List[A]): (List[A],A) = {
  val v = ls.splitAt(n)
  (v._1 ::: v._2.tail, v._2.head)
}

def randomSelect[A](n: Int, ls: List[A]): List[A] =
  if (n <= 0) Nil
  else {
    val (rest, e) = removeAt((new util.Random).nextInt(ls.length), ls)
    e :: randomSelect(n - 1, rest)
  }

println("s23: " + randomSelect(3, List('a, 'b, 'c, 'd, 'f, 'g, 'h)))

//24
def lotto(n: Int, r: Int): List[Int] = 
  if (n <=0) Nil
  else randomSelect(n, List.range(1,r+1))

println("s24: " + lotto(6, 49))

//25
def randomPermute[A](ls:List[A]): List[A] = lotto(ls.length,ls.length) map(e => ls(e-1))

println("s25: " + randomPermute(List('a, 'b, 'c, 'd, 'e, 'f)))

//26
//def combinations[A](n:Int, ls:List[A]): List[List[Any]] = 
//  if (n == 0) Nil
//  else if (ls == Nil) Nil
//  else ( ls.head :: combinations(n-1,ls.tail) ) :: combinations(n,ls.tail)

def flatMapSublists[A,B](ls: List[A])(f: (List[A]) => List[B]): List[B] = 
  ls match {
    case Nil => Nil
    case sublist@(_ :: tail) => f(sublist) ::: flatMapSublists(tail)(f)
  }

def combinations[A](n: Int, ls: List[A]): List[List[A]] =
  if (n == 0) List(Nil)
  else flatMapSublists(ls) { sl =>
    combinations(n - 1, sl.tail) map {sl.head :: _}
               }

println("s26: " + combinations(3, List('a, 'b, 'c, 'd, 'e, 'f)))

//27
//println("s27: " + )
//28
//println("s28: " + )

Javaデータ構造とアルゴリズム基礎講座

アルゴリズムの勉強のしかたに載っていて、java度の低い自分には丁度よいかもと思い即買いしたのだけど、自分にはちょっと基礎的すぎた(どういうライブラリがあるかとリングバッファの実装が役に立ったけど)。

ProductName Java データ構造とアルゴリズム基礎講座
長尾 和彦
技術評論社 / 2709円 ( 2008-12-26 )


アルゴリズムイントロダクションを買うべきだったな。

ところでperlでアルゴリズムを学ぶなら迷わずMAWPを選択するべきでしょう。

ProductName Mastering Algorithms With Perl
Jon Orwant
Oreilly & Associates Inc / 2553円 ( 1999-07 )


日本語版がでてもおかしくないくらいの良書だと思う。