2012/10/30

Perl/Wx - Wx::Demo サンプルGUIアプリケーションを試そう

昨日(Perl/Wxをはじめてみよう (PerlでGUIアプリケーション))に引き続き、
PerlとWx(WxWidgets)でGUIアプリケーションを作るという話題です。

今回はCPANで公開されているデモアプリケーション(Wx::Demo)を試してみます。
サンプルプログラムとソースコードをインストールできるモジュールになっていて、
インストールするだけ、とっても簡単に試せます。

利用する環境は昨日の記事とおなじく、Linux(Fedora 17)+ perl-5.14.2 です。
すでにwxWidgetsとWxモジュールもインストール済みとなっています。



まずはWx::Demoをビルドしてインストールします。
http://search.cpan.org/~mdootson/Wx-Demo-0.19/lib/Wx/Demo.pm
執筆時点の最新版は、Wx-Demo-0.19となっています。
アーカイブファイルを適当なディレクトリに展開して、いつもどおりビルドします:

$ wget http://search.cpan.org/CPAN/authors/id/M/MD/MDOOTSON/Wx-Demo-0.19.tar.gz
$ tar zvxf Wx-Demo-0.19.tar.gz
$ cd Wx-Demo-0.19/
$ perl Makefile.PL
$ make
$ make test
$ sudo make install

これでWx::Demoのインストールは完了です♪

あとは実行するだけ:

$ wxperl\_demo.pl

これでこのようなウィンドウが表示されます。



左側のペイン("Categories"タブなど)に、サンプル一覧がツリー表示されます。
これを選択すると、右側のペインにこの画像のようにサンプルが表示され、
さらにSourceタブから該当ソースコードも閲覧できる仕組みになっています。

ちなみに、このWx::DemoをMacやWindowsなど他の環境で実行すると...
それぞれの環境に用意されたネイティブGUIを使って、違和感なく表示されます。
これは"ネイティブGUIへのラッパーを基本としているwxWidgetsの強み"でもあります。
(また、その環境のネイティブGUI上に該当するパーツが存在しない場合には、wxWidgetsによって再現された共通的なパーツで代替する仕組みになっています。)

今日はここまで(>ω<)♪


2012/10/29

Perl/Wx(wxPerl)をはじめてみよう (PerlでGUIアプリケーション)

Perl/Wxをはじめてみよう...ということで。
WxWidgets(クロスプラットフォーム対応のGUIライブラリ)で
超シンプルなGUIアプリケーションを作りますw とっても簡単です。


まず、wxWidgetsというのは、
Windows / Mac / Linux(GTK)のネイティブGUIを利用できるラッパーライブラリです。

PerlのCPANで公開されているWxモジュール(WxPerl)は、
このWxWidgetsをPerlから利用するためのモジュールです。
最新版は、0.9914 (2012年10月02日)、かなり最近です。
これに関して、Perlでこの話題を持ちだしてきたのにはちょっと理由があるのですが、それは最後にでも(笑)

余談ですが、かの "Google Drive"のPC向けアプリケーションも
wxWidgets(wxPython)で開発されているようです (→公式サイトのNews
参照)
様々なアプリケーションに利用されているライブラリであることは何より安心できますね(>ω<)♪



さて今回は、Linux(Fedora 17)環境で wxWidgets 2.9.4による
GUI(GTK+2)アプリケーションを作ってみたいと思います。

(尚、WindowsやMacにおいても、書くべきソースコードは共通となります。
WxWidgetsとWxモジュールのインストールが少々異なってきますが、参考にしてください。)

perlの環境がインストールされていることが前提です。
(私のFedora環境では、perl-5.14.2を利用しています。)

まず、GTK+2の開発パッケージをインストールします。
$ sudo yum install gtk2-devel

次に、Alien::wxWidgetsモジュールをビルドしてインストールします。
(今回はCPANでうまくインストールできなかった為、自前でtar.gzをダウンロードしビルドしました。)
http://search.cpan.org/~mdootson/Alien-wxWidgets-0.62/lib/Alien/wxWidgets.pm
このモジュールは、ビルド時に適切なWxWidgetsを取得してビルドしてくれます。

