Home>History>

2007.04-06

2007.06.29

Nishikata さん、寄付ありがとうございました(24人目)。

QuikcDMG は近いうちに、大幅アップデートできたらいいな・・・・

2007.06.26

きたさん、寄付ありがとうございました(23人目)。

最近、TeX Tools for mi のアップデートしていないけど、将来のアップデートの布石として、AppleScript と Cocoa の基礎体力をつけ直しています。

具体的には・・・

  • AppleScript のモジュールライブラリの整備
  • Cocoa の勉強として
    • QuickDMG の大幅機能強化
    • MergePDF の Cocoa 化

に取り組んでいます。

不具合があったらすぐさま更新しますので、ご連絡いただければ幸いです。

2007.06.16

AppleScript で Chain of Responder

デザインパターンの一つで Chain of Responder というものがある。有名な HMDT さんのところで色んな言語での実装が比較されている。AppleScript も並んでいるけど、柔軟性で他の言語より見劣りする。

先日公開した、DynamicAccess を使えば、Objective-C と似たようなことができること気付いた。

script Responder
on perform(a_selector)
try
do of a_selector for me at me
on error
my _successor's perform(a_selector)
end try
end perform
end script

on button_with_successor(a_successor)
script ButtonObj
property parent : Responder
property _successor : a_successor
on preview(sender)
return "button's preview"
end preview
end script
end button_with_successor

on dialog_with_successor(a_successor)
script DialogObj
property parent : Responder
property _successor : a_successor
on print_contents(sender)
return "dialog's print"
end print_contents
end script
end dialog_with_successor

on make_application()
script ApplicationObj
property parent : Responder
on show_help(sender)
return "application's help"
end show_help
end script
end make_application

property DynamicAccess : load("DynamicAccess") of application (get "ModuleLoader")

on run
set an_app to make_application()
set a_dialog to dialog_with_successor(an_app)
set a_button to button_with_successor(a_dialog)

set help_sel to DynamicAccess's handler_selector("show_help")
a_button's perform(help_sel)

set print_sel to DynamicAccess's handler_selector("print_contents")
a_button's perform(print_sel)
end run

これだけなら、successor を parent するのが手っ取り早いかもしれない。つまり、responder chain をたぐるのに継承を利用することも考えられる。でも、継承関係はオブジェクトを生成した後では変更できない。また、DynamicAccess と Responder オブジェクトを使った実装の方が、途中で他のオブジェクトに forward するチャンスを作ることができるので拡張性と柔軟性が高いと思う。

2007.06.15

AppleScriptDoc 1.0.2

ライブラリ/モジュールとしての AppleScript のマニュアルを生成するスクリプトです。コードに埋め込まれたコメントから ヘルプビューアで表示できる HTML を生成します(こんな感じ)。

AppleScript に決定的に欠けているもの一つはライブラリだと思います(もう一つはデバック環境)。ライブラリ/モジュールの開発にお役に立てれば幸いです。

2007.06.14

本日の Donation

Jounler に寄付を支払った。メモや作業ログの保管場所としてとっても便利。PayPal に支払っていただいた寄付を活用させていただいております。

昔から、シェアウェアなどにはきちんとお金を払っている方だと思う。自分でソフトを公開するようになって、さらにコメントのメールしたりお金を支払ったりすることが頻繁になった。勝手にオンラインソフトを作っている人に同情しているのだと思う・・・けど、僕が注目するのはいずれもメジャーな物ばかりだから、僕のように寂しくないのかも。

いままでにお金を払ったシェアウェア/フリーウェアは・・・

  • mi
  • DragThing
  • Quicksilver
  • GraphicConverter
  • Script Debugger
  • iClip 4
  • Witch
  • Service Scrubber
  • WidgetTerm
  • DockStar
  • Iconographer
  • 英辞郎 辞書データ
  • Cyberduck
  • DiskCatalogMaker
  • Fetch 4
  • StickyWindows -- 今は使っていない。
  • DefaultFolder -- 今は使っていない。
  • KeyboardMaestro -- 今は使っていない。
  • Mac OS 9 時代にさかのぼればもっともっとある。

他にも、フリーウェアで寄付の受け入れ口を用意してくれれば支払いたいものはいくつかある。眺めてみると、シェアウェアが多い気がする。ソースが公開されているフリーウェアにもっと寄付したいな。

2007.06.13

AppleScript HTML 1.0.3

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

