Home>History>

2008.02

2008-02-28

2008-02-28T18:10:35+09:00

XHandler 1.2

文字列で指定してたハンドラ実行することができる、AppleScript モジュールです。

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

ハンドラの名前を文字列で指定して実行する方法として、次のような run script ~

with parameters ~ を使った方法が知られていると思います。でも、これは十分ではないと考えています。

script TargetScript
property msg : missing value

on set_msg(a_msg)
set my msg to a_msg
end set_msg
end script

on call_handler(target_script, handler_name, an_arg)
run script "on run args
set a_script to item 1 of args
set a_param to item 2 of args
return a_script's " & handler_name & "(item 2 of args)
end run" with parameters {target_script, an_arg}
end call_handler

call_handler(TargetScript, "set_msg", "hello")
msg of TargetScript -- missing value が返ってきます。"hello" が返ってくることを期待しませんか?

なぜなら、run script で実行するスクリプトの with paramerters でスクリプトオブジェクトを渡す際に、そのスクリプトオブジェクトがコピーされてしまうから。上の例のように、スクリプトオブジェクトの property の変更を行うようなハンドラに対しては使えません。

でも、XHandler を使えば、次のようにスクリプトオブジェクトがコピーされることはなく、普通のハンドラの呼び出しと同じことができます。

property XHandler : load("XHandler") of application "ModuleLoader"

script TargetScript
property msg : missing value

on set_msg(a_msg)
set my msg to a_msg
end set_msg
end script

XHandler's make_with("set_msg", 1)'s do(TargetScript, "hello")
msg of TargetScript -- "hello" が返ってきます。

その仕組みは・・・ぜひ、XHandler をダウンロードしてソースコードを見てね。

2008-02-23

2008-02-23T17:01:30+09:00

MergePDF 1.8.1

たくさんの PDF/画像 ファイル(PDF だけでなく一般的な画像ファイルも)を一つの PDF ファイルに束ねるためのアプリケーションです。Adobe Acrobat(製品版)が必要です。

PDF/画像ファイルを束ねる際に、その順番が問題になると思いますが、フォルダの表示に従ってその順番を決定します。すなわちフォルダ内でファイルが見えている順番で束ねるので非常に直感的ですし、束ねる順番の変更も簡単です。

2008-02-23T03:06:01+09:00

Bwana を改良した。

Bwana というユーティリティーを知っています?

ハードディスクのどこかにコピーするだけで、Safari で man page が見られるとってもいかした小物です。ターミナルの man コマンドを使っていると、man page を開いたターミナルだらけになりがちなのは僕だけでしょうか?

でもね、MANPATH をカスタマイズする方法がこれまで無かったんですよ。いや、ReadMe には man.conf をいじれと書いてありますが、システムの設定ファイルをいじるような方法は受け入れられない。

ソースが公開されているので、login shell の MANPATH の設定を反映するパッチを送ったらすぐさま採用された。

Bwana 2.4 では、シェルの man コマンドと同じ man page を見ることができます。ようやく使い物になるようになったね。

でも、ソースコード見るとツッコミどころがいろいろあります。一番驚いたのは、HTML をかなりベタな Objective-C で生成していること。こういうところで、XSLT を使えばいいのにと思わずにいられません(僕も覚えたてなんですが)。そうすれば、出力のカスタマイズが柔軟になるのにね。

ところでなんで、各種 man page のビューアは目次などを表示してくれないのだろう。

2008-02-22

2008-02-22T16:18:56+09:00

カンザキさん、寄付ありがとうございます。

ほんとにありがとう。励みになります。

TeX Tools for mi が未だ Leopard に対応していないことは、本当に心苦しい。

fink で 10.5 に対応した Octave-forge はいつになったら登場するのかしら(もちろん MacPorts でも可)?それが出てきてくれるのを待っているのだけど。

これで、30人目

2008-02-20

2008-02-20T19:16:59+09:00

Perl の URI モジュールで絶対 URI を相対 URI に変換するときの話。

use URI::file

print URI::file->new_abs("/aaa/bbb")->rel(URI::file->new_abs("/aaa/ccc/../f"))."\n"'

ところで、これは、絶対 URI を相対 URI に変換するスクリプトです。

結果は、"../../bbb"となります。正解は、"bbb" だと思うのだけど。

