Home>History>

2007.07-09

2007.09.28

Excel の AppleScript のバグ

必要があって、初めて Excel の AppleScript によるスクリプティングに挑戦した。

いきなり、バグに遭遇してしまった。

やりたかったことは、選択されているセルの位置を取得し、そこを起点にスバーっとデータを書き込んでいくこと。そこで、まずは選択されているセルの位置を取得する為に次のようなスクリプトを書いた。

tell application "Microsoft Excel"
set a_cel to cell 1 of active cell
-- セル "B2" が選択されているとき
set col_index to first column index of a_cel -- 3
set row_index to first row index of a_cel -- 3
end tell

どうも、選択しているセルのインデックスより、大きな数が返ってくる。いろいろ試してみると、選択しているセルのインデックスを n とすると、2 n - 1 の値が返ってくる。ちなみに、次のようにスクリプトを変更すると、ちゃんと動作する。

tell application "Microsoft Excel"
tell cell 1 of active cell
-- セル "B2" が選択されているとき
set col_index to first column index -- 2
set row_index to first row index -- 2
end tell
end tell

なんで、こんなことになるのか・・・不思議ですね。

2007.09.16

rokさん、寄付ありがとうございました。

CopyMagic はささやかなアプリケーションですが、長年メンテナンスを続けてきて本当に良かったと思えてきました。

CopyMagic はフォルダの中のエイリアスファイルを再帰的にそのオリジナルのコピーと入れ替えるスクリプトです。最初は、簡易バックアップソフト/ファイルのコピーのバッチ処理の為に作りました。用途はいろいろあると思うのですが、僕はもっぱらソフトの配布パッケージを作る時に使用しています。

配布パッケージのテンプレートとなるフォルダを用意しておき、その中に配布パッケージに含めるファイルのエイリアス入れておきます。ソフトをアップデートして新しい配布パッケージをつくるときは、エイリアスファイルを収めたフォルダをコピーして CopyMagic で処理します。すると、新しい配布パッケージの出来上がりとなります(実際は、前後に他の処理も行いますが)。このフォルダを QuickDMG でディスクイメージ化してアップロードしています。

僕の用途はこんな感じですが、また別の用途で誰かの役にたつこと願ってやみません。

これで、27 人目。

2007.09.15

ModuleLoader 1.3.2

AppleScript のモジュール管理システムです。

ModuleLoader を使うとスクリプトファイル名を指定するだけでスクリプトを load することができます。load script コマンドのようにファイルパスを書き込む必要はありません。

Unix で広く使われているスクリプト言語(Perl など)には再利用可能なスクリプト(モジュールと呼ぶことにします)を管理するシステムが備わっています。残念なことに、AppleScript では、load script コマンドを使ってファイルパスを指定してスクリプトをロードする原始的な方法しか用意されていません。ファイルパスをスクリプトに書き込むと、モジュールの場所を変更すると再コンパイルの際にはソースを書き直さなければならなくなります。

ModuleLoader の場合、スクリプトの先頭で以下のように、以下のようなコードを書き足さならないのが手間ですが、それでもいいことがいっぱいあります。

property loader : proxy() of application (get "ModueLoader")

on load(a_name)
return loader's load(a_name)
end load

property ModuleA : load("Module A")
property ModuleB : load("Module B")

2007.09.14

横山さん、寄付ありがとうございました。

おかげさまで、またもうしばらく頑張る気力がわいてきました。

これで、26 人目。

2007.09.12

GoLive 9 のライブラリパレット

GoLive 9 のライブラリパレットには Templates, SmartObject, Components のサブタブが存在し、それぞれその用途で使われ割れているファイルをフラットにリストアップするようだ。同名のファイルがあったり、多数の Compornts, SmartObject が使われていると、驚くほどに役に立たない。

しかも、CS2 でのデータフォルダの Compornts 以下にサブフォルダを作ってあると、無限ループに陥るようだ。

2007.09.11

AppleScript HTML 1.0.4

AppleScript のソ−スコードを、スタイルを再現する HTML に変換する AppleScript です。

2007.09.09

GoLive 9 を使用中

GoLive CS2 から GoLive 9 に移行してみた。

