|
Japanese Only |
| ■ プログラム開発 |
浮動小数点演算は気をつけないといけません。
x = 0.0, y = 0.0 のときでも、
r = sqrt( x * x + y * y + z * z ); ac = z / r;は、浮動小数点の丸め誤差によって、1 にならなかったりする。
スレッドに渡す構造体をスタックに(=auto変数として)確保しちゃいかん。
って、そりゃそうだ。
pre-processor で、可変引数を扱うことが実はできる。
#define DEBUG_PRINTF( fmt, arg... ) \
{ fprintf( stderr, fmt, arg ); printf( fmt, arg ); }
これで各種printfも柔軟に実現できそうだ。アドレスを表示するときにはこういう書式もあります。
printf( "%p\n", ( void * ) pointer );実装によって表現が異なるので注意。
正規表現
void * -> 'void[[:space:]]\*\*'
昔も悩んだ覚えがあるが、シェルスクリプトの最後には改行を入れないと うまく実行されないようだ。
さらに、パスワードファイル(passwd)も、最後に改行を入れておく 必要がある。
シェルスクリプトで、
途中をコメントアウトするときに '#' はよろしくない。
と書いてあるのだけど、なにがあったのだろう。忘れた。
UNIX で、fork した子プロセスの終了を関知しなくていい方法。
二重に fork して、最初の子プロセスを即終了すると、
孫プロセスの親が init(pid=1) になる。
あとの面倒はそいつが見てくれる。
int main( void )
{
pid_t pid;
if (( pid = fork()) < 0 ) {
err_sys( "fork error" );
} else if ( pid == 0 ) { /* first child */
if (( pid = fork()) < 0 ) {
err_sys( "fork error" );
} else if ( pid > 0 ) { /* parent from second fork = first child */
exit( 0 );
}
/* second child process; parent is process 1 */
sleep( 2 );
printf( "second child. parent pid = %d\n", getppid());
exit( 0 );
}
if ( waitpid( pid, NULL, 0 ) != pid ) { /* wait for first child */
err_sys( "waitpid error" );
}
/* the original process, but not the parent process of any child */
}
| ■ CVSの使い方 |
初期化:
% setenv CVSROOT ディレクトリ % cvs init
今、~/proj/ndt/work で作業しているとする。
まずcvsの管理下に入れる。
% cvs import ndt/work ndt initialオブジェクトファイルは自動的に管理外にしてくれたが、 実行ファイルや .depend も管理内にされてしまっているので、 これらを外す。
% rm ほにゃらら % cvs remove ほにゃらら % cvs commit
取り出しは、
% cvs checkout ndt/workはじめからディレクトリがある場合にどうなるか、試してみる。
% cvs checkout ndt/workとすればよろしい。
新しいファイルを追加するときは、まず
% cvs commit % cvs updateすると、管理下にないファイルが?マークで示されるので、
% cvs add ほにゃらら % cvs commitすればよろしい。
管理から外したいファイルの種類を指定する方法はいくつかあるが、 僕は ~/.cvsignore に記述している。 こんな感じだ。
*~ #*# *.o
スナップショットの取り方は、
% cvs tag タグこのスナップショットが欲しいときは、
% cvs checkout -r タグ ...しかし、どのようなタグをこれまでつけたのかは、 どうやったらわかるんでしょう?
cvs commit のコメントには、どういう内容を書くとよいのかも 思案中。
こんなページ あります。
| ■ アプリケーション |
ウェブページで、"*.lzh"をダウンロードできるようにするには、 .htaccess に
Addtype application/octet-stream .lzhと書くこと。
mew でバイナリファイルを送信するときは、
スケジュール書き込み用カレンダー
% pscal -Pプリンタ名 月 年
対話型コマンド(例:ftp)をバッチ的に使うには
expect コマンドが便利。
#! /usr/local/tcl-tk/bin/expect -f spawn ftp expect "ftp> " send "open sgi120\n" expect "Name (sgi120:masata-i): " send "masata-i\n" expect "Password:" send "uso-password\n" expect "ftp> " send "get achi kochi\n" expect "ftp> " send "bye\n" close
同じ行が何行あるか数える方法。
% sort | uniq -c | sort -nr
画像の連続表示には、
% xv -wait 0.5 *.pgmのような -wait オプションが便利。引数は時間間隔。
| ■ 奈良先端 or 千原研ローカル |
情報棟1Fのプラズマディスプレイに何かを表示したい場合の作法:
okip で両面印刷するときの注意:
千原研の速くてメモリを湯水のように使えるマシン:
千原研のプロジェクトディスク:
スキャナでの取り込み
gscan でスキャナが使える。xv/display で確認。
ファイルフォーマットは .rgb(IRIS RGB format)。
| ■ 実験室 |
不定長のデータを受け取るスマートなやりかたは。
例えばポインタへのポインタを使うと、
Receive( void **p_buffer, int *p_size )
{
GetSize( *p_size );
*p_buffer = malloc( *p_size );
GetData( *p_buffer, *p_size );
}
なのだが、これをすると、どこかでバッファを解放する必要が
当然出てきて、忘れたり、二重に解放したりする。malloc( 0 ) とすると、 どうやら、まともな値が帰ってくるようだが、 完全に機種依存なので、あらかじめ排除しないといけませんな。
void * について。
| 戻る | e-mail: masata-i@is.aist-nara.ac.jp last update: Aug. 29, 2001 |