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

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

4月 23rd, 2008

ActionScriptでHTTPServiceを使う

Posted by KOBAYSU in as3.0

HTTPServiceをActionScriptで使うと結構オサレな感じでよくね?みたいなエントリを書く予定だったんだけど、なぜかコンパイルエラー。
HTTPServiceのActionScriptでを使う際Responderクラスを使うのが理由っぽい。
AsyncResponderで代用すると直った。

追記

原因はクラスのコンフリクトだった。ルートのMXMLで使うときは下記のようにすると解決。

token.addResponder(new mx.rpc.Responder(handleResult, handleFault));

HTTPServiceとかをASでさらっと使うのって、mxフレームワーク使いこなしてる感がしていいよね。

<?xml version=”1.0″ encoding=”utf-8″?>
<mx:Application xmlns:mx=“http://www.adobe.com/2006/mxml” layout=“absolute” applicationComplete=“init()”>

<mx:Script>
<![CDATA[
import mx.utils.ObjectUtil;

import mx.rpc.AsyncToken;
import mx.rpc.AsyncResponder;
import mx.rpc.http.HTTPService;

private function init():void
{
trace(‘init’);

var httpService:HTTPService = new HTTPService();
httpService.url = “http://blog.widgetown.com/tech”;
httpService.resultFormat = ‘e4x’;

var token:AsyncToken = httpService.send({feed:“rss2″});

//AsyncResponder のところをResponderとすると何故かコンパイルエラー
token.addResponder( new AsyncResponder(

function (result:Object, t:Object):void
{
trace(‘result’);
trace(httpService.lastResult..title.text());
}
,
function(fault:Object, t:Object):void
{
trace(‘fault’);
}
));
}
]]>
</mx:Script>

</mx:Application>

4月 22nd, 2008

AIRコンテスト

Posted by KOBAYSU in Misc

さてwidetown開発チームでAIRコンテストに参加する訳ですが、何つくりましょうかね?

・思い切り技術系、ツール系。(コンポーネントなど)

・ゆるシリーズのような企画おもしろい系。

・まじめ系(gmail checkerとかyoutube Viewerとか)

開発期間のGWももうスグですのでそろそろ決めないと実装担当のコッシーがかわいそうなので決めましょう。シモージーさんとかに案だしてもらいましょうか。

PS クロちゃんがアップはじめました。

4月 9th, 2008

AIR関連ニュース: 1.0.1公開、AIR コン、チュートリアル、再配布

Posted by kokuno in 未分類

こんにちはkokunoです。

ADOBE AIR関連で、気になるニュースがいろいろとリリースされていますね

⇒Adobe AIR 1.0.1 公開
http://weblogs.macromedia.com/akamijo/archives/2008/04/flash_player_90_2.cfm
http://get.adobe.com/air/

AIRとしては、初めてのバージョンアップ。
とはいえ、セキュリティパッチとしてのリビジョンが
上がっただけですが、アップデートの処理については
よく観察しておきたいところです。

⇒Adobe-AIR コンテストの応募受付が開始されました:締め切りは6/6
http://www.adobe.com/jp/special/air/contest/
http://www.info-event.jp/adobe/air/

まえから告知はされていましたが、応募開始。
もちろん、法人でも参加可能。
審査員の方々も、FXUG横田さんや、ひがさんなど
ADOBEのイベントでもおなじみの方々。
入賞作はもちろんですが、ノミネート作品も
公開して欲しいですね。

⇒AIRのチュートリアル

AIRチュートリアル Flash 第1回 AIRアプリをはじめてみよう
~環境を設定する~
http://www.adobe.com/jp/devnet/flash/articles/develop_air_with_flash.html

http://www.adobe.com/jp/special/air/tutorials/

FlashユーザーとDreamWeaverユーザーに向けた「はじめての」シリーズ
widgetownでも「サンデープログラミング」という特集連載を行っておりますが、
こうしたチュートリアルが増えて、AIR開発者が増えてくれるのが楽しみです。
サンデープログラミングも頑張らねば

⇒AIR ランタイムの再配布について

Mike chambersのブログより


http://www.mikechambers.com/blog/2008/04/07/redistributing-the-adobe-air-runtime-installer/

