nDiki : PAR

2004年12月8日 (水)

始めてアイコンを作ってみた。

GIMP32x3216x16 のインデックスカラーBMPを作って @icon変換 でコンバート favicon.icoへの設定、PARでexe化の際のアイコン設定をしてみる。

[ 12月8日全て ]

2004年12月31日 (金)

私的10大ニュース2004 [ comp ]

cool programs

Palm OS 生活復活

PEG-TJ25を購入し、Palm OS 生活復活。 最初はおもちゃのつもりで買ったのだが、プロジェクトマネジメントなどにシフトした仕事のスケジュール管理などで大活躍。

PDA 市場の明るい話はあまり聞かないが、末長く製品が出て続けて欲しい。

http://www.naney.org/img/2004/X/X2004-03-05-0003.jpg http://www.naney.org/img/2004/X/X2004-03-14-0004.jpg http://www.naney.org/img/2004/X/X2004-04-10-0001.jpg

[ 12月31日全て ]

2005年3月7日 (月)

UPX実行可能ファイルを小さく

PARのチュートリアルで UPX (the Ultimate Packer for eXecutables)というツールが紹介されていたので使ってみる。 実行可能なファイルを、実行可能のまま圧縮するというもの。 MS-DOSの時代の伝説のプログラム DIET を思い出す。

PAR で実行可能形式に変換したPerlスクリプトを UPX 1.25 で圧縮したところサイズが小さくなった。 しかし PAR で作った実行可能バイナリは実行時に自身を展開するため、圧縮によってフォーマットが変わってしまっていることを検知して警告が出てしまう。 ちょっとよろしくない。

それにNSISインストーラを作ってしまえばかなり高圧縮がかかるし、そういう意味では出番がないか。

いや USB メモリにいろいろ実行可能ファイルを詰め込みたい時にはいいかもしれない。

[ 3月7日全て ]

2005年3月8日 (火)

「依存関係検査のしにくいモジュール」に依存するスクリプトをPARで実行形式化する

PAR を使うとPerlスクリプトを単独の実行可能形式ファイルに変換することができる。 この際、自動的に依存するモジュールも探し出して追加してくれるのだが、eval の中で use するものや lib 以下に配置された通常のファイル等は自分で追加する必要がある (pp の -a, -A, -M オプション等で)。

開発しているモジュールに含まれるスクリプトをexe化するルールは、Makefile.PL でいろいろ処理をしてこれらを指定するようにしておけば比較的簡単にビルドできる。

しかしそれが今開発対象となっているモジュール/スクリプトではなく、その依存モジュールがそのようになっていると面倒くさい。 ということで依存モジュール側で必要なモジュール・ファイル一式を PAR ファイル化し、それを作業中のモジュール/スクリプトで取り込むようにしてみた。

PAR の pp コマンドは(1つのPAR ファイルから実行形式ファイルを作る時以外)直接 par ファイルを取り込む事ができないようなので、展開してあらためて追加する必要があるのでちょっと面倒。

依存モジュールをまとめた par を作る

例えばそのモジュールに myscript.pl が含まれており、これをexe化するにはいくつか手動で追加するファイルを指定する必要があるとする。

またそれらのファイルは、現在作ろうとしているスクリプトをexe化する際にも必要だとする。

 pp -p -o all.par \
    -I blib/lib -I blib/arch \
    -A ... \
    -M ... \
    blib/script/myscript.pl

myscript.pl に必要なモジュールを含んだ PAR ファイル all.par ができる。

ちなみに parl -p でもモジュールからPAR ファイル化でき blib 以下をごっそりアーカイブできるのだが、そのモジュールが依存しているモジュールを含ませることができないので、今回の用途には×。

PAR ファイルを展開する

all.par を展開する。 ここでは c:\tmp\all 以下に展開するものとする。

作成したいスクリプトのPAR ファイルをいったん作る

スクリプトのあるモジュールのディレクトリに移動し、make。 その後

 pp -p -o newscript.par \
    -I blib/lib -I blib/arch -I c:\tmp\all\lib \
    -a c:\tmp\all\lib;lib \
    blib/script/newscript.pl

