僕らの顔は本を作る為に存在してるわけじゃない

立て続けに宣伝で申し訳ないのですが, 約一年ぶりの想ひ出ブレイカーに続くiPhoneアプリ第二弾, Anti Taggingが公開されました.

デザインは若いのに(物理的にも)存在感が凄い長井創 a.k.a. ながそー.
イカした感じのデザインをやってくれました. ちなみにアイコン, スプラッシュの写真素材もながそー. 怖い.

アプリのベースは30分くらいで出来たんだけどUIの基本的な部分(今回はボタンを使わないで行ってみようとか)を考えるので一週間くらい, でアプリ名考えるのに一ヶ月くらい掛かってそれからながそーにデザインお願いして一週間くらいたまに顔合わせながらデザインを色々やってもらった感じでやっぱりアプリ名って凄く難しいなって思ったり.
その分個人的にはなかなか良い感じの落としどころに来たかなって満足してます. ながそーありがとー.

例によって無料ですし, 別にこのアプリ落としたからって僕の懐が潤うわけでも無いので嫌儲の人も是非!

最近書いたof用addon紹介

of0.8.0出ましたね.
そんな中早速ofxiPhoneがofxiOSになったり皆が慣れ親しんだtestAppがofAppに変わったり色々と色々ですが, 夏ですね.

ということで, 最近全然クロスプラットフォームじゃないaddonを書いては公開(at github)してるので紹介.

ofxCIDetector

github:ofxCIDetector
CoreImageの顔認識ライブラリCIDetectorをofxiOS用に包んだaddon.
クラスにofImage投げたら輪郭, 目, 口の情報が返って来る. まだgrayscaleの画像には対応してない. (このことREADMEにも書かなきゃ…)

ofxVoiceSynthesizer

github:ofxVoiceSynthesizer
OSXのText2SpeechライブラリNSSpeechSynthesizerを包んだaddon.
iOSでもprivateであるけど公開出来ないから一応osxのみ. 需要があればiOS用も書くけど…

ofxCoreMIDI

github:ofxCoreMIDI
OSXのMIDIライブラリCoreMIDIを包んだaddon.
まだまだだけど取り敢えずなんか受信は出来るし公開したって状態.
でもちゃんと調べたらofxMIDIっていうちゃんとしてるっぽいaddonあったしもう良いかなって気も.

ofxiGKSession

github:ofxiGKSession
iOSのGameKitの特にBluetooth通信部分であるGKSessionを包んだaddon.
設計的にofEventにすべきかどうか悩んだけどiOS脳になってるのでdelegate的なクラスを継承するって形で実装.
ofEvent投げるようなサブクラス使えばそういうofEventも使えるし, それはオプションで近々書くつもり.
Server-Clientモデルはあんまり試してないのでまだまだ改良の余地あり.

ofxTBTexture

github:ofxTBTexture
俺がよく使うofTextureの拡張drawメソッドをちゃんとクラス化したもの.
主に長方形以外の図形にフォーカス. ドキュメント書くのめんどくさい.
一応疑似補間みたいなこともやってるけど精度は…

ofxObjective-C++Utility

github:ofxObjective-C–Utility
githubのURL制限のせいで残念な感じになったObjective-C++用ユーティリティ. かなりニッチ.
NSStringとstringの変換とかvectorからNSArrayへの変換とか. あとof向けにofPointとCGPoint, ofRectとCGRect, ofBufferとNSDataとかの変換も.
vectorからNSArrayへの変換はblocks書けないと辛い. ofっぽくないよなーとは思ってたり.
関数ポインタとか変換するだけのインターフェイス作ってそれを継承したクラス作るようにしても良いっちゃ良いんだけど…

ということで, 全然まだまだ改良の余地のあるα版ばかりですが, 何か興味があったら使って貰えると. そんでバグがあったらissue立てて貰ったり勝手に修正してpull request投げてもらったりしたら!勝手に修正してpull request投げてもらったりしたりしたら!!
あ, あと, mdとかの英語で変な所とかもあったら是非指摘してください!英語難しい. ドキュメントも全部Objective-C++で書きたい.

よろしくお願いします.

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プログラムの鬼門であって欲しいものです. クソ…

armv7s用のlibを作るメモ

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

想ひ出ブレイカー

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

想ひ出ブレイカー

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

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

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

最近’s works / Font Me / Gatorade Free Run

Font Me
石橋先生のblog
てことで天下のAdobeのキャンペーンのiPadリモコンアプリを書いてます.
キャンペーンは昨日今日明日の3日間. 参加するとスッテカーが貰えますよ.
石橋さんアプリ側で使ってるofxHTTPServerがなかなか癖が強くて最初はまりましたが基本的にはHTTP通信と一部OSCで通信してます. OSCはやっぱデータ取りこぼしが怖いのでキュー出しには向かないですね. 精神衛生上. 特にiPad側がWiFiだし.
Viva雑用プログラマ.

Gatorade Run / Fun Race
ゲータレードのキャンペーン.
スマフォアプリでレースに参加. ある特定順位だと景品が貰えます.
iPhone, Android共にやってます. 初AndroidではまりまくりGWが虚空に消えました.
天下のライゾマのテクニカルな仕切りの下, サーバーサイドが天下のマウントポジションさん, デザインが上のAdobeと同じく天下のDELTROさんと一緒にやってます.
きちんとGPS情報を使ってやってるので野外でのジョギングなら某Nike+より精度は良いのではないかと思います.
バックグラウンド処理難しいですね.

