勉強するものじゃない。

ホットエントリとか、そういうののブクマコメをよんでいて感じる気持ちって、うまく表現できない。俺がいままで思っていたよりも、俺と決定的に合わない人っていうのは、多いんだなぁと、近頃、特にここ三ヶ月ぐらいは、感じる。

Haskell が理解できる気がしてこない。諦めたい気分になってくる (実際書いてるコードは理解しなくても書ける範囲でしか書いてない)。いやもちろん誰かに「やれ」なんていわれているわけじゃない。理解できなくてくやしい。lift が全くわからない。「モナドの全て」の説明を読んでもわかった気にさえなれない。頭が悪い。本当に悪い。頭悪いのを実感できる分野は苦手だ。数学とかまさに。Haskell は数学に近い。ただプログラミングということになっているから耐えられる。いややめるかも。頭のいいわるいなんて生まれつきだから、そんなのいまさらどうしよもない。理解できる人には理解できるんだろうなぁ。

IO モナドが副作用を閉じこめているのは (そういう説明がされているから) わかった気になる。それを扱うとき、そのモナドの中で (この表現が正しいかよくわからない。つまり do ブロックの中といいたい) 処理をして、モナドをはずす (この表現が正しいかよくわからない。つまり IO String を <- をつかってなかの String をとりだすといいたい) ことで、副作用を一旦どっかに置いとくことができるようなことはわかった (ほんとに?)。

この do ブロックの中でなにがおこっているのかわかってない。>> で各行が連結されている? >> はなにをする? 連結。連結ってなに。>>= の = がないバージョン。return がなんなのかわかってない。こいつはなにをするんだ。

return は return :: a -> m a すなわち a をとってモナドにくるまれた a をかえす。モナドのインスタンスをつくる。でもこれ引数に値しかわたしてないけど、どのモナドにくるまれるんだ? コンテキストモナド? コンテキストモナドとかてきとうにいったけど、よくわかってない。それが存在するかすらわかってない。

(>>=) :: m a -> (a -> m b) -> m b バインドとかいうらしい。モナドインスタンス m a と関数を一個とって新しいモナドをかえす。わけわかんない。モナドの中の値を処理してまた新しくモナドインスタンスをつくってる。なんでこんなことする必要があるんだろう。計算を合成するってどういう意味だ。Maybe があるなし一緒にして計算を継続できるようになってるのはいいことなのか。合成ってなんなんだ。関数合成と計算の合成って何がちがうんだ。

そういえば関数合成 . と $ のつかいわけもよくわからない。全部 $ でかけるような。合成のほうが気分的にすっきりするだけ?

aaa >>
bbb

aaa >>=
(\x -> bbb)

みたいなときに x には何が入ってるんだ。aaa の返り値か。まてまてモナドはどこいった。もうすこし実用に近いところでみてみよう

import Network.CGI

cgiMain :: CGI CGIResult
cgiMain =
    setHeader "Content-Type" "text/plain" >>=
    \x -> output "Hello"

main :: IO ()
main =  runCGI $ handleErrors cgiMain

もちろん >>= は >> にして \x -> は消しても動く。それはいい。\x には何が入っているんだ。setHeader の返り値のはずだ。

setHeader :: MonadCGI m => String -> String -> m ()

m () ってなんだ。() がなんだかわからない。null ? 空リスト? いやリストは [] だ。こいつはなんだ。Haskell だと print デバッグができない。\x になにが入っているか直接調べることができない。学習のさまたげだ。print デバッグは偉大だ。

この () とかいうやつは :type しても () そのままうちこんでも () のままだ。どこに定義が書いてあるんだ。探しにくい。これだから記号がいやだ。

まぁいいやもっと簡単にしていこう。こんどはちゃんと前の計算の値をつかうモナドだ。よくあるやつになった

main :: IO ()
main =  readFile "Rakefile" >>= (\x -> putStr x)

readFile は IO String をかえす。>>= で x に IO String のなかの String がバインドされる。そして計算が実行される。

実際は putStr 自体が (\x -> fun x) の形になっているからこう書く必要はなく

main :: IO ()
main = readFile "Rakefile" >>= putStr

でいい。putStr をよばずに、関数として >>= 関数にわたしてやっているだけだ。ん? なんか全く普通だ。関数の定義通りの実行されているにすぎない。モナドが見えない。putStr の返り値は IO () だから main の定義ともあっている。これはまったくもってわからないところがない。あれ?

main :: IO ()
main = readFile "Rakefile" >> putStr ""

たしかになにもでない。あたりまえだ。

もう一回 CGI の例を定義とてらしあわせてみるけど、こっちはやっぱりわからない?

