These pages are written by only Japanese.

Welcom to My Diary.com
最新の日記タイトル一覧カテゴリ別タイトル一覧トップへ戻る〜

こんばんわ♪ 現在は4月26日(金)22時44分。 10時を過ぎて、そろそろ深夜に入ります。


hns - 日記自動生成システム - Version 2.19.5 (色々 Fixed)

先月 2002年12月 来月
01 02 03 04 05 06 07
08 09 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Namazu for hns による簡易全文検索です。
詳細は 詳細指定/ヘルプをご参照下さい。
検索式:

2002年12月21日(土)(自宅)

(自宅)

腰痛

お風呂でバブの泡を患部にぶつけて特に痛むところを 強制的に温めるようにしていたのですが、 今日になって、泡を当てても痛みを感じませんでした。
回復ぎみ

PeerCast ツッコミが…

PeerCastのポート解放は7144だけで良いそうです。
7144番に Servents/Data の許可を与え、
HTML/Broadcasting の許可は7145番に与えるように設定します。
そしてルータやファイアウォールには、
外部からの接続を7144番に対してだけ許可するよう設定します。
余計な事をしていたようです。 ipnat の設定から 7145 を外した後、 コマンドラインから手動でエントリを消去しました。
# ipnat -r -f -
rdr pppoe0 0.0.0.0/0 port 7145 -> 192.168.1.7 port 7145 tcp
^d

samba 大文字小文字の罠

samba で共有しているディスクを Windows 上でネットワークドライブとして マウントして、ディスクを整理していた時の話です。
ある似た目的で作成したフォルダをマージした所、 Foo と foo の2つのディレクトリが存在していて、 中身を確認したところ同じ内容でしたので、Foo を消去しました。
それから、foo の中身を確認した所、中身が空になっていました。(ρ_;
大事なデータも入っていましたので、頭が真っ白になりましたが、 少し落ち着いて考えたところ、 以下のような操作をしてしまったと理解できました。 前の会社に在籍していた時も同じ失敗をしたはずなのですが、 学習していないようです。自分…

ぶっくま〜く

Webサイト高速化のツボ - 顧客は“8秒”も待てない:

8秒ルールは有名ですし、今さらと言われそうですが、一応、再チェックです。 最近は更に気が短くなって、3秒ルールが出来そうな気配さえ感じます。

2002年12月22日(日)(自宅)

(自宅)

某師がお見舞いで来訪

差入れ、有り難うございます。(私信)
いまだ座り続ける事が出きない為、 途中から寝転がって話を聞いてしまいました。
すみません。

ぶっくま〜く

ピクセラ PIX-MPTV/P2W (TVキャプチャアダプタ ,ハードウェアエンコード,iTVC15 ,PCI):

ビデオ出力機能の追加に伴って、
MPEG-1/2のハードウェアデコード機能も付加されており、
ハードウェアデコードしたMPEG画像をそのままビデオ出力することができる。

DirectX 9.0 End-User Runtime - 日本語:

日本語版のダウンロードの手引きは現在準備中です。
現在のところ英語版のガイドのみご覧いただけます。
ドキュメント無しでソフトウェアをリリースするのは、さすがです。
この時点で導入する人柱指向の方々にとっては、英語で十分とも言えますが…
DirectX 9 のウリは、HW T&L の *1 廃止、Pixel&Vertex ShaderのProgrammable 化という話を聞いたのですが、 正直今、DirectX に手を付ける余裕が今ないので、 この辺の事情はさっぱり分かりません…

CD-Rの「音」を考える:

プレクスターに聞く「音の良いCD-Rドライブの作り方」
電源
PC の内部電源は最悪なので、外付けドライブを使用する
振動
振動でブレると良くないので、おもしを乗せる等して固定する
光学的ノイズ
ドライブは黒い方が音が引き締まる。
ただし、引き締まる分、歪みが目立つ可能性に注意。

*1: Hardware Transform & Lighting

2002年12月23日(月)(自宅)

(自宅)

vip マシン(Win2K pro)不調

半年位前から、 等と調子の良くない vip *2 マシンの Windows 2000 sp3 ですが、本日とうとう起動しなくなりました。
STOP: c000026e Unknown Hard Error
Unknown Hard Error
safe mode や、正常起動時の profile 等を利用しても、症状は変わりません。
あきらめて、OS を一からインストールする事にしました。

バックアップ:

dual でインストールしていた Windows98 で起動し、 まずは、Win2K がインストールされているドライブの Documents and Settings フォルダをバックアップ。

再インストール(?):

CD から起動して、Windows 2000 Setup を実行しましたが。
Setup is loading files (Qlogic QLA1080, 64bi bit PCI LVD SCSI HBA)...
上記の文が表示されたまま、次に進みません。
そこで、Third Party 製のドライブを手動でいれる方を選択肢して、 ドライバを選択しないで、進めたところ、セットアップ画面まで辿り着きました。
インストール
復元
の2択を迫られたので、ダメもとで復元を選び処理を任せたところ、 起動に成功し、logon して普通にツールを動かせるようになりました。
多少気持ち悪いですが、動いているので文句は言わない事にします。 今のうちに新しいマシンを調達せよという天の声かもしれませんが、 貧乏ですので延期です。

*1: これは Win98, WinNT, Win2K 全てで同じように起動できなくなったので、 ハード的な問題と推測してます。
*2: TwoTop の VIP シリーズとして購入していまして、 そのまま、vip というマシン名を付けています。

apt-get update

# apt-get update
取得:1 http://updates.vinelinux.org 2.6/i386/base/pkglist.updates [72.1kB]
	<略>
取得完了: 89.4kB を 3s (24.9kB/秒)
ファイル依存を処理しています... 完了
パッケージリストを読みこんでいます... エラー!
E: このシステムには 2 つ以上のバージョンのパッケージ 'j2sdk' がインストール
されています。この状態のままでは APT は正常に動作することはできません。
以下のどちらかを選択して実行してください。
  1) 古い方のパッケージを削除して、1 つのバージョンだけがインストール
     されている状態にしてください。又は、
  2) このパッケージの複数のバージョンを共存させておきたい場合は、
     このパッケージ名を 'RPM::AllowedDupPkgs' オプションに追加してください。