この page によくのせる AppleScript のコードはこのスクリプトで生成している HTML です。

2007.06.12

StationeryPalette 3.0.6

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

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

どなたか、カスタムアイコンを作ってくれませんでしょうか?

2007.06.11

pbcopy で UTF-8 テキストを扱う。

Mac OS X 固有の便利なシェルコマンドとして pbcopy/pbpaste というものがある。pboopy を使えば、シェルスクリプトの出力をクリップボードに収めることができるので、シェル環境と GUI 環境との間のデータの受け渡しに便利。

pbcopy の困った仕様と一つとしてシステムの言語環境のデフォルトエンコーディングのデータしか受け付けてくれないというものがある。日本語環境の場合は、MacJapanese(ほとんど Shift-JIS)。でも、シェル環境は普通 UTF-8 が都合がいい。ファイルシステムが UTF-8 だからターミナルのエンコードは UTF-8 にして、ロケールは ja_JP.UTF8 にして使うのが一般的じゃないだろうか?だから、シェルコマンドの出力も UTF-8 であることが好ましい(でしょ?)。

pbcopy で扱うエンコーディングは __CF_USER_TEXT_ENCODING という環境変数で決定されるらしい。日本語環境では、「0x1F5:1:14」という値が設定されていると思う。この値の意味は・・・

  • 0x1F5 -- UID ?
  • 1 -- テキストエンコーディング。1 は MacJapanese を意味する。
  • 14 -- region code ? 日本語環境を意味していると思う。

真ん中の「1」という数字を UTF-8 を意味する 0x08000100 に変更すれば良いらしい。これらの数字は Core Foundation で定義されている。

というわけで、.bash_profile で

export __CF_USER_TEXT_ENCODING=${__CF_USER_TEXT_ENCODING/:*:/:0x08000100:}

としておくと、__CF_USER_TEXT_ENCODING は、「0x1F5:0x08000100:14」となって、pbcopy と pbpaste で UTF-8 を扱える。そのかわり、Shift-JIS は扱えなくなっちゃうけどね。

ロケールの設定に従ってくれるのが一番いいと思うのだけど、なんでそうしないのだろう。

ところで、UnixScriptTools for mi の「実行/結果をクリップボードへ」では、pbcopy を使っている。UTF-8 で出力させているときは、上記の設定を試してみてくださいね・・・といいつつ、誰も使っていないであろう現実が寂しい。便利だと思うのだけど。

2007.06.10

AppleScript の Unicode 処理の恐るべきバグ

2チャンネルの掲示板で教えてもらった AppleScript の恐るべきバグの話。

システムのデフォルトエンコーディング(日本語環境の場合はだいたい Shift-JIS)に含まれない文字の Unicode text のリストを結合できない!!

再現方法は、まず Unicode 固有の文字列をクリップボードに収める。文字パレットから雪だるまマークとか温泉マークとかをエディタに入力してコピーするといいでしょう。

そして、次のスクリプトを実行してみる。

set a_text to the clipboard as Unicode text
set a_list to characters of a_text
a_list as Unicode text -- result : ""

空文字列が結果になります。かなり衝撃的です。AppleScript では Unicode を処理は処理できないといっているに等しい。

僕は Unicode 固有の文字を扱うことはないので、そう困ることはないと思うけど、複数の言語を同時に扱いたい人にとっても凄まじく致命的な気がします。

2007.06.09

ShowHelpBook 1.0

Current Bundle(path to me で取得できるパス) の中の Help Book をヘルプビューアで表示するモジュールです。基本的には、HelpBook.osax の命令を呼び出しているだけですが、エラー処理(メッセージをダイアログで表示するなど)と Info.plist の内容が失われているときの自動復旧を行います。

Script Libraryで公開しているモジュールのほとんどは ShowHelpBook を使って、自分のバンドル内のマニュアル表示機能を持っています。

2007.06.08

DynamicAccess をちょっと補足

DynamicAccess を使えば、record をハッシュ/連想配列のように使うことができます。でも、避けられるなら DynamicAccess を使わない方がいいです。というのも、DynamicAccess の仕組みは内部で label にアクセスする handler を持ったスクリプトをコンパイルして生成しています。このコストが高い。乱用すると遅いスクリプトが容易に出来上がります。

