四方山話 ( 2003/07/01 - 2003/12/31 )


かなり長い間、お休みします。もうずーっと、お休み したいです。



2003/12/20 (Sat)
このところ、サーバからファイルを ftp で download し、その ファイル中のデータを DB ( MS-Access ) に登録するというプログラム ( WSH スクリプト ) を作っていた。残念ながら ftp を WSH で実装するだけの 能力はないので、今回は Win2k 付属の ftp.exe を利用することにした。なお 、Win2k 付属の ftp.exe には -s オプションというのがあり、指定したファ イルに ftp コマンドを記述しておくと自動的にそれらを実行してくれるとい う機能がある。詳しくは ftp --help を見てもらうとして、今回の ftp コマ ンドファイルの内容は以下のような感じ。
open server.fujiuchi.or.jp
user
password
cd data
lcd C:\データ\temp
prompt off
mget z01*.dhr
bye

日本語のディレクトリ名は私のポリシーには反するのだが、やむ にやまれぬ事情によるもので仕方がない。スクリプト自体は完成して、テスト でも正常動作することを確認したのだが、テスト運用中たまに ftp.exe がア プリケーション エラーになることがあった。最初は WSH スクリプトから WScript.Shell を利用して ftp.exe を実行しているのが原因ではないかと思 い、bat ファイルで ftp.exe を実行してから WSH プログラム ( DB データ登 録 ) を実行するように変更した。んが、やっぱりたまに ftp.exe がアプリケ ーション エラーで異常終了してしまう。なぜだ...ただたんに ftp を実行し ているだけじゃないか。うわーん(泣) そんなわけでなんかヒントはないかと Microsoft を検索してい たら、ありました、ヒントじゃなくて答えが。

なんだよ、Win2k のバグじゃねーか。こらーーー(怒) おまけに英語 版はちゃんと「put or lcd」と書いてあるのに、日本語版では「put など」と lcd が省略されてるし。そんなことするから検索の時に最初に日本語版がみつ からんかったんだーーー(怒)それに英語版を見るとどうやら同じバグが WinXP にもあるようだが、日本語版では WinXP に関する情報がいっさいない...駄目 だこりゃ。日本語版、情報量少なすぎ。つーか、少なくとも英語版の情報と同 等量を提示してくれよ。ほんと機械翻訳の方がまだましだぜ、put を「おく」 ってしていても(笑)そんなわけで Win2k の場合には SP4 を適用すればこのバ グは解決するようですが、これまたやむにやまれぬ事情により SP なんて適用 できるわけがありません。はぁ...しょうがない、ftp.exe で lcd せずに、bat ファイル内で cd する方針にしよう。そんなわけで今回、 bat ファイルの書 き方まで勉強 ( 復習 ) したし、せっかくなんで作成した bat ファイルもの せときます。bat ファイルなんて、なつかしーでしょ。

@echo off
set FtpDir=C:\データ\temp
set FtpCmdFile=C:\データ\ftpcmd.txt

if not exist %FtpDir% mkdir %FtpDir%
%SystemRoot%\system32\cscript.exe C:\makeftp.vbs //Nologo %FtpCmdFile%
if %errorlevel% NEQ 0 goto :EOF
cd /d %FtpDir%
%SystemRoot%\system32\ftp.exe -s:%FtpCmdFile%
%SystemRoot%\system32\cscript.exe C:\updatedb.vbs //Nologo %FtpDir%

とりあえずこれでしばらくテスト運用して、様子を見てみたいと 思います。さてと、あとは早くネットワークプログラムの続きをまとめないと なぁ。さらに今回の件で以前 MS-Access のファイルにアクセスする方法とか なんとか言っていたのを思い出した。そ れもまとめてしまわないと。これは...年内は無理かなぁ。

(追記) 上記 bat ファイルの一部を修正した。

2003/11/30 (Sun)
十一月中に例のプログラムに関してまとめよう、と思ってたんだ けど、月日の流れは思った以上に速く、またなかなか暇がなかったため、結局 まとめられなかった。今年中に何とかなるだろうか...

