id:gyuque さんにカロリーメイトのパチモンをもらったのを忘れていた。というか写真も現像してない。どんだけ coderepos 中心の生活なんだ。へたなネトゲよりたのしいコミット。
id:higepon さんと mayuki さんにもわたったようだ。
あと、昨日の写真でアップロードできそうなのを探したけどみごとに人がうつっててやめた。肖像権こわい。
前半一番後ろに座ってたときのやつがあった。(後半は空気読まず一番前に座ってた)
id:gyuque さんにカロリーメイトのパチモンをもらったのを忘れていた。というか写真も現像してない。どんだけ coderepos 中心の生活なんだ。へたなネトゲよりたのしいコミット。
id:higepon さんと mayuki さんにもわたったようだ。
あと、昨日の写真でアップロードできそうなのを探したけどみごとに人がうつっててやめた。肖像権こわい。
前半一番後ろに座ってたときのやつがあった。(後半は空気読まず一番前に座ってた)
いい空気だよなぁほんと……いごごちがいい。今回は懇親会で Perl hacker なかたがたの Perl よりの話を聴いた。じわじわ Perl の知識が増えておもしろい。
あと、学校辞めてから生き生きしてるよねとか言われたけれど、まじでその通りすぎる。やらなくちゃいけないことはあるんだけど、そういうのさしひいても毎日楽しいもんなぁ。
は、彩度とかコントラストとかではなくて、なんかちょっとそういう要素とは違う部分にあると思うなぁ。フィルタのかかりぐあい。心の。フィルタの状態の統一感ではないかな
機械的に判断できる部分ではなくて、頭に思い浮かべた像が、統一されているかどうか。
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" と一緒だから良さがよくわからないけど、リストモナドから要素を一個一個とりだして関数適用してるっぽいのはわかったかも。
勉強するものじゃない。
ホットエントリとか、そういうののブクマコメをよんでいて感じる気持ちって、うまく表現できない。俺がいままで思っていたよりも、俺と決定的に合わない人っていうのは、多いんだなぁと、近頃、特にここ三ヶ月ぐらいは、感じる。
やっとこの部分が実感できた。やっぱちゃんと書いてみるってのはてっとりばやいなぁ。IO モナド以外はうまくイメージできてないけど……
っていうのを前に書いたのを思い出した。基本的に独りでできることは独りでやるべきだと思う。
と同時というか、ここ最近なんとなく思いうかべていたのはカブスカウト (ボーイスカウトの小学生の部) の定めにある
の二つ (全部で五つある)。
いろんなことは互いのバランスでできているから、例えば「していいよ」と言われてもしてはいけないことはたくさんある。こんなのすごく、すごくあたりまえのことだと思う。
http://www.nicovideo.jp/watch/sm1489464
これすごいなー。ちょっと腹の底からグっとこみあげてくる感動があるなぁ。こういう技術っていいなぁ。
こういうのみるたびに、コーディングってライブ感がなくてすげー地味だなーって思ってしまう。ライブコーディングとかも、わかる人にはわかる、っていうレベルの面白さだもんなぁ。わかるひとだけわかるっていうがどっちかっていうと好きだから (大衆受けしても大抵ろくなことにならないから) いいんだけど、たまにちょっと切なくなる。
映像的なプログラミングだってもちろんあるわけだけど、どうもそういうふつーにウケる、みたいなのをやる気にならない。表面的な面白いことと裏側的な面白いことを組みあわせたらいいんだろうけど、表面的な面白さにしか気付かない人を見るとかなり切なくなるし話かけられるのも嫌だし、それだったら最初っから難解で気付く人が気付けばいいと思えてしまう。なんかおれは気持ち悪くひねくれてるいるんだなぁ……
うえの動画だって、おれは絵のことを良く知っているわけじゃないから、知っていればわかるような面白さに気付けていないんだろうなぁ。
言語は英知の固まりだ
時間かけてやれば Haskell だって理解できるのではないかと思ってしまう。勘違いだ。
今日は Wikipedia で圏論の項を一応じっくり読んでみたけどほんと全然理解できない (Haskell を理解する上では必ずしも必要ではないとは言われているけど、やっぱり背景をしっておかないと真に言語設計者の意図は感じとれないと思う)。というのもそもそも数学的なことを考えるうえで必要な教養を全く持ちあわせていないせいなんだけど、数学は独学すると危険な香りがするからうかつに手を出せない感 (だからといって先生に教えてもらう、っていうのは、そういうタチではないのを身を持って知っているので独学でやるしかないんだけど) なんか数学コンプレックスみたいだ。頭悪いの実感するから苦手なんだよなぁ。
だめだこれやめたほうがいい泥沼になっていく。数学勉強してる人にバカにされる。おめーみたいなバカが理解できるわけねーだろってゆわれる。(ぼくは高校数学すらほとんどやってない。具体的にいうと高校二年の文理選択のときに全ての数学科目を捨ててる。)
時間ないよなぁ。例えば、いくら金持ちだったとしても、世界中の国のあらゆる場所のよいところを知ることはできない。住んでみないとわからないことがあまりにも多いからだ。金で時間は絶対に買えない。金で経験は買えない。
時間たりないなんていうくらいなら、ずっとやりつづけろとは思うけれど、そういうのもできない。だめ人間すぎるのだなぁ……
それにしても、本当に大学は無駄だった。ひきこもって独学してたほうが数百倍素晴らしい生活ができたよなぁ。DAIGAKUSEI むかつく。みんな死ねばいい。DAIGAKUSEI だけじゃない。もっと広い範囲で、全くあわない人たちは多すぎる。今の季節の夜に外へ出て鼻腔を広げ冷たい空気とともに秋の匂いを肺一杯に感じるようにしている人達と一緒にいたい。それができないなら死んだほうがマシだ。
脊髄反射でニヤニヤしながら「それって違うよね~w」みたいなのをいうやつは頭が本当に悪い。たとえばおれとかだ。それを他人がやっているのを見ると自分を見てるみたいで余計むかつく。直したい。
洗濯機へ消えていった女の子が悩んでいた間、君はいったい何をしていたっていうんだ?
はてキだと単射は 1:1 で対応がとれているやつって書いてあるなぁ。わかりやすいけどそういうことなのか。
http://ja.wikipedia.org/wiki/%E5%85%A8%E5%B0%84 に図があった。わかりやすい……
なんだかんだいって、今までは青春をどこかで感じていたのか、ごくごく最近になって、青春性みたいなものを感じられなくなってきている感じがする。学校的なもの、女学生的なものを身近に感じず、遠くのどこかにあるもう絶対に手が届かない何か、ファンタジーのようなもの、という実感が心に浮いている。
二日連続で夢をみて、二日連続で学校 (高校) がでてきた。
PHP を たにんに すすめる というのは ぜったいに ありえない。
日記再読してたらなんかこみあがってくるものがあって、そんな自分に dnbk
デジャヴが多すぎる。そしてデジャヴのあとのあの、なんともいえない不安感、これからよくないことが起きる予感、みたいなのが、おなかのほうに流れこんでくる。
本番反映が思ったよりはやかった。どうせやるんだから別にいいんだけどちょっとびっくり。
コピペメモ
今までの $X は evaluate を二回する問題があってダサいので、使い勝手をそのままにしつつ新しくして使いはじめました。
あんまり type 指定するの好きじゃないので (めんどい) 基本的に指定しなくても問題ないように
(長いのでまだ変更するかも)
// $X(exp);
// $X(exp, context);
// $X(exp, type);
// $X(exp, context, type);
function $X (exp, context, type /* want type */) {
if (typeof context == "function") {
type = context;
context = null;
}
if (!context) context = document;
var exp = (context.ownerDocument || context).createExpression(exp, function (prefix) {
var o = document.createNSResolver(context).lookupNamespaceURI(prefix);
if (o) return o;
return (document.contentType == "application/xhtml+xml") ? "http://www.w3.org/1999/xhtml" : "";
});
switch (type) {
case String:
return exp.evaluate(
context,
XPathResult.STRING_TYPE,
null
).stringValue;
case Number:
return exp.evaluate(
context,
XPathResult.NUMBER_TYPE,
null
).numberValue;
case Boolean:
return exp.evaluate(
context,
XPathResult.BOOLEAN_TYPE,
null
).booleanValue;
case Array:
var result = exp.evaluate(
context,
XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
null
);
var ret = [];
for (var i = 0, len = result.snapshotLength; i < len; i++) {
ret.push(result.snapshotItem(i));
}
return ret;
case undefined:
var result = exp.evaluate(context, XPathResult.ANY_TYPE, null);
switch (result.resultType) {
case XPathResult.STRING_TYPE : return result.stringValue;
case XPathResult.NUMBER_TYPE : return result.numberValue;
case XPathResult.BOOLEAN_TYPE: return result.booleanValue;
case XPathResult.UNORDERED_NODE_ITERATOR_TYPE: {
// not ensure the order.
var ret = [];
var i = null;
while (i = result.iterateNext()) {
ret.push(i);
}
return ret;
}
}
return null;
default:
throw(TypeError("$X: specified type is not valid type."));
}
}
もうう、すべきことがぜんぜんできない。仕事全然すすまない……
強いたげられて生きているほうがあってるみたいだ。慣れちゃったんだなこういうのに
よくわからない。ハマるとかハマらないとかいうものなのかな。例えば「はてダにハマる」とか「LDR にハマる」とかいわないように、「twitter にハマる」っていうのには違和感を感じる。「mixi にハマる」も違和感がある。なんだろう。何にハマるんだろう。
捨てネコらしきネコが家の庭にきていすわって対処に困っているのだけれど、いろいろありつつ飼うことになりそうな流れになっている。とかいう感じで名前つけるならなんだろうなぁ、とか考えてマリーとかどうよとか思ってたんだけど、なぜか名前の話なんて全くしていないのに母親と案がまるかぶりした。
余談ですが、今メインでつかっている MacBook のマシン名が Mary です。母親はマリーゴールドからとったようです。
バズワード化してる。もとからかw
ひさしぶりに何か想像を書こうと思ったのだけれど書けなかった……
黄金の鐘の歌詞があとかたもない。ハレルヤのところより看守は奴隷にパンを売りつけのところがなくなったのがすげー残念だなぁ。
なんかこう、ずっとひっかかってたけど、門田氏とRitaさんが微妙に唄いかたが似てることに気付いた。黄金の鐘聴いてて思った。
なんかくせになってきた。これすごい好きだ。「捨てたものを~」のところが鳥肌たつぐらい好きだ。
CD はずすと曲目と一緒に年号(のような4桁の数字)が書いてあるけど、これなんだろう。