nDiki : 実行可能ファイル

実行可能ファイル、実行ファイル - executable file、executable

2005年3月15日 (火)

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

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

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

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

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

--pidfile

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

スポンサード リンク
[ 3月15日全て ]

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年12月12日 (火)

PAR::Repositoryビルド済み Perl モジュールをネットワーク配信

実行可能ファイル作成としての PAR

PAR といえば Perl スクリプトを実行可能ファイル(Windows なら EXE 形式ファイル)に変換するモジュールとして有名である。

ちなみに実行可能ファイルを作成する部分はは PAR 0.97 より PAR-Packer パッケージに分けられ、PAR 自体はインストールしやすい pure Perl なパッケージになっている。

PAR モジュールアーカイブからのローダとしての PAR

PAR が提供するもう一つの(こちらが本来はメイン?)機能は、プログラムの実行時に必要な Perl モジュールPAR ファイルと呼ばれる Perl モジュールアーカイブファイルからロードする機能である。 XS モジュールなどもコンパイルすることができるどこかの環境で1度ビルドして PAR ファイルにしておけば、同じアーキテクチャのホスト上でそのまま利用することができる。

PAR リポジトリ

ロードしたい PAR ファイルはファイルパスだけではなく URL でも指定することができ、必要な時にオンデマンドでフェッチさせることができる。 これを使えば Perl プログラムの集中管理可能だ。

PAR 0.951 からは PAR リポジトリというコンセプトが追加され、パッケージ毎に作った PAR ファイルをサーバ上(あるいはローカル)のリポジトリに蓄積してオンデマンドでロードできるようになった。

個別に PAR ファイルを指定する従来の方式に比べてかなり便利そうである。 ということで試用してみた。

まずは

あたりをインストールし準備 OK。

1. PAR リポジトリを作成する

最初に PAR-Repository に含まれている parrepo で。

 parrepo create -r /tmp/PAR

PAR リポジトリファイルの中にはデータベースファイルが作成されるが、これは DBM::Deep というアーキテクチャ非依存のものを使っているので、Linux でも Windows でもどちらからでもアクセス可能である (つまり Linux 上でリポジトリをメンテできるということだ)。

2. Perl パッケージを PAR ファイル化する

次に必要な PAR ファイルを作成する。 作成したいパッケージを展開してビルドし、blib ができている状態で PAR::Dist を使ってパッケージ化する。

 perl Makefile.PL
 make
 make test
 perl -MPAR::Dist -e blib_to_par

例えば ActivePerl*1 上で WWW-Mechanize-1.20 を PAR ファイル化すると

 WWW-Mechanize-1.20-MSWin32-x86-multi-thread-5.8.8.par

というファイルが作成される。

普段から ActivePerl で必要なライブラリは基本的に自前で PPM パッケージ化して、動作確認した上で PPM リポジトリに蓄積するようにしているので、合わせて次の手順でパッケージを作ることになる。

 perl Makefile.PL
 nmake
 nmake test
 perl -MPAR::Dist -e blib_to_par
 make_ppm

*1ここでは Windows 上の

3. PAR リポジトリPAR ファイルを登録する

PAR ファイルができたら parrepo でリポジトリに登録する。

 parrepo inject -r /tmp/PAR -f xxx.par

4. PAR リポジトリ上のライブラリを使用してみる

例えば先ほどの WWW::Mechanize がリポジトリに登録されている状態で

 #!/usr/bin/perl
 use PAR { repository => 'file:///tmp/PAR/' };
 use WWW::Mechanize;
 my $mech = WWW::Mechanize->new;
 $mech->get('http://www.example.com');
 print $mech->content;

というスクリプトを書いて実行すると、PAR リポジトリから WWW::Mechanize がロードされて正しく実行される。

