3 月 05
クリップボード履歴の削除機能は、ClipMenuの次のリリースで実装します。
どうも、各所でご不便をおかけしているようで、申し訳ないです。現在のところ、不便な点の第一位みたいです。
iusethisというサイトで紹介していただいたんですが、こちらのコメントでも指摘されていました
ただ、こちらの説明で、やっと問題の重要性を理解できました。パスワードみたいな、人に見られたくない情報を簡単に消せないと、確かにまずいですね。
次期バージョンでは、履歴をリセットする方法と、選択した履歴を個別に削除する、二種類の方法を用意します。
3 月 01
札幌拘置所で、171日間拘束された島村英紀氏が著した本。『私はなぜ逮捕され、そこで何を見たか。』

ほとんどの人には無縁の拘置所暮らしを、詳細に描いています。
著者は独居房に入れられていたそうですが、直接は見えなくても、隣人の様子を伺い知ることができたとか。そのうちの一人が、「ため息ゴリラ」さん。巨漢の彼は、壁を叩いたり、意味の分からない大声を出したりと、普段から騒々しい人だったそうです。そうかと思えば、一転してため息ばかりついたりも。
そんな描写を淡々と読み進めていたら、ゴリラ氏の叫んだ台詞に、思わず吹いた。
たまに意味のある言葉を大声で叫ぶので、ぎょっとする。
「マッキントッシュ!」と数度。何だろう?
マッキントッシュ?!何ですか、それは?
マッキントッシュといってもいろいろありますが、普通はMacの事ですよね。一体、ゴリラ氏とマッキントッシュの間に何が合ったのか、気になります。
3 月 01
JavaScriptでXMLHttpRequestを使うと、外部ファイルを読み込めますが、ClipMenuから実行する文字列処理には必要ありません。そこで、WebKitが外部リソースにアクセスできないような変更を加えてみました。
まず、webViewをインスタンス化した後に、delegateを設定。
[webView setPolicyDelegate:self];
WebPolicyDelegateプロトコルのメソッドを実装します。
- (void)webView:(WebView *)sender decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id)listener
{
[listener ignore];
}
これで、ClipMenuで実行したJavaScriptでXMLHttpRequestを使ったhttpアクセスを行うと、”Permission denied”と、エラーになるようにできました。
2 月 28
Hiroさんにコメントで教えていただいたおかげで、WordPressのフィードがうまく機能していないのを直すことができました。
せっかくなので、久しぶりにWordPressを弄ったついでに、テーマもカッコイイものに変えてみました。選んだthemeは、N.Design Studioさん制作の、GlossyBlue。プロのデザインしたテーマは、さすがに完成度が違いますね。
さらに、ソースコードに色を付けるために、google-code-prettifyと、WordPress用のプラグイン、Google Code Prettify for wordpresも導入してみました。
それから、Google Adsenseはブログからを撤去してみることに。なんだか、いかがわしい広告が表示されるのが、前から気になっていたので。代わりに、Amazonおまかせリンクを置いてみました。
読み込むファイル数がちょっと増えちゃいましたが、動作が重くなるようなら、追々対処していくことにします。
2 月 23
次のような動作を、ClipMenuで実現しようと思いました。
- ブラウザでURL (例: http://www.apple.com/)をクリップボードにコピー。
- エディタを起動。
- ClipMenuを呼び出して、さっきコピーしたURLを履歴から選び、JavaScriptで記述したアクションを実行。
- JavaScript内に書かれた、prompt()メソッドで表示されたダイアローグボックスに、タイトル (例: アップル)を入力。
- エディタに、JavaScriptで処理した結果 (例: <a href=”http://www.apple.com/” title=”アップル”>アップル</a>)をペースト。
JavaScript内に、prompt()などの、ウィンドウを表示させるメソッドを使わなければ、特に問題はありませんでした。ただ、クリップボードの文字列と、ユーザー入力の文字列を組み合わせた文字列処理を行いたかったので、いくつかの問題を解決する必要がありました。
最前面に、エディタのウィンドウが表示されている状態で、バックグラウンド専用(LSUIElement = 1)で動いているClipMenuからウィンドウを開くと、最前面にあったエディタのウィンドウの下に表示されてしまいます。
これを避けるために、Cocoaでは以下のメソッドを実行すれば、自分のウィンドウを最前面にすることができました。
[NSApp activateIgnoringOtherApps:YES];
ただ、この後にClipMenuが表示したウィンドウを閉じると、はじめに最前面にあったエディタのウィンドウが一番手前になりますが、フォーカスはあたっていません。そのため、このウィンドウにペーストすることができない状態になってしまいます。
ClipMenuが最前面になる前に、
- 最前面のウィンドウのIDを記憶
- ClipMenuを最前面に切り替え
- ClipMenuのウィンドウを閉じる
- さっき記憶したIDのウィンドウを最前面に切り替え
を行えば良さそうだと考えましたが、方法が分かりません。唯一思い浮かんだのは、AppleScriptを使ったものです。ただ、「AppleScriptで解決するのは最後の手段」と、メーリングリストで言っていた人もいたので、やはり他の方法を探すことに。
Xcodeのドキュメントで見当たらなかったため、例によって、Cocoabuilderで検索。見つかった方法は、Carbonの関数を利用するものでした。
» Cocoabuilder - (Edison Thomaz) Bring app to foreground in 10.5
ClipMenuを表示する直前に、GetFrontProcess()関数で記憶したProcessSerialNumberを、ClipMenuを閉じる際に、SetFrontProcess()関数で最前面に設定することで、望み通りの動作をさせることができました。
結構、Carbon APIを使わないと実現できない処理がありますね。
2 月 20
JavaScriptを使って、クリップボード履歴にある文字列を加工するテストがうまくいったので、環境設定パネルに、使用するマクロを選択できるインターフェイスを作成することにしました。
まず考えた方法が、チェックボックスの付いたリスト表示。Gmailなどでも使われていますね。チェックボックスを個別にチェックしたり、「すべてを選択」や「選択を解除」で、まとめてオン/オフすることもできます。
ただ、チェックボックスを連続してチェックしていくような単純作業は、数が多くなると苦痛なものです。見た目も、ちょっと野暮ったいですね。
次に考えたのが、TableView。NSTableViewは使ったこともあるし、二つのTableView間でドラッグ&ドロップすれば、チェックボックスも不要になります。
難点は、階層表示ができないこと。表示するマクロの数が少なければ問題ありませんが、そうでない場合に、一階層で多くのファイルを表示するのは見づらく感じます。
最終的には、OutlineViewを採用することになりました。これなら、階層表示ができますし、それをそのままメニュー内のフォルダとして利用することもできるからです。
ただ、これが思いの外大変で、予定よりずいぶん時間がかかる作業になってしまいました。
『Cocoa Programming』と「Theocacao: NSTreeController and Drag and Drop」を参考に始めて見たものの、なかなか思うような結果になりません。だいたい、ダミーのコードを使ったハックが必要だったり、非公開クラスの_NSArrayControllerTreeNodeを使用しないと、目的を達成できないというのも、何か変な気がします。Leopardでは改善されたようですが、Tigerでは結局中途半端な実装のままですし。
何とか望みの結果を達成できたのは、CocoabuilderのMLアーカイブのおかげです。
あと助かったのが、こちらの書き込み。
Appleの公開している、OutlineViewを使ったサンプルコード、SourceView。必要環境が”Xcode 3.0, Mac OS X 10.5″なので中身を見てなかったんですが、こちらのブログのエントリーを拝見してダウンロードしてみたところ、一部はTigerにも流用できることが分かりました。
初めは、Nodeクラスをつくる参考にしようと、BaseNodeを写経していたんですが、数カ所直してみたらTigerでもビルド可能なことが判明。Objective-C 2.0で採用された、”in”とNSIntegerを、NSEnumeratorやintに書き換えれば動くようになりました。
OutlineViewのセルにアイコンを表示することも、Leopardで採用された機能を使った、セパレータの表示以外は、TigerでもOKでした。どうして、アイコン画像をBaseNodeクラスが保持しているのか分からなかったので、変更を加えたりしたところもありましたが、基本的にはこのサンプル通りでうまくいきました。
これだけ手間取ると分かっていれば、こちらを後回しにして、リクエストのあった機能を実現させた方が良かった気もしますが、OutlineViewは他にも使い道があるので、これで良かったことにしておきます。定型文の管理インターフェイスも、これを使えそうです。
有用な情報を公開してくださっている方達に感謝です。
Recent Comments