僕は、GoLive の基本的な機能しか使っていないので、CS2 でも機能的に不満があった訳じゃない。GoLive CyberSutio 3 の頃から使っているけど、GoLive は伝統的に結構不安定なので、ちょっとはましになってくれているんじゃないかと期待してアップデートした。本当は Dreamweaver に移行するべきなのかもしれないけど、全くもってけしからんことに、GoLive から Dreamweaver へのアップグレードパスは用意されていない。お金をいっぱい払うのしゃくなので、GoLive 9 へのアップグレードで我慢することにした。

安定性については、今のところ特に不安定な印象はないけど、評価するには時期尚早か。機能的には・・・GoLive 9 では、非常にたくさんの機能が削られてしまっている。自分が利用している限りでは、サイトウィンドウの仕様変更がものすごく気になる。

  • CS2 まであった、サイトウィンドウのエキストラタブに相当する物がない。
    • エキストラタブから参照できていた Components, Smart Objects, Template などの専用の置き場所が GoLive 9 にはない。
  • サイトウィンドウの左右に分割された2面表示から1面表示に変わっている。
    • リモートとローカルの内容を左右に並べて比較することができない。
  • サイトウィンドウのファイルリストでファイル内のアンカーが表示されなくなった。

サイト管理に関しては、明らかにものすごく後退しています。ほとんど、サイト管理の為に GoLive を使い続けていたのにな・・・

2007.09.06

AppleScriptDoc 1.1

ライブラリ/モジュールとしての AppleScript のリファレンスマニュアルを生成するアプリケーションです。

ソースコードにかかれたコメントから、スクリプトのリファレンスマニュアルを HTML として出力します。バンドル形式のスクリプトの場合、バンドル内に(ヘルブビューアに表示する) Help Book としてリファレンスマニュアルをセットアップできます。

2007.08.23

XHandler 1.1

ハンドラを文字列で指定して実行することができます。

スクリプト実行時に実際に実行するハンドラを決定したり、Chain of Responder や method forwarding など、動的な振る舞いの実現に訳にたちます。

AppleScript の言語レベルではサポートされていない機能を実現する AppleScript モジュールです。

2007.08.22

XAccessor 1.1

文字列で record のラベルや scirpt object の property 、グローバル変数を指定して値を取得/設定することができます。

AppleScript の言語レベルではサポートされていない機能を実現する AppleScript モジュールです。

2007.08.21

XModules

僕が公開しているAppleScript モジュールライブラリおよび関連ツール (ModuleLoader, ApppleScriptDoc) を XModules と名付けることにした。

よく言われることだけど、プログラミング言語の優劣のひとつにライブラリの充実度が上げられる。例えば、いくら Objective-C が優れていても Cocoa というフレームワークが無ければ誰も使わないマイナーな言語に落ちぶれてしまうと思う。Perl という摩訶不思議な言語だって驚異的なライブラリの充実故に(だと思うけど)よく使われている。

こまったことに、AppleScript の場合ライブラリという観点がゴッゾリ抜け落ちている。スクリプタブルアプリケーションやスクリプティング機能追加がライブラリに対応するという見方も無くはない。でも、Script Object のライブラリも必要じゃないかと思う。AppleScript はそれなりのオブジェクト指向言語なので、再利用可能なコードを書くには向いている。それなりに規模の大きいスクリプトを作るときは、コードをどんどんモジュールとして分割していかないと収拾がつかなくなる。

なんと言っても、Script Object の場合は、アプリケーションやスクリプティング機能追加のように、スクリプトを配布する際に追加のインストールを強いる必要が無いのがいい(property にロードする)。

でもね、モジュール(ファイルに保存されてロード可能な Script Object をそう呼ぼう)を管理/検索する仕組みが AppleScript にはかけている。load script コマンドはファイルへの完全な参照を与えなければならない。これは結構めんどくさいよ。モジュールの場所をちょっと動かしただけでコードに変更を加えなければならない。そこで、ModuleLoader を作った。

AppleScript からパスに依存せずアクセスできる外部リソースはアプリケーションだ。そこで、ModuleLoader というアプリケーションにモジュールを検索/ロードさせる、もしくはモジュールを検索/ロードする Script Object を取得するということを行う。さらに、ModuleLoader を使えばモジュールの依存関係も解決できる(詳細は ModuleLoader のマニュアルを見てね)。

