トップ 最新 追記

U-memo

2006|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|08|
2009|08|10|
2010|02|03|
2011|11|12|
2012|04|
2016|02|
All= / Today= / Yesterday=

2007-05-10 [長年日記]

_ [OCaml] 勉強会

とりあえず手を上げてみないと数は集まらないとか思ったので、 興味のある様子を密かに示すテスト。

_ [Golf][OCaml] Anarachy golf もうダメぽ

rule30 はもう無理。maze もたぶん無理。

128bits は概ね予想通り(というか 111B が様相が違ったのにむしろ驚き)。 うちに IA-32 の環境が無いから、まぁ。


2007-05-11 [長年日記]

_ [Golf][OCaml] Rule30

ああ、なんてひどい...


2007-05-13 [長年日記]

_ [雑記] coLinux メモ

手元の環境はWinXP。

http://www.geocities.jp/error_storm/ とか http://eto.com/d/coLinuxInstall.html とか shinh さんのメモとか参考に。

  1. 本家 から coLinux-0.7.1-pre-release をダウンロード (何故安定版にしない)
  2. インストール。なんでもいいから Debian を選択。
  3. debian イメージ(bz2)を展開
  4. example.conf を書き換え。
  5. ショートカットを作る。こんなの。"C:\Program Files\coLinux\colinux-daemon.exe" -t nt "@C:\Program Files\coLinux\default.conf"
  6. もともとあるローカルエリア接続の詳細設定でインターネット共有
  7. ウィルスセキュリティのファイアウォール設定から coLinux な IP アドレスを例外設定

conf はコメント部分を除いたらこんな感じ

kernel=vmlinux
cobd0="c:\Program Files\coLinux\FS\Debian-3.0r2.ext3-mit-backports.1gb"
root=/dev/cobd0
ro
initrd=initrd.gz
mem=128
eth0=tuntap

2007-05-14 [長年日記]

_ [雑記] Jaz ドライブ死亡

すでに iomega では生産してないのか。

もうそろそろやばいだろうと思って Jaz メディアから別のところへの バックアップをとっていたんだが、間に合わなかった。 メディアをローディングできなくなった。

あと1つだけバックアップを取れなかったが、ま、いいか。

_ [雑記] 理論を知らない凡人のたわごと

片方が無限あるいは超絶に評価時間のかかる関数をどうするかって 話のようですが、 g() が例外を返す関数だったときには por は何が起こるべき?

表示的意味論では例外を無視して true を返す、ということ? 「計算可能」のところに例外を除外することが意図されてるのかな?

例外は false でも true でもない第3の状態という感覚なんですが、 理論ではどう扱われてるんでしょうね。

(追記)

  • f=true, g=例外 のときは C でも OCaml でも (f || g) は true。(gは評価されないから)
  • f=例外, g=true のときは C でも OCaml でも (f || g) は 例外。
  • f=例外, g=true のときは (f por g) は true なのか?

単純例外だと話は簡単かもしれないけど、f, gともに副作用を持つときには、どういう挙動が期待されるんだろう。 評価せずには (f por g) の値は決まらないわけで...。

要するに私の疑問は、 (f || g )は評価順序も込みで定義されてるから g が何であっても f が true なら一意に動作が決まるんですが、(f por g)での f, g はどういう評価モデルなんですか?、です。

例外を持ち出すんじゃなかった。

_ [Golf][OCaml] やはり負ける rule30

途中経過を一挙公開。

let s=read_line()^"  "let rec f i p r q=print_string(match p,q,r with '#',' ',' '|' ','#',_|' ',' ','#'->"#"|_->" ");f(i+1)q(s.[i])r;;f 1' ''#'' '
let s="  "^read_line()^"  ";;for i=0to 9999do print_char(match String.sub s i 3with"#  "|" ##"|" # "|"  #"->'#'|_->' ')done
let s="  "^read_line()^"  ";;for i=0to 9999do print_char(match String.sub s i 3with q when"   "<q&q<"# #"->'#'|_->' ')done
let s=" "^read_line()^"  "let rec(^)i u=print_char s.[Obj.magic("   "<u&u<"# #")];i+1^String.sub s i 3;;0^"  #"
let s=" "^read_line()^"  "let rec(^)i u=print_char s.[Obj.magic("   "<u&u<"# #")];i+1^String.sub s i 3;;0^s
let c=ref 0;;String.iter(fun s->c:=!c/2+Char.code s/33*4;print_char" ## # # ".[!c])(read_line()^"  ")
let s=read_line()^"  "let rec(^)i u=print_char" ## # # ".[u];i+1^Char.code s.[i]/33*4+u/2;;1^4

最後のをほとんどそのまま移植したのが C の 77B。


2007-05-17 [長年日記]

_ [雑記] たわごとの続き

