Function.scalaのchainメソッド

Scalaのソースを読んでいます。

Function.scalaのchainメソッドっていうのが面白い。

def chain[a](fs: Seq[a => a]): a => a = { x => (x /: fs) ((x, f) => f(x)) }

/:っていうのはfoldleftのシンタックスシュガーなので、よくあるパターンと対比ささせてみる

scala> (0 /: Seq(1,2,3,4,5))(_ + _)
res9: Int = 15

左からパタパタと倒していく。

つまりSeq[a => a]という関数のシーケンスを次々に適用していくわけですね。

故にチェイン

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


集合指向言語として考えればSQLの言語仕様は非常に面白い

SQLはデータベース操作用の言語でとっつきにくいなぁと敬遠してたわけですが。

ORM便利だわと考えていた時期もあったのだけど、実際、多対多の設定もめんどくさいし集合関数とかジョイントかさせようとすると余計ややこしくなるので、やっぱSQLもきちんと覚えておかないといけないかなぁと。

ProductName 達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)
ミック
翔泳社 / 2520円 ( 2008-02-07 )


本書は、集合を操作する言語としてのSQL言語を楽しみながら読める構成になっている。。3論理値の話も面白かったし、having句とかexists述語の使い方も勉強になった。これは良書でしたね。

SQLを集合思考言語と考えれば、宣言的な表現になっているのも素直だし、関数型言語脳で処理したほうが素直だなぁと思える。Play ScalaはORMじゃなくてSQLだしねぇ。

もし関数型言語とか集合論に馴染みが薄ければ、この二冊を読んでおくとよいかもしれません。

ProductName 離散数学への招待〈上〉
J. マトウシェク
シュプリンガー・フェアラーク東京 / 2835円 ( 2002-12 )


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


積んである本に「SQLパズル」があるんだが、読むのが楽しみになった。

ProductName SQLパズル 第2版 プログラミングが変わる書き方/考え方
ジョー・セルコ
翔泳社 / 2940円 ( 2007-11-02 )


「誰が」会社を変えるのか: 誰なんでしょうねぇ?

著者はノーリツ鋼機の経営戦略室にいたらしい。ノーリツ鋼機といえばお家騒動的なアレとか産業が急速に減衰した業界ですね。

ProductName 「誰が」会社を変えるのか 近未来企業へのシナリオ
田中 淳視
文芸社 / 1470円 ( 2010-11-01 )


こういう背景を踏まえた上で読んでいくと、特に三章以降は恨みっぽい感情も行間に見え隠れしつつも、株主資本主義に疑問を呈している感もあるかなぁと。ネクスト・ソサエティで似たようなことをドラッカーも書いてたな。

一章、二章のどう働くかは参考になった。

  • ヒトを試算とみるか、コストと見るか
  • マーケティングにおけるスキミングポリシー
  • 成果における個人の努力によるものは2割程度
  • 経営とは「だれが」「なにを」「どうする」かをデザインすること

今週末はHTML5読書会があります

今回からHTML5&CSS3実践入門を読んでいきます。初回は三島で開催です。プログラムプログラムしてない本なので、スマホのヒトも、webデザイナーのヒトも楽しく勉強できると思いますよ。

ProductName HTML5&CSS3実践入門 最新Web標準を使いこなす (The Pragmatic Programmers)
ブライアンP.ホーガン
インプレスジャパン / 2940円 ( 2011-07-08 )


尚、当日は三島バルという飲み歩きイベントも行われているので、飲み歩きついでにちょっとHTML5でも勉強しておくかっていう参加のしかたもありだと思いますが。

ちなみに私は子供の面倒をみないといけない(第5土曜日は保育所が休みらしい)ので、読書会には参加できません ;-)

夕方からのこのこ出かけていってバルからの参加になるわけですが、@bg7860と久しぶりにウダウダと飲み歩く予定なので、会ったらよろしく。

公式サイトみると#三島バルっていうタグつけてつぶやけって書いてあるけど、タグ打ちめんどくさいし、酒のんで楽しんでいる状況でそんな面倒なことは多分しない(吉原バルで経験済み)位置情報オンにしといて、緯度経度情報でtweetフィルタリングするのが現実的なやり方じゃないのかなぁと思うが。

どうやろかね?

クライアントによっては自動で前回入れたタグが自動的に挿入される機能があったりすんのかな?そういうあたりもちょっと興味あるね。

  • 酒飲みながら日本語ハッシュタグをつけることができるか?
  • それを@bg7860が僕の代わりにやれるか

こういったあたりも。

HTML5 CANVAS 6-7

videoタグじゃなくてcanvas経由で動画を表示する。

HTML5 6-7

videoElement = document.createElement('video')
videoDiv = document.createElement('div')
document.body.appendChild(videoDiv)
videoDiv.appendChild(videoElement)
videoDiv.setAttribute("style","display:none;")
videoType = supportedVideoFormat(videoElement)

console.log(videoType)
videoElement.setAttribute("src","/videos/sample." + videoType)
videoElement.addEventListener("canplaythrough", videoLoaded, false)