連想配列が欲しいときは KeyValueDictionary がおすすめです。KeyValueDictionary もハッシュ法を使ずリニアサーチでキー値を検索するので、決して効率が言い訳ではない(とくに、要素の数が増えるとどんどん遅くなる)ですが、それでも、ほとんどの場合 KeyValueDictionary の方が高速に動作します。ちょっと試した限りでは、要素の数が、500個くらいまでは KeyValueDictionary の方が高速です。普通、数百個の要素の record を扱うことはないでしょう?。だから、KeyValueDictionary をお試しあれ。

ハンドラの動的実行は AppleScript Studio アプリケーションのスクリプティングに使えると考えています。AppleScript Studio アプリケーションは、スクリプトエディタで作ったアプレット/ドロップレットと違って、内部のハンドラを外部から呼び出すことができない。でも、open ハンドラだけは呼べる。これまで、この性質を利用して open ハンドラに値を渡して、AppleScript Studio アプリケーションの open ハンドラ内に if 文で値に対応した処理を実行するようにしていた。でも、こんな醜いことしなくても、DynamicAccess で生成した selector object を渡せばいいじゃんということに気づいた。まあ、DynamicAccess を使わなくても、スクリプトオブジェクトを渡せば if 文を一掃できる。

2007.06.07

DynamicAccess 1.0

  • 文字列で record のラベルや scirpt object の property を指定して値を取得/設定することができます。
  • ハンドラを文字列で指定して実行することができます。

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

正直、実用的に使ったことはないけど面白い機能なのでモジュールを先行して公開しました。

2007.06.06

AppleScript で高速データ処理

先日の、repeat with ~ in ~ でのリストの要素へのリファレンスをつかったリストの書き換えを追記しました。

2007.06.05

My AppleScript Coding Style

現在、自分で決めて自分で使っている AppleScript のコーディングスタイルをまとめました。

もっぱら、変数の命名規則についてです。自分が公開しているコードは、今現在、全部これに準拠している訳ではないけど、新しく書くコードはこのスタイルに合わせていこうと思っています。

ご参考になれば幸いです。

2007.06.04

HTML::SiteTear 1.4

web site の一部分だけを抜き出す Perl スクリプトです。

通常、web site のあるページには、そのweb site 内のいろいろなところへのリンク(ほかのページへのリンクだけではなく、画像やJavaScript、CSSも含む)が張られていると思います。そのページを指定された場所にコピーし、さらにその下にフォルダを作り、そのページが一つの独立した web site として成立するための全てのファイルをコピーし、HTML 内のリンクパスを書き換えます。

web site の一部を配布したいときに役に立つと思います。

2007.06.02

HTML::Copy 1.2

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

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

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

CPAN にも登録していますので、CPAN からインストールすることもできます。

2007.06.01

SmartList 1.0.2

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

変更点は、

  • each, map でリストの内容の変更を可能にした。

2007.05.31

リストの要素へのリファレンスの奇妙な振る舞い

何はともあれ次のコードを見て欲しい。リストの要素へのリファレンスを取得し、そのリファレンスの contents を書き換えることによってリストの要素を入れ替えようとしている。

property a_list : {1, 2}

(* Case 1*)
set a_ref to a reference to item 1 of a_list
set contents of a_ref to 3

(* Case 2 *)
set a_ref to a reference to item 1 of my a_list
set contents of a_ref to 3 -- error of number -10006

Case 1 は問題なく動作する。Case 2 の場合はエラーが発生する。Case 1 と Case 2 の違いは、my があるかどうかだけ。

このようなエラーの何が困るかというと、次のように repeat with ~ in ~ でループの中で要素の書き換えを行いたい時に困ってしまう。

property a_list : {1, 2}

repeat with an_item in (my a_list)
set contents of an_item to 3 -- error of number -10006
end repeat

my をつけなければいいじゃないかというかもしれないけど、扱いたいリストが同じスクリプトオブジェクトにあるとは限らない。もっと重要な問題として、my をつけないと遅いのだ(AppleScript で高速データ処理 を参照)。

さて、困った困ったという話にしようと思っていたけど、この記事を書いている最中に解決方法を見つけてしまった。次のように、my の頭に a reference to をつければうまくいく。

property a_list : {1, 2}

repeat with an_item in (a reference to my a_list)
set contents of an_item to 3
end repeat
a_list -- result : {3, 3}

なぜこうなっちゃうのかわからないのが AppleScript のイタイところ(誰か教えて)。

これで SmartList の map や each で、要素の書き換えをできるようにできそうだ。

