2009/08/25(火)[perl] 多次元ハッシュ・配列~例示は何とやらの試金石

一次元

#!/usr/bin/perl -W

use strict ;

our %hash ;
our @hash ;

print \%hash . "\n" ;
print \@hash . "\n\n" ;


print " no-let: " . (exists($hash{hoge})?'true':'false') . "\n";


$hash{hoge} = ();
print " = (): " . ((exists($hash{hoge})?'true':'false')?'true':'false') . "\n";
print ref( $hash{hoge}) . "\n";
print \$hash{hoge} . "\n\n";

$hash{hoge} = [];
print " = []: " . ((exists($hash{hoge})?'true':'false')?'true':'false') . "\n";
print ref( $hash{hoge}) . "\n";
print \$hash{hoge} . "\n";
print $hash{hoge} . "\n\n";

$hash{hoge} = {};
print " = {}: " . (exists($hash{hoge})?'true':'false') . "\n";
print ref ($hash{hoge}) . "\n";
print \$hash{hoge} . "\n";
print ${\$hash{hoge}} . "\n\n";

$hash{hoge} = 1;
print " = 1: " . (exists($hash{hoge})?'true':'false') . "\n";
print ref( $hash{hoge}) . "\n";
print \$hash{hoge} . "\n\n";

出力例(環境や実行時により、値が異なる)


HASH(0x2e7214)
ARRAY(0x2e7204)

 no-let: false
 = (): true

SCALAR(0x1f81f4)

 = []: true
ARRAY
REF(0x1f81f4)
ARRAY(0x1f8294)

 = {}: true
HASH
REF(0x1f81f4)
HASH(0x1f82e4)

 = 1: true

SCALAR(0x1f81f4)

arrayの代入は、SCALARになるのか...


二次元(HASHにHASHを入れる)

#!/usr/bin/perl -W

use strict ;
use warnings ;
our %hash ;


print exists($hash{hoge});

# $hash{hoge} = {} ;
print $hash{hoge} . "\n" ; # ここで未初期化変数と文字列の結合でwarningが出る.
$hash{hoge}{foo} = 2 ;
$hash{hoge}{bar} = 44 ;
print $hash{hoge} . "\n" ;
print $hash{hoge}{foo} . "\n" ;    #これと
print $hash{hoge}->{foo} . "\n" ;  #これは 同意らしい.
print ${$hash{hoge}}{foo} . "\n" ;   # $hash{hoge}が hash referenceなので${}で デリファレンスして {}でハッシュ値をとってくる.という解釈で.
print (keys %{$hash{hoge}}) . "\n" ; # 装飾子みたいなもんかな..
#print (keys $hash{hoge}) . "\n" ;   # NG

出力例。

HASH(0x18881f4)
HASH(0x18881f4)
2
2
2
barfoo

perlreftut from Active Perl 5.10

説明資料があった…

Arrow Rule In between two subscripts, the arrow is optional.

Instead of $a[1]->[2], we can write $a[1][2]; it means the same thing. Instead of $a[0]->[1] = 23, we can write $a[0][1] = 23; it means the same thing.

Now it really looks like two-dimensional arrays!

You can see why the arrows are important. Without them, we would have had to write $$a[1][2] instead of $a[1][2]. For three-dimensional arrays, they let us write $x[2][3][5] instead of the unreadable $${$x[2][3]}[5].

無名配列、無名ハッシュを作る手段は2つしかなくて、(''と'')でハッシュのリファレンスを、('['と']')で無名配列のリファレンスを作る。


ハッシュと配列の混在例

以上を踏まえて、少し確認する。

#$hash{hoge} = () ; # case A
#$hash{hoge} = [] ; # case B
# case C

print $hash{hoge} . "\n" ;
$hash{hoge}[0] = {foo=>1};  # 要素0 へ 無名ハッシュのリファレンスを代入(fooをもつハッシュはどこかで作られる)
$hash{hoge}[1] = {bar=>3};  # 同様.
print $hash{hoge} . "\n" ;       # これは配列のリファレンス値を返すはず。

print $hash{hoge}[0] . "\n" ;    # この三つは同じ。ハッシュのリファレンス値を返す。
print ${$hash{hoge}}[0] . "\n" ; # 
print $hash{hoge}->[0] . "\n" ;  # 
  • case C\明示的に初期化しない場合。\perlさんが勝手に用意してくれました(Warningが出る)
  • case A\case Cと同様でした。初期化したことにもならない。
  • case B\配列リファレンスがセットされ、要素を追加してもリファレンス値が変わらず。

