サイズ: 588
コメント:
|
← 2012-06-23 15:10:27時点のリビジョン10 ⇥
サイズ: 4015
コメント:
|
削除された箇所はこのように表示されます。 | 追加された箇所はこのように表示されます。 |
行 29: | 行 29: |
== 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 <stdio.h> #include <curses.h> 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)を呼び出したい場合はフルパスで指定すればよい |
2012年6月
06/02
GTK+2.0でウィンドウを出すだけの何か
チュートリアルを見つつ。
1 #include <gtk/gtk.h>
2
3 int main(int argc, char *argv[])
4 {
5 GtkWidget *window;
6
7 gtk_init(&argc, &argv);
8
9 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
10 g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
11
12 gtk_widget_show(window);
13
14 gtk_main();
15
16 return 0;
17 }
コンパイルは、ソースが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()でわざと小さなバッファを設定する。
1 #include <stdio.h>
2 #include <curses.h>
3
4 int main(void)
5 {
6 int c;
7 char buf[8];
8
9 initscr();
10 cbreak();
11 noecho();
12
13 #ifdef NBUF
14 /* disable buffering for stdout */
15 setbuf(stdout, NULL);
16 #else
17 /* set tiny buffer for stdout */
18 setbuffer(stdout, buf, 8);
19 #endif
20
21 while ((c = getch()) != ERR)
22 putchar(toupper(c));
23
24 return 0;
25 }
cursesを使うのでコンパイル時には-lcursesが必要。-DNBUFをつけたりつけなかったりでコンパイルして挙動を眺める。
- バッファリングなしの場合、putcharで出力した文字は1文字づつすぐに出てくる
- バッファリングありの場合、putcharで出力した文字はバッファが埋まるたびにバッファサイズ分が一気に出てくる
- この例では、8文字入力した後9文字目を入力した際にバッファがフラッシュされて出てくる
- ちなみにバッファに何かが入っている状態でCtrl+CでSIGINTを送って終了すると、終了時にバッファがフラッシュされて一気に出てくる
追記: 今回のような目的ならcursesよりもtermiosを使った方が良さそう。
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)を呼び出したい場合はフルパスで指定すればよい