SIMBLでCocoaアプリをパワーアップ

39
SIMBLCocoaアプリを パワーアップ 2008-4-12 Cocoa勉強会#28 木村1

description

2008-4-12 Cocoa勉強会#28

Transcript of SIMBLでCocoaアプリをパワーアップ

Page 1: SIMBLでCocoaアプリをパワーアップ

SIMBLでCocoaアプリをパワーアップ

2008-4-12 Cocoa勉強会#28木村渡

1

Page 2: SIMBLでCocoaアプリをパワーアップ

●問題

やりたい事の90%までしかできないアプリケーションがある。

●解決策

新しいアプリケーションを開発する。

●もう少し良い解決策

アプリケーションにパッチを当ててみる。

「ダイナミックObjective-C(42) SIMBLでハックを管理」よりhttp://journal.mycom.co.jp/column/objc/042/index.html

作者Mike Solomonによる

2

Page 3: SIMBLでCocoaアプリをパワーアップ

いろいろなSIMBLプラグイン

3

Page 4: SIMBLでCocoaアプリをパワーアップ

Safariをスゲー便利に

SafariStand

http://hetima.com/safari/stand.html

サイドバー検索の強化

でも日付別ダウンロードしか使ってないぜ

4

Page 6: SIMBLでCocoaアプリをパワーアップ

InputSwitcher

Leopardで入力モードをアプリケーションごとに保存

全Cocoaアプリ+α

http://limechat.net/inputswitcher/index_ja.html

全アプリ対象ってのはめずらしい

6

Page 7: SIMBLでCocoaアプリをパワーアップ

SandTrip

WebKitを利用しているブラウザでローカルCGIを実行可能に

http://kirika.la.coocan.jp/proj/sandtrip/index.html

木村さくユーザいない

7

Page 8: SIMBLでCocoaアプリをパワーアップ

• SafariGestures• GreaseKit• AcidSearch• SafariSource

なんだかブラウザまわりが多い

まだまだいろいろ

8

Page 9: SIMBLでCocoaアプリをパワーアップ

あらためて、SIMBLについて

9

Page 10: SIMBLでCocoaアプリをパワーアップ

●問題

やりたい事の90%までしかできないアプリケーションがある。

●解決策

新しいアプリケーションを開発する。

●もう少し良い解決策

アプリケーションにパッチを当ててみる。

「ダイナミックObjective-C(42) SIMBLでハックを管理」よりhttp://journal.mycom.co.jp/column/objc/042/index.html

ターミナルの色を変えるためにターミナルエミュレータを作るとかやってらんない

10

Page 11: SIMBLでCocoaアプリをパワーアップ

• 名前:SIMBL• 作者:Mike Solomon• http://culater.net/software/SIMBL/SIMBL.php• ライセンス:利用・再配布は自由。改変したものの再配布はやめてほしいとのこと。

• バージョン:0.8.2 (2008/04/11現在)• 配布形式:ユニバーサルバイナリパッケージ、またはソースコード

SIMBLの概要

0.1リリースは2003/02けっこう古い

11

Page 12: SIMBLでCocoaアプリをパワーアップ

1. インストール

2. プラグイン(.bundle)をインストール

• ~/Library/Application Support/SIMBL/Plugins/

3. 対象のアプリケーションを起動するとプラグインが有効に

使い方

12

Page 13: SIMBLでCocoaアプリをパワーアップ

SIMBLの動作

• プラグインと呼ばれるモジュールを、指定のアプリケーションにロード

• 実質なんでもできる• アプリ内のオブジェクト操作• クラスの追加• メソッドの追加・置き換え

13

Page 14: SIMBLでCocoaアプリをパワーアップ

SIMBLプラグインは自作InputManagerより良い

• ただのCocoaバンドルなで、InputManagerをつくるよりちょっとだけ簡単

• 利用する指定のアプリを指定できる。InputManagerはすべてのCocoaアプリがロード。      ↓自作の場合もローダ+プラグイン本体、という二段構成になりがち      ↓ならSIMBLでいいじゃん

14

Page 15: SIMBLでCocoaアプリをパワーアップ

SIMBLプラグインのつくりかた

15

Page 16: SIMBLでCocoaアプリをパワーアップ

1. Cocoa Bundleのプロジェクトを作成

2. Info.plistにSIMBLとして動作させる設定を

3. プラグインを実装

手順

16

Page 17: SIMBLでCocoaアプリをパワーアップ

例:Cocoa Browser SNに機能追加

17

Page 18: SIMBLでCocoaアプリをパワーアップ

Cocoaのドキュメントビューア