んー、なにやっても同じか。\warningを出さないように、明示的にカラの配列リファレンスを放り込んでおくのが無難かな。

では、なぜ、挙動が変わったのだろうか。ほかのところでいらんことしていたのかもしれないなぁ... 持ち帰れないのが悔やまれる('A`

2009/08/16(日)adiary C76SE

[C76][adiary] C76SE

システム

2.09からだったので、システム更新ボタンを押したら更新済みといわれた。apache再起動せず、ログインボタンへのリンクをブックマークにおいていたので、そのときに勝手に変換プロセスが走ったのかな???

バックアップとらずに即実行しているから、再現できませんw\開発用と公開用は分けるべきですねぇ...

テーマ

で、とりあえず前線基地に戻ってきたので、C76SEに差し替え。テーマも先行配布のモノを適用してみました。やっぱり横幅が固定になるのがつらいのぅ。コード類が見難くて仕方がない。

記法

折角なので、麻雀記法のテスト(ぉ

man1man1man1man2man3man4man5man6man7man8man9man9man9ymanr

@2625追記ちょっとバグってます?adiary2.10C76SEに入っているpublic/

L.77あたりの赤ドラ
# $r='r'; $y=substr($line, $s++, 1);
$r='red'; $y=substr($line, $s++, 1);

L.82あたりのファイル名生成部分
# push(@pi, "$yoko$x$r$suji{$y}");
push(@pi, "$yoko$suji{$y}$x$r");

gifファイル名が、<横?><種別><数値><色>というフォーマットのようですので、以下の変更をしました。画像ファイル名を変えるか悩みましたが、コード修正のほうが手数が少ないのでこちらでw

  • <色>は'r'ではなく'red'になっている。
  • 種別が先頭に来ていなかった

あと、テキストパーサーの記述とディレクトリが不一致のような…?

special~は読み込まれていないのかな?デフォルトの${public}/mahjong/が採用されている。

@textparser_special_tags.txt
mj:img = 麻雀画像dir, ${public}/mj/

@public/mahjong/以下
GIFファイル群。

加えて、横向き画像は、yokohai 配下なので、これもひとつ上に移動が必要。

で、修正を入れれば表示されるかしら?かしら??

SEを3回ほど上書きしているから、余計なゴミも残っているか?w


@17,Aug.,2009公式サイトでバグ情報が掲載されました。すばやいサポートありがとうございます。


ネタ

C75SE配布申し込み数は、そんなに少なかったですか(笑)ここの中の人は、その中の一人ですネ(爆

あと、日記の記述準がおかしいのは、TB送信文の入力を端折るためです(ぉ

[C76] 自主制作ハードまわり

炎天下の中、一般列に10時頃から並び始めました。この左端のほうへ…。

1130頃西館へ。正午くらいに東P/Qのあたりへ。adiaryユーザ会*1/れすぽんさんところの新刊と既刊*2/FPGA技術5査収/STRVさんところを回って終了。力尽きてほかのところを見ていない(ぉ

何も見ずに記憶だけで書いているのでごめんなさい。後日リンク張ります。

FPGA技術、中の人が面白いことをしようとしていますね。一枚かませていただきたいところですが、いかんせんネタがない。ないというか、商売に結びつけることができるかどうかってのが難しい…。

*1 : SEディスクとnabeさん委託のアンプキット。楽させてもらいますw

*2 : 冬行ってない

2009/08/10(月)シングルモルト匠の技講座~樽熟成の神秘~@サントリー山崎蒸溜所

前説

8/9(Sun)に、山崎蒸留所のイベントを受講してきました。過去に2度ほど、蒸留所に連れて行っていただいた記憶があるのですが、今回は自主的に応募してみました。

当該イベントが開催されるというのを、2月頃のサントリーメルマガ? [蒸溜所から季節のお知らせ]で知ってから行ってみたいと思っていました。

今回はちょうど良い機会もあり、参加させていただきました。

相変わらず、庭の手入れも行き届いており、大阪~京都間の立地とは思えないくらい新緑に包まれた良いところです。流石、企業の玄関先はすばらしいですね!!

ネタバレ?を含みますので、"続きを読む"記法をいれておきます。

続きを読む

2009/08/02(日)[アニメ] プラネテス

[アニメ] プラネテス

ひょんなことで見る機会を得たので、少し所感を書こうと思う。

私はSF屋ではないし、それほど知識を有しているわけでもないので、そのあたりは指摘できないor誤っているかもしれないことを付け加えておく。\基本事項やアニメとしての深い情報はwikipediaが詳しいので、そちらを参照されたい。

キャラクタ

  • 主人公:ハチマキ(C.V.田中一成)
  • ヒロイン:タナベ(C.V.雪野五月)
  • 準ヒロイン(?):フィー(C.V.折笠愛)
  • サブ(CVが(ry):ルル(C.V.こおろぎさとみ)
  • サブ(CVが(ry)シア(C.V.かないみか)

かなり主観が入ってますが、こんな感じで。

18話~24話にかけてのハチマキの孤独への進行具合がたまらない。\あと、自身の影が出てくるのも心理描写としては良いと思う。この自問自答は共感できる…かもしれない。

18話くらいまでは、夢を高く設定(宇宙船の個人所有)し、到達不可能という認識を持ちながらも建前として維持し続け、夢半ばであることを意識し、安心していた―。

18-24では、夢を再設定し、努力を尽くしているような感じで。ただうまい具合に伏線を張っているというかなんというか。

この作品を見て、一番大きかったのは、この夢の追いかけ方と自問自答のシーンかなぁ。物理法則について検証もしていないけれど、純粋に楽しめたと思う。\一部ファンタジーすぎる話もあるが、それは話数稼ぎということで。(ファンサービスか?)

25,26と丸く収めすぎと感じたし、準主役キャラのその後を綴っているようで、無難すぎる。その後を描かなければ、それはそれでクレームがつくのも頷けるのだけれど…。

まぁ、あまり詳しく書くと見ていないヒトにとっては面白くないだろうから、これくらいにしておきますか…。

9月にはプラネテス Blu-ray Box 5.1ch Surround Edition(AA)が出るので、興味のある方はお買い上げしてみては?\サウンドも気持ちいいので、お勧めであります。\OP/EDの酒井ミキオさんがいい味出してます。スクライドの主題歌で鳥肌モノだったので名前を覚えていますw

シンガーソングライターの方のようです。声優・普通の歌手wの作詞・作曲も手がけておられるようですねぇ。


特別枠

本題から少しそれたお話をピックアップ。

#07 地球外少女タイトルどおりでした。\最初はユーレイとか完全にファンタジー系の話でインターミッションかと思っていたのですが。ここでこおろぎさとみ嬢が出てくるし、BGMのコーラスがすごくいい。サントラもおすすめしたいところであります。

このキャラは、重要な仲介役としても起用されており、物語最後まで登場します:)



個人的につなげたい作品

作者やキャストつながりではないのだけれど、より昔に知った作品として、宇宙課々付エヴァ・レディというのがあります。御米椎先生の作品で、当時の私はSFという分野にも疎く、非常に感銘を受けました。

同様にBOOM TOWNも感銘を受けた作品で、現代のVRにも通用するほどです。

コミックガンマ、なにげに全巻自宅に転がってます。1~6くらいまでは中古で譲ってもらった記憶があります。全スキャンも考えなくちゃ、かな…。誰かやってるか?


関連リンク

プラネテス公式サイト

[Perl] Win32GuiTest

2009/07/08Perl::MODimport

[Perl] Win32GuiTest

Windows操作を自動化してナニするためのmoduleです。

source codeからのbuildとinstall

まずはソースコードを拾ってきます。本家CPANのWin32::guitestからが良いでしょう。Ver.1.56が取得できます@2009年7月8日現在

サイトからもわかるように、VC++のコマンドラインバッチを走らせた後、下記のscriptを実行して、Makefileを生成させます。

perl makefile.pl

ここで、デフォルトのままですと、VC++のランタイムライブラリ(MSVCRT90.dll(VS2008ExpEdition))が必要になります。Active Perlのversionを合わせておくだけで、ほかのマシンにもmoduleを配るのであれば、ここでstatic linkを選択すべきです。

で、Makefile.PLを編集するのが妥当な気がするのですが、いまいちどうやってコンパイルオプションを引き出してきているのかがわかりませんでした。直接Makefileを編集することにします。

・変更前

CCFLAGS = -nologo -GF -W3 -MD -Zi -DNDEBUG -O1 -DWIN32 -D_CONSOLE -DNO_STRICT -DHAVE_DES_FCRYPT -DUSE_SITECUSTOMIZE -DPRIVLIB_LAST_IN_INC -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DUSE_PERLIO -DPERL_MSVCRT_READFIX
OPTIMIZE = -MD -Zi -DNDEBUG -O1

LDLOADLIBS =   oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib  comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib  netapi32.lib uuid.lib ws2_32.lib mpr.lib winmm.lib  version.lib odbc32.lib odbccp32.lib msvcrt.lib

・変更後

CCFLAGS = -nologo -GF -W3 -MT -Zi -DNDEBUG -O1 -DWIN32 -D_CONSOLE -DNO_STRICT -DHAVE_DES_FCRYPT -DUSE_SITECUSTOMIZE -DPRIVLIB_LAST_IN_INC -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DUSE_PERLIO -DPERL_MSVCRT_READFIX
OPTIMIZE =  -Zi -DNDEBUG -O1

LDLOADLIBS =   oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib  comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib  netapi32.lib uuid.lib ws2_32.lib mpr.lib winmm.lib  version.lib odbc32.lib odbccp32.lib libcmt.lib

それぞれ位置はバラバラですが、シンボル名で検索すれば確実でしょう。編集が終わったら、makeします。

nmake

ちんたら文句言われますが、関数宣言してないとかそんなのですね。

実際にstatic linkされたか、dumpbinコマンドで確認しておきましょう。

>dumpbin /dependents blib\arch\auto\Win32\GuiTest\GuiTest.dll

Microsoft (R) COFF/PE Dumper Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file blib\arch\auto\Win32\GuiTest\GuiTest.dll

File Type: DLL

  Image has the following dependencies:

    perl510.dll
    KERNEL32.dll
    USER32.dll
    GDI32.dll

  Summary

        3000 .data
        5000 .rdata
        2000 .reloc
        1000 .rsrc
        1000 .shared
       1B000 .text

VCのdllは要求されていませんね。perlのdllを要求されていることから、少なくとも Perl 5.10以外では使えないことがわかります。Active Perlのversionを合わせておかないと、あとでppm installができません:)

次に、module testを行うわけですが、国際化対応していないのでNGになります。テストパターンは、Win32-GuiTest-1.56\tに入っています。関数電卓(calc)は、メニューやボタン名に漢字が使われるため、windowが見つからないといわれてしまいます。日本語仕様に合わせて修正しておきます。

・"02_calc.t"

#	MenuSelect("&View|&Scientific");
	MenuSelect("表示(&V)|関数電卓(&S)");

#	($hex) = FindWindowLike($calc, "Hex");
	($hex) = FindWindowLike($calc, "16 進");

#	($bin) = FindWindowLike($calc, "Bin");
	($bin) = FindWindowLike($calc, "2 進");

#	($oct) = FindWindowLike($calc, "Oct");
	($oct) = FindWindowLike($calc, "8 進");

#	($dec) = FindWindowLike($calc, "Dec");
	($dec) = FindWindowLike($calc, "10 進");

#	PushButton("Dec"); sleep 1;
	PushButton("10 進"); sleep 1;

#	PushButton("Hex"); sleep 1;
	PushButton("16 進"); sleep 1;

#	PushButton("Oct"); sleep 1;
	PushButton("8 進"); sleep 1;

#	PushButton("Bin"); sleep 1;
	PushButton("2 進"); sleep 1;

・"05_which.t"

# like(WhichExe("progman"),  qr/progman/i,  "progman");

Vista x64環境のせいか、これはスキップされます。

以上でテストはパスされるでしょう。それではインストールしてしまいましょう。

nmake install

配布用パッケージの作成

コマンドラインのzip/tarコマンドなどが必要になります。ない場合は、配布用ディレクトリの作成までで止めておき、windows標準の圧縮フォルダでzipファイルを作るという方法もあります。

nmake ppd
nmake distdir

Win32-GuiTest-1.56というディレクトリができているので、これをzipにします。

次に、Win32-GuiTestを開いて、下記のように修正します。

        <CODEBASE HREF="Win32-GuiTest-1.56.zip" />

ppdとzipとをセットで配布すればおkです。ただしActive perlのDocumentationでブラウズすることができません。htmlは入らない模様です。

使い方

build/install方法を書いてたら時間切れ…。目的を実現する前に力尽きるとは口惜しや・・・('A`


参考