ToDo:
http://d.hatena.ne.jp/camlspotter/20091026/1256567062
http://twitter.com/shinh/status/5194338611
http://twitter.com/shinh/status/5194346481
さて読もう!
08049860 <camlDame_rev__dame_rev_58>: 8049860: 83 ec 04 sub $0x4,%esp 8049863: 89 c1 mov %eax,%ecx # なんか知らんが第一引数は eax なのかね… 8049865: 83 f9 01 cmp $0x1,%ecx # なんか知らんが nil の内部表現は 1 なのかね… 8049868: 74 46 je 80498b0 <camlDame_rev__dame_rev_58+0x50> 804986a: a1 40 b5 05 08 mov 0x805b540,%eax # 0805b540 B caml_young_ptr なんだこれは! とりあえず GC 関係ぽい。 young って世代別とかそいうやつかいな 804986f: 83 e8 0c sub $0xc,%eax # なんか知らんが値減らして保存しなおしてるみたいだ! 8049872: a3 40 b5 05 08 mov %eax,0x805b540 8049877: 3b 05 44 b5 05 08 cmp 0x805b544,%eax # 0805b544 B caml_young_limit 804987d: 72 3a jb 80498b9 <camlDame_rev__dame_rev_58+0x59> # これの行き先が GC なので、まぁ GC 関係 804987f: 8d 58 04 lea 0x4(%eax),%ebx # ここから本番。なんかたぶんリストの確保が終わってて ebx に入るのですよ、たぶん 8049882: 89 1c 24 mov %ebx,(%esp) # たぶんこれがいま ebx=[] 8049885: c7 43 fc 00 08 00 00 movl $0x800,-0x4(%ebx) # (%eax) じゃないのか悩むが謎の定数を元の eax のところに入れてて、うーんこれはなんだろう 804988c: 8b 01 mov (%ecx),%eax # x を eax に入れた 804988e: 89 03 mov %eax,(%ebx) # ebx=[] の car を [x] にした 8049890: c7 43 04 01 00 00 00 movl $0x1,0x4(%ebx) # ebx=[] の cdr に 1 (やっぱ nil やね) をつっこむ 8049897: 8b 41 04 mov 0x4(%ecx),%eax # xs を eax に入れて 804989a: e8 c1 ff ff ff call 8049860 <camlDame_rev__dame_rev_58> # 再帰呼び出し 804989f: 8b 1c 24 mov (%esp),%ebx # スタックに置いておいた [x] を持ってきた 80498a2: 83 c4 04 add $0x4,%esp 80498a5: e9 16 08 00 00 jmp 804a0c0 <camlPervasives__$40_167> # 0x40 は '@' なのでまぁそういうことだろう 80498aa: 8d b6 00 00 00 00 lea 0x0(%esi),%esi # 何これここ来ることあるんか!!! → とりあえず gdb で break しかけても止まらない。 80498b0: b8 01 00 00 00 mov $0x1,%eax 80498b5: 83 c4 04 add $0x4,%esp 80498b8: c3 ret 80498b9: e8 3a d7 00 00 call 8056ff8 <caml_call_gc> 80498be: eb aa jmp 804986a <camlDame_rev__dame_rev_58+0xa>
わかったことは引数は eax, ebx と入れて渡す呼び出し規約だということだった。 あと GC まわりのコードはこれだけではよくわからん。 てか [x] のために allocate ぽいことしちゃうのはちょっといけてないなー
さて次は @ を読もう!
0804a0c0 <camlPervasives__$40_167>: 804a0c0: 83 ec 04 sub $0x4,%esp 804a0c3: 83 f8 01 cmp $0x1,%eax # 第一引数がカラだったらさっさと終わろうね☆ 804a0c6: 74 48 je 804a110 <camlPervasives__$40_167+0x50> 804a0c8: 8b 50 04 mov 0x4(%eax),%edx # 第一引数の cdr 804a0cb: 8b 08 mov (%eax),%ecx # 第一引数の car 804a0cd: 89 0c 24 mov %ecx,(%esp) # car の方は保存しておいて 804a0d0: 89 d0 mov %edx,%eax # cdr の方を次の関数 call の第一引数にして 804a0d2: e8 e9 ff ff ff call 804a0c0 <camlPervasives__$40_167> # 再帰! (ebx=第二引数は触ってないのでそのまま) 804a0d7: 89 c1 mov %eax,%ecx # 帰ってきたリストを ecx に。この時点で第二引数はくっついてるはず 804a0d9: a1 40 b5 05 08 mov 0x805b540,%eax # また GC ゾ〜ン 804a0de: 83 e8 0c sub $0xc,%eax 804a0e1: a3 40 b5 05 08 mov %eax,0x805b540 804a0e6: 3b 05 44 b5 05 08 cmp 0x805b544,%eax 804a0ec: 72 28 jb 804a116 <camlPervasives__$40_167+0x56> 804a0ee: 8d 40 04 lea 0x4(%eax),%eax # まぁこれで eax にカラリストが入ったんだろう 804a0f1: c7 40 fc 00 08 00 00 movl $0x800,-0x4(%eax) 804a0f8: 8b 1c 24 mov (%esp),%ebx # 保存しておいた car の方を 804a0fb: 89 18 mov %ebx,(%eax) # 確保したカラリストの car に入れるよ 804a0fd: 89 48 04 mov %ecx,0x4(%eax) # cdr は帰ってきた値ね 804a100: 83 c4 04 add $0x4,%esp 804a103: c3 ret 804a104: 8d b6 00 00 00 00 lea 0x0(%esi),%esi # また使われてなさそうなコードがあるね… 804a10a: 8d bf 00 00 00 00 lea 0x0(%edi),%edi # また使われてなさそうなコードがあるね… 804a110: 89 d8 mov %ebx,%eax # ここは第一引数がカラリストだった場合なので、単に第二引数をかえせば良い! 804a112: 83 c4 04 add $0x4,%esp 804a115: c3 ret 804a116: e8 dd ce 00 00 call 8056ff8 <caml_call_gc> 804a11b: eb bc jmp 804a0d9 <camlPervasives__$40_167+0x19> 804a11d: 8d 76 00 lea 0x0(%esi),%esi
ええとこれは… 正直どうしてこうなった…と思ってしまうな… これが関数型かー
何が言いたいかというとなんで list を append するのに allocation が大量発生してるんだよ! っていう
でまぁどう見ても O(n^2) でしかないので、 まぁ GC でこんだけ遅くなるのかなぁ。
(15:31)
http://risky-safety.org/~zinnia/d/2009/10/#20091021-t0-h1-p3
個人的には topcoder とかならまだゴルフの方を真剣にオススメするのですが。 問題がまだ現実世界に近いという意味で。
id:sumim さんがやっておられるように、 ブログとかで話題になってる問題を解いてみるってのは結構いいなぁと感じます。 あとたまに wikipedia とかにのってるアルゴリズムを 実際に書いてみるとかするんですが、そいうのもいい気がしています。 こないだ mutex 書いてたのはまさにそんな感じ。
http://d.hatena.ne.jp/shinichiro_h/20091018#1255797222
(01:27)
本当は瞬間移動の指輪と瞬間移動制御の指輪も欲しいね。
(01:35)
http://d.hatena.ne.jp/Hamachiya2/20091022/literacy
昨日はこれを一通り見て色々思ったのだった。 なんというか、表現が難しいんだけど。
まぁこれを見た時のインターネットパワーユーザ的な人とか、 良いサービスは課金されて当然と思ってるような 世代の人とかの反応はまぁ、 ゆとり乙という感じだと思うんだけど、 まぁそれはそれでいいと思う。
ただなんか、色んな意味でサービス提供側というか 彼らが客になりうる、プログラム書く系の人が これはひどい的なことを言うのは、 まぁ気持ちはわかるけどあぶなっかしい面もあるかなぁという。
全員をひとくくりにはできないけど、たぶん彼らの多くは 良質なサービスがインターネット上で無料であることに慣れていて、 かつそのサービス提供側の中に無料でサービス提供しつつも 金儲けに成功してる会社が結構な量あること、 その多くが広告収入であることを知ってるんじゃないかなと思う。
でまぁそいう良質でかつ無料で使えるサービスなんてのは 今後も別に減りゃしない気がするので、 そいった人々は今後も同じような考えを持ち続けるんじゃないかなーと思う。 あっちは広告で金稼いでて無料なのに なんでこっちは金取ろうとしてるの? 広告でもうけられるはずじゃないの? 的な。
でまぁ今が過渡期で「リテラシ」と呼んでるものが浸透して そういう人々の人口が減るって前提ならまぁいいんだけど、 僕はあんま減らなくてむしろ増えるんじゃないかなぁとか思っていて。 その前提ではこの人達がネット慣れしてないんじゃなくて、 僕たちが古いネットにだけ慣れしていて 最近のネットの感覚に慣れてないって話なんじゃないかなぁと思う。
でまぁ普通は別に感覚のズレがあってもあんまり問題ないんだけど、 少なくとも自身よりコンピュータとかネットとかに詳しくないであろう 彼らを客とする身分である以上、 単にコイツらリテラシ足りねえプギャーとかで片付けるのは まぁなんか違うんじゃないかなぁと。
サービス提供側は今のユーザはこいう感じだからどうもうけようか、 って考えるとか、 プログラマは今のユーザはバグとかあんま牧歌的に許してくれないから ちゃんと作ろうって考えるとか、 まぁそっち系の考え方をする方が安全な気がした。
そういうことを思った。
(11:13)
出張から帰ったら動かせる程度になってると良いのう。
実装はだいたい終わった気がするので、 あとは70言語とかいうフザけた数の復元か… 酒でも呑みながらやれば割とすぐ終わるとは思うけど
(01:32)
18言語か…
それと basic と erlang がそれぞれヘンなことしてて setpgid とか setsid 呼んでて warning が出るのがキモいなぁ。 はてさて。
結構テストだけ書いたら通ってた系のが多いのはありがたいけど。
うーん現ゴルフ場の maxima の exec count 間違ってそうな気がするんだけどいいのかな。
(02:10)
sin-x さんに教えてもらう。
http://ja.wikipedia.org/wiki/対関数
よく整数2つの点とかの hash 値をどう計算するか悩むわけなんだけど、 本質的にこの関数はちょっと遅そうだけど、悪くないかも、ね。
ちょっとやってみた。 適当な値域の乱数のペアを大量に作って適当に突っ込む。
http://github.com/shinh/test/blob/da1e28b9fd201ca2d203d3e187cc280e9a8b9f9a/bijection_hash.cc
ハッシュ関数としては単なるかけ算、 よくある x + y * prime みたいなヤツ、 それとこの対関数、をそれぞれ使ってみた。
最初の立ち上がり部分は値域がほぼ埋まってるのであんまり関係ない。
て感じですかね。
(00:10)
http://svnsearch.org/svnsearch/repos/WEBKIT/search?start-index=20&logMessage=hamaji
これをみるとパッチ数がわかるうえに なんかかっこいいグラフとかがついてていいみたいだ。
Chromium の方はコミッタになる前のが入らんのが微妙ね。 9月ゼロってすごいな
(04:33)
http://d.hatena.ne.jp/camlspotter/20091020/1256049332
via http://twitter.com/chunjp/status/5021818819
これ全然動かないのはなぜなんだろう…
let failwithf fmt = Printf.kprintf (fun s -> failwith s) fmt;;
に変えたらうごいた。 ああ第一引数が (string -> 'a) だから (fun s () -> failwith s) でも unit を取る関数が帰ってるってことなのか。
てことはこう使うの?
let failwithf fmt = Printf.kprintf (fun s () -> failwith s) fmt;; (failwithf "hoge: %s" "hii") ();;
うーんこれ何が嬉しいんだろう。
あと fmt が両辺にある理由もよくわからん。 単に
let failwithf = Printf.kprintf (fun s -> failwith s);;
じゃだめななにかがあるんかなぁ。
(10:54)
_ kinaba [let failwithf = Printf.kprintf (fun s -> failwith s);; だと ..]
_ shinh [ううむありがとうございます。インタプリタだと通ったので通るんじゃね? と思ってしまってました。たしかにコンパイラだと..]
_ jijixi ['a と '_a は違うものです。 それぞれの関数を一回使った後に型がどうなってるか確かめてみるとわかるかと]
_ mame [value restriction とか言われます。 http://ftp.yl.is.s.u-tokyo.ac.j..]
_ Waecnhro [この間も俊太郎の詩をお http://www.stlouisbusinesslist.com/business/5..]
http://github.com/shinh/ags/blob/master/be/modules/sandbox.c
うーんこんな感じでそれなりに良さそう。 簡単なことしかしてないので、 一度しか kernel が大変なことにはならなかった。
うーん最初からこうすればよかったなぁ…
(00:23)
http://github.com/shinh/ags/commit/4264152293a449bd7ec4c43496716c2981829050
実装した。 うーん簡単だなぁ。 本当に最初からこうしていればよかったんだ…
(00:45)
なーんとなくおぼろげにつかめてきた。 カンで書く。
さて、やりたいことは unconfined_t からほんの少しだけ権限を奪った、 つまり blacklist な感じの policy を作りたいんだけど、 あんま簡単ではなさそうなんだよな。 unconfined_domain_noaudit ってマクロが /usr/share/selinux/default/include/system/unconfined.if にあるから、 これをコピってから必要な制約だけつけないようにする、って感じかなぁ。
なんか allow kern_unconfined ~{ setpgid } とかそいうのかも
(05:19)
前回までのあらすじ: SELinux はたいへん難しかった
メンテ性考えても kernel module の方が はるかにマシなんじゃないかという結論に至り、 その方向でやってみたい。 方針としてはややこしいのを書くと 大変なことになりそうなので、 間違えようのないくらい簡単なものにする。
こんな感じでどうかなぁ。 やってみよう
(22:46)
今のところ普通に
perl -e'$_=q(printf"perl -e%c\$_=q($_);eval%1\$c$/",39);eval' ruby -e'eval Q="puts %(ruby -e%ceval Q=%p%c)%[39,Q,39]"'
あたりが短いんだけど、 なんかまだまだ気の効いた方法はありそうだなぁ。
お、これとかちょっと気が効いてるね。
ruby -e"eval Q=%(puts %(ruby -e%p)%%(eval Q=%%(%s))%Q)"
(02:03)
と思ったら一箇所 single qoute にできるんだね。
ruby -e"eval Q=%(puts'ruby -e%p'%%(eval Q=%%(%s))%Q)"
(02:04)
http://www.cs.cornell.edu/projects/ladis2009/talks/dean-keynote-ladis2009.pdf
ぱっと読んだかんじ
あたりが喋っていいんだなぁリストに足された。
Spanner は何かとんでもないものが作られようとしているというイメージ。
最初の数字は google 入って結構びっくりしたことの一つだった。 あんだけ速く検索できるんだから すごくチューニングされた少数のマシンが返事してるのかなぁと 漠然と入る前は思っていたのだけど、 実際にはえらいたくさんのマシンがかかわってたのであった。 まぁ冷静に考えるとネットワーク速いわけだし、 あたりまえという感もあるのかもだけど…
(02:35)
tmpfs を使う実装に変えた。 これでたぶんファイル残すのはかなり大変になったと思うので、 ファイル書いたと思われる投稿は消した。 具体的には hello.rb 12B * 3 だけなんだけど、 他にもあったかなぁ。
(03:17)
本題の SELinux のお勉強は相変わらずわけわからんなーと思ったので、 SELinux 知ってる人いますかーと聞いたら みんな無効化したことはあるということだった。
Google suggest とかも SELinux に対して、 「無効」「停止」「無効化」などの 愛があふれる単語を suggest してくれると教えてもらった。
それでそういえば hamajis に対して 「浜地慎一郎 google」とか出してきやがるのは どうなんだとかいう話をした。
でまぁ TTEdit という ttf を手軽にいじれそうな ソフトを教えてもらって、 それは CSV からの import とかができるのが なかなかいい感じだったのだけど、 どうも小回りがきかない感じはあるのであった。 例えば UnitsPerEm をキリのいい数字にしたいのだけど、 できないぽかった。
まぁそんなこんなで 5x5 font を ベースにして TTF を作ってみたりした。 chrome で見るとどうにも文字の左右に色が見えるなぁ。 それは Ahem でも同じことだから、 Layout tests 走らせてる時はそのへん無くなるようにとかしてあるのかなぁ。
なんにせよ TTEdit 使って CSV から import するのは結構めんどくさいから、 Ahem ベースで fontforge-dev で作れたりするといいのかな。
つか Ahem 作った時のスクリプトとかがあれば手っ取りばやいのだけど。
http://hixie.ch/resources/fonts/iw-generator.py
はなぜ 500 なんだ
(04:05)
英語風設定ファイルを自慢げに書いていたのは伽藍とバザールだったか…
http://www.tlug.jp/docs/cathedral-bazaar/cathedral-paper-jp-8.html
(04:38)
http://d.hatena.ne.jp/w_o/20091018
signal はみんなだいすき。 とりあえず練習として書いてみる。
#include <signal.h> void (*signal(int signum, void (*handler)(int)))(int); void static (*(* const signalp)(int, void (*)(int)))(int) = &signal;
あまりすらすらとは書けなかった… const の位置の尋常じゃない違和感といったら!
typedef は storage-sepecifier で、ヘンな位置に書けるとかいう話。
int typedef i;
とかは中置演算と考えれば読みやすいかもとかいう話だったんだけど、
int* typedef ip;
とは書けないので、まぁダメダメなのであった。
int const typedef * const i;
struct { int x; int y; } typedef pos;
もげもげ
(05:42)
と単純にいっても色々あるわけだ。
http://ja.wikipedia.org/wiki/Intel_Core_2
今のメインマシンの R61 は…
Intel(R) Core(TM)2 Duo CPU T7250 @ 2.00GHz (FSB=800MHz, L2=2MB)
次期ゴルフ場にしようとしてる X60 は…
Intel(R) Core(TM)2 CPU T5600 @ 1.83GHz (FSB=667MHz, L2=2MB)
会社の X61 は…
Intel(R) Core(TM)2 CPU T7300 @ 2.00GHz (FSB=800MHz, L2=4MB)
まくぶくはスペックからの推定だけど、
T7200 @ 2.00GHz (FSB=667MHz, L2=4MB)
このへんは全部 Merom とかいうヤツで、 全部まぁ実に似たようなものなのであった。 Core 2 Duo マシン 4 台とか持ってるという事実にも、 それらのスペックが似たようなもんという事実にも、 悲しくなるのであった。
ああでも会社の Mac Pro はたぶん SSE4 とかある感じかな。
(17:22)
なにか僕は絶望的にヘタな検索をするという話をよくする。 けど具体的にどんなヘタ検索だったか覚えてなかったので、 適当にログをあさってヘタそうな検索失敗例を探してきた。 たいてい単語が足りてなくて増やすのだけど、 増やす前の検索キーワードで目的のものが見つかるはずがない。
あとは何が知りたかったのか見当もつかないようなクエリが たまにあるはず…と思ったのだけど、意外となかった。 不意に「はらへった」とかで検索してた気がするんだけどなぁ。 本気で意図がわからなかったのは、 「財布」「店主」などがあった。 「雪歩shinh」というのもあったが俺は一体何を期待していたのか。
あとはどんなの出てくるかなー的に検索してみたのがあるな。 「学会 エロゲ」「彼女ほしい」「エロ動画」など。 そうそう「プロフ 姫 闇」も。
(00:48)
結局 JSON module が入ってれば JSON 使って落とすことによって解決することに。
rm ~/.golf/ag/Count\ diamonds\ level\ *.db
とかしてから caddy update すればたぶんうまくいきます。
しかしまぁ今回で YAML はやっぱ ムダに機能多すぎだよなーという思いを強くした。 まぁ手で書きやすいのはいいんだけど、 お手軽シリアライザとしては JSON の方がいいのかもねえ。
本当は inspect => eval でもいいんだろうけど、 まぁ eval はちょっと恐い気もしたので。
さてここで問題です。以下のコードがあって、
eval(s.inspect)
できなさそうな気がするけど、 できるとしたら kurimura さんとかが すぐに発見してくれそうな。
(01:16)
_ ku-ma-me [「Marshal.dump か JSON 使ってくださいというのが Ruby の見解」ってそうなんですか? 「Num..]
_ shinh [説得力があるかはわかりませんが、僕が便利だと思うのは、何かを集計するツールを二段階で作ってる場合なんかかなぁと思いま..]
_ naruse [> 「Marshal.dump か JSON 使ってくださいというのが Ruby の見解」ってそうなんですか? 前..]
_ ku-ma-me [そうか、グラフ構造は確かに手間ですね。考えると面白そうなネタです。]
_ なひ [たいていの道はakrさんが通過済みであります: http://raa.ruby-lang.org/project/a..]
YAML モジュールむずかしいぞ…
http://d.hatena.ne.jp/shinichiro_h/20090826#c1255355058
をなんとかしようとしてる。
まず parser か emitter にバグがあるのは確実。
require 'yaml' o = "-\n \n-" p o == YAML::load(YAML.dump(o))
が false を返すのだから。
のいずれかがバグ。調べてないけどたぶん普通に考えて前者。
とりあえず parser のバグ直すか…と ruby の中に入ってる syck のコード読んだんだけど… えっとこれ yacc で生成されてるんだよね なんでオリジナルの gram.y とか token.re とか入ってないの…
そして _why 失踪につきオリジナルのコードとかどこにあるかよくわからず。
というわけでそっちはとりあえず諦めた。
まぁなんにせよ修正は emitter 側でやった方がいい。 Ruby の修正が入るの待つより サーバだけ修正した方がいいからね。
で、まぁ…
class String def to_yaml_style :quote1 end end
とかしたら良いように思うのだけど、 全然 quote1 にしてくれません! なんかコードが複雑怪奇なんだけど、 複数行に渡ってると literal にするってのが優先されてる感じかなぁ。
あと YAML::Syck::Scalar#style= というメソッドもあるみたいだけど、 これをどう使うかとかはさっぱりわからない。
あとこの rdoc で何がわかるのだろう。
http://doc.okkez.net/191/view/method/Object/i/to_yaml_style
で、なんか syck を見つけた。
http://github.com/indeyets/syck
token.re 読んでたらなんとなくわかってきた… よしなおった!
diff --git a/lib/token.re b/lib/token.re index 9d9c855..4d16363 100644 --- a/lib/token.re +++ b/lib/token.re @@ -308,6 +308,7 @@ TAB = "\t" ; SPCTAB = ( SPC | TAB ) ; ENDSPC = ( SPC+ | LF ) ; YINDENT = LF TAB* ( SPC | LF )* ; +YINDENT2 = LF TAB* SPC* ; NULL = [\000] ; ANY = [\001-\377] ; ISEQO = "[" ; @@ -966,7 +967,7 @@ ScalarBlock2: /*!re2c -YINDENT { char *pacer; +YINDENT2 { char *pacer; char *tok = YYTOKEN; int indt_len = 0, nl_count = 0, fold_nl = 0, nl_begin = 0; GOBBLE_UP_YAML_INDENT( indt_len, tok );
でも parser 直しても意味ねー。
うーんどうやったら quote 文字列とかで出力してくれるかって話ですね…
(08:42)
パッチはちょっと修正して今のメンテナっぽい人にメールしておいた。
んなことより emitter ですね… 別の yaml ライブラリ使うかねえインストールするの面倒だけど…
(09:26)
前 | 2025年 9月 |
次 | ||||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
全てリンクフリーです。 コード片は自由に使用していただいて構いません。 その他のものはGPL扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。
Before...
_ shinh [とりあえずこれかなーと読んでみました。 http://citeseerx.ist.psu.edu/viewdoc/..]
_ shinh [ところで OCaml くわしくないはつっこんだ方が良かったでしょうか :-))))]
_ kik [x86はよく知りませんがleaは6バイトnopのインテル推奨の書き方らしいですよ。]
_ shinh [ああ使ってるレジスタ違うから気付いてなかったんですがこれ nop なんですね。やまぁ padding なんだろうなぁ..]
_ shinh [ところで x86 くわし略 :-))))))))))))))))))]