2003/10/31 (Fri)
十月も今日で終わり。月の前半は情報処理技術者試験の勉強に費 やし、後半はその試験の出来に絶望にしているうちに過ぎていく。あああ...無 気力だ。さてこの憂鬱から抜け出せる日はやってくるのだろうか。やってくる といいなぁ...お願い、早くやってきて。そんなわけで久々に更新しようと思っ たけど、ネタがない。うーん、なんかないかなー、なんもないよなー、なんも してないもんなー。ああそうだ、最近気が付いたことを。以前 download した Win2k SP4 が install できなかったことがあった。友人の協力を得て、 download したファイルが壊れているわけではないことは確認した。だけど exe ファイルを実行すると、「指定されたデバイス、パス、またはファイル へのアクセスは拒否されました。」というメッセージが出て install できな かった。結局この時はデータを CD-R にバックアップし、Win2k を再 install したら何故か install できたので、きっと個別に適用した Win2k の patch が悪さをしていたんだと考えていた。で、先日、VMware Workstation 4.0.5 build-6030 を Win2k に install しようと思ったら、同じメッセージが!!う がー、また Win2k の再 install か?そんなの面倒だから嫌だー、で、いろい ろ弄繰り回している時に何故かふと気が付いた。アクセス権か...普段はユーザ 「藤内」で自動ログオンしているのだが、VMware を install するときに「日 本語名ユーザじゃまずかろう」と気をきかせ、administrator でログオンし直 して install しようとしていたのだ。で、エラーが出てすっかり install あきらめ、しかしあきらめきれずにぼーっとファイルのプロパティを見ていて 偶然アクセス権の項目を見てみたらユーザ「藤内」のみ実行可能になっており、 administrator では実行できないことに気が付いた。すぐに administrator でも実行できるように(実際にはフル コントロール)に設定しなおし、無事 install することができた。で思った。多分 Win2k SP4 のときも同じ理由だ ったんだろうなぁ...もうちょっとわかりやすいメッセージしてくれよ...とい うか、最初の「デバイス」という言葉に惑わされてしまった。不覚...で、どー にかこーにか無事に install できた VMware ですが、「Cannot get temporary directory for log file.」というエラーメッセージが出て virtual machine がまったく起動しない。何故なんだ...とにかく log file 用ディレクトリが 設定できないとかそういう意味なんだろうから、VMware の設定を確認してみよ うと思ったのだが、どこを見れば良いんだ。いろいろ調べてみたが、解決方法 の糸口はまったく見つからず。仕方がない、 VMware の WebPage をあさるか、英語だけど。とほほ。がさごそ、がさご そ。ん?こ、これは!どうやら VMware 4.x for Windows では環境変数 TEMP の下に一時ファイルを作成するらしい。現在の設定を確認してみると「 %USERPROFILE%\Local Settings\Temp」となっており、ユーザ名が「藤内」だか ら...そーか、これが悪かったのか?とりあえず環境変数 TEMP とついでに環境 変数 TMP の値を「C:\TEMP」に変更して、VMware を起動しなおし virtual machine を start をさせてみると...やったぁ、無事起動したよぉ。さーて それじゃあ Linux を install して、ネットワークプログラムの続きでもやり ますか。いやまあ実際、次の例題プログラムはできてるんだけど、説明文(ん なたいそうなもんじゃないけど)を考えるのが億劫で...

