2003年03月24日(月) 天本英世さん死去
■ 椎名林檎がニュースステーションに生出演へ (サンスポ)
見ようかなと思ってメモ。水曜日だ。
■ 悲
送別会は一度だけにしてくれとお願いしたが無駄だったようだ。今週の予定は再考しよう。
■ [dev] 技術文書 (ViVi Web site) (リンク切れ)
--> http://vivi.dyndns.ws/tech/tech.phtml
ViVi作者の津田さんによる、テキストエディタ実装技術など。
■ [soft] テキストエディタ
エディタをまだインストールしていなかったので探す。新定番らしきものは見当たらず、無料のものでTeraPad、サクラエディタ、K2Editor、gVimあたりを候補とし、結局過去の経験を元にサクラエディタをインストールした。かつて「テキストエディタ」という名前だった頃使っていて、豊富な機能に満足していたのだが最近はどうなのだろう。
■ [unix][shell] BASH Programming - Introduction HOW-TO (JF)
シェルスクリプトの書き方すぐ忘れるのでメモ。リダイレクトの書き方を覚えられない。わかってないってことだ。
■ やること
- 携帯&PHS&ThinkPadを返す
- 退職後の手続きをまとめる
- Vineで印刷の設定→Sambaの設定→SWTのサンプルプログラムの印刷
2004年03月24日(水)
- dhcpはrc.confにdhclient=YESと書けばいいだけだと思うよ。
- と思ったら、 dhclient_flags="wm0"とも書かれていた。dhclient_flagsの前にタブあり。何かを見ながら書いたが何だったか忘れた。
- sshdはrc.confにsshd=YESと書くだけでいいはず。inetdは使わない。
■ [dream] 南葉くんの夢
夢を見た。会社で、南葉くんから翻訳が完成したと言われ、紙の束を渡される。これを郵送して欲しいと頼まれる。なんでおれが郵送してやらなきゃいけないのかが分からん。が、引き受けてしまった。
翻訳された文章を読んでみると、ソフトウェアはお茶ではない、みたいなわけの分からない文章。原文を見てみると確かにteaとか書かれているけど、これって日本語になってないよ。ので、おれが正しい日本語にしてあげようと翻訳にチャレンジしたが、解読できなかった。そんな夢。
哨戒機は完成したのかなあ。
■ やること
経理書類の印刷- プリンタをどうにかする
2005年03月24日(木)
- 仕事に飽きてきた。いかんいかん。
- 帰りにKくんに会った。マスクしてた。仕事回ってくるといいな。
■ [security][web] 「消費者向け電子商取引サイトの運用における注意点」 (IPA)
JavaWorld 5月号にちらりと紹介されていた文書をメモ。20ページくらいのPDFファイルがある。プロ向けという感じではない。
IPA では、このような被害を防止するために、ショッピングサイトの運営者が、サイト上で発生しうる問題に対し、適切に対策ができるようにするための注意事項をまとめました。これを参考に、運営しているショッピングサイトにセキュリティ上の問題がないかどうかを確認し、対策に役立ててください。
■ [book] ただマイヨ・ジョーヌのためでなく (ランス・アームストロング)
アームストロングの癌との過酷な闘いを描いた感動作、と思っていたけどそうでもなかった。闘病の話だけでなく自転車の話がたくさん。少年時代からいかに一流選手へ育っていったかがわかる。感動はしないけどまあ面白い。4点。
■ やること
- リンク元のスリム化
- tDiaryバージョンアップ
- FSWikiバージョンアップ
- オーブンレンジ用べんり棚
- ブラウンの安い電動歯ブラシ買う
2008年03月24日(月)
■ [unix] プロセスの関係についてメモ
Unixのプロセスについて、詳解UNIXプログラミングで勉強。
Ctrl-Cによる割り込みシグナルの送り先
シェルからプログラムを起動したとき、Ctrl-Cによる割り込みシグナルがどのプロセスに送られるのかを知りたかった。「第10章 シグナル」のSIGINTの説明に
端末の割り込みキー(しばしば、DELETEやControl-C)を押すと、端末ドライバが生成するシグナルである。このシグナルは、フォアグラウンドプロセスグループのすべてのプロセスに対し送られる
とあった。フォアグラウンドプロセスグループとは何か。
フォアグラウンドプロセスグループ
フォアグラウンドプロセスグループを理解するには、「プロセスグループ」「セッション」「制御端末」について知る必要がありそう。「第9章 プロセスの関係」に説明がある。
- プロセスグループ
- プロセスは必ずプロセスグループに属する。forkにより生まれたプロセスは、親プロセスと同じプロセスグループに属する。setpgid()により、プロセスを別のプロセスグループに属させることができ、また、新しいプロセスグループを作成することもできる。
- セッション
- プロセスグループは必ずセッションに属する。setpgid()により新しく作られたプロセスグループは、対象プロセスが属していたのと同じセッションに属する。setsid()により、新しいセッションとプロセスグループを作成しプロセスをそのセッションに属させることができる。
- 制御端末
- セッションは1つの制御端末を持つことができる。setsid()により新しく作られたセッションは、制御端末を持たない。制御端末を持つセッションの作り方は知らない。
以上の概念を使うと、フォアグラウンドプロセスグループの説明ができる。
- フォアグラウンドプロセスグループ
- 制御端末を持つセッションに属するプロセスグループの内の1つがフォアグラウンドプロセスグループになる。setpgid()により新しく作られたプロセスグループはフォアグラウンドではない。tcsetpgrp()により、プロセスグループをフォアグラウンドにすることができる。
試す
Linux 2.6.9 にて、以下に示す2つのプログラムを作って試してみた。2番目のプログラムの実行ファイル名を pausing として1番目のプログラムを実行すると、
- fork & execl
- fork & setpgid & execl
- fork & setsid & execl
の3通りが行われる。プロセスの状態は次のpsコマンドで確認できる。
ps o pid,ppid,pgid,sid,tpgid,tty,stat,command --forest
サンプルプログラムに続けてこのpsコマンドを実行すると、
PID PPID PGID SID TPGID TT STAT COMMAND 29135 29119 29119 29119 -1 ? S sshd: kenichi2@pts/6 29136 29135 29136 29136 31739 pts/6 Ss \_ -bash 31739 29136 31739 29136 31739 pts/6 S+ \_ Parent 31740 31739 31739 29136 31739 pts/6 S+ \_ only fork 31741 31739 31741 29136 31739 pts/6 S \_ do setpgid 31742 31739 31742 31742 -1 ? Ss \_ do setsid
という結果になった。PIDはプロセスID、PPIDは親プロセスID、PGIDはプロセスグループID、SIDはセッションID、TPGIDは当該端末に関連するフォアグラウンドプロセスグループID、TTは制御端末を表す。フォアグラウンドプロセスグループにはSTAT欄に+が表示される。意図した通りの結果になっているように見える。
プログラムを実行した端末でCtrl-Cを入力すると、
[PID=31739] Parent received signal 2. [PID=31740] only fork received signal 2.
と出力され、フォアグラウンドプロセスグループに対してだけSIGINTが配信されていることが確かめられた。このときにpsを実行すると
PID PPID PGID SID TPGID TT STAT COMMAND 29135 29119 29119 29119 -1 ? S sshd: kenichi2@pts/6 29136 29135 29136 29136 29136 pts/6 Ss+ \_ -bash 31742 1 31742 31742 -1 ? Ss do setsid 31741 1 31741 29136 29136 pts/6 S do setpgid
と出力され、フォアグラウンドはシェルのプロセスグループに変わっていた。更にシェルを終了させると
PID PPID PGID SID TPGID TT STAT COMMAND 29135 29119 29119 29119 -1 ? S sshd: kenichi2@notty 31742 1 31742 31742 -1 ? Ss do setsid 31741 1 31741 29136 -1 ? S do setpgid
となり、制御端末は無くなった。セッション29136は残っている。
また、以下のプログラムのコメントアウト部(tcsetpgrpを実行している部分)を生かすと、
PID PPID PGID SID TPGID TT STAT COMMAND 617 608 608 608 -1 ? S sshd: kenichi2@pts/6 618 617 618 618 693 pts/6 Ss \_ -bash 691 618 691 618 693 pts/6 S \_ Parent 692 691 691 618 693 pts/6 S \_ only fork 693 691 693 618 693 pts/6 S+ \_ do setpgid 694 691 694 694 -1 ? Ss \_ do setsid
のようにフォアグラウンドプロセスIDが変わっていることを確かめられる。
以下、プログラムのソース。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
static pid_t spawn(int flag) {
pid_t pid = fork();
if (pid < 0) {
perror("fork");
exit(1);
} else if (pid == 0) {
char* name;
switch (flag) {
case 0:
name = "only fork";
break;
case 1:
// 新しいプロセスグループを作り本プロセスがそこに属する
if (setpgid(0, 0) < 0) {
perror("setpgid");
exit(1);
}
name = "do setpgid";
break;
case 2:
// 新しいセッションを作り本プロセスがそこに属する
if (setsid() < 0) {
perror("setsid");
exit(1);
}
name = "do setsid";
break;
default:
name = "Invalid";
break;
}
execl("./pausing", name, NULL);
perror("execl");
exit(1);
} else {
// switch (flag) {
// case 1:
// if (tcsetpgrp(0, pid) < 0) {
// perror("tcsetpgrp");
// exit(1);
// }
// break;
// }
}
return pid;
}
int main() {
spawn(0);
spawn(1);
spawn(2);
execl("./pausing", "Parent", NULL);
perror("execl");
exit(1);
}
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
static volatile sig_atomic_t signal_number = 0;
static void handle_signal(int signo) {
signal_number = signo;
}
static void set_signal_hanlder(int signo) {
if (signal(signo, handle_signal) == SIG_ERR) {
fprintf(stderr, "signal() failed.\n");
exit(1);
}
}
int main(int argc, char* argv[]) {
set_signal_hanlder(SIGINT);
set_signal_hanlder(SIGTERM);
set_signal_hanlder(SIGHUP);
set_signal_hanlder(SIGTSTP);
set_signal_hanlder(SIGCONT);
pid_t pid = getpid();
printf("[PID=%d] %s is ready.\n", pid, argv[0]);
for (;;) {
pause();
printf("[PID=%d] %s received signal %d.\n",
pid, argv[0], signal_number);
switch (signal_number) {
case SIGINT:
case SIGTERM:
case SIGHUP:
exit(0);
default:
continue;
}
}
return 0;
}
■ やること
- シュレッダー
- 健康保険料
- 請求書
2012年03月24日(土)
■ [java] Javaの日本語ドキュメント
http://java.sun.com/ が繋がらない。そうするとJavaの日本語ドキュメントが読めなくて困る。
英語でよければ
で見られるが、オラクルのサイトに日本語版は見当たらない。
ちょっと探して、次のページで日本語ドキュメントがダウンロードできるようになっているのを見つけた。
「※HTMLファイルを圧縮し、提供しております」とあるけど、圧縮はされておらずダウンロードに時間がかかる。
(追記)
オラクルのサイトで日本語ドキュメントが公開されるようになっていたのでメモ。
- 続:旧 Java SE API リファレンスへの新しいリンク先変更について (寺田 佳央 – Yoshio Terada)
あと、java.sun.com は、トップページはオラクルのサイトへリダイレクトされてしまうけど、配下にあるドキュメントは読めるみたい。
■ やること
- 請求書
2021年03月24日(水)
■ [typescript] 関数を表す型の書き方
TypeScriptで、関数を表す型の宣言方法がなかなかわからなかったのでメモ。
- Function Type Expressions (typescriptlang.org)
に説明があった。「(パラメータ名: パラメータ型) => 戻り値型」のように書けばよい。パラメータ名は省略できない。
let f: (lhs: number, rhs: number) => number;
f = (a: number, b: number) => { return a + b; };