Cocoa Browser SN

http://numata.designed.jp/ja/programming/cocoabrowser.html

ほしたかのりさん→関西の沼田さん

18

Page 19: SIMBLでCocoaアプリをパワーアップ

追加する機能

• 表示しているドキュメントをブラウザで開く

19

Page 20: SIMBLでCocoaアプリをパワーアップ

追加機能の実装方針

• 「ファイル」メニューに追加• ショートカットキーを使えるように• ドキュメントを表示しているときのみ動作

20

Page 21: SIMBLでCocoaアプリをパワーアップ

アプリ解析の武器

• class-dump(今回は使わない)• Interface Builder

21

Page 22: SIMBLでCocoaアプリをパワーアップ

Interface Builderで調べる

• Nibは4つ。関係ありそうなのは、• MainMenu.nib• MyDocument.nib• ドキュメントベースアプリのようだ• アクションのFirstResponderはMyDocumentクラスのインスタンス

22

Page 23: SIMBLでCocoaアプリをパワーアップ

新規プロジェクトを作成

• Cocoa Bundleを選択

23

Page 24: SIMBLでCocoaアプリをパワーアップ

Info.plistを編集

• プラグインのクラスを指定• 対象のアプリを指定• SIMBLTagetApplications

対象のCFBundleIndentifier

対象のCFBundleVersionのintValue

24

Page 25: SIMBLでCocoaアプリをパワーアップ

実装:メニューアイテムの追加

// 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

Page 26: SIMBLでCocoaアプリをパワーアップ

実装:メニューアイテムの追加

• NSPrincepalClassのクラスメソッド+installがプラグイン読み込み時に呼ばれる

// CBPlugin.m+(void) install{ CBPlugin * plugin;

plugin = [[CBPlugin alloc] init]; [plugin installNewMenuItem];

26

Page 27: SIMBLでCocoaアプリをパワーアップ

実装:メニューアクション

• MyDocumentにカテゴリでメソッド追加• MyDocumentはアプリ側で実装されているので、クラス宣言のみ書いておけば使える

// MyDocument+plugInAction.h@interface MyDocument : NSDocument {}@end

@interface MyDocument (CBPluginAction)

-(IBAction) showInBrowser:(id)sender;

@end

class-dump便利

27

Page 28: SIMBLでCocoaアプリをパワーアップ

実装:メニュー制御

• validateMenuItem:を使う• もともとMyDocumentで定義されているので小細工が必要(単純にオーバーライドするともともとの動作が失われてしまう)

サブクラス+ポージングで呼び出せたけど今はポージング非推奨

28

Page 29: SIMBLでCocoaアプリをパワーアップ

実装:メニュー制御

• 別名をつけて、メソッドを置き換え• もともとの実装は別名で呼び出せる

MyDocument

-validateMenuItem:

(category)

-cbp_validateMenuItem:

MyDocument

-cbp_orig_validateMenuItem:

(category)

-validateMenuItem:

29

Page 30: SIMBLでCocoaアプリをパワーアップ

実装:メソッドを別名でコピー

// 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

Page 31: SIMBLでCocoaアプリをパワーアップ

実装:メソッドを別名でコピー

• これもプラグイン読み込み時に実行// CBPlugin.m+(void) install{ CBPlugin * plugin;

plugin = [[CBPlugin alloc] init]; [plugin installNewMenuItem]; [plugin aliasMethods]; // ここ

31

Page 32: SIMBLでCocoaアプリをパワーアップ

実装したこと

• プラグイン読み込み時にメニューを追加• ドキュメントクラスにアクションを追加• プラグイン読み込み時にメソッドを別名コピー&オーバーライド

32

Page 33: SIMBLでCocoaアプリをパワーアップ

できました

33

Page 34: SIMBLでCocoaアプリをパワーアップ

• SIMBLプラグインをつくるとCocoaアプリを拡張できる

• Objective-C/Cocoaの動的に変更しやすい(すぎる)デザインがこーいうことを可能に

• プラグインを作るには対象アプリの内部を理解(推測)する必要がある

しめ

34

Page 35: SIMBLでCocoaアプリをパワーアップ

SIMBLでCocoaアプリをパワーアップ終

35

Page 36: SIMBLでCocoaアプリをパワーアップ

ふろく

36

Page 37: SIMBLでCocoaアプリをパワーアップ

• 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

Page 38: SIMBLでCocoaアプリをパワーアップ

PlugSuit - 他のプラグイン管理ソフト

mach_injectを利用したプラグインのロード

システム環境設定でプラグインを管理できる

http://infinite-labs.net/PlugSuit/

38