2010/02/17(水)[perl] forkで子供がたくさん
子プロセスを作って並列処理
表題のとおり。自動計測系の構築などで、監視する側と実行する側とに分離したいとき、forkを使うのが易いようです。
Windowsなら、Active Perlのperlforkを見ると、いろいろと例が載っています。
TrackBack先のMagic Voxで見かけたので、記事を書いてみます。
自分で確認した記録でもありますが...なお、Windows7 Ultimatex64 + Active Perl v5.10.0で試しました.
コーディング例
use POSIX ":sys_wait_h"; $| = 1; my ($pid, $n) ; $n = 4 ; do { $pid = fork ; if (!defined $pid) { die "fork fairule...\n" ; } elsif ($pid==0) { # child print "I'm a child $n/pid=$pid \n"; sleep 10 - $n ; exit $n ; } else { print "create process $pid\n"; } --$n; } while ($n>0) ; my $killid ; sleep 1; do { # $killid = wait(); $killid = waitpid(-1, WNOHANG); print "child $killid is dead and said $?\n" unless $killid==0; } while ($killid!=-1) ; print "Terminate test PGM.\n" ; exit ;
親としては、子が消えるまで待ったり、よそからの要求で殺したりするわけですね。とりあえずは、forkで分岐するところをテンプレート的にお試ししました、というだけで。
実行例
>perl tst_fork01.pl create process -4900 I'm a child 4/pid=0 create process -888 I'm a child 3/pid=0 create process -2364 I'm a child 2/pid=0 create process -2004 I'm a child 1/pid=0 child -4900 is dead and said 1024 child -888 is dead and said 768 child -2364 is dead and said 512 child -2004 is dead and said 256 child -1 is dead and said -1 Terminate test PGM.
ただし、Perl で複数個のワーカープロセスを動かして処理を行う場合のコードとして例が挙がっているように、まじめにやる場合はこちらを参照したほうがよさそうです。SIGトラップして云々・・・。まだまだ勉強不足のようで('A`
2010/02/09(火)[Perl] 快適デバッグ環境
Perl環境
Active Stateから、Active Perlを拾ってきてインストール。
後のEclipseでデバッグする際に必要となるので、PadWalkerを拾ってくる。コマンドラインからppmでインスコできるので便利ね。
実行例:
C:\>ppm install PadWalker Downloading PadWalker-1.9...done Unpacking PadWalker-1.9...done Generating HTML for PadWalker-1.9...done Updating files in site area...done 6 files installed
Eclipse
本体
Eclipse.orgから、パッケージを拾ってくる。現在GALILEOが新しい模様。いろんなぱケージがあるけれど、java開発しないならCDTでも十分。足りなくなったらパッケージを入れていけばいいでしょう。*1
インストーラが嫌いな人はzip版がいい感じ。eclipseディレクトリを作って、その下に展開して言ってくれるので、どこかのルートにでも展開するといいでしょう。
プラグイン
Eclipseのメジャーなプラグインは、多くはUpdate Siteを持っているようで、Eclipse側でUpdate siteを登録して拾ってこさせることができます。また、更新チェックもしてくれるので便利です。基本的にサイト側で親切に書かれているので、そちらを参照ください・・・。ここではポインタを示すだけで、あまり細かいところまでは記載しないようにしておきます。*2
EPIC
EPICのサイトから、Perl開発用のプラグインを拾ってくる。参考サイトの@ITが詳しいので、ここでの説明は省略する。余力があれば自前でSnapShotをとっておくかネ。
BABEL
Babel Projectのページにインストール方法が記載されています。やっぱり日本語のほうがサクサクと判断が進みます。
Babel projectの方々に感謝を。
参考
2010/02/04(木)[Perl] 変数の型を調べる
変数の型を調べたい
ref演算子が使える模様。リファレンスならその型を返してくれる模様。リファレンスじゃなかったらnullぽ...
blessされているときは、クラス名が返ってくるらすぃ。い万ところ使わないから参考程度にメモ。
ソース
use strict ; my $test ; my $ref_1 = [1, 2] ; my $ref_2 = \$test ; my $ref_3 = $ref_1 ; my $ref_4 = {1 =>'t'} ; my %hash_1 = {1 =>'t', [2,3]} ; &chk_type($test) ; &chk_type($ref_1) ; &chk_type($ref_2) ; &chk_type($ref_3) ; &chk_type($ref_4) ; &chk_type(%hash_1) ; &chk_type(\%hash_1) ; exit ; sub chk_type($) { my $v = shift @_ ; my $a = ref $v; print "$a へのリファレンス\n" if ($a) ; print "scaler\n" unless ($a) ; }
実行結果
scaler ARRAY へのリファレンス SCALAR へのリファレンス ARRAY へのリファレンス HASH へのリファレンス scaler HASH へのリファレンス
配列やハッシュの要素として、任意の型をガンガン放り込めるので、それを調べて処理したいという欲求があったのですよ...
Cで書くなら、voidポインタをキャストして使っていたかなぁ。
C++やC#なら実行時型とか使って、同じような処理ができると思う。が、まぁ、今回はPerlだけ。ワンタイムの使い捨てになりかねないので..(^^;
2010/02/02(火)ニコ技動画~アイデア発想ヒント講座~
おちゃをにごす
ということで、とりあえずTLに流れていたので御紹介。発想力は必要ですね。上下左右、どこにでも人はいるので、突出して目立つには難しいものです。特に真似しやすいものは、改良・改善・変形で過去のものになって逝きます。常に新しいコトを探し、発信しつづける必要があるわけですね。
まぁ、無理せず、必要に応じて得られたアウトプットを少し紹介する程度にしておくのが無難なのでしょうなぁ。無理し続けて継続しないほうがショックはでかいw
2010/02/01(月)Windows7再インストール
更新が停止しており申し訳ございません。実業務多忙につき、ネタが創造できない状況が続いております。
WD20EARSお買い上げ
少し谷間ができたので、プチフリーズが生じている現環境を打開すべく、HDD更新(ぇ
表題の2TBytesのものをお買い上げ。物理セクタサイズが4Kbytesになっており、Windows VISTA,7以降で動作保証がされているものです。詳しくはWesternDigitalのsiteにて。。。
導入前確認
まずはメーカのツールを拾ってきましょう。初期不良で泣くことも多いので、この手のチェックは是非実施しておくべきです。メモリは良くやりますけどね、一晩くらい。。。
Data Lifeguard Diagnostic title
私はWindows7で実行しましたが、"管理者として実行"する必要があります。S.M.A.R.T.情報を吸い上げたりするようで、一般ユーザ権限だと、それが読み出せないようです。少し引っかかったので記しておきます... *1
Test Option: EXTENDED TEST Model Number: WDC WD20EARS-00S8B1 Unit Serial Number: WD-WCAVY******* Firmware Number: 80.00A80 Capacity: 2000.40 GB SMART Status: PASS Test Result: PASS Test Time: 19:30:12, January 31, 2010 Test Option: WRITE ZEROS Model Number: WDC WD20EARS-00S8B1 Unit Serial Number: WD-WCAVY******* Firmware Number: 80.00A80 Capacity: 2000.40 GB SMART Status: PASS Test Result: COMPLETE Test Time: 14:38:09, February 01, 2010
移行準備
今回は同一マシンの再インストールになるので、マシン移行より慎重にしないといけない。できるだけ環境を持っていく。
Mozilla系バックアップ
MozBackupでメール、ブラウザのブックマークとサイトごとのアカウント・パスワード情報を保存させておく。復元すると、ほぼバックアップした状態まで回復してくれる。あまりカスタム指定内政もあるけれど(^^;
自作素材系バックアップ
うちはMyDocumentを使わないタイプなので、/homeあたりを丸ごともっていけばおk。日エレデフォルトの/workspaceなんかも忘れずに。
あと、可能な限りinstallerを使わずに使えるソフトは/fswにおいてあるので、これを丸ごとコピー。コピー処理は、firefile copyを愛用させていただいております。コピー後にハッシュ比較でVerifyさせることができるので、安心です。一度、移行時に死んだことがあるので、今回はバッチリVerifyかけます。おかげですごく時間がかかりましたが・・・。
ドライバ類ダウンロード
あらかじめ、各社から拾っておく。ggrks
インストール
区画整理
クリーンインストール実施。DVDからブートさせていくわけだが、パーティションの作成から始めると、100MBのブート領域を食われる。*2これがいやな場合、一度パーティションを切ってから、インストールをキャンセルし、区画だけ好きなようにきりなおして再起動するとよい(ディスク2台環境で確認。1台でできたか失念)。再起動すれば区画がきられた状態を覚えているので、所望のパーティションへインストール。
ドライブ番号のなぞ
SATAポートが1~6まであるわけだが、どういうわけかポート1のディスクIDが1となり、ポート2のディスクIDが0となる@Windows7。BIOSではポート1、2の順に0,1という番号がついている。認識している順番とは異なる番号を振っているのかなぁ。気持ち悪いけれど、なおらなかったのであきらめる。*3
SATAのポートを入れ替えても、BIOSで起動設定してやればしっかりとbootはしてくれた。ポートがずれても致命的にはならない...のかな.
バックアップ
Acronis True Image WD Editionなるソフトが使えます。WDのHDDを買ってあるので、使っても大丈夫そう。
基本ソフトを入れて、アップデートを入れて、区切りのいいところで当該ソフトでブートパーティションを吸い上げてイメージ作成。付加を見ると8コア全部使って圧縮してくれている模様。これは快適だなぁ。
備忘録(2010/2/2更新)
- 各種開発環境のインストール\QuartusII 9.1インスコ完了、active Perl5.10.0インスコ
- 2本目のフルDLGTEST\3時間ちょっとで完了。Why.... oTL
- JMicronのATAドライバ導入検討。入れないほうが安定しそうなら、ドライブだけサルベージしてNW越しにデータ吸い上げ。\現状はBIOSでperipheral機能を殺している。
とりあえずこんなもんで。ウィルスバスター2010がWin7x64にも対応していたので、Avast!から乗り換え。ライセンス数の調整を実施。