$ wget http://search.cpan.org/CPAN/authors/id/M/MD/MDOOTSON/Alien-wxWidgets-0.62.tar.gz
$ tar zxvf Alien-wxWidgets-0.62.tar.gz
$ cd Alien-wxWidgets-0.62/
$ perl Build.PL
〜ここで以下のような質問が表示されますが適当に答えて... 2.9.4 (執筆時点のLatest Development版) をインストールしてもらいますw〜 Which wxWidgets version? (2.8.10, 〜 , 2.9.4) [***] 2.9.4
Which archive type? [tar.bz2 ] (そのままEnter)
Do you want to include OpenGL support [no ] (そのままEnter)

$ perl Build
$ perl Build test
$ sudo perl Build install
$ sudo ldconfig

次に、Wxモジュールをビルドしてインストールします。http://search.cpan.org/~mdootson/Wx/Wx.pm

$ wget http://search.cpan.org/CPAN/authors/id/M/MD/MDOOTSON/Wx-0.9914.tar.gz
$ tar zxvf Wx-0.9914.tar.gz
$ cd Wx-0.9914/
$ perl Makefile.PL
$ make
$ make install
(後述のようにユーザディレクトリ下にPerl環境を置いている場合は、sudoをつけないほうが良さそうです。
もちろん、システムでPerl環境を共有している場合には、sudoをつけてmake installしてください。)

これで準備完了です。

あとは... ソースコードを書くだけです。
use Wx;

my $app = Wx::SimpleApp->new;
my $frame = Wx::Frame->new( undef, -1, 'Hello, world!' );

$frame->Show;
$app->MainLoop;

