widgetown 開発チームブログ(仮)

5月 27th, 2008

AS2 RSSをストリングでパース

Posted by KOBAYSU in as2.0

あるベテランCプログラマーの人が

「XMLだけはめんどくさいからハッシュ化しちゃうよね」

といったかいわないかは定かではありませんが。

男ならStringのメソッドでRSSをパース

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
 
import mx.utils.Delegate;
var lv:LoadVars = new LoadVars ();
 
lv.onData = Delegate.create(this,function(str:String):Void
{
	var result:Array=[];
	str = str.split(' ').join("").split('\t').join('').split('\r\n').join('');
 
	var items:Array = str.split('<item>');
	items.shift();
 
	var len:Number = items.length;
 
	for(var i=0;i<len ;++i)
	{
		var item:String = items[i];
 
		var title:String = item.substring(item.indexOf('<title>'),item.indexOf(''));
		var description:String = item.substring(item.indexOf('<description>'),item.indexOf('</description>'));
 
		var link:String  = item.substring(item.indexOf('<link>'),item.indexOf('</link>'));
		var guid:String = item.substring(item.indexOf('<guid>'),item.indexOf('</guid>'));
		//CDATAを削除;
		description = description.split('< ![CDATA[').join('').split(']]>').join('');
 
		var o:Object = {};
		o.title = title;
		o.description = description;
		o.link = link;
		o.guid = guid;
 
		result.push(o);
 
	};
	trace(mx.data.binding.ObjectDumper.toString(result));
});
 
lv.load ('http://weblogs.macromedia.com/akamijo/index.xml');
 
</len></item>

かなりきちんとパースできて正直ワロタ。
コッシーにindexOfを使えといわれて使ったら高速になったよコッシー!!

5月 27th, 2008

AS2 でyoutubeパース

Posted by KOBAYSU in as2.0

あるベテランCプログラマーの方が

「正規表現が内部的にどれくらい効率悪い処理をしてるかわかってるの?」

といったかどうかは知りませんがAS2.0では正規表現がありません。

男だったらString.splitで気合でパース。

基本的には中のjsのURL記述から必要なパラメータをとってきているのですが、パラメータの順番がころころ変わるので変わっても対応できるようにしました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
function parseYoutubeHTML(htmlString:String):String
{
  var line:String = str.split('watch_fullscreen')[1].split(';')[0];
  var ar:Array = line.split('&');
 
  var video_id:String;
  var t:String;
  var l:String;
 
  var i:Number = ar.length;
  var b:Boolean = true;
 
  while( i-- > 0 && b )
  {
    b =  video_id == undefined || t == undefined || l == undefined ;
 
    if(ar[i].indexOf('video_id=')==0)
    {
      video_id = ar[i].split('=')[1];
      continue;
    }
 
    if(ar[i].indexOf('t=')==0)
    {
      t = ar[i].split('=')[1];
      continue;
    }
 
    if(ar[i].indexOf('l=')==0)
    {
      l = ar[i].split('=')[1];
      continue;
    }
  }
 
  //youtubeの定理
    var url:String = 'http://youtube.com/get_video.php?' 
    + 'video_id=' + video_id  + '&l=' + l  
    + '&l&t=' + t;		
 
    return url;
 
}

これそのままJSでも動くかもしれないので誰かやってみてください。

5月 15th, 2008

AS3 tips

Posted by KOBAYSU in as3.0

いいTipsみつけた。Widnow上でのルート検索に使えそう。

ルートを健作

//rootを検索
var target: DisplayObject = this;
while (target.parent.parent)target = target.parent;
trace(’root:’ + target);

5月 15th, 2008

オープン系のアナタに送るFlexマスター最短ルート

Posted by KOBAYSU in MXML, as3.0

とりあえず、コンポーネントのスキニング(デザインカスタマイズ)には手を出さないことをお勧め。

・環境構築

http://gihyo.jp/dev/feature/01/flash-sdk/0001?page=1

