UITableViewCellをIBで

参考にしたサイト:
http://hamken100.blogspot.jp/2013/01/ios-uitableviewcell.html
http://blogios.stack3.net/archives/195

はまったこと:
・File’s Ownerをカスタムセルのクラスにした
 → File’s OwnerはNSObject
・それに関連してFile’s Ownerにviewをガンガン繋いだ
 → 駄目!絶対!
・cellのheight…?
 → UITableView側で設定した
  →セルの高さ可変だったらどうすんの?
・Background Colorがtransparentになって反映されなかった
 ・更にCellを使う時にsetBackgroundColorしても駄目
 → background viewを自前で作って繋いでおく
  → これが正解かどうか分かってないけど取り敢えず動いた.

いつまでもUITableViewにはiOSプログラムの鬼門であって欲しいものです. クソ…

K村大先生とM登大先生に高くて美味しい焼肉を(何故か)奢って貰った話

K村大先生とM登大先生に目黒の美味しい焼肉を奢って頂きました. 奢ったという事実を日記に書くことが今日の主なハイライトでした. それと2bitはグリッチやり続けろという話. グリッチはニッチだということ. 肉はとても美味しかったです. 肉ソムリエが居ました. K村さんは32歳になって酒を飲む前に腹を膨らませておくと悪酔いしないということに気付いたらしいです. 良かった良かった. みんな@NISE_TOEICで英語の勉強をしましょう.
K村先生にプログラマーに優しいデザイナーアワードを!

ofxVoiceSynthesizer

ついでに前から作ってたNSSpeechSynthesizerをofから叩ける様にする ofxVoiceSynthesizer も公開しました. OSX only.

ofxCIDetector

iPhone用of向けに超シンプルなCIDetectorのラッパーを書きました.

ofxCIDetector

早めにgrayscaleにも対応します.

MacだとofxOSXFaceDetector ってのが既にあります.

クレジット問題 : Cannes Lion – FULL CONTROL

Mobile Lions – FULL CONTROL
Cyber Lions – FULL CONTROL

載ってませんがやってます. FULL CONTROLのiPhoneアプリ開発して, イベント用のAndroidアプリも開発して増上寺での現場設営にも行ってます.
あと, Mountpositionの椎野さんも抜けてますが佐々木さんと一緒にサーバーサイドをやってます.

もしかするとcannesの仕組み的にAll Entriesに載るのはショートクレジットになってて省略された可能性もありますが, 冷静に言って省略されるとしても僕や椎野さんは省略されてはいけないくらい根幹に関わってたと思います.
いずれにせよそういうのが管理出来ない様なクレジットの適当さになってるのはちょっと悲しい. だいぶ悲しい.

これ以外でもそういう話は色々聞くので, 世の中でどれだけ僕らみたいなまだ名前の売れてない無名の駆け出しプログラマーやクリエイター達が(意図的にせよ手違いにせよ)色々なクレジットから消えてしまっているのかって考えると色々激おこぷんぷん丸だったりするわけです.
僕らは僕らなりに働いてるわけですし, ディレクターの人たちが働いてないとか言う気は毛頭無いですが, 逆に末端で手を動かしてる人間だって頑張ってるわけです. そこら辺はどっちが欠けても成り立たないわけで.

世の中的にはどうでも良い小さなことですし, きちんと文章に起こさないと風化してしまいそうな気がしたので敢えて文章にして残しておきます.

くれぐれも誤解の無い様にしたいのは, 誰かを責めたいわけじゃないです. 敢えて言えばそれがまかり通ってるこの業界に対する話です.

追記:
水鳥さんも抜けてることが発覚.
原因も分かりました. 人的ミスでした.
既に起きてしまったことに対して怒ったり責めたりしても何も建設的では無いのでこれ以上それについては何も言いませんが, 今後はこういうことが起きない様に注意して貰いたいですね.

Maxのjsのバグ

