Category Archives: Tryout

WebWorkerで爆速プリロード

HTMLで画像とか動画とかのリソースをページが表示される前にプリロードするパターンあるじゃないですか、あれでちょっと思いついたのがあるんでメモしときます。

以前やったPOOL inc.のトップページ、例のごとく最初にビデオをある程度プリロードしてから再生してるんですが、本数が40本程あって全部の読み込みを待つのさすがにダルいよねってことで2, 3本読み込んだら再生をはじめて、残りのビデオは裏で読みってやってみたんですが、この読み込みの処理がなかなかヘビーでして、再生してるビデオがコマ落ちしてまともに再生されないんです。

どうしよう、どうしようということで読み込み処理をビデオの再生とは別のスレッドにしてみたんです。HTML5のAPI、Web Workerで。すると狙いどおりビデオがコマ落ちすることなくバックグラウンドで読み込みができるようになりました。40本同時に並列でダウンロードしても処理落ちせず爆速です!(Workerが使えない環境の場合は同一スレッドで、しかもビデオの再生を邪魔しないように全部のビデオを読み込むのを待つようにしてるので段違いに遅い)

大量の画像をプリロードしてからはじまるサイトとかでもWorkerを使って分散すればずいぶん高速化できるんじゃないでしょうか。

ソースはこんな感じです。簡略化してるけど。main.coffeeから呼び出したPreload.coffeeまでが最初のスレッドで、Preload.coffeeがload.coffeeを別スレッドで実行してつつ読み込みが終わるのを待ってるという流れ。

※コード内のdefineはrequire.jsを使ってる想定

関連:
POOL inc. | blog.bouze.me

Require.jsを試してみた

Require.jsはActionScriptのimportのようにjsファイル同士の依存関係を崩さないよう非同期で読み込みつつ、多重読み込みなども防止してくれるライブラリ。
Require.jsを使えば細かくjsファイルを分割してもBackboneやjQuery等のライブラリを依存関係を保ちつつ読み込んでみる。