you must first apply for, and receive permission from Adobe to redistribute it

まず、再配布は許可制だから、Adobeに許可を受けろと、

もうひとつ

In general, the license allows you to:

* distribute the runtime installer on a closed intranet
* distribute the runtime installer on fixed media, such as CD or DVD Roms.
* distribute and launch the runtime installer as part
of another native installer

※最後の部分は初めて知った。別のネイティブインストーラーの
一部としてインストールさせるのはOKなのか?

NGなのは、以下

* modify the installer, or files to allow AIR application
to run without having the runtime installed on the user’s system.
* distribute DLL’s or other files from the runtime directly
within an application

ランタイムから、DLLだけを抽出したりして、
ランタイム環境をインストールしないで、直接実行が
可能にしてはダメよという感じかな

いろいろな配布方法を認めていくのは、AIRの普及にとって
重要な戦略ですから、再配布を認めてくれるのはADOBEに
とってもメリットがあります。

どのような配布形態が可能なの注意して調べていきたいところです

4月 1st, 2008

PHPで作る簡易Httpプロキシ

Posted by kokuno in 未分類

こんにちは、サーバー担当 kokunoです

ウィジェットの開発でそれなりに面倒なのが、通信のテストです。

問題が起こった場合に、ウィジェット側なのかサーバー側なのかの
切り分けを行うのは、以外に面倒。

Webアプリであれば、ブラウザのデバッグツールが使えたり
(FirefoxのLiveHTTPHeadersとか便利ですねー)するのですが、
ウィジェットの場合そういったツールは使えません。

コマンドラインツールのngrep(windows版tcpdump)で十分な場合も
あるのですが、ちょっと凝ったものなら、プロキシを立ててキャプチャしたいところです。

下記は、以前にちょっと試したプロキシのサンプルです。
実用にはなりませんが、リクエストヘッダーがキャプチャして、
自動化テストに利用しようかなと思ったりしました。

ウィジェットの場合は、IEコンポーネントを使う場合が多いので、
IEのプロキシ設定を行っておけば、通信状況を確認できるのは便利ですね。

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
44
45
46
47
48
49
50
< ?php 
 
define('_BUF_SIZE',1024);  //サービスポートのリスニング
$port = 8080;
 
$proxylistner = socket_create_listen($port,0) 
  or die("socket_create_listen({$port}) failed.\n");
 
do {
    //ブラウザからの要求の受付
    $clientreq = socket_accept($proxylistner);
    $resbuf="";
    //レスポンスの取得
    $reqin = socket_read($clientreq, _BUF_SIZE,PHP_BINARY_READ);
    $headers = explode("\r\n",$reqin);
    //URLから接続先をチェック
    for($i=0;$i<count($headers);$i++){
      if(preg_match('#^(GET|POST) (http|https)://([^/]*)([^\s]*) HTTP/(.*$)$#i',$headers[$i],$match)){
        $schem=$match[2];
        $host=$match[3];
        $path=$match[4];
        $rep = preg_replace("#^([^\s]*) ({$schem}://{$host}{$path}) (.*)$#i","$1 $path $3",$headers[$i]);
        $headers[$i]=$rep;
      }
    }
 
    $service_port = getservbyname($schem, 'tcp');
    $address = gethostbyname($host);
    $senddata=implode("\r\n",$headers)."\r\n";
 
 
    $clientsocket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) 
      or die("socket_create() failed.\n");
 
    //クライアント接続の開始
    $resbuf="";   
    $reqresult = socket_connect($clientsocket, $address, $service_port);
    if ($reqresult) {
        //リクエスト要求
      socket_write($clientsocket, $senddata, strlen($senddata));
      //レスポンスの返却
      while ($resin = socket_read($clientsocket, _BUF_SIZE,PHP_BINARY_READ)) {
        $ret = socket_write($clientreq, $resin, strlen($resin));
      }
    }
  socket_close($clientreq);
  socket_close($clientsocket);
 
}while (true);
socket_close($proxylistner);

参考URL:

ソケット関数
http://www.php.net/manual/ja/ref.sockets.php

PHP でサーバソケットプログラミング (1):Rainy Day Codings:So-net blog:
http://rainyday.blog.so-net.ne.jp/2007-02-17