2009年11月3日火曜日

Action Script 3.0 初心者勉強会

に行ってきました。
その時のメモを残します。

1.インストール


とりあえずflash developのインストール。
何か起こられる場合は.Net Frameworksのバージョン2.0以上をインストール。
それでも駄目なときはjavaのランタイムをインストール。

無事にflash developのインストールができたら、flex SDKをインストール。
インストールと言ってもダウンロードファイルを展開して適切なフォルダにおいてあげればよし。

2.開発まで


①flash developを開く。

②新しいプロジェクトを作る
Project -> New Project -> AS3 Project
その際、Create directoryにチェックを入れるとよし。

③Flex SDKへの関連付けを設定する。
Tools -> Program Settings AS3Context -> Flex SDK Locationにflexの展開フォルダを指定

④動かしてみる。
再生ボタン( > ←こんなの)をクリック -> 白い画面が出てくる

④画面サイズを変えてみる
Project -> Propaties -> サイズを300x300に

3.開発してみよう


プロジェクトを新しく生成するとある程度ソースが出来上がるので、それを少々修正しながら作成。

①画面に文字を出す。
以下の例だと、画面上に'init'と表示されます。

private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
this.init_status_field();
}
private var status_field:TextField = new TextField;
private function init_status_field():void
{
this.status_field.text = 'init';
addChild(this.status_field);
}

②フォーマットを変える。
先ほどのコードに以下のコードを追加すると、文字のフォーマットを変更できます。下の例だと文字の大きさを変えています。

private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
this.init_status_field();
this.init_status_format();
}
private function init_status_format():void
{
var format:TextFormat = new TextFormat;

format.size = 18;
this.status_field.defaultTextFormat = format;
// this.status_field.setTextFormat( format );
}

③クリックに対応する。
いよいよ双方向のアクションの取り入れに。addEventListenerというメソッドによりアクションがあった時の行動を指定することができます。
下の例だとマウスアクションがあった時の動作を指定しています。
具体的にはマウスクリックすると、文字が'CLICKED'に置き換わります。

private function init_status_field():void
{
this.status_field.text = 'init';
this.status_field.addEventListener( MouseEvent.CLICK, status_clicked );
addChild(this.status_field);
}
private function status_clicked( e:MouseEvent ):void
{
this.status( 'CLICKED' );
}
private function status( str:String ):void
{
setChildIndex(this.status_field, numChildren -1);
this.status_field.text = str;
}

④画像を表示する。
画像も一つのクラスとして定義し、定義した画像クラスのオブジェクトを貼り付けてあげれば画像も表示させることができる。
ちょっと特殊な書き方をしますが、下のように書いてあげると大丈夫。

private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
this.init_status_field();
this.init_status_format();
this.init_bitmap();
}
[Embed(source = "../sample.gif")] private static const SAMPLE:Class;
private function init_bitmap():void
{
var bitmap:Bitmap = new SAMPLE as Bitmap;
addChild(bitmap);
bitmap.x = 100;
bitmap.y = 100;
}


2時間弱の勉強会だったのでここまでしかいかなかったのが残念。
もっと動きをつけれるようなところまで行きたかったけど2時間だとここまでが限界かもね。
でも一人でやってたらすごく時間がかかったであろう設定をすぐに完了できたのは勉強会に参加したからだと思う。その意味でも参加した価値は十分。

あと、やっててすごく便利だと思ったのが、ソースを書いていくにつれ必要なパッケージが自動的にインポートされていくってこと。
すごく便利よ。

2009年10月25日日曜日

配列操作のちょっと不思議な挙動~配列は参照型?~

配列操作で直感的に違和感を感じた。


> a = [1,2,3]
> b = a
> a[0] = 0
=> b = [0,2,3]


bにaを代入して、aの中身を書き変えたらbの値まで書き変わってしまうらしい。
感覚的にはbはコピーしたもので全く別ものだから内容は書き変わってほしくないものだけど。

ちょっとググってみたらpythonで似た様な現象について紹介されてたから、rubyでもちょっと試してみた。
参考: http://weblog.imaginaryworld.org/2008/05/blog-post_08.html