class Monad m => MonadCGI m
data CGIT m a
type CGI a = CGIT IO a
runCGI :: MonadIO m => CGIT m CGIResult -> m ()
setHeader :: MonadCGI m => String -> String -> m ()
output :: MonadCGI m => String -> m CGIResult

--

import Network.CGI

cgiMain :: CGI CGIResult
cgiMain =
    setHeader "Content-Type" "text/plain" >>
    output "Hello"

main :: IO ()
main =  runCGI cgiMain

最終的には IO () を runCGI が返すはずだ。だけど runCGI は m () をかえしている。ここでの m は MonadIO だ IO は MonadIO のインスタンス? だとするとここはあってる。runCGI は CGIT m CGIResult を引数にとる。cgiMain は CGI CGIResult をかえしてる。あれ m は? とおもったら CGIT m か。CGI CGIResult は type を展開すると CGIT IO CGIResult になる。うむ CGIT m CGIResult とマッチする。

setHeader は String -> String をとって MonadCGI をかえしてる。すなわちここでは setHeader が MonadCGI の最初のインスタンスをつくっている (たぶんこのインスタンスが setHeader した結果を保持しているんだろう)。そして、output は m CGIResult をかえしている。m は MonadCGI のインスタンスだ。あれ m CGIResult と CGI CGIResult があってなくないか。data 構築子 CGIT は m a と定義されている。m は MonadCGI。ということは m CGIResult になるな。なるほど。

import Network.CGI

-- 1: cgiMain :: CGI CGIResult
-- 2: cgiMain :: CGIT IO CGIResult
-- 3: cgiMain :: MonadCGI m => m CGIResult
cgiMain :: MonadCGI m => m CGIResult
cgiMain =
    setHeader "Content-Type" "text/plain" >>
    output "Hello"

main :: IO ()
main =  runCGI cgiMain

これでもうごく。ちゃんと整合性とれてる。data CGIT m a のよみかたがわかった。data CGIT は m a と一緒ってことだな。たぶん。

とりあえず型のうごきをみていくと >> のところでモナドインスタンスがうけわたされて処理されているっぽいのがなんとなくわかった。前回の計算結果は捨てているけど、背後でうごめくモナドインスタンスは引き継がれている。ベルトコンベアの比喩も若干わかった。文章にするのはわからないところがわかってそれを理解しようとする試みができて偉大だな。

しかしモナドインスタンスがどうやって計算を保持しているかわからないな。モナドによって保持方法が違うのは想像できるけど、実装はどうなっているんだろう。

まぁそれはおいといて、return もすこし理解できた。上ではでてきていないけど、>>= の右側の関数は m a をかえさないといけないわけだ。でも内部処理した結果がただの String だったりしたときは、モナドでつつみなおさないといけない。そのときん return をつかうとそれをつつんで、次にわたせるってことかな? よしやってみよう。

import Network.CGI

cgiMain :: CGI CGIResult
cgiMain =
cgiMain =
    setHeader "Content-Type" "text/plain" >>
    return "hogehoge" >>=
    output

main :: IO ()
main =  runCGI cgiMain

こうすれば return でつつまれて次の関数に連結され、output に hogehoge がわたされるはずだ。うまくいった。うれしい。


とりあえずつかれた。ここまでやるのに時間かけすぎだ。リストモナドがなんでモナドなのか理解していない。lift は理解できそうもない。Haskell は if も case も let も全く理解していない。まだまだだ……

test :: String
test = "aaa" >>=
      return . toUpper

みたいにかけるのはいいかも

test :: String
test = "aaa" >>=
      \x -> return $ toUpper x

はちょっとださい。


リストもモナドっていうのをたしかめたくて変なコード書いてる。String は Char のリストなのでモナドの演算ができるはず (直接やらないのは String のほうが出力しやすいから) うえのは単に map (\x -> toUpper x) "aaa" と一緒だから良さがよくわからないけど、リストモナドから要素を一個一個とりだして関数適用してるっぽいのはわかったかも。

id:gyuque さんにカロリーメイトのパチモンをもらったのを忘れていた。というか写真も現像してない。どんだけ coderepos 中心の生活なんだ。へたなネトゲよりたのしいコミット。

IMG_61760084

id:higepon さんと mayuki さんにもわたったようだ。

あと、昨日の写真でアップロードできそうなのを探したけどみごとに人がうつっててやめた。肖像権こわい。

IMG_61500085

前半一番後ろに座ってたときのやつがあった。(後半は空気読まず一番前に座ってた)

いい空気だよなぁほんと……いごごちがいい。今回は懇親会で Perl hacker なかたがたの Perl よりの話を聴いた。じわじわ Perl の知識が増えておもしろい。