2007.05.30

SmartList 1.0.1

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

変更点は、

  • 英語マニュアルの追加
  • all_items() を追加
  • reset() を追加
  • などなど

2007.05.23

SmartList 1.0

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

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

サンプルコードをみていただくのが手っ取り早いでしょう。

property SmartList : load("SmartList") of application (get "ModuleLoader")

(* Iterator *)
set an_iterator to SmartList's make_with_list({"a", "b", "c"})

repeat
set an_item to next_item() of an_iterator
if an_item is missing value then
exit repeat
end if

log an_item
end repeat

(* Queue *)
set a_queue to SmartList's make_with_list({})
a_queue's push("a")
a_queue's push("b")
log a_queue's shift() -- result : "a"
log a_queue's shift() -- result : "b"

(* Stack *)
set a_stack to SmartList's make_with_list({})
a_queue's push("a")
a_queue's push("b")
log a_queue's pop() -- result : "b"
log a_queue's pop() -- result : "a"

2007.05.19

InsertionLocator 1.2.1

Finder で選択されている場所を取得する AppleScript モジュールです。

Finder の insertion location プロパティは、常に Finder ウィンドウのトップレベルを意味します。選択されているフォルダやリスト表示で表示されているサブフォルダを取得したい場合もあるでしょう。InsertionLocator はそれらを取得することができます。そして、アプリケーションにあわせて細かい振る舞いをカスタマイズすることができます。

PowerSelectOpen in Terminal で Finder で選択されている場所を取得する為に使っているモジュールです。

2007.05.18

GUIScriptingChecker 1.0

GUI Scripting が使用可能かどうか調べる AppleScript モジュールです。GUI Scripting を使ったスクリプトの最初で使います。

GUI Scripting が使用不可の場合は、システム環境設定を起動して設定を促すダイアログを表示します。

マニュアルは英語のみ。日本語で書いても反響無いので、これから新しい作品は English First でいくことにした。

2007.05.17

PowerSelect のささやかなこだわり

PowerSelect 2.1 ではささやかですが、以下のようなこだわりの改良を施しています。

賢く Finder で選択されている場所を判断する。

PowerSelect は Finder で選択されている場所の中身を検索します。普通、Finder で選択されている場所といえば、Finder ウィンドウで表示されているトップレベルのフォルダです。Command + N でフォルダが作られるところがそこに相当します。AppleScript でも Finder の insertion location プロパティとして取得できます。

Finder ウィンドウがアイコン表示やカラム表示のときはこれでいいと思うのですが、リスト表示の場合は不十分であると思います。

リスト表示されているサブフォルダが注目している場所であることも多々あります。そこで、PowerSelect はサブフォルダ内のファイルが選択されていれば、そのファイルがある場所を検索場所とします。

さらに、フォルダが選択されているときは・・・

  • フォルダの内容が展開されていたら、そのフォルダを検索場所とする。
  • フォルダの内容が展開されていなかったら、そのフォルダをの上位フォルダを検索場所とする。

という振る舞いをします。要するに、内容が表示されている選択フォルダを検索場所にしようというコンセプトです。

賢く Finder でファイルを選択する。

これまた、Finder ウィンドウがアイコン表示やカラム表示の場合は問題ないです。リスト表示のサブフォルダ内のファイルを選択する場合が問題です。

サブフォルダ内のファイルを AppleScript の select コマンドで選択すると、常に新しいウィンドウが開かれてしまいます。できれば、リスト表示のウィンドウでファイルが表示されているのですから、それを選択してほしい。

Mac OS 9 の Finder では、自動的にそのように振る舞ってくれました。そもそも、Mac OS 9 の Finder では複数のウィンドウで同じフォルダの内容を表示しないしようでしたから。

PowerSelect では、あくまで内容が表示されているフォルダを検索場所とするので、既に表示されているファイルの為にわざわざ新しいウィンドウが開かれるのはうっとうしいですね。というわけで、リスト表示のサブフォルダ内のファイルを選択してそのファイルが見えるようにウィンドウをスクロールするということを GUI スクリプティングを使って実現しています。

2007.05.16

PowerSelect 2.1 を公開

PowerSelect は選択されているフォルダの中から、条件にマッチしたファイルを検索します。それらのすべて、もしくは一部だけ選択できます。