べ, 別にTwitterばっかやってるわけじゃないんだからね!!

最近スマフォアプリ多いなぁ

バカでも作れるiPhoneアプリの時代も近い?

http://iphone.longearth.net/2009/05/14/iphoneのphotoアプリ再現どころではない神ライブラリ見つ/
Twitterでテーブルビュー使いづらいと嘆いていたら比嘉さん@lalalilaが教えてくれたThree20っていうライブラリ.

iPhoneアプリ書いて飯食える時代なんてほんの少しな気がしますね…
まあ, Apple様がどう仰るかですけども.

ところでiPadを割ると人気者になれるらしいです. 皆さん叩き割りましょう. 俺は割らないけど. まだ割るiPad持ってないけど. そもそもiPad持ってないけど.

MFMailComposeViewController

メールをopenURLを使わずに送る方法. 但し, OS3.0以降.

MessageUI.frameworkを追加してMessageUI/MessageUI.hとMessageUI/MFMailComposeViewController.hをインポート.

使いたいビューにMFMailComposeViewControllerDelegateを実装する.
多分
- (void) mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
を実装してればおk.

この中で

    switch (result) {
        case MFMailComposeResultCancelled:
        case MFMailComposeResultSaved:
        case MFMailComposeResultSent:
        case MFMailComposeResultFailed:
        default:
    }


こんなことやって結果で条件分岐させたり. 最後に

    [controller dismissModalViewControllerAnimated:YES];


とかすると戻れたり.

こいつを呼び出す時は

	MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
	picker.mailComposeDelegate = self;

	// BODY
	[picker setMessageBody:messageBody isHTML:NO];

	// TO
	[picker setToRecipients:[NSArray arrayWithObject:toAddress]];

	// CC [if needed];
	[picker setCcRecipients:[NSArray arrayWithObject:ccAddress]];

	// SUBJECT
	[picker setSubject:subject];

	[self presentModalViewController:picker animated:YES];
	[picker release];


こんな感じ. toAddressとかccAddressとかは全部NSStringで.
これを使うと添付ファイルも付けれる. けど省略.

iPhone開発ではまった. [plistとかNSMutableArrayとか編]

iPhoneでローカルにplistを作ってその中にログを保存しようしてはまってたのでまとめ.

書いてたのはこんなコード.

	NSArray  *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
	NSString *documentsDirectory = [paths objectAtIndex:0];
	logPath = [documentsDirectory stringByAppendingPathComponent:@"log.plist"];

ここで, logPathはクラス変数でNSString *logPath;な感じ.
で, このlogPathに対してNSMutableArray *logArray;から[logArray writeToFile:logPath atomically:YES];をかませようとしておったのですよ.

で, はまったわけですが, 俺はてっきりlogArrayにNSDictionaryをaddObjectしてたりするのでそこらへんではまったんだろうと思い込んでたわけですよ. でもどうやらそうでも無いっぽい. じゃあパスがうまく取れてないのか, logArrayの初期化もarrayWithContentsOfFile:logPathとかでやってるからそれが悪いのか… とか疑いまくってたわけですが, もっと根本的なことでした. その答えがこれ.

	NSArray  *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
	NSString *documentsDirectory = [paths objectAtIndex:0];
	logPath = [[NSString alloc] initWithString:[documentsDirectory stringByAppendingPathComponent:@"log.plist"]];

要するに, [documentsDirectory stringByAppendingPathComponent:@"log.plist"]] ってのが返す値がautoreleaseなのか何なのか知らないけどすぐにゴミが入っちゃうんですね… ですので値でちゃんとコピーして上げたらあっさりと…
よし, 飯食いに行く.

相も変わらずiPhoneで悩む.

・教えて偉い人 — UIControlEventTouchUpInsideとtouchesEndedが被ると駄目?
UIImageViewがUIControlを継承していないのでaddTargetメソッドが使えない. というのは前回のiPhoneネタで書きましたが, それでサブクラスわざわざ作るのも何となく嫌だったのでUIButtonのCustomを動的に生成して置き換えてやろうとしてるわけです. が, 何故か急にそこから落ちる様になったんですね.
で, 現在やってることは
・A_ViewControlerのロード時にUIButtonを生成.
・そのUIButtonに対して

[button addTarget:self action:@selector(method_X) forControlEvents:UIControlEventTouchUpInside];

・method_XはB_ViewControlerを生成して, A_ViewControlerのviewにaddSubview:B_ViewControler.viewする.
・B_ViewControlerは背景透過で, 半透明なUIButtonで全面が覆われている. UIButtonのtouchesEndedに自分のalphaを0.0にする(IBAction)method_Yが設定されている.

説明が分かり辛いですが, 要するに同じ領域(殆ど全面)にUIControlEventTouchUpInsideでアクションが設定されたUIButtonとtouchesEndedが設定されたUIButtonがあって重なってるわけですね.
それって, 同時に設定されていて大丈夫なんだろうか, というのが今の疑問です. それも半透明だし.
今まではカスタムUIImageViewにtouchesEndedを設定した上に更にtouchesEndedが設定されたUIButtonがあったんですが, そこがUIControlEventTouchUpInsideにしてから落ち始めたので怪しんでおる次第です.

んーむ. 我ながら分かり辛い.
この悩みを言葉ではなく心で理解して頂けて, 更にその真実を知っておられる方はコメントとかでご教授頂けると幸いです.