newscript.par が出来上がる。この中には -a オプションの指定と、newscript.pl の依存関係検査による抽出で c:\tmp\all\lib 以下のファイルが2回含まれているものがある(大抵)。 無駄なので除去する。

(面倒ならば重複するファイルを含んだままではあるが、ここで -p オプションを指定しないで直接 exe を作る事も可能である)

除去するスクリプト(例)

 #!/usr/bin/perl -w
 use strict;
 use Archive::Zip qw(:ERROR_CODES);
 my $zip_name = shift || die 'must provide a zip name';
 my $zip = Archive::Zip->new;
 $zip->read($zip_name) == AZ_OK || die "Can't read $zip_name:\n";

 my %names;
 for my $member ($zip->members) {
   my $file_name = $member->fileName;
   if (exists $names{$file_name}) {
     print "Remove $file_name ...";
     if (defined $zip->removeMember($member)) {
       print "OK.\n";
     }
     else {
       print "NG.\n";
     }
   }
   $names{$file_name}++;
 }

 exit($zip->overwrite);

PAR ファイルを実行可能形式ファイルに変換する

 pp -o newscript.exe newscript.par
[ 3月8日全て ]

2005年3月15日 (火)

PAR で作った実行可能ファイルを殺せない

PARWindows実行可能ファイル(exe)にしたプログラムを、別のプログラムから起動・終了させるプログラムを書いていたところ困った事態。

今まで気がつかなかったのだが、PARで作った実行可能ファイルを実行するとプロセスが起動される。片方がブートストラップで、もう一方がPerlインタプリタのようだ。

プログラムから起動した時に取得できるのはブートストラップの pid で、これを TerminateProcess してもPerlインタプリタの方は以前として動き続ける。 止める方法がわからん。

自爆機能とかつけて対処するしかないか。

--pidfile

結局 --pidfile オプションをつけて、pid をファイルに書き出せるようにした。 $$ の値はPerlインタプリタ側のプロセスIDで、こちらを kill するとまとめて落ちてくれる。

[ 3月15日全て ]

2005年3月16日 (水)

wxPerl + PAR ではDLL追加指定の必要あり

メモPAR (0.87) では DLLが使用するDLLまでは自動的に検出できないので、明示的に指定する必要あり。

wxPerl だと Wx.dll 以外に wxmsw24.dll が必要になるので、pp の -l オプションで指定しなければならない。 この際見つからなくてもエラーにならないようだ。 見つからない場合はフルパスで指定しなければならない。

 $Config{sitelib} . "\\auto\\Wx\\wxmsw24.dll"; # with use Config;

あたりにあるはず。

[ 3月16日全て ]

2005年3月31日 (木)

Wineを入れてみる

Linux 上で Win32 用の ActivePerl を動かして、PPM パッケージの作成や PAR による実行可能ファイルの作成をできるようにしたい。

調べたところ Wine 上でも ActivePerl が動くらしい。 さっそく Debian GNU/Linuxsid 環境にインストールしてみる。

debパッケージは以下をインストール

  • wine
  • wine-utils
  • winesetuptk
  • wine-doc
  • msttcorefonts

winesetup を実行して ~/.wine 以下を作成。 winesetup が古いのか wine を実行すると

Please use the registry key HKEY_CURRENT_CONFIG\Software\Fonts\LogPixels to set the screen resolution and remove the "Resolution" entry in the config file

という警告がでるので、[fonts] の中の

 "Resolution" = "96"

をコメントアウト。

次に msi 形式になっている ActivePerl インストーラを動かすために、Windows Installerインストールする。

失敗。設定がうまくいっていないのか、何かが足りないのか。

usr/share/wine/wineinstall で ~/.wine 以下を作っても駄目。

要調査。

[ 3月31日全て ]

2006年2月9日 (木)

ActivePerlPAR PPM パッケージは合わせる必要あり

以前 ActivePerlインストールした PARWindows 実行形式ファイルに変換しておいたプログラムが実は動かなかった事に気がつく。

プログラム名 - エントリポイントが見つかりません。

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

おや。

どうやら ActivePerl 5.8.7 Build 813 上で、 ActivePerl 5.8.6 Build 811PPM パッケージ化しておいた PAR を使ったのがまずかったようだ。

