「あなたの背後にいるのは…メイドさんの格好をした…」
「貴様、メイドさんって言っておけば何でも萌えになると思ったら大間違いだぞ。」
「ひいっ。すいません…間違いました。あなたの後ろにいるのは、普段はツ…」
「貴様、ツンデレって言っておけば何でも萌えになると思ったら大間違いだぞ。」
「あひぃ。」
気が付けば一年も半分終わりですがさて問題です!正しい一年の半分はどこにあるでしょう!(今年の場合) _
いや、僕も答知らんが。でも、多分2月が前半にあるからまだ半分過ぎてないよな。多分。 _
-- _
久し振りに家でコード書いてたら、この環境g++がインストールされてネーZE!僕一体何ヶ月家でC++のコード書いてないんだろうね! _
Fedora 7(もうFC7じゃないよ!)がインストールされてるということは…まあ…一ヶ月くらいか。 _
最近やってる仕事が結構クロック削ったりパイプラインなんかしたりするような結構憧れてた仕事なんだけど、なんか、いやーこれで身につく技術って全然応用利かない技術だな…いや、非常に楽しいし、一生これで食べていけるなら一生やってもいいくらいなのだけど… _
ちまちまクロック削る仕事ってあと何年くらい生き残るのかな… _
-- _
そういえば僕の中でHaskell強化月間が終わってた。僕はこの一ヶ月で何を成し遂げることができただろうか何も成し遂げてない。 _
-- _
一年の日数は奇数なので一年の半分は今日(3日)か昨日(2日)の昼の12:00なんじゃないかと思った。 _
Haskell強化月間はこれを読むべきだったなー。これの下にある図とか知ってれば何かの役に立つだろうし。 _
昨日気付いたのだった。遅い。ソースコードのHACKINGとか前一瞬開いた覚えがあるんだが。何で気付かなかったんだ。目が節穴。 _
あー。ビデオ見れねー。(そもそも英語聞き取るのが無理という問題があるが) _
なんかHaskellの人というと、文書なんか残さない、残しても不思議な文書しか残さない。というイメージがあったのだけど、結構僕でも読める文書だなー。ほんとのハッカーの世界は文書も書ける人がうようよしてるのだろうね。 _
-- _
あと、Webで見てる限りHaskellの人が最近Arrowばっかり言ってるようなイメージがあるので、Haskell強化月間はArrowを勉強するべきだった。 _
-- _
過去を振り返る男 _
マシンが新しくなった。はやい。(が、まだ環境の移行ができてないのでこれを書いてるのはPS3) _
-- _
POSIXのシグナルには終わってる点がひとつあった。 _
シグナルの影響で予期せぬところで非同期な処理が入ると、色々と困る場合はシグナルをブロックするのだけど、そうすると、readが中断できない、とかそういう問題。 _
ので、これまでは、そこらへんをなんとかするために、sigsafeのような不思議なライブラリを使うとか、readする前になんかパイプとあわせてselectしておいて通知するときはパイプに1byte書くとか自分で仕組みを作る必要があった。(はず。自分ではそういうの書いたことないのでよくわからない。) _
しかし、そこでこのsignalfdを使えばなんと!…どうなるのだろうか。調べてないのでわからないのだった。いや、多分、signalが届いたときになんかデータ(signalfd_siginfo?)が読めるようになるのだと思うけど…そのうち試す。 _
-- _
Linux Kernel Watchてあれが最終回だったんかな… _
-- _
JavaScriptが見れなくて困ってるという人は↓に「正」の文字を書いてください。 _
あと、コメントのCGIとかがPerlで書いてあるのでHaskellで日記システムを作ったというのは間違いじゃないかとの指摘があったけど、あの一文を書いた時点では全部Haskellで書いてあったので大丈夫です。 _
lifehack的な何か。 _
というわけで、一日一時間くらい時間ができて、新しいマシンもあるし、何をやってるかというと、二日くらい永夜抄をやってた。 _
現代日本というのは、アレやらコレやらを封印しても、まだ時間潰しのネタがあるので困る。そういえば24のシーズン2とかも見た。大変よかった。 _
まあいいや。 _
永夜抄(ここでWikipedia20分。現代日本というのは略)はなんか前やったときはスペルプラクティスの存在が許せなくてあまり好きではなかったのだけど、今やってみたらそうでもなかった。あとなまりすぎ。 _
古典電脳物語半分くらい読んだ。今までつまらなさそうだったので特に気にしてなかったんだけど、おもしろい。 _
「CPUの創りかた」がCPUの話だとしたら、「マザーボードの創りかた」みたいな感じだろうか。あとプラス昔話。真面目な文章のようでくだらない話が書いてあったりして素敵。 _
けど、実際に作ってみようとは思わないのだよな…ここらへんに僕が似非ハッカー止まりな理由があると思うので、もう少し深く追求する必要がありそうだ。いや。ない。(反語(ではない)) _
Tiny BASICのソースでも読むか…(多分) _
-- _
おげー昼やん。さっき時計見たときは9時ぐらいだったはずだが? _
-- _
Linuxは2.6になって以降知らないうちに色々機能が付いてるよなー。uinputというドライバがあって、ユーザ空間でinputドライバが書けるぽい。なんか無いかなー、と、思ったものの、ただのinputではどうしようもないな…umouseとかがあれば。 _
さてなんか作るか…ってもう20時だった。 _
-- _
妖夢見ててふと思ったのだけど、萌え霊能者というのはありかもしれないな。「あなたの背後にいるのは…〜…です。あなたの知らないあいだにドジっ娘イベントを発生させているようですね。」とかそういう感じで。 _
「あなたの背後にいるのは…メイドさんの格好をした…」
「貴様、メイドさんって言っておけば何でも萌えになると思ったら大間違いだぞ。」
「ひいっ。すいません…間違いました。あなたの後ろにいるのは、普段はツ…」
「貴様、ツンデレって言っておけば何でも萌えになると思ったら大間違いだぞ。」
「あひぃ。」
-- _
問題です。"sh"でぐぐったときに一番上に出てくるものはなんでしょう _
-- _
SHというといつも思うのだけど、名前に「super」とか付けるときは少し考えたほうがよくて、SHは「Super H」という名前なのだけど、何がどうスーパーなのかわからない。 _
例えば、USBの転送速度の規格には、「High Speed」と「Full Speed」があるのだけど、どっちが速いのかわからない。 _
-- _
さて、なんか作るか…ってもう21時になろうとしているのだった。 _
^へヘ∧人入λ。 _
先週のアレ。一応ソースだけ置いときます。注意:説明などは一切ありません。どうしても詳しく知りたい人はメールで… _
-- _
prettyprinterおよび似たようなものに関する比較的どうでもよい考察。木構造のようなものを文字列にダンプするときに、reallocするのが嫌だという人も世の中にはおられることと思う。それをなんとかできないだろうかとかいうような。話。 _
#include <stdio.h> #include <stdlib.h> struct tree { struct tree * l; struct tree * r; char c; }; struct string { char *buf; int len; int buflen; }; void dump_tree( struct string *s, struct tree *t ) { if ( t->l ) dump_tree( s, t->l ); if ( s->buflen == s->len-1 ) { s->buflen *= 2; s->buf = realloc( s->buf, s->buflen ); } s->buf[s->len] = t->c; s->len++; if ( t->r ) dump_tree( s, t->r ); } struct tree * make_tree( struct tree *l, struct tree *r, char c) { struct tree *n = malloc( sizeof(struct tree) ); n->l = l; n->r = r; n->c = c; return n; } int main() { struct string str; struct tree *t = make_tree( NULL, NULL, 'h' ); struct tree *t2 = make_tree( NULL, NULL, 'l' ); t = make_tree( t, t2, 'e' ); str.len = 0; str.buflen = 17; str.buf = malloc( 17 ); dump_tree( &str, t ); str.buf[str.len] = '\0'; puts( str.buf ); return 0; }
こういうrealloc。(最近こういうこと考える度に、「最近のマシンでは誤差なので放置したほうがいい」っていう考えになるので嫌だな…) _
これは、realloc無しの形にできるのではないか、というのが、ここ3ヶ月くらいの僕の研究の中心だった。(最近あんまり更新してなかったのはそのせい。嘘です)あと、なんとかしてFirefoxのクリップボードとXのクリップボードが同期できないか、というのが、これから10年ぐらいの課題であることはいうまでもない。 _
…じゃなくて、 _
なんと、これを継続渡しモドキ(多分)にして、再帰的なアレにすることによって、realllocが消せるのである。 _
#include <stdio.h> #include <stdlib.h> struct tree { struct tree * l; struct tree * r; char c; }; struct cont_node { struct tree *node; struct cont_node *chain; }; struct str_node { struct str_node *chain; char c; int len; }; char * dump_tree2( struct tree *t, struct cont_node *cont_chain, struct str_node *str_chain ); char * dump_tree2_pass2( struct tree *t, struct cont_node *cont_chain, struct str_node *str_chain ) { struct str_node s; s.chain=str_chain; s.c = t->c; s.len = str_chain->len+1; if ( t->r ) { return dump_tree2( t->r, cont_chain, &s ); } else { if ( cont_chain ) return dump_tree2_pass2( cont_chain->node, cont_chain->chain, &s ); else { char *buf = malloc( s.len ); str_chain = &s; buf[ s.len] = '\0'; while ( str_chain->len ) { buf[ str_chain->len-1 ] = str_chain->c; str_chain = str_chain->chain; } return buf; } } } char * dump_tree2( struct tree *t, struct cont_node *cont_chain, struct str_node *str_chain ) { if ( t->l ) { struct cont_node cont; cont.node = t; cont.chain = cont_chain; return dump_tree2( t->l, &cont, str_chain ); } else { return dump_tree2_pass2( t, cont_chain, str_chain ); } } struct tree * make_tree( struct tree *l, struct tree *r, char c) { struct tree *n = malloc( sizeof(struct tree) ); n->l = l; n->r = r; n->c = c; return n; } int main() { struct str_node strchain; struct tree *t = make_tree( NULL, NULL, 'h' ); struct tree *t2 = make_tree( NULL, NULL, 'l' ); t = make_tree( t, t2, 'e' ); strchain.len = 0; puts(dump_tree2( t, NULL, &strchain )); return 0; }
おかげさまでただのツリーをダンプするコードもこんなに大きくなりました! _
まず、CPS変換をがんばって、dump_treeの中で最後の部分以外returnしないようにする。そうすると、そこまで辿ってきたノードを全てスタック上の変数に乗せることができるので、そこらへんをなんだかんだしてアレがソレ。 _
-- _
こうやってちゃんとした説明の部分をゴマカした文章ばっかり書いてるから仕事でも駄目な文章しか書けないのだよな… _
よし、ちゃんと説明を書こう↓ _
(妖精さんが書いてくれます) _
-- _
と思ったけど、これって最初にサイズ調べておくのとどう違うの? _
-- _
まあ。なんとか。 _