> a = [1,2,3]
> b = Array.new a
> a[0] = 0
=> b = [1,2,3]


うん。できた。
新しいオブジェクトを作ってあげてそれを代入すれば問題なし。

さて、じゃ、ここでこちらにもあるディープコピー問題はどうするんだろ?って思って試してみた。


> a = [1,2,3]
> b = [a, 1]
> c = Array.new b
=> c = [[1,2,3], 1]
> a[0] = 0
=> b = [[0,2,3], 1]
=> c = [[0,2,3], 1]


うん。
cは新しいオブジェクトを作って代入したにも関わらずaの変更が反映されている。
bのオブジェクトのコピーがaを参照しているからダメらしい。

対処として、cloneやdepなんかの配列のコピーが大丈夫か?と思ってやってみたけど、駄目だった。cloneやdupは浅いコピーであり、オブジェクト自身を複製するだけで、オブジェクトの指している先を複製するわけではないとのこと。そりゃ新しく配列オブジェクトを作成したさっきと同様の結果になる。

どうすればいいんだろ?ってことでさらにググってみたら以下の方法でディープコピーができるらしい。


> a = [1,2,3]
> b = [a, 1]
> c = Marshal.load(Marshal.dump(b))
=> c = [[1,2,3], 1]
> a[0] = 0
=> b = [[0,2,3], 1]
=> c = [[1,2,3], 1]


うん、できた。
ファイルに書き出してそれをまた配列に戻す。

なんという力技。

2009年10月18日日曜日

Map Reduce ~ クラウド勉強 in ruby business commons

クラウドの技術要素としての並列分散処理システムMap Reduceについて勉強してきました。

内容としてはざっとこんな感じだったと思う↓
http://d.hatena.ne.jp/naoya/20080511/1210506301
rubyで書いてあげれば結構シンプルに書けるのだとか。

基本的には技術屋さん向けの勉強会というわけではなかったにせよ内容をその場ですべて理解することはできませんでした。


今やっていることのバッチ処理が2~4時間くらいかかっています。
それもまだ完全ではなくて、本来やりたいことまでやろうとすると数十倍の処理能力が欲しかったりする。

しょっぽいパソコンたくさん集めてMap Reduceの並列分散処理を組みこんであげればやりたいことの実現ができるんじゃないかなぁなんて。

そんな妄想を感じている今日この頃。

2009年10月12日月曜日

早速iPhoneアプリ開発~Hello World!~

macで早速iPhoneアプリの開発をやってみた。

プログラミングのはじめといえば"Hello World!"

参考資料はこちら
若干グロテスクなデザインですが、こういうちょっと砕けた本のがわかりやすい。

言語構造とかデータや関数の関連とかまだまだよくわかってないけど1時間弱くらいでHello Worldとタップして何かしらのアクションがとれるアプリの作成が完成。
(一番時間がかかったのはmacの使い勝手がわからなかった当たりかもw)

プログラムの背景は今後理解してけばいい。


基本的にはアプリ開発方法としてはプログラミング的開発方法と、GUI的開発方法の2種類があるらしい。
開発スピード的にもGUI的開発の方がよさげと思われ。

また、アプリは下位互換性が保証されているので基本的に下位OS用のSDKで作成したアプリは上位のOSでも動く。が、逆は偽なり。当たり前か。
上位OS用のAPIを使いたい場合は対象ユーザの動向を見てからですね。

mac book air導入&Snow Leopardでのemobile設定

mac book airデビューしました!

うっすいPC欲しくてさ。
iPhoneアプリ開発とかちょっと興味あってさ。

ついに導入していしまいました。
新卒半年でためたお金が完全パァですよ、全くもう。


とはいえ導入したのは1週間前。
ネット環境としてemobileを使おうと思ってたんだけど、Snow Leopardはemobileの設定上の不具合があるみたいでなかなか導入できていませんでした。

とはいえ導入がそんなに難しかったわけじゃなくてその時間が取れてなかっただけなんですけどね。
以下の通りにやれば何のその。

http://www.kbuild0231.org/2009/08/29/snowleopard_d02hw_clearinstall/