2003/09/28 (Sun)
ふぁいたたたた...なんでか、口内炎だらけで痛い痛い。まとも にしゃべることもできないくらい痛い。毎日ビタミン剤をちゃんと飲んでいる のだが、一向に治る気配なし。それどころかひどくなっているような...困っ たもんだ。そんなわけで口内炎の治療法について 調べてみた 。ちなみに口内炎の主な原因はやはり栄養不足 ( 特にビタミン B2 ) らしい。そんなわけでこれまで以上にビタミン剤投入決定。 ちなみにビタミン B 群や C は水溶性なので、大量摂取しても過剰分は尿と一 緒に排泄されるが、ビタミン A や D は脂溶性で過剰摂取するとビタミン過剰 症っつーものになるらしい。しらんかった...なんでもかんでも大量にとれば いいってもんじゃないんだね。それから口内を清潔に保つのも重要らしい。お お、これから寒くなるということで、風邪対策にうがい薬をこの間買ったばっ かりだ。さっそくうがいをする。少ししみて痛いが、我慢我慢。うがいは一日 五六回するのがいいらしいが、まあ出来る限りすることにする。とりあえずこ れ以上の対策としては、医者に行って薬をもらうくらいしかなさそうだ。後は 気長に直るのを待つしかないな。ふぁやくにゃおってふれー、ふぁいたたたた...

2003/09/21 (Sun)
こ、これがサラミ法が...って違!!で、ふと思い出したのだが、 サラミ法というとスーパーマンだよね。あれって第何作だったっけ?しかしあ の作品、今思い出してみると(しかしあまり詳しくは思い出せないけど)かなり 無茶苦茶だったよねぇ...というわけで、他人が入力した Excel データの確認 作業をしていたときの話。これがなぜか紙上での合計結果と SUM した結果が 微妙に違うんだよな。なぜだ、なぜなんだー、と何度も電卓をたたいたり、一 部分を SUM してみたりしたけど、原因は特定できず。これは Excel の SUM 関数が腐っているんだな、という結論に落ち着こうとしたその瞬間、すべての 謎が解けた。入力されたデータはすべて小数点一桁で、またセルの書式設定で 小数点一桁しか表示しないようになっている。んが、入力ミスでところどころ 小数点二桁にごみがくっついている模様。ばかやろー>入力した奴。小数点二 桁以上を表示するようにして目視で確認してもいいけど、データ数は 365 日 * 24 時間なので、これを一つ一つ調べていくのは不可能だ(大袈裟)。そんな わけでプログラム作成。最初に見つけた小数点二桁以上のデータ(セル)を active にして、データを確認して修正しよう。だけど、小数点二桁以上のデー タかどうかってどうやって判別するんだろ?えーっと...うーんと...ってそん な深く考えるこっちゃない、どーせ今回の調査限りなんだから、適当に作って 適当に動けばいいんだよな。そんなわけでちゃっちゃと作成して、ちゃっちゃ とチェック。うわ、出てくるわ出てくるわ。そんなわけで全てのデータを確認・ 修正したら、SUM した結果と紙上での合計結果が同じになって一件落着。

2003/09/15 (Mon)
ネットワークプログラミングの寄り道。 byte order ( リトルエ ンディアンとかビッグエンディアンとか ) を変換する関数の紹介。調べた限 りでは、四種類あるらしい。使う前に netinet/in.h を include してくださ いね。
(追記) コンピュータ用語を 過去の四方山話に追加。

2003/09/14 (Sun)
朝飯を食ってごろごろしているところに、電話がかかってくる。 うちの家の電話は年に五回位しかならない、さらにその内三回位は間違い電話 なので、かなりびっくり。というか、最初は何の音かわからなかった。あまり にもならないので電話機自体が物に埋もれていて、掘り出して電話に出る。何 事かと思えば、あの(?)ビデオリサーチ 社から。えーマジで?嘘くせー、こんな田舎に電話してくるわけねーよなぁ と思いつつ、とりあえず面白そうなので話を聞いてみる。きっとあれだな、どっ かに呼び出されて、高い教材とかを買わされるんだな。昔、そんな電話があっ たなぁ。映画とかいろんなものが安くなるカードをただであげるから取りに来 いといわれて、面倒だったので取りに行かなかったことがある。それと同じパ ターンだな。今回はどんなパターンかと思ったら、新聞に関する調査をやって いるらしい。は?ビデオリサーチなのに?まあいいや、それでアンケートに協 力して欲しいといわれたので、とりあえず了承する。なんか詐欺っぽくないし、 なんか貴重な体験っぽかったので、住所とか名前とかをぺらぺら。電話番号は... 電話がかかってきた時点で、ぜんぜんばれていているし、聞かれもしなかった (あたりまえ)。さて、アンケート用紙は来月中旬頃に送られてくるらしい。は たして本物のビデオリサーチだったのでしょうか?と、思ったら、WebPage に それらしきこと(第 3 回「全国新聞総合調査(J-READ)」)が書いてあった。 というか、ビデオリサーチ、いろんな調査やってるんだねぇ。知らなかったよ。 となると、どういう内容なのかが楽しみだねぇ。というか、みんなに言いふら してもいいのだろうか?内緒にしてねとは言われなかったし、ま、いいか。

