2008/2/6 水曜日

Perl:mutex、二重起動の防止

Filed under: Perl — tiny-p @ 20:15:45

あるプログラムが走っているときに、同時に同じプログラムを起動させたくないときがある。Windows環境であればmutexオブジェクトを使うことができ、Perl にもWin32::Mutexモジュールが存在する。

use Win32::Mutex;
die "二重起動" if(Win32::Mutex->open('hogehoge'));
$mutex=Win32::Mutex->new(1, 'hogehoge');

2行目で他に hogehoge という名前の Mutex オブジェクトが作られていないかどうかチェックし、もし他で hogehoge という名の Mutex オブジェクトが作られていれば、先へ進まずに終了する。3行目では hogehoge という Mutex オブジェクトを作成している。
したがって、このスクリプトを2つ起動しようとしても、2つ目は2行目のチェックで引っかかって終了してくれるはずである。

ただし、タイミングによっては完璧ではないようだ。

参考:http://www.augustus.to/blog/3128/archives/2004/08/index.html

2007/10/12 金曜日

Perl:Win32::GUI

Filed under: Perl — tiny-p @ 18:44:59

記録のためにコピペ

Perl で GUI: Win32::GUI と Win32::GUI::Loft を使う

昨日のPARに引き続きPerl について。ラクダのステーキ: PerlでGUIWin32::GUIWin32::GUI::Loftの存在を知り、興味を持ったので試してみた。

当初、ActivePerl 用に Win32::GUI をppm install win32-gui でインストールしたものの、このバージョンは 0.0.558 と古く、ウィンドウの背景色が白くなってしまう問題があるため、Laurent Rocher Win32::GUI packagesにある 0.0.670 の ppm に入れなおした。

 > ppm install Win32-GUI.ppd

Win32::GUI::Loft の方はバイナリパッケージ (loft_binary.zip) を入手して、PPM ディレクトリに入っている ppm をインストールした。ただし、 Win32-GUI-AdHoc.ppd、 Win32-GUI-Loft.ppd ともに

 <DEPENDENCY NAME="Win32" VERSION="0,0,0,0" />

という行を削る必要があった。インストールには ppm コマンドを用いる。

 > ppm install Win32-GUI-AdHoc.ppd  > ppm install Win32-GUI-Loft.ppd

The GUI Loft で GUI を設計

Win32::GUI::Loft には The GUI Loft という専用の GUI ビルダーが付属しており (The GUI Loft に Win32::GUI::Loft が付属しているという方が正確かもしれない)、 マウスを使って手軽に GUI の設計ができる。ボタンなどのオブジェクトには Perl スクリプトから扱いやすいように適切に名前をつけておく (ここでは winLauncher, tfCommand, btnExecute)。

The GUI Loft を利用するコードの書き方

サンプルプログラムとして、ファイル名を指定してプログラムを実行する、という単純なスクリプトを作ってみた。上のスクリーンショットのように設計した GUIを launcher.gld として保存し、次のようなコードを書いた。

use strict;
use FileHandle;
use Win32::GUI;
use Win32::GUI::Loft::Design;
main();
sub main {
my $filename = “launcher.gld”;
my $gld = read_file($filename);
my $design = Win32::GUI::Loft::Design->newScalar($gld, $filename) or die();
my $win = $design->buildWindow();
$win->tfCommand->SetFocus();
$win->Show();
Win32::GUI::Dialog(); }
sub read_file {
my $filename = shift;
if ($INC{’PAR.pm’}) {
# in PAR
return PAR::read_file($filename);
} else {
my $fh = new FileHandle($filename);
return join(”, $fh->getlines());
} }
sub ::btnExecute_Click {
my $win = $Win32::GUI::Loft::window{winLauncher};
if ($win) {
my $command = $win->tfCommand->Text();
my $ShellExecute = new Win32::API(”shell32″, “ShellExecute”, “LPPPPL”, “L”);
$ShellExecute->Call(0, 0, $command, 0, 0, 1); }
return 1; }
sub ::winLauncher_Terminate { return -1; }

GUI の組み立てはすべて Win32::GUI::Loft が行ってくれるため、ウィンドウを作ったりボタンを乗せたりといった単調なコードを書く必要はない。read_file 内では、PAR の中で実行されたときと、普通に実行されたときとで処理をわけている。launcher.pl を実行するとGUIのウィンドウが表示される。

できあがった launcher.pl を

 > pp --gui -a launcher.gld -o launcher.exe launcher.pl

