innernet.jp

今年の2月頃から大輪さんに誘われて始めたUSTREAM番組のinnernet dot jp
録画が溜まってきたのでアーカイブサイトを作りました。

番組の詳細はこちら。最新情報はTwitterアカウントFacebookページをフォローしてください(ペコリ

Backbone.js (+ Underscore.js) 備忘録

定期的に記憶が揮発するのでメモ。

yasudatakahiro.com

お友達の安田くんポートフォリオサイトを作りました。

トップページはシンプルにサムネイルだけ、プロジェクトページはでマウスホイールだけでギュンギュン次のプロジェクトが読み込まれ一気に閲覧ができるサイトです。

安田くんの過去の作品のアーカイブや活動がアップデートされていくfacebookページもあわせてよろしくお願いします。

知識0からiOSアプリ提出までの学習リソースメモ

初のObjective-C案件で自分(ActionScript 5年生)が参考にしたリソースまとめ。


入門Objective-C 2.0

まずこの本でObjective-Cの基礎を理解。言語に関する書籍なのですごい退屈。「詳解Objective-C 2.0」の方が詳しいけど分厚すぎてXcode起動する前に心が折れたからこっちを先に読むほうが楽。

iOS Developer Library

「入門Objective-C 2.0」に並行してAppleの公式のドキュメントを読み砕いてく。PDFでダウンロードできるのでiPhone/iPadに突っ込んでうんこしながらも読む。iOSの開発に関してはここのドキュメント読むだけで十分ってぐらい充実してる。とりあえず最初はこのへんを読んどく。


Xcode 4 入門 for iOS/Mac OS X

図版多めでサクッと読める。Xcode4の使い方、Instrumentsの使い方がサクッと把握できる。


iOS開発におけるパターンによるオートマティズム

実践的な「書き方」が多数掲載されてて勉強になる。安心の木下さん著作。
ぼんやりとCocoa Touchの使い方が見えかけてきたあたりで、効率のよいCocoa Touchの使い方をこの本で学ぶ。

実践! iPhoneアプリ開発 | コラム | エンタープライズ | マイナビニュース

上記「iOS開発におけるパターンによるオートマティズム」の木下さんによる連載。サンプルコードがためになる。


iPhoneプログラミングUIKit詳解リファレンス

UIKit各クラスの基礎的な使い方が網羅されてる。分厚いからパラ見してどんなクラスがあるか把握しといて、いざ使うときになったら該当箇所を読み込むって使い方がよさげ。


詳解Objective-C 2.0

数少ないObjective-Cの仕様を網羅した本。あとはひたすらこの本でObjective-Cの造詣を深めてゆく。分厚いから腕も辛い。

これぐらいの知識とGoogle力でとりあえず動くものは作れるようになった気がする。
あと開発中にハマったとこはこっちにメモ

「100,000年後の安全」がおもしろかった

大輪さんがTwitterでツイートしてるのを見て「100,000年後の安全」をDMMで観てみた。
原発の話題が取りざたされる昨今、話題的にもタイムリーだしちょっと見てみようと思って見始めたら想像してた内容を飛び越してかなりおもしろかったのでブログ書いた。

話の舞台はフィンランドで建設中の世界初の放射性廃棄物永久処分場。
ここは放射能が減衰する10万年の間施設が保持されるように設計されてるらしい。この施設の建設プロジェクトを追ったドキュメンタリー。

話題の中心は放射性廃棄物なんだけど、10万年の間放射性廃棄物を保持しておくという役割上、今の人類が滅びて次の人類が現れることを想定しなくてはいけない。

その次の人類に、地下に蓄積した放射性廃棄物に近づかないように警告するのはどうすればよいのか?プロジェクトに関わる人達は今なお議論している。

どの言語で伝えれば良いのか?
それ以前に言葉が通じるのか?
通じなければどうやって伝えればよいのか?
そもそも伝えず忘れ去られる方がよいのではないか?
どうやったら忘れ去られるのか?

今フィンランドでは国家レベルでこんなことを真剣に議論してるらしい。

10万年ごしの引継ぎの話として捉えるとスケールのでかさがすさまじくSFぽくておもしろかった。
1時間ちょっとでサクっと見れるのでゼヒ。

ストリーミング:
DMM.com [100,000年後の安全] 映画ドラマ動画

DVD:
Amazon.co.jp: 100,000年後の安全

Windows7 64bit環境でScoutを使ってコンパイルしようとするとエラーが出るバグ

Windows7 64bit環境でScoutのバージョン0.5.0を使ってコンパイルしようとするとArgumentErrorが出て停止してしまう。

原因は「C:Program Files (x86)Scoutjavascriptsappprocess_interaction.js」の95行目でjava.exeのパスが32bit環境でのProgram Filesディレクトリを指している箇所。ここを64bit環境のパスに差し替えてやる。

これを

return air.File.applicationDirectory.resolvePath("C:\Program Files\Java\jre6\bin\java.exe");

こうする

return air.File.applicationDirectory.resolvePath("C:\Program Files (x86)\Java\jre6\bin\java.exe");

詳細は下記参照のこと。
#19: ArgumentError on Windows7 – Issues – mhs/scout-app – GitHub

iOS開発ハマりどころメモ

アプリ開発中にハマったポイントをメモ。下に行くほど古いので初歩的な内容。

ScrollViewのスクロール強制停止
スクロール中のUITableViewを強制的に停止させる時はcontentOffsetに現在地の座標を突っ込む。
[_tableView setContentOffset:_tableView.contentOffset animated:NO];
iphone – Programmatically force a UIScrollView to stop scrolling, for sharing a table view with multiple data sources – Stack Overflow

NSMutableArrayのコピー
[NSMutableArray copy]で返ってくるのはNSArray、NSMutableArrayとしてコピーがしたい時は[NSMutableArray mutableCopy]を使う。
Basilの息子| 「__NSArrayM」と「__NSArrayI」

バックグラウンドでアプリを終了させる
ホームボタンが押されて、アプリがバックグラウンドに送られたときにアプリを完全に終了させる方法。
projectName-Info.plistに「Application does not run in background」という項目を追加してValueをYESにする。
UIApplicationExitsOnSuspend=YES を Info.plist に設定する – Debian GNU/Linux 3.1 on PowerMac G4

イベント一括停止
[[UIApplication sharedApplication] beginIgnoringInteractionEvents]でアプリケーション内のすべてのタッチイベントを停止する。
[[UIApplication sharedApplication] endIgnoringInteractionEvents]でタッチイベントの受信再開。
iOSイベント処理ガイド

プロパティセマンティクス
プロパティの宣言につける型みたいなやつ(セマンティクス)。

  • readwrite: 読み書き可能。デフォルト。
  • readonly: 読み取り専用。
  • strong: 強い参照。
  • weak: 弱い参照。参照先が解放されると自動的にnilが入る。iOS5から。
  • assign: 単純代入。デフォルト。
  • copy: copyを使って参照を保持する。代入前に自動でreleaseを送る。
  • retain: retainを使って参照を保持する。代入前に自動でreleaseを送る。
  • nonatomic: スレッドセーフでない。

Objective-Cプログラミング言語

実行時間計測
ある瞬間からある瞬間の時間を計測する方法。終了タイミングのNSDateオブジェクトのtimeIntervalSinceDate:に開始タイミングのNSDateオブジェクトを渡す。
■[iPhone][Objective-C] 時間を計測する方法

iOS デフォルトサウンド一覧
AudioServicesPlaySystemSoundで鳴らせるプリインストール済みのサウンドファイル一覧。
AudioServices – iPhone Development Wiki

UIViewのアニメーションを停止
UIViewのアニメーションをキャンセルするには、アニメーションしているview.layerにremoveAllAnimationsを送る。
[btn.layer removeAllAnimations];

デフォルト遷移アニメーションの実行時間を指定する
〜:animatedなアニメーションの実行時間はUIViewのanimateWithDuration:animations:で指定できる。その際animetedはNOにしないと反映されないから注意。
SimpleBoxes | ブロックを使ったアニメーション処理 (iPhone/iPad, Objective-C 2.0)

NSArrayのソート
NSArray、NSMutableArrayのソートはsortedArrayUsingDescriptors:を使うとだいぶ楽。
蒼い惑星: NSArrayのソート方法について

CGRectIsEmpty
CGRectが{0,0,0,0}もしくはNULLかどうかを判定する時はCGRectIsEmpty()。
CGRectのメソッド色々メモ 比較編(iOS SDK)|ふぁのれこそは半角カタカナで

Xcodeの補完が効かなくなったら
Xcodeのシンタックスハイライトが消えたり、補完が効かなくなったら、[~/Library/Developer/Xcode/DerivedData]にある該当プロジェクトのキャッシュを削除してXcodeを再起動する。
autocomplete – Xcode 4: Auto-complete & Jump to Definition broken in my Xcode 3 Project – Stack Overflow

UILabelのタッチイベントを取得する
UILabelはデフォルトだとタッチイベントがオフになってるのでuserInteractionEnabledをYESにする。
UIButton – 福井高専IT研究会OfficialWiki

デバイス回転前に回転後のサイズを取得する
デバイス回転処理前のタイミングで回転後のサイズを取得したい時はUIViewControllerのwillAnimateRotationToInterfaceOrientation:duration:内でself.viewのframe、boundsを参照する。
Bynomial Code » Handling rotations in UIViewController

透過PNGは重い
pngも含めた透過性のviewはスクロール負荷が高い。
[iOS] TableView スクロールパフォーマンスの改善 – iOS 開発ブログ Natsu’s note

viewの階層構造を出力
UIViewのrecursiveDescriptionメソッドでviewの階層構造を出力できる。
ビュー (UIView) の階層構造をダンプする非公開の便利メソッド – 24/7 twenty-four seven

NSTimerはdeallocで解放しない
NSTimerを解放するときのinvalidateはdeallocではなくviewWillDisappear:あたりで行う。
NSTimerのscheduledTimerWithTimeInterval:target:selector:userInfo:repeats:はtarget:で渡されたオブジェクトをretainするからNSTimerをinvalidateするまでtarget:に渡されたオブジェクトは解放されない。よってdealloc外でinvalidateを呼ばないとdeallocが呼ばれなくなってしまうため。
A-Liaison BLOG: NSTimerは基本的にretainせずassignでよい

CALayerの解放
CALayerの初期化は[CALayer layer]だけど解放時はlayer.contents = nilして[layer release]。
CALayerのメモリ解放(メモ)|UA LABO|ユナイティア株式会社

ファイルを右ペインに開く
Xcode4にてOption押しながらナビゲーター内のファイルを選択するとアシスタントエディタにファイルの内容を表示できる。

UIViewControllerのフロー・初期化

  1. alloc
    メモリの確保
  2. init、init〜
    データ類の初期化
  3. loadView
    viewの初期化
  4. viewDidLoad
    viewのレイアウト、データの反映
  5. viewWillAppear:(viewが画面に描画される場合)
    viewが画面に描画される直前の処理
  6. viewDidAppear:(viewが画面に描画される場合)
    viewが画面に描画された直後の処理

・メモリ不足

  1. didReceiveMemoryWarning
    不要なデータの解放
  2. viewDidUnload
    viewの解放(変数にnilを代入してアクセスを防ぐ)

デバイス回転時のUIViewController内のフロー・パターン1

  1. デバイスが回転
  2. shouldAutorotateToInterfaceOrientation:
    サポートする角度の確認
  3. willRotateToInterfaceOrientation:duration:
    view回転直前の処理
  4. viewの回転
  5. didRotateFromInterfaceOrientation:
    view回転直後の処理

・パターン2

  1. デバイスが回転
  2. shouldAutorotateToInterfaceOrientation:
    サポートする角度の確認
  3. willRotateToInterfaceOrientation:duration:
    view回転直前の処理
  4. willAnimateFirstHalfOfRotationToInterfaceOrientation:duration:
    中間角度直前の処理
  5. 中間の角度
  6. didAnimateFirstHalfOfRotationToInterfaceOrientation:
    中間角度直後の処理
  7. willAnimateSecondHalfOfRotationToInterfaceOrientation:duration:
    回転済み直前の処理
  8. viewの回転
  9. didRotateFromInterfaceOrientation:
    回転直後の処理

iOS View Controller プログラミングガイド

いろんなブレイクの種類
設定したブレイクポイントを右クリックして開いたメニューの[Edit Breakpoint]からブレイクさせる条件を設定できたり、ブレイクさせずにNSLogしたり、音を鳴らしたり、AppleScriptを実行したりできる。
Xcode4でNSLogを過去にする | みるくCocoa

実行前コードチェック
static analyzerで実行前に潜在的なメモリリーク等を検出してくれる。
Cocoaの日々: Xcode – Build And Analyze
Cocoaの日々: Xcode – Build And Analyze 〜 問題の例

NSZombie
[Product]→[Edit Scheme…]→[Run {プロジェクト名}]→[Diagnostics]→[Memory Management]→[Enable Zombie Objects]にチェックを入れると実行時エラーが発生したその場で停止してその場所でエラーを吐いてくれるようになる。
EZ-NET: Xcode4 のデバッグ環境を整える

リファクタリングショートカット
control+command+Eで[Edit All in Scope]が実行できる

公式ドキュメントのオフラインキャッシュ
Documentをオンラインで見ると遅いからローカルに保存しておく。
[xcode]→[Preferences…]→[Downloads]→[Documentation]→[Check and Install Now]

Xcodeのカラーの変更
xcode4でカラーテーマの変更は[xcode]→[Preferences…]→[Fonts & Colors]→[Theme]

Xcode4のRefactor機能
・Renameで変数名の一括変更
・Extractで一部のコードをメソッドに変換
・Create Superclassでスーパークラスの作成→継承
・Move Upで変数、メソッドをスーパークラスに移動
・Move Downでサブクラスに移動
・Encapsulateで変数をプロパティー化
Xcode 4 移行ガイド:テキストの置換とリファクタリング

UIWebViewの解放
UIWebViewをdeallocする時はwebView.delegateにnilをつっこんどく。
アプリが落ちないUIWebViewの使い方: iPhoneアプリ開発備忘録

擬似グローバル
グローバルっぽいところにいろんなもの突っ込んで受け渡しする初心者実装のススメ。
iOSゆとりプログラミングのススメ – 仕事人の開発日誌

戻るボタンを消す
ナビゲーションバーにデフォルトで表示される戻るボタンを非表示にする方法。UINavigationControllerにpushするcontroller内のviewDidLoadで[self.navigationItem setHidesBackButton:YES animated:NO]する。
チーズくんの備忘録 [iOS]戻るボタンを消す方法

オリジナルフォントを使う
プリインストールされていないフォントを使う方法。プロジェクトにttf、otfを読みこんでxxx-Info.plistに「Fonts provided by application」という項目を追加して各ファイル名をStringとして加える。あとはUIFontにフォント名をしてする。フォント名の取得はplistに追加したあと下記のコードを実行してインストール済みのフォントを出力して確認する。

NSEnumerator *e = [[UIFont familyNames] objectEnumerator];
NSString *font;
while(font = [e nextObject])
{
    NSLog(@"%@: %@", font, [UIFont fontNamesForFamilyName:font]);
}

そうだ、プログラミングしよう  フォントを組み込む方法

デフォルトUIのグラデーションを消す
UINavigationBarのグラデーションを消したい時はカテゴリからdrawRect:を上書きしてCGContextSetFillColorで塗りつぶす。iOS5以降の場合は[navigationBar setBackgroundImage:]で背景に無地の画像を敷き詰める。

UIImage* bgImage = [UIImage imageNamed: @"black.png"];
[bgImage drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
[self.navigationBar setBackgroundImage:bgImage forBarMetrics:UIBarMetricsDefault];

iphone – Remove Gradient on UINavigationBar – Stack Overflow

デフォルトのタイトルフォントを変更する
UINavigationBarのタイトルのフォント等のスタイルを変えたいときは、好きなUILabelを作ってnavigationItem.titleViewにつっこむ。iOS5以降の場合は[navigationBar setTitleTextAttributes:]で設定できる。
uinavigationbar – iPhone Navigation Bar Title text color – Stack Overflow

scrollViewDidScroll:の呼ばれるタイミング
UIScrollViewのscrollViewDidScroll:はcontentSize、contentOffsetが変化した時も呼ばれる。
Cocoaの日々: 簡易スライドビューア [17] モードの切り替え

NSTimerの解放
NSTimerにscheduledTimerWithTimeInterval:のtargetにselfを渡すと、selfがretainされる。NSTimerのinvalidateを呼ぶとreleaseしてくれる。
NSTimerインスタンスは、生成元viewControllerを保持するのは分かっていたのに、
それではまった。

A-Liaison BLOG: NSTimerは基本的にretainせずassignでよい

数値型と文字型のキャスト
NSStringからintへは[@”123″ intValue]。
intからNSStringへは[NSString stringWithFormat:@”%i”, 123]。
Objective-Cのキャスト(数値⇔文字): iphoneアプリ開発の虎の巻ブログ

BOOLの出力
BOOLは内部的にはint型なのでNSLogで出力するときはintにキャストして判定
NSLog(@”%i”, (int)b);
Objective-Cでのデバック NSLogについて – k2ダイアリー

NSArrayとNSMutableArrayのコピーの違い
copyメソッドを使った時、NSArrayは浅いコピー(shallow copy)、NSMutableArrayは深いコピー(deep copy)が実行される。要はNSArrayは参照を返して、NSMutableArrayは完全にコピーされた実オブジェクトが返される。
iPhoneアプリ開発時のメモリ管理で気をつけること – A Day In The Life

イニシャライザの種類による解放の仕方の違い
alloc、alloc+init〜、copy〜以外のメソッドで生成したオブジェクトをreleaseすると潜在的に実行されてるautoreleaseが走った瞬間に落ちる。
UIButtonはrelease不要 – 全力で気まぐれ

非同期通信ライブラリ
jsonとかxml、画像なんかを読み込んでblocksで非同期処理が書けるライブラリ。
AFNetworking/AFNetworking – GitHub
Cocoaの日々: [Info] AFNetworking

細かいレイアウトはUIWebViewを使う
処理速度求めないシチュエーションならUIWebViewで極力回避。
UIWebViewでつくるUI – yidevで発表してきました | DOTAPON Blog

Blocks
^から始まる関数はblocksというクロージャ、jsでいうとこの無名関数。
C/Objective-C + Blocks でクロージャ – TrashSUITE
Blocks Programming Topics: Getting Started with Blocks

releaseの仕方
中身がnilのオブジェクトにメッセージ送ってもEXC_BAD_ACCESSにならないので、releaseしたらすぐにnil突っ込んどく。

[view release], view = nil;

テキストの行の高さを取得する
NSStirngのsizeWithFont:forWidth:lineBreakMode:は一行の高さを取得、sizeWithFont:constrainedToSize:lineBreakMode:が複数行の高さを取得。
constrainedToSize:にheightをおっきめに設定したCGRectを突っ込む。
UITableViewCellの高さを内容に合わせて変化させる | アクトインディ技術部隊報告書

CIDから対応する文字を取得する

わけあってCIDをもとに対応する文字を取得したい。
ざっと調べてみたら、CIDと文字が対になった一覧表はこのへんにあるんだけどプログラムからは使いにくい。

プログラムから使いやすそうな資料を探してみたところ、どうもAcrobat内部ではCIDをUnicodeに変換するようなことをしてるらしいことがわかった。その変換に関する資料がこれ

すかさずこの資料の後半のMapping Fileを拝借。
CIDを投げたらCID→Unicode→String.fromCharCode()で文字を取得ってクラスを作ったんだけど、どうも取得したUnicodeが期待した文字に変換できてない。

この「Unicode」はString.fromCharCodeで変換できる「Unicode」じゃないのかなぁ?

うーん…

と思ったら、FontForgeで使ってるcidmapっていうCIDのマッピングファイルに「Adobe-Japan1-6.cidmap」ってのがあった。これをコンバートして使ってみたらうまく変換できた。ワーイ。
どうも上記のデータはAdobe-Japan2のマッピングデータらしい。なるほろ。

package
{
  
  public class CharCodeUtil 
  {
    static private var list:Array;
    
    public function CharCodeUtil() 
    {
      
    }
    
    static public function getCharFromCID(cid:uint):String
    {
      var char:String = "";
      
      init();
      
      for each (var obj:Object in list) 
      {
        if (cid == uint(obj.c[0]))
        {
          char = String.fromCharCode(uint(obj.u));
          break;
        }
      }
      
      return char;
    }
    
    static private function init():void
    {
      if (list) return;
      
      list = [
        //ここに.cidmapをArray化したデータを
      ];
    }
  }
}

macでxampp環境セットアップするメモ

xamppでローカルにサーバー環境を持ってこれれば、dropbox配下でサーバーサイドの編集ができるじゃん、ということでmac(10.7)でxamppセットアップしてみた。

インストール

1. ここからxampp落としてくる。

2. dmgからインスコ

3. Applications/XAMPP/XAMPP Controlを起動。http://localhost/にアクセスしてxamppの「ようこそ」画面が出たらひとまずインスコ成功。

セキュリティの設定

1. Terminalを起動して「$ sudo /applications/xampp/xamppfiles/xampp security」を実行。

2. xamppのパスワード設定、MySQLの外部ネットワークからのアクセスを許可するかの設定、MySQLのパスワード設定、phpMyAdminのパスワード設定が順番に実行される。

3. http://localhost/xampp/security.phpでセキュリティのステータスを確認。すべて安全になっていたら完了。
(ちなみに各サービスへのアクセスに必要なIDはxamppに設定されてる)

VirtualHostの設定

1. 「/Applications/XAMPP/xamppfiles/etc/httpd.conf」を開き、

# Include /Applications/XAMPP/etc/extra/httpd-vhosts.conf

をコメントアウトし、httpd-vhosts.confの設定を読み込むようにする。

2. 「/Applications/XAMPP/etc/extra/httpd-vhosts.conf」を開き、httpd.conf内で設定されていたhttp://localhost/xampp/の設定を移す。

<VirtualHost *:80>
    DocumentRoot "/Applications/XAMPP/xamppfiles/htdocs"
    ServerName localhost
</VirtualHost>

<Directory "/Applications/XAMPP/xamppfiles/htdocs">
    Options Indexes FollowSymLinks ExecCGI Includes
    AllowOverride All
    Order allow,deny
    Require all granted
    Allow from localhost 127.0.0.1
</Directory>

3. 表示したいアドレスとローカルのディレクトリを割り当てる。

<VirtualHost *:80>
    ServerName {表示したいアドレス}
    DocumentRoot "{ローカルディレクトリ}"
</VirtualHost>

4. 設定したアドレスへのアクセス権限を設定する。

<Directory "{3で設定したローカルディレクトリ}">
    Order allow,deny
    Require all granted
    Allow from {公開する範囲、Allとかlocalhost}
</Directory>

5. NameVirtualHost *:80がコメントアウトされていたら、これもコメントを外しておく。

6. こんな感じ。

NameVirtualHost *:80



<VirtualHost *:80>
    DocumentRoot "/Applications/XAMPP/xamppfiles/htdocs"
    ServerName localhost
</VirtualHost>

<Directory "/Applications/XAMPP/xamppfiles/htdocs">
    Options Indexes FollowSymLinks ExecCGI Includes
    AllowOverride All
    Order allow,deny
    Require all granted
    Allow from localhost 127.0.0.1
</Directory>



<VirtualHost *:80>
    ServerName hogehoge.local
    DocumentRoot "/Users/bouze/htdocs"
</VirtualHost>

<Directory "/Users/bouze/htdocs">
    Order allow,deny
    Require all granted
    Allow from localhost 127.0.0.1
</Directory>

7. hostsファイルにhttpd-vhosts.confで指定したアドレスを追加しておく。GUIでhostファイルを編集できるHosterがよい感じ。

8. 設定したアドレスにアクセスしてローカルのファイルが表示されたら成功。
※「要求されたディレクトリへのアクセス権限がありません。」的なエラーが出る場合はローカルディレクトリをさかのぼってパーミッションが読み取り可能な状態になっているか確認する。

FlashPlayer 11.1.102.55で静止テキストフィールドのサイズがバグる

こんな感じに膨らむ。