相対 URI を生成する為の基底 URI に ”/../” という冗長な部分が存在するとおかしなことになるようです。

これはどうしようもないのかしら?

2008-02-20T19:06:10+09:00

HTML::Copy 1.3

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

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

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

例えば、僕はソフトウェアのマニュアルの目次ページは、内容を読み取って自動的に生成するようにしています。このとき、目次ページのテンプレートファイルのコピーに使っています。

今回のアップデートでは、付属のコマンドラインツール htmlcopy で標準入出力をサポートしました。これは、次の様なことをする為です。

xsltproc .style.xsl source.xhtml | htmlcopy - ../newfile.html

こんな感じで、XSLT で出力した HTML ファイルをファイルに書き出さずに別のディレクトリに移動させることができます。

また、Taro Nishino さんのご協力で、MS Windows 環境でもちゃんと動くようになったはず。やっぱり、自分の環境以外のことはよくわかんないんだよね。

2008-02-18

2008-02-18T17:22:48+09:00

TeX Tools for mi 3.2.2

高機能テキストエディタ mi を中心とした LaTeX の統合環境を提供するアプリケーションとスクリプトのセットです。

  • 「PDF プレビュー」の設定が「Finder で開く」もしくは「Adobe Acrobat」の場合にエラーが発生する不具合を修正(カンザキさん、ありがとうございました。)

もし、昨日ダウンロードしてくださった方がいらっしゃいましたら、もう一度ダウンロードしてください。昨日は、パッケージの作成をミスりました。

2008-02-17

2008-02-17T22:44:03+09:00

Show Help 1.0

バンドルに設定されている Help Book をヘルプビューアで表示する AppleScript です。

例えば、アプリケーションのヘルプを表示する為には、起動してヘルプメニューから項目を選択する必要がありますが、Show Help を使えば、アプリケーションを起動しなくてもヘルプを表示させることができます。

スクリプトメニュー等、AppleScript を実行できるユーティリティ(DragThing, Quicksilver など)から実行してください。普通に実行すると、Finder で選択したバンドルの Help Book を表示します。

Quicksilver の Action として使うこともできます。

僕は、AppleScript モジュールのマニュアルを表示させるのによく使います。

2008-02-17T17:22:48+09:00

だいたい新しい更新体制が確立した。

XSLT を覚えて、更新履歴の新しい編集体制が確立できた。

従来は、次のようは手順で更新していた

  1. トップページに新しいトピックを順次追加。
  2. 適当にたまったら History 以下に、新しいページを追加して、GoLive でコピー&ペースト。

こんな感じで思いっきり、すべて手でやっていて、各トピックが移動する物だから、各トピックにアンカーを持たせて、外部からそこへのリンクを張れない。また、大量のトピックがトップページにたまりがちになっていた。

RSS の生成はなんでもRSS にお願いしていた。なんでもRSS 自体はすばらしい技術だけど、やっぱりいくらかクオリティーに不満がある。

というわけで、現在、次のようなやり方で更新履歴をアップデートしていくことにした。

  1. History 以下のページをまずは更新する。
  2. 最新のトピック 10件を抜き出してトップページ用のデータを生成(XLST)。
  3. 抜き出したトピックのデータをトップディレクトリにコピー(拙作 htmlcopy を使う)。
  4. 抜き出したトピックを RSS 用の RDF に変換(XLST)。

以上は、サーバーサイド。History 以下のページをまず更新することにより、各トピックにアンカーを持たせられる。アンカーは XLST でクライアントサイドで生成する。トピックタイトルの右側の錨アイコンからリンクを取得できます。

サーバーサイドで XLST を使う理由は非常に薄いけど、クライアントサイドとサーバーサイドの間で、いつでも処理を移せるのはいいことかな。

ちなみに、サーバーサイドの処理の駆動には make を使っています。

誰かのご参考になれば。

2008-02-13

2008-02-13T11:02:04+09:00

なぜか XSLT が適用されるようになった

このページのファイルと xsl ファイルの名前をを変更しただけで XSLT が効くようになった。なぜだろう。

まったくもって腹が立つ。

RSS も自前で生成できるようになった。RSS から各トピックへのリンクもちゃんと動くと思う。今しばらく、このトップページがバタバタするけどご勘弁。