(http://search.cpan.org/~mdootson/Wx/Wx.pm より引用)

これを適当に保存して、実行してみましょう。
$ perl hoge.pl

こんなウィンドウが表示されたら成功です(>ω<)♪



この時、もしも...次のようなエラーが表示されたら...
Can't load '/***/Wx/Wx.so' for module Wx: libwx_gtk2u_adv-2.9.so.4: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません at /***/DynaLoader.pm ***.
この場合はライブラリが認識されていません。

どうやらperlの環境によっては、ライブラリファイルがユーザディレクトリ内にインストールされてしまい、その結果として認識されないことがあるようです。
(Alien::WxWidgetsのビルド時にBuild.PL --prefix=***を指定しても効きませんでした・・・
調査中です。どなたか正しい方法をご存知でしたらアドバイスをお願いいたします m(_ _)m
Perlbrewの環境とかもそうなったりするんでしょうか・・・未確認です。)


(あんまり良い方法では無い気がしますが...)とりあえず対策として
ライブラリパスをユーザの環境変数に追加しておきます。

まずは目的のライブラリファイルを探します...
$ sudo find / -name "libwx_gtk2u_adv-2.9.so.4"

ファイルは見つかりましたか?
(例: /home/hoge/perl5/lib/perl5/x86_64-linux-thread-multi/Alien/wxWidgets/gtk_2_9_4_uni/lib/libwx_gtk2u_adv-2.9.so.4 )

見つかったファイルのあるディレクトリを登録します:
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:***/Alien/wxWidgets/gtk_2_9_4_uni/lib/ (上の例であれば...ディレクトリは、/home/hoge/perl5/lib/perl5/x86_64-linux-thread-multi/Alien/wxWidgets/gtk_2_9_4_uni/lib/)

さらに、同じexport文を ~/.bashrc の末尾にも追加しておきます:
$ vi ~/.bashrc

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:***/Alien/wxWidgets/gtk_2_9_4_uni/lib/

その後、もう一度、sample.plを実行してみてください。今度は動くはずです(汗;)
$ perl sample.pl


さて...今回はこのへんで。
大学のテストが間近なのでテスト勉強してきますっ(`・ω・´)シャキーン (汗;) (

デモアプリケーションがCPANでWx::Demoとして公開されているので
そちらを参考にしつつ使わせてもらいましょう(>ω<)♪


[2013/06/23 追記]
Arch Linux(64bit), perl-5.18.0の環境で試してみたところ...
$ cpan Alien::wxWidgets Wx
とCPANシェルでインストールするだけで、wxPerl環境の構築が楽にできました。
上記のサンプルコードもそのまま動作しました。何か作ってみようかな♪

また、直接関係ありませんが、wxWidgetsのドキュメント日本語訳プロジェクトが新たに始動されていました。
日本でもwx関連がまた活発になっていくといいですね。


[余談]

この記事を突然書くことにしたのには経緯があったりします。
実は以前から私はWxWidgetsとWxモジュール(WxPerl)をかじっていた時期がありました。
ただ、2010年になってからしばらく...モジュールのアップデートが特になくなり...。
私も、Web開発のほうに興味が傾いていた事もあって、GUIアプリ開発そのものが少なくなり、
その後はたまにWxPerlのウェブサイトをのぞいたり...といった程度になっていました・・・。

そんななかで先日、2012年になって再びアップデートが積極的に行われていることを知りました。
何より嬉しくなったのと、最近流行り(?)のWebアプリケーションでなく、
Linuxでも使えるスタンドアロンなGUIアプリケーションを作りたいな〜と考えていたことから
ちょっと記事に起こしてみることにしましたw

おっとww 余談が長くなってすみませんでした(^^;)ゞ

2012/10/07

[構想] 大学のA3プリント類を便利にスキャンするために

大学の夏休みもあけ、もうそろそろ稲刈りの時期ですね。
・・・というわけで(?)、大学のプリント類も少々溜まって来ました。
ScanSnapで整理しないとw と思っている今日このごろのMasanoriです。

以前から、ScanSnap S510を(旧)自宅サーバPCに接続しておいて、
プリント類をスキャンしてはGoogle Drive(Google Docs)に自動アップロード
...ということは行なっていました。家族共有もできますし、なかなか便利です。

ところで...。
うちの大学のプリントは、A3サイズで両面印刷が多いのです。

ScanSnapでは、
A4サイズの場合は、自動給紙で両面&複数枚を取り込めます。便利です。

しかし、A3サイズの場合は、2つ折りにして(物理的にA4サイズにして)、
”A3キャリアシート”というシートで挟み込んでからスキャンしなければなりません。
つまり、両面取り込むには、A3キャリアシートから一旦取り出して、裏返して、2つ折にして、再度挟み込んでからスキャンしなければなりません。

まあそれは、そもそも物理的にそういう仕様ですから仕方ないですね(^^;)ゞ

で・・・続きなんですが。
A4サイズの場合は、連続給紙した分をすべて1つのPDFファイルに仕上げてくれます。
しかし、A3キャリアシートを使っている場合はそうはいかず、別ファイルになってしまいます。
(※ScanSnapの付属ソフトウェアにある"継続読み取り機能"を使えば、解決できます。)
なので、私は、必要に応じて、できあがったPDFファイルをサーバPCから取ってきて、
手元のPCで、PDFを結合するなど処理を加えて、再度保存...ということをやっていますww

付属ソフトウェアにある"継続読み取り機能"を使えば実現できるんですけど、いちいち指定するのめんどくさい!
というか、サーバPCに接続しているんで、ディスプレイレスなんですww

私としては、本体のスキャンボタンを押すだけで、PCに触れることなく一連の操作を終わらせたい...という願望(?)がありますw

というわけで前置きが長くなりましたが、やりたいこと:
  • ScanSnap本体のスキャンボタンを押すだけで自動的にスキャンして、
    OCR処理をして、Google Driveに自動アップロード。
  • ScanSnapを接続するPCは、一切操作しなくていい。
  • ScanSnapを接続するPCは、Windowsじゃなく、Linux
  • A3キャリアシートを使っている場合も、一定時間内に複数枚スキャンすれば、
    それらを一つのPDFファイルにまとめてくれる。
以上です。Perlでごりごりやろうかな。

p.s.

このブログのデザインを変更しました。
...といっても背景画像は、about.meや他のサイトでも使っているものなんですが。
Androidファンなのでw ドロイドくんを使わせていただいています(><)♪