メモメモ。俗に言う拡張開発時に開発用プロファイルを作るってやつ。ターミナル開いて以下コマンド。
$ /Applications/Firefox.app/Contents/MacOS/firefox-bin -ProfileManager
ちなみに、
$ /Applications/Firefox.app/Contents/MacOS/firefox -ProfileManager
って打つとSnowLepard以下エラーが出力され速攻でクラッシュする。
$ /Applications/Firefox.app/Contents/MacOS/firefox -ProfileManager
dyld: Library not loaded: /usr/lib/libsqlite3.dylib
Referenced from: /System/Library/Frameworks/Security.framework/Versions/A/Security
Reason: Incompatible library version: Security requires version 9.0.0 or later, but libsqlite3.dylib provides version 1.0.0
/Applications/Firefox.app/Contents/MacOS/run-mozilla.sh: line 131: 529 Trace/BPT trap "$prog" ${1+"$@"}
iPhoneアプリのプロジェクトでやりたくなったので、そのセットアップ方法をメモ。
リポジトリの作成&import
MacOSXにはデフォルトでSubversionコマンドが入っている。ウマ〜。
$ svnadmin create /path/to/repo $ svn import -m "commit message" /path/to/project file:///path/to/repo/project
importしただけだとワーキングコピーにならないので、一度削除してチェックアウトする。
rm -fR /path/to/repo/project svn co file:///path/to/repo/project /path/to/project
Tracのインストール&プロジェクト作成
これまたeasy_installがデフォルトで使用可能。ウマ〜。
$ sudo easy_install Trac $ trac-admin /path/to/trac initenv
trac-admin initenvで対話的に入力していくが、必須なのはプロジェクト名とリポジトリパス。前者は適当に、後者は先ほど作成したリポジトリパスを。
tracd起動
ローカルでちょっとみたいだけなのでtracdで。ターミナル上で以下コマンドを叩く。
$ tracd --port 8000 /path/to/trac
ブラウザ閲覧
http://localhost:8000/にアクセス。
やっぱり開発はMacOSXだ
痛感!
swcコンパイル時のパラメータのみで、インターフェースクラスは同じだけどまったく挙動の異なるライブラリを作りたいというなかなかニッチな要件に出くわしたので、c/c++で言う条件付コンパイルをmxmlcでやりたくなった。で、オンラインドキュメントを読んでみたところ、しっかりと記述あり。
コードブロックの条件付けやインライン定数、グローバル定数の定義などなどが可能と。というわけでファクトリパターンを駆使すればコンパイル時のパラメータのみで実行クラスを変更できますねと。
package {
public class HogeFactory {
static public function createHoge():IHoge{
var flg:Boolean = CONFIG::value;
if(flg)return new Hoge1();
else return new Hoge2();
}
}
}
みたいなファクトリクラス作っておいて、
-define=CONFIG::value,true
ってやれば、HogeFactory.createHoge() はHoge1インスタンスを返して、
-define=CONFIG::value,false
ってやれば、HogeFactory.createHoge() はHoge2インスタンスを返すみたいな。
ちなみに
FlexSDK2でのコンパイル時にdefineパラメータを使用すると「そんなパラメータ無いよ」的なエラーで終了するので、やっぱりFlexSDK3から実装された機能なんですね。つーかコンパイラも地味に機能増えてるんだな。
ちょっと萌えた。
$ java -version java version "1.6.0_15" Java(TM) SE Runtime Environment (build 1.6.0_15-b03-219) Java HotSpot(TM) 64-Bit Server VM (build 14.1-b02-90, mixed mode)
最近、関数型言語ってなんぞや?と思ったのでScalaについて勉強してみようかと思って本買ってみた。
結構ボリューミーで全然読み込めてないが、序盤の概要的なメモ。読み進めながらエントリーにメモ残したい。
関数型言語とは
そもそもの発端は「オブジェクト指向型言語の次は関数型言語ですよー」と誰かがおっしゃっていたから。でも関数型言語って歴史的には相当古いのね。関数型の特徴としては以下?
- 関数を一人前の値(first-class values)として扱うこと
- 関数はどんな副作用も持たない
前者を詳しく言うと、関数型言語では、関数は整数や文字列と同格の値で他の関数に値として渡したり、他の関数から処理結果として返したり、変数に格納したり、リテラルとして記述したりできること。
後者は読んで字のごとく。副作用があるとはオブジェクト指向的に言うと、あるオブジェクトのメソッド呼んだら他のオブジェクトのプロパティが更新されてた、みたいな。その逆で副作用がないとは、関数は入力として与えられた引数によって得られる結果だけをアウトプットするべき、という概念。で、そんな背景で関数型言語には変数が無かったりする(全部定数)。
で、Scalaって?
関数型言語とオブジェクト指向型言語のいいとこどりです。どちらでも書けます。
Scalaの細かい説明をするならば、ScalaはJavaで動く処理系であり、Scalaのコードは最終的にはJavaのバイトコードとなって実行される。なのでJavaライブラリのクラスは当たり前に呼べるし、ScalaのライブラリはJavaのコアAPIから継承したクラス群となっている。そして関数型うんぬん、Scalaの最大の魅力はそんなとこではなく、非常に拡張性の高い言語設計がなされているところ。基本的な演算子はなくて、すべてメソッド呼び出しという。制御文すらも。というわけで新しい制御構文も作ろうと思えばいくらでも作れちゃうぐらいのスケーラビリティがあると。実際そこまで読んでないから知らんが。
オブジェクト指向型 vs 関数型
どっちが優れているとかの議論はむずかしいので言及はしない(できない)。ただ関数型の「関数は副作用を持たないもの」というアプローチは保守性の高いプログラムを書くためには重要なことだと痛感。オブジェクト指向型でも出来ることだしね。言語的な制約となっているのは(個人的に)魅力的。てーか最近、副作用しかないメソッド書くやつ多すぎで困る。もうなんなの、嫌がらせ?って思うぐらい。グチですが。
とにもかくにも、JavaなりActionScript3なりRubyなりJavaScriptなりなオブジェクト指向的にプログラミングやっている人は関数型言語の学習をしてみるとよいかと思います。
というか本当に興味本位なのは純関数型言語だから、次はLisp本でも買うか。
もうアホかと。とりあえず情報としてログを。
事象
iPhone繋いだ直後の同期処理でiTunesがフリーズ。応答なし。
解決策
前回接続した時からiPhone端末からダウンロードしたPodcastをすべて削除。その後接続。ちなみに前回からの〜転送しますか?という確認が出たら転送するほうを選択(転送しないを選択すると強制終了しました×2回)。
たぶんやらないほうがいいこと
iPhone上でコンテンツダウンロードするのってやらないほうがいいってことですか?とりあえず俺はもうしない。全部iTunes上でコンテンツダウンロードします。。。
UITableViewとUITableViewControllerあたりの導入。1週間ほどでやっとInterfaceBuilderの使い方が分かってきた。たぶんTableViewを使うには一番簡単なxibでUITableViewControllerを突っ込むやり方をメモ。
まずはプロジェクトの作成
プロジェクトテンプレートはWindow-based Applicationとして、プロジェクト名は「TableViewTest」とする。作成した直後の主なリソースは以下。
xibファイルの編集
MainWindow.xibを開く。ライブラリからUITableViewControllerをドラッグ&ドロップして追加。ライブラリが表示されていなかったらTools->Libraryで開く。UITableViewControllerはこいつ。
突っ込むとこうなるはず。
TableViewTestAppDelegateから追加したUITableViewControllerへアクセスするための準備を行う。Tools->Identity Inspectorを表示して、Class OutletsにUITableViewControllerを追加する。といってもここはソースにプロパティとして定義するので、TableViewTestAppDelegate.hのリンクからソースを開いて修正。tableViewControllerプロパティを追加する。
#import <UIKit/UIKit.h>
@interface TableViewTestAppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;
UITableViewController *tableViewController;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UITableViewController *tableViewController;
@end
ソースを保存すると情報が抽出される。以下のように表示が追加されればおk。
続いて定義したTableViewTestAppDelegateのtableViewContollerをxib上のUITableViewControllerと関連付ける。Tools->Connection Inspectorを開いてtableViewControllerのカラムの右丸からドラッグ開始してxib内のUITableViewControllerへドロップ。青い線が引っ張られて、ドロップ完了後にカラムの右項にUITableViewControllerが設定されれば完了。
UITableViewControllerのviewを追加
TableViewAppDelegateからUITableViewControllerにアクセスできるようになったので、初期化処理内でviewを取り出しUIWindowへ追加。実はUITableViewControllerをxibに追加しただけではviewは表示階層に追加されてないってーことですね。TableViewAppDelegate.mは以下のようになります。
#import "TableViewTestAppDelegate.h"
@implementation TableViewTestAppDelegate
@synthesize window;
@synthesize tableViewController;
- (void)applicationDidFinishLaunching:(UIApplication *)application {
[window addSubview:self.tableViewController.view];
// Override point for customization after application launch
[window makeKeyAndVisible];
}
- (void)dealloc {
[window release];
[super dealloc];
}
@end
アプリの実行
とりあえずここまでのソースで実行。以下ように素っ気ない空のUITableViewが表示されるはず。
TableViewを操作する
現時点の構成だとUITableViewを操作するのはコントローラーのUITableViewControllerの役割。なのでユーザーコードを差し込むために今の構成のUITableViewControllerをUITableViewControllerを継承したカスタムクラスに置き換える。xcodeにてファイルを新規に作成し、Cocoa Touch Class->Objective-C classを選択し、Subclass of の項を「UITableViewController」を選択。
クラス名をMyTableViewControllerとする。
再度Interface Builderへ戻り、UITableViewを選択し、Identity InspectorのClass IdentityのClass欄を先ほど新規作成したMyTableViewControllerへ変更。
MyTableViewController.mにUITableViewを操作するためのメソッドのスケルトンが定義(or コメントアウト)されているので、それを修正することでUITableViewの設定を行うことが可能。いくつかデータを流し込んでみる。
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 3;
}
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
// Set up the cell...
switch (indexPath.row) {
case 0:
cell.textLabel.text = @"1st item";
break;
case 1:
cell.textLabel.text = @"2nd item";
break;
case 2:
cell.textLabel.text = @"3rd item";
break;
}
return cell;
}
これを実行すると以下。
ことはじめはこんなもんで。
実は先週のSDK3.0アップデイトで再度Agreementに同意しなさいって画面が出てる時点で項5.1からNDAというキーワードが消えていたのは気づいてたのだが。。。つたない英語力で超絶要約するとこんな感じ?
- pre-releaseな内容はあいかわらずApple Confidential Informationですよ
- commercial releaseなものはconfidentialではありません
つまりだ、これまではAppStoreにリリースしたアプリに関するものだけがNDAの対象から外れるってとこから、AppStoreへのリリースに関わらずAppleがiPhone Developer Programの中で正式にリリースしている情報すべてがNDAの対象に外れるっつーかNDA撤廃!みたいなことだよね。いやね、あまりにも英語理解力が乏しくて自信がなかったわけで、まぁそのうち各ニュースサイト取り上げてくれるからそれで詳細は明らかになるよねって思ってたらどこもニュース取り上げないでやんの(あくまで自分がキャッチアップしてる範囲では)。まぁリリースしちまえばOKってことで書籍などなど大量に世に出回ってるので、いまさらNDA撤廃したとこでそんなインパクトないよねって言われればそうかもしれないけど、気兼ねなくiPhoneネタを書けるようになった開発系日本人ブロガーにとったらうれしいことだよね。あ、海外のコアなブロガーは平気でInternalなSDKネタ書いてるのであえて「日本人ブロガー」と言ってみる。
今日の趣旨
iPhone SDK の NDA に関する理解を間違えてたら、やさしくツッコミくださいm(_ _)m
なんかこの記事読んでエキサイトしてしまった。
via Inside RIA - FlashBuilder 4 will support FlexUnit 4
ちゃんとFlash Builder内のパースペクティブでユニットテストサマリーが表示されるよう。Javaのアノテーションを代替するのはもちろんメタデータタグ。こうなるらしい。
package flexUnitTests
{
import com.elad.framework.utils.Helper;
import flash.display.Sprite;
import flexunit.framework.Assert;
public class FlexUnitTester
{
// Reference declaration for class to test
private var classToTestRef : com.elad.framework.utils.Helper;
//--------------------------------------------------------------------------
//
// Before and After
//
//--------------------------------------------------------------------------
[Before]
public function runBeforeEveryTest():void
{
// implement
}
[After]
public function runAfterEveryTest():void
{
// implement
}
//--------------------------------------------------------------------------
//
// Tests
//
//--------------------------------------------------------------------------
[Test]
public function checkMethod():void
{
Assert.assertTrue( true );
}
[Test(expected="RangeError")]
public function rangeCheck():void
{
var child:Sprite = new Sprite();
child.getChildAt(0);
}
[Test(expected="flexunit.framework.AssertionFailedError")]
public function testAssertNullNotEqualsNull():void
{
Assert.assertEquals( null, "" );
}
[Ignore("Not Ready to Run")]
[Test]
public function methodNotReadyToTest():void
{
Assert.assertFalse( true );
}
}
}
Flash Builder 5 ぐらいでカスタムメタデータみたいのが出来るようになってJavaのアノテーションばりにメタメタ出来るうになればいいのにね。
Flex 4 SDK betaがAdobe labsで公開されていろいろと変わっているよう。FXG対応は言わずもがなとして、ソースの書き方的な部分のメモ。しかしFlash Builderって響きに馴染めない俺がいる。
コアなNamespaceが3つ
詳細はここに。
- xmlns:fx="http://ns.adobe.com/mxml/2009"
- xmlns:mx="library://ns.adobe.com/flex/halo"
- xmlns:s="library://ns.adobe.com/flex/spark"
Top-Levelクラス(ObjectとかArrayとか)とMXMLでのみ有効なコンポーネント(ScriptとかStyleとか)がこの名前空間に。
Flexの mx.* パッケージ、通称「halo」がこの名前空間に。Flex 3までのコンポーネントがいると思えばよし。
Flex 4で新しい spark.* パッケージ、通称「spark」とテキストフレームワークの flashx.* がこの名前空間に。ここが完璧にFlex 4 で追加されたコンポーネント群。
ってなわけで追加分を名前空間で分けたのですね。ちなみにプリフィクスはAdobeの推奨値ってことかと。Flash Builder使えば自動挿入であろうから気にしなくていいんだろうが。
sparkのView Stateが素敵な予感
詳細はここ。Stateコンポーネント以下にビューの状態を記述するのではなく、個々の子コンポーネントに対して該当ビュー時の状態変化を子コンポーネントの属性として記述する。たしかにこれまではビュー毎に変化する子コンポーネントの状態をそのStateコンポーネント以下毎に記述しなきゃならなかったので記述が飛び飛びになってイマイチな感じがしてました。素敵。
双方向Bindingが簡単に
詳細はここ。@{source}って記述が新しい。あとBindingコンポーネントにtwoWayプロパティが素敵すぎる。
スタイルのセレクターがパワーアップ
詳細はここ。idセレクタとdecendantセレクタが新たに使用可能となりましたと。しかしtypeセレクタ用にNamespace宣言せにゃいかんのは如何なのかと。
まだbetaなんだよね。
これ以上変わると時代の流れについていける気がしない。つーか今からFlex始める人からしたらまた学習コストが高くなるこのジレンマ。