2008-02-12

2008-02-12T23:32:59+09:00

XSLT が効かない

ローカルでちゃんとこのページに XSLT が適用されて、各 topic に対して anchor が生成されるのだが、アップロードしてリモートのファイルを読み込ませると適用されない。

まったくもって腹が立つ。

2008-02-12T10:37:07+09:00

XSLT を勉強中

現在、XSLT を鋭意、勉強中です。だいぶ使えるようになってきた。

クライアントサイドで、大きくページを再構築できるところに可能性を感じている。たぶん、サーバーサイドでアプリケーションを利用している人には、あまり必要ないのかもしれない。自分のように、素の HTML/XHTML を作る製作環境ではとっても魅力的だと思う。

最終的には、次のようなことをしたい。

  • RSS の生成
    • 今は、なんでも RSS を使っているけど、更新時にこのページから RSS を自動的に生成するようにしたい。
  • 更新履歴のアーカイブからこのページを自動的に更新/構築。
  • 各更新履歴に対してリンクをはれるように id 属性を自動的につける。

もちろん、多くはあらかじめファイルを生成する処理になると思うけど、クライアントサイドに処理を移した方が管理の手間が楽になりそう。

XSLT の所感/ハマったところをいくつか。

  • XML でプログラムするのはめんどくさいぞ。
  • でも、簡単なことなら、本当にサクッとできるぞ。
  • 普通のプログラム言語とだいぶ毛色が違う。変数を一度宣言したら、変更できないとか。
  • ソースとなる XML の構造がしっかりしていないと XSLT がうまく組めない。
  • サーバーサイド/ローカルで XML を変換するだけなら、Perl とか普通の言語を使った方が遥かに自由度は高いぞ。
    • CGI を使える環境なら、XSLT の存在意義はかなり薄い気がする。
  • ソースに XSLT を埋め込んだ場合、拡張子が .xml か .xhtml じゃないと、Safari は処理してくれない。.html だと、XSLT は無視される。
  • XSLT の output の method を xml にすると、JavaScript にものすごくいろいろと制限がつくぞ。
    • document.write とか、document.body が使えないとか。
      • 全部 DOM API でやれということか?
    • output の method は html とするのが、現実的。

本など買わずに、オンラインの資料をあさって勉強した。参考になったのは、以下のサイト。

ありがとうございます。

2008-02-12T09:16:41+09:00

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

誠にありがとうございます。忌憚の無いご意見を頂ければ幸いです。

これで、29人目。

2008-02-05

2008-02-05T00:00:00+09:00

FileSorter 3.0

ファイルの参照のリストを、Finderで表示されている順番に並び替える ApppleScript モジュールです。アイコン表示、リスト表示、カラム表示に応じてソートの仕方を自動的に選択します。

2008.02.04

2008-02-04T00:00:00+09:00

FinderSelection 2.0.2

Finder で選択されている物から条件にあったファイル/フォルダを取得するライブラリ/モジュールです。

AppleScript をスクリプトメニューや何らかのランチャーから起動して、Finderで選択されている物を取得して処理を行う・・・よくある AppleScript だと思います。FinderSelection はエラー処理を含めて気の利いた処理をほんの数行で実現できます。

2008.02.03

2008-02-03T00:00:00+09:00

XList 1.2.1

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

データ処理で AppleScript おせ〜と思われている方がいらっしゃいましたら、ぜひ一度 XList を試してみてください。リスト処理を XList に置き換えると、劇的に速度が向上します。

2008.02.02

2008-02-02T00:00:00+09:00

SortEngine 2.0

クイックソートとバブルソートのアルゴリズムを内蔵し、オブジェクト指向インターフェースで動作をカスタマイズできるソートルーチンの AppleScript モジュールです。

2008.02.01

2008-02-01T00:00:00+09:00

Leopard と Tiger の Terminal スクリプティング

岡本さんから、Leopard のターミナルの AppleScript 用語辞書を教えてもらった。

できれば、Mac OS X 10.5 でも 10.4 でも動く TerminalCommander を作りたいと思っていた。でも・・・無理。ターミナルのオブジェトの階層にタブが紛れ込んでいるし、window class の property が全然違うじゃん。

しょうがないかもしれないけど、ひどいと思う > Apple。