ここでSDKで環境構築&ビルドをマスター。慣れてきたらRascutを試してみるとよいかも知れない。

・Flex quick start guide for PHP developers

http://www.adobe.com/devnet/flex/articles/php_getstarted.html

英語だが、ここを写経すれば簡単なサーバー、クライアント間のアプリはできると思う。

FlexとPHPのJASON連携

http://www.adobe.com/jp/devnet/flex/articles/flex_php_json.html

あと、最初につまずきやすいところを何点か。

MXML→クラスファイル。

MXMLはコンパイル時にすべてActionScriptに変換される。

そこそこのFlexアプリならActionScriptの知識はあまり要らない。javascriptが分かっていれば分かる。

それよりMXMLに慣れること。

5月 12th, 2008

番外編 AIRのHTMLLoader

Posted by rkoshida in Misc, as3.0

今更ですが AIRのHTMLLoaderです。今更ですが。
早い話が、Webブラウザ。レンダリング機能だけではなくJavaScriptインタプリタとしてもしっかり機能します。

さて、興味本位で、IE、FireFox、AIRのHTMLLoaderぞれぞれで、
確認君(http://www.ugtop.com/spill.shtml)を踏んでみました。
以下、気になったことを…。

・サポート言語(Accept-Language)
送られていないっぽく、情報が空です。
「en-us」ぐらい送ってくれてもいいのに…。

・リファラ(Referer)
:app:/htmlloader_test.swf
デフォルトでは実行中のswfのパスになるようです。

・Cookie(Set-Cookie)
ちゃんとクッキー処理にも対応してますね。

こんなところでしょうか。
ついでにCapabilitiesも確認してみたのですが、なんだか普通でした。
playerTypeが“PlugIn”な点ぐらいですかね。

5月 5th, 2008

flash作っていて幸せなとき

Posted by KOBAYSU in Misc

GWは会社でがっつり実装です。

そんな中、ふと思ったことがあります。

やっぱ、flashってたのまれてもないViewの作り込みをしているときが一番幸せですよね~。

だけど、次回以降まったく同じものが仕様に入るとめんどくさく感じるのはなぜ?七不思議ですね。

4月 28th, 2008

意図的な偏り(傾向)付きの乱数を手軽に生成する

Posted by rkoshida in Misc

便利なライブラリ情報や 最新の動向系のエントリは 他の方が書きまくっていますので、私からは少し違う毛色のエントリを。
ウィジェット、ブログパーツ、或いはサイトFlashの全てにおいて出てくる、「表現」系のお話です。

ちょっとした表現を行おうとすると、例えば「座標」であったり「速度」であったり「角度」であったり「継続時間」であったり「縮尺」であったりの各パラメータに 乱数を使うことが多々あります。
さて、おなじみのMath.random()で生成した乱数というのは、(生成アルゴリズムのマズさから来る偏りという面を除けば)一様に分布します。

ですが、上で挙げたような いわゆる連続量に乱数を適用する際は、意図的な「偏り」というか「傾向」が欲しい場合も多いワケです。
例えば「大きい数の方が小さい数より出やすい」など。

これらを真面目に実装しようとすると、数学の時間にやった 確率密度関数などを復習する必要が出てくるワケですが、「数学キライー!」「だってボク☆文系だもん♪」という方のために、簡単に実装する方法を紹介いたします。

一言で言えば、
「普通に乱数を生成し、そこから “今生成した乱数を最大値とする乱数”を引く」ことで、小さい方に偏る乱数を生成できます。

…文章で説明してもややこしいので、以下コード例。

function inclinationalRandom (max :Number) :Number
{
var result :Number = Math.random();
result -= Math.random() * result;
return (result * max);
}

この方法で、「0以上 10未満」の乱数を8000回生成して適当に整数化した際の出現回数がこちら。

fig00

偏ってますねー。「小さい数が出やすい傾向を持った乱数」の生成、完了です。

しかしこれではいくら何でも偏り過ぎ!…という意見もあるでしょうから、もう少しマイルドにしてみましょう。
ついでに「マイルド度」も指定できるようにしてみましょう。

function inclinationalRandom (max :Number, rate :Number) :Number
{
var result :Number = Math.random();
var incl :Number = result - (Math.random() * result);

result = (result + (incl * rate)) / (1.0 + rate);
return (result);
}

基本的に先程のコードと考え方は同じなのですが

、「偏らせる(小さくい方へ引っ張る)ための数」に倍率を掛けています。
rateを弄ることで「偏り」を調節できます。

rate = 1.0でこんな感じ。
fig01

rate = 2.0はこんな感じ。
fig02

rate = 4.0でこんな感じ。
fig03

ちなみに離散量にも応用できるのですが、長くなっちゃいますのでまたの機会に。

4月 28th, 2008

Google App Engine

Posted by KOBAYSU in library, as3.0

港で話題のGoogle App Engineですが早速土日にいろいろ調べてみました。

こちらの記事がよく引用されています。

「Google App Engine」の登場とPaaS–Web 2.5がもたらす変化

インフラ整備を泥仕事といったら、泥仕事している人に失礼じゃないか!というのは置いておいて、超ざっくり説明するとAPI込みのレンタルサーバーのようなものでしょうか。

主な機能はこんな具合

・500MBまでのストレージ提供

・500万PV程度の帯域を提供

・言語は今のところPython

・SDKの中に開発サーバーが入っている。

・Pythonで書いたアプリとyaml形式の設定ファイルを同梱しSDKを用いてアップして公開。

・Python2.52の標準ライブラリで書かれているのでPythonのライブラリをアップして使える。

・DBはリレーショナルではない。datastore APIを経由しSQLの代わりにGQLというものを用いて書く。

・Google Accountを利用できる。自分のアプリにGoogle Account APIを利用しログインさせる機能をつけれる。

・ほかのドメインのリソースにアクセスする場合はURL Fetch APIを利用する。sendMailも可能

さて、ここからが本題

このGoogle App Engine対応アプリケーションをFlash,Flexから利用する際のフレームワークが早くも登場。開発者はSWXのAral Balkan氏

・The GAE SWF Project version 1.34

デモは下記

http://gaeswf.appspot.com/examples/initial/flex#/mousewheel

ログインとかしっかり動作していますね。GWはこれをちょっといろいろいじってみたいと思います。では連休後のエントリーをお楽しみに。

4月 28th, 2008

degrafa

Posted by KOBAYSU in MXML, library, as3.0

degrafa

SVGデータが扱えるグラフィックライブラリ。

http://code.google.com/p/degrafa/

sampleの中のviewsourceでどんな感じか見れます。

http://samples.degrafa.com/

非常に興味深い特徴としてはMXMLでコーディングしていく点。

MXMLはActionScriptのクラスをコンポーネントとしてカプセル化する際すばらしく便利なので、もっと普及してほしいですね。

4月 24th, 2008

AS3 casaframework , lowRA 

Posted by KOBAYSU in as3.0

勉強のために casaframework とかlowRAとか眺めたりしてます。

casaframeworkはAS2でもあった便利系ライブラリ。Trick7のTeraさんがブログで紹介してからすごく広まった感ありますね。これは僕の中ではやっつけ仕事のお供に重宝しています。

lowRAはpixLibのAS3版。Util系ライブラリ+FrontContorollerパターンのMVCフレームワーク込みの超絶ライブラリ。

ClassUtilだけは便利すぎるのでAS2.0時代も使わせてもらいました。

どちらもスゴク参考になるのですが、SVNをチェックアウトしたところ目下開発中でちょくちょくコミットされています。casaframeworkにいたっては4/15にcasaframework/collectionパッケージのクラスをほぼ全部削除するなど臨場感満点で楽しめます。

casaframework http://svn.as3.casaframework.org/dev/code/org/casaframework

lowra http://lowra.googlecode.com/svn/trunk

次のページ »