‘Xojo’ タグのついている投稿

「自然順ソート」あれこれ

2016/09/20

 最近ちょっとしたツールを作っていて、スクリプト内で「Finderの表示順にファイルをソート(整列)させたい」という要件がありまして、なかなかに手こずったので今後のために備忘録としてまとめておきます。

Finderでのソート順って?

 まず、Finderでのソート順って何かっていいますと、

ファイル1,ファイル2,ファイル3…ファイル10,ファイル11,ファイル12

 となるようなソート方法のことです。文字列の後に数字が来るような場合でも数値順にソートさせたい。
 perlなどで普通に文字列順にソートさせても数値でソートさせても

ファイル1,ファイル10,ファイル11,ファイル12,ファイル2,ファイル3…

 となってしまい、思ったような処理ができません。

 Finderでのソート順については、降りてきた天の声によると

 とのことらしく。ありがとうございます@ogwataさん。

 なお、どうやらJIS X 4061 照合順番で定義されてるようなソート方法を「自然順ソート」と言うらしいのですが、PerlだとSort::Naturallyあたりのモジュールを利用すればできる模様(参考)。ただ今回は配布ツールでの使用を考えているので、CPANからモジュールを入れる的な話はできれば避けたく、いろいろと違う方向性を模索していたわけです。

Xojo内でCocoaのライブラリを呼び出してソート

 フロントエンドのツールはXojoなので、Xojo内でできればなと思って、過去にQiitaにされていたアップされていたこちらの神エントリをもとにどうにかソートできるようにしたのが以下。さすがです@monokanoさん。

 Xojo内でモジュール化しておいて元の配列を投げ、ソート後の配列を得る、みたいな使い方です。今回の目的としてはFinderのソート順の再現なので、Finderと同じエンジンを使うこちらが一番目的に叶いそうです。ただもちろんCocoaのライブラリを呼び出している以上Mac専用にはなります。

Applescriptでの自然順ソート

 AppleScriptでもできそうかなということでこちらの投稿をもとに作ってみたのが以下。

 他の処理系に投げるので一回文字列に結合して引数として投げ、ソートした後に再結合した文字列を得ます。でそれをまた分解して配列に。
 AppleScriptはテキストアイテムデリミタでの文字列の分解結合処理がいつもながらややこしいのですが、そのあたりはまあご愛敬ということで。こちらもAppleScriptを使う以上Mac専用です。まあそのうちAppleScriptで自然順ソートさせなきゃならないケースも出てくるかも知れないし。

PHPのnatsort関数でソート

 PHPには自然順ソートができるnatsortという関数がデフォルトで入っているとのことなのでやってみたのが以下。

 一番簡単かも。Mac環境に依存しないのでそういう意味での使い出もありそうです。

 3種類の自然順ソートを収録したXojoのファイルをこちら (420)に置いておきます。

 で、ブログにまとめてたら最後になんかPerlでモジュールを使わずにできそうなサンプルを発見してしまった。最初に出てきて欲しかった(汗)。

(2016.9.20)

追加情報メモ。
・ApplescriptならFinderにtellしてsort by nameで並べ替えちゃうのが手っ取り早いと。ただし処理は遅いから大量のファイル処理には向かないとのこと。
・OS Xでもバージョンによって微妙にソート結果が変わったりするらしい。なので確実にFinderのソート順通りのソート結果が欲しければApplescript上からFinderを呼び出して値を取得するか、Cocoaのライブラリを呼び出してソートさせるかするしかない。
・対象がファイル名ならPerl内からosascriptでApplescript呼んでFinderに聞くのが手っ取り早いんじゃないのと言われたのでちょい試しました。以下コードをメモ。

行けますね。楽でいいかも。

Xojo使い始めました

2016/03/24

 グレープシティさん開催の「Xojo の基本から実践まで学べるセミナー」に行ってきました。
 私が所属している会社ではこれまでEPUB制作用のツールをPerlにApplescript StudioでGUIを被せる形で作ってきたのですが、Applescript Studioを使うにはXcode3の環境の維持が必要で、XcodeはMac OSに強く紐付いたツールなので、OS Xの環境としては10.7の動作環境を維持する必要がありました。インストーラを加工して無理矢理10.9で動かす※1などの小細工でこれまでどうにか乗り切ってきたのですが、早晩マシンが壊れるなどすれば限界が来るのは見えていましたし、10.11ではXcode3のインストール時に相当深刻っぽいアラート画面が表示されたりもしましたので、代替環境として業界の先輩のものかのさんなどが使っていたXojoに目星をつけたわけです。
 当日は専門の開発者向けに結構高度なセッションも行われていたのですが、私のように数ヵ月に1回ツールを作る程度の人間には正直ちんぶんかんぷんだったりもしましたので、ここでは私のような非専業でアプリも作る程度の使い方の人間にとって有用そうな情報に絞って紹介します。

