カラーパレットと日本の伝統色

カラーパレット

Photoshop と Illstrator で使えるスウォッチファイルはいろいろなサイトで配布しているのだけど、色の確認のために Photoshop を立ち上げるのは面倒だったので、日本の伝統色 和色大辞典 - Traditional Japanese Color Names を参考にして、Mac OS X のカラーパレット用のファイルを作ってみた。

ついでに「世界の伝統色」と「ヨーロッパの伝統色」も同梱しています。

ダウンロードしたファイルを解凍し、Japanese.ctl ファイルを ~/Library/Colors に置けば、インストールは完了。カラーパレットを扱うどのアプリケーションからでも利用することができます。

Mac OS X のカラーパレットってけっこう便利で、これだけを解説したサイトもあるぐらい。

Using the Mac OS X Color Picker © Robin Wood 2009

なかなか充実した内容で、知らなかったことがたくさんあったり。特に写真から色を抜き出す方法は、知っていると重宝するかも。

このページでダウンロードできる ColorPicker というアプリケーションは、カラーパレットを表示するだけのアプリケーションです。ColorPicker と同じことは、AppleScript の choose color 命令でできますが、アプリケーション形式になっているので常時表示させておくときに便利です。

一方、AppleScript を使うとカラーパレットで色を選択した後の処理が追加できるので便利です。よく目にするのが、choose color の返り値を HTML の 16 進に変換するというもの。これは、AppleScript: Essential Sub-Routines に掲載されていますね。

こういう小さいツールが案外と役に立つ。

Finder Toolbar Scripts について

前の記事で Finder Toolbar Scripts を公開したのだけど、まさか、影響を受けた方にご紹介をしていただけるとは思っていませんでした。わかばマークのMacの備忘録さんが詳細な使い方を書いて紹介してくださっていました。他人任せはいかんよな...と少し反省。そんなわけで、同梱の Read Me に書かなかったことをいくつか。

いずれのスクリプトも「実行専用」ではありません。中身を見てご自由に改変してくださって結構です。個人の利用の範囲内で。

分かりにくいかなと思っていましたが、やっぱり分かりにくかった「Favorite Window」(なら、どうにかしろよと思わないでもない)。最前面の Finder window の設定(Finder の「表示オプションを表示」メニューで変更できるいくつかの設定)を覚えておくためのものです。初回起動時に設定を覚えます。Finder ではいつも 1 つだけウィンドウを表示させて使っているのですが、閉じて、再度ウィンドウを表示させたときに以前の設定が再現されないことにストレスが溜まり作ったものです。その昔あった Apple で配布されていた Finder Toolbar Scripts に含まれていた Snapshot というスクリプトに啓発されたものです(といって、このスクリプトの存在を知っている人も少なくなったでしょうね)。

「Go to Package Folder」は、パッケージ形式のファイルの内容を新しい Finder window で表示するスクリプト。うちでは、rtfd などのパッケージ形式のファイルでも大丈夫だったのですが、開かなかったでしょうか(誰に聞いているのだ)?

「Grouping」は修正日を指定し、それに合致したファイルとフォルダを別のフォルダに移動してまとめるスクリプトです。デフォルトでは別のフォルダは今日の日付になりますが。これは、ユーザーが選択したフォルダに移動させることができます。

スクリプトを Script Editor で開くと最初に以下の属性が宣言されています。

property usesSelectSimilarItems : false
property groupingFromUserFolder : false
property groupingByModification : true

usesSelectSimilarItems を、true にすると Select Similar Items と同じような挙動を行います。groupingFromUserFolder を true にすると フォルダ選択ダイアログが表示され、ユーザーが選択したフォルダに項目を移動するようになります。groupingByModification を false にすると項目を作成日で検索するようになります。

usesSelectSimilarItems が true の場合は、選択項目が優先されます。修正日(作成日)は無視されます。

property usesSelectSimilarItems : true
property groupingFromUserFolder : true
property groupingByModification : true

このように変更すると、現在選択している項目と同じような項目をすべて選択し、それら全てをユーザーが選択したフォルダに移動させることができます。

property usesSelectSimilarItems : false
property groupingFromUserFolder : true
property groupingByModification : false

このように変更すると、作成日で項目を検索し、ユーザーが選択したフォルダに項目を移動させます。...うまく、伝わっているでしょうか? この説明...。とにかく、スクリプト先頭の上記の属性を変更すれば挙動を変えることができます。お試しくださいませ。

「Reduce File Size」は PDF ファイルに Quartz Filter を適用するスクリプトです。これもスクリプトを Script Editor で開いて先頭の

