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

sofのStateモナドの添削がわかりやすかった

Working with the State monad in Haskell

collectUntil :: (s -> Bool) -> State s a -> State s [a]
collectUntil f s = do 
  s0 <- get
  let (a,s') = runState s s0
  put s'
  if (f s') then return [a] else liftM (a:) $ collectUntil f s

これはliftM使いすぎでbind使わなさすぎなコードらしく、次のようになおされてた。

collectUntil2 :: MonadState t m => (t -> Bool) -> m a -> m [a]
collectUntil2 f s = do
  s' <- get
  if f s' then return []              
  else do
    x  <- s
    xs <- collectUntil2 f s
    return (x:xs)

確かにこっちのほうが(State s)の配管を引っ張りだしてなくて見やすいかもなぁと思いつつ、bindを明示的に書いてみた。

collectUntil3 :: MonadState t m => (t -> Bool) -> m a -> m [a]
collectUntil3 f s = get >>= \s' -> 
                    if f s' 
                    then return []              
                    else s >>= \x -> collectUntil3 f s >>= \xs -> return (x:xs)

参考

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


静岡でNode.jsのハンズオンを開催します

最近完全にHaskellにシフトしてる感がありますが、明後日(6/30)の土曜日に静岡でNode.jsハンズオンをやります

キャンセルが出てて若干空きがあるみたいなんで、時間があれば参加するといいと思います。

スライドつくったのでGithubにpushしておきました。

git clone git@github.com:kzfm/shizdraw.git
cd shizdraw/slides
python -m SimpleHTTPServer
# http://localhost:8000/で立ち上がる

でスライドを見ることができます。ちなみにコードはCoffeeScriptで書いてます。

田子の浦しらすフェスティバル

しらす祭り。生と茹でのしらす丼

1340870918

1340870920

1340870922

生しらすはちょっと苦味があるので、茹でしらすのほうが好きかなぁ。

今度は赤富士丼を食べにいこうっと。

はやし

渋谷に出張だと大抵はやしにいってしまう。

1339500778

1339500779

他の店も探さないとなぁ