Home>History>

2009.09

2009-09-30

2009-09-30T22:09:05+09:00

アプリケーションがどうやって起動されたか調べる。

普通に起動したとき(Finder のダブルクリックとかなんらランチャーから起動するとか)は、Finder の選択項目を取得して、なおかつサービスメニューやドラッグ&ドロップで渡されたファイルも似たような処理をする、というアプリケーションをいっぱい作っている。QuickFileType とか FileClipper とか QuickDMG とか。

ドラッグ&ドロップされたときだけ呼び出されるメソッドや、サービスメニューが実行されたときだけ呼ばれるメソッドはある。でも、普通に起動した時だけよばれるメソッドは無いぜ〜とずっと思っていた。でもあった。NSApplication の applicationOpenUntitledFile: だ。長い間気付かずに、まぬけな自分を恥ずかしく思う今日この頃です。

ちなみに、いままでどうしていたかというと、applicationDidFinishLaunching: の中から、performSelector:withObject:afterDelay: をつかって、ちょとだけ delay をかけて普通に起動してときの処理を記述したメソッドを呼んでいた。そして、delay の間にサービスメニューもしくは application:openFiles: が呼ばれることを期待して、それらが呼ばれたら何もしないという仕組みにしていた。みっともない仕組みだぜ。

さらにちなみに、アプリケーションがどうやって起動したか(ザービスメニュー経由とか、ログイン項目と起動されたとか、アプリケーションアイコンへのドラッグ&ドロップか、など)は NSApplication の デリゲートメソッド applicationDidFinishLaunching: の中で AppleEvent を精査することでわかる。こんな感じ。

NSAppleEventDescriptor *ev = [ [NSAppleEventManager sharedAppleEventManager] currentAppleEvent];
AEEventID evid = [ev eventID];
BOOL should_process = NO;
switch (evid) {
	case kAEOpenDocuments:
		NSLog(@"Launched with Drag and Drop");
		break;
	case kAEOpenApplication:
		NSAppleEventDescriptor* propData = [ev paramDescriptorForKeyword: keyAEPropData];
		DescType type = propData ? [propData descriptorType] : typeNull;
		OSType value = 0;
		if(type == typeType) {
			value = [propData typeCodeValue];
			switch (value) {
				case keyAELaunchedAsLogInItem:
					NSLog(@"Launched as a login item");
					break;
				case keyAELaunchedAsServiceItem:
					NSLog(@"Launched through service menus");
					break;
			}
		} else {
			NSLog(@"Launched normally");
		}
		break;
}

2009-09-29

2009-09-29T10:09:16+09:00

MergePDF 2.0.2

フォルダに含まれている PDF/画像 ファイル(PDF だけでなく一般的な画像ファイルも)を一つの PDF ファイルに束ねるためのアプリケーションです。

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

  • 選択されている場所がアイコン表示で「並び順序」が「グリッドに沿う」「なし」以外が選択されているとエラーが発生する不具合を修正。

2009-09-26

2009-09-26T03:02:08+09:00

QuickFileType 3.2

QuickFileType はファイルのクリエータコードとタイプコードを表示/編集するアプリケーションです。ファイルのアプリケーションへの関連付けを変更するのに用います。

ファイルのクリエータコードで指定されたアプリケーションで、そのファイルを開くサービスメニュー「クリエータで開く」を追加しました。Snow Leopard でクリエータコードが無視される件に、ささやかに抵抗してみました。

QuickFileType をいろいろ機能強化するアイデアがあったんだけど、萎えちゃったな。

2009-09-25

2009-09-25T14:07:28+09:00

Snow Leopard でクリエータコードが無視される件(その4)

Snow Leopard のクリエータコードが無視される件の回避策として一つ思いついたことがあります。

アプリケーション側でカスタムなタイプコードを導入し、そのタイプコードに対する UTI をアプリケーション側で定義したらクリエータコード問題を回避できないだろうか?

ただ、ファイルに拡張子がある場合 UTI の決定に拡張子が優先されちゃって、ファイルの UTI を自由にコントロールできるということにはならないかもしれません。

2009-09-25T12:41:17+09:00