ここでリポジトリを Web サーバアップロードして、repository のところに URL を指定するようにすることもできる。 例えばリポジトリを http://www.example.com/PAR/ に配置したとすると

 #!/usr/bin/perl
 use PAR { repository => 'http://www.example.com/PAR/' };
 use WWW::Mechanize;
 my $mech = WWW::Mechanize->new;
 $mech->get('http://www.example.com');
 print $mech->content;

と書き換えることで、インストールしていない WWW::Mechanize を使用できるようになる。

Perl プログラムを実行形式化する

先ほどの Perl スクリプトを get_top_page.pl という名前で保存して pp で実行可能ファイル化する。

 pp -o get_top_page.exe -M PAR::Repository::Client get_top_page.pl

とすれば get_top_page.exe という実行可能ファイルが作成される。 WWW::Mechanize はオンデマンドで http://www.example.com/PAR/ からフェッチされるので、アップデートが必要な場合は新しい PAR ファイルを作成してリポジトリを更新するだけでよい。 EXE ファイルを作成しなおして利用者に配付しなすといった作業も不要だ。

スクリプトもリポジトリにおく

さらには実行するスクリプトをも PAR リポジトリに置いておくことが可能だ。

例えば WWW-Mechanize に含まれている mech-dump をオンデマンドにフェッチして実行する実行形式ファイルは以下のコマンドで作成できる。

 pp -o mech-dump.exe -M PAR::Repository::Client \
   -e "use PAR { repository => 'http://www.example.com/PAR/', \
                 run => 'mech-dump' }"

まとめ

ActivePerl では PPM があるとはいえ、普通のユーザにちょっとしたプログラムを使ってもらうのに「ActivePerlインストールして、PPM パッケージインストールして、……」というのは手間すぎる。

pp で プログラムに必要なものを全てバンドルした実行形式化ファイルにするという方法ももちろんあるのだが、頻繁にアップデートするようなスクリプトの場合には、起動のための部分だけ pp で作成しておいてあとは PAR リポジトリで集中管理するというのもちょっと魅力的である。

[ 12月12日全て ]

2006年12月20日 (水)

NSIS 2.22 は Linuxビルドできず

Windows 用のインストーラ作成ツール NSIS は、スクリプトベースでインストーラを作っていくのが1つの特徴である。 NSIS スクリプトは、さすがインスーラ作成用だけあって

  • ファイル処理 (コピー、削除、……)
  • レジストリの読み書き
  • プログラムの実行

その他システム関連のコマンドが充実している。 コンパイルするとかなりコンパクトな実行形式ファイル (EXE) を生成してくれるので、ちょっとした処理を自動化するには便利である。

今回 USB メモリに入れておいて、そのドライブ上のいくつかのディレクトリに PATH が通った状態でコマンドプロンプトを開くツールを NSIS で書いておこうかと思って試す。

NSISPOSIX ベースシステムでビルドし実行でき、NSIS スクリプトをコンパイルできる。 ということで作業を Linux で作業をしていたのだが、どうやら System::Call が使えないようだ(スクリプトのコンパイルに失敗する)。

Debian パッケージが古いせい (2.19-1.1) かと思い、ソースパッケージビルドしてみたらまさに System 関連らしいところでコンパイルがこけている (そういう背景で Debian パッケージアップデートされていない?)。

ということでどうも最新の NSISLinux では駄目っぽい。

しょうがないので久しぶりに Wine

Wine 上に NSIS 2.22 をインストールして makensis.exe を実行してみたところ試した範囲ではうまく動いている。 ついでにでき上がった実行可能ファイルWine 上で試せる。

しばらくは Wine 上で NSIS スクリプト書きを楽しむことにしよう (最終的には Windows 上でコンパイルしなおして動作確認するのだけれども)。

[ 12月20日全て ]

2009年1月31日 (土)

USB メモリに入るキー配列変更ソフトウェア

私は会社の共有 Windows ノート PC を持ち歩くのが嫌いだ。 自分の Debian GNU/Linux ThinkPad があるので、2台持ち歩かなければなくなるから。 しかしながらデモンストレーションやテストの環境が必要な時は Windows ノート PC がいるのも事実。 外出/出張時は共有ノート PC 1台で済ませられるようにしないとな。