オプションは '/etc/apt/apt.conf' に書きます。分からない場合は、
1) の選択肢を選ばれることをお勧めします。
事情があり、jdk1.3 と 1.4 をインストールして環境変数で使い分けていました。
//   AllowedDupPkgs {"^kernel$"; "^kernel24$"; "kernel-smp"; "kernel24-smp"; \
 "kernel-enterprise"; "kernel-BOOT"; "kernel24-BOOT"; "^kernel22$"; \
 "^kernel22-smp\"; "^mol-kmods$"; "^mol-kmods22$"; };
// modified by yoya
// 2002/12/23 "^j2sdk"
 AllowedDupPkgs {"^kernel$"; "^kernel24$"; "kernel-smp"; "kernel24-smp";
 "kernel-enterprise"; "kernel-BOOT"; "kernel24-BOOT"; "^kernel22$"; 
 "^kernel22-smp"; "^mol-kmods$"; "^mol-kmods22$"; "^j2sdk"; };
以上のように /etc/apt/apt.conf を書き換えて、 apt-get update & apt-get upgrade を実行しました。
# apt-get upgrade
パッケージリストを読みこんでいます... 完了
依存情報ツリーを作成しています... 完了
以下のパッケージがアップグレードされます:
  w3m
1 個のアップグレードパッケージ, 0 個の新規パッケージ, 0 個の削除/リプレース
パッケージ, 0 個の保留パッケージがあります。
取得パッケージ: 481kB のアーカイブを取得します。インストール後は 457B が
使用されます。
続行しますか? [Y/n]Y
取得:1 http://www.t.ring.gr.jp 2.6/i386/updates w3m 0.3.2.2-0vl0.26 [481kB]
取得完了: 481kB を 0s (703kB/秒)
RPM コマンドを実行しています (-U)...
w3m                         ##################################################

hdparm

確認してみました。
# /sbin/hdparm -i /dev/hda

/dev/hda:

 Model=FUJITSU MPG3409AT E, FwRev=82B9, SerialNo=VH06T150CKP4
 Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs }
 RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=4
 BuffType=DualPortCache, BuffSize=2048kB, MaxMultSect=16, MultSect=16
 CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=80063424
 IORDY=yes, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120}
 PIO modes: pio0 pio1 pio2 pio3 pio4
 DMA modes: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 *udma5
 AdvancedPM=yes: disabled (255) WriteCache=enabled
 Drive Supports : ATA/ATAPI-5 T13 1321D revision 1 : ATA-1 ATA-2 ATA-3 ATA-4 ATA-5
ATA(100)で動いてるようです。

ぶっくま〜く

。。。:

RADEONのセットアップ:

各種DVD-Rメディアの記録品位:

動画ファイルコンバート:


2002年12月24日(火)(自宅)

(自宅)

病院

MRI の結果、ヘルニアと断定されました。
MRI の写真を見させて頂いたのですが、 椎間板第4-5間の場所にヘルニアが出来ていて 神経を3分の1から半分程度、押し潰していました。 非常に分かりやすい程に症状が進んでいるようです。
来年に復活できるのか微妙な状況になってきましたので、 会社にどう伝えればよいのか悩むところです。
出来れば予定通り来年の頭から出社したいのですが、 今月頭にも復活できるという予想も外れましたし…。
とにかく早く報告しないと…

ぶっくま〜く

Webサービス関係リンク集:

図面の公開、市民の利益と逆転判決:

太田裁判長は、一昨年12月に同研究所の社員が
近くのJR高槻駅で放射性同位元素の液体をまいた事件や、
昨年6月に同研究所の排水から発がん性の疑いのある物質
(1、2―ジクロロエタン)が下水道法の排水基準の
2倍以上検出されたことを指摘。
「研究所の事業は人の生命や身体、健康を害する現実的な可能性がある」
と判断した。
さすが JT 様です。

米国を脅かすもうひとつの恐怖〜魔手伸ばすエコテロリズム:

b-geeks.com 2002 (電網公式):

WinMX 自身には興味ありませんが、P2P アプリケーションは、 セキュリティー的にシビアなんだと改めて思いました。

2002年12月25日(水)(自宅)

(自宅)

BIGLOBE カスタマーサポートから葉書