ModuleLoader の基本的なアイデアはオリジナルではなくて、appleMods から拝借している。appleMods は最もまとまった AppleScript のライブラリだ。知ったのは、ここ2年くらいだけど、どうも Mac OS 9 の頃から存在していたみたい。appleMods も LoaderServer というアプリケーションを利用してモジュールをロードする。

でも、受け入れ難かったのが、モジュールに独自の構造化されたフォルダを要求することだ。マニュアルやリソースをまとめる為にそのようなことになっている。Mac OS X のバンドルと同じだ。じゃあ、スクリプトバンドルでいいじゃんと思ってしまう。なんといっても、スクリプトをさくっと作ってすぐさまモジュールとして使えないことに敷居を感じる。まあ、appleMods の場合、Mac OS 9 の頃からの歴史的事情が有るのだと思う。

というわけで、ModuleLoader は普通のスクリプトファイルや AppleScript アプリケーションをモジュールとして扱う。

ModuleLoader のもう一つの特徴は、モジュールの置き場所の自由度が非常に高いということ。ModuleLoader が置いてある場所およびそのサブフォルダからモジュールを検索する。すなわち、好きな場所に配置できる。また、名前を変更した ModuleLoader を用意すれば複数モジュールセットを持つことができる。たとえば、プロジェクトごとにモジュールセットを持つことができる。

こういうやり方は、マルチユーザ環境とはそりが合わない。でも、現実的には Macintosh を本当にマルチユーザで使っているケースは少ないと勝手に想像して、困ることはないんじゃないかと思っている。今のところ誰も使っていなさそうだし。

もうひとつ、モジュールの管理に必要なのはマニュアルの生成/閲覧の仕組みだ。自分で作ったコードでも時間が経つとすぐに使い方を忘れてしまう。だから、簡易的にでもリファレンスマニュアルを用意した方が後々ストレスを感じずに済む。このサイトを立ち上げた当初から AppleScript モジュールを公開しているけど、コードと別にマニュアルを書いていた。でもこのやり方だとすぐに実際の仕様と乖離してしまう。また、シュッと手軽にマニュアルを参照するのにはそれなりの仕組みが必要だ。

というわけで、コードのコメントから HTML のリファレンスマニュアルを生成し、スクリプトバンドルの Help Book として設定する AppleScriptDoc を作った。コードを書きながらリファレンスマニュアルを書くことができる。HeaderDoc, JavaDoc, RD をパクっている。いきなり、事細かに書かなくても一言二言コメントを書いておくだけでだいぶ違う。

さらに、AppleScriptDoc は生成した HTML をスクリプトバンドルにヘルプビューアで表示する Help Book としてセットアップできる。XModules として公開している多くのモジュールはスクリプトメニュー(だけとは限らないけど)から実行するとヘルプビューアにマニュアルを表示するようになっている。ヘルプビューアからスクリプトを開いたり、ハンドラのテンプレートをクリップボードにコピーできるのですごく便利だと思うのだけど。

そんなこんなで、最近は AppleScript モジュールライブラリの整備とその周辺ツールに注力している。当面予定したところにたどり着くのにあとちょっと。もう二つ新規モジュールを公開して、大幅に機能強化した AppleScriptDoc を公開したら、他のことをしよう。いい加減、飽きてきたしね。

だれか、コメントくれないかな・・・

2007.08.20

XCharacterSet 1.0.1

文字集合を表現する AppleScript のモジュールです。オブジェクト指向スタイルで様々な文字集合を構築し、ある文字列がその文字集合に含まれているがどうか調べることができます。

2007.08.15

XFile 1.0

XFile はファイル操作(移動/削除、属性の取得などなど)に統一的なオブジェクト指向インターフェースを与えるAppleScript モジュールです。

AppleScript でのファイル操作はスクリプティング機能追加、Finder、System Evetns、シェルコマンドを駆使して行えます。機能が分散していて非常に煩雑な印象を受けるのは僕だけでしょうか。XFile はこれらを統合してオブジェクト指向的に扱えるファイルオブジェクトを導入します。

宇宙人が登場したり、怪奇現象は起きたりはしないはずです f^^;。

2007.08.14

StationeryPalette 3.0.7 差し替え

先日公開した StationeryPalette 3.0.7 は・・・

  • ヘルプファイルが含まれていなかった。
  • 日本語ローカライズリソースが含まれていなかった。