のように実行ファイルに変換すると、約 2.2 MB になった。-a で実行に必要な launcher.gld をパックし、–gui を指定して実行時にコマンドプロンプトを表示しないようにしている。launcher.exe は Perl がインストールされていない環境でも動作する。めでたし。

2007/10/7 日曜日

PerlのEXE化

Filed under: Perl — tiny-p @ 19:40:30

参考(というか記録のため丸々コピー):http://hamachiya.com/junk/memo_PAR.html

PARというものを使えばperlスクリプトがwindowsの実行形式(exe)化できるらしい。

仕組みはこんな感じ。

Perlインタープリタを含む必要ファイルを全てexeにまとめる(実はzip)
exeが実行されると、裏で展開して、中のPerlインタープリタ(dll)でスクリプトが実行される。
なるほどなるほどー。
いちいちActivePerlをインストールして云々とかしなくても
いきなり実行できちゃうようになるわけだね!すてき!

※ただし拡張子をzipに変えるだけで、中のソースが覗けるけど

で、さっそく使ってみた。ちょっと苦労した!
よって以下はインストールメモだ!

■ActivePerlのインストール現在の最新版は5.8.7.813。入れちゃダメ。
素直にこれをインストールしたら最終的にPARで作ったexeを実行した時に

「プロシージャエントリポイントPL_memory_wrapがダイナミックリンクライブラリperl58.dllから見つかりませんでした。」

とかよくわからないエラーがでてしまう。
(モジュールとか使わない簡単なスクリプトは動いたけど)

ここで大ハマりしたあげく、ActivePerlのバージョンを落とすことで解決した。

そんなわけで、
http://ftp.activestate.com/ActivePerl/Windows/5.8/
↑ここのActivePerl-5.8.6.811-MSWin32-x86-122208.msiをgetしてインストール!

■ppmの設定ppmってのはperlのモジュールを、
簡単に探してダウンロード&インストールしたりアンインストールしたりするやつ。
ActivePerlについてくる。

そのままだとモジュールをActiveStateに探しにいくようになっているので、
ここにbribesってところを追加して、優先順位も上げておく。

※PAR FAQより。

c:\>ppm3
ppm> rep add bribes http://www.bribes.org/perl/ppm
ppm> rep up bribes
ppm> rep up bribes

■PARに必要なモジュールのインストールすべてppmを使って行うよ!

(※印は僕がインストールしたバージョン)

ppm> install File-Temp
※0.16
ppm> install Compress-Zlib
Note: Package ‘Compress-Zlib’ is already installed.
ppm> upgrade Compress-Zlib -install -precious
Compress-Zlib 1.33: new version 1.34 available in bribes
※1.33 → 1.34
ppm> install Archive-Zip
※1.14
ppm> install Module-ScanDeps
※0.51
ppm> install PAR-Dist
※0.07
ppm> install Parse-Binary
※0.09
ppm> install Win32-Exe
※Test-Simple → 0.60, Win32-Exe → 0.08
ppm> install Digest-SHA
※5.28
ppm> install Module-Signature
※0.44
■PARのインストールこれも引き続きppmでインストール!

ppm> install PAR
※0.89
ppm> q
ちゃんとインストールできたかな!

c:\>pp -V
Perl Packager, version 0.12 (PAR version 0.89)
(略)

たぶんok!!

■さっそくテストしてみるメモ帳で簡単なスクリプトを作成。

hello.pl

print “こんにちはこんにちは!\n”;
sleep(1);
print “ぼくはまちちゃん!\n”;
sleep(1);
ふつうにPerlで実行してテスト。

c:\>perl hello.pl
こんにちはこんにちは!
ぼくはまちちゃん!
うん。ふつうに動く。
じゃあ次は、保存してexe化してみる。

c:\>pp -o hello.exe hello.pl
hello.exeが生成されるので、ダブルクリックして実行!

イヤッッホォォォオオォオウ!

ppのオプション(実行時にコンソールを出さないようにする)
pp –gui -o hoge.exe hege.pl

(exeのアイコンを指定する)
pp -i hoge.ico -o hoge.exe hege.pl

(データファイルをひっくるめる)
pp -a data.txt -o hoge.exe hege.pl

(使うモジュールを指定してやる) ※うまく検出されなかった時など
pp -M Hamachiya::Konnichiha -o hoge.exe hege.pl

(ヘルプ)
pp -h
※よく知らないけど -more- は [enter] → [space] で一画面進むみたい

次のページ »

Copyright (C) 2007 tiny-p. All Rights Reserved.