Xojoで作れるもの/ライセンス価格

 XojoはREALbasicの流れを汲むプログラム開発環境で、WindowsMaciOSLinuxRaspberry Pi のアプリの他、Webアプリも作れるようです。何故かAndroidが無いのですが、中の人に聞いてみたらOSのメジャーバージョンアップでコロコロ仕様が変わるためとのこと。
 ただ、各環境ごとにライセンスの購入は必要になります。料金表はこちら。Single Desktopあたりなら特に高くはないと思います。それ以外はある程度の期間開発に専念する境遇ならというところでしょうか。

Applescript Studioと比べてどこが良かったか

イベントハンドラにコードがぶら下がる

イベントハンドラにコードがぶら下がる

 EPUB制作ツールをいくつかXojoに移植した程度ですのでそこまで深いことはもちろん言えませんが、まずユーザーインターフェース的に各ボタンのイベントハンドラに動作させるコードをぶら下げる作りになっており、コードの管理はしやすいです。Applescript Studioでは「on clicked theObject」の中でオブジェクト名を名称判別してサブルーチンに飛ばすみたいな処理を自分で書く必要がありました。中でやってることは同じなんでしょうが、管理しやすいのはよいことです。
 それから、ほとんど英文ですがオンラインマニュアルが充実しており、使いたい機能名で検索すれば公式コードサンプルが大体すぐに出てきます。ユーザーコミュニティもそれなりに大きいようで、パワーユーザーによる新しめの情報にもアクセスしやすく、このあたりはもうとっくにレガシーなApplescript Studioとは雲泥の差がありました。
 また、内部で正規表現が使えるのも大きいです。Applescriptは正規表現使えないんでテキスト置換とかで泣けるんですよね※2
 あとはOSベンダーの都合で仕様がガンガン変わったりしないことでしょうか。Appleは割とバッサリ下位互換を切るところがありますので。

移行で苦労したところ

Perlのコードを呼び出して使う

Perlのコードを呼び出して使う

 AppleScriptもPerlも、変数の型をあまり意識しないで使えるスクリプト言語でしたので、きっちり型定義しないといけないところにはちょっと苦労しました。あとオブジェクト指向言語なのでオブジェクトのNil判定周りでちょっとコケてTwitterで教えてもらったりしましたが、まあそれくらいで、結構あっさり移植できた印象があります。ネット上にサンプルコードが豊富にあるとやはり強いです。それと有償ツールなので当然ではあるのですが、いざという時に公式サポートから助言がもらえるのは何と言っても心強いところです。

今後どう使っていくか

 何と言ってもマルチ環境対応が大きいです。ライセンス料のコストはかかりますが、直にJavascriptやPHPを書かなくても簡単なWebアプリのGUIならサクッと作れそうですので、例えば社内向けツールを簡単に作って社内サーバーで公開して使ってもらう外部の協力会社や発注者向けに情報共有ツールを作って提供するなど、いろいろとやれることがありそうです。
 また、PerlだけでなくAppleScriptも連携して動かせますので、InDesignなどを外部制御して動かすツールも作れます。まあその場合はもちろんMac専用になるわけですが。

 という感じで、弊社内でのツール開発目的での導入としては正解でした。今後ガンガン使っていきます。GUIがあるとないとでは使ってもらえる人の幅に大きな差が出ますので、結構こういうツールは重要です。Xojoはコードの書式がほぼVBに近いということですので、ExcelやAccessなどでVBAを動かしていた層のアップグレードとしても結構有用なんじゃないでしょうか。MSのアプリケーション環境にロックインされませんし、なんでもかんでもExcelマクロよりは明らかに筋は良いです。

※1 そのままインストールすると起動時にカーネルパニック画面が拝めます。

※2 AppleScript's text item delimitersでごにょごにょやるか、シェル経由でperlあたりに投げる必要があります。複雑な置換処理は外部シェル一択。

(2016.3.25)

プロフィール
Jun Tajima

こちらにて、電子書籍&Web制作を担当しています。
このブログは、EPUB3をはじめとした電子書籍制作担当オペレータからの、「電子書籍の制作時にたとえばこんな問題が出てきていますよ」的な「現地レポート」です。少しでも早い段階で快適な電子書籍閲覧・制作環境が整うことを願って、現場からの声を発信していこうと目論んでおります。

当ブログ内の記事・資料は、私の所属しております組織の許諾を得て掲載していますが、内容は私個人の見解に基づくものであり、所属する組織の見解を代表するものではありません。また、本ブログの情報・ツールを利用したことにより、直接的あるいは間接的に損害や債務が発生した場合でも、私および私の所属する組織は一切の責任を負いかねます。

最近のコメント