次のような使い方を想定しています。

  • Spotlight より手軽な、簡易検索ソフトとして。
    • 対象とするフォルダも1階層だけですし、ファイル名しか条件に含めません。たくさんのファイルを含んだフォルダからファイル名だけを条件にするなら、Spotlight より高速です。
  • ある種類のファイルだけを選択して、何かする。
    • 例えば、PDF ファイルだけを選択して・・・
      • 移動する。
      • PowerRenamer でファイル名を変更する。
      • QuickFileType で Adobe Reader ではなく、プレビューで開くようにクリエータコードを変更する。

どなたか、カスタムアイコンを作ってくれないでしょうか。

2007.05.14

ModuleLoader 1.3.1 を公開

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

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

大きなスクリプトを構築する為には、必然的に複数のスクリプトに分割して、見通しを良くすることが必要になると思います。AppleScript では、load script コマンドを使ってファイルパスを指定してスクリプトをロードする原始的な方法しか用意されていません。ファイルパスをスクリプトに書き込むと、モジュールの場所を動かすと再コンパイルの際にはソースを書き直さなければならなくなります。ModuleLoader を使うとこのような問題を解決できます。

例えば、load script では次のようにフルパスを記述する必要があります。

property Module1 : load script alias "Macintosh HD:Users:Your Home:Module1.scpt"

ModuleLoader を使えば次のようにすっきりとかけます。

property Module1 : load("Module1") of application (get "ModuleLoader")

Module1.scpt は ModuleLoader がある場所もしくはそのサブフォルダに配置します。ModuleLoader の位置は自由に動かせますし、ModuleLoader 以下にあればどのサブフォルダでも検索して探します。

さらに、Module1 が別のモジュールに依存しているときは自動的にアップデートされます。

ぜひ、AppleScript の開発者に使って頂いて、ご意見をちょうだいしたい。よろしくお願いします。 

2007.05.11

RSS 配信に暫定的に対応

RSS 配信のご要望を ppm さんから頂きました。いままで RSS なんて検討/利用したこともなかったけど、調べてみるとなかなか便利そう。

でも、僕は(お先真っ暗の)GoLive を使って旧態依然の(と思われる)静的な HTML でサイトを作り続けています。本体とは別に RSS feed を書くなんてめんどくさくてやっていられないのだ。

GoLive を捨てるか・・・とも頭によぎるけど、ソフトのマニュアルを考えると、静的な HTML 生成ツールは捨てられない。

正しい対応はこの What's New のページから RSS feed を生成するスクリプトを書くことだろう。難しくなさそうだけどめんどくさい。とりあえず「なんでも RSS」を利用させていただくことにした。

いつの日か、もっとちゃんとした RSS 配信を行えるようにしよう。

2007.05.08

OMCEdit の日本語ローカライズを誰かやりませんか?

OnMyCommand CM 1.8 が公開されましたね。最も柔軟性の高いコンテキストメニュープラグインだと思います。シェルスクリプトや AppleScript を知っていれば、自在にカスタムなコンテキストメニュー項目を追加できます。

OnMyCommand CM の設定ツール OMCEdit の日本語ローカライズをいつのことからか、自分をが担当してます。OMCEdit 1.8 にはいくつか未訳の部分がありますが、僕がさぼった訳ではなくてローカライズの依頼がこなかったから。

OMCEdit のローカライズの役目はすすんで引き受けた訳ではなくて、前任者に請われたからやっていますが、ローカライズという作業に情熱を持てないので誰か変わってくれる人はいないでしょうか?もし、誰も引き受けてくれないと(Knut Lorenzen さんから僕に作業依頼がないかぎり)OMCEdit の日本語版の不備は放置されてしまいます。

本当に、たいして負担にならないと思います(非常にまれに数行の英語を訳すだけ)。フリーウェアに貢献したいという方が名乗りを上げていただければ幸いです。有志の方からの連絡をお待ちしています。

2007.04.29

NSImage は AppleScript Studio の image として扱えない。

AppleScript Studio でファイルのアイコンを表示させることができなくて、愕然とした話。

AppleScript (Studio) だけでは、ファイルのアイコンは取得できないので、call method を使って NSWorkspace の iconForFile; を呼んで NSImage を取得する。この NSImage を image cell に設定しようとする。

set workspace to call method "sharedWorkspace" of class "NSWorkspace"
set an_icon to call method "iconForFile:" of workspace with parameter "path to file"
set contents of data cell "icon" of data row 1 of data_source to an_icon