これで電車の中でもカフェでも。
自分の好きなところがオフィスになるわけだね。

楽しみ♪

2009年10月11日日曜日

集合知プログラミング勉強中。

集合知プログラミングについて勉強中です 参考:集合知プログラミング
集合知プログラミングとは、多数のデータが存在する中から有益な情報を得るための手法の一つで、簡単にいえばみんなが好きなものは僕も好き。似たような人が好きbなものは僕も好き。みたいなそんなプログラミング(若干語弊あるか?)。

以下は使えそうかなと思われるな技術についていくつかまとめてみました。

①クラスタリング


あるデータ群があった時に自動的に分類を行うための技術。
データ群が何かしらの属性を持ち、その属性を数値化できるとき、この手法を適用することができる。
クラスタリングを行う手法としては、k平均法や階層型クラスタリングが主流。
k平均法に比べ、階層的クラスタイリングのほうが汎用的で使い勝手がよさそう。
教師なし学習の1つ。

②ベイジアン分類器


あるデータ群があった時に、そのデータが分類されるべきカテゴリ名までわかっている時、ベイジアン分類器が有力。
基本的には教師となるデータ群があり、それらデータ群を元に分類器のパラメータ調整を行うことで分類器が完成する。
分類器完成後は未学習のデータであっても分類を行うことができる。これを汎化という。教師あり学習の1種。

③ニューラルネットワーク


あるデータ群があった時に、そのデータが分類されるべきカテゴリ名までわかっている時、分類器を作るための手法の一つ。
つまり、ベイジアン分類器とできることとしては同じ。
ニューラルネットワークはその名の通り、ニューラル、すなわち神経細胞のネットワークを模倣した数学モデルにて構築される。

ベイジアン分類器との違いは、ベイジアン分類器がデータ群を線形に切り分けるのに対して、ニューラルネットワークはより一般化した形の任意の関数にて切り分けることができること。すなわちより複雑なデータ分類器を構築することが可能。

一方、ベイジアン分類器に対する弱みも複数存在する。

ネットワークの規模を決める定量的指標が存在しない。
ある一定の経験則に基づく中間層や入力層の決め方は存在するが、データセットの統計上の特徴に左右される。

また、ベイジアン分類器はトレーニングの速度と、巨大データセットに対する問い合わせ速度に強みを持つ。高速演算が必要な局面にて効果を発揮する。
また、分類のされ方がニューラルネットワークではわかりにくいのに対して、ベイジアン分類器は統計情報に基づくためわかりやすい。

③決定木分類


あるデータ群があった時に、そのデータが分類されるべきカテゴリ名までわかっている時、分類器を作るための手法の一つ。
これもベイジアン分類器やニューラルネットと同様のデータセット群を分類するために用いられる。

最終的な学習結果が、決定木と呼ばれるツリー構造になるのが特徴。
データセット群を学習させると、最終的にはYes/Noゲームを自動的に生成するようなイメージ。
学習済みモデルの解釈が最も直観的にわかりやすい。
学習済みモデルの解釈が非常にわかりやすい。
また、非常に重要な要素がツリーのトップに出てくることが他の分類木に対する強みといえる。

2009年8月7日金曜日

railsでdebugが楽にできるようになりました ~ruby-debug

ruby-debugが便利。

今までは、デバッグを行うときに、流れるログを見ながら

p "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"


なんてものを目印にエラーがどこで出ているか、
また、関連個所に変数の値が正しいかどうかを表示させながらデバッグをしていたわけなんですけれども、ruby-debugを使うと便利。
止めたいところで止めてくれるから。
そこでいろんな変数を見ることができるから。

以下設定手順。

1.gem install ruby-debug
2.処理を途中で止めたい部分で、「debugger」と記述。viewの場合は「<% debugger %>」を記述。
3.実行
4.debuggerと書いたところで一時停止するので、そこでデバッグ用のコマンドを叩く。

以上。

デバッグ用のコマンドは以下のものを使うと便利そう。
list: ソースの表示
var: local ローカル変数一覧表示
pp: 変数名 変数の表示
frame: コールスタック表示
step: ステップイン実行
next: ステップオーバー実行
cont: 実行再開