2009-11-06 :-)
_ 朝ッ
0530 起床
_ 仕事
0830 出勤
_ [アイスソード]一番好きな剣はアイスソード(ロマンシングサガ1)
( via おまえらがゲームで一番好きな剣 )
次に好きなのはレフトハンドソード(ロマンシングサガ1)
「アイスソード」( 氷の剣 )「レフトハンドソード」( 左手の剣 )という名前だけ見るとあまり強そうに見えないのだが、じつはロマンシングサガ1 では「アイスソード」「レフトハンドソード」は最強の攻撃力をもった武器である。各々の特徴はこう。「攻撃力」はNTT出版の攻略本に書いてあった数値。ゲーム内に登場したか忘れた。
- アイスソード
- 両手剣
- 攻撃力 16
- 氷属性
- レフトハンドソード
- 片手剣
- 攻撃力 14
- 左利きの者が装備すると強い
アイスソードは両手剣で最強であり、レフトハンドソードは片手剣で最強である。
ロマンシングサガと同じメーカー スクウェアの他の作品には「エクスカリバー」「ラグナロク」「デュランダル」「アポカリプス」「あめのむらくも(天叢雲剣)」など何かの伝説に登場する名前を使った武器があり、そういう武器はたいてい強力か、または最強である。名前どおり強い攻撃力をもっているのである。
しかしロマンシングサガ1 は違う。最強クラスの武器であっても名前はとくに強そうに見えないのである。名前だけならなんの変哲もないのだがじつは最強の攻撃力をもっている。ロマンシングサガ1 をプレイする前にはファイナルファンタジー4( FF4 )をプレイ済みだったので、FF4 の「アイスブランド」のような印象があった。「アイスブランド」は中盤で登場する氷属性の武器である。後半ではさっぱり使わない。というくらいの存在。そのような印象があったので「アイスソード」にも同じ印象を持ったのである。しかし「アイスブランド」と違い「アイスソード」は最強の武器であった。ロマンシングサガ1 を初めてプレイしたときは、このギャップにときめきを感じたものだ。
なお、ロマンシングサガ2 以降は「竜燐の剣」「七星剣」「竜槍スマウグ」「幻魔」など強そうな名前の武器が登場するようになったので、このトキメキは感じない。
_ sendmail: File descriptors missing on startup: stdout, stderr; Bad file descriptor
というログが書かれたという話題があったので釣られてみた。だいぶ前に @yo_1 が googleコード検索で sendmail のコードを読んでたので読んでみた。この辺かっていう
main.c - sendmail/src - Code Search
/* ** Be sure we have enough file descriptors. ** But also be sure that 0, 1, & 2 are open. */ fill_fd(STDIN_FILENO, NULL); fill_fd(STDOUT_FILENO, NULL); fill_fd(STDERR_FILENO, NULL); i = DtableSize; while (--i > 0) { if (i != STDIN_FILENO && i != STDOUT_FILENO && i != STDERR_FILENO) (void) close(i); } errno = 0; #if LOG # ifdef LOG_MAIL openlog("sendmail", LOG_PID, LOG_MAIL); # else openlog("sendmail", LOG_PID); # endif #endif if (MissingFds != 0) { char mbuf[MAXLINE]; mbuf[0] = '\0'; if (bitset(1 << STDIN_FILENO, MissingFds)) strcat(mbuf, ", stdin"); if (bitset(1 << STDOUT_FILENO, MissingFds)) strcat(mbuf, ", stdout"); if (bitset(1 << STDERR_FILENO, MissingFds)) strcat(mbuf, ", stderr"); syserr("File descriptors missing on startup: %s", &mbuf[2]); }
MissingFds は fill_fd でセットしてる。fstat(2) が失敗してるもよう。
/* ** FILL_FD -- make sure a file descriptor has been properly allocated ** ** Used to make sure that stdin/out/err are allocated on startup ** ** Parameters: ** fd -- the file descriptor to be filled. ** where -- a string used for logging. If NULL, this is ** being called on startup, and logging should ** not be done. ** ** Returns: ** none */ void fill_fd(fd, where) int fd; char *where; { int i; struct stat stbuf; if (fstat(fd, &stbuf) >= 0 || errno != EBADF) return; if (where != NULL) syserr("fill_fd: %s: fd %d not open", where, fd); else MissingFds |= 1 << fd; i = open("/dev/null", fd == 0 ? O_RDONLY : O_WRONLY, 0666); if (i < 0) { syserr("!fill_fd: %s: cannot open /dev/null", where == NULL ? "startup" : where); } if (fd != i) { (void) dup2(i, fd); (void) close(i); } }
続きは寝て待て。