2003/09/11 (Thu)
まだまだ続きます、ネットワークプログラミング。前回のプログ ラムでは接続先が 127.0.0.1 に固定していましたが、コマンドラインから接 続先 IP アドレスを指定できるように改造しましょう。しかし IP アドレスは 8 ビットごとに . (ドット) で区切って表現することが多いので、できれば この表現方法で指定したいものです。となると引数の文字列を最初から順番に 見ていって、それを unsigned int ( 正確に言うと int が 32 bit だという 保証はないので、uint32_t を使った方がよいようですが ) に変換するプロ グラムを作成しなくては...と、そんな心配はご無用、ちゃんと変換する関数 が最初から用意されているので、それを利用します。そんなわけで改造した結 果は以下のとおり。ですが、スペースの関係上、main 関数のみ掲載しておき ます。
 12  int main( int argc, char *argv[] )
 13  {
 14    int                 sockfd, i;
 15    char                buf[BUFMAX+1];
 16    struct sockaddr_in  addr;
 17  
 18    if( argc != 2 ) return 1;
 19    sockfd = socket( AF_INET, SOCK_STREAM, 0 );
 20    if( sockfd == 0 ) return 2;
 30    memset( &addr, 0, sizeof( addr ) );
 31    addr.sin_family = AF_INET;
 32    if( inet_pton( AF_INET, argv[1], &addr.sin_addr ) <= 0 )
 33      return 3;
 34    addr.sin_port = htons(13);
 35    i = connect( sockfd, ( struct sockaddr * )&addr, sizeof( addr ) );
 36    if( i < 0 ) return 4;
 37    while( ( i = read( sockfd, buf, BUFMAX ) ) > 0 ){
 38      buf[i] = '\0';
 39      fputs( buf, stdout );
 40    }
 41    close( sockfd );
 42    return 0;
 43  }
