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の方々に感謝を。


*1 : 個人的にjava触らないので、CDT,EPICあればシアワセ

*2 : Version upで操作が変わったりもしますからねぇ...

参考

スクリプト言語をサポートするEclipseプラグイン

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

*1 : 恥さらしとも云うw

移行準備

今回は同一マシンの再インストールになるので、マシン移行より慎重にしないといけない。できるだけ環境を持っていく。

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はしてくれた。ポートがずれても致命的にはならない...のかな.


*2 : Win7の秘匿系の機能に使う?用わからんが気持ち悪いので捨てた(ぉ

*3 : このために3回いれなおしたぜ・・・

バックアップ

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!から乗り換え。ライセンス数の調整を実施。