FileClipper 3.0.2

クリップボードに参照があるファイルをコピー、移動、エイリアスファイル/シンボリックリンク/ハードリンクの作成を行うアプリケーションです。Finder がクリップボードに入れるファイル参照を読み取りますので、コピー&ペーストの要領の自然な操作で扱えます。

  • 「ここにハードリンク」のサービスメニュー名を修正。

2009-09-24

2009-09-24T14:38:03+09:00

StationeryPalette 3.1.1

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

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

  • Stationery フォルダからファイルを削除して、StationeryPalette のアップデートを行うと異常終了することがある不具合を修正。

どなたかカスタムアイコンを作っていただけませんでしょうか。なにとぞよろしくお願いします。

2009-09-23

2009-09-23T18:33:28+09:00

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

本当に、感謝いたします。お気軽にご意見/ご感想をお聞かせいただければ幸いです。

52 人目。

2009-09-18

2009-09-18T09:42:47+09:00

FileClipper 3.0.1

クリップボードに参照があるファイルをコピー、移動、エイリアスファイル/シンボリックリンク/ハードリンクの作成を行うアプリケーションです。Finder がクリップボードに入れるファイル参照を読み取りますので、コピー&ペーストの要領の自然な操作で扱えます。

  • 「ここにハードリンク」のアイコンを追加しました(ko-g さん、ありがとうございました)。

2009-09-16

2009-09-16T14:06:08+09:00

FileClipper 3.0

クリップボードに参照があるファイルをコピー、移動、エイリアスファイル/シンボリックリンク/ハードリンクの作成を行うアプリケーションです。Finder がクリップボードに入れるファイル参照を読み取りますので、コピー&ペーストの要領の自然な操作で扱えます。

  • マルチスレッド化。複数の処理を同時進行できるようにした。
  • サービスメニューに対応。
  • 処理をキャンセルできるようにした。
  • 「ここにコピー」「ここに移動」で、Subversion のサポート。
  • 「ここにハードリンク」を追加。
  • プログレスインジケータの下に、処理している項目名と場所を表示するようにした。
  • エラーウインドウの追加。

という具合に猛烈に手を加えました。

そのうち、Authorization API にも対応したい。

2009-09-15

2009-09-15T15:10:14+09:00

Snow Leopard でクリエータコードが無視される件(その3)

Snow Leopard のクリエータコードを無視する件に抵抗する為に、QuickTypeType にクリエータコードに従ってファイルを開くサービスメニューでもつけてやろうかと思った。

でも、クリエータコードが亡き者にされてしまうと、クリエータコードを持つアプリケーションはなくなっていってしまうだろうから意味ないのかと思う。

いつかはクリエータコードはなくなると思っていたけど、それは bundle identiifer でリプレースされるものと思っていた。まさか、代わりのものを用意せずに消し去るとは思いもしなかった。でも、いろいろ web を眺めていると、分かってない人が少なくないですね。UTI を使えとか、クリエータコードはリソースフォークに書き込まれるとか。きっと、Finder で「このアプリケーションで開く :」を設定すると、何が起こっているか知っている人は少ないのかもしれない。クリエータコードが理解されていない状況を知ると、クリエータコードの無視という暴挙も正しい判断に思えてくる。

いっそ、拡張属性に bundle identifer を記録して、それに従ってファイルを開くアプリケーションでも作ろうか?まあ、妄想ですが。

2009-09-14

2009-09-14T22:08:45+09:00

Snow Leopard でクリエータコードが無視される件(その2)

やっぱり、Snow Leopard にアップデートする暇などないのだけど、気になってしょうがない。

ふと思ったのは、もしかしてクリエータコードを完全に排除したのではなく、システムが提供している UTI ではデフォルトでクリエータコードを無視するような設定がされているだけではないだろうか?

もしそうなら、QuickFileType を使えばクリエータコードを再度有効にできるんじゃないだろうか?QuickFileType はクリエータを無視するように設定されている UTI の設定をクリエータコードを尊重するように変更することができます。

