継続的インテグレーションに入門している

先週のインフラ勉強会でCIツールとしてJenkinsを教わったので、早速GitHubのpythonプロジェクトをjenkinsで動かしたりしていた。まぁ大体動いたのだけどエントリに起こす時間がないのでまた今度。

というわけで、継続的インテグレーション入門を見なおしているんだけど、実際に少し触ってからもう一度読むと、あーなるほどと思うことがあって勉強になるわけです。

ProductName 継続的インテグレーション入門 開発プロセスを自動化する47の作法
ポール・M・デュバル
日経BP社 / 3360円 ( 2009-08-06 )


製薬のようなライフサイエンス業界にも似たようなCIの取り組みをしている会社があるみたいで(残念ながら国内では知らない)、彼らはContinuous Improvementと呼んでいるんだけど、基本的にはアジャイル開発の流れを汲んでるっぽいので、目的とするところは一緒ですね。

ただ、テストにヒト(ベンチワークの研究社)を必要としたり、イテレーションが一週間位と長かったりするのでそのままソフトウェア業界のベストプラクティスを参考にするわけにはいかないんだろうけど、強いしなやかな組織をつくるためには正しい方向性の一つなんじゃなかろうかなぁと思うわけですね。

こういうのもそうなんだけど、創薬の現場にもっとアジャイルな手法を取り入れたら素敵なんだろうなぁと思っているのだけどねぇ。

静岡デベロッパーズつくる会#3に行ってきた

だんだんヒトが増えてきているので良い感じですね。それからコミュニティfみたいな活動しやすいスペースは貴重ですね。もっと増えて欲しいなぁ。そして、ローカルな島を作ってワークショップみたいなとこまで出来たら楽しいと思う。

今回はGAE,Node.js,Haskell,Android,電子工作と多様性の高い集まりだったし、黙々度が高かったですね。

黙々度が高いのは捗るという意味ではいいのだけど、一方でコミュニケーションが減って成果がわかりにくくなりがちなのでプロジェクタを用意して成果を報告する場も用意したほうが良いかなぁと思った。会の後に飲み会をしないので交流のためにそういう時間を積極的に持ったほうがいいかなぁと思ったりもする。もう少しヒトが増えたら考えようっと。

僕は、xooq

  • アカウント削除処理を用意
  • 過去のイベントは表示しないようにした
  • adsense貼りつけた

を実装して、MA7に応募するとこまでやっときました。GAEのタイムゾーンで嵌ったのと、jQueryでgetJSONを二枚がけしたらおかしなことになった。

お昼はアドニスでつけナポリタン。

1318243000 1318243002

そろそろ、味噌焼きそばも攻めとかないとあかんかな。

「Scala実践プログラミング」を注文した

先日東京出張の際にパラっとめくってヨサゲだったのだけど、思ったよりでかくて重かったので、改めてAmazonで注文した。

ProductName Scala実践プログラミング―オープンソース徹底活用
小笠原 啓
秀和システム / 2940円 ( 2011-06 )


最近Scalaを触っていて、型で躓くことが多いです。あとエラーの内容がナニを意味してるのかよく分からなくてイラッとさせられることが多いんですが、まぁ踏ん張りどころということで。

今日はScalaプログラミング入門のDwemthyを写経したんだけどエラーが出まくって凹んだ。

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


仕事のやり方間違えてます

仕事のやり方の大切さを説く。

内容に斬新さは感じられられないが、大切なことが当たり前のことのように書いてあるので、 良書だとは思う。

中古が安いので読み物としては費用対効果が高い。

第4回 静岡ITPro勉強会 インフラ部に参加した

インフラ系じゃないけど、色々勉強になるので、イイですよね。

Jenkinsの話は面白かった、GitHubのコードをテストしてくれるのは素敵だ。

Pythonだとbuildbotがあるけど、どっち使ったらいいんだろうかね。

ProductName エキスパートPythonプログラミング
Tarek Ziade
アスキー・メディアワークス / 3780円 ( 2010-05-28 )


ちなみに私はSphinxの紹介をしてきました。Sphinx便利ですよね。