というわけで、ダウンロードパッケージを差し替えました。もしダウンロードしてた方がいたらもう一度ダウンロードしていただけば幸いです。申し訳ない。けど・・・誰からも文句が無いということは誰も使ってくれていないということなんでしょう。切腹。

2007.08.12

HTML::SiteTear 1.4.2

Web サイトの一部分だけを抜き出す Perl スクリプトです。

Web サイトの一部を配布したいときに役に立つと思います。例えば、僕は配布するソフトウェアのマニュアルは この Web サイトの一部として制作ておりますが、配布するときは SiteTear を使って独立した HTML 書類として配布パッケージに含めております。

2007.08.11

HTML::Copy 1.2.2

HTML ファイル 内のリンクを保持したまま HTML ファイルをコピーする Perl スクリプトです。コマンドラインツールと Perl Module から構成されています。

普通に HTML ファイルをコピーすると、そのファイル内の相対リンクは壊れてしまいます。htmlcopy を使ってファイルをコピーすると、すべてのリンクを適切に書き換えてコピーします。

Web サイトの管理や HTML の自動生成などに使えると思います。

あらかじめ LWP をインストールしておかない(HTML::HeadParser が HTTP::Headers を要求している)と、make test でエラーが起きる不具合を修正。LWP をインストールしないとインストールできないのは、変わらないのですが、正しいエラーメッセージが表示されると思います。

2007.08.10

StationeryPalette 3.0.7

StationeryPalette は、パレットから選択されたテンプレート(ひな形)をコピーする事により新規書類を作成するアプリケーションです。アプリケーションに依存せず、すべてのアプリケーションのテンプレートを統一的に管理することができます。

また、新規ファイルを作る際に保存場所も決定されるので、狭苦しいファイル保存ダイアログを使う必要がなくなります。色んなアプリケーションの空ファイルを登録して、書類生成のスタートポイントとして使うと非常に快適です。

ちなみに、StationeryPalette の Finder の用にキータイプでリストアイテムを選択する(キータイプサーチ)コードが(たぶん)有名な2チャンネルブラウザの BatheyScaphe に使われています。BatheyScaphe のtsawada2 さんからキータイプサーチが Interl Mac で動かない旨、およびその回避法を教えていただき StationeryPalette でも修正を施しました。

Finder のように、日本語でもキータイプサーチできる Cocoa アプリケーションは StationeryPalette がはじめてだと思います。パクって頂ければ幸いです。

2007.08.09

HTML::Copy 1.2.1

HTML ファイル 内のリンクを保持したまま HTML ファイルをコピーする Perl スクリプトです。コマンドラインツールと Perl Module から構成されています。

普通に HTML ファイルをコピーすると、そのファイル内の相対リンクは壊れてしまいます。htmlcopy を使ってファイルをコピーすると、すべてのリンクを適切に書き換えてコピーします。

web site の管理や HTML の自動生成などに使えると思います。

2007.08.08

HTML::SiteTear 1.4.1

Web サイトの一部分だけを抜き出す Perl スクリプトです。

Web サイトの一部を配布したいときに役に立つと思います。例えば、僕は配布するソフトウェアのマニュアルは この Web サイトの一部として制作ておりますが、配布するときは SiteTear を使って独立した HTML 書類として配布パッケージに含めております。

2007.08.07

PathAnalyzer 1.5.2

ファイルもしくはフォルダのパス文字列("Macintosh HD:Users:UserName:hello.txt"とか)だけから引き出せるだけの情報を引き出します。

Finder に依存せず様々なファイルへの参照形式(alias、file specification、パス文字列、furl class、Finderの参照形式)から、以下の情報が取得できます。

  • フォルダへの参照
  • フォルダの名前
  • ディスクへの参照
  • 名前
  • フォルダであるかどうか
  • 拡張子

2007.07.31

Keizo Okakita さん、寄付ありがとうございます。

Strip Styles of Text は誠にささやかなアプリケーションですが、お役に立てていることをうれしく思います。

これで、25人目。

2007.07.25

UniqueNamer 1.6.3

指定したフォルダ内で他のファイルやフォルダとダブらない、ユニークなファイル名を求める AppleScript モジュールです。

