= 2012年6月 = == 06/02 == === GTK+2.0でウィンドウを出すだけの何か === チュートリアルを見つつ。 {{{#!highlight c #include int main(int argc, char *argv[]) { GtkWidget *window; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); gtk_widget_show(window); gtk_main(); return 0; } }}} コンパイルは、ソースがwidget.cなら {{{ gcc -o widget widget.c `pkg-config --cflags --libs gtk+-2.0` }}} == 06/06 == * portsのビルドに失敗するとき * まずはエラーメッセージを読め、ググれ * BUILD_DEPENDSを見直せ、場合によっては再ビルドしろ * vncviewerはタイル化すると(要するにオリジナルのサイズから外れると?)死ぬ == 06/08 == === stdioのバッファリングを眺める === Cのstdioはバッファリングされているんだよー、ということを目で見て分かるように簡単な例で示すのが目標。とりあえず標準出力。 普通に書こうとすると、端末側が入力を行単位で扱う(故にstdinのバッファリングを切るだけではダメ)ので一体どのタイミングでプログラムに入力が渡されるのかが分かりづらいのと、エコーバックがあるために入力と出力が混在して見づらいのとで、ぱっと見てもさっぱり分からない。そこで、 * cursesの`getch()`を使う * このとき`cbreak()`によってプログラムへの入力が1文字入力されるたびにやってくるようにして * さらに`noecho()`でエコーバックを無効化しておく 加えて、デフォルトの`BUFSIZ`(手元のstdio.hでは1024だった)は大きすぎてバッファがあふれた時の挙動を観察しづらいので、`setbuffer()`でわざと小さなバッファを設定する。 {{{#!highlight c #include #include int main(void) { int c; char buf[8]; initscr(); cbreak(); noecho(); #ifdef NBUF /* disable buffering for stdout */ setbuf(stdout, NULL); #else /* set tiny buffer for stdout */ setbuffer(stdout, buf, 8); #endif while ((c = getch()) != ERR) putchar(toupper(c)); return 0; } }}} cursesを使うのでコンパイル時には`-lcurses`が必要。`-DNBUF`をつけたりつけなかったりでコンパイルして挙動を眺める。 * バッファリングなしの場合、putcharで出力した文字は1文字づつすぐに出てくる * バッファリングありの場合、putcharで出力した文字はバッファが埋まるたびにバッファサイズ分が一気に出てくる * この例では、8文字入力した後9文字目を入力した際にバッファがフラッシュされて出てくる * ちなみにバッファに何かが入っている状態でCtrl+CでSIGINTを送って終了すると、終了時にバッファがフラッシュされて一気に出てくる 追記: 今回のような目的ならcursesよりもtermiosを使った方が良さそう。 * [[http://www.steve.org.uk/Reference/Unix/faq_4.html#SEC47]] * [[http://www.race.u-tokyo.ac.jp/~moro/unix-programmer/faq-j_toc.html|日本語訳]] == 06/16 == === sshホスト鍵の指紋を表示 === 忘れる度に調べるのでメモ。 {{{ ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub # rsa ssh-keygen -lf /etc/ssh/ssh_host_dsa_key.pub # dsa }}} == 06/20 == * 当たり前だが、カーネルを再構築したらカーネルモジュールも再構築しなければならない * portsから入れたやつは忘れがち。xf86-video-なんとか系列とかVirtualBoxのとか == 06/23 == * bashにはビルトインのtimeコマンドがある。そちらではなくtime(1)を呼び出したい場合はフルパスで指定すればよい