return で返す数字で debug するというのは、もうはや破綻しており ます(笑) まあサンプルプログラムなんで気にしないことにしましょう。今回 のポイントは inet_pton 関数です。この関数は 8 ビットごとドット区切表記 (この表記方法、なんて言うんでしょうね。man には dotted-quad format と 書いてありましたが)の文字列を構造体 in_addr に変換(格納?)してくれま す。では早速動作確認。
% ./a.out 127.0.0.1
11 SEP 2003 00:27:56 JST
% ./a.out localhost
% echo $status
3
% ./a.out www.fujiuchi.or.jp
% echo $status
3
%
そんなわけで IP アドレスが無事変換されていそうなことが確認でき ました。んがしかし、普通は 8 ビットごとドット区切表記ではなく、ホスト名 (例えば www.fujiuchi.or.jp とか → 実際にはこんなホスト名...ないですよ ね?)でサーバ(通信相手)を指定しますよね。そーゆー場合にはどうするの か。これまた、それようの関数が最初から用意されているのでそれを利用しま す。余計な心配御無用といったところか、至れり尽せりといったところか。そ んなわけでサンプルプログラムは以下のとおり。
  1  #include <stdio.h>
  2  #include <stdlib.h>
  3  #include <string.h>
  4  #include <sys/types.h>
  5  #include <sys/socket.h>
  6  #include <netinet/in.h>
  7  #include <arpa/inet.h>
  8  #include <unistd.h>
  9  #include <netdb.h>
 10  
 11  #define BUFMAX  20
 12  
 13  int main( int argc, char *argv[] )
 14  {
 15    int                 sockfd, i;
 16    char                buf[BUFMAX+1];
 17    struct sockaddr_in  addr;
 18    struct hostent     *hp;
 19    struct servent     *sp;
 20  
 21    if( argc != 2 ) return 1;
 22    hp = gethostbyname( argv[1] );
 23    if( hp == NULL ) return 2;
 24    sp = getservbyname( "daytime", "tcp" );
 25    if( sp == NULL ) return 3;
 26    sockfd = socket( hp->h_addrtype, SOCK_STREAM, 0 );
 27    if( sockfd == 0 ) return 4;
 28    memset( &addr, 0, sizeof( addr ) );
 29    memcpy( &addr.sin_addr, hp->h_addr, hp->h_length );
 30    addr.sin_family = hp->h_addrtype;
 31    addr.sin_port = sp->s_port;
 32    i = connect( sockfd, ( struct sockaddr * )&addr, sizeof( addr ) );
 33    if( i < 0 ) return 4;
 34    while( ( i = read( sockfd, buf, BUFMAX ) ) > 0 ){
 35      buf[i] = '\0';
 36      fputs( buf, stdout );
 37    }
 38    close( sockfd );
 39    return 0;
 40  }
あー、return の数字を直すのが面倒だ。この方法、やっぱ駄目です ね(笑) ホスト名を変換(格納?)する関数 gethostbyname 関数と、おまけで サービス名を変換(格納?)する関数 getservbyname 関数も利用しています。 おのおのの詳しい説明は、man を見てください(あいかわらずなげやり)。そん なわけで実行結果は以下のとおり。
% ./a.out 127.0.0.1
11 SEP 2003 00:29:26 JST
% ./a.out localhost
11 SEP 2003 00:29:32 JST
% ./a.out www.fujiuchi.or.jp
11 SEP 2003 00:29:41 JST
% ./a.out www.hoge.co.jp
% echo $status
2
%
これでクライアントプログラムの一通りの説明はしたように思えま すが、実はもう一歩先があります。それについてはまた次回に。

2003/09/05 (Fri)
「ぶちっ」...何だろうと思ったら、ズボンのホックが弾き飛ん でしまった。い、いかん!!太っちまったよ、と急いで体重をはかってみたと ころ、夏前から + 2 kg というからまあさほどではない。って、そんなわけ はなく、これはまずい、激しくまずい。夏は暑いのでつい家でごろごろして しまうのと、試験勉強のためあまり運動しなかったのが原因だろう。しかし そろそろ涼しくなってきたし、ダイエットせねば、ということで今日から開 始。そんなわけで軽く 30 分ほどウォーキングしてみた。本当は毎日の方が いいのだろうが時間の関係上そうもいかず、今後も時間の許す限りウォーキ ングをがんばろう。夜は久々に裁縫。本当に久々だなぁ。何とか無理矢理に でもホックをつけたかったが結局うまくいかず。仕方がない、どこかで新品 のホックを買ってこよう。

2003/09/03 (Wed)
先日のサンプルプログラムの追記、というよりは訂正。ファイル も open したら close するように、socket も close しましょう。
 28     }
 29     close( sockfd );
 30     return 0;
 31  }
あと、memset 関数を使っているのに、string.h を include するの を忘れてました。最初のほうに追加しておいてください。