最小限のコードで挙動を確認してみる。(以降すべてCoffeeScript
これを実行するとMyModelのmessageに定義された「Hello, World!」が出力される。
Backboneに必要なUnderscoreとjQueryはBackboneより先に読み込まれている。

require([
	"libs/jquery-1.10.1.min"
	"libs/underscore.min"
	"libs/backbone.min"
],
($, _, Backbone) ->
	MyModel = Backbone.Model.extend({
		message: "Hello, World!"
	})

	MyView = Backbone.View.extend({
		initialize: (options) ->
			console.log @model.message
	})

	view = new MyView({
		model: new MyModel()
	})
	@
)

今度はRequire.jsの機能のdefineを使ってモジュールを作ってみる。
こちらも同じく「Hello, World!」が出力される。

define("myModule",
[
	"libs/jquery-1.10.1.min"
	"libs/underscore.min"
	"libs/backbone.min"
],
($, _, Backbone) ->
	MyModel = Backbone.Model.extend({
		message: "Hello, World!"
	})

	MyView = Backbone.View.extend({
		initialize: (options) ->
			console.log @model.message
	})

	return {
		modelClass: MyModel
		viewClass: MyView
	}
)

require([
	"myModule"
],
(module) ->
	model = new module.modelClass()
	view = new module.viewClass({
		"model": model
	})
	@
)

require.configのshimでライブラリの依存関係をあらかじめ設定してみる。
実行結果は同様。

require.config(
	shim:
		"libs/backbone.min":
			deps: [
				"libs/jquery-1.10.1.min"
				"libs/underscore.min"
			]
			exports:
				"Backbone"
)

define("myModule",
[
	"libs/backbone.min"
],
(Backbone) ->
	MyModel = Backbone.Model.extend({
		message: "Hello, World!"
	})

	MyView = Backbone.View.extend({
		initialize: (options) ->
			console.log @model.message
	})

	return {
		modelClass: MyModel
		viewClass: MyView
	}
)

require([
	"myModule"
],
(module) ->
	model = new module.modelClass()
	view = new module.viewClass({
		"model": model
	})
	@
)

今度はrequire.configのpathsを使ってライブラリのパスをあらかじめ定義しておく。
こちらも実行結果は同様。

require.config(
	paths:
		"jquery": "libs/jquery-1.10.1.min"
		"underscore": "libs/underscore.min"
		"backbone": "libs/backbone.min"
)

define("myModule",
[
	"jquery"
	"underscore"
	"backbone"
],
() ->
	MyModel = Backbone.Model.extend({
		message: "Hello, World!"
	})

	MyView = Backbone.View.extend({
		initialize: (options) ->
			console.log @model.message
	})

	return {
		modelClass: MyModel
		viewClass: MyView
	}
)

require([
	"myModule"
],
(module) ->
	model = new module.modelClass()
	view = new module.viewClass({
		"model": model
	})
	@
)

今度はshimにもpathsで定義したパスを使ってみる。

require.config(
	paths:
		"jquery": "libs/jquery-1.10.1.min"
		"underscore": "libs/underscore.min"
		"backbone": "libs/backbone.min"

	shim:
		"backbone":
			deps: [
				"jquery"
				"underscore"
			]
			exports:
				"Backbone"
)

define("myModule",
[
	"backbone"
],
() ->
	MyModel = Backbone.Model.extend({
		message: "Hello, World!"
	})

	MyView = Backbone.View.extend({
		initialize: (options) ->
			console.log @model.message
	})

	return {
		modelClass: MyModel
		viewClass: MyView
	}
)

require([
	"myModule"
],
(module) ->
	model = new module.modelClass()
	view = new module.viewClass({
		"model": model
	})
	@
)

require.configでの設定は一度きりなのでこれを無視すると、メインのコードはだいぶスッキリした。

参考:
RequireJS moduleについて – 文殊堂
java-ja.js #2 RequireJS実践編 – 文殊堂
[JS] JavaScriptをモジュール分割して開発できるRequireJSに入門 – YoheiM .NET

YouTubeにアップロードした動画の広告を非表示にする方法

自分がYouTubeにアップロードした動画に表示される各種広告がウザいので調べてみた。動画が始まる前に再生される動画(TrueViewインストリーム広告)や、動画の下からポコッと出てくるバナー(InVideo広告)を出なくする方法。(2012.07.06時点)

自分のアカウントの設定→デフォルトの「収益を受け取りを有効にする」のチェックを外す。一応「広告フォーマット」の項目も全てチェックを外しておく。

この状態で広告が出なくはなったものの念のために動画の編集ページに飛んで「収益受け取り」タブを表示して「動画の収益化」をオフ。

YouTube内での設定項目はアカウントによって違うこともあるようでこの通りではないけども、要はアカウントの収益受け取りをオフにして、動画の収益化をオフにすれば広告はでなくなる模様。

知識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力でとりあえず動くものは作れるようになった気がする。
あと開発中にハマったとこはこっちにメモ

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

python2.7セットアップメモ

windows7環境でpythonをセットアップするメモ。

公式から「Python 2.7.1 Windows Installer」をダウンロード。

インストーラーからウィザード通りにインストール。

コマンドプロンプトにpythonコマンドを追加するために「マイコンピュータ」→「プロパティ」→「システム詳細設定」→「環境変数」→「システム環境変数」の「Path」にpythonのインストールディレクトリとScripsフォルダのパスを「;」区切りで追加する。

コマンドプロンプト上でpythonコマンドが実行できればpythonのインストールはOK。

ライブラリ簡易インストール用のeasy_installを落としてきてインストール。
(pythonのバージョンに対応したバージョンを選ぶ)

以降はライブラリ内にsetup.pyのあるディレクトリを引数にして実行する。
ex)
easy_install c:nose-1.0.0

unit test用のnoseをインストールしておく。

numpyをダウンロードしてインストール。

import numpy
numpy.test()

が実行できれば準備完了。

numeric wonder