あと、学校辞めてから生き生きしてるよねとか言われたけれど、まじでその通りすぎる。やらなくちゃいけないことはあるんだけど、そういうのさしひいても毎日楽しいもんなぁ。

は、彩度とかコントラストとかではなくて、なんかちょっとそういう要素とは違う部分にあると思うなぁ。フィルタのかかりぐあい。心の。フィルタの状態の統一感ではないかな

機械的に判断できる部分ではなくて、頭に思い浮かべた像が、統一されているかどうか。

今日は両親と一緒に千石原へ。昨日の台風のおかげで雲ひとつない。写真を90枚ほどとった。1Gbytes ぐらい。

なんか、あれだけど、観光地の飯屋で、まずいところほど罪深いところはないと思う。観光地自体がつまんないのは別にいいと思うけど、飯屋がまずいのはほんとにあれだと思う。そういう店はさっさと滅びるべきだ。想像したらわかるだろうけど、例えばデートとかで「おいしいお店だといいね!」とかいってそういう店屋に入って、「おいしくなかったね」っていう、そういういたたまれなさとか、嫌じゃないか。もちろん二人でならそういったある種の困難、みたいなものがあっても乗り超えていけるだろうけど、べつにそれはどうだっていい。とにかく、そういうまずい飯を出す店っていうのは、根本的に想像力 (あるいは味覚) が欠如しているんだと思う。

なんか USB のメモリリーダが Windows@SC440 で認識しない。いいけど Mac は無線でつないでで遅いから鯖に転送するのがたいへんだ……というかそろそろ鯖の容量がきつくなってきたのでどうにかしたいけどうにもできない。

水芭蕉のことを説明している看板に書いてあったんだけど、なんかちょっと暗い部分があるいいかただよなぁと思った。あと引用だけ書くとどっかの小説にでてきそうだなぁ

というかなんかカップルが結構いて微妙に腹立たしい……と思いきやそうでもなく、なんか今日の自分はいつにも増して妄想力が働いていて、ああ彼らにはこんなストーリーがあったんだろうなぁとか、こんなイベントであんなフラグがたって今ここにいるんだなぁとか考えてにやにやしてたまじきもい。

若い女性の一眼はニコン多いなぁ。キムタク効果なのか単に値段なのかはわからないけど……

Photoshop の現像時のごみとり機能が便利だ。パッチツールみたいなやつだけど、自動で似た色のところを選択するっぽい。いまつかってる一眼がゴミはいってるんだけどどこについているかわからない……開放してとっているときはボケて気にならないけど、絞るとおもっきり写るんだよなぁ

手編みのマフラーというのは、愛情の大きさと継続性をあわせると考えうる限り最強のアイテムなので、安易に使用してはいけない。(別に恋愛に限らず親子愛であれ姉弟愛であれ)

はてなをダサキモということにしておくと、その程度でつかうのをやめるような人を効率的にフィルタリングできるので悪いとはいえない。

「興味を持てるものがありません」とか「うちこめるものがなにもありません」とかと同じで、恥ずかしいと思うなぁ。できるだけオタクでありたいなぁ。オタクっていえるほどまだまだやりきっていないけど、プログラミング言語ヲタでありたい。 (これを自分の口から「そうです」っていうのはかなり勇気のあることだと思う。あらゆる言語をまぁ知っていますよってことだし……)。

一日経ったら削除できなくなる、とか

秋大根は柔らかい/春大根はかたい。春大根は隠し包丁をいれよ

水 -> 大根 -> くしがとおるまで -> しょうゆ/シーチキン -> 15min -> さます

  • やわらかくなるまでは調味料を加えない
  1. トップ
  2. cooking
  3. memo

なんなんだろう。こいつ死ねばいいのになぁ……自分っていう人間とは一生つきあっていかなきゃいけない。やだなぁ……

というまた安易な逃げに走る、という、悪循環

よくわからないのだけれど、昨日、今日と、なんだかめちゃくちゃ眠くてしかたがない。昼からコーヒー飲みまくっているにも関らず、そしてごちゃごちゃとプログラムを書いているにも関わらず、眠い。でも寝ると頭が痛くなる。よくわからない。寝ないと眩暈がする。

「嫌いじゃないけど好きじゃない」
「好きじゃないけど嫌いじゃない」

は違う。


こうすると解りやすい

「嫌いじゃないけど好きじゃない (^^;)」-> リアル
「好きじゃないけど嫌いじゃない (#//)」-> ツンデレ

「ネタなのかどうか、パッと見よくわからない」というネタが好き

あるいは、逆に「パッと見明かにネタなのに、中身は普通」というのも好き

テレビを日常的に見てああいうのに影響されたりする「友達」を多く持つ方々は、さぞリアル生活が充実しているのだろうなぁ。