2003/08/29 (Fri)
どうやらネットワークプログラミングは作成しなくて済みそうな 雰囲気。せっかく Linux ( RedHat 8.0 ) で socket 関連を勉強してたのに... ちょっと残念。しかし今後の展開がどうなるかはわからないので、メモとして 残しておくことにする。ちなみに昔作ったプログラムは何とか見つかり適当に 参考にしたが、今回のプログラミングで大いに参考にしたのはネットワークプ ログラミングのバイブル「UNIX ネットワークプログラミング Vol.1 第二版」 である。世の中にはネットワークプログラミングに関する参考書が多く出版さ れているが、金を無駄にしたくないのならこの本を買え、他の参考書はまった くの不必要だぁ!!、といっても過言ではない(強気)。さて今回は上記の本でも 最初のサンプルとして出てくる daytime クライアントを作ってみた。まずは daytime がサービスされているか確認してみる。
% telnet 127.0.0.1 13
Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Connection refused
%
...あれ、どーやらサービスが動いてないらしい。ま、これは不要な サービスは動かさないという、セキュリティの基本ですね。そんなわけでちょ っと調べてみましたが、そーか、inetd じゃななくて xinetd なのか... xinetd なんかさわったことないからよくわからないんだけどなぁ。
% cd /etc/xinetd.d/
% ls -aF
./       chargen-udp  dbskkd-cdb  finger  rlogin  servers   talk    time-udp
../      daytime      echo        ntalk   rsh     services  telnet
chargen  daytime-udp  echo-udp    rexec   rsync   sgi_fam   time
% more daytime
# default: off
# description: A daytime server. This is the tcp \
# version.
service daytime
{
        disable = yes
        type            = INTERNAL
        id              = daytime-stream
        socket_type     = stream
        protocol        = tcp
        user            = root
        wait            = no
}
% su -
# vi /etc/xinetd.d/daytime
disable = no に変更
# ps aux | grep xinetd
root       631  0.0  0.4  2092  900 ?        S    12:51   0:00 xinetd -stayalive
root      1248  0.0  0.3  3476  648 pts/4    S    13:37   0:00 grep xinetd
# kill -HUP 631
# exit
% telnet 127.0.0.1 13
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
29 AUG 2003 21:15:44 JST
Connection closed by foreign host.
%
というわけで無事に daytime サービスの動作確認終了。次に参考書 などを参考にできる限りシンプルなプログラムを作成してみました。ただし本 当にシンプルなプログラムかどうかは疑問が残るところではありますが...そ んなわけで、以下のプログラムは参考書に掲載されている例題プログラムとま ったく一緒というわけではありませんので、ご注意ください。
  1  #include <stdio.h>
  2  #include <stdlib.h>
  3  #include <sys/types.h>
  4  #include <sys/socket.h>
  5  #include <netinet/in.h>
  6  #include <arpa/inet.h>
  7  #include <unistd.h>
  8  
  9  #define BUFMAX  20
 10  
 11  int main( int argc, char *argv[] )
 12  {
 13     int                 sockfd, i;
 14     char                buf[BUFMAX+1];
 15     struct sockaddr_in  addr;
 16  
 17     sockfd = socket( AF_INET, SOCK_STREAM, 0 );
 18     if( sockfd == 0 ) return 1;
 19     memset( &addr, 0, sizeof( addr ) );
 20     addr.sin_family = AF_INET;
 21     addr.sin_addr.s_addr = htonl( 0x7F000001 ); /* 127.0.0.1 */
 22     addr.sin_port = htons( 13 );
 23     i = connect( sockfd, ( struct sockaddr * )&addr, sizeof( addr ) );
 24     if( i < 0 ) return 2;
 25     while( ( i = read( sockfd, buf, BUFMAX ) ) > 0 ){
 26        buf[i] = '\0';
 27        fputs( buf, stdout );
 28     }
 29     return 0;
 30  }