「初期設定でお困りではないですか?」と記してあるはがきが届きました。
※このハガキは、ご入会いただいてから BIGLOBE サービスのご利用
実績のないお客様へ送付されていただいております。
既にご利用されている場合には、本書の到着についてご容赦下さい。 
なるほど。(^^;
すばらしい気の配りようです。

ぶっくま〜く

役所の無線LAN筒抜け 気象庁や都庁、相次ぎ利用停止:

経済産業省では、情報システム厚生課の無線LANの電波が、
外部から受信できる状況だった。パソコンに、
「ハリー・ポッター」などの映画やドラマ、アイドルのビデオなど
多くの不正コピーソフトが蓄積されていた。 
やはり、セキュリティーが甘いとこういう部分もチェックされるのですね。 他山の石とする事にします。
あ。念の為にいいますと、 悪い事は洩らさないようにという意味でなく、 ライセンス管理はしっかりしようという意味です。
例えば、我が家の Windows PC には1つひとつに、 AntiVirus ソフトが入っていますが、 Norton x2 + Trend x 1 + McFree 1 のライセンスを購入してますので、 これらのライセンスが重複してないか神経を使わされます。

経産省、「迷惑メール」撲滅に向けて特定商取引法改正へ:

「末承諾メール米」のような人や法律を馬鹿にしたメールを受け取った場合は、 どこに送れば良いのかという話をした時に見付けた URL です。
meiwaku@nissankyo.jpに送れば良さそうですね。

Alertbox 2002 年 ウェブ・デザインの間違いトップ 10(2002年12月23日):

ジャスラックとは:


2002年12月26日(木)(自宅)

(自宅)

Java 調査

Thread 関連:

それらしい、URL を並べてみます。 「コンカレント・プログラミングでよく発生する問題を回避する方法」 myjxta2 で利用しています。
Semaphore Mutex, CondVar 等、普通のマルチスレッドライブラリであれば 実装しているはずのクラスを補完してくれる便利なパッケージです。 98 年ごろから存在していたらしいのですが、 同期メソッドと同期ブロックでこと足りるような簡単なコードしか 書いて来ませんでしたので、チェックしていませんでした。 生成消滅の頻度が高いスレッドは、プールしておいて、 使いまわす方が良いという話です。

JXTA 関連:

その他:

wav ファイルを鳴らすサンプルプログラム 猿でも理解できそうな程、平易に説明されています。 ちょっとした変数を保存する場合、 Properties で load & store するより、Preference の方が楽ですね。 ただ、Windows を利用する場合にレジストリに格納されるのが 嫌な感じがします。 JDK1.5 で C++ のテンプレートを連想させるような機能が追加されるそうです。
JDK1.4 以前 # Cast だらけで汚れたコード
Vector stringVector = new Vector();
stringVector.add("hoge");
stringVector.add(new Integer(1));
String s = (String) stringVector.get(0);
String s1 = (String) stringVector.get(0); // runtime error!!
JDK1.5 以降 # 型に対して安全なスマートなコード
Vector<String> stringVector = new Vector<String>();
stringVector.add("hoge");
stringVector.add(new Integer(1)); // compile error!!
String s = stringVector.get(0);
今までわざわざ型毎に StringVector 等のクラスを自作していましたが、 これで楽が出来るかもしれません。 なるほど。これですか…

2万円以下のIEEE802.11b無線LANアクセスポイント9機種を比較する

無線 LAN の A.P. を購入するように家族から命令を受けていまして、 悩んでいたのですが、たまたま IRC で無線 A.P. 比較のページを 紹介されていましたので、参考にしてみました。
比較結果 を読みますと、
37m 付近でも変わらず 4Mbps オーバーを記録するのは,
アイ・オー・データ機器,アクトンテクノロジィ,アドテック,
プラネックスコミュニケーションズの4製品で,
これらは無線LANカードによる差もあまり生じていない。
と説明されていましたので、この中で、 「WAN 側 100MBps 対応 & 長距離通信」という条件に合う アドテック ADLINK340AP を最有力候補にしました。
この記事の best choice とされている製品でもありますので、 なんとなく記事に踊らされているような気もしますが… (^^;

ぶっくま〜く

マスコミの威力:

「藤島助役は、「公務で忙しい」(市秘書課)として取材に応じなかった」
というのは、現実に15年度予算の審議をしている真っ最中に予約もなく
取材申し入れをして直ちにコメントをよこせという方がおかしいのではないのか?
その日も午前中であれば時間はあったのに、
取材をしたいという話は全く聞いていなかった。
「取材に応じない」って文章を読むと、ついやましい事があるのではと 勘ぐってしまいますが、こういう事情もあるのですね。 (非常識で横暴な無礼極まりない)取材に最優先で対応してくれなかったりして機嫌を損ねると、こういう仕打ち待っているという事で 記事は気をつけて読まないといけないものだと考えさせられます。

「聖母はレイプ被害者」説の英番組に世界中から抗議:

当時、ヨセフ(←養父)の子と呼ばれず、 ガリラヤ(←地名)のイエスと呼ばれてたように、 イエスが周りから私生児として差別されていたのは事実らしいので、 否定は出来ないと思いますが、 せっかく、 千年以上に渡って築き上げて来た純潔の象徴としてのマリアのイメージを 今さらわざわざ崩そうとするのは、非常に勿体ない事だと感じます。
人が苦労して作ったものを壊す事に快感を感じるのは分かりますが、 それは背徳というものです。
僕はイエスには神の子であって欲しいと思います。 信仰心があるという訳ではなく、 そうでないと夢がありませんし、 神様は一人でも多い方が安心できるという、 むしろキリスト教と逆の方向でそう考えます。
中世ヨーロッパの頃のように教会が権力に取り入って他宗教を弾圧したり民衆を家畜のように支配するようになれば、自分もこうしたネガティブキャンペーンに乗せられるかもしれません…

長引くIT不況「撤退」後絶たず シリコンバレー 寂しい聖夜:


2002年12月27日(金)(自宅)

(自宅)

ぶっくま〜く

ご当地の踏み絵:

語尾は「じゃん」より、「べや」とか「だべ」を使うほうが多い。
これは、関西出身者に指摘されて始めて気付きました。

Windows 98-Me リソース不足の対策:

今だに、Windows98 を捨てられない自分としては、リソースはいまだ鬼門です。

知られざる世襲公務員たち −特定郵便局の研究−:

自民党の票田という事以外、情報がないのでどこまで本当か分かりませんが…

2002年12月28日(土)(自宅)

(自宅)

購入リスト

家の人が購入したものですが、家族で共有して使っています *1 ので、一応メモとして残します。

液晶テレビ FlexScan L465-BK:

無線 A.P. ADLINK 2422:

以前購入した Melco の A.P. と段違いといって良い程に快適です。 一階と二階で離れて使っていても、ssh で問題無く作業が出来ます。
また、A.P. に付属している 22M の無線カードを VAIO SRX7 に差して巨大なファイルを転送してみたところ、 A.P. の周辺では、4,5M Bps 程の速度が出ました。
尚、この実験のあと、VAIO SRX7 の内蔵無線 LAN 機能が 全く使えなくなりました。ADTEC のカードを外してもダメです。 同様の事をお試しになる方は重々お気をつけ下さい。(ρ_;
続く

*1: 恐らく、自分が一番使用頻度が高いと思いますし。

ぶっくま〜く

飼い主の死後、残されたペット達は…:

自分の死後残されるペットの行く末を心配する飼い主が増えている。
高齢化でペットとだけ暮らすお年寄りも多く、猫を終身で預かる施設も登場した。
これのハードディスク版を作るのはどうでしょう。
PC の箱等に連絡先を記した紙を張っておいて、 持ち主が死亡した時に(秘密の遺書に従って)確実に処理してくれるような…

icom AP-5000:

この会社の作るアンテナと増幅回路の性能が良いらしいと聞きましたので、 一応チェックです。
ADTEC のを購入する前に知っていれば… (泣

RBB TODAY (ブロードバンド情報サイト)-2002-12-27 [年末企画]無料サービスと立ち上がったばかりの有料サービスのせめぎ合い−公衆無線LANの「この1年」:

監視カメラ

このところ家の前にポイ捨てされるタバコの吸殻の数が半端でなくなった事と 年末になると人の家に火を放って暖まる方々が増える事もあり、 家が火事になる前に今すぐ動かせと家の人から命令を受けましたので、 かなり 今さら ですが、 監視カメラの画像を保存する仕組みを作ってみました。
# 所用時間 8 時間のでっちあげ作業

システム構成:

今となっては貧弱なシステムです。 MMX でさえありません。
  • NetBSD1.6 (GENERIC kernel)
  • PentiumPro 200MHz (512M cache)
  • メモリ 64M + ハードディスク 7G Bytes強
  • Intel Smart Video III/VideoLogic Captivator PCI (ビデオ入力2系統)
  • SECOM の監視カメラ 2台

NetBSD 1.6 インストール:

NetBSD 1.6 iso イメージから吸い出した boot1.fs が壊れていたようで、 ftp サイトから boot1.fs ファイルを単体で持ってきてブートフロッピーを作成しました。 *1 パーテーションは、 / (4G) + swap (128M) + /var (3G) としてます。
/home -> /var/home のシンボリックリンクを張って home を var に含む事で、 頻繁に書き換えるパーテーションを /var に閉じ込める事にしました。

NetBSD 環境構築:

cvs で取得した pkgsrc を利用したかったのですが、
cvs -d :pserver:anoncvs@sup.jp.netbsd.org:/cvs/cvsroot login
<パスワード>
cvs -d :pserver:anoncvs@sup.jp.netbsd.org:/cvs/cvsroot co -r netbsd-1-6 pkgsrc
以上のコマンドで反応なしでした。 まだ、ネットワークの設定に問題があるのかもしれません。
仕方なく、pkg_add で必要なパッケージを一つ毎に加えていく事にします。
pkg_add ftp://ftp.jp.netbsd.org/pub/NetBSD/packages/1.6/i386/All/〜
作業用
bash-2.05nb1.tgz, emacs-21.2.tgz, wget-1.7.tgz
日本語処理
nkf-1.7.tgz, ja-less-358.tgz, Canna-dict-3.5.2nb2.tgz, Canna-server-3.5.2nb2.tgz
キャプチャ用
SDL-1.2.3nb2.tgz, jpeg-6b.tgz, fxtv-1.03nb1.tgz
システム構築用
apache-2.0.43.tgz, perl-5.6.1nb7.tgz, ImageMagick-5.3.9nb1.tgz (mkthum.pl 用)

FreeBSD BT848 / BT878 Driver:

このサイトの Sample applications から bktr2jpeg.c を拝借しました。 bktr2jpeg.c の先頭に #if 0 〜 #endif で括られたシェルスクリプトが含まれていまして、
sh bktr2jpeg.c
のように実行すればコンパイルが始まります。
ただ、これは、FreeBSD の環境しか考えていないようですので、 自分の環境に合わせて変更しないといけません。
#if 0
	set -x
	cc -Wall -O2 -I/usr/local/include -L/usr/local/lib -o bktr2jpeg \
		bktr2jpeg.c -ljpeg
        exit
#endif
キャプチャマシンは、NetBSD 環境ですので、
#if 0
	set -x
        gcc bktrd.c server.c \
                -I/usr/pkg/include/ -L/usr/pkg/lib -R/usr/pkg/lib -ljpeg
        exit
#endif
このように変更しました。
ただ、これだけ変更しても、 以下の2箇所でヘッダが見付からなくてエラーになります。
#include <machine/ioctl_meteor.h>
#include <machine/ioctl_bt848.h>
そこで、NetBSD のヘッダーファイルを検索したところ、 このヘッダと同じような定義を持つ <dev/ic/bt8xx.h> を見付けました。
#include <dev/ic/bt8xx.h>
上記のヘッダに変更したところ。無事にコンパイルが通りました。

bktr2jpeg の使い方:

使いかたは bktr2jpeg の Usage を読めば分かります。
Usage: bktr2jpeg [-f filename] [-s input] [-d device_number] [-w width]
 [-h height] [-q quality] [-v]
自分が使っているキャプチャカードは、ビデオ入力が 2 つあって、 監視カメラ2台を各々に繋げて、両方の画像を参照しようとしてますので、
bktr2jpeg -f cap0.jpg -s 0 
bktr2jpeg -f cap1.jpg -s 1 
のようにコマンドを実行して、0 入力と 1 入力 を取り込む事にします。

capture loop:

大雑把にいうと以下のようなスクリプトを作成しました。 (実際のコードはエラー処理が沢山はいってて、読みにくいです…)
my $base_dir = "〜/htdocs";
while(1) {
	my ($dir_time, $file_time) = make_dir_time(time());
	foreach my $input (0 .. 1)  {
		 my $dir = $base_dir . $input .'/' .$dir_time;
		`mkdir -p $dir`;
 		`bktr2jpeg -f $dir/$file_time -s $input`;
	}
}
make_dir_time は、
sub make_dir_time($) {
    my $time = shift;
    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
	localtime($time);
    $year += 1900;  $mon += 1;
    my $dir = sprintf "%04d/%02d/%02d/%02d/%02d",
	$year, $mon, $mday, $hour, $min;
    my $file = sprintf "%02d.jpg", $sec;
    return ($dir, $file);
}
これで、時系列でディレクトリに分別されて保存されます。

Web 経由でキャプチャした画像を閲覧:

CGI で(これまた大雑把ですが)以下のようなコードを作成しました。
my $time = time();
my $before;
for($before=0; $before<20; $before++) {
	my $base_dir = '/home/yoya/public_html/cap' . $input;
	if (-f join('/', make_dir_time($time - $before))) {
		last ;
	}
}
my ($dir_time, $file_time) = make_dir_time(time() - $before);
<$dir_time と $file_time を元に、img src のリンク先を決定>
要するに、現在の時間から 20 秒まで遡って最新の画像を調べる処理です。 あとは対応する画像を img src で張りつけて、ヘッダの所に
<META HTTP-Equiv=refresh CONTENT=1; URL=".">
の一行を挿入して、それらしいページが完成しました。

ToDO:

この作業にあまり時間をかけたくなかったので、 でっちあげで単純に画像を保存するだけの仕組みを作りましたが、 本来なら以下の仕組みを作る必要がありますし、 そっちの方が重要だとさえ思います。
何か問題があった時に、画像からそれを検索出来るようにする。
画像の差分を毎回とって、差分が激しい画像 のみピックアップ。 更に、グラフにして どの時間帯の画像に多くの変化があるのか 一見して分かるようにする。
JPG 画像は全てネットワーク経由で別のサーバに転送する。
CPU が貧弱なので、キャプチャ以外の処理をさせると、画像の取りこぼしや画質の劣化 が生じる。
プロセスの起動回数を減らす。
bktr2jpeg をそのまま使うので、filename や input 元を指定し直して何度もコマンドとして起動してる分、負荷が高い。 bktr2jpeg.c を改造して、bktr2jpeg コマンドの内部でループさせる方が良い。
他にやるべき事が山程ありますので、これらは手つかずになりそうです…
現状では、何かあった時に目的の画像を探す為に、 mkthum.pl を動かして、サムネイル表示をしていますが、 それでもまだ大変な手間がかかります。
どなたか 2つの jpg ファイル画像の差分を評価するツールを御存じだったりしませんか? (^^;
# 他力本願

役に立ちそうページ:

以下は audio device や X windows system が必須でしたので、 (時間も無い事ですし)使うのをあきらめましたが、 有用そうですので、ブックマークとして残しておきます。 このパッケージに含まれる、udpsend, udprecv はそのまま流用できそうです。
./configure
	    --libdir=/usr/pkg/lib --includedir=/usr/pkg/include \

	    --x-includes=/usr/X11R6/include --x-libraries=/usr/X11R6/lib \
    	     --with-sdl-prefix=/usr/pkg

 make CC="gcc -I/usr/pkg/include"
としましたが、oss が入ってない為に一部コンパイルが通りませんでした。 NetBSD pkg にも入っていたました。 そのうち、X Window の設定をする暇があれば試そうと思います。
# 現在の仕事のスタックを見る限り、永久にその機会は訪れないと思いますが…

*1: boot2.fs のフロッピーを入れた時点で I/O error が出ましたので、 (てっきり、boot2.fs が悪いと思い込み) boot1.fs のフロッピーに問題があると気付くのに時間がかかりました。

2002年12月29日(日)(自宅)

(自宅)

監視カメラ

朝起きて、昨日作成したツールで画像カメラの映像を確認しようとした所、 画像が何も送られてこない状態でした。 コードを見直したところ、fork した子プロセスの後始末を忘れている箇所がありました。
$SIG{'CHLD'} = sub { wait; }; # no more zombie
魔法の呪文を一行追加。:)
続く

。。。:

今回のシステムでは、子プロセスが同時に死ぬ確率はほとんど無いので (おそらく)問題にはならないのですが、念の為、
$SIG{'CHLD'} = sub { while(wait3() > 0) { } };
にするべきですね…
続く

ぶっくま〜く

ジャンクプレステ復活作戦2:

名古屋はええよ!やっとかめ ちまき亭:


2002年12月30日(月)(自宅)

(自宅)

監視システム

朝起きて確認をしたところ、ディスクが溢れていました。
あわててデータをファイルサーバに退避しました…
ただ…
bash-2.05$ uptime
 6:55AM  up 1 day, 11:21, 1 user, load averages: 6.42, 6.18, 6.02
という状況では、バックアップ作業さえキャプチャーに悪影響を及ぼします。
バックアップ中に家の前でいたずらされると、その瞬間を見逃す可能性が増えますので、気軽にバックアップも出来ません。
続く

ゾンビ・プロセスについて

昨日の問題をきっかけに、いままで曖昧なままにしていた SIGCHLD とゾンビ・プロセスについて整理してみました。
恐らくツッコミどころ満載な説明だと思いますが、 間違いをそのまま覚えているのはつらいですので、 あえて無知を晒け出そうと思います。
尚、ゾンビは BSD よりの表現らしく、SYSV では defunct と呼ぶようです。 自分はとりあえずゾンビで呼び方を統一しますので、 その辺りは適当に読み替えて下さい。

仕組み:

一般に UNIX では、親が子プロセス(の終了)と同期を取る為に、
  • exit や C-c interrupt で終了した時等 *1 に、親プロセスに送られる SIGCHLD
  • 子プロセスの処理終了まで待つ wait システムコール
といった仕組みが用意されているのですが、
  • プロセスが死ぬと親プロセスに CHLD シグナルを送って自分はゾンビになる。 (処理系に応じてゾンビを作らない設定をする事で避ける事も可能)
  • ゾンビの子がいる時に親プロセスが wait を発行すると子プロセスは成仏する。
  • 親プロセスが死んだ場合は、init が代わりに処理をしてくれる。 (実は、自分はここの理解が曖昧です… daemon ライブラリを使っているせいでしょうか…)
という挙動をします。つまり、
親に先立ち子プロセスが死んだ場合は、子プロセスは水子(ゾンビ)として
自縛霊のようにプロセステーブルを占有して、親に (wait という)
お経を唱えてもらうまで成仏できません。	
お経 (wait) を忘れて、短命な子プロセスを生成し続ける無責任な親がいると、 プロセステーブルがゾンビで溢れて新たなプロセスが生成できなくなり、 (一般ユーザでは)ログインさえ出来なくなります。
一つのプロセスがシステム全体に悪影響を及ぼしますので、 fork を利用する際には、子プロセスを作り過ぎないというだけでなく、 ゾンビの処理にも気をつけなければなりません。

対策:

自分は、親子で同期を取る必要のない 放任主義的なプログラムを作成する時には、 CHLD シグナルの割り込みハンドラで wait を実行するルーチンを 設定しています。
先の例では、
$SIG{'CHLD'} = sub { wait(); };
といったコードを追加していますが、 それだけでは問題が生じる事があります。なぜなら、
  • 複数の子プロセスが同時に終了すると、 一つの SIGCHLD しか伝えられない。
つまり、一つの SIGCHLD の割り込みハンドラで一度 wait を実行したとしても、 取りこぼしが生じて、ゾンビが生じる可能性が残るからです。
この辺を care しないデーモンは DoS で簡単にサービス不能になります… の「シグナルの取りこぼしとwaitpid()システムコール」に実例が載っていますので 参考になると思います。
これは解決しないといけない問題ですが、 wait(2) は、単純に子プロセスが死ぬまで待ちますので、 死んだ子プロセスがいる時に呼ばないとブロックします。 *2 無条件で呼ぶとブロックする可能性があります。
その為、非同期( ブロックしない)指定が可能な wait である waitpid(2)wait3(2) 、 wait4(2) 等を使うのが定石のようです。
$SIG{'CHLD'} = sub { while(wait3() > 0) { } };
use POSIX ":sys_wait_h";
$SIG{'CHLD'} = sub { shift; while(waitpid(-1,&WNOHANG)> 0) { } };
このようにすれば、 wait3 *3 waitpid は、
  • ゾンビの子プロセスが残っている間は 処理したプロセスの pid を返す
  • ゾンビを処理しきった後はブロックせずに -1 を返すので while を抜ける
という挙動をしますので、残っているゾンビプロセスを一掃できます。

まとめ:

そういう訳で、自分は fork をして、 かつ 親子で同期を取る必要のないプログラムを書く時には、 呪文のように、先の wait3waitpid のコードを SIGCHLD ハンドラに設定する事にしています。
尚、 にあるように、SIG_IGN を設定すると、 システムが良きに計らってくれる処理系もありますし、 もしかしたら、それが主流派かもしれません。
ですが、(いささか古い FAQ ではありますが) を読むと、
POSIX では SIG_IGN に SIGCLD をセットした時の振舞いは規定されていないので、
POSIX 系をサポー トするようなプログラムには使うことができません。
とありますので、今のところ、SIGCHLD でSIG_IGN を利用せず、 自前でハンドラを用意する事にしています。

備考:

以上の話はゾンビ対策に限った場合の話でして、 BSD のマニュアルにある通り SIGCHLD はプロセスのステータス変化を親に通知するシグナルですので、suspend した時にも SIGCHLD が発生するようです。
# まだ確かめていません。
また、プロセスが生きていたとしても、上記のような状態変化がある場合は、 wait でブロックしないそうです。
とはいえ…
自分としては子プロセスに resume させたりといったプログラムと しばらく縁がなさそう …でもなかったりします… (汗……ですので、子プロセスの終了に限定した話をするのも意味があると思います。

追記 (2009/4/22):

google 経由で来られる方が多いので、少しまとめました。

*1: signal(7) のマニュアルを読むと、 Linux2.4 は「Child stopped or terminated」、 NetBSD1.6 ではより抽象的に「child status has changed」と記載されていて、 処理系によって説明が異なるようですので、 「〜等」と表現しました…
*2: ブロックしない条件が曖昧ですので、断言は避けます。
*3: Solaris2.x や Linux2.x、FreeBSD4.x で wait3 を使って来たのですが、 今回、NetBSD1.6 では wait3 が使えなかったので、より一般的な waitpid に 変更しました…

本当は怖い家庭の医学 - テレビ朝日

食事中、たまたま家の人がテレビをつけまして、久々に鑑賞しました。
テレビ朝日で「本当は怖い家庭の医学」という番組が放映されていまして、 メディカル・ホラーという題で、 虫歯や肥満等が悪化して死亡したり足を切るような例が次々と紹介されました。
それを見た自分は、 人は恐怖でしか動けない事を理解しました…
ですが…

その30分後には黒糖3度塗りのふがしを食べている自分がここにいます…
甘いものを食べ過ぎて無性に牛乳が飲みたくなるほどに…
# 喉元過ぎればなんとやら…

無線LAN カード

これ の続き
ADTEC のユーティリティー&ドライバーセットを uninstall したところ、 VAIO の内蔵無線 LAN の機能が復活しました。
ほっとしてます。

2002年12月31日(火)(自宅)

(自宅)

年越し

年越し蕎麦も作って食べてみたのですが、 全く実感が湧きません。
色んなモノに追いたてられていて、心に余裕がないからでしょうか…

監視カメラ

この件はもう終わりのつもりでしたが、 また、 この為、緊急の対応を迫られました。

キャプチャと CGI の処理を分ける:

キャプチャマシンは単にキャプチャするだけで、 データはすぐ別の体力のあるマシンに流し、 データの分別や CGI のアクセスはそちらで処理をする。
といった方針でシステムを組む事にします。

キャプチャマシン:

bktr2jpeg.c を改造して bktrd.c を作成しました。
何をするものかといいますと、 8480 + video 入力番号の tcp port を listen していて、 アクセスされると問答無用で、対応するビデオ入力からキャプチャした 画像の jpeg データを確立されたコネクションに流し込むプログラムです。
簡易サーバといったところですので、
実装イメージを以下に示します。(例によって例外処理を省いて書いてます…)

SIGPIPE:

コネクションが切れたソケットを通じてデータを出力すると、SIGPIPE が発生して、 これを care しないと、 プロセス自体が落ちます。 面倒ですので今回は無視する事にします。
  signal(SIGPIPE, SIG_IGN);
デバッグをしていて気付いたのですが、 gdb でプロセスを動かすと、ハンドラに飛ばずにプロセスがいきなり 終了してしまいます。これは gdb の仕様なのでしょうか…
今さらながら、gdb の仕組みを知らずにプログラミングをしている つもりでいる自分に愕然としてしまいます。

port listen:

キャプチャカードが対応している入力ビデオ番号毎に、 tcp ポートを開きます。
extern int server_open(int port);

#define BASE_PORT 8480

int max_sockfd = -1;
for (i=0; i<n_input; i++ ) {
    sockfds[i] = server_open(BASE_PORT + inputs[i]);
    if (max_sockfd < sockfds[i])
        max_sockfd = sockfds[i];
}

select:

複数の tcp port を開いて監視しますので、 select で待ち構えて、 read enable だと判断できる socket に対して accept する事にします。
extern int server_accept(int sockfd);
extern int server_file2net(int sockfd, char *filename);

while(keep_running) {
	fd_set readfds;
	int n;
	# read enable 監視対象の fd を決める
	FD_ZERO(&readfds);
	for(i=0; i<n_input; i++) {
		 FD_SET(sockfds[i], &readfds);
	}
	# 上記で設定した fd のいずれかが read enable になるまで待つ
	n = select(max_sockfd + 1, &readfds, NULL, NULL, &timeout);
	if  (n < 0) {
		perror("seleect failed");
		return EXIT_FAILURE;
	}
	if (n == 0) {
		printf("may be timeout\n");
	}
	# 実際に read enable の fd を調べる
	for(i=0; i<n_input; i++) {
		if (FD_ISSET(sockfds[i], &readfds)) {
			int cfd;
			# accept して接続を確立する
			cfd = server_accept(sockfds[i]);
			<キャプチャ処理& jpeg 圧縮>
			# jpeg データをクライアントに送信
			server_file2net(cfd, jpeg_filename);
			close(cfd);
		}
	}
}
このようなコードを追加しました。
尚、このコードには、 クライアントが connect した後 read を拒否すると、その間サーバの動作が止まる問題があります。
これへの対処には、accept で受け取った socket を write_fds に設定して、 select で待てば良いのですが、少し面倒なのと、 今回、クライアントは自分が作ったものしか繋げない キャプチャマシンはプライベートネットワークの中に置く。という前提の元、この対処はあとまわしにしました。
少し言い訳をします。select に追加する改造自体は楽なのですが、 jpg ファイルを読み込んでネットワークに write する際、 ブロック単位で転送しますので、次のブロックでまたselect で待つ事になります。 この場合、一つの関数で一気に転送できない事になりますので、 どのブロックまで転送したかを大元で管理しないといけなくなります。
すみません、 このような処理を簡単に追加できない自らの非力を暴露しているようなものですね… (鬱
あと、複数のクライアントが繋ぎに来た時に、 並列に処理できない問題が残っているのは故意でして、 キャプチャデバイスは一度に一つのプロセスしか開けないので、 どのみち待ち合わせ処理が必要になります。 そこで、いっその事 backlog を多めに指定して TCP スタックに任せて 楽をしようという訳です。
と… ここまで書いて気付いたのですが、 非同期の writeを使って期待通りの量を転送できない時は、そのクライアントは見捨てて さっさと close する方針が取れる事に気付きました。
ネットワークの輻輳等で一時的に転送できない場合を考慮しろと指摘されそうですが、 そのようなネットワーク上で一秒置きに キャプチャデータを転送する訳にはいきませんし、 むしろ、失敗したらその回のデータをあきらめる方が、 ネットワークにも PC にも優しいといえます。
# なにより作るのが楽ですので。f(^^;

gethostbyname:

server_open は、とある本を参考にして作成した、 socket, bind, listen を行うサブルーチンで、 昔から使い続けていたのですが、
この中の gethostbyname をコールすると、 なぜか jpeg ライブラリの中で、
failure while saving jpeg
rename: No such file or directory
のエラーが発生する現象に見舞われました。
解析する時間は今ありませんので、 gethostbyname を使わないようにして問題を避けています。
こういう臭いモノには蓋をする姿勢を取っていると、後で痛い目にあうかもしれません。

画像収集:

別の PC から、先の bktrd のデーモンに繋いで、jpeg データを拾い、 時間に対応した名前を持つフォルダを作成して分別します。

bktrclient:

まずは、bktrd サーバに繋いで jpeg データを取得するツールです。 使いかたは以下のように3つの引数で起動します。
bktrclient <サーバ名> <ビデオ入力番号> <出力ファイル名>
コードのイメージを以下に示します。
# しつこいようですが、例外処理を省略して書いてます。実際には 全ての関数について戻り値を調べて、|状態に応じた処理を行っています。
int input, port;
int sockfd;
char *server_name;

server_name = argv[1];
input = atoi(argv[2]);
filename = argv[3];
sockfd = client_open(server_name, port);
client_net2file(sockfd, filename);
close(sockfd);

caploop - bktrclient 対応版:

先の caploop.pl とほぼ同じですが、少しだけ処理が増えていますので、 再度、コードを示します。
my $base_dir = "〜/htdocs";

my %old_dir;

while(1) {
	my ($dir_time, $file_time) = make_dir_time(time());
	foreach my $input (0 .. 1)  {
		 my $dir = $base_dir . $input .'/' .$dir_time;
		`mkdir -p $dir`;
 		`bktrclient -f $dir/$file_time -s $input`;
		# 次のディレクトリに処理が移った時、
		# 前のディレクトリで mkthum の処理を行う。
		if (exists($old_dir{$input})) {
		    if ($old_dir{$input} ne $dir) {
			my $pid = fork(); ## be careful !!
			if ($pid == 0) {
			    `cd $old_dir{$input} ; mkthum.pl -l 6 -r 10`;
			     exit 0;
			}
			$old_dir{$input} = $dir;
		    }
		} else {
		    $old_dir{$input} = $dir;
		}
	}
	sleep(1);
}

「一秒置き」をもう少し正確に…:

一秒より細かい時間情報を取得する gettimeofday 相当の機能が必要でしたので、 を導入しました。
use Time::HiRes;

my $start_time = Time::HiRes::time;
my $time_index = 0;

while(1) {
	<処理>
	$time_index++;
	my $diff_time = Time::HiRes::time - $start_time;
	my $wait_time = $time_index - $diff_time;
	if ($wait_time > 0) {
		select(undef, undef, undef, $wait_time);
	}
}
これで、一秒置きに処理してくれる…はずでしたが、 一秒+αの間隔で処理しています。
今後の課題にします…

完成:

それっぽく動いていますが、 これでも画質が悪いのは避けられません。
普段は、それなりの画質で写っているのですが、

まれにスキャンのタイミングがずれて、 奇数偶数で上下にずれたり、
ビデオ入力0 と1 が混ざった画像が取得できたりします。
また、動く物体はまず奇麗に撮れません。
ドライバ開発者のサンプルプログラムでデータを拾っても同様ですので、 おそらく、ドライバ自体に問題があるのではと思いますが、 残念ながら追う時間が自分には残されていません。 (ρ_;
cvs で kernel source が取得出来ていれば、修正は無理だとしても 原因だけでも推測して、今後のプログラマ生活の糧にしようと思うのですけど…

これで、11 日分だよ〜。

タイトル一覧
カテゴリ分類
Database
JXTA
Java
XML
awm
bookmark
keyword
memo
news
research
Powered by hns-2.19.5, HyperNikkiSystem Project