2008年7月 Archives

« 2008年6月 2008年8月 »

$の使い方

AS3の命名規則で"$"を使うことが出来るんだけど、具体的にいつ使えばいいのか長らく謎だった。けど、「Flex SDK coding conventions and best practices」にそれらしい記述を発見。

曰く

If a class overrides a method and wants to continue to expose the base method, it should do so by implementing a method whose name is the base name with a $ prepended. This method should be marked final and should do nothing more than call the supermethod.
mx_internal final function $addChild(child:DisplayObject):DisplayObject
{
    return super.addChild(child);
}
だそうです。

そう、つまり、「基底クラスのメソッドをオーバーライドしつつ基底クラスの基底メソッドを使いたい」ときに「$マーク付けてfinalにする」んだよ。と言っている気がする。多分。

AS3の正規表現でURLを抜き出すメモ

長らく、正規表現とかデータベース周りの作業は「サーバサイド技術者に任せてFlasherはやらなくてもいいんじゃないの?」 というアティテュードを貫いてきた訳ですが、ちょっと用事が出来たのでURLを抜き出してリンクを貼り付けるスクリプトを書きました。

mixiなんかでhttp://~を入力して日記を書くと、自動的にリンクを張ってくれるアレです

var pattern:RegExp = /https?:\/\/[-_.!~*'()\w;\/?:@&=+$,%#]+/gi;

とりあえずURLにマッチする正規表現はこれでいいはず。
コチラを参考に、AS3でちょこっと書き直しただけなので多分間違ってないと思う。

これを元に静的メソッドを持つクラスを作る(クラス名は適当)↓

package {

 public class URLMarkUp {
  public static const BLANK_WINDOW:String = "_blank"
  public static const SELF_WINDOW:String = "_self"

  /**
  * @param source URLを含む文章
  * @param window LINKを開くときのウィンドウ
  * @return URL部分をマークアップした文章全体
  */
  public static function markUpURL(source:String,
                         window:String = SELF_WINDOW):String {

   var pattern:RegExp = /https?:\/\/[-_.!~*'()\w;\/?:@&=+$,%#]+/gi;
   var markup:String = "<a href=\"$&\" target=\""+window+"\">$&</a>"
   var htmlStr:String = source.replace(pattern, markup)
   return htmlStr;

  }
 }
}

markUpURL()にURLを含むソース文章を第一引数に渡し、第二引数にはターゲットウィンドウを渡します。するとaタグをくっつけた文章全文を返してくれます。
実際に使うときはこんな感じで。 ↓

package{

 import flash.display.Sprite;
 import flash.text.TextField;
 
 public class Main extends flash.display.Sprite {

  public function Main():void {
   var textField:TextField = new TextField();
   addChild(textField)
   textField.width = 500
   textField.height = 500
   textField.wordWrap = true
   
var str:String = "my weisite is http://abc.com and secure https://secure.bar.com/asaこれがワタシのwebですHTTP://www.foge.netついでにクエリーもhttp://secure.bar.com/?p=(2)_34!$5&amp;"

   textField.htmlText = URLMarkUp.markUpURL(str, URLMarkUp.BLANK_WINDOW);
  }
 }
};

アーカイブはコチラ
*イマイチ正規表現って自信が無いのでもうちょっと勉強します。ご使用はあくまでも自己責任でお願いいたします。

more.. "AS3の正規表現でURLを抜き出すメモ" »

FlashPlayer10beta2 and Speex

早くもFP10b2が出ましたね!やるじゃんAdobe! イイペースだね!

で、さらりとリリースとかを読んでみたところ、Linuxがどうした~、とかGraphicカードが~、とかフルスクリーンが~云々と書いてあります。

なんかSound周りもなんか追加されたみたいです。いまいち解らないけど「Speexコーデック」とやらが追加されたみたいで、なんでもオープンソースの声圧縮エンコーダーだそう。具体的な使用例があんまり思い浮かばないけど、多分マイクロフォンの音声圧縮に使うんでしょう。

何にせよ楽しみ。

more.. "FlashPlayer10beta2 and Speex" »

ごはんとFlash参加表明

7/20に鎌倉で開催されるごはんとFlashに行きます!

前回は偶然にも他のイベント(ミーティング?)とバッティングした為不参加となってしまったが、今回は万全を期してエントリーに挑んだ。

いや、万全はウソかも。

エントリー当日は「本日のタスク」に項目を立ててまでエントリーに望んだけど、何か色々やってるウチに気がつけばエントリー開始の10分前。あわててサイトをチェックするがまだ告知は出ていない。twitterを眺めると「まだ告知でないね」みたいな発言がチラホラあってしばし安心。

で、漸く告知が出てエントリーフォームに進むが予想以上のビジー状態でフォームが表示されず。そうこうしてるうちにtwitter上で「オレ一番乗り~」みたいな発言が出始めいよいよ焦る。その後も表示されず、更にtwitterで「2番手かな~」とか「このタイミングで漏れたら泣ける」みたいな発言が出始めた時点でPowerBookを立ち上げてsafariにてアクセス。

何か知らないけどsafariだとスル~と辿り着いて、そのまま登録。

しかし、あまりに焦っていたため「備考欄」が空白のまんま。

まあでも無事に申し込み完了メールが届いて良かった。なんでも開始から30分で満席になったそうだから、これは凄い人気だ。safariに乗り換えなかったらやばかったかも。

そんなわけで当日はどうぞ宜しくお願い申し上げます

珈琲アディクト

coffee.jpg仕事に欠かせないものと言えばやはり「音楽」と「珈琲」だと思う。

「音楽」に関しては音量にさえ気をつけていればアニソンをかけていようがノイズをかけていようが長唄だろうが基本的に人畜無害である。

しかし、「珈琲」。これに関しては言わずもがな「カフェイン」が含まれており、カフェイン中毒という恐ろしい事実が存在している。カフェイン中毒がどれくらい恐ろしいかというとこちらを参照されたい。




そんなわけで、ちょっと珈琲を控えようと思い、ハーブティーにすることにした。そもそも珈琲を嗜み始めたのは眠気を覚ますためだったため、もちろんハーブティーにも同じ作用を求た。とりあえず酸っぱいお茶にすれば目が覚めるのではないかと「ローズヒップ」を呑むことにした。

しかし、イマイチ覚醒しない。

そして、紅茶は面白くない。

なにが面白くないのか。それは淹れるという行為、である。茶葉を入れてお湯を注ぎ、しばし待つ。この至極シンプルなフローが実に退屈なのだ。それに引き替え珈琲と来たら、豆が挽枯れていることを前提にしてもペーパーないしはネルに豆を入れ、お湯を注ぎ、しばし蒸らし、それから「のノ字」を描くように泡立たせながらお湯を注ぐ。この泡を眺めるのがまたいい。その他にもサイフォン式やらエスプレッソメーカーやら楽しさ満載のツールがあり退屈することがない。

そんなわけで早々に珈琲に出戻ってまった。ローズヒップはまだ残ってるけどそのうち呑めばいいだろう。当分珈琲中毒でいいと思う。

AS3的デザインパターンについての独り言

デザインパターンって読み囓っただけであんまりエラソーなことは言えないんだけど、素朴な疑問を書いておきたいと思います。未来の自分がアンサーしてくれることを祈って。

この分野では「Javaで学ぶデザインパターン」といったタイトルの書籍が多く見受けられ、自分もその手の書籍を読んだ。するとまあ、当然だけどjavaで書かれていて、変数や関数の定義は下記の如くだ。
String getName();
int myNumber;

これをAS3で書き換えるともちろん
function getName():String ;
myNumber:int;

という感じになる。戻り値が関数・変数名の前につくのか後に付くのかが異なり、初めは何か気持ちが悪いけどすぐ慣れるし大した問題じゃあない。

では、何が問題なのか。
それはgetter、setterにまつわる実装方法だ(あくまで、個人的に)

たとえばイテレータパターン。通常、javaでは「next()」「hasNext()」というメソッドを実装し、「next()」を実行するとシーケンシャルにデータを受け取る事を可能にしている。
「next()」はカプセル化された配列から、次のデータを順番に返すように実装され、「hasNext()」は最後に「next()」を実行した配列のインデックスが最後で無いかを真偽値で返す。つまり、次のデータがあるのか無いのかを教えてくれる。

「next()」と「hasNext()」は両者とも「戻り値を持つ」そして「引数を取らない」という共通点がある。これは外から見た場合、読み取り専用値と言えるのではないかと思う。とすればAS3で実装する場合は「get」アクセサを使って、「next」「hasNext」とプロパティ化してしまうべきなのでは無いかと思う。

実際のコードを書けばこうだ。
public function get hasNext():Boolean{
return (index < str_ary.length)
}
public function get next():*{
return str_ary[index++]
}

そして、使用する場合は

if(iteratot.hasNext){
var data:* = iterator.next
}

とすればすっきりしていいんじゃないかと思う。同じ理由でsingletonモデルなんかでも「Singleton.getInstance()」ではなく「Singleton.getInstance」にするとか、プロパティなのに動詞がダメというなら「Singleton.uniqInstance」にするとか、いっそ「Singleton.singleton」にすればいいんじゃないかと思う。


もちろん、こうして従来の命名を多少なりとも変更することはあまりいいことではないと思う。特に「getInstance()」と書かれていれば一目瞭然でSingletonモデルであることが解る。これはすごく重要な事だ。でも「Singleton.singleton」とか手が無いわけでもない。


そして、もう一つ重要なことに「AdobeがプロパティベースのAPIを推奨していると言うことだ。」ココを読んでみるとどうやらそれっぽい事が書いてある。


Property-based APIs

Favor property-based APIs rather than method-based APIs, because these are more suitable for declarative-style MXML programming.

プロパティベースのAPIのほうがメソッドべースよりオススメさ!だって、MXMLで開発するときそっちの方がいいんだもん。


と言っている。これは確かに説得力のある言い分だ。(MXML使ったこと無いけど)


そろそろ、「JavaとかC++から載せ替えただけのデザインパターン」ではなく「AS3、というかECMAScriptの利点を引き出したデザインパターン」が必要な時期ではないかと、思う。


おわり。

RA DIOHEA_D / HOU SE OF_C ARDS

RadioHeadの新譜がGoogleCode上で公開されている。

GoogleCode上で、もちろん" ソースコード "付で。


いつの日か、この手のプロモーションを仕掛けてくれるアーティストが出てくるだろうと期待をしていたが、それがRadioHeadだったとはなんともおあつらえ向き。

トム・ヨークがやらないとすればビョークなんかもやってくれそうだけど、99年の彼の格言「world wide web は無意味な底引き網になってしまった」を思い起こすと凄くドラマチックだ。

兎に角、こうして、プログラミングがその他の表現フォーマットとチャンプルーされ、作品として堂々と立っているのが素晴らし。すごく嬉しい。


この嬉しさを名著、
「Foundation ActionScript3.0 Animation -Making Things Move!-」からの引用(もちろん超々意訳)で締めよう。

デベロッパー、とか デザイナーとかなんか色々呼び名はあるけどさ、


もういいんじゃないの?

そろそろ言ってしまえよ! 「アーティスト」だって。

「ごはんとFlash-二杯目」ごちそうさま。

ごはんとFlash(二杯目)に行ってきたよ。

当日は朝から鎌倉よりもう少し南端に近い、「油壺」という入り江で磯遊びをして現地入り。水着を持って行かなかったので全く泳げなかったのが悔やまれるが(だって泳いだらへとへとになってイベントで腑抜けになりそうだったから)磯遊びだけでもかなり楽しかった。そしてモーレツに日焼けしてしまって未だ肩から背中にかけて痛い。シャワーのお湯が痛い。いつまで続くんだろうか。

そんなこんだで現地には6時くらいに到着するも全然誰もいなかった(あたりまえか)。どうしようかと思案していると Saqoosha さんがいたのでご挨拶をしてお名刺頂戴。

そのあと適当に散歩してビール買って砂浜でボンヤリしていると最高に気持ちよくて気がつけば開演時刻になってて振り返れば人がいっぱい。とりあえず受付をすませる。ドリンクチケットでビールを貰うとSaqoosha さんとmurakenさんのセッションが始まる。

個人的にはmurakenさんの「Flashって初めはVJツールだと思ってた」という話が印象的だった。自分も当初、Flashに対するイメージは、「webサイトを作るツール」というより、「インスタレーションやメディアアート的なアプローチをするツール」だと思ってたからだろうか。

その後、呑みながら色んな人とお名刺を交換させていただく。ここら辺から結構呑んでたので所々記憶が危うい。しかもトイレにいって帰ってくると、拙作「黒藤院」が作例紹介されて、「このサイトの制作者様いらっしゃいませんか」と呼ばれているのであわてて前へ行く。なんかゴニョゴニョっと喋ったけどキンチョーしちゃって質問にそぐわない回答してたかもしれない。恥ずかしい。

余談だけど、司会をしていらした女性の方はてっきり喋り手さんだと思っていたらそうではないらしい。ちょっとびっくり。上手すぎです。

イベントも終盤になってからzkさんとかfeb19さんとお名刺を交換して、「いや~もっとサウンドプログラミング盛り上げていかないとダメですな」とか「DynamicSoundに期待大っす!」とか「sazamekiの勉強会しましょう!」とか「フーリエ変換とかって...」などなど、自分的には一番したかった話をした。

とまあ、そんな感じでした。

more.. "「ごはんとFlash-二杯目」ごちそうさま。" »

三角関数とパフォーマンス

ActionScriptのコーディングで三角関数とか三平方の定理とかを使ってる時ってややこしいんだけど、これぞAS!な感じがして個人的には好きです。

ここら辺のコーディングにはプリミティブ値だけで計算してしまう場合と、Mathクラスを使う場合、Pointクラスを使う場合、と色々なやり方が考えられます。条件次第では、Math.sin()などが必須になる場合もありますが、何を使っても良い場合、そのパフォーマンスはどうなんでしょうか?

と言うわけでベンチマークを取ってみました。


処理内容は下図の三角形から線分cの長さを求める。
triangle.gif

これを上記三種のコーディングで記述するとこうなる↓


  1. Math.sqrt(a* a + b * b);

  2. b / Math.sin(θ);

  3. new Point(a, b).length;

これを1000万回くらいループしてやります。
すると、結果はこう↓


  1. Math.sqrt(a* a + b * b); ---- 2957 msec

  2. b / Math.sin(θ);      ---- 3311 msec

  3. new Point(a, b).length; ---- 16353 msec

細かい実装方法は置いておいて、とりあえずプリミティブ値を計算しするのが一番早いことが解りました。Pointクラスはハッキリ言って戦力外。まあループ毎にnewしているので当然の結果だけど、newをループの外で実行してループ内で.lengthを参照する形にしても5,000msec以上かかっていたのでやっぱり遅い。

と言うわけでプリミティブ及びMathクラスが実行速度的には良さそう。ただココでも注意が必要。下記は計算結果で見て貰えば解るがb / Math.cos(θ);の計算結果だけ値が異なる。


  1. Math.sqrt(a* a + b * b); ---- 2.23606797749979

  2. b / Math.sin(θ);      ---- 2.309401076758503

  3. new Point(a, b).length; ---- 2.23606797749979


これはAS3のNumber型の精度に起因する問題で、Math.cos(90*Math.PI/180)なども0にならない。Javaみたいに精度の高い浮動小数点型を持てば解決すんのかな。たとえばdoubleとか。

とりあえずそんな感じで。以上、報告おわり。

[追記] AS3的デザインパターンについての独り言 

こないだポストした「AS3的デザインパターンについての独り言」について、色々な方々からTwitterとかBlog上でコメントをいただきました。ありがとうございます。

で、大方の意見は

「Singleton.getInstance()をSingleton.instanceにするのは賛成だけどIterrator.next()をIterrator.nextにするのはどうかな...? あ、もちろんIterrator.hasNextはいいと思うよ!」

と言う感じでした。
なぜIterrator.nextが推奨されないのかというと、「next()は内包する配列のポインタを進めるという重要な操作を担っているので明示的にメソッドにしたほうがいい」という理由です。

ここら辺は自分でも迷ってたところなので、色々な方々のご意見を聞くことが出来て良かったです。

で、ここからは個人的な話で、なぜnextに、プロパティにしようと思ったのかについて。

そもそもはAdobeのコーディングガイドラインにプロパティベースのAPIの方がmxmlと親和性が高いと書かれている点です。mxmlを書いたことはほとんど無いですが、xml形式で開発するなら多分間違いなくその通りでしょう。

もう一つはTextFieldクラスなどで、" myTextfield.text = "helloworld"; " と書けばきちんと表示される点です。これは額面取りに「text」という「String型プロパティ」に値を格納しているだけではなく、内部的にゴニョゴニョと表示関係を操作しています。禁則処理もかけたり、自分で実装するのは絶対に避けたいような処理を行ってくれていると推測できます。

これはTextFieldクラスに限ったことではなく、Spriteクラス、これも同様です。たとえば" mySprite.x=100; " が額面通り「Number型のxプロパティ」に100を代入しているだけではないことは明らかです。実際には100という数値を受け取り、mySpriteをx軸の100ピクセルの位置へ配置し、描画しています。

もしASのgetter、setterの仕様が「プロパティ」として振る舞えないものであったなら、myTextfield.setText("helloworld") や mySprite.setX(100)  と記述しなければならなかったかもしれません。

そう考えるととたんにgetter、setterの恩恵を実感出来て何でもかんでもプロパティとして実装したくなります。解っていただけたでしょうか??

さらに " myTextfield.text+="helloworld"; " が推奨されず " myTextfield.appendText("helloworld"); " が推奨されてる辺りも示唆に富んでいますね。
多分。


RSS + Contuct

  • rss
  • email

Credit

Copyright (C) 2007 kappa-lab.com.
All Rights Reserved.