えーっと、一応簡単な説明を。17 行目でソケットを作成し、20 行目 から 22 行目までで通信先の IP アドレスなどを変数に格納、23 行目で接続を 試みて、25 行目の while 文の部分でサーバからの応答を読み込み標準出力に 出力するという流れになっています。17 行目の AF_INET とか SOCK_STREAM の 説明は...また今度ということで(笑) とりあえず TCP/IPv4 の場合は AF_INET と SOCK_STREAM ということで間違いないと思う。ちなみに UDP/IPv4 は AF_INET / SOCK_DGRAM だと思う。19 行目の memset 関数は bzero 関数で も良いのですが、 man bzero に bzero 関数より memset 関数を使えというよ うなことが書いてあったので、今回は memset 関数を利用しています。21 行目 の 16 進数で 0x7F000001 という謎の数字は、8 ビットごとに区切り 10 進数 に直すと 127.0.0.1 になります。htonl 関数と htons 関数は... byte order をネットワークに適したものに自動的に変換してくれるということでご了承 ください。それから構造体 sockaddr_in とか sockaddr とかは以下のプリプ ロセッサ結果からの抜粋を見てください。
% gcc -E sample.c
関係個所を抜粋
typedef unsigned short int sa_family_t;

struct sockaddr
  {
    sa_family_t sa_family;
    char sa_data[14];
  };

typedef uint16_t in_port_t;

typedef uint32_t in_addr_t;
struct in_addr
  {
    in_addr_t s_addr;
  };

struct sockaddr_in
  {
    sa_family_t sin_family;
    in_port_t sin_port;
    struct in_addr sin_addr;


    unsigned char sin_zero[sizeof (struct sockaddr) -
                           (sizeof (unsigned short int)) -
                           sizeof (in_port_t) -
                           sizeof (struct in_addr)];
  };
説明が投げやりなのはいつものこと(笑) というかこの説明で十分だ よね。後はなんか変なこと書いてなければ良いけど...最後にデバグの際のヒ ント。というか printf 関数とか使えば良いという話もあるけど、だって面倒 じゃん。
サービスされている場合
tcsh% ./a.out
29 AUG 2003 22:00:58 JST
tcsh% echo $status
0
tcsh%
サービスされていない場合
tcsh% ./a.out
tcsh% echo $status
2
tcsh%
え? tcsh 以外の場合はどうするんだですって? そんなこと知りません 。私は tcsh 使いですから(笑)

2003/08/26 (Tue)
気が付くともう夏も終わり。今年はなんだか涼しかったし、雨が 多い夏だったような気がする。冷夏ですごしやすかったのでそれはそれでよか ったのだが、問題は農作物への影響である。野菜とか値段が上がらないといい なぁ。米はなんとかなるあてがあるからあるからいいけど。

さて、久々(?)に公式紹介シリーズ第 ? 回。何回目かは調べるのが面倒だ し、ま、どーでもいいでしょ。で、真空中の光速を c [m3/m]、真 空の誘電率を ε0 [F/m]、真空の透磁率 μ0 [H/m] とすると、

c = 1 / √ε0 μ0

となります。ちなみに誘電率 ε ( 比誘電率 εr ) 、透磁率 μ ( 比透磁率 μr ) の媒体中の光速 v [m3/m] は、

v = 1 / √ε μ = c / √εr μr

となります。さて次は表皮効果 ( skin effect ) の話。電流密度が 1 / e2 以上となる表面からの導体の厚さを「表皮厚さ」と言い、以 下の式で表されます。

δ = 1 / √π f μ σ

ただし、δ [m] : 表皮厚さ、f [Hz] : 周波数、μ [H/m] : 導体の 透磁率、σ : 導体の伝導率 です。
(追記) 導体の伝導度 → 導体の伝導率に修正、単位は [S/m] です。
(追記) 伝導率ですが他の参考書にでは「導電率」となってました。ど ちらにしても「抵抗率 ρ [Ω m]」の逆数です。
(追記) さて 光速と誘電率、透磁率の関係ですが、ちょっと検証してみましょう。真空中の 光速は約 3 * 108 m/s です。誘電率のほうは クーロンの法則がら みで 1 / 4 π ε0 = 9 * 109 と近似され ます。となると透磁率 μ0 = 1 / ( 光速 c2 * 誘 電率 ε0 ) = ( 4 * π / c2 ) * ( 1 / 4 * π * ε0 ) = ( 4 * π / 9 * 1016 ) * 9 * 109 = 4 * π * 10-7 と計算できます。 ( 2004/06/08 )
(追記) ちなみに √ μ0 / ε0 = 120 * π [Ω] で、これは真空中の電磁波の固有インピーダンスです 。はいこれ、試験に出ますよー(なんの?)