単純に書くのは無理で(かつマクロでストレートに書くのも無理だなぁ)、

  • f, g のラッパ関数を起こしてー
 f_wrap(){ *status_f = f() ? TRUE_END : FALSE_END ;}
 g_wrap(){ *status_g = g() ? TRUE_END : FALSE_END ;}
  • pthread_create で f_wrap, g_wrap それぞれのプロセスを生成、
  • メインスレッドでは status_f, status_g を監視して TRUE_END したら残りのスレッドを cancel して終わり

みたいな感じ?

逐次処理ではどうにもならないよなぁ。

_ [OCaml] OCaml本 来週発売

近くの本屋に並んだら買う可能性は高いな。

# 目次の 6章、Lasy じゃなく Lazy では。


2007-05-18 [長年日記]

_ [OCaml] 手続き脳

SICP の ex 1.29 (シンプソンの公式)、素で以下のコードを書いた。 (コードがSICP本文の流れにそぐわないのは無視して)

let simpson f a b n =
  let h = (b -. a)/. float n in
  let rec simpson_o f i =
    if i<n   then 4. *. f(h*.float i+.a) +. (simpson_o f (i+2)) else 0. in
  let rec simpson_e f i =
    if i<n-1 then 2. *. f(h*.float i+.a) +. (simpson_e f (i+2)) else 0. in
    (f a +. f b +. (simpson_o f 1) +. (simpson_e f 2)) *. h /. 3.

実行すると

> print_float (simpson (fun x->x*.x*.x) 0. 1. 100000)
Stack overflow during evaluation (looping recursion?).

初心者にはループ構文や副作用の無い関数型言語は難しいと思うよ(八つ当たり

この例では末尾再帰になってないのは (わかってる人には)一目だけど、 もう少し複雑になると末尾再帰(をループに最適化してくれる) かどうかわからなくなって、 あるとき stack overflow と言われるとなぁ。

# 実地では例外を絡めたときにはまった


2007-05-21 [長年日記]

_ [Golf] あなごる シェルピンスキー

C で書いてみたけど OCaml 版と同程度の 170B 前後。 明らかに何かが全く違う。

二重ループとか printf 3個(うちひとつはputsに出来るが)とかは明らかに無駄なんだけど、何か巧妙な手があるのかねぇ。

# OCaml で対処したら余計延びただけに、根本から違うかも。

_ [Golf][OCaml] あなごる Hamming数

ようやく追い付いたー!

statistics が同じなので変数名以外同じですねきっと。

ここの日記の検索ワードに Hamming数が結構あるみたいだけど、 ネタばれしたほうがいいんかな。


2007-05-25 [長年日記]

_ [雑記] えー?

住井先生さんって私よりも若い?(勝手な思い込み

# でも「くん」て。無理ですって。


2007-05-28 [長年日記]

_ [OCaml] 入門OCaml

# 本が出る直前に OCaml 自体が 3.10 にバージョンアップしている罠。

買った。

斜め読みした。

「入門」と言いながら OCaml のいろいろな(ほとんどの?) 機構をつまみ食いして(camlp4の話題まで出てくるよ)、 実用指向しているなぁ、という印象 (それでいて入門レベルに収まってるような)。 「細かい理論なんかはどうでもいいからとりあえず使いたい」人むけ。

ただ、さすがに他の言語を全く知らないと読めないだろうな。

個人的な不満点:

  • デバッガとかプロファイラの説明がないなー
  • C との連携の具体的な例が欲しかった orz
  • ocamldoc っていうか、マニュアルの読み方みたいなのがー。

校正

  • 索引が一部まちがってる (って見つけたのは「日本語部分」×123 ○125 だけだが)
  • p148 「多重(たじゅう)継承」なぜここだけルビじゃないのか
  • p36 ×最期 ○最後

2007-05-29 [長年日記]

_ [雑記] 境界表現に関する非プロのたわごと

nihaさん経由 ockeghem(徳丸浩)の日記

それと、ワンライナーたちは、「i <= 100」ではなくて「i<101」とする例がほとんどですが、こうする理由は1文字減るからでしょうね。ですが、書法としてはまずい書き方ですよね。

FizzBuzz の場合はまずいと思いますが一般論としてはどうか。

int foo[100];

for(i=0; i<100; i++){
  foo[i]=hoge;
  ...
}

のときに(マジックナンバーを使うのはさておいて) i<=101 なんて 書かないと思うわけです。

int foo[BUFSIZE];

for(i=0; i<BUFSIZE; i++){
  foo[i]=hoge;
  ...
}
  • FizzBuzz は (1から) 100 まで処理するから i<=100
  • (0から始まる)配列処理は100個処理するから i<100

と意味のある数字(もしくはそのマクロ置換など)を配置して不等号が あとから決まるんじゃないかしら。 境界値の意味を考えましょう、というベタな到達点かも。

OCaml さんではそもそも凝った書き方は出来ないので fizzbuzz なら

for i=1 to 100 do 〜 done

で決まり。

配列処理なら for loop で危険な末尾境界条件なんか書かずに、 Array.iter (map) すればおわりだからなぁ。 こういうとこでも安全性は出ているのかもね。