Write Yourself a Scheme in 48 Hours読了

Write Yourself a Scheme in 48 Hoursを読んでいるが、9,10章を流し読みしたので、一通り読み終わった。

丁度読んでる途中にWeb+DB PRESSを久しぶりに買った(Perl Meets Beats目当てで)んだけど、僕の中では「大規模コードリーディング」がヒットした。メタ知識重要ってことで。

ProductName WEB+DB PRESS Vol.69
大塚 弘記
技術評論社 / 1554円 ( 2012-06-23 )


Haskellのコードリーディングの場合は、手続きを追っかけると言うよりは、hoogleで型から関数の意味(すなわち単語の意味)を調べたり、文脈を考えながらセクションの意味を理解したり、クラスの意味を理解したりと、メタ知識をどんだけ仕入れるかが重要だったりするのでgoogle使用率が妙に高くなる感じ。

それから、本を読む本の技術が結構生きてくるのかなぁと。

ProductName 本を読む本 (講談社学術文庫)
J・モーティマー・アドラー
講談社 / 945円 ( 1997-10-09 )


もう少し効率的に読めるようにしたい。

営業と詐欺のあいだ

お客様につたえること

  • メリット
  • 信頼
  • 価格

ProductName 営業と詐欺のあいだ (幻冬舎新書)
坂口 孝則
幻冬舎 / 777円 ( 2008-09 )


相手の自尊心を理解する

Haskellのクロージャ

Write Yourself a Scheme in 48 Hoursを読んでいる。8章のクロージャ

定義がこうなっていた。

PrimitiveFunc ([LispVal] -> ThrowsError LispVal)
Func {params :: [String], vararg :: (Maybe String), 
      body :: [LispVal], closure :: Env}

スタックにつまないで環境をそのまま詰め込むのか。

そういえばRWHでも似たようなこと書いてあったような気がしたんだけど、どこだか忘れた。

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


Haskellの場合はカリー化で束縛してもいいし、データコンストラクタで束縛してもいいのか。

Data.IORef

Write Yourself a Scheme in 48 Hoursを読んでいる。6,7章の状態をどうもたせるかのあたり。

6章のIOはSystem.IOにすれば動く

Data.IORefを使うのは初めてなんだけど、第20回 更新を高速化するためのSTモナドを読んだら、なんとなく方向性はわかった気がする。

要するにモナドにくるんで内部ではやりたい放題だけど、外からは素直に見えるようにするってことでしょ?

そういえば数学ガールのガロア理論で出てきた「閉じている」っていうのとモナドのfunctorのT: X -> Xってのは関係あるのかね?

ProductName 数学ガール ガロア理論 (数学ガールシリーズ 5)
結城 浩
ソフトバンククリエイティブ / 1995円 ( 2012-06-01 )


iPhone4sに変えた

Desireの容量が小さすぎて、アップデートに失敗しまくる毎日が続くし、新しいアプリを入れられないしで、さすがに嫌になったので、iPhone4sに変えた。

これでTitanium Mobileを実機で遊べてちょっといいかもと思っているので、積んであるクックブックを読もうかなと。それからAppleの開発者ライセンス購入しないとな。

ProductName Appcelerator Titanium Smartphone App Development Cookbook
Boydlee Pollentine
Packt Publishing / 3810円 ( 2011-12 )


緑の本もいいらしい。

対象関数と射関数

モナドへの近道・Haskell からの寄道を読んでいて、

定義 3 (函手 functor) 函手 T : C → B は C の各対象 c に B の対象 T c を割当てる対象関数 (object function)T と,T(1c) = 1T c, T(g ◦ f) = T g ◦ T f (ただし,g ◦ f が C で定義されている) となるように C の 各射 f : c → c′ に B の射 T f : T c → T c′ を割当てる射関数 (arrow function) (同じく T と書く) からなる.

という説明を読んで、対象関数が型コンストラクタで、射関数がfmapのことかーとすんなり入ってきた。

ProductName すごいHaskellたのしく学ぼう!
Miran Lipovača
オーム社 / 2940円 ( 2012-05-23 )


鳳凰美田と仙禽

