バックアップスクリプト
copy_files.py
#!/usr/bin/env python # -*- coding: utf-8 -*- ### globals import os import shutil def swapextensions(copy_from, copy_to): count = 0 for path, subdirs, files in os.walk(copy_from): for file in files: if file[:1] != '.': count += 1 shutil.copy('%s/%s'%(path,file), '%s/%s'%(copy_to,file)) if __name__ == '__main__': import sys if len(sys.argv) != 3: print 'Usage: swapext rootdir before after' sys.exit(100) swapextensions(sys.argv[1], sys.argv[2])
使い方は
python copy_files.py /Volumes/xxx/iPod_Control/Music destination_path
みたいな感じ。忘れないようにメモだわさ
めもだっちゃ
#!/usr/bin/env python # -*- coding: utf-8 -*- import os import re if __name__ == "__main__": base_dir = os.getcwd() filter = re.compile('\.h$|\.m$|\.cpp$|\.c$') for dirpath, dirnames, filenames in os.walk(base_dir): for filename in filenames: if filter.search(filename): p = os.path.join(dirpath, filename) action = 'nkf --utf8 %s > %s_' % (p, p) os.system(action) action = 'mv %s_ %s' % (p, p) os.system(action)
xcodeプロジェクト設定の覚え書き
XCodeでProjectからNew Custom Executableを設定しても、そのアプリケーションがひらかない・・・。ずっと悩んだあげく調べてみると、Edit Active Executableで入出力でPseudo Terminalが有効になってない!!これの原因はプロジェクト設定のビルドのアーキテクチャーがNative Architecture of Build Machineになってなかったから。迷ったー。
んで、ビルド時にシェルスクリプトを実行させる方法がわかった。やりかたはProjectからNew Build Phaseを選択。そのあとに New Run Script Build Phaseを選べばOK!!したらGroups & Filesの中のTargetsにRun Scriptが追加される。いらなくなったらそれを消す。
外から引っ張ってきたソースとかだと権限の問題でシェルスクリプトがエラー出してビルドできないなんてこともあるので注意!
iPhotoプラグインのデバッグ
XCodeからiPhotoに潜るにはメニューバーのProject->New Custom ExecutableでiPhotoを選択しましょう。
何度も忘れるので覚え書き。
でもって、どうやればEscでキャンセル、Returnで決定ができるようになるかを調べていたんですがなかなか見あたらない。windowのdelegateでキーアクションをがあったら決定ボタンを押したときの関数を呼べばいいのかな、とかずっと考えていたんですが、実はすごく簡単にできるという事がわかりました。方法は
・Interface Builderでボタンにフォーカスをあてて、Inspectorを開く。
・Key Equivの灰色になってる部分にフォーカスをあわせて割り当てたいキーをたたく。
以上!!知らなかった!!こんなに簡単にできるとは・・・・。
Objective-C プロトコルのカテゴリは可能か?
最近macのプラグインをよく書いてる。iPhotoなどのアプリはプロトコルを用いて実装することになると思うが、もしも、そのプロトコルの関数の数が多すぎたらどうだろう?クラスは採用するプロトコルで宣言されたすべての必須メソッドを実装する必要がある。それをいくつかのファイルに分けたいと思わないだろうか?だもんでちょっと調べてみた。
まず、プロトコルの実装クラスを作成。その後にそのクラスのカテゴリを作ってみる。たぶん下記みたいになるんでないでっしゃろか。
用いるプロトコル
@protocol hogeProtocol -(void)func; -(void)coffee; -(void)tea; -(void)green; @end
実装クラスのヘッダー
@interface AppController :NSObject<hogeProtocol> { //write anything you want } //write anything you want @end
実装クラスの定義ファイル
#import "protocol.h" #import "AppController.h" @implementation AppController -(void)func{} -(void)coffee{} -(void)tea{} -(void)green{} @end
カテゴリクラスのヘッダー
#import <Cocoa/Cocoa.h>
@interface AppController(test)
- (void)geho;
@end
カテゴリクラスの定義ファイル
#import "protocol.h" #import "AppController.h" #import "category.h" @implementation AppController(test) - (void)geho{} @end
よし、準備は整った。もしも、カテゴリクラスの定義ファイルでプロトコルの関数を実装できれば目標達成!できるかな!?
AppControllerの実装ファイルから
-(void)green{}
を消して、カテゴリクラスの定義ファイルに移してみると・・・・・・
コンパイルとおらねぇ!!!!!やっぱだめか・・・・。プロトコルの定義の分割はどうやればいいんだろう・・・・。知ってらっしゃる方、教えてください!
あー、HDMTの木下さんの本になんか書いてあった気がする。帰ったら読んでみよー
cocoaからのapplescriptの呼び出しについて
NSStringにapplescriptを書いて実行させる場合にはexecuteAndReturnErrorを用いる。このときの引数でNSDictionaryを渡すのだが、最初それをもちいてエラー処理をしていた。
NSString * script_str = [NSString stringWithFormat:@"do shell script \"echo %@ \"",@"hello world"]; NSAppleScript *script = [[NSAppleScript alloc] initWithSource:script_str]; NSDictionary *errorInfo=[[NSDictionary alloc] init]; NSAppleEventDescriptor*res = [script executeAndReturnError:&errorInfo]; if([errorInfo count]){ //もしも、エラー処理があったら }
でも、http://developer.apple.com/jp/technotes/tn2006/tn2084.htmlをみるとそうではなく、executeAndReturnErrorの戻り値がNULLであるかどうかをチェックしている。あー、僕もそうしよう。
ちなみに
[errorInfo release];
を行うと、しばらくした後signal 11で落ちる・・・。なんでですかね・・・。だれか教えてください。