それから静岡にもPythonのユーザーグループ欲しいよねっていうことになって、[三島|富士|静岡].pyでも作るかねって話になってます。A君メソッド的には飲み会(#0)から始めるんだろうけど、丁度明日つくる会があるので、興味があったら遊びに来るといいと思います。

ベターJavaというよりはゆるふわHaskellとしてScalaを使う

最近ちょっとScala度が上がっています。螺旋を表すScalaのロゴはDNAのらせん構造をも意味するわけです(超訳)

ここ数年はずっとPythonをメインに使っていて、大抵のことはサクサクかけて便利だし、コード読みやすいしFlaskは楽しいしと、特に不便を感じることはなく使っていたのだけど最近幾つかの要因が重なって心境の変化があった。

其の壱

devquizでPythonの高速化がめんどくさかった(というか出来なかった)こと。PyPyは手元のmacbookでは動かなかったので仕方ないとして、Cythonがクラスにしちゃうとよくわからんよねーと。だったら最初からC/C++で書けばいいんじゃないのかなぁと。

というわけで、Pythonの他に実行速度の速い言語も覚えておきたいなぁと思った(でも、LLっぽくお手軽に書きたいよね)。

其の貳

Haskellは面白いがなかなか身につかない。プログラミングHaskellからReal World Haskellを順調に読み終えて、じゃぁ実際に使うかと思っても、意外なとこで躓くことが多かった。あと、RWHの次に読む本がないというのも独学なヒトにはつらいとこでなかろうか。

もう一つは、仕事で使う用のライブラリとかバインディングが揃ってなくて、職場で使う機会があまりなかったっていうのも大きいかもしれない。

でも関数型プログラミングは楽しいので使いたい。

其ノ參

そろそろ、新しい言語を身につけたいよねーと。出来れば関数型で。

そしてScalaが気になりだした。

最初、Scalaを触ったときは、REPLの起動が遅いし型の定義とかめんどくさそうだし、javaはあまり好きじゃないし、自分は使わないわなぁと投げ出していたのだけど、RWH読み終えて型の素敵さに目覚めた上で再度Scalaを触ったらイイかもと思い始めた。javaのライブラリも使えるので仕事用のコードも書ける。

素数のリストだってHaskell風味に書けるし、Maybeに似た感じのOptionっていう型だったある。

def sieve(s: Stream[Int]): Stream[Int] =
   Stream.cons(s.head, sieve(s.tail filter (_ % s.head != 0)))

val ps = sieve(Stream.from(2))

というわけで、ちょっとScalaで書こうかなと思っている。

書籍

プログラミングHaskellは名著。問題も含めて一度は読むべき

ProductName プログラミングHaskell
Graham Hutton
オーム社 / 2940円 ( 2009-11-11 )


Real World Haskellは型の素晴らしさを学んだ。と共にHaskell難しいのうと感じた。そしてちょっと挫折した。

ProductName Real World Haskell―実戦で学ぶ関数型言語プログラミング
Bryan O'Sullivan
オライリージャパン / 3990円 ( 2009-10-26 )


Scalaプログラミング入門は楽しい。でも色々端折ってて疑問点が出まくりなのでコップ本は必須かな。

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


バイブルになるか?

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


おまけ

ScalaってベターJavaなのかなぁ? Perl,Python,RubyとかのLLのヒトが関数型プログラミング+静的な型付けを求めて入るほうが自然な気がするんだけどなぁと、自分がそうなのでそう思うだけなのかなぁと。

Ninety-Nine Scala Problems (P35)

S-99を解く。

素因数分解

class IntWrapper(n:scala.Int) {
 def isPrime(n:Int): Boolean = (n != 1) &&
   (List.range(2,math.sqrt(n).toInt+1) forall (i => n % i != 0))
 def sieve(s: Stream[Int]): Stream[Int] =
   Stream.cons(s.head, sieve(s.tail filter (_ % s.head != 0)))

 val ps = sieve(Stream.from(2))
 def primeFactors: List[Int] = {
   def primeFactorsR(n: Int, ps: Stream[Int]): List[Int] =
     if (isPrime(n)) List(n)
     else if (n % ps.head == 0) ps.head :: primeFactorsR(n / ps.head, ps)
     else primeFactorsR(n, ps.tail)
   primeFactorsR(n, ps)
 }
}

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

println("s35: " + 315.primeFactors)

エラトステネスの篩はここを参考にした。

Streamを使うと

def sieve(s: Stream[Int]): Stream[Int] =
   Stream.cons(s.head, sieve(s.tail filter (_ % s.head != 0)))

val ps = sieve(Stream.from(2))

とHaskellのように書ける

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


ヤキットリアに行ってきた

同期の送別会と称して、前から気になっていたyakittoria inahoさんへ行ってきた。

気になっているといいつつ、大人の事情で一人だけノンアルコールという屈辱。次の日早朝から会議がなければよかったのにと。まぁ、ノンアルコールも充実しているので良し。

1317460126 1317460128

メニューが窓に。野菜が美味い

1317460132 1317460130

魚は真鯛だそうです。そして、自家製ジンジャーエールに移行。

1317460134 1317460137

1317460139 1317460141

焼き鳥は全部で10種で結構なボリューム。塩梅はちょっと気になったけど、酒飲んでたら このくらいのがちょうどいいんだろうなぁと、隣で金明とか白隠正宗をうまそうに飲んでいる 同僚を見ながら思った。

1317460143 1317460145

抹茶ティラミスで締めた。

1317460147

満足の夜だった(日本酒を飲めなかったのを除いては)

まぁ、同期は研究離れちゃったけど、新しいとこで頑張ってくださいと。

ScalaでSwing

GUIアプリを作るのにSwingを使ってみる

scala_swing

結構簡単そう。

import scala.swing._

object FirstSwingApp extends SimpleSwingApplication {
  def top = new MainFrame {
    title = "First Swing App"
    contents = new Button {
      text = "Click me"
    }
  }
}

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