My Codex Leicester

(旧いつか音楽と呼ばれるもの)

[Ruby]
iTunes Libraryの重複ファイルを消すスクリプトをRubyで書く


2008/7/5 18:28:53

Ruby入門しました.
何か練習に書いてみようということで,ひとつ.

iTunesでライブラリを再構築したら
うっかり,同じ曲も足されちゃって
hoge.mp3
hoge 2.mp3
というのが果てしなく増殖してしまうことがよくあります.

こういうのさくっとRubyで解決できたら便利だなと挑戦.
戦略は
ファイル名が
***(space)2.extensionなら,
***(space).extensionを探す
あれば,重複だーということで削除.
レアなケースで
***(space)0.extension
***(space)1.extension
***(space)2.extension
***(space)3.extension
という曲名だったらアウトですが,気にしない.だって分からんもん.

ディレクトリ以下の全てのファイルパスを取得するコードをたのしいRubyからパクって
僕はdeleteIfDuplicatedを実装しただけの楽ちんコード.

def deleteIfDuplicated(fileName)

  p fileName

  if / 2./ =~ fileName

    find = fileName.sub(” 2.”,‘.’)

    if FileTest.exist?(find)

      p ‘delete:’,fileName

      File.delete(fileName);

    end

  end 

end

def traverse(path)

  if FileTest.directory?(path)

    dir = Dir.open(path)

    while name = dir.read

      next if name == “.”

      next if name == “..”

      traverse(path + “/” + name)

    end

    dir.close

  else

    deleteIfDuplicated(path)

  end

end

こういう風に使います.

path = “/Volumes/400GB/iTunes”

traverse(path)

で,削除したら
iTunes のライブラリからファイルが存在しない曲を効率良く取り除く方法
で削除.

もし試す場合,何かが起こっても僕は一切責任取れませんので
バックアップなどやってから実行してください.

僕の環境では5000曲が削除できました.

あ〜,ちゃんと 2.extensionが最後が確認した方がいいな.
まぁいいや.


[Codex]
数学ガール/フェルマーの最終定理


2008/7/1 22:52:52

http://www.hyuki.com/girl/fermat.html
が出るそうです.
無料プレゼント企画やってらっしゃいます.(応募済)

結城さんと言えば「Java言語で学ぶデザインパターン入門」
がナイスでした.
ということで応援post.

#Javaの利点は本が多いことに尽きる!


[MacPeople]
MacPeople 2008.08


2008/7/1 19:25:13

ひょんなことから,MacPeople読者になりました.
というわけで,毎月レビュー(なのか?)を書きます.

さて,今月のMacPeopleは・・
WWDC特別号 絶対欲しいiPhone3G!

あれ,MacじゃなくてiPhoneですか.
ApplePeopleに名前を変えた方がいいのでは.

さて,内容.
iPhone特集はよくまとまっているのでWebで追うのがダリィーな人はお勧め.

豆知識 : また別売りで充電/同期/オーディオ入出力に対応する「iPhone 3G Dock」も販売される予定だ
知らなかった.こういうのが雑誌のよいところですね.

クイズ!マックでヘキサゴン
これは・・・
と思ったけど,意外と面白いのです,こういうの.

津田大介の音楽配信一刀両断
これね,本出してください.よろしくお願いします.

あと面白いのは
processingの記事
Deep Inside OSX

うむうむ,動向をきちっとまとめた記事から
マニアックな記事までしっかり網羅されている.なるほど.

と,実に数年ぶりにMac系雑誌を立ち読み以外で読みましたが
780円でこれだけ凝縮されたものが見れるのは買いかも.1時間じゃ読み切れない.
料理のレシピからGPGPUの話題まで載っている雑誌もそうはあるまい.
あと2・3人,おもしろい連載があれば買うな.
もちっと,現場寄りの人の連載というか,こんなの作ってます!という人にインタビューの記事があればいいな.
DeMOSAに出てるような人に小一時間インタビューしてまとめればよいのでは.

来月も期待してますマックピーポー!


[movalprocess]
DSPでBang 満員御礼


2008/6/25 15:45:38

dscn1031.jpg

イベント無事終わりました.
雨の中お越しいただいた皆様,ありがとうございました.

僕の発表は15分にかなり詰め込んだので
非常にざっくりなものになっていたと思います.
もっと詳しく!という方はイベントに呼んでください.2時間ぐらい喋ります :)

ちなみに,僕の発表はいつか〜#008で配信予定です.
& #009「movalprocess特集」収録済みデス.
近々公開します.


[movalprocess]
IAMASイキマス、DSPでBANG! 2008


2008/6/19 22:29:32

6/22は
IAMASイキマス、DSPでBANG! 2008
http://www.iamas.ac.jp/dsp/2008/06/1-max5.html
でございます.

apple0622_cover.jpg

ということで再告知.

タイトルが,Max 5大作戦となっていますが,僕はMaxは関係なく
movalprocessについてガチでプレぜンします.
さてさて,15分でどこまで話せるのか.


[movalprocess, Core Audio]
Undo/Redo


2008/6/17 23:00:13

Undo/Redoが付きました.
undo.png

redo.png

苦労したのは,普通のCocoa ApplicationじゃないのでNSSliderとかをほとんど使ってないわけです.
なので,NSUndoManagerを使う一般的なパターンが通用しない.
し,か,も,Audio Applicationなので時間が常に流れていく.

さて,そこでどうするか考えるわけですが

デザインパターンをObjective-Cで - Memento (2)

Mementoではない、NSUndoManager
GoF本によるMementoが、変更前の状態を保存しておく、というものに対して、操作を登録するという行為は、大きく異なる。