Max 6.0.xのjsでTask使うとバグがあるっぽく動かない.
6.1.xだったら大丈夫.

new Task(function() {
    post("foo");
}).schedule(500);

こんな感じのソース.

armv7s用のlibを作るメモ

armv7sもlibに追加したかったらデフォの lipo じゃなくて xcrun -sdk iphoneos lipo を使う.

想ひ出ブレイカー

この度, 『想ひ出ブレイカー』というグリッチーなiPhone用カメラアプリをリリースしました.

想ひ出ブレイカー

自主企画としては初のアプリリリースでドキがムネムネしています.
自分が作ったアプリを知らない人が使って居るという状況がとても嬉しく楽しいですね.
リリース後3日目でまだ400DLくらいですが, 別にこれでマネタイズしたいわけじゃないし, グリッチという物が好きなニッチな層に受ければそれで良いかなと思ってたりも.

このアプリ自体は半年前に作り始めて半年前に殆ど出来上がってたのですが, なかなかリリースしようという気分にまでいかず, この前勢いで申請して通った次第です. 結局アイコンや起動時の画面のデザインが一番の問題だったり…

自分のやりたいことだけやるアプリ開発超楽しい. でもそれだけじゃ食べて行けないのよね. うーん.

ケプストラム

覚え書き

FFTデータ自体をFFT解析してローパスかけてFFTデータの特徴点を出す.
何故か知らないけどlog10とかかける.
大ざっぱな流れは

音声信号
→fft0=FFT(音声信号)
→fft1=log10(fft0)
→fft2=FFT(fft1)
→fft3=LowPass(fft2)
→ifft=iFFT(fft3)
→cepstrum=pow10(ifft)

TypeScript勉強ログ #2 チャーチ数

Church Number

高階関数が扱える様になったら取り敢えずみんな大好きチャーチ数の実装したくなるよね!
で, 都合の悪い所は型推論に任せて型を省略するよ!

module ChurchNumber {
	interface N { (f : Fn) : Fn; };
	interface Fn { (x : any) : any; };

	export var Zero  : N = (f : Fn) => ((x : any) => x);
	export var Succ  : (N) => N = (m : N) => (f : Fn) => (x : N) => f(m(f)(x));
	export var Pred  : (N) => N = (n : N) => (f : Fn) => (x : N) => n((g) => (h) => h(g(f)))((u) => x)((u) => u);
	export var Plus  : (N) => (N) => N = (m : N) => (n : N) => n(Succ)(m);
	export var Mult  : (N) => (N) => N = (m : N) => (n : N) => n(Plus(m))(Zero);
	export var Minus : (N) => (N) => N = (m : N) => (n : N) => n(Pred)(m);

	export class Test {
		static private printNumber(m : N) : void {
			console.log(m((n : number) => n + 1)(0));
		};
		static public run() : void {
			var One   = Succ(Zero);
			var Two   = Plus(One)(One);
			var Four  = Mult(Two)(Two);
			var Three = Pred(Four);
			var Six   = Mult(Two)(Three);
			var Five  = Minus(Six)(One);

			printNumber(Zero);
			printNumber(One);
			printNumber(Two);
			printNumber(Three);
			printNumber(Four);
			printNumber(Five);
			printNumber(Six);
		};
	};
};

ChurchNumber.Test.run();

これでいけました.

Pred

(g) => (h) => h(g(f))


がすんなり通って賢いですね.

追記

module ChurchNumber {
	interface N { (f : Fn) : Fn; };
	interface Fn { (x : any) : any; };

	interface UnaryOp { (m : N) : N; };
	interface BinOp { (m : N) : UnaryOp; };
	
	interface TruthVal { (x : any) : Fn; };

	interface LogicalOp { (x : TruthVal) : TruthVal; };
	interface LogicalBinOp { (x : TruthVal) : LogicalOp; };

	interface Predicate { (...args : any[]) : TruthVal; };