たとえば、QuickFileType でプレビューのクリエータコード 'prvw' を持つファイルを GraphicConverter のクリエータコード 'GKON' とかに変更したら、UTI の設定を変更できると思うのだけど。

誰か試していただけないでしょうか?

追記 :

上村さんがテストしていただけました。当てが外れて、UTI の設定の問題ではなく、Launch Services は本当にクリエータコードを無視するように変更が加えられているようです。

2009-09-09

2009-09-09T19:57:45+09:00

InsertionLocator 1.2.5

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

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

2009-09-09T02:49:09+09:00

Snow Leopard では、クリエータコードが無視されるらしい。

まだ Snow Leopard にアップデートするつもりは無いのだけど、あまりに衝撃的であったので。

クリエータコードの代わりの仕組みでも用意されたとだろうか?例えば、usro リソースにアプリケーションパスではなく bundle identifier を書き込むようになったとか。そして、アプリケーションから usro リソースをファイルに追加する API が公開されたとか。そういう仕組みが用意されているなら許す。でも、そんな情報は見つけられなかった。

代わりの仕組みを用意せず、いきなり無しよっていうのは影響が大きすぎるし、昔ながらの美点を無くしてしまうのは理解できない。バグであって、すぐに修正されてほしい。

やっぱり、当分は Snow Leopard は様子見です。

2009-09-07

2009-09-07T20:55:54+09:00

FileClipper と 64 bit

FileClipper を 64bit でコンパイルしようとした。でも・・・できないみたい。

64 bit では、Carbon Event の GetApplicationEventTarget() がサポートされていないみたい。これを使って、前面のアプリケーションの切替を検出している。

Snow Leopard では、NSWorkspace に新しい Notification が追加されているようなので、これを使えば、64 bit にできそうだ。でも、そうすると、Snow Leopard Only のアプリケーションになっちゃう。しばらくは、32 bit のままで行くことになりそう。

追記 :

とおりすがりさんに教えていただいたのですが、GetApplicationEventTarget() が 64 bit でサポートされていないというのは、Xcode 3.1.2 の SDK に付属のヘッダーファイルに間違いの用です。だから、コンパイル時の warnning さえ気にしなければ、Leopard、Snow Leopard の両方で動く 64bit FileClipper はビルドできるということです。

2009-09-06

2009-09-06T23:36:24+09:00

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

忌憚のないご意見を頂ければ幸いです。

これで、51人目。

2009-09-04

2009-09-04T19:10:43+09:00

FileClipper を鋭意開発中

FileClipper は、クリップボードに参照があるファイルをコピー、移動、エイリアスファイル/シンボリックリンクの作成を行うアプリケーションです。Finder がクリップボードに入れるファイル参照を読み取りますので、コピー&ペーストの要領の自然な操作で扱えます。

現在の、アップデートのプランは次のとおり。

  • マルチスレッド化。
    • つまり複数の処理を同時に行えるようになる。大きなファイルをコピーしてるときに、ご利益があると思う。
  • サービスメニューのサポート
    • Snow Leopard で(自分は使ってないけど)コンテキストメニューから実行できるようになるでしょう。
  • 「ここにコピー」「ここに移動」で、Subversion のサポート。
    • もしコピー/移動するファイルが Subversion のワーキングコピーだったら、普通にコピー/移動するのではなくて、svn cp/mv を使ってコピー/移動するようになる。
  • 「ここにハードリンク」を追加。

誰か励ましてください。

2009-09-04T09:10:41+09:00

PowerRenamer 3.1.2

たくさんのファイルの名前を一度に変更するアプリケーションです。あるパターンにマッチしたファイル名の一部を、別の文字列に置き換える事ができます。正規表現を使った検索置換も行えます。またファイルが Finder で並んでいる順番で、番号付けを行えます。

  • 「絞り込み」を行ってマッチするアイテムが無い場合に、Finder の選択項目を変更しないようにした(fix さん、ありがとうございました。)。

2009-09-04T00:50:29+09:00

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

頑張って、作った PowerRenamer が評価されたことを光栄に思います。

50 人目。まあ、ほとんど評価されていないに等しい数だけど、たまに寄付していただける方がいると、モチベーションが復活します。