すると、次のようなエラーが現れてプログラムが止まる。

NSImageCell's object value must be an NSImage.

NSImage を与えているはずなのに、NSImage として扱ってくれないという訳のわからない状況になる。どうやら、AppleScript Studio の枠組みの中で扱える画像は load image コマンドでファイルから読み込んだ物だけらしい。ファイルのアイコンだけでなく、call method 経由で取得した NSImage は image cell だけでなく image view にも設定できない。

やりたいことは、Objective-C を使えば簡単にできる。AppleScript Studio はこういう理不尽な制限が多いからキライ。間違っていたり、回避方法があったら誰か教えてください。

Bug Reporter に登録しようか。

2007.04.28

PowerBook 復活・・・せず

画面表示が突然乱れるようになった PowerBook を修理に出したときの話。

金曜日にとりにきて、月曜日に返ってきました。非常に速い。すばらしい。しかし・・・すぐさま別の症状が発症。使っていたら、突然画面が消える。そして、強制リセットさえ受け付けない状態になる。しばらくするとポーという音がして(たぶん、勝手に PRAM をクリアしている)ジャーンという音とともに再起動。ここで、なんと Open Firmware の画面が表示される。

  • mac-boot と入力する
    • 一応起動するが、しばらくして画面が消えて同じことの繰り返し
  • shout-down と入力する
    • シャットダウンするが、しばらくするとポーという音がして勝手に起動して、同じことの繰り返し

PMU のリセットなどしても効果なし。再度入院と相成りました。

ちゃんと、検証してから送り返してくれよな・・・

どうも、この PowerBook は祟られている。購入して、トラックパッドのボタンがおかしくて、すぐさま入院した。これで3度目の修理です。いままで、いくつも Mac を乗り継いできたけど、ここまでハードウェアのトラブルに悩まされたのは初めて。日頃の行いが悪いのだろうか?

2007.04.27

HAYAKAWA 様、寄付ありがとうございました。

目の肥えた方に評価していただけるのは、大変光栄です。これで、22 人目。

頂いた寄付は、僕が他のソフトに寄付を行う時にもっぱら使わせていただいております。