	export var Wrap : (any) => (any) => any = (x : any) => (_ : any) => x;

	export var True : TruthVal = (x : any) => (y : any) => x;
	export var False : TruthVal = (x : any) => (y : any) => y;

	export var Not : LogicalOp = (p : TruthVal) => p(False)(True);
	export var And : LogicalBinOp = (p : TruthVal) => (q : TruthVal) => p(q)(p);
	export var Or : LogicalBinOp = (p : TruthVal) => (q : TruthVal) => p(p)(q);
	export var Xor : LogicalBinOp = (p : TruthVal) => (q : TruthVal) => p(Not(q))(q);
	export var Imp : LogicalBinOp = (p : TruthVal) => (q : TruthVal) => Or(Not(p))(q);

	export var IfThenElse : (TruthVal) => (any) => (any) => any = (p : TruthVal) => (Then : any) => (Else : any) => p(Then)(Else);
	export var IsZero : Predicate = (m : N) => m((x) => False)(True);
	export var Equal : Predicate = (m : N) => (n : N) => And(IsZero(Minus(m)(n)))(IsZero(Minus(n)(m)));
	export var Leq : Predicate = (m : N) => (n : N) => IsZero(Minus(m)(n));
	export var Lt : Predicate = (m : N) => (n : N) => And(Leq(m)(n))(Not(Equal(m)(n)));
	export var Geq : Predicate = (m : N) => (n : N) => Not(Lt(m)(n));
	export var Gt : Predicate = (m : N) => (n : N) => Not(Leq(m)(n));

	export var NAN : N;
	export var IsNAN : Predicate = (m : N) => m == NAN ? True : False;

	export var Zero : N = (f : Fn) => (x : any) => x;
	export var Succ : UnaryOp = (m : N) => (f : Fn) => (x : N) => f(m(f)(x));
	export var Pred : UnaryOp = (m : N) => (f : Fn) => (x : N) => m((g) => (h) => h(g(f)))((u) => x)((u) => u);

	export var Plus : BinOp = (m : N) => (n : N) => n(Succ)(m);
	export var Mult : BinOp = (m : N) => (n : N) => n(Plus(m))(Zero);
	export var Pow : BinOp = (m : N) => (n : N) => n(Mult(m))(Succ(Zero));
	export var Minus : BinOp = (m : N) => (n : N) => n(Pred)(m);

	export var Mod : BinOp = (m : N) => (n : N) => IfThenElse(Lt(m)(n))(Wrap(m))(Mod(Minus(m)(n)))(n)
	export var Div : BinOp = (m : N) => (n : N) => IfThenElse(Lt(m)(n))(Wrap(Zero))((k : N) => Succ(Div(Minus(m)(n))(k)))(n)

	export var SafetyMod : BinOp = (m : N) => (n : N) => IfThenElse(IsZero(n))(Wrap(NAN))(Mod(m))(n);
	export var SafetyDiv : BinOp = (m : N) => (n : N) => IfThenElse(IsZero(n))(Wrap(NAN))(Div(m))(n);

	export class Test {
		static public run() : void {
			var One   = Succ(Zero),
				Two   = Plus(One)(One),
				Four  = Pow(Two)(Two),
				Three = Pred(Four),
				Six   = Mult(Two)(Three),
				Five  = Minus(Six)(One);
			var Nine  = Pow(Three)(Two);
			printNumber(Zero);
			printNumber(One);
			printNumber(Two);
			printNumber(Three);
			printNumber(Four);
			printNumber(Five);
			printNumber(Six);
			printNumber(Nine);

			printNumber(Mod(Five)(Two));
			printNumber(Div(Five)(One));
			printNumber(SafetyDiv(Five)(Zero));
		};
		static private printNumber = (m : N) => console.log(m == NAN ? "NaN" : m((n : number) => n + 1)(0));
	};
};

ChurchNumber.Test.run();