Perlで書いたスクリプトにXojoでGUIを被せる。
公開日 : 2013-12-04 21:06:07
先月目出たくCPANデビューを果たしたり色々あったのですが、ご無沙汰でブログ書けてませんでした...
メモも兼ねて。久しぶり、そう、もう10年近く振りになるのか、デスクトップアプリを作ってみたくなったので、Xojoを落として使ってみました。以前はREALBasic(それより前はCross Basic)、その後REAL Studioと改名され、現在はXojo(ソージョーと呼ぶらしい)。
その? CPANに上げたPerlモジュールを社員に使わせたいんだけど、黒い画面が苦手な女の子(すでに子、じゃないけど)だったら? やっぱりGUIのアプリが欲しくなるよね。作れるかな? というのがきっかけでした。Xojo にはShellというクラスがあって、Mac/Windows/Linuxともにシェルコマンドが叩けるというので、Perlでスクリプトを書いてそれを叩けば(結果をうけとれれば)作れるんじゃね? と思って書いたらちゃんと動きました。MacOSのアプリケーションの実体は「フォルダ」なので、アプリケーションパッケージ内にPerlモジュールをコピーしてしまえば配布する時はそのままでいいので。
作成したのはWindows Azure のBlobストレージのクライアントアプリ。ファイルやフォルダをドラッグ&ドロップでアップロード、ダウンロードできたり。Azure BlobのAPIはXMLを返すのだけど、XojoではXMLの処理ができるのでAPIからの値の受け渡しのみPerlでやればあとはXojo側で実装できます。1日程あれば基本的な動作確認ができることろまで作れる(その後が色々大変なのではあるけれども)。
CONST DEBUG_PATH = "/Users/alfasado/Desktop/MyApp"
Dim App as new Application
Dim SelfPath As FolderItem
Dim Debug As Boolean
SelfPath = App.ExecutableFile // 実行している自身のパスを得る
if CountFields( SelfPath.Name, "." ) = 2 And NthField( SelfPath.Name, ".", 2 ) = "debug" Then
Debug =True // デバッグ時にはモジュールのパスを指定
End If
Dim Path As String
if Debug = True Then
Path = DEBUG_PATH
Else
Dim Name As String = SelfPath.Name + ".app"
SelfPath = GetFolderItem( SelfPath.NativePath ).parent
SelfPath = SelfPath.Child( Name )
SelfPath = GetFolderItem( SelfPath.NativePath )
Path = SelfPath.ShellPath // スペース等をバックスラッシュでエスケープしたパスが返る
MsgBox( Path )
// /Users/alfasado/Desktop/MyApp/\:Users\:alfasado\:Desktop\:MyApp\:My\ Application.app
Path = NthField( Path, "\:", 1 ) + Name + "/Contents/MacOS"
End If
Dim Cmd As String = "cd " + Path + "; perl src/app.pl"
Dim Sh As New Shell
Sh.Execute( Cmd )
MsgBox( Sh.Result )
// app.plで printした結果が取得できる
あとは、ビルドしたあとで、パッケージにモジュールをコピーすればOK。
cd /Users/alfasado/Desktop/MyApp/Builds\ -\ AZBlobClient0.5.carbon.Xojo_binary_project/Mac\ OS\ X\ \(Intel\)/AZBlobClient.app/Contents/MacOS/
cp /Users/alfasado/Desktop/MyApp/lib.zip lib.zip
cp /Users/alfasado/Desktop/MyApp/src.zip src.zip
unzip lib.zip
unzip src.zip
rm lib.zip
rm src.zip
MacOSにはPerlとか標準で入っているから、普段軽量プログラミング言語を使っていてデスクトップツールを作りたい人なんかにXojoいいかも。REAL Studio一時不安定なイメージを持っていたけど、1週間程使い込んだ印象では安定して動きます。ライセンス購入したら(デスクトップライセンスを購入したよ)日本語のサポートも受けられますよ。
追記。こんな感じのパスになるのは、
// /Users/alfasado/Desktop/MyApp/\:Users\:alfasado\:Desktop\:MyApp\:My\ Application.app
GetFolderItemの引数がまずかったせいらしい。FolderItem.PathTypeAbsolute(0), FolderItem.PathTypeShell(1), FolderItem.PathTypeURL(2), FolderItem.PathTypeNative(3) という定数があって、2つめの引数に指定するときれいに取れる。この場合は、3(FolderItem.PathTypeNative)を指定。
GetFolderItem( SelfPath.NativePath, 3, )