てら子初参戦してきました

東京てら子に参戦してきました。
てら子は初めてでしたが、みんな画期的な発表をしていて面白かった。

今回のテーマはGoogleAPI。

Text to speechを使って打ち込んだひらがなをGoogleのお姉さん(Google譲)
に喋らせるコンテンツを作成しました。
まぁもちろんあんなことやこんなことを言わせましたよ(←最低)

なかなかやることが思いつかずに大分ネタに走っちゃったけど、
みんなの発表を聞けたし結果オーライってことで。

今回の発表資料を下記に載せておきます(いらないと思うけど笑)
よろしかったらローカルで遊んでみて下さい。

プロジェクト一式

Flashのキャプチャ画像をサーバに書き出してみる

最近はiPhoneを持っている人が大変多くなりましたね。
Flash制作者としては一時期は肩身も狭いくらいでした笑
(とはいうものの僕もiPhoneユーザだったりしますが)

皆さんご存知のとおりiPhoneではFlashを見ることはできません。
代替画像を用意して表示することも多いのではないでしょうか?
しかし、コンテンツによっては見る度に表示が変わるなど、
何度もアクセスさせるために工夫をしているようなものもあるはず。

今回はFlashを表示する度に画面をキャプチャして
サーバの画像を更新することはできないかと考えました。

ver10のbyteArrayとPHPを使って再現してみましたのでデモを見てみて下さい。

デモ

Flash側で自分のキャプチャ画像を作り、PNGデータを作成。
PNGデータをバイナリデータにしてPHPにPOSTで送信しています。

var _bmd:BitmapData = new BitmapData(width, height, true, 0x00000000);
_bmd.draw("キャプチャターゲット", null, null, null, new Rectangle(0, 0, width, height));

var _byteArray:ByteArray = PNGEncoder.encode(_bmd);

var _urlRequest:URLRequest = new URLRequest("PHPのパス");
_urlRequest.contentType = "application/octet-stream";
_urlRequest.method = URLRequestMethod.POST;
_urlRequest.data = _byteArray;

var _urlLoader:URLLoader = new URLLoader();
_urlLoader.load(_urlRequest);

PHP側で受け取ったバイナリをPNG画像に保存。

<?php
	$fileName = "test.png";
	$file = fopen($fileName, 'wb');
	fwrite($file, $GLOBALS&#91;'HTTP_RAW_POST_DATA'&#93;);
	fclose($file);
?>

意外に簡単に出来たのでぜひ試してみてください。
PNGEncoder の変わりにJPGEncoder を使えばJPG保存も出来ますよ。

HTML5のGeolocationを試してみる。

HTML5のGeolocationでは、ネットワークの情報から現在位置を調べることができるとか。
いろいろ機能が増えてて面白いなぁ、ということで早速デモを作成。
Geolocationで現在位置を取得して、GoogleMapsに表示するだけの簡単デモです。

デモ

<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=yes, initial-scale=1.0, maximum-scale=3.0"/>
<title>Geolocation|HTML5サンプル|Yellow-Sunset</title>
<style>
body{
	margin:0px;
	padding:0px;
}
</style>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=true"></script>
</head>
<body>
<div id="map_canvas" style="width:100%; height:100%"></div>
<script>
//Geolocationを使用可能な場合
if(navigator.geolocation){
	//ここで実際に位置を取得
	navigator.geolocation.watchPosition(
	//取得成功時のメソッド
	function(position){
		var lat = position.coords.latitude;
		var lng = position.coords.longitude;
		setMap(lat, lng);
	},
	//取得失敗時のメソッド
	function(){
		alert("Location取得失敗");
	}
	);
}else{ //Geolocationが使用不可能な場合
	alert("Geo Location APIに対応していません");
}

//GoogleMapsに表示するメソッド
function setMap(_lat, _lng){
    var latlng = new google.maps.LatLng(_lat, _lng);
    var myOptions = {
      zoom: 18,
      center: latlng,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
  }</script>
</body>
</html>

ちなみに実際に位置を取得するところは、watchPositionを使ってるけど、1回だけ取得するならgetCurrentPositionでいいみたい。

全然別の問題だろうけど、HTML5のDOCTYPEを宣言するとGoogleMapsが表示されない。
なんでだろう?

今度調べてみたいと思います。

Flex DataGridのソート

FlexのDataGridの初期ソートの設定方法

//ソートオブジェクトを生成
var sort :Sort = new Sort();

//ソート順にpostの昇順を指定
sort.fields = [new SortField("post")];

//ArrayCollectionのソート順を変更
this.dataArrayCollection.sort = sort;

//ArrayCollectionをリフレッシュ
//(これをしないとソート順の変更が反映されない)
this.dataArrayCollection.refresh();

DataGrid のソートにはSortクラスとSortFieldクラスを使うのか。
最後にデータをrefreshしてやらないと更新されないと。

URLVariables.decode()

■エラー文言
Error: Error #2101: URLVariables.decode() に渡される文字列は、名前/値のペアを含む、URL エンコーディングされたクエリー文字列でなければなりません。

■参考
URLVariables のコンストラクタまたは URLVariables.decode() メソッドで変数を定義する場合、アンパサンド文字(&)は必ず URL エンコードしておく必要があります。アンパサンドには特別な意味があり、区切り文字として機能するからです。例えば、アンパサンドを渡す場合、アンパサンドはパラメータの区切り記号として機能するので、& から %26 に変更することによってアンパサンドを URL エンコードする必要があります。

URLVariablesでサーバーから値をもらうときはURLエンコードしてもらわなくちゃいけないんだね。
また一つ勉強になりました。

ModelLocator

変数を格納しとくためのクラスを作ると色々便利なことがわかったのでメモ。

package
{
    public class ModelLocator
    {
        private static var _instance:ModelLocator;

        public function  ModelLocator(enfocer:SingletonEnforcer)
        {
        }

        public static function  getInstance():ModelLocator
        {
            if (_instance == null )
            {
                _instance = new ModelLocator(new SingletonEnforcer());
            }

            return  _instance;
        }
    }
}

class  SingletonEnforcer
{
}