ですから、自分が儲かることなど到底あり得ませんので、ぜひご遠慮なく?寄付を頂ければ幸いです(^^;。

2007.04.26

リスト表示の Finder window を、選択項目が表示されるようにスクロールする

次の PowerSelect で使おうと思っているコードです。以外と GUI Scripting でも複雑なことができます。

tell application "Finder"
set toolbar_visible to toolbar visible of Finder window 1
end tell

tell application "System Events" to tell (application process "Finder"'s window 1 whose description is "standard window")
if toolbar_visible then
set t to splitter group 1
else
set t to it
end if

tell scroll area -1 of t
tell outline 1
set outline_properties to properties of it
set header_h to item 2 of (get size of group 1)
set content_size_v to (item 2 of size of outline_properties)
-- window が zoomed であるかどうかで、4 pixel だけ値が変わる。zoomed の時は、余白(4pixel)だけ増える
-- header をのぞいたサイズ
set content_pos_v to (item 2 of position of outline_properties) -- header の内側から
set pos_list to position of rows where it is selected -- 画面の上(menubar を含む)から測った上辺の位置
set item_h to item 2 of (get size of first row)
if class of item 1 of pos_list is list then
set pos_list to item 1 of pos_list
set item_h to (item 2 of last item of pos_list) + item_h
end if
set item_pos_t to ((item 2 of pos_list) - content_pos_v)
set item_pos_b to item_pos_t + item_h
end tell

set scroll_properties to properties of it
set sbar_h to item 2 of (get size of scroll bar 2)
set scroll_size_v to ((item 2 of size of scroll_properties) - header_h - sbar_h) -- header をのぞいたサイズ
set scroll_pos_v to ((item 2 of position of scroll_properties) + header_h) -- header の内側からのサイズ
set current_t to scroll_pos_v - content_pos_v
set current_b to current_t + scroll_size_v
set hidden_v to content_size_v - scroll_size_v
(*
- item_pos_t : 表示すべき領域の先頭位置
- item_pos_b :
- item_h : 表示すべき領域の高さ
- hidden_v : 表示できない領域の高さ
- scroll_size_v : 表示できる領域の高さ
- current_t : 現在表示している outline の領域 top
- current_b : 現在表示している outline の領域 bottom
*)

if hidden_v is 0 then return
if (current_t is less than or equal to item_pos_t) and (item_pos_b is less than or equal to current_b) then return
if (item_h > scroll_size_v) or (item_pos_b > current_b) then
-- align with last item
set scroll_ratio to (item_pos_t + (item_h - scroll_size_v)) / hidden_v
else
-- align with first item
set scroll_ratio to item_pos_t / hidden_v
end if
set value of scroll bar 1 to scroll_ratio
end tell
end tell

2007.04.25

AppleScript HTML 1.0.2

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

AppleScript のコードを web page に貼付けたい方に使っていただければ幸いです。

以下のような特徴があります。

  • スタイルシートファイルを使って、ソースコードのカラーリングを行う HTML を生成します。
    • スタイル情報がコードのマークアップと分離されているので、後からカラーリングや文字サイズなどの微調整を行うことが容易です。
    • (たぶん)非常にスマートな HTML を生成します。
  • スクリプトリンク機能
    • HTML に変換したソースコードをスクリプトエディタで開くリンクを付け加えます。サンプルコードを表示する時に使うと、ユーザーにとっては便利だと思います。
    • Apple のサイトにあるエンコードするスクリプトは、ソースコードに日本語が含まれていると正しく動作しませんが、このパッケージに含まれているスクリプトは日本語が含まれていても正しく動作します。

2007.04.24

移行アシスタントと闘った話

調子が悪くなった PowerBook を修理に出すために、データを昔のマシンに移行しようとした時の話。移行アシスタントは、データ/アプリケーション/設定をがばっと移せて限りなくもとの環境をコピーできるので非常に便利。Mac の面目躍如とでもいうべきすばらしい機能なんだけど、今回はこいつに泣かされまくりました。

移行するアカウントを選ぶところで、いっこうに処理が進まない。アカウントがリストアップされずに、プログレスインジケータがぐるぐる回って一向に処理が進まない。非常に悩んだ。結局 Console Log をみて MigrateTool というプロセスがクラッシュしていることを発見。これが原因だというのはわかったけど、なんでクラッシュするかわからん。

あーでもないこーでもないと試行錯誤して、結局、アクセス権を修復したらうまく動くようになった。ちなみにその時のログはこんな感じ。

“./private/etc/authorization”上のグループが一致しません。本来 80 であるはずですが、実際には 0 になっています
“./usr/bin/setregion”上のアクセス権が一致しません。本来 -r-sr-xr-x であるはずですが、実際には -r-xr-xr-x になっています

手動でガバッとコピーすると、(たぶん)アクセス権はちゃんとコピーされないと思うので、移行アシスタントみたいな機能がないとしんどいので、もうちょっとちゃんと動いてほしい。せめて、エラーメッセージくらいちゃんと出せよな・・・

Leopard なんかより、隅から隅までつつがなく動くことを重視してほしい。一体全体どれほどの時間を無駄にしたことだろうか。きっと似た体験をして、Mac にパンチしたくなる衝動に駆られた人は少なくないと思う。

2007.04.17

PowerBook が危ない・・・

最近、PowerBook の調子がおかしい。ときどき、画面がバサバサっとノイズ?が現れるようになる。いつもそうなる訳でもないけど、そうなるときは、キーボードやパームレストと右側に圧力を加えると画面が乱れるのでハードウェアのトラブルのようだ。しばらく放置するとおこらなくなり、再び使い始めてしばらくたつと、画面が悲惨な状況になる。熱も関連しているようだ。何が起きているのだろう。

PowerBook が壊れたら・・・さようならかも。

だれか、MacBook を恵んでくれないだろうか(あつかましい & ありえない)。

Takeshi Nishimura 様、寄付ありがとうございました。

2度も寄付を頂き感激の至りです。

2007.04.16

QuickDMG 2.0.8 を公開

フォルダやファイルから手早くディスクイメージファイルを作ることができます。

以下のような特徴があります。

  • 起動時に Finder で選択されているファイルやフォルダからディスクイメージファイルを作れます。
  • ドラッグ&ドロップされた、ファイルやフォルダからディスクイメージファイルを作ります。
  • ディスクイメージファイルは自動的にソースと同じ場所に保存することができます。
    • 保存場所を指定することもできます。
  • フォルダだけでなく、ファイルからもディスクイメージファイルを作れます。
  • ソースとなるフォルダやファイルのサイズから、自動的にディスクイメージの容量を決定します。
  • ディスクイメージファイルの形式を選択できます。

変更点は

  • bzip2 圧縮のディスクイメージのサポートを追加

2007.04.12

StringEngine 1.8.1 を公開

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

初心者の人は、AppleScript のテキスト処理は、一見どうしたらいいかわからないことが多々あるのではないかと思います。ぜひ一度ソースコードをのぞいて欲しい。

2007.04.11

path to me の話

Script Note さんに刺激されて、AppleScript の path to me コマンドについての解説を書いてみました。

path to me はスクリプト自身へのファイル参照が欲しい時に使うコマンドです。

Putaway Disk Image File 1.0.3 を公開

マウントされているディスクイメージボリュームをアンマウントして、そのボリュームのディスクイメージファイルをゴミ箱に入れます。オンラインソフトのインストール作業の後片付けに便利です。

  • 複数のディスクイメージがマウントされていると正常に動作しない不具合を修正

2007.04.09

SmartActivate 1.0.4 を公開しました。

指定したアプリケーションプロセスを、そのアプリケーションで最前面のウィンドウだけを前面に持ってくる形でフロントプロセスに切り替えるスクリプティング機能追加と、コマンドラインツールです。

  • コマンドラインツール activate の プロセス名の引数のエンコーディングをロケールで設定されているエンコーディングと仮定するようにした(Hiro さん、ありがとうございました)。

これまで、コマンドラインツール「activate」にプロセス名としてマルチバイト文字を与えると正常に動作しませんでした(なにも考えていなかったので)。与えられた文字を解釈するためにはエンコーディングの情報が必要なのだけど、環境変数で設定されているロケールの文字エンコーディングを仮定することにしました。つまり、ターミナルの文字エンコーディングと環境変数の文字エンコーティングがちゃんと一致すれば、ローカライズされたプロセス名を与えてもちゃんと動作します。

でも、アプリケーション/プロセス名は言語環境で変わっちゃうので、bundle identifier か creator type を使ってアプリケーションを指定するのがおすすめです(だからこれ以上は説明しない)。

ロケールを扱うのも初めてだったし、iconv も初めてだった。なかなか良い資料も得られず苦労しました。結局、Google Code でいろんなソースコードをみまくって使い方を調べた。オープンソースって便利・・・でも親切な資料があるとうれしいのだけど。

結局どういうことをしたかというと、

  1. setlocale で LC_CTYPE のロケールを取得、その値が "C" だったり、設定されていなかったら文字コードは UTF-8 とする。
  2. nl_langinfo(CODESET) でロケールに対応した文字コードを取得。UTF-8 以外だったら、iconv で UTF-8 に変換。
  3. UTF-8 に変換した文字列から NSString をつくって、らくちんな Cocoa World へ突入。

こんなかんじでいいのかな?

2007.04.03

Putaway Disk Image File 1.0.2 を公開

マウントされているディスクイメージボリュームをアンマウントして、そのボリュームのディスクイメージファイルをゴミ箱に入れます。オンラインソフトのインストール作業の後片付けに便利です。

多くのオンラインソフトはディスクイメージファイルとして配布されております。必要なものをコピーした後は、ディスクイメージファイルは不必要になるので、

  1. ディスクイメージボリュームをアンマウント
  2. Finder でディスクイメージファイルを表示させる。
  3. ディスクイメージファイルをゴミ箱に入れる。

という手順で後片付けをされているかと思います。煩雑な作業だと思うのは僕だけでしょうか?Putaway Disk Image File は、上記の作業を一気に行います。

2007.04.02

UnixScriptTools for mi 2.1 を公開

高機能テキストエディタ mi で Unix スクリプト(bash、Perl、awk、ruby、gnuplot、Octave など)の開発および実行を支援するアプリケーションおよびスクリプトのセットです。

mi の最前面のウィンドウの Unix スクリプトをコマンド一発でターミナルを起動して実行することができます。ターミナルでコマンドを入力する手間を省くことができ、スクリプトの開発効率を上げることができると思います。

さらに、対話型のプロセスをサポートします。ターミナルで対話型プロセスを起動し、そのプロセスに mi で選択しているテキストを送りつけることができます。

もっぱら、Perl モードのツールを大幅に機能拡張しました。

ところで、UnixScriptTools for mi は インストールがわかりにくい気がするのですが、どうでしょう?何の質問もないから、このままでいいのかな?