ActivePerl は 5.8 系の間ではバイナリ互換だったと思うが(5.6系とは駄目)、PAR に限ってはそうはいかないらしい。まぁ、考えてみればそうなってもおかしくない。

ということで PAR PPM パッケージを作り直してインストールし、こちらであらためて exe ファイルを作成。 うまく動くようになったことを確認。

[ 2月9日全て ]

2006年6月16日 (金)

PAR に関する ActivePerlライセンス

確認したら ActivePerl Community License v2.1 (ActivePerl 5.8.8.817 はこれ) には PAR (や PerlApp や Perl2Exe など) で ActivePerl に含まれているファイルをラッピングしてアプリケーションに含めることができると書いてあった (一部条件あり)。

今まで見落していたよ。

ActivePerl」 + 「The Artistic License 下な CPAN にあるモジュール」 + 「自作コード」を PAR でバイナリ化して配布しても OK ということが分ってちょっとすっきり。

[ 6月16日全て ]

2006年7月3日 (月)

自前 PPM リポジトリの管理

Windows Perl アプリケーション用に PPM リポジトリを久しぶりに整理。

自分が使用する PPM パッケージは以下の理由から、以前より基本的に自前でビルド/保存し PPM リポジトリをローカルに作成するようにしている。

  1. 後でオフラインインストールできるようにする。
  2. 「公開リポジトリが無くなった」あるいは「公開リポジトリに欲しいパッケージが無くなった」時に困らないようにする。
  3. 動作確認された組み合わせでの PPM パッケージセットを作成・保持できるようにする。
  4. ライセンス的にクリアなものだけを含むリポジトリを用意する。 (芋蔓式インストールで、ライセンス的にクリアでないパッケージが入ってしまうのを防ぐ)。

手元では以下のように管理

 PPM
  |-- <category>
  |   `-- 8xx
  |       |-- <projects A> [ 公開 / export ]
  |       |   |-- module1.ppd -> (A)
  |       |   |-- module1.tar.gz -> (B)
  |       |   `-- ...
  |       `-- ...
  `-- pool
      |-- module1-x.yy
      |   |-- module1.x.yy.tar.gz
      |   |-- some documents...
      |   `-- build817
      |       |-- module1.ppd (A)
      |       `-- module1.tar.gz (B)
      `-- ...
pool
  • pool ディレクトリに「[モジュール]-[バージョン]」ディレクトリを作成する。同じバージョンでも、異なるバージョンは両方とも別々にキープしておく。
  • その下にソース tarball を置く。
  • ライセンス情報ファイルなども置く (touch Perl-License 等空のファイルを作成しておく)
  • PPM パッケージPPM::Make で作成し、その時に使用した ActivePerlビルド番号別にサブディレクトリを作って .tar.gz と .ppd を置く。
リポジトリ
  • ActivePerlビルド番号別にリポジトリを作成する。基本的には 6xx 系、8xx 系それぞれの中ではバイナリ互換性がある (PAR などは、ビルド番号に1対1でしか互換性がない)。
  • 必要に応じてカテゴリ別サブディレクトリを用意 (アクセス制限の都合などにより)
  • 必要に応じてプロジェクト毎にサブディレクトリを用意 (プロジェクト毎にパッケージセットを作るため)
  • リポジトリディレクトリからは pool 内の .ppd、.tar.gz へシンボリックリンクを張る。欲しいモジュールのバージョン、ビルド番号を選んでリンクする。
公開
  • SambaApache などで、PPM ディレクトリ全部あるいは特定のリポジトリ部分を公開する。
  • 必要なら export して別サーバに置く。rsync や cp の -L オプションでシンボリックリンクを実ファイルに置き換えてアーカイブを作成する。
[ 7月3日全て ]

About Me

Naney Naney (なにい)です。株式会社ミクシィで SNS 事業の部長をしています。

nDiki1999年1月に始めたコンピュータ日誌を前身とする NaneyWeb 日記(兼パーソナルナレッジベース)です。ちょっとしたノートは nNote にあります。

※内容は個人的見解であり所属組織とは関係ありません。

月別インデックス
Process Time: 0.058966s / load averages: 0.23, 0.46, 0.50
nDiki by WATANABE Yoshimasa (Naney)
Powered by DiKicker