theCanvas = document.getElementById("canvasOne")
context = theCanvas.getContext("2d")

videoElement.play()
setInterval(drawScreen, 33)

なんでvideoElementにイベントリスナー設定しているのに、最後の方でplayメソッドを呼び出しているのかわからん。6-5のサンプルに倣うんだったらvideoLoadedで呼び出すべきなんじゃないのかね?

ProductName HTML5 Canvas: Native Interactivity and Animation for the Web
Steve Fulton
Oreilly & Associates Inc / 2922円 ( 2011-05-13 )


HTML5のビデオ変換がめんどくさすぎる

HTML5 Canvasも6章になってvideoを扱う。この本の欠点はサンプルコードがないことかなぁ。

コードはなくてもいいけど本書でつかった画像とか、動画とかはダウンロードできるようにしてもらいたかった。しょうがないので、必要な画像とか動画は都度用意しているが、やはり手間だ。

そして、初めてvideoタグを使う時がやってきたので、動画のコンバーターをインストールしたり、サンプルの動画を用意したりしている。

現状のブラウザの対応状況の関係で、動画関連はメインの規格が3つくらいあって、面倒だとは聞いていたけど、用意するのは本当に面倒だった。WebMなんて特に面倒くさい。ogg(theora+vorbis)はffmpeg2theoraがあるので楽だった。MP4(H.264+AAC)は特許に縛られてるからどうだろうねぇ、現状iPhoneとandroidで動くので必要だろうけど。

入門HTML5のvideoの章が、「サルでもわかるHTML5ビデオ」みたいなスクリーンショット多めのチャプターでソフトウェアの使用方法にページを割いててなんだこれ?と思っていたんだけど、実際に動画を変換してみて、

あーこの章は必要だわ

と思ったのであった。

ProductName 入門 HTML5
Mark Pilgrim
オライリージャパン / 2415円 ( 2011-04-23 )


各ブラウザのサポート対応表を改めて見直していたら、別にWebMに対応しなくてもいい気もしてきた。

ところで著者のMark Pilgrimは今月の頭にinfosuicideしちゃったみたいなんだよね。

HTML5 CANVAS 5-8

衝突をHTML5で。

html5 canvas 5-8

ProductName HTML5 Canvas: Native Interactivity and Animation for the Web
Steve Fulton
Oreilly & Associates Inc / 2922円 ( 2011-05-13 )


本書は10章がPhoneGapの使い方なんだけど、まだそこまで到達してない(今5章)。

600ページ超えでサンプルも豊富な割に3000円を切る値段と安いのでコストパフォーマンスは高いと思う。 英語も難しくないし。

ScalaのBooleanのboxing, unboxing

いろいろあってS-99への気力が削がれているので、Scalaの標準ライブラリを読み始めてみた。

Booleanオブジェクトにはbox,unboxメソッドがあった。

scala> Boolean box true
res20: java.lang.Boolean = true

scala> Boolean unbox (Boolean box true)
res21: Boolean = true

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


Play! Scalaでなにかを作ってみたい。

CoffeeScriptでPythonでいうところのenumerateが使いたい

for loopを二回かけたい場合。

つまりjavascriptではこんな感じのよくある2重ループ。

for (var i =0; i<a.length; i++) {
  for (var j = i+1; j <a.length; j++) {
    # なんか
  }
}

こういうループを回したい場合はpythonでいうところのenumerateとかは必要なくて二番目の返り値にインデックスが返るっぽい(返り値の数をチェックしてんのかな?よくわからないが)

for el1, i in a
  for el2 in a[i+1..]
    #なんか

となるので、非常にわかりやすい。

Stream[<empty>.Int]

こんなのをREPLで動かすと普通に動くんだけど

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

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

println(ps.tail.head)

スクリプトで動かそうとすると、型が違うよって怒られます。

$ scala e.scala 
/Users/kzfm/scala/e.scala:4: error: type mismatch;
 found   : scala.collection.immutable.Stream[scala.Int]
 required: Stream[<empty>.Int]
val ps = sieve(Stream.from(2))
                          ^
/Users/kzfm/scala/e.scala:2: error: value % is not a member of Int
  Stream.cons(s.head, sieve(s.tail filter (_ % s.head != 0)))
                                             ^
two errors found

これはいったい何なんでしょう?

追記

ubuntuの2.9.1.finalではエラーが出なかったが、mac osxの2.9.1.final (Java 1.5.0_30)だと出た。JDK 1.6.0_26+Scala 2.9.1だと動くという情報を頂いたので、javaのバージョンを上げてみたが、結果は変わらなかった。

よくかんがえてみればREPLで動かせば動くので、javaの問題ではない気はする。

それから以前、よくわからなかったIntじゃなくてScala.Intにしないといけない理由も同じあたりに問題があるような気がしてきた。

残るのはMacのバージョン(10.5)に問題があるのか、環境変数なんかおかしいかくらいしか考えられないが、同じような問題を抱えてるヒトをググってみても全然出てこないのが、自分固有の問題臭を漂わせているわけでなんかボケたことをやっている気がしないでもない。