あたりを読んで,NSUndoManagerを使ってMementoみたいなことをやろうと決意.

Audio Applicationなので,時間がじゃんじゃか過ぎていく.
なので,何か操作をした地点でスナップショットとして全体の状態を保存しておく.
で,実インスタンスを丸ごと保持していくと,Audio Applicationなんでメモリが大変なことになるので
NSDictionaryで保存しておく.

そんで,undo/redo時はスナップショットから状態を復元する
-(void)restoreFromSnapshot:(NSDictionary*)snapshot
みたいなmethodを用意しておいて,何か操作をしたら,操作する前のsnapshotをUndoManagerに登録.

NSUndoManager *undoManager = [self undoManager];
[undoManager registerUndoWithTarget:self selector:@selector(restoreFromSnapshot:) object:snapshot];

redo用にrestoreFromSnapshot内でsnapshotをUndoManagerに登録.(undo取り消し操作)

という具合に実装しました.
これがいいのは,スナップショットの実装がそのままDocumentの保存になることと,テストケースが書きやすい.
Audio UnitのSliderを動かした〜なんてときは,全体の状態を全部更新する必要もないので特別対応で
Audio UnitのPresetだけ戻す〜なんて具合に最適化してある部分もあり.
あと,AUGraphのNodeをAudio処理中に繋ぎ変えたとき,捨てたはずのAudio Unitが開放されないので,undo/redoのときにさりげなくAudio処理を止めてメモリ解放したりしております.
Audio Unit便利だけど,やっぱフルスクラッチで書かないと,最終的な追い込みで苦労する.うお.

Monalisa(Audio・Image Unit)といい,movalprocessといい,普通なCocoa GUIなAppを書いてないな・・・.

undo/redoのGUIで参考にしたのは,ネットで見つけたこの画像.
ovallofxel.gif


[movalprocess]
Audio Unit Effect


2008/6/17 11:14:22

movalprocess,Audio Unit Effectが少々便利に使えるようになってきた.
movalaueffect.png


[Cocoa/Carbon]
NSSlider(のsubclass)でmouseUp


2008/6/16 20:18:31

初歩っぽいですが,困って見つけたので.

NSSliderをぐりぐりいじって,mouseを離したのを知りたい.
んじゃ,NSSliderを継承したClassでmouseUpをOverrideすりゃいいかなと思うのですが
NSSliderを継承しても,mouseDownは呼ばれますが,mouseUpは呼ばれません.
で,NSSlider(のsubclass)でmouseUpを呼ぶ方法がこれ.
http://paste.lisp.org/display/56333

NSEventを作って投げているだけです.
なんでこれでちゃんと動くのか.

おそらく,mouseDown後,NSApplicationはmouseUpまでEvent待ちになっていて,その間発生したEventはstackに溜まるんでしょう.で,mouseUp後,送っておいたNSEventがやってきて目出たくmouseUpが呼ばれるということじゃないかなと.
mouseUpは呼ばれないと書いてるじゃないか!と思われるかもしれませんが,NSSliderを継承したClassでmouseDownで[super mouseDown:]を呼ばないようにすると,ちゃんとmouseUpは呼ばれるのです.
(が,これだとsliderが動かないので実質アウトですね)

つまり,NSSliderが(もしくはその他の見えざる力が!)内部でmouseUpを呼ばなくしているわけです.
うお,なんだか解読不能な文章になってしまった & かなり内容が怪しいので話半分で.

- (void)mouseDown:(NSEvent *)event{

    [super mouseDown:event];    

    // set up our mouseUp event. 

    NSEvent* upEvent = [NSEvent mouseEventWithType:NSLeftMouseUp

                                          location:[event locationInWindow

                                     modifierFlags:[event modifierFlags]

                                         timestamp:[event timestamp]

                                      windowNumber:[event windowNumber]

                                           context:[NSGraphicsContext currentContext

                                       eventNumber:[event eventNumber]

                                        clickCount:[event clickCount]

                                          pressure:1.0];

    // dispatch mouse-up event

    [NSApp sendEvent:upEvent];

}



[いつか音楽と呼ばれるもの]
MMG


2008/6/11 23:12:47

最近発見したのですが,MMG開発日記が開始されておりました!

MMG 開発日記

MMGは宮島さんが開発されているMASHUP用アプリケーション.こちらの解説が詳しい.

第287回:ソニーCSLで開発中のリミックスエンジン「MMG」とは?
~ 誰でもリミックスできる音楽の新しい形を提案 ~

massh!と同じくMASHUP用アプリケーションながら
アプローチがかなり異なるところが面白いです.
DeMOSAでのDemo,面白すぎです.


[Cocoa/Carbon]
NSStringを改行して入力


2008/6/9 14:19:53

ヒレガス本3rd EDITIONが届いたので,パラパラ見ていたら,謎のコードに遭遇.
こんなコード.一瞬誤植かと思ったのですが,ま,ま,まさか.

NSString *string = [NSString stringWithFormat:

                    @”hoge%d”

                    @”moge%d”,10,20];

NSLog(string);

hoge10moge20

じゃじゃーん.
こういう書き方ができるんですね.

NSString *string = [NSString stringWithFormat:

                    @”hoge%d

                    moge%d”,10,20];

こう書くとシンタックス・エラーになるので,長いときは横長になってやだなぁと思っていたのです.

で,これはつ,ま,り


NSString *string = @”hoge”@”moge”;

NSLog(string);

hogemoge


こう書けるということなのデス!
知らなかった.