3日くらい大阪へ行ってた。 _
それでは今日はどこかへ行きます。(場所知らない。これから調べる) _
当日券買えるらしいのでチケットねーよという人も大丈夫らしいですよ↓ _
http://karetta.jp/article/blog/ll-spirit/084165 _
_ クマゼミ/ミンミンゼミ境界はどこらへんにあるのだろうか
関東にはクマゼミがいらっしゃらないようで。 _
大阪にいたころはミンミンゼミってほとんど見なかったんだけどなー(なので、テレビやら漫画やらでセミの鳴き声の代表が「ミーンミーン」なのが不思議だった) _
http://motchie.blog29.fc2.com/blog-entry-212.html _
ふむ…箱根か…(箱根がどこなのかあんまり知らない) _
あついですわ。 _
_ 昨日まとめ
「アレ」とか書くと絶対あとで忘れるので注意(あたりまえ) _
あついですわ。 _
ものわすれがはげしい。 _
ここ3年くらいずっとなのだけど、僕は色々と貴重な経験を無駄遣いしてるよな…もっと、こう、ミーハー魂をだね…(ぶろぐを印刷して、それにサインをもらうというのはどうだろうか) _
_ 最近の流行
最近男子校に通ってる人と女子校に通ってる人と会話する機会があった。んで、流行は何かとか聞いたのだけど、大変アレだったのでここにメモしておく。 _
ホントかよ。それ、アンタ、ワタシたちが中学生の頃の話よ。まあ、サンプル数合計3なので有効なデータなのかどうかは知らない。 _
女子高生と仲良くしたい人達は「ポケモン」「エヴァ」「ときメモ」を話題にするとよいですよ。 _
さて、(ここでwebはジェネレーションギャップをなくす的な話を書こうと思ったがやっぱりやめる) _
_ 今日の日能研
日能研の問題といえば、たまに本気でわからなくてすこぶる不愉快な気分になることがあるのだけど、今回はわかったのでよい。 _
しかし、本当にこれ、正解なのだろうか。ここで、○をあげている人の条件は、Aさんと同じ条件のはず。(その人から見た場合、○1、×3になる) _
つまり、○を挙げている人は、すぐに手をあげることだって可能なはずだ。ではなぜそうしないかというと、ここで、実は「誰かを間違わせると他の人全員に点が入る」と、いうような…いや、それじゃ駄目か。 _
(まあ、なんかかけひきになるゲームになるんじゃないかと思ったのだけど…) _
_ 流行
まあいいか。やっぱり書いておくと、我々付近の世代はなんか流行的なものをwebに残してしまっているので、我々より下の世代は、一晩あればその知識を会話ができる程度に身につけることができるわけであり、そこでジェネレーショナルなギャップ(世代別GP(だからなんだよ))は無くなってしまう…とみせかけて、我々は、高校生とか中学生とかの流行とか調べるほど熱いものは持っていないので、ギャップでもなく、平等でもなく、もっと一方的なものになってしまう。こっちは向こうのこと知らないが、向こうはこっちのこと知ってる。 _
これなんかを一晩かけて一通り読めば、相手と対等に渡り合うくらいはできるだろう。 _
あと、我々より上の世代は、webに記録とか残してないので、我々は上の世代に対して一方的な攻撃というものができない。例えば、「パパはニュースキャスター」(最近なんかその名前を聞いたのでなんとなく…)とか言われても、その感想を書いたぷろぐとかを見つけることはできない。なので、我々より上の世代とは平等にギャップが存在する。これを読んでもとても勝てる気はしない。 _
だから…だからといって特に考察等はない。 _
_ 過去に行けるとしたら、どういう知識を持っていけば一番世界にインパクトを与えられるだろうか
プログラミングの知識を持って江戸時代に行ったところで、世界に何ひとつインパクトを与えることができないとかいうような。パラドックスとかは気にしないとして。物体は持っていってはいけない。過去の世界にいきなり全裸の自分がいると考えてほしい。 _
言葉が伝わらないのでどうしようもない。 _
やっぱり体力が一番大事ですね…もう無理だと思っても5回ぐらいは気合いでなんとかなる少年漫画的な体力が必要です(しつこい) _
最近の物忘れのヤバさは自分が何やってたか忘れているにも関わらず作業を続けている点にあるだろう。何を探しているかわからないままに何かを探し続けるその姿はもはや歌になったらかっこいいんじゃないかと思った。 _
それはそうとFUTEX_FD無くなっちゃうのかー(2007/6に無くなる予定らしいです)。Linuxイベント事情はどうなっていくんかなー。 _
FUTEX_FD はもともと競合が起きやすいため
http://www.linux.or.jp/JM/html/LDP_man-pages/man2/futex.2.html _
むむ。さっぱりわからん… _
Linuxイベント事情は、色々と案はあるけど、まだ具体的には決まっていない、という状況のよう。 _
あとで(いつ?)keventとか見る。(keventは終わってしまったらしいが) _
あとなんか。これ系→http://people.redhat.com/drepper/newni.pdf(ネットワークの話だけどイベントシステムについても書いてある。id:moriyoshiさんによる日本語概要) _
というのは、これを読んでて、こういうのを書きたくなったので、書いてたのだけど…上のを読んでたら朝が近付いてきたのと、あと、まあ、Linuxのイベント事情はまだ混沌としてる、というのがわかったので、どうでもよくなった。またそのうちカーネルが2.8とかになったら書く(多分書かない)。いや、でもLinuxてこのまま2.6のまま続きそうだよな… _
あと、書いてみたものの、どうにも使えなかったコードをもったいないので↓に置いておく。pthread_createを使わないスレッドの作成。スレッドの終了をfutexで見る、というようになってるところが、ふーん、ていうような感じ。どうでもよい。このコードを書くときに、syscall関数は使ってはいけない、ということにしばらく気付かなかったのは秘密だ(秘密じゃない) _
#define _BSD_SOURCE #include <unistd.h> #include <sys/syscall.h> #include <sys/types.h> #include <sched.h> #include <stddef.h> #include <sys/syscall.h> #include <linux/futex.h> #include <stdio.h> int f(void *p) { puts("e-"); } #define STACK_SIZE 4096 char stack[STACK_SIZE]; #define sys_clone( ret, flags,stk,pid_ptr,tls,cid_ptr ) \ asm __volatile__("int $0x80\n\t" \ "cmpl $0, %%eax\n\t" \ "jne 1f\n\t" \ "2:\n\t" \ "ret \n\t" \ "1:\n\t" \ : "=a"(ret) \ : "a"(SYS_clone), \ "b"(flags), \ "c"(stk), \ "d"(pid_ptr), \ "S"(tls), \ "D"(cid_ptr) \ :"memory") #define sys_exit(code) asm __volatile__ ( "int $0x80" : :"a"(SYS_exit), "b"(code) ) void start() { sleep ( 1 ); sys_exit( 0 ); } int main() { int x; int tid; int parent; int child; //_exit(1 ); *((void**)(stack+STACK_SIZE-4)) = start; child = 0; sys_clone( tid, CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_THREAD|CLONE_SIGHAND|CLONE_CHILD_CLEARTID|CLONE_PARENT_SETTID|CLONE_CHILD_SETTID|CLONE_SYSVSEM, stack+STACK_SIZE-4, &parent, NULL, &child ); if ( tid == 0 ) { sys_exit( 0 ); } sleep( 1 ); printf("%d %d %d\n",tid,parent,child); puts( "wait child"); syscall( SYS_futex, &child, FUTEX_WAIT, NULL, child); puts( "child dead"); }
それはそうと、ようやくudevのルールを書けるようになりました。あと、最近のLinuxはLVM使っててinitrd無しでは起動できない、というのを今日知りました。まあ、なんとかする。initrd徹底解説とかもあればおもしろいかもしれんなー誰か書いて。いや、おもしろいか?そうでもないかも。Linuxムズカシヨ。 _
_ C言語の volatile は共有変数に使っても全く何の役にも立たない。
これ知らなんだ…↓カーネルの/Documentationaに入ってた。 _
http://kernel.org/doc/Documentation/volatile-considered-harmful.txt _
C言語のvolatileはスレッド、プロセスの同期とかの目的には全く全然ちっとも使えない、ただ単に最適化が無くなって遅くなるだけ、という話。確かに言われたらその通りなんだけど…この情報はもっと広まるべきだよな。 _
とりあえずvolatileでぐぐると kosakiさん5位なのでもっと頑張って! _
http://mkosaki.blog46.fc2.com/blog-entry-91.html _
-- _
↑と、あとでちょっと調べてみたところ、そういう情報はゴロゴロ見つかるし、あと、多分どっかで見たり聞いたりしてるはずなのに知らないって大変アレだな。人の話を聞いてない。 _
ひょっとして常識では…?これは恥ずい。 _
-- _
常識を知らないから恥ずかしい、という考えが日本人的だよな… _
もっと、自分はそうなんだから仕方ないじゃないか、というような考えかたを持つようにしないと…(というような脅迫観念にとらわれてるあたりが日本人的) _
寝すぎ。最近休みの日は半分くらい寝てる気が。 _
説明はもうちょっと色々できてから書こうと思ってるのだけど、とりあえず、「GTKとかQTみたいなレイアウトがしたいけど、ウィジェットの実装とかはいらない」、というときのためのレイアウトエンジン。(まだちょっとしかないけど) _
UIとレイアウトエンジンは分離できるのではないかなー、という試み。インターフェースわかりにくいけど、とりあえずこんな感じでいけるのではないかな。 _
_ レイアウトアルゴリズムについて考えない
レイアウトのアルゴリズムって、なんか、「だんだんそれっぽくなるように近づけていく」ようなループになってしまうのだけど(上のソースだと、199行目から)、なんか、もっと一発でビシーっと決まるようなアルゴリズムって無いかな? _
まあ別によいのだけど…UIのオブジェクト数なんて、多くて数十個だから、問題にはならないのだと思う。 _
とりあえず、アルゴリズムはそれでいいとして、謎なのは、折り返しが許されてるような…横幅を小さくすると、縦幅が大きくなって…とかの場合。 _
テキスト入力なら、スクロールバー付けるとかでごまかせるけど…あー、横幅を柔軟に変えられるようにして、それで縦幅が決まるようにすればいいか…それだと、今のサイズ要求だと無理だな…サイズ要求する場合は、常に最大横幅を云々。まあ、おいおい考える。(多分そこまではやらない) _
あと最近、「シンボルテーブル」「可変長配列」「メモリプール」があれば嬉しい、というのがわかってきた(npr/* がそれ)。今回はシンボルテーブル使ってないけど。 _
libnpr は Not Portable Runtime Library です。僕の気分によってインターフェースが変わるのであまりポータブルではないライブラリです。 _
あー、あと、nulluiは「ぬるい」とでも読んでください。UIが無くてぬるいライブラリ、とか、そういう名前です。コードは好きなようにしてもらって構わないです。 _
_ どのぐらい思い処理だと並列化して意味あるかな
たとえば上のレイアウトアルゴリズムだと、結構綺麗に割れるのだけど、あんまり重くない。こういうのをぱぱーっと並列化したら、効果出るのかね? _
#include <pthread.h> #include <stdio.h> #include <string.h> #define N (4096*10) pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t start = PTHREAD_COND_INITIALIZER; pthread_cond_t t1_wait = PTHREAD_COND_INITIALIZER; pthread_cond_t t2_wait = PTHREAD_COND_INITIALIZER; pthread_barrier_t barrier; int share; int fini = 0; int share2; #define get(v) asm __volatile__("rdtsc": "=a"(v)::"edx") void *t1( void *p ) { int i; int b,a; pthread_barrier_wait( &barrier ); get(b); for ( i=0; i<N; i++ ) { pthread_mutex_lock( &lock ); pthread_cond_wait( &t2_wait, &lock ); pthread_mutex_unlock( &lock ); } get(a); fini = 1; printf("%d\n", (a-b)/1024 ); return NULL; } void *t2( void *p ) { pthread_barrier_wait( &barrier ); while ( 1 ) { pthread_cond_signal( &t2_wait ); asm("":::"memory"); if ( fini ) break; } return NULL; } void *u1( void *p ) { int i; int b,a; pthread_barrier_wait( &barrier ); share2 = 1; get(b); for ( i=0; i<N; i++ ) { share = 0; while ( !share ) { asm("lfence":::"memory"); } } get(a); printf("%d\n", (a-b)/1024 ); return NULL; } void *u2( void *p ) { pthread_barrier_wait( &barrier ); while ( 1 ) { share = 1; asm __volatile__ ("sfence":::"memory"); } return NULL; } #define STRING_(A) #A #define STRING(A) STRING_(A) int main() { pthread_t t[2]; void *ret; int a, b; #define COPY (4096*4) char *buf0 = malloc(COPY); char *buf1 = malloc(COPY); memset( buf0, 0, COPY ); memset( buf1, 0, COPY ); get(b); memcpy( buf1, buf0, COPY ); get(a); printf("memcpy[" STRING(COPY) "] %d\n",a-b); pthread_barrier_init( &barrier, NULL, 3 ); pthread_create( &t[0], NULL, t1, NULL ); pthread_create( &t[1], NULL, t2, NULL ); pthread_barrier_wait( &barrier ); pthread_join( t[0], &ret ); pthread_join( t[1], &ret ); pthread_create( &t[0], NULL, u1, NULL ); pthread_create( &t[1], NULL, u2, NULL ); pthread_barrier_wait( &barrier ); pthread_join( t[0], &ret ); }
手元の環境(Core2 E6600)だと大体 _
pthread_cond → 230000 〜 280000 _
share → 20000 〜 30000 _
うーん。16KBのmemcpyが 25000 ぐらいなので…32KBコピーする処理より短い処理だと並列化の意味が無いってところか…キャッシュとかあるのでよくわからんが。 _
追記(8/22):上の計測間違ってます。(/1024がおかしい) _
というわけで計測しなおし。 _
pthread_cond 5500 〜 6000 _
share 500〜800 _
ぐらい。妥当なところか。ちなみに、 _
2KBのmemcpyが 400〜500 _
free(mallo(4))を2回で 500〜800 _
ふむ。 _
UIのレイアウトって連立一次方程式にならんかと思ったけど、不等式があるのだよな。連立不等式って何が解として出てくるのかすらワカラン。中学生からやりなおせ! _
続きをやった。と、言っても、わかりにくくしただけ。 _
いや、なんか、並列化できそうなデータにしてたら、わかりにくくなってしまって… _
並列化に向いたデータ構造の第一歩は、読むところと書くところを分ける、というところだろうか。多分。このへんについてはおいおい。 _
別にレイアウトのアルゴリズムを考えたかったわけでもないし、並列化がやりたかったわけでもないのだけど…何やってるのだろうか。LLで生産性が上がる理由のひとつに、以下略。 _
_ まず最初は、一番効率のよい方法で実装し、徐々に使いやすいインターフェースにしていく
効率を悪くするのはあとでもできるけど、インターフェースをわかりにくくするのは最初しかできない。(この考えかたのデメリットを3秒以内に5つあげなさい) _
_ 最近Cのマクロ使いすぎ
emacs22になってCC Modeが良くなった。Haskellのモナドがわかってきた。などが理由に挙げられる。 _
最近なんか一週間何もしなかった反省に日曜にちょろっと一時間くらいコード書くというのが多いような。 _
_ みんなプログラムの名前決めるときどうやってる?
最近なんかプログラムの名前決めるのに二時間、コード書くの一時間、終了。みたいなのが多いな。nulluiとかもコード書いたよりも名前考えてた時間のほうが長いし。(そんなことはないです) _
みんなどうやって名前決めてるのだろうか? _
とりあえず僕の決めかたとしては、大体、以下の条件を満たすものをひたすら考える。という方法。 _
と、思ったけど、あまりちゃんと準拠してるやつが無いな…あまり方針は無いということで。 _