2007-05-29
■ [softs] Firefoxの許せないところ
- about="_blank" が新規ウィンドウで開く。お前はそれでもタブブラウザか。
- C-hで履歴が開く。いやWindows版は仕方ないとしても、せめてLinux版はBackspaceとして振舞ってくれよ。
いやまあTab Mix Plusを入れればいいんですけど、 「新規ウィンドウを開かない」くらいデフォルトでできてほしい。
■ [ruby] それany?で
link_exist = (doc/:a).any?{|a| a[:href] == 'http://example.com:3000'}
最初「それfindで」というタイトルにしてて、書いてる途中でany?のことを思い出したのは秘密。
あとEnumerable any?で検索するとるりまが一番上に 来ますね。リプレースはすでに始まっているのだ。
■ [Ruby/SDL] 等幅フォントじゃないと点数表示がぐらぐらして鬱陶しいんじゃね?という指摘
http://blawat2015.no-ip.com/~mieki256/diary/200705274.html#200705274S1
その発想はなかった!確かにそうだなぁ。
「"」の分割問題については、ご指摘の通り「ひとつ多かったら " が分かれているものと見なす」という方針にしました。 というか、頑張ってアルゴリズムを考えるよりも、簡単に確認を行えるようにしておいて人間に判断してもらうというアプローチの方が良さそうです。
1文字ずつ画像を作るのは面倒だから駄目です(笑)。いや、そういう仕様にしても 人によっては使ってくれると思うんだけど、それはその人の時間を無駄に消費させている気がしてやだ。
とか書いてる暇があったらリリースしないと…。[たぶん明日やる]
■ [ruby] いまさらFizzBuzz
puts (1..99).map{|i| fizzbuzz = (i%3==0 ? "Fizz" : "") + (i%5==0 ? "Buzz" : "") fizzbuzz.empty? ? i.to_s : fizzbuzz }
面接で「学生時代に力を入れたことは何ですか」だの聞かれるより、FizzBuzzのコードを書かされる方が100万倍いい。
■ [prog] 関数型プログラマはプログラムを木だと思ってるらしい
gauche.nightで出た話題だけど、関数型プログラマはプログラムを木だと思ってるらしい。
(car (string-split (string-reverse (string-upcase str)) "\n"))
うん、これは木だ。
head $ lines $ reverse $ upcase str
Haskellだと $ があるから見た目はネストしてないけど、実際には関数に関数の返り値を渡している。
そう、関数型プログラマは関数呼び出しの中に関数を書くことに抵抗がない。でもC言語とかだとさ、 関数呼び出しの中に関数って書かないじゃん、普通。すごく短いやつを除けば、だいたい一旦変数に代入するでしょ。
そのへんの違いが関数型言語を学ぶときの抵抗になってるのかなぁと思った。
そういう目で見れば、Rubyのメソッドチェーンは 「木構造を使わずに関数的な処理を書くための発明」っていう風に見えてきませんか?
str.upcase.reverse.to_a.first
■ [befunge] befunge-wiki
これはやべぇwwwwwwwwwwwwwww思わずbefungeカテゴリを新設した。
ていうかBefungeで書かれた実用的なアプリケーションという意味では世界初だったりしないすかね?
■ [net] 自宅サーバの台数
えーと、その母集合だと明らかに平均は1未満かと(笑)。
ていうか、自宅サーバを2台以上持つっていう発想が無かったよ。 KMCでも何人かサーバ立ててるけど、みんな1台だと思う。
ちなみにうちのサーバはMac miniですけどまだ何も動かしてないし外から見えません(それを人はサーバと呼ばない)。
■ [net] LDR
登録フィード数: 497件
あと3つで500。っていうかさっき4件ほど追加したからもう500超えたか。
僕はPCかMP3プレーヤーでしか音楽を聴かないので、聴きたかったCDがCCCDだと非常にがっかりする。 CCCDで発売するっていうのは、僕にとっては発売しないのと同じだ。
…っていうのと同じで、SubscribeしようとしたブログがRSSを出力してないとがっかりするようになりつつある(はいはいそれPlaそれPla)
■ [scheme] 熟練したScheme使いは再帰を書かない
いや書かないは嘘だけど、リストを扱う関数が充実してるので自分で再帰してどうこう…っていうのは あまりしなくていいことが最近分かってきた。例えばfoldとか。
あとGaucheには何をするにも低水準(高パフォーマンス)と高水準(使いやすい)のAPIが用意してあって、 「LispはもうひとつのC」を連想した。
■ [ruby] 継続についての記事を書こうと思って早3ヶ月
人はこれを[あとで書かない]と呼ぶ。
じゃなくて、えーと、YARVに継続が入った記念に概略だけ書くと
- 継続は「プログラムの残りの部分」のこと。
- すごく直感的に言うと、RPGにおけるセーブポイントみたいなのを想像するといい。宿屋の主人に話しかけると「現在の状態」をセーブできる。ダンジョンを探索中に「ロード」すると、セーブした瞬間からゲームをやり直せる。
- 継続ってSchemeとかRubyでしか使えないんでしょ?
- →これは誤解。「プログラムの残りの部分」なんだから、「プログラムあるところに継続あり」。
バトー、忘れないで。あなたがプログラムを書くとき、継続は必ずあなたの側にいる。
[http://tsukimi.agusa.i.is.nagoya-u.ac.jp/~sydney/ocaml/index.php?%B7%D1%C2%B3より引用]
- じゃあSchemeやRubyは何が違うのよ?
- →call/ccがあるのが違う。これはcall-with-current-continuationの略で、RPGで例えると どこでもセーブできる みたいなもん。宿屋でもダンジョンでも戦闘中でも。
- call/ccを呼ぶと、「call/ccを呼んだ瞬間」をセーブした継続オブジェクトがもらえる。この継続オブジェクトを実行すると、セーブしたところからプログラムが再開される。
- call/ccがあると何ができるんでしょうか
- 関数的setjmpというか、λ計算的gotoというかなんというか
- 実行順序を好きなように蹂躙できる。メソッドを超えてジャンプできる点でgotoより遙かに凶悪。諸刃の剣。
- 代表的な使い方としては、「プログラムをちょっとだけ止めてあとで再開する」ってのがある。
- ザ・ワールド
- Rubyのyieldが自前で実装できる。とか。
- 「継続渡し」っていうのはcall/ccと関係ある?
- ありません。別物です
- 任意の再帰関数は「プログラムの残りの計算」を引数にとるように書き換えることで末尾再帰にできる。という定理があって、この書き換えがCPS変換と呼ばれています*1。CPSは「Continuation Passing Style(継続渡し形式)」の略ね。
- 継続のRubyでの利用例
- 時を止めるやつ
- コルーチン (ゲームのイベント部分の記述に使ったことあり。効果大。)
- Webアプリ
- 実行順序を操作するやつ
- ppp
- yuguiさんのやつ (これってtransactionをネストして呼び出すのでは駄目なんかな)
- 既存の CGI をそのまま FastCGI 対応に
- SICPのamb (いやRubyじゃないけど、oxy君が書いてたような)
- 時を止めるやつ
継続の弱点はやっぱり慣れないと非常に読みにくいっていう点だと思う。変数名を工夫するとかメソッドにラップするとかしないとな。
あと継続を理解するにはjsSchemeのソースを追っかけるのが良かった。内部構造を見れば、「ああこれが継続か」って思うよ。たぶん。
*1 合ってます?