2003/07/30 (Wed)
もしかすると、Windows で動作するネットワークプログラムを作 成しなければいけない可能性が出てきたので、ちょっと事前調査してみる。そ んなわけで、ネットをぐるぐる。大 体 Windows 用プログラムなんてほとんど作ったことがないのに、いきなりネッ トワークプログラムとはかなり無茶な話である。というか、ネットワークプロ グラム自体も作成したことは...一応あるなぁ、かなり大昔に。そのときに作成 したプログラム、どこにいったかなぁ。などと考えているうちに、とある Page に行き着く。まあ、今回のネットワークプログラムを作るのにはあまり参考 にはなりそうもないのだが、なんだかなぁ...この C 言語サンプルプログラム は。ブロック先頭で変数を定義しているよ。
void func( void )
{
   int i;    /* これは OK */
   {
      int j; /* これは構文エラー */
   }
}
そんなこと ANSI じゃできない...あれ?できるんだ?調べてみたらちゃんと K&R 第2版 に書いてあった...(私の手元にある本では p.102 「4.8 ブロ ック構造」にはっきりと) がーん、これは gcc の方言だと思っていた。うー ん、ま、いっか。一つ勉強になったし(苦笑)。だけど関数内の static 変数の ポインタを return し、他の関数で利用するのは決して良いプログラムとはい えないと思うのだが。なんて偉そうなこと言っても、C++ で恥ずかしいこと言 っている前歴があったりするので、これ 以上はやめておこう。それはさておき、Windows ( Visual C++ ) でも socket 関連 ( Winsock というらしい ) が用意されているらしいので、ちょっと Linux で socket 関連を勉強しなおしてみよう。しっかし、昔作ったプログラ ムのソース、どこへいったかなぁ...ふと思い出したが、Java でもちょっとネ ットワークプログラミングを勉強したことがあったような気がするけど、その プログラムもどこへいったんだろう。

2003/07/06 (Sun)
いつ始めたかもうすっかり忘れてしまったが、Final Fantasy 6 がようやく終わった。少しやってほったらかして、しばらくしてからまたはじ めて、少しだけプレイしてまた中断するといったことを繰り返し、クリアまで にえらく時間がかかってしまった。そのせいで、最初のほうの話なんてぜんぜ ん覚えていない。いろいろと伏線とかあったんだろうけどなぁ...ま、とにかく 、最終的な状況は以下のとおり。
ティナ ロック カイエン シャドウエドガーマッシュ セリス
48% (Lv.53)46% (Lv.54)45% (Lv.52) 43% (Lv.52)43% (Lv.52)52% (Lv.53) 51% (Lv.54)
ストラゴスリルムセッツァー モグ ガウ ゴゴ ウーマロ
40% (Lv.53)46% (Lv.52)45% (Lv.53) 44% (Lv.49)18% (Lv.32)50% (Lv.49) 43% (Lv.42)
FF 6 は SF で出たときに友人から借りてプレイしたのだが、最初の ほうで面倒臭くなってやめてしまった。これで FF は 1 から 9 まですべてク リアしたことになる。FF もあと残すところ X と X-2 か...なお IX について はクリアという概念がなさそうなので無視。決してネットワーク環境が駄目駄 目でプレイできないからではない(泣)

2003/07/01 (Tue)
七月だー、もうすぐ暑い夏だー、暑いのは嫌いだー。そんなわけ で更新停滞だー。ところで、今年の梅雨はよく雨が降るような気がするのは気 のせいでしょうか。渇水になるよりは良いですけど、蒸し蒸しするのはやだな ぁ。洗濯物も乾かないしねぇ。


Copyright(C) 2003-2004 Hiroaki Fujiuchi ( fujiuchi@s7.xrea.com )
inserted by FC2 system