で、なぜ嫌かを考えてみるとやはりテキスト入力で苛つくからだなとあらためて気がついた。 普段は

というテキスト入力環境。 もう素の日本語 Windows 環境ではイライラしまくり。

であれば一時的にキー配列を変更するツールを USB メモリに入れておけば少しは楽になるかもしれない。 ということでツールを選んでみた。

が希望。ちょっと使う際にさっとキー配列を変えられて、すぐに戻せるようにしたい。 元の状態に戻すのに操作が不要なのがベストなので、常駐型のソフトウェアでかまわない。

英語キーボード配列への変更は AutoHotkey で

キー入力時にキーを入れ替えたりスクリプトを実行したりすることのできる強力なソフトウェアUSB メモリに入れて実行できる。 実行中のみフックされるため終了すれば元の環境に戻せる。 作った設定ファイルはコンパイルして実行可能ファイルにすることができ、AutoHotkey 本体無しで実行できるという機能もある。

家にある ThinkPad の日本語キーボード英語キーボードを並べて設定を作ってみた。 IME 切り替えは Web で公開されている IME_Func.ahk を使った。

 #UseHook
 #include IME_Func.ahk

 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ; 1段目
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 VKF4::Send,{``}    ;         半角/全角     -> `
 +VKF4::Send,{~}    ; Shift + 半角/全角     -> ~
 +2::Send,{@}       ; Shift + 2         ["] -> @
 +6::Send,{^}       ; Shift + 6         [&] -> ^
 +7::Send,{&}       ; Shift + 7         ['] -> &
 +8::Send,{*}       ; Shift + 8         [(] -> *
 +9::Send,{(}       ; Shift + 9         [)] -> (
 +0::Send,{)}       ; Shift + 0         [ ] -> )
 +-::Send,{_}       ; Shift + -         [=] -> _
 ^::Send,{=}        ;                   [^] -> =
 +^::Send,{+}       ; Shift + ^         [~] -> +

 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ; 2段目
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 @::[              ;                   [@] -> [
 +@::{             ; Shift + @         [`] -> {
 [::]              ;                   [[] -> ]
 +[::Send,{}}      ; Shift + [         [{] -> }

 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ; 3段目
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 +;::Send,{:}      ; Shift + ;         [+] -> ;
 :::Send,{'}       ;                   [:] -> '
 *::Send,{"}       ; Shift + :         [*] -> "
 ]::\              ;                   []] -> \
 +]::|             ; Shift + ]         [}] -> |

 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ; 4段目
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ; 5段目
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 VK1C::
   IME_TOGGLE("A")
 return

直接 a::b と書けるものと Send を使わなければならないのとがあって、ちょっとハマったけれど何とかマッピングできるようになった。

Caps Lock を Ctrl に

今のところインストール不要で常駐している間のみ Caps Lock を Ctrl に替えるソフトウェア見つからず。 「レジストリ書き換え」「再ログイン必要」になるが XKeymacs で変更できるので、ちょっと長時間占有して使う場合に XKeymacs で設定して最後に戻すようにするかなあ。

この場合は英語キーボード配列にするのも AutoHotkey じゃなくてレジストリ書き換え(あるいはそれ用のツール)でドライバを入れ替えてしまってもいっしょか。

Emacsキーバインディング

XKeymacs で。 インストール不要で実行中のみ Emacs 風にしてくれるが、レジストリを一部書き換える。 完全に跡を残さないようにするようには、レジストリを削除する必要あり。

Emacsキーバインディングは絶対無くては嫌というわけではないので、必要に応じて。

SKK はなし

さすがにインストール不要というのは見当たらない。 USB メモリに入れてある NTEmacs に SKK を入れてテキストファイル作成時ぐらいは SKK を使えるようにしておく予定。

USB メモリに入れておくもの

ということで、快適なテキスト入力のために入れておくもの:

Shift + 2 が @ になるだけでも救われる。

[ 1月31日全て ]

2009年2月22日 (日)

ActivePerl 5.8.9 build 825 + MinGW 5.1.4 + PARPerl スクリプトを実行可能ファイル

久しぶりに PAR の出番。 休日出勤して環境作り。

今回実行可能ファイルにしたい Perl プログラムが Perl 5.8開発・テストされているものの改訂版で、必要な PPM パッケージも 8xx 用に作りだめしてあるので、ActivePerl 5.8.9.825 上で行うことにした。

PAR::Packer は ActivePerl の build と合っていないとうまく動かないので、自分でソースからビルドして PPM パッケージ化する。 必要な依存モジュールのバージョンも軒並み上がっているので、それらもビルド

今まで Visual Studio 6.0 でビルドしていたのだけれど、この間 PC をかえてから入れていなかったので、今回は MinGW を使うことにした。 SourceForge.net 上から g++ をダウンロードしてネットワークインストールできないようなので、そこだけ SourceForge.JP で探してきてインストール

MinGW の bin ディレクトリを PATH に追加したら、特に問題なく Perl モジュールコンパイルできている。素晴しい。ExtUtils::FakeConfig 無くてもいいのかな。

[ 2月22日全て ]

2009年2月23日 (月)

PARDLL ファイルをロードできなかったら大文字小文字を疑え

PDL を使っている Perl プログラムを、昨日構築した今ごろの環境で PAR を使って実行可能ファイル化したんだけれども、実行してみたら

 Can't locate loadable object for module PDL::Core in @INC ...

というエラー。 実行時のキャッシュディレクトリを見ると core.dll が同梱されていない模様。 なんでだー。

いろいろやってみたところ、もしやと思ってインストール済みの core.dll を Core.dll という名前に変えたらエラーが出なくなった(正確には次のモジュールで同様のエラーが出た)。

ファイル名の大文字・小文字が問題だったらしい。 PARFAQ には「Win32::Perms の Perms.DLL でこのエラーが出たら、Perms.dll にしてね」と書かれている。 最初これ拡張子の問題だけだと思っていた。 ベース名でも同様のようだ。

以前は問題なかったから、比較的新しい PAR で発生するようになったと思われる。 これ絶対はまる。

[ 2月23日全て ]

2009年8月24日 (月)

今日のさえずり: 着られる期間が短い洋服よりもオモチャの方が長く使えてよいのでは

2009年08月24日

  • 12:40 2009年8月22日の歩行: 5602歩、4.25km、54分、4.71km/h、消費 209.5kcal、脂肪燃焼 29.9g、2.8エクササイズ。 *P3
  • 12:41 2009年8月23日の歩行: 3245歩、2.45km、31分、4.72km/h、消費 119.5kcal、脂肪燃焼 17.1g、1.7エクササイズ。 *P3
  • 12:56 pdumpfs って size と mtime で同一判定しているのか。だとするとソースディレクトリは FAT32 でもいいんだな。 *P3
  • 15:10 危うくちょっとオヤツを買いに出ただけでずぶ濡れになるところだった。 L:東京都千代田区東神田3 *P3
  • 17:29 着られる期間が短い洋服よりもオモチャの方が長く使えてよいのでは。 RT @zakwa: 友人のトコに娘が産まれた。お祝いに何あげたら良いかな? *P3
  • 17:31 さて、そろそろ一区切りにして PAR::Packer で実行可能ファイルにするか。不足モジュールの追加など、ここからがまた少しかかるのだよな。 *P3
  • 20:50 残業終わってイマココ! L:秋葉原駅 [mb]
  • 23:06 リムーバブルメディア上に digiKam のルートアルバムを置いた時の挙動をチェックした。マウントポイント変えてマウントしなおしてもちゃんと同じアルバムだと認識してくれる。良い子。 *P3
[ 8月24日全て ]

2009年8月25日 (火)