Mac OS 9(Classic 環境)互換の長さのファイル名の生成にも使えます。

このスクリプトを作った、そもそもの動機はファイルセーブダイアログを見たくないということです。AppleScript で自動化したワークフローでファイルセーブダイアログが開かれるのにストレスを感じませんか?同じ名前のものがあっても、いちいち聞いてくんな!!、適当に名前を変えて保存してくれ!!と思いませんか? そんなストレスを解消するために(そんなストレスを与えないスクリプトを作る為に)、このライブラリを作りました。

2007.07.17

XDict 1.3

XDict は AppleScript で連想配列のデータ構造を提供するモジュールです。連想配列とはキー値に対応して値を設定した配列です。

Perl などで代表される多くのスクリプト言語のほとんどは、当たり前のように連想配列(多くの場合ハッシュと呼ばれています)を言語レベルで提供されています。しかしAppleScript では、この便利かつ重要な機能が欠如しています。

連想配列の類似の物でAppleScript には record クラスを持っています。しかし、record クラスは以下のような制限があります。

  • ラベルをスクリプト実行中に新たに追加することができない。
  • record の値を参照に使うラベルを変数にすることができない。

XDict は上記のような制限が無い、柔軟なデータコレクションオブジェクトです。キー値として is 演算子で比較できる物ならなんでも使えます。

2007.07.12

ApplScript Studio で Objective-C から AppleScript のハンドラを実行する。

AppleScript Studio の大きな不満の一つは、Objective-C から AppleScript Stuio で AppleScript のハンドラを呼び出せないことだと思う。もちろん、Objective-C からの AppleScript の実行自体は苦労しないのだけど、ファイルから読み込んだスクリプトでは、AppleScript Studio で使われている物とは違うインスタンスになってしまう。スクリプトは内部状態が存在する訳で、違うインスタンスでは困ってしまうことが少なくない。

AppleScript Sudio だって、Cocoa の枠の中で実現されているのでできなはずはないのだけど。そこで、class-dump をつかって、AppleScriptKit で定義されているメソッド一覧を取得し、やり方を推測/発見した。

@class ASKScriptCache;
@class ASKScript;

@implementation ASStudioHandler

- (void)callHandler
{
    NSDictionary *errorInfo = nil;
    ASKScript *a_script = [[ASKScriptCache sharedScriptCache] 
                                    scriptWithName:@"ScriptName"];
    [a_script executeHandlerWithName:@"handler_name"
            arguments:[NSArray arrayWithObject:@"an_argument"
	    error:&errorInfo];
}

@end

いまのところ、特に問題なく動いているように思える。でも、これは undocumented なので Leopard では動かないかも。

2007.07.11

XList 1.1

SmartList 改め XList

Iterator, Queue, Stack として使えるリストのラッパーオブジェクトを提供する AppleScript のモジュールです。

AppleScript のリストの欠けている機能の多くを補完します。

2007.07.10

XText 1.0

テキスト操作をオブジェクト指向で行うための、AppleScript のテキストのラッパーオブジェクトです。文字列の置換や分割、空白の除去など様々なテキスト操作をオブジェクト指向のスタイルで行うことができます。

XText は(たぶん)世にも珍しいテキストデータを parent にしたスクリプトオブジェクトを生成します。こうすることで、character 1 of ~ とか length of ~ といったAppleScript のテキストの property や element へのアクセスの文法がそのまま使えます。ただし、immutable という制限も引き継いじゃってますが。

2007.07.08

StringEngine 1.8.2

AppleScript によるテキスト処理ルーチンを集めたモジュールです。基本的なテキスト処理ルーチンを、ほぼすべて網羅していると思います。

  • 文字列を指定した区切り文字で分割してリストへ変換
  • 文字列のリストを指定した区切り文字で連結
  • 文字列中の文字列の置換
  • Styled text(もしくは Unicode text)から Plain text を抜き出す
  • AppleScript's text item delimiters の管理
  • その他たくさん

2007.07.05

XCharacterSet 1.0

文字集合を表現する AppleScript のモジュールです。オブジェクト指向スタイルで様々な文字集合を構築し、ある文字列がその文字集合に含まれているがどうか調べることができます。

さらなる AppleScript モジュールライブラリの増強が進行中。ちょっとだけでも興味を持っているひとはいないだろうか。