最近飲んでた栃木の酒

鳳凰美田は安定した美味さだな。

1340871294

仙禽は最初の飲み口は酸が効いていて美味い。

1340871336

一升を一週間かけて飲み続けたらとちょっと最初の感動が薄れちゃったかな。

静岡でNode.jsハンズオンやった

久々の静岡

横に広すぎるためにコミュニティが西と東に分断されており、内戦勃発中と噂されている静岡のコミュニティ(twitter情報)ですが、非武装地帯である静岡市で開催すれば、西からも東からもヒトが集まってきて楽しく過ごせますね。というか楽しかったです。

私のハンズオンですが、now.jsはmac,linuxはNode.jsが0.6系でも0.8系でも動くんですが、Windowsだと0.8系だと動かないようなので、0.6系で動かしてみてください。懇親会で指摘された部分なんかも修正したドキュメントにしておきました。

@k0sukeyさんがハンズオンの際にmongooseの説明をしてたので思い出したのだけど、fjkwもmongoose+Expressっていう構成です。こっちもシンプルなので簡単にコードが読めると思います。

懇親会の時にちょっと話してたdocco,pyccoですが、コード中にコメント入れておけばドキュメントに出来るのでソースコードリーディングのメモに使うと調子いいです。参考までにSpine.jsのコード読んだ時にメモったものにリンク貼っておきます。

次回はGit+GitHubのハンズオンを行う予定です@静岡

他に

  • Titanium Mobile(モバイルアプリ興味あるしねー)
  • Sphinxでドキュメンテーション(ReST知ってるとGitHubのREADME書くのが楽になる)

なんかもいいんじゃないかなーと思っています。読書会の本は未定のままですが、誰かがエイヤッと決めないと決まらないでしょうねー。

お食事情報

昼は、つけ麺専門店。カウンター7席のみの小さなお店。和風つけ麺煮干し味

1341099540

1341099542

麺は美味しかったけど、スープにもうちょっと酸味が効いても良かったかなと。

二次会は呑み屋。ずっとブログは読んでいて行きたいなーとおもっていたんだけどチャンスが無かったが、今回初。満足

白岳仙はうまいな。

1341099543

19はフレッシュ感があった。はじめて飲んだ。

1341099544

Haskellで異なる型のリストをつくる

Write Yourself a Scheme in 48 Hoursを読んでいる。5章の評価2の最後あたり。

Schemeにはゆるく等価性を評価するequal?ってやつ。

(eqv? 2 "2")
#f
(equal? 2 "2")
#t

これを実装するために異る型のリストを作りmapMで順番に評価していく

data Unpacker = forall a. Eq a => AnyUnpacker (LispVal -> ThrowsError a)

unpackEquals :: LispVal -> LispVal -> Unpacker -> ThrowsError Bool
unpackEquals arg1 arg2 (AnyUnpacker unpacker) = 
             do unpacked1 <- unpacker arg1
                unpacked2 <- unpacker arg2
                return $ unpacked1 == unpacked2
        `catchError` (const $ return False)

-- or :: [Bool] -> Bool 
equal :: [LispVal] -> ThrowsError LispVal
equal [arg1, arg2] = do
    primitiveEquals <- liftM or $ mapM (unpackEquals arg1 arg2) 
                      [AnyUnpacker unpackNum, AnyUnpacker unpackStr, AnyUnpacker unpackBool]
    eqvEquals <- eqv [arg1, arg2]
    return $ Bool $ (primitiveEquals || let (Bool x) = eqvEquals in x)
equal badArgList = throwError $ NumArgs 2 badArgList

よろしくやってくれるデータ型を定義すればいいらしい。

ちょっとよくわからなかったので、適当な例をつくってみることにした。

{-# LANGUAGE ExistentialQuantification #-}

data HeteroEq = forall a. Eq a => HeteroEq (a -> Bool)

heterolist = [HeteroEq (3==), HeteroEq ("test"==), HeteroEq (True==)]

でもちょっとよくわからん。

追記 120701

これを読めばいいのかな

葵天下

キリリ感を感じさせる、静岡っぽい感じの日本酒だなぁと

1340871235