ログイン
編集不可のページディスカッション情報添付ファイル
"clear/note/2012-06"の差分

MMA
6と7のリビジョン間の差分
2012-06-08 02:38:15時点のリビジョン6
サイズ: 3138
編集者: clear
コメント: 表現を修正
2012-06-08 14:14:40時点のリビジョン7
サイズ: 3388
編集者: clear
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 77: 行 77:

追記: 今回のような目的なら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|日本語訳]]

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を使った方が良さそう。

clear/note/2012-06 (最終更新日時 2012-06-23 15:10:27 更新者 clear)