ActivePerl をやめて Strawberry Perl

ActivePerl 5.10.0.1005 + Visual Studio 2005 SP1 上で PAR::Packer を使って実行可能ファイル化したものの、今日別の環境で動かしたら「このアプリケーションの構成が正しくないため、アプリケーションを開始できませんでした」というエラーがでてしまった。

今まで Visual Studio 6.0 で PPM パッケージの作成やら PAR::Packer による実行可能ファイル化をしていたので気がつかなかったのだが、調べてみると Visual Studio 2005 以降だとどうもいろいろ面倒らしい。

ActivePerl + PPM パッケージだと自分で PPM リポジトリを用意しておくことで、開発環境の統一が楽になるという利点があったのだけれどもしばらく一筋縄ではいかなさそうなので、別の Perl ディストリビューションを使ってみることにした。

Windows 上の Perl としてしばらく使ってみることにしたのは Strawberry Perl。現在のバージョンは 5.10.0.6。 以前にもちょっと入れてみたことはあったけれども、きちんと使ってみるのは初めて。

MinGW や dmake が同梱されており、CPAN.pm を使って UNIX 上と近い感覚で Perl モジュールインストールができる。 PAR::Packer を使って実行可能ファイル化した Perl スクリプトも実行できることを確認。

しばらく乗り替えてみることにする。

今日のさえずり: しばらくイチゴにするか

2009年08月25日

  • 06:25 2009年8月24日の歩行: 5558歩、4.29km、47分、5.37km/h、消費 213.4kcal、脂肪燃焼 30.5g、3.1エクササイズ。 *P3
  • 07:14 直行につき出発。涼しくて快適。 [mb]
  • 07:43 予定より早い京葉線。 イマココ! L:新木場駅 [mb]
  • 12:29 これから帰社する。イマココ! L:八幡宿駅 [mb]
  • 12:32 今日はこの時間になってもスーツのジャケット着てられる暑さ。 L:千葉県市原市八幡 [mb]
  • 13:45 C2 出口にしたら方向を見失った。 L:馬喰町駅 [mb]
  • 14:53 PAR::Packer したファイル、他の PC で実行したら「このアプリケーションの構成が正しくないため、アプリケーションを開始できませんでした」だった。あれ? *P3
  • 15:39 dumpbin /imports でみてみると msvcr80.dll を使っているな。 *P3
  • 16:05 うーん。Visual Studio 2005 で作った PAR::Packer がいけないのかな。 *P3
  • 16:56 かわりに Strawberry PerlPAR::Packer 構築してみている。 *P3
  • 17:06 Strawberry Perl だと PAR::Packer した実行可能ファイルを他の PC に持っていってもちゃんと動いた。しばらくイチゴにするか。 *P3
[ 8月25日全て ]

2013年7月24日 (水)

【日記】reveal.js とか、Windows 7 BOX に GHC 入れるとか

reveal.js でスライド作ったんだけれど、そういえばと思って FirefoxInternet Explorer で表示確認したらまともじゃなかった。Google Chrome で確認しながら作っていたので気がつかなかった。むむむ。もしかしたら HTML 的にシンタックスエラーがあって崩れている部分があるのかもしれないけれど。

あと Windows 上で Python スクリプトを(そのまま、あるいは実行可能ファイル(exe)化して)動かすのがちょっと流行っているので、GHC インストールした。Haskell の。Windows 版の GHCMinGW 使ってるのか。インストールは基本アーカイブを展開するだけ OK。

普段 Perl 使っているので、必要無いならあえて自分で Python 書くっていう気にならないのですよね。

今日のさえずり: ラジオ体操の深呼吸は第2のやつの方が好き

2013年07月24日

[ 7月24日全て ]

About Me

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

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

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

follow us in feedly

月別インデックス
Process Time: 0.054434s / load averages: 0.42, 0.37, 0.37
nDiki by WATANABE Yoshimasa (Naney, Google profile)
Powered by DiKicker