新型コロナウイルス接触確認アプリ(新型コロナウイルス接触確認アプリ(COCOA) 厚生労働省新型コロナウイルス感染症対策推進本部
SIMBLでCocoaアプリをパワーアップ
-
Upload
wataru-kimura -
Category
Technology
-
view
658 -
download
5
description
Transcript of SIMBLでCocoaアプリをパワーアップ
SIMBLでCocoaアプリをパワーアップ
2008-4-12 Cocoa勉強会#28木村渡
1
●問題
やりたい事の90%までしかできないアプリケーションがある。
●解決策
新しいアプリケーションを開発する。
●もう少し良い解決策
アプリケーションにパッチを当ててみる。
「ダイナミックObjective-C(42) SIMBLでハックを管理」よりhttp://journal.mycom.co.jp/column/objc/042/index.html
作者Mike Solomonによる
2
いろいろなSIMBLプラグイン
3
Safariをスゲー便利に
SafariStand
http://hetima.com/safari/stand.html
サイドバー検索の強化
でも日付別ダウンロードしか使ってないぜ
4
TerminalClours
Terminal.appの色をカスタマイズ可能に
http://ciaranwal.sh/2007/11/01/customising-colours-in-leopard-terminal
5
InputSwitcher
Leopardで入力モードをアプリケーションごとに保存
全Cocoaアプリ+α
http://limechat.net/inputswitcher/index_ja.html
全アプリ対象ってのはめずらしい
6
SandTrip
WebKitを利用しているブラウザでローカルCGIを実行可能に
http://kirika.la.coocan.jp/proj/sandtrip/index.html
木村さくユーザいない
7
• SafariGestures• GreaseKit• AcidSearch• SafariSource
なんだかブラウザまわりが多い
まだまだいろいろ
8
あらためて、SIMBLについて
9
●問題
やりたい事の90%までしかできないアプリケーションがある。
●解決策
新しいアプリケーションを開発する。
●もう少し良い解決策
アプリケーションにパッチを当ててみる。
「ダイナミックObjective-C(42) SIMBLでハックを管理」よりhttp://journal.mycom.co.jp/column/objc/042/index.html
ターミナルの色を変えるためにターミナルエミュレータを作るとかやってらんない
10
• 名前:SIMBL• 作者:Mike Solomon• http://culater.net/software/SIMBL/SIMBL.php• ライセンス:利用・再配布は自由。改変したものの再配布はやめてほしいとのこと。
• バージョン:0.8.2 (2008/04/11現在)• 配布形式:ユニバーサルバイナリパッケージ、またはソースコード
SIMBLの概要
0.1リリースは2003/02けっこう古い
11
1. インストール
2. プラグイン(.bundle)をインストール
• ~/Library/Application Support/SIMBL/Plugins/
3. 対象のアプリケーションを起動するとプラグインが有効に
使い方
12
SIMBLの動作
• プラグインと呼ばれるモジュールを、指定のアプリケーションにロード
• 実質なんでもできる• アプリ内のオブジェクト操作• クラスの追加• メソッドの追加・置き換え
13
SIMBLプラグインは自作InputManagerより良い
• ただのCocoaバンドルなで、InputManagerをつくるよりちょっとだけ簡単
• 利用する指定のアプリを指定できる。InputManagerはすべてのCocoaアプリがロード。 ↓自作の場合もローダ+プラグイン本体、という二段構成になりがち ↓ならSIMBLでいいじゃん
14
SIMBLプラグインのつくりかた
15
1. Cocoa Bundleのプロジェクトを作成
2. Info.plistにSIMBLとして動作させる設定を
3. プラグインを実装
手順
16
例:Cocoa Browser SNに機能追加
17
Cocoaのドキュメントビューア
Cocoa Browser SN
http://numata.designed.jp/ja/programming/cocoabrowser.html
ほしたかのりさん→関西の沼田さん
18
追加する機能
• 表示しているドキュメントをブラウザで開く
19
追加機能の実装方針
• 「ファイル」メニューに追加• ショートカットキーを使えるように• ドキュメントを表示しているときのみ動作
20
アプリ解析の武器
• class-dump(今回は使わない)• Interface Builder
21
Interface Builderで調べる
• Nibは4つ。関係ありそうなのは、• MainMenu.nib• MyDocument.nib• ドキュメントベースアプリのようだ• アクションのFirstResponderはMyDocumentクラスのインスタンス
22
新規プロジェクトを作成
• Cocoa Bundleを選択
23
Info.plistを編集
• プラグインのクラスを指定• 対象のアプリを指定• SIMBLTagetApplications
対象のCFBundleIndentifier
対象のCFBundleVersionのintValue
24
実装:メニューアイテムの追加
// CBPlugin.m-(void) installNewMenuItem{ NSMenuItem * newMenuItem; NSString * title; NSMenu * fileMenu;
// 新しいメニューアイテムをつくる title = [self localizedText:@"Show in Browser"]; newMenuItem = [[NSMenuItem alloc] initWithTitle:title action:@selector(showInBrowser:) keyEquivalent:@"O"]; [newMenuItem setTarget:nil]; // first responder
// メニューアイテムを「ファイル」メニューに追加 fileMenu = [[[NSApp mainMenu] itemAtIndex:1] submenu]; [fileMenu insertItem:newMenuItem atIndex:3];
25
実装:メニューアイテムの追加
• NSPrincepalClassのクラスメソッド+installがプラグイン読み込み時に呼ばれる
// CBPlugin.m+(void) install{ CBPlugin * plugin;
plugin = [[CBPlugin alloc] init]; [plugin installNewMenuItem];
26
実装:メニューアクション
• MyDocumentにカテゴリでメソッド追加• MyDocumentはアプリ側で実装されているので、クラス宣言のみ書いておけば使える
// MyDocument+plugInAction.h@interface MyDocument : NSDocument {}@end
@interface MyDocument (CBPluginAction)
-(IBAction) showInBrowser:(id)sender;
@end
class-dump便利
27
実装:メニュー制御
• validateMenuItem:を使う• もともとMyDocumentで定義されているので小細工が必要(単純にオーバーライドするともともとの動作が失われてしまう)
サブクラス+ポージングで呼び出せたけど今はポージング非推奨
28
実装:メニュー制御
• 別名をつけて、メソッドを置き換え• もともとの実装は別名で呼び出せる
MyDocument
-validateMenuItem:
(category)
-cbp_validateMenuItem:
MyDocument
-cbp_orig_validateMenuItem:
(category)
-validateMenuItem:
29
実装:メソッドを別名でコピー
// CBPlugin.mstatic BOOL alias_instance_method( Class cls, SEL src_sel, SEL dest_sel){ Method src_meth; IMP imp; const char * types; BOOL ret;
src_meth = class_getInstanceMethod(cls, src_sel); imp = method_getImplementation(src_meth); types = method_getTypeEncoding(src_meth); ret = class_addMethod(cls, dest_sel, imp, types); // force override if (!ret) { Method dest_meth; dest_meth = class_getInstanceMethod(cls, dest_sel); method_setImplementation(dest_meth, imp); ret = YES; }
10.5でこのへんのAPIがけっこー変わった
30
実装:メソッドを別名でコピー
• これもプラグイン読み込み時に実行// CBPlugin.m+(void) install{ CBPlugin * plugin;
plugin = [[CBPlugin alloc] init]; [plugin installNewMenuItem]; [plugin aliasMethods]; // ここ
31
実装したこと
• プラグイン読み込み時にメニューを追加• ドキュメントクラスにアクションを追加• プラグイン読み込み時にメソッドを別名コピー&オーバーライド
32
できました
33
• SIMBLプラグインをつくるとCocoaアプリを拡張できる
• Objective-C/Cocoaの動的に変更しやすい(すぎる)デザインがこーいうことを可能に
• プラグインを作るには対象アプリの内部を理解(推測)する必要がある
しめ
34
SIMBLでCocoaアプリをパワーアップ終
35
ふろく
36
• 10.5(と10.4.11)で特定のアクセス権などを満たすInput ManagerでなければCocoaアプリにロードされないように
• 現在リリースされているSIMBL 0.8.2では対応済み
• Input Managerを使わないプラグイン管理ソフトの開発が活発に
LeopardでのInput Managerの変更
http://d.hatena.ne.jp/hetima/20071027/1193452016
37
PlugSuit - 他のプラグイン管理ソフト
mach_injectを利用したプラグインのロード
システム環境設定でプラグインを管理できる
http://infinite-labs.net/PlugSuit/
38
PimpKit - 他のプラグイン管理ソフト
WebPlugInを利用したプラグインのロード
WebKitを利用しているアプリでのみ有効
http://www.cocoamug.com/pimpkit/
39