property usesUserFilter : false

を true に変えることで他の Quartz Filter を利用することができます。OS にはいくつか Quartz Filter がインストールされています。それらのなかに Reduce File Size.qfilter とこのスクリプトと同じ名前のものがあります。こちらの方がファイルサイズは抑えられるかもしれません。

後、このスクリプトはドロップレットです。Quartz Filter を適用したい PDF だけをこのスクリプトに放り込んでください。ちなみに、ファイルサイズが大きくなってしまうのはバグではありません。なぜか Quartz Filter では、こうなってしまうようです。

「Select Similar Items」は、macosxhints.com で以前に取り上げられていたものです。その着眼点はいいと思ったのですが、肝心のスクリプトはそりゃないだろう、と思ったので作り直したものです。が、おそらく多くの人は「Select Similar Items」の中身を見て「そりゃないだろう」と言うだろうと思います(何で、この目的のためにそんな面倒なことをしているのかと)。

Finder window をカラムで表示していると JPEG ファイルだけを選択するのが苦痛だったりします。名前順で並んでいて、点在しているので。

例えば、JPEG ファイルを 1 つだけ選択し、「Select Similar Items」を実行すると全ての JPEG ファイルを選択します。これで、ファイルをまとめて移動するのが楽になります。

拡張子を見て動作するので拡張子がない場合は...どうなるのでしょう?

「Update」は Finder 項目の強制的な更新を行うスクリプト。アプリケーションを作っているとアイコンが反映されなかったりすることがあるので、そういうときに使います。それ以外に使い道はあるのか、と今ふと思いました。どうなんでしょう?

Mac OS X 10.4 でも動くのですが、動けないようにしてしまったりしています。以下のスクリプトが中身なのですが、これはそのまま 10.4 で利用できます。

tell application "Finder" to update items of "対象となるフォルダ" with necessity

ASU はできるだけ目立たないように存在していますので、そのままそっとしておいてください。詳しくは Read Me を読んでください、としか言えないです。

なんで、わざと不便な設定で配布しているんだ、という突っ込みが聞こえそうです。まぁ、スクリプトを開いて中身をのぞいてみるときの楽しみというか、なんというか...。

では、お楽しみください。

Finder Toolbar Scripts

わかばマークのMacの備忘録さんの Finder Toolbar Scripts の記事を見て、脊髄反射的ににいくつか Finder Toolbar Script を作ってしまった。

Finder Toolbar Scripts

何が一番面倒だったかというと、Read Me ファイルを作ることだったりします。なんで、そんなところに時間をかけるんだよう。

で、そうこうしているうちにわかばマークのMacの備忘録さんは、さらにバージョンアップしたものを公開していたり...。

通常、ここで簡単にスクリプトの説明等をしておくのがいいのでしょうが、先にも書いたように Read Me に時間をかけてしまったため、もう気力がないです。

Read Me を読んでください。

Charan's Finder Toolbar Scripts

CUPS-PDF と AppleScript

CUPS-PDF という仮想(?)プリンタがあります。これが、便利だったりします。CUPS-PDF を使うと印刷時の出力が PDF になります。分かりにくいですが、Mac OS X のプリントダイアログにある「PDF として保存...」メニューのように印刷した書類が PDF で保存されるようになります。

詳しくは LinuxでPDFファイルを作成するには - @IT

これだけなら、プリントダイアログの「PDF として保存...」メニューでいいじゃないか、と思われるかもしれません。しかし、この作業を AppleScript で自動化しようと思ったとき、どうすればいいでしょうか?

UI Scripting ができるから不可能ではないのですが、面倒です。CUPS-PDF を使うとこの作業を少し楽にすることができます。

ともあれ、CUPS-PDF をインストールします。CUPS-PDF Package for Mac OS X から Version 2.4.6.1 をダウンロードし、リンク先に書かれている通りにインストールしてもらえば大丈夫です(Mac OS X 10.5 Leopard で試しています)。が、分かりにくい部分があるので解説を。

先のリンクから zip ファイルをダウンロードし、解凍するとインストーラパッケージが出現します。このパッケージをダブルクリックし、インストールを行います。

次に「システム環境設定」の「プリントとファックス」を表示します。プリンタ一覧の下に「+」ボタンがあります。これをクリックします。

「システム環境設定」の「プリンタとファックス」

プリンタ選択ダイアログが表示されます。ダイアログのツールバーにある「デフォルト」クリックします。CUPS-PDF が表示されているのでこれを選択します(表示されるまで少し待つかもしれません)。

「デフォルト」を指定し「CUPS-PDF」を選択する

ダイアログ下部の「ドライバ」メニューから「使用するドライバを選択...」をクリックします。

ドライバの選択

ドライバの一覧が表示されるのでその中から「Generic postscript color printer」を選択します。

Generic postscript color printer を指定

ダイアログの追加ボタンをクリックします。これで CUPS-PDF プリンタが追加されました。

「システム環境設定」の「プリンタとファックス」でデフォルトプリンタを指定

仕上げとして、「デフォルトのプリンタ」に CUPS-PDF を指定しておきます。ここまでできたら一度、何らかのアプリケーションで「プリント...」メニューを選び、プリントダイアログを表示させてみてください。

「プリンタ」に CUPS-PDF が選択されていることを確認して、そのまま「プリント」ボタンをクリックしてみてください。デスクトップに「cups-pdf」というフォルダが作られ、その中に PDF ファイルが出力されます。これだけでも楽になるのですが、ここまできたら、もう少しです。AppleScript で操作するためにもう少し設定を行います。

何らかのアプリケーションから再度「プリント...」メニューを実行し、プリントダイアログを表示します。このダイアログのポップアップメニューから「カラーマッチング」を選択し、「プリンタのカラー」を選択します。

プリントダイアログのカラーマッチングの設定

この設定を「プリセット」メニューにある「別名で保存...」で、名前をつけて保存します(ここでは「cups-pdf-color」として保存しました)。

プリントダイアログのプリセットの設定

これで完了。AppleScript を使って書類の PDF 保存が一気に楽になります。例えば、Safari で閲覧している Web ページを PDF で保存するには以下のようなスクリプト。

Script Editor で開く

tell application "Safari"
    print document 1
end tell

これだけ。これでデスクトップにある「cups-pdf」フォルダに Web ページが PDF で保存されます。

もし、上記のスクリプトがエラーになるようでしたら、プリントダイアログのプリセットで先ほど保存した「cups-pdf-color」というプリセットが指定されていないかもしれません。このプリセット(というか、「カラーマッチング」で「プリンタのカラー」を使用する)を指定していないとエラーになるようです。プリントダイアログからの印刷ではエラーにならないのだから不思議としか言いようがないのですが。

たいていの書類を編集するようなアプリケーションでは AppleScript からの print 命令を受け取れるので上記のスクリプトのアプリケーション名を変更するだけで編集中の書類を PDF で保存することが可能になります。

ちなみにこの記事の元ネタは The Joy of ScriptingBatch converting *.webloc files to PDF using Safari and cups-pdf at The Joy of Scripting です。こちらの方が分かりやすいし、他にも興味深いことが多々書かれています。

ところで、The Joy of Scripting と聞いて The Joy of Sex を思い浮かべるのは私だけでしょうか?

Safari の RSS アイコンをクリックしたら...

「Safari の RSS アイコンをクリックしたら、使っている RSS リーダーで登録をしてほしいよね」というお話。

Safari RSS アイコン

Safari の RSS アイコンっていうのは、アドレスバーの右側に出てくるやつです。

利用している RSS リーダーがローカル環境で動かすアプリケーションならそれほど面倒なことではないのかもしれない。Safari の環境設定のデフォルト RSS リーダーに指定すればいいのです。だけど使っているのが Web アプリケーションだったなら?

具体的にいうと livedoor Reader。RSS アイコンをクリックしたら livedoor Reader で RSS の購読を行いたい。Firefox なんかだとそういう設定ができた。Bookmarklet を使え、という話もあるけどそこはそれ。大人の事情により、触れることはいたしません。

Safari の RSS アイコンをクリックすることで livedoor Reader に登録することは簡単にできます。やり方は以前から知っていた(Safari の RSS アイコンをクリックしたら Bloglines に登録されて欲しいよね : blog.imladris.jp)。

では、試してみましょう。

まず、以下のようなスクリプトをバンドル形式のアプリケーションとして保存します。

Script Editor で開く

on open location thisURL
    display dialog thisURL
end open location

保存したらバンドルの中にある Info.plist に以下のように追加の記述を行います。

<key>CFBundleIdentifier</key>
<string>com.DeveloperName.ApplicationName</string>
<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLName</key>
        <string>RSS URL</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>feed</string>
        </array>
    </dict>
</array>

Info.plist を保存し、いったんログアウトし、再度ログインします。

Safari の環境設定でデフォルト RSS リーダーに Info.plist を書き換えたこの AppleScript アプリケーションを指定します(一覧に表示されると思います)。

Safari「デフォルト RSS リーダー」環境設定

これでアドレスバーの RSS アイコンをクリックすると、この AppleScript アプリケーションが起動し、渡された URL を表示します。

RSS アイコンクリックで表示されたダイアログ

ここまで確認できたら本来の目的の livedoor Reader に登録するのは簡単です。

Script Editor で開く

on open location thisURL
    if thisURL starts with "feed://" then
        set num to offset of ":" in thisURL
        set targetURL to "http" & (text num thru -1 of thisURL)
        -- display dialog targetURL
        continue open location "http://reader.livedoor.com/subscribe/" & targetURL
    end if
end open location

渡される URL は feed で始まっているのでこの部分を http に変更します。そして、livedoor Reader の URL にくっつけて open location で開くと、livedoor Reader の登録画面に移動します。

Scripting Bridge

Scripting Bridge 面白い。普通(?)の AppleScript に飽きた人はぜひ。以下、覚え書き(環境は Mac OS X Leopard。当然だけど...)。なんで Python なのかは秘密です。

Terminal.app を起動して、

$ python

と、打ち込む。インタープリタが起動するので、まず、以下の呪文を唱える。

>>> from ScriptingBridge import *

これで、Scripting Bridge に関するモジュールが取り込まれるので、次に操作したいアプリケーションオブジェクトを作成する。

>>> finder = SBApplication.applicationWithBundleIdentifier_("com.apple.finder")

Python: unknown type name "ICN#"... と、ずらずら出てくるけど、気にしない。Finder の home にあるフォルダを取得してみる。

>>> homeFolders = finder.home().folders()
>>> for thisFolder in homeFolders:
...     thisFolder.name()
... 
u'Applications'
u'backup'
u'Desktop'
u'Documents'
u'Downloads'
u'Library'
u'Movies'
u'Music'
u'Pictures'
u'Public'
u'Sites'

おほぅ(おほぅって...)。でました。って、ここまでくるのに結構時間がかかっていたり。ちょっと、違和感がある。name() なんて書かれてると、属性を取得しているように見えない。なぜか分からないし、調べてもいないのだけど、Python では属性の取得でも () が必要みたい。

フォルダでも作ってみる。まず、Foundation を取り込む。

>>> from Foundation import *

まず、フォルダの属性を辞書で作る。

prop = {'name' : 'testing'}

この属性からオブジェクトを作る。

>>> folder = finder.classForScriptingClass_("folder").alloc().initWithProperties_(prop)

これは、Objective-C ですね。init で作っているけど、メモリとかどうなるのか知らない。ガベージコレクションがあるからいいか。そして、作る。

>>> finder.desktop().folders().addObject_(folder)

ここではデスクトップに作ってみました。Finder には make 命令があるのに、なぜ make 命令を使わないか?

実は、Scripting Bridge では操作するアプリケーションのオブジェクトを作れないのです。folder を作ったではないか、と思うかもしれませんが、Finder のオブジェクトではないのです。

>>> type(folder)
<objective-c class SBProxyByClass at 0x19e15e0>

SBProxyByClass というものなんですね(SB という接頭辞は Scripting Bridge のこと)。で、結局、Finder のデスクトップにあるフォルダのリスト(配列。SBElementArray)を、まず、取得するのです。そして、このリストに追加するのです。すると、Finder でフォルダが作成されるのです。なぜか。

Objective-C マジックですな。

しかし、insertObject:atIndex: が使えないんですね。iTunes のサンプルでは使えるようですが。だから、ここでは addObject:。

先の name() ではないですが、Objective-C のメソッドを使うのに Python では、アンダースコアを使う必要があるみたい。

insertObject_atIndex_(folder, 0)
addObject_(folder)

といった感じ。コロンをアンダースコアに置き換えるのかな(ちゃんとドキュメント読みなさいって)?

Finder で一番使うものって selection でしょう(勝手に決めつけていますが)。この selection は悩みました。だって、リストが返ってくると思うじゃないですか。

>>> curSelection = finder.selection()
>>> type(curSelection)
<objective-c class SBObject at 0x19e1560>

なんで、SBObject なの?

selection を取得して繰り返しで処理...みたいなことをどうやって書くのか悩んだね。全く。結局、以下のようにすればいいのでした。

>>> for thisItem in curSelection.get():
...     print thisItem.name(),
... 
music top testing

SBObject の get メソッドを使ってオブジェクトの参照を取得するとタプルで選択項目が返ってくるので、これを使って処理をすればいいということみたい。

繰り返して処理するためには set 命令が使えないといけない。が、set 命令はそもそも使えない。どうやるのかといえば、以下のようにする。

>>> curSelection = finder.selection()
>>> for thisFolder in curSelection.get():
...     thisFolder.setLocked_(1)
... 
>>>

オブジェクトが持っている属性(locked)に set をくっつけて続く属性の先頭文字を大文字にする。setLocked_(value) となる。name 属性なら setName(value)、label index 属性なら setLabelIndex(value) となる。value はそれぞれ、真偽値や整数値などの属性が受け取る事ができる値になります。

とりあえず、オブジェクトの作成と属性の取得、変更ができました。最低限はいちおう分かったのですが、ScriptingBridge で使えることができるアプリケーションの命令やオブジェクトなどはどうやって調べるといいのか?

Script Editor で表示される用語辞書だと楽でいいのですが、利用できるものに違いがあるのでそうもいきません。スクリプタブルアプリケーションがもっている用語辞書を Objective-C のヘッダファイルに変換することで Scripting Bridge で利用できるオブジェクトや属性を調べる事ができます。

Terminal.app を起動し(先ほどの Python インタープリタのままなら Control - D でインタープリタを終了させます)。おもむろに、以下のようにタイプ。

$ sdef /System/Library/CoreServices/Finder.app | sdp -fh --basename Finder --bundleid com.apple.Finder

これでカレントディレクトリに Finder の Objective-C ヘッダファイルが作成されます。このファイルを開くとクラスやメソッドが確認できます(他のスクリプタブルアプリケーションの場合は...って上記を見ればだいたい分かる...かな?)。

以上、Python での Scripting Bridge でした。コードをいろいろ見てみましたが、Objective-C でも Ruby でもそんなに大差はないような感じですね。しかし、上記のような Python のサンプルの少ないこと、少ないこと。PyObjCappscript はたくさんあるのに...。

参考

思い出

高木重朗の「マジック入門」は思い出深い書籍である。

この書籍を読んでいなければ、手品に興味を抱くこともなかったと思う。

しかし、小学生にとってこの書籍はあまりにも難しすぎた。だって、1980 年頃だべ。地方都市だべ。近くにそれを実演して見せてくれる人もいないのだべ。

クラシック・パームなんて本当にできるのか?本当に手品の種がこんなものなのか?これが、本当の手品の秘密なのか?といった疑問に答えてくれる人など周辺には皆無だった。

案の定、長い間クラシック・パームのやり方を間違えていた...。

今ならこれら全ての疑問に答えることはできるし、この書籍の価値も分かる。だからこそ思うのだけど、子供には高度だよな、と。

だけど、この書籍で覚えて今でもよく行う手品がある。輪ゴムを使ったものとキー・カードを使ったそれである。

子供の頃にいろんな人に行った。こちらがびっくりするほどに見せた相手は驚愕する。「なんでこんな当たり前のことがふしぎなんだろう?」。「なにが不思議なんだろう?」と、子供心に奇妙に思ったことを良く覚えている。

手品の種ってそんなものなんだけど。

(明かしたくなる誘惑はあったけど)種は明かさなかった。

この書籍、本当に内容が高度で難しかった。本当にこんなことできるのか?とたびたび考えては飽かず読んでいた。しかし、子供のことである。興味は次第に他のことに移り、読む頻度も少なくなり、いつか、捨ててしまった。

今、思えば「すげー、もったいない」ことをしたものである。本当の価値が分からなかったのである。今、読みたいと思っても既に絶版になっている(わりと手に入りやすい古書の部類だけど)。

私にとって思い入れの深い書籍なのである。いまなら、インターネットが身近なものになり、手品の専門的な書籍だって簡単に手に入れる事ができるし、実演だって YouTube などで簡単に見る事ができる。

素朴にうらやましいと思う。

この書籍と出会った小学生のあの頃、どれだけこれらの情報に渇望していたことか。隔世の感がある...。

現在の情報過多に批判的な向きもあるけど、情報が無いよりはいいのである。情報をどう利用するかは使う人の問題であって、情報それ自体に良いも悪いもない。

とはいうものの、現在の自分がこの情報過多の中にあって子供の時より手品に情熱を燃やしていたり、満足したりしているのかといえば、そうでもなかったりするのが「言ってることとやってることが無茶苦茶じゃん」というところなのだけど。この辺りが人間という生き物の面白いところでもある。

人間を「矛盾を内包しているもの」と表現したのは誰だっかか?

...と、とりとめもないことを書いたけど、たまにはこういうのもいいかな?