<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
   <title>dev.convexstyle.net | convexstyle のウェブ開発ブログ</title>
   <link rel="alternate" type="text/html" href="http://dev.convexstyle.net/" />
   <link rel="self" type="application/atom+xml" href="http://dev.convexstyle.net/atom.xml" />
   <id>tag:dev.convexstyle.net,2009://1</id>
   <updated>2009-12-04T00:47:59Z</updated>
   <subtitle>convex って平らなモノの表面を触って少しポコってなっているもの。そんな感じでありたい。</subtitle>
   <generator uri="http://www.sixapart.com/movabletype/">Movable Type 3.35</generator>

<entry>
   <title>10.0.2 アップデートで修正された問題に関連して</title>
   <link rel="alternate" type="text/html" href="http://dev.convexstyle.net/2009/12/1002.html" />
   <id>tag:dev.convexstyle.net,2009://1.161</id>
   
   <published>2009-12-04T00:43:48Z</published>
   <updated>2009-12-04T00:47:59Z</updated>
   
   <summary>会社で開発していた Flash コンテンツを納期に伴ないクライアントにソースごと渡すことに。で、問題が発生。クライアントの PC で全くコンパイルできない現象が起きた。いやコンパイルして swf は書き出されているんだけど、空の swf が出来上がる感じ。 一応会社の PC の状況をエミュレートして色々試してみると、A,B の PC でコンパイルできて、C,D では出来ない。出来ない PC で試しにメインクラスに trace(&apos;hello&apos;); とかしても trace が出ない。今回はコンポーネントの数個インストールしているし、あの en/ja 問題に関連しているのかとか色々間違った方向に考えていたんだけど、説明つく理由が見当たらない。Debug Movie で書き出すと、Flash ファイルに関連するクラスファイルが見当たらない的なアラートが出る始末。class パスもメインクラスもちゃんと存在しているのに。 「自分の PC でコンパイル出来るのに何故同僚やクライアントは出来ないのだ！？」「Flex Builder 怪しくね！？」とか不毛にどんどん深く悩んでいたんだが、ふと個人 Mac を会社に持ってきてコンパイルすると普通に出来る。両方の PC の共通点を探すと 10.0.2 になってました。このマイナーアップデートはそこまで大きな変化は無いだろうとか考えていたんですが、下記のような問題点が沢山改善されているんですね。 Flash...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="Environment" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="2" label="Flash" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://dev.convexstyle.net/">
      <![CDATA[会社で開発していた Flash コンテンツを納期に伴ないクライアントにソースごと渡すことに。で、問題が発生。クライアントの PC で全くコンパイルできない現象が起きた。いやコンパイルして swf は書き出されているんだけど、空の swf が出来上がる感じ。

一応会社の PC の状況をエミュレートして色々試してみると、A,B の PC でコンパイルできて、C,D では出来ない。出来ない PC で試しにメインクラスに trace('hello'); とかしても trace が出ない。今回はコンポーネントの数個インストールしているし、あの en/ja 問題に関連しているのかとか色々間違った方向に考えていたんだけど、説明つく理由が見当たらない。Debug Movie で書き出すと、Flash ファイルに関連するクラスファイルが見当たらない的なアラートが出る始末。class パスもメインクラスもちゃんと存在しているのに。

「自分の PC でコンパイル出来るのに何故同僚やクライアントは出来ないのだ！？」「Flex Builder 怪しくね！？」とか不毛にどんどん深く悩んでいたんだが、ふと個人 Mac を会社に持ってきてコンパイルすると普通に出来る。両方の PC の共通点を探すと 10.0.2 になってました。このマイナーアップデートはそこまで大きな変化は無いだろうとか考えていたんですが、下記のような問題点が沢山改善されているんですね。

<a href="http://www.adobe.com/jp/support/kb/ts/235/ts_235605_ja-jp.html" target="_blank">Flash CS4 Professional 10.0.2 アップデートで修正された問題</a>

<b>サイズの大きいプロジェクトファイルのコンパイルに関する問題</b>という見出しも！！

今回は papervision3D、コンポーネント、フレームワークなど比較的大きなクラスファイルを同時にコンパイルしようとしていたため、何らかの理由でコンパイルが正常に出来なかったのだろう。

ということで、ちゃんと細目にアップデートしようという話でした。]]>
      
   </content>
</entry>
<entry>
   <title>We Feel Fine</title>
   <link rel="alternate" type="text/html" href="http://dev.convexstyle.net/2009/12/we_feel_fine.html" />
   <id>tag:dev.convexstyle.net,2009://1.160</id>
   
   <published>2009-12-02T08:24:05Z</published>
   <updated>2009-12-02T08:38:48Z</updated>
   
   <summary> Web とは関係ない話ですが、写真を始めてから 2 年程になります。 感覚的には技術やうんちくを逆に知らない（知りたくない）ので純粋に楽しめて、特にフィルム一眼・トイカメラ・ポラロイドカメラなどのフィルムカメラにのめり込んで趣味で撮ってたんですが、趣味が高じて 1 枚だけ参加させてもらった「We Feel Fine: An Almanac of Human Emotion」という写真集みたいなアート本が本日発売されました。先日ニューヨーク（Brooklyn）の Powerhouse Books でリリースパーティがあった模様。人間の感情を表現する写真に特化しているらしいです。自分の写真を撮る時も感情を表現したいという思いが強いので、何だか共感してます。 物好きの方はAmazon Japan からどうぞ。 ・・・・・ シドニーのウィークリーマガジンにフリーランスフォトグラファーとしても参加する予定なので、写真がアツイ！！とか勝手に思ってます。ウェブも同様にうんちくに走らず楽しんで作るようにします。...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="普通の話" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="80" label="写真" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://dev.convexstyle.net/">
      <![CDATA[<a href="http://www.amazon.co.jp/We-Feel-Fine-Almanac-Emotion/dp/1439116830/" target="_blank"><img src="http://log.convexstyle.net/images/2009/november/we_feel_fine.jpg" width="350" height="350" alt="We Feel Fine: An Almanac of Human Emotion" title="We Feel Fine: An Almanac of Human Emotion" class="link" /></a>

Web とは関係ない話ですが、<a href="http://www.flickr.com/photos/convexstyle/" target="_blank">写真</a>を始めてから 2 年程になります。
感覚的には技術やうんちくを逆に知らない（知りたくない）ので純粋に楽しめて、特にフィルム一眼・トイカメラ・ポラロイドカメラなどのフィルムカメラにのめり込んで趣味で撮ってたんですが、趣味が高じて 1 枚だけ参加させてもらった「<a href="http://wefeelfine.org/book/" target="_blank">We Feel Fine: An Almanac of Human Emotion</a>」という写真集みたいなアート本が本日発売されました。先日ニューヨーク（Brooklyn）の <a href="http://maps.google.com/maps?f=q&source=s_q&hl=en&geocode=&q=powerhouse+books+37+main+street+brooklyn&sll=40.71838,-73.990517&sspn=0.138693,0.210457&gl=us&ie=UTF8&hq=powerhouse+books&hnear=37+Main+St,+Brooklyn,+NY+11201&ll=40.704083,-73.990645&spn=0.00867,0.013154&t=h&z=16&iwloc=A" target="_blank">Powerhouse Books</a> でリリースパーティがあった模様。人間の感情を表現する写真に特化しているらしいです。自分の写真を撮る時も感情を表現したいという思いが強いので、何だか共感してます。

物好きの方は<a href="http://www.amazon.co.jp/We-Feel-Fine-Almanac-Emotion/dp/1439116830/" target="_blank">Amazon Japan</a> からどうぞ。

・・・・・

シドニーのウィークリーマガジンにフリーランスフォトグラファーとしても参加する予定なので、写真がアツイ！！とか勝手に思ってます。ウェブも同様にうんちくに走らず楽しんで作るようにします。]]>
      
   </content>
</entry>
<entry>
   <title>遂に来たねー</title>
   <link rel="alternate" type="text/html" href="http://dev.convexstyle.net/2009/11/post_4.html" />
   <id>tag:dev.convexstyle.net,2009://1.154</id>
   
   <published>2009-11-18T08:14:39Z</published>
   <updated>2009-11-18T08:16:23Z</updated>
   
   <summary>Adobe Releases Flash Player 10.1 And AIR 2.0 – Both Include Multi-touch Support ほほー。楽しみ。...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="開発環境" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="2" label="Flash" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://dev.convexstyle.net/">
      <![CDATA[<a href="http://www.techcrunch.com/2009/11/16/adobe-flash-player-10-1-air-2-0/" target="_blank">Adobe Releases Flash Player 10.1 And AIR 2.0 – Both Include Multi-touch Support</a>

ほほー。楽しみ。]]>
      
   </content>
</entry>
<entry>
   <title>Flash CS4 クラッシュ in snow leopard</title>
   <link rel="alternate" type="text/html" href="http://dev.convexstyle.net/2009/11/flash_cs4_in_snow_leopard.html" />
   <id>tag:dev.convexstyle.net,2009://1.152</id>
   
   <published>2009-11-12T03:49:48Z</published>
   <updated>2009-11-12T04:01:10Z</updated>
   
   <summary>Snow Leopard インストール後、Flash CS4が起動後落ちるようになりました。 まさにこの記事通りなんですが、MAC の OS を Snow Leopard にした途端、Flash CS 4 が起動直後に何もせずに落ちるようになってしまった。CS4 をアンインストール＆インストールしても直んない。OS のクリーンインストールを回避して直す方法知りませんか～！！Fonts 系が怪しいのかもなあ。。。個人マシーンだけど、Flash が使えないと生きた心地がしない。 Help me !!!...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="開発環境" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="102" label="バグ" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://dev.convexstyle.net/">
      <![CDATA[<a href="http://forums.adobe.com/thread/487993" target="_blank">Snow Leopard インストール後、Flash CS4が起動後落ちるようになりました。</a>

まさにこの記事通りなんですが、MAC の OS を Snow Leopard にした途端、Flash CS 4 が起動直後に何もせずに落ちるようになってしまった。CS4 をアンインストール＆インストールしても直んない。OS のクリーンインストールを回避して直す方法知りませんか～！！Fonts 系が怪しいのかもなあ。。。個人マシーンだけど、Flash が使えないと生きた心地がしない。

Help me !!!]]>
      
   </content>
</entry>
<entry>
   <title>Zend_Service_ReCaptcha を使ってみる。</title>
   <link rel="alternate" type="text/html" href="http://dev.convexstyle.net/2009/11/zend_service_recaptcha.html" />
   <id>tag:dev.convexstyle.net,2009://1.151</id>
   
   <published>2009-11-09T07:36:14Z</published>
   <updated>2009-11-09T07:49:00Z</updated>
   
   <summary>Optical Character Recognition 技術で有名な悪意ユーザーを退治する ReCaptcha が Zend_Service に知らないうちに組み込まれてたんでプロジェクトに使ってみる。かなりシンプルな API 対応なんで想像つくけど、あるもんは使う。 reCAPTCHA でアカウントを作って、Public Key と Private Key を作成。 これを ini ファイルに設定して、こんな感じで設定。 $_params = array( &apos;theme&apos; =&gt; &apos;blackglass&apos; ); $this-&gt;_recaptcha = new Zend_Service_ReCaptcha($this-&gt;_recaptchaIni-&gt;public_key, $this-&gt;_recaptchaIni-&gt;private_key); $this-&gt;_recaptcha-&gt;setOptions($_params); View には $this-&gt;view-&gt;_recaptcha = $this-&gt;_recaptcha-&gt;getHtml(); 後は変数に post...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="PHP" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="Zend Framework" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="62" label="Framework" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="31" label="PHP" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="93" label="Zend" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="44" label="Zend Framework" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://dev.convexstyle.net/">
      <![CDATA[<a href="http://ja.wikipedia.org/wiki/%E5%85%89%E5%AD%A6%E6%96%87%E5%AD%97%E8%AA%8D%E8%AD%98" target="_blank">Optical Character Recognition</a> 技術で有名な悪意ユーザーを退治する <a href="http://framework.zend.com/manual/ja/zend.service.recaptcha.html" target="_blank">ReCaptcha</a> が Zend_Service に知らないうちに組み込まれてたんでプロジェクトに使ってみる。かなりシンプルな API 対応なんで想像つくけど、あるもんは使う。

<a href="http://recaptcha.net/" target="_blank"><img src="http://dev.convexstyle.net/images/entry/200911/recaptcha.gif" width="322" height="133" alt="Recaptcha" title="Recaptcha" class="link" /></a>

reCAPTCHA でアカウントを作って、Public Key と Private Key を作成。
これを ini ファイルに設定して、こんな感じで設定。

<pre class="prettyprint">
$_params = array(
    'theme' => 'blackglass'
);
$this->_recaptcha = new Zend_Service_ReCaptcha($this->_recaptchaIni->public_key, $this->_recaptchaIni->private_key);
$this->_recaptcha->setOptions($_params);
</pre>

View には

<pre class="prettyprint">
$this->view->_recaptcha = $this->_recaptcha->getHtml();
</pre>

後は変数に post された際に下記な感じか。

<pre class="prettyprint">
if($_req->isPost()) {
    $_recaptcha_challenge_field = $_req->getPost('recaptcha_challenge_field');
    $_recaptcha_response_field  = $_req->getPost('recaptcha_response_field');
    $_recaptchaResult = $this->_recaptcha->verify(
        $_recaptcha_challenge_field,
        $_recaptcha_response_field
    );			
    if(!$_recaptchaResult->isValid()) {
        $_msg = 'reCaptcha field is needed to be filled correctly.';
        array_push($this->_errors, $_msg);
    }			
    if(!empty($this->_errors)) {					
        return;
    }
}
</pre>

楽やな。

・・・・・

海外に来て、日本じゃあまり聞いたことの無いサービスの API に連携しないといけない事が多々ある。自分だけ知らないのかもしれないが。<a href="http://www.silverpop.com/" target="_blank">Silverpop</a> がその１つ。メーリングリスト系のウェブサービスらしい。さすがにこれは Zend_Service に無かった。PHP 系のサイト制作には高頻度使用なので、自作しよう。

日本ではあり得ない仕様が海外だと結構あり得たりする。
ここら辺は本当にむずい。そのうちここら辺については書こう。]]>
      
   </content>
</entry>
<entry>
   <title>RemoteProxy class を考えてみる。</title>
   <link rel="alternate" type="text/html" href="http://dev.convexstyle.net/2009/11/remoteproxy_class.html" />
   <id>tag:dev.convexstyle.net,2009://1.149</id>
   
   <published>2009-11-08T08:13:48Z</published>
   <updated>2009-11-08T08:25:15Z</updated>
   
   <summary>Flash プロジェクトで大抵外部にアクセスするのは画像・XML・API・Remoting・バイナリ通信・たまにテキスト辺りだと思うので、プロジェクト毎に各 View クラスの 親クラスに必要な Proxy クラスを拡張した RemoteProxy のインスタンスを protected で出し入れしておくとかなり楽な気がする。Loader・URLLoader や独自ラッパークラスのインスタンス生成を View 毎にする必要が無くなる。 RemoteProxy の強みは何と言っても Dynamic クラスのため、プロパティや関数を動的に作成することが出来ること。いちいちその都度その都度外部にアクセスするために public 関数を独自に定義するを必要が無い。要は callProperty で設定する関数の syntax や setProperty で渡す変数名を個人的な決め毎で設定しておけば、かなりの確率で再度設定する必要が無い。 例えば、Zend_Amf_Server の UserController の debug という関数を呼び出すとすると、View クラスでは this._cfZendAmfProxy.addEventListener(CFZendAmfProxyEvent.RESULT, _resultHandler, false, 0, true); this._cfZendAmfProxy.addEventListener(IOErrorEvent.IO_ERROR, _ioErrorHandler,...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="ActionSctipt 3.0" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="Flash" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="27" label="ActionScript 3.0" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="17" label="Flash Remoting" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="62" label="Framework" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://dev.convexstyle.net/">
      <![CDATA[Flash プロジェクトで大抵外部にアクセスするのは画像・XML・API・Remoting・バイナリ通信・たまにテキスト辺りだと思うので、プロジェクト毎に各 View クラスの 親クラスに必要な <a href="http://livedocs.adobe.com/flex/3_jp/langref/flash/utils/Proxy.html" target="_blank">Proxy クラス</a>を拡張した RemoteProxy のインスタンスを protected で出し入れしておくとかなり楽な気がする。Loader・URLLoader や独自ラッパークラスのインスタンス生成を View 毎にする必要が無くなる。

RemoteProxy の強みは何と言っても Dynamic クラスのため、プロパティや関数を動的に作成することが出来ること。いちいちその都度その都度外部にアクセスするために public 関数を独自に定義するを必要が無い。要は callProperty で設定する関数の syntax や setProperty で渡す変数名を個人的な決め毎で設定しておけば、かなりの確率で再度設定する必要が無い。

例えば、Zend_Amf_Server の UserController の debug という関数を呼び出すとすると、View クラスでは

<pre class="prettyprint">
this._cfZendAmfProxy.addEventListener(CFZendAmfProxyEvent.RESULT, _resultHandler, false, 0, true);
this._cfZendAmfProxy.addEventListener(IOErrorEvent.IO_ERROR, _ioErrorHandler, false, 0, true);
this._cfZendAmfProxy.UserController_debug('Hello World');
</pre>

で、RemoteProxy class 内部は

<pre class="prettyprint">
flash_proxy override function callProperty(method:*, ...params):*
{
    _call(method, params);
}
private function _call(method:*, params:*):void
{
    var methodName:String = method.toString();
    if(methodName.indexOf("_"))
        methodName = methodName.split("_").join(".");		
    this._nc.call(methodName, this._responder, params[0]);
}
</pre>

また、Zend_Amf_Server の UserController の sendMail という関数を呼び出すとすると、View クラスでは

<pre class="prettyprint">
this._cfZendAmfProxy.addEventListener(CFZendAmfProxyEvent.RESULT, _resultHandler, false, 0, true);
this._cfZendAmfProxy.addEventListener(IOErrorEvent.IO_ERROR, _ioErrorHandler, false, 0, true);
this._cfZendAmfProxy.UserController_debug(mailVO);
</pre>

という感じで RemoteProxy class の内部は変わらない。]]>
      <![CDATA[また、画像や XML の読み込みは下記の様な感じで設定して

<pre class="prettyprint">
this._cfProxy.xml = "test.xml";
this._cfProxy.addEventListener(Event.COMPLETE, _completeHandler, false, 0, true);
this._cfProxy.addEventListener(IOErrorEvent.IO_ERROR, _ioErrorHandler, false, 0, true);
this._cfProxy.loadXml();
// もしくは
this._cfProxy.asset = "test.jpg";
this._cfProxy.addEventListener(Event.COMPLETE, _completeHandler, false, 0, true);
this._cfProxy.addEventListener(IOErrorEvent.IO_ERROR, _ioErrorHandler, false, 0, true);
this._cfProxy.loadAsset();
</pre>

で、RemoteProxy class 内部は

<pre class="prettyprint">
flash_proxy override function callProperty(name:*, ...args):*
{
    var methodName:String = name.toString();
    switch(methodName)
    {
        case "loadXml":
        {
            _loadXml();
            break;
        }
        case "loadAsset":
        {
            _loadAsset();
           break;
        }
        default:
        {
            _call(methodName, args);
            break;	
        }
    }
}
</pre>

view 側では基本は４行ぐらいで済む。
Event が dispatch されたらきちんと removeEventListener はしておいた方が良い。
個人的には、FlickrProxy とか Twitter Proxy  とか API が充実してるウェブサービス用にも各自 RemoteProxy クラスを作って確保してあります。

・・・・・

今日はシドニーは雨で結構寒いってのに、カフェはマックスでクーラー効きまくってる。
確かにオージーは冬でも半袖着てるしなあ。。超、さみー！！]]>
   </content>
</entry>
<entry>
   <title>Zend_Paginator を使ってみる。</title>
   <link rel="alternate" type="text/html" href="http://dev.convexstyle.net/2009/11/zend_paginator.html" />
   <id>tag:dev.convexstyle.net,2009://1.148</id>
   
   <published>2009-11-06T07:52:27Z</published>
   <updated>2009-11-06T07:58:55Z</updated>
   
   <summary>こんにちわ。 Sydney に渡って前半開発に頑張りすぎて肩こりが酷くなったので、たまには運動しないとと思い最近 15 年くらいやってて多少自信があったスケボーを購入してやり始めたんですが、2 週間目で疲労骨折気味になってしまい、全く動けなくなっている convexstyle です。意味ねえ… ・・・・・ 最近のプロジェクトで Zend_Paginator を初めて使ってみました。 今までは PEAR::Pager を使っていたけど、Zend Framework に入ってなかなか便利だというのを聞いていたので使ったが便利だった。 Zend_Paginator_Adapter_DbSelect はかなり良いらしいが、今回は CMS の API 経由で XML をパースして表示する形式だったので、シンプルに Zend_Paginator_Adapter_Array をアダプタとしては使用した。 ページにどの様に表示するかは CSS/XHTML とテンプレートエンジン（Smarty など）の問題なので、色々やり方はあるしそこまで重要では無いが、重要な点はどの様に URI の syntax をテンプレートエンジンのレンダリング結果に受け渡すかだろう。 まずはどの様な値が Zend_Paginator から返されるか dump してみる。...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="PHP" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="Zend Framework" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="31" label="PHP" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="93" label="Zend" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="44" label="Zend Framework" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://dev.convexstyle.net/">
      <![CDATA[こんにちわ。
Sydney に渡って前半開発に頑張りすぎて肩こりが酷くなったので、たまには運動しないとと思い最近 15 年くらいやってて多少自信があったスケボーを購入してやり始めたんですが、2 週間目で疲労骨折気味になってしまい、全く動けなくなっている <a href="http://www.convexstyle.com/" target="_blank">convexstyle</a> です。意味ねえ…

・・・・・

最近のプロジェクトで <a href="http://framework.zend.com/manual/ja/zend.paginator.html" target="_blank">Zend_Paginator</a> を初めて使ってみました。
今までは <a href="http://pear.php.net/package/Pager" target="_blank">PEAR::Pager</a> を使っていたけど、Zend Framework に入ってなかなか便利だというのを聞いていたので使ったが便利だった。

Zend_Paginator_Adapter_DbSelect はかなり良いらしいが、今回は CMS の API 経由で XML をパースして表示する形式だったので、シンプルに Zend_Paginator_Adapter_Array をアダプタとしては使用した。

ページにどの様に表示するかは CSS/XHTML とテンプレートエンジン（Smarty など）の問題なので、色々やり方はあるしそこまで重要では無いが、重要な点はどの様に URI の syntax をテンプレートエンジンのレンダリング結果に受け渡すかだろう。

まずはどの様な値が Zend_Paginator から返されるか dump してみる。

<pre class="prettyprint">
$_paginator = new Zend_Paginator(new Zend_Paginator_Adapter_Array($_data));
$_paginator->setCurrentPageNumber($_pageId);
$_paginator->setItemCountPerPage($this->_pagerIni->blog_per_page);
$_paginator->setPageRange($this->_pagerIni->page_range);
<strong>Zend_Debug::dump($_paginator->getPages('Sliding'));</strong>
</pre>

結果は stdClass 形式で下記の様に返される。

<pre class="prettyprint">
object(stdClass)#69 (12) {
  ["pageCount"]=>
  int(1)
  ["itemCountPerPage"]=>
  int(3)
  ["first"]=>
  int(1)
  ["current"]=>
  int(1)
  ["last"]=>
  int(1)
  ["pagesInRange"]=>
  array(1) {
    [1]=>
    float(1)
  }
  ["firstPageInRange"]=>
  float(1)
  ["lastPageInRange"]=>
  float(1)
  ["currentItemCount"]=>
  int(2)
  ["totalItemCount"]=>
  int(2)
  ["firstItemNumber"]=>
  int(1)
  ["lastItemNumber"]=>
  int(2)
}
</pre>]]>
      <![CDATA[後はどの様に URI を割り当てるかが問題なので、下記の様な自作クラスを作成して、この stdClass を渡す。

<pre class="prettyprint">
class Convexstyle_Paginator_Pages
{
	private $_pages;
	private $_uri;
	private $_placeHolder;
	public function __construct(stdClass $pages)
	{
		$this->_pages = $pages;
	}
	public function __get($value)
	{
		return $this->_pages->$value;
	}
	public function setUri($uri, $placeHolder)
	{
		$this->_uri         = $uri;
		$this->_placeHolder = $placeHolder;
	}
	public function uri($value)
	{
	    return strtr(
	    	$this->_uri, 
	    	array($this->_placeHolder => $value)
	    );
	}
	public function __destruct()
	{
		
	}	
}
</pre>

インスタンス化の際に好きな形式な URI を setUri に渡して、どれが可変に変わるページ番号（ここでは $_pageId）になるかの placeHolder を２番目のパラメータとして割り当てるだけ。

<pre class="prettyprint">
$_pages = new Convexstyle_Paginator_Pages($_paginator->getPages('Sliding'));
$_pages->setUri('blog/page/%$pageId%', '%$pageId%');
</pre>

後はこの $_pages オブジェクトを view に渡して完了！

<pre class="prettyprint">
$this->view->_pager = $_pages;
</pre>

Smarty 側では例えばこんな感じか。

<pre class="prettyprint">
&lt;ul&gt;
    &lt;% math equation=a+b a=$_pager-&gt;pageCount b=1 assign="_pagerTotal" %&gt;
    &lt;% section start=1 name="pager" loop=$_pagerTotal %&gt;
    &lt;% if $_pager-&gt;current == $smarty.section.pager.index %&gt;                                    
    &lt;li id="active"&gt;&lt;% $smarty.section.pager.index %&gt;&lt;/li&gt;
    &lt;% else %&gt;
    &lt;li class="pager-link"&gt;&lt;a href="&lt;% $_pager-&gt;uri($smarty.section.pager.index) %&gt;"&gt;&lt;% $smarty.section.pager.index %&gt;&lt;/a&gt;&lt;/li&gt;&lt;% /if %&gt;
    &lt;% /section %&gt;
&lt;/ul&gt;
</pre>

<a href="http://life.co-hey.com/2008/12/zend_pagenator/" target="_blank">LIFE さんの方法</a>を試してみたけど、途中でギブアップしました。viewHelper としてやってんのかな？

・・・・・

ちなみに 
<a href="http://www.smarty.net/" target="_blank">Smarty 3 がもうちょいですね！</a>
<a href="http://opensource.adobe.com/wiki/display/cairngorm/Cairngorm+3" target="_blank">Cairngorm 3 ももうちょいですね！</a>

バージョン 3 が多いな、何か。
共に、高頻度使用なので目を通しておかんとなあ！]]>
   </content>
</entry>
<entry>
   <title>Fluent Interface が気になる。</title>
   <link rel="alternate" type="text/html" href="http://dev.convexstyle.net/2009/10/fluent_interface.html" />
   <id>tag:dev.convexstyle.net,2009://1.145</id>
   
   <published>2009-10-28T08:58:41Z</published>
   <updated>2009-10-28T09:03:21Z</updated>
   
   <summary>最近、この手法が気になる。...</summary>
   <author>
      <name></name>
      
   </author>
   
   <category term="97" label="OOP" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://dev.convexstyle.net/">
      <![CDATA[最近、この<a href="http://en.wikipedia.org/wiki/Fluent_interface" target="_blank">手法</a>が気になる。]]>
      
   </content>
</entry>
<entry>
   <title>Zend_Amf + Win/Linux compatibility</title>
   <link rel="alternate" type="text/html" href="http://dev.convexstyle.net/2009/10/zend_amf_winlinux_compatibilit.html" />
   <id>tag:dev.convexstyle.net,2009://1.144</id>
   
   <published>2009-10-24T08:22:56Z</published>
   <updated>2009-10-28T01:51:18Z</updated>
   
   <summary><![CDATA[最近 PHP よりのネタばかりだ。。。 Windows サーバでの開発とかした時が無かったし、Flash デベロッパーのつもりなんであんま気にしてなかったんだけど、Zend Amf Server を設置して Flash と連携しようと思ってはまった。まあ、バックスラッシュとかそういった問題なんだけど一瞬途方に暮れたんでメモ。PHP 専門の人には基本中の基本だろうけど。 Zend Amf Server 単体も個人的には通常の Zend Framework での開発と構成を同じにしたいので、ini_set でライブラリをいつもの様に下記の様に設定。でもこれだと Windows で動かず。 ini_set('include_path',ini_get('include_path').':../_application/libs:'); すべてを吸収するのは不可能だとか途方に暮れてたら、PATH_SEPARATOR とか定数があるんですね。知りませんでした。なので下記の様に変更する事で対応出来ました。これで windows（xampp など）のローカルでの簡単なテストも行けますね。 &lt;?php if(!defined('PATH_SEPARATOR')) { if(substr(strtoupper(PHP_OS), 0, 3) == 'WIN') { define('PATH_SEPARATOR', ';'); } else...]]></summary>
   <author>
      <name></name>
      
   </author>
         <category term="Zend Framework" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="2" label="Flash" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="31" label="PHP" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="44" label="Zend Framework" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://dev.convexstyle.net/">
      <![CDATA[最近 PHP よりのネタばかりだ。。。

Windows サーバでの開発とかした時が無かったし、Flash デベロッパーのつもりなんであんま気にしてなかったんだけど、Zend Amf Server を設置して Flash と連携しようと思ってはまった。まあ、バックスラッシュとかそういった問題なんだけど一瞬途方に暮れたんでメモ。PHP 専門の人には基本中の基本だろうけど。

<a href="http://framework.zend.com/manual/ja/zend.amf.server.html" target="_blank">Zend Amf Server</a> 単体も個人的には通常の Zend Framework での開発と構成を同じにしたいので、ini_set でライブラリをいつもの様に下記の様に設定。でもこれだと Windows で動かず。

<pre class="prettyprint">
ini_set('include_path',ini_get('include_path').':../_application/libs:');
</pre>

すべてを吸収するのは不可能だとか途方に暮れてたら、PATH_SEPARATOR とか定数があるんですね。知りませんでした。なので下記の様に変更する事で対応出来ました。これで windows（xampp など）のローカルでの簡単なテストも行けますね。

<pre class="prettyprint">
&lt;?php
<strong>if(!defined('PATH_SEPARATOR')) {
    if(substr(strtoupper(PHP_OS), 0, 3) == 'WIN') {
        define('PATH_SEPARATOR', ';');
    } else {
        define('PATH_SEPARATOR', ':');
    }
}</strong>
ini_set('include_path', ini_get('include_path') . PATH_SEPARATOR . '../_application/libs');
//. .(一部削除) . .
$_envIni = new Zend_Config_Ini(CONFIG_BASE . 'app.ini', 'env');
$_server   =& new Zend_Amf_Server();
$_server->setClass('UserController');
$_server->setClassMap('UserVO', 'UserVO');
if($_envIni->status == 'test') {
    $_server->setProduction(false);
}
$_response = $_server->handle();
echo $_response;
</pre>

・・・・・

2011 年初め辺りに日本に復帰するだろう。まだ１年以上あるんだけど、その時期が自分的にはいい時期です。また日本で働ける様に、それまで海外でもっとウェブを鍛錬します。]]>
      
   </content>
</entry>
<entry>
   <title>fancybox + URL 書き換え + Zend Framework</title>
   <link rel="alternate" type="text/html" href="http://dev.convexstyle.net/2009/10/fancybox_dynamic_url_zend_fram.html" />
   <id>tag:dev.convexstyle.net,2009://1.143</id>
   
   <published>2009-10-21T16:00:03Z</published>
   <updated>2009-10-22T07:08:22Z</updated>
   
   <summary> Javascript と言えば、自前か JQuery 関連以外はあんまり使ったことが無いので library とか良く分からないですが、最近 thickbox 風の fancybox っていうのをプロジェクトで初めて使ってみた。使い方は物凄く簡単であえて説明をする必要もないので使用方法を見てもらうとして、こんな感じの見た目。 ここ で、決まった URL 静的に html に記述、もしくは動的な URL を PHP 等でレンダリングして fancybox を割り当てるのは簡単なんですが、DOM 生成後に fancybox への URL をイベント毎に変更して割り当てるにはどうするんだと思って少しはまったのでメモ。 例えばユーザーの入力要素を付加した動的な URL（Zend Framework では Get 変数や UserParam 変数）を iframe 表示する場合。表示エリアが十分で、非同期に Ajax 処理できる場合は特に...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="Javascript" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="Zend Framework" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="4" label="Javascript" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="95" label="JQuery" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="44" label="Zend Framework" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://dev.convexstyle.net/">
      <![CDATA[<a href="http://fancybox.net/" target="_blank"><img src="http://dev.convexstyle.net/images/entry/200910/fancybox_logo.gif" width="386" height="110" alt="Fancybox" title="Fancybox" class="link" /></a>

Javascript と言えば、自前か JQuery 関連以外はあんまり使ったことが無いので library とか良く分からないですが、最近 thickbox 風の <a href="http://fancybox.net/" target="_blank">fancybox</a> っていうのをプロジェクトで初めて使ってみた。使い方は物凄く簡単であえて説明をする必要もないので<a href="http://fancybox.net/howto" target="_blank">使用方法</a>を見てもらうとして、こんな感じの見た目。

<a href="http://www.convexstyle.net/test/fancybox.html" target="_blank">ここ</a>

で、決まった URL 静的に html に記述、もしくは動的な URL を PHP 等でレンダリングして fancybox を割り当てるのは簡単なんですが、DOM 生成後に fancybox への URL をイベント毎に変更して割り当てるにはどうするんだと思って少しはまったのでメモ。

例えばユーザーの入力要素を付加した動的な URL（Zend Framework では Get 変数や UserParam 変数）を iframe 表示する場合。表示エリアが十分で、非同期に Ajax 処理できる場合は特に fancybox を選択する必要が無いので問題ないんだけど、表示スペースの問題でポップアップが必要な場合に当てはまるかも。ちなみに fancybox には thickbox の tb_show や tb_remove 等の様に関数からの処理が出来ない模様。
]]>
      <![CDATA[例えば、Zend Framework で <strong>signup/index/email/任意のメールアドレス/?iframe</strong> という URL 形式で fancybox を起動したい場合。fancybox は a タグの href に既に値が設定されている前提で起動するので、クリックイベントによって fancybox が起動してしまうから普通にはクリック時に書き換えが出来ない。無理やり下記の様に変更しようとしても、fancybox の起動の方が速いので、href の変更は反映されない。

<pre>
&lt;script language="Javascript" type="text/javascript"&gt;
&lt;!--
    $(document).ready(function(){
        $('a#testClick').fancybox({
            'frameWidth': 800,
            'frameHeight': 600
        });
        $('a#testClick').click(function(){
            var _email = $('input#email').val();
            $('a#testClick').attr('href', '/signup/index/email/' + _email + '/?iframe');
        });
    });
//--&gt;
&lt;/script&gt;
&lt;form id="testForm"&gt;
    &lt;input type="text" id="email" /&gt;
&lt;/form&gt;
&lt;a href="http://maps.google.com/?iframe" id="testClick"&gt;test&lt;/a&gt;
</pre>

なので、クリックイベント時に URL 生成するのと、fancybox を切り分けたいと思い、空の a タグを作成し、この空の方へ fancybox を割り当て、クリックイベントを発生させる a タグはその URL を変更する様に変更し、最後に、JQuery の click イベントを実行することで回避できた。本来は maps.google.com を表示するはずだけど、それはされない。

<pre>
&lt;script language="Javascript" type="text/javascript"&gt;
&lt;!--
    $(document).ready(function(){
        $('a#linkHolder').fancybox({
            'frameWidth': 800,
            'frameHeight': 600
        });
        $('a#testClick').click(function(){
            var _email = $('input#email').val();
            <strong>$('a#linkHolder').attr('href', '/signup/index/email/' + _email + '/?iframe');</strong>
            <strong>$('a#linkHolder').click();</strong>
        });
    });
//--&gt;
&lt;/script&gt;
&lt;form id="testForm"&gt;
    &lt;input type="text" id="email" /&gt;
&lt;/form&gt;
&lt;a href="Javascript:void(0);" id="testClick"&gt;test&lt;/a&gt; 
&lt;a href="http://maps.google.com/?iframe" id="linkHolder"&gt;
</pre>

JQuery の click イベントを関数内で呼び出すっていうのは使えるケースが色々ある様な気がする。
これだと Flash からも呼び出すことが可能ですね！

・・・・・

[<strong>参考サイト</strong>]
<a href="http://fancybox.net/" target="_blank">fancybox</a>
<a href="http://semooh.jp/jquery/" target="_blank">JQuery</a>
]]>
   </content>
</entry>
<entry>
   <title>Zend_View の複製 - clone -</title>
   <link rel="alternate" type="text/html" href="http://dev.convexstyle.net/2009/10/zend_view_clone.html" />
   <id>tag:dev.convexstyle.net,2009://1.141</id>
   
   <published>2009-10-20T10:01:39Z</published>
   <updated>2009-10-20T22:45:23Z</updated>
   
   <summary><![CDATA[シドニーに来て一番忙しかった週を乗り越えて、ようやく少しだけゆったり出来る！ クリスマスに向けて海外は追い込みなんですよねー。 ・・・・・ そんな感じで、PHP でオブジェクトを複製するのに clone ってのが使えるんですね。 例えばメールを送る時や API の Post データのレンダリングを動的に行う時など、Zend_View_Interface を implements した Zend_View_Smarty（名前は任意）を複製して通常の View の処理と明示的に分けたりする。ここら辺の修理は以前非効率なやり方してた。 例えばこんな感じか。 public function testAction() { $_req =& $this->getRequest(); $_firstname = $_req->getPost('firstname'); $_lastname = $_req->getPost('lastname'); $_email = $_req->getPost('email'); $_from = $this->mailIni->from; $_subject =...]]></summary>
   <author>
      <name></name>
      
   </author>
         <category term="Zend Framework" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="62" label="Framework" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="31" label="PHP" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="93" label="Zend" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="44" label="Zend Framework" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://dev.convexstyle.net/">
      <![CDATA[シドニーに来て一番忙しかった週を乗り越えて、ようやく少しだけゆったり出来る！
クリスマスに向けて海外は追い込みなんですよねー。

・・・・・

そんな感じで、PHP でオブジェクトを複製するのに clone ってのが使えるんですね。
例えばメールを送る時や API の Post データのレンダリングを動的に行う時など、Zend_View_Interface を implements した Zend_View_Smarty（名前は任意）を複製して通常の View の処理と明示的に分けたりする。ここら辺の修理は以前非効率なやり方してた。

例えばこんな感じか。

<pre>
public function testAction()
{
    $_req       =& $this->getRequest();
    $_firstname = $_req->getPost('firstname');
    $_lastname  = $_req->getPost('lastname');
    $_email     = $_req->getPost('email');
    $_from      = $this->mailIni->from;
    $_subject   = $this->mailIni->subject;
    $_data = array(
    );
    $_mailData = array(
        'firstname' => $_firstname,
        'lastname'  => $_lastname
    );
    // View の複製
    <strong>$_view = clone $this->view;</strong>
    $_view->assign('_mailData', $_mailData);
    $_body = $_view->render('mail/_body.tpl');
    $_mail =& new Zend_Mail();
    $_mail->addTo($_email);
    $_mail->setFrom($_from);
    $_mail->serSubject($_subject);
    $_mail->setBodyText($_body);
    $_mail->send();
    // 通常の View
    $this->view->data = $_data;
}
</pre>

・・・・・

[<strong>参考サイト</strong>]
<a href="http://php.benscom.com/manual/ja/language.oop5.cloning.php" target="_blank">オブジェクトのクローン作成</a>]]>
      
   </content>
</entry>
<entry>
   <title>DoubleClick-InStream + AS3</title>
   <link rel="alternate" type="text/html" href="http://dev.convexstyle.net/2009/09/doubleclickinstream_as3.html" />
   <id>tag:dev.convexstyle.net,2009://1.133</id>
   
   <published>2009-09-04T12:33:08Z</published>
   <updated>2009-09-04T12:53:46Z</updated>
   
   <summary> 通常の Flv ビデオを FlvPlayBack や Video オブジェクトで再生する際に、何からの宣伝やコマーシャル用のプリロールやミッドロールやポストロールビデオを流す際に便利な DoubleClick-InStream。プラットフォームは Flash Player、Silverlight、Windows Media Player、Real Player に対応しています。リクエストする URL にアクセスすると doubleclick サーバが xml にリダイレクトして、広告タイプによって値を返してきて、それを Flash 側でどの様に表示するかをリスポンスの後に設定します。自分は FlvPlayBack を使用して他の Flv と連携する Flash in Flash タイプを使用したので、doubleclick サーバにアクセスすると勝手に Flv とリンク先が返ってきました。 自分も 100 ％理解した訳ではなくドキュメントを読んでも分からない部分があったんですが、今回のプロジェクトでは上手く通常の Flv と宣伝用 Flv...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="ActionSctipt 3.0" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="Flash" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="Library" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="87" label="Advertisement" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="85" label="Flv" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://dev.convexstyle.net/">
      <![CDATA[<img src="http://dev.convexstyle.net/images/entry/200909/doubleclick.gif" width="500" height="335" alt="DoubleClick-InStream" title="DoubleClick-InStream" />

通常の Flv ビデオを FlvPlayBack や Video オブジェクトで再生する際に、何からの宣伝やコマーシャル用のプリロールやミッドロールやポストロールビデオを流す際に便利な <a href="http://code.google.com/intl/ja-JP/apis/in-stream/docs/index.html" target="_blank">DoubleClick-InStream</a>。プラットフォームは Flash Player、Silverlight、Windows Media Player、Real Player に対応しています。リクエストする URL にアクセスすると doubleclick サーバが xml にリダイレクトして、広告タイプによって値を返してきて、それを Flash 側でどの様に表示するかをリスポンスの後に設定します。自分は FlvPlayBack を使用して他の Flv と連携する Flash in Flash タイプを使用したので、doubleclick サーバにアクセスすると勝手に Flv とリンク先が返ってきました。

自分も 100 ％理解した訳ではなくドキュメントを読んでも分からない部分があったんですが、今回のプロジェクトでは上手く通常の Flv と宣伝用 Flv を難しいコードを記述すること無く同期出来たので、自分の為に忘れない様にメモ。

<strong>（１）インストール</strong>

MXP で入れるタイプと SDK で入れるタイプが google code より提供されています。タイプも <a href="http://code.google.com/apis/in-stream/docs/sdks/googleflashas3.html" target="_blank">Google In-Stream</a> と <a href="http://code.google.com/apis/in-stream/docs/sdks/flashas3.html" target="_blank">DoubleClick In-Stream</a> があるようで、自分は Google In-Stream を使用したんですが、後者は書くソースが違って結果は同じようです。

<strong>（２）リクエストとリスポンス</strong>

下記の様な URL にアクセスします。ブラウザでアクセスすると Windows Media Player が起動しますが、Component や SDK ベースのコードベースでアクセスすると、内的な処理は XML で返ってるようです。その後の処理はどうなってるかはよく分かりません。

<pre>
http://ad.doubleclick.net/pfadx/AngelaSite;kw=dclkvideo;sz=120x350;ord=3577745;
</pre>

Google In-Stream の場合は <a href="http://code.google.com/intl/ja-JP/apis/in-stream/docs/sdks/googleflashas3_apis.html#AdsLoader" target="_blank">AdsLoader</a> と <a href="http://code.google.com/intl/ja-JP/apis/in-stream/docs/sdks/googleflashas3_apis.html#AdsRequest" target="_blank">AdsRequest</a> クラスを使用してアクセスするので、URLLoader クラスと URLRequest クラスのを使用する方法といたって基本は同じです。


<strong>（３）マッピング</strong>

リスポンスは AdsRequest.adType の値によって変わるようなので、この値を基に  AdsLoader.load した際のイベントハンドラ内でどのようなメディアが返ってくるか判断します。Video の表示は <a href="http://code.google.com/intl/ja-JP/apis/in-stream/docs/sdks/googleflashas3_apis.html#VideoAdsManager" target="_blank">VideoAdsManager</a> を使用して行います。ここで凄いな！って思ったのは、videoAdsManager.load(flvPlayBack or VideoObject) / videoAdsManager.play(flvPlayBack or VideoObject) を設定するだけで、勝手に Flv が通常の FlvPlayBack や Video オブジェクトに表示されちゃうことです。後は AdEvent.COMPLETE イベントハンドラが呼ばれたら Flv の表示は終了なのでこのタイミングで任意の処理をします。１つ忘れては行けないことは videoAdsManager.clickTrackingElement に任意の DisplayObject を設定してやることです。そうしないとエラーになります。自分の場合はプリロールなので、AdEvent.COMPLETE が dispatch された時点で、次の通常の Flv を表示する様にコーディングしました。

<strong>（４）集計</strong>

ドキュメントによれば load や complete のトラッキングや AFV(Adsense for Video) でクリックのインプレッションをトラッキングしてくれるそうです。]]>
      <![CDATA[<strong>（５）基本のソースの流れは下記な感じです。</strong>

<pre>
package view.contents
{	
	import com.google.ads.instream.api.AdErrorEvent;
	import com.google.ads.instream.api.AdEvent;
	import com.google.ads.instream.api.AdLoadedEvent;
	import com.google.ads.instream.api.AdsLoadedEvent;
	import com.google.ads.instream.api.AdsLoader;
	import com.google.ads.instream.api.AdsManager;
	import com.google.ads.instream.api.AdsManagerTypes;
	import com.google.ads.instream.api.AdsRequest;
	import com.google.ads.instream.api.VideoAdsManager;
	import fl.video.FLVPlayback;	
	import flash.display.MovieClip;
	import flash.events.Event;
	public class TestDoubleClickInStream extends MovieClip
	{
		private var _compPlayer:FLVPlayback;
		private var _mcButton:MovieClip;
		private var _adsLoader:AdsLoader;
		private var _adsManager:AdsManager;
		public function TestDoubleClickInStream()
		{
			super();
			this.init();
		}
		private function init():void
		{
			this._compPlayer = this["compFlvPlayBack"];
			this._mcButton   = this["mcButton"];
			this.addEventListener(Event.ADDED_TO_STAGE, onAddedToStage, false, 0, true);
		}
		private function onAddedToStage(evt:Event):void
		{
			<strong>this.loadAd();</strong>
		}
		private function loadAd():void
		{
			// AdsLoader
			this._adsLoader  = new AdsLoader();
			this.stage.addChild(this._adsLoader);
			this._adsLoader.addEventListener(AdsLoadedEvent.ADS_LOADED, onAdsLoaded, false, 0, true);
			this._adsLoader.addEventListener(AdErrorEvent.AD_ERROR, onAdError, false, 0, true);
			// Create AdsRequest
			var adsRequest:AdsRequest = new AdsRequest();
			adsRequest.adSlotWidth = 400;
			adsRequest.adSlotHeight = 300;
			adsRequest.adTagUrl = "http://ad.doubleclick.net/pfadx/AngelaSite;kw=dclkvideo;sz=120x350;ord=3577745;";
			adsRequest.adType = "video";
			adsRequest.maxTotalAdDuration = 12000;
			adsRequest.adSlotHorizontalAlignment = "center";
			adsRequest.adSlotVerticalAlignment     = "middle";
			adsRequest.contentId = "unique-content-identifier";			
			// Request ads
			this._adsLoader.requestAds(adsRequest);
		}
		private function playContent():void {	
			this._compPlayer.source = "http://www.covexstyle.com/test.flv";
		}
		private function onAdsLoaded(evt:AdsLoadedEvent):void
		{
			trace("Loaded");
			this._adsManager = evt.adsManager;
			this._adsManager.addEventListener(AdErrorEvent.AD_ERROR, onAdError, false, 0, true);
			this._adsManager.addEventListener(AdEvent.COMPLETE, onCompleteHandler, false, 0, true);
			if(this._adsManager.type == AdsManagerTypes.VIDEO)
			{
				var videoAdsManager:VideoAdsManager = this._adsManager as VideoAdsManager;
				videoAdsManager.clickTrackingElement = this._mcButton;
				this._adsManager.load(this._compPlayer);
				this._adsManager.play(this._compPlayer);
			}
		}
		private function onPrerollVideoLoadedHandler(evt:AdsLoadedEvent):void
		{
			trace("Loaded");
		}
		private function onCompleteHandler(evt:AdEvent):void
		{
			<strong>this.playContent();</strong>
		}
		private function onLoadedHandler(evt:AdLoadedEvent):void
		{
			trace("Loaded");
		}
		private function onAdError(evt:AdErrorEvent):void
		{
			trace("error: " + evt);
			trace(evt.error.errorType);
			trace(evt.error.errorMessage);
		}
	}
}
</pre>

・・・・・

<strong>「参考サイト」</strong>
<a href="http://code.google.com/intl/ja-JP/apis/in-stream/docs/index.html" target="_blank">Double-Click InStream について</a>
<a href="http://code.google.com/intl/ja-JP/apis/in-stream/docs/sdks/googleflashas3_apis.html" target="_blank">Google InStream API について</a>
]]>
   </content>
</entry>
<entry>
   <title>Flash Builder 4 Beta/Flex Builder 3 + SVN</title>
   <link rel="alternate" type="text/html" href="http://dev.convexstyle.net/2009/08/flash_builder_4_betaflex_build.html" />
   <id>tag:dev.convexstyle.net,2009://1.129</id>
   
   <published>2009-08-29T13:08:42Z</published>
   <updated>2009-08-29T13:31:04Z</updated>
   
   <summary>自分のローカルの開発環境は Windows/MAC ともに、Eclipse For PHP Developer で HTML/PHP 系の開発、Flex Builder 3/Flash Builder 4 Beta + Flash CS4 で Flash/Flex/AIR 系の開発、XAMPP を入れて簡単なテスト作業はローカルで行ったり Shell でサーバに入って vim で開発であったり。 でもシドニーに来てから日本の個人サーバへのアクセスが物凄く遅くなったし、毎日 MacBook Pro 17 を会社に持って行ってたらメチャクチャ肩がおかしくなったし、会社のワークだけではなく個人のワークもちゃんと管理していこうと思って、SVN Repository Explorer を使おうと Flex Builder 3/Flash Builder 4 Premium Beta...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="開発環境" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://dev.convexstyle.net/">
      <![CDATA[自分のローカルの開発環境は Windows/MAC ともに、<a href="http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/galileo/R/eclipse-php-galileo-macosx-cocoa.tar.gz" target="_blank">Eclipse For PHP Developer</a> で HTML/PHP 系の開発、Flex Builder 3/Flash Builder 4 Beta + Flash CS4 で Flash/Flex/AIR 系の開発、<a href="http://www.apachefriends.org/jp/xampp-windows.html" target="_blank">XAMPP</a> を入れて簡単なテスト作業はローカルで行ったり Shell でサーバに入って vim で開発であったり。

でもシドニーに来てから日本の個人サーバへのアクセスが物凄く遅くなったし、毎日  MacBook Pro 17 を会社に持って行ってたらメチャクチャ肩がおかしくなったし、会社のワークだけではなく個人のワークもちゃんと管理していこうと思って、SVN Repository Explorer を使おうと Flex Builder 3/<a href="http://labs.adobe.com/technologies/flashbuilder4/" target="_blank">Flash Builder 4 Premium Beta</a> にプラグインをインストール。

<img src="http://dev.convexstyle.net/images/entry/200908/svn_flashbuilder.gif" width="500" height="335" alt="SVN Repository Explorer" title="SVN Repository Explorer" />

特に面倒ではないけど普通には Software Update でプラグインをインストール出来なかったので一応メモ。

<strong>(1) Subclipse をダウンロード</strong>
<a href="http://subclipse.tigris.org/" target="_blank">tigris.org</a> の<a href="http://subclipse.tigris.org/servlets/ProjectDocumentList?folderID=2240" target="_blank">ダウンロードページ</a>から最新の安定板をダウンロードする。

<strong>(2) ファイル解凍。</strong>
解凍して features と plugins ディレクトリの中身を各自、Flash Builder 4/Flex Builder 3 がインストールされているアプリケーションディレクトリ内の features と plugins ディレクトリ内にコピー。

<strong>(3) Flash Flash Builder 4/Flex Builder 3 を起動。</strong>
Flash Builder 4/Flex Builder 3 が起動している場合が再起動。

<strong>(4) SVN Interface の変更。</strong> 
Windows の Eclipse For PHP Developer では <a href="http://eclipsewiki.net/eclipse/?Subclipse%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3" target="_blank">JavaHL</a> では ssh+svn でアクセス出来なかったので、一応、SVN interface を <a href="http://svnkit.com/documentation.html" target="_blank">SVNKit</a> に変更。Windows &gt; Perspective もしくは 右上のボタンから SVN Repository Explorer を起動して svn+ssh で自分のサーバのレポジトリにアクセスして、好きなワークフォルダをチェックアウト。http の場合は JavaHL で良い模様。

<strong>(5) チェックアウト。</strong>
SVN Repository Explorer 内にある好きなプロジェクトを Flex Project、Flash Project、Air Project のいずれかにして checkout。

<strong>(6) アップデート。</strong>
変更したら絶えず SVN Update。


ちなみに Eclipse For PHP Developer には Subclipse, <a href="http://aptana.com/" target="_blank">Aptana</a>, <a href="http://hp.vector.co.jp/authors/VA000137/eclipse/smarty_editor/smarty_editor.html" target="_blank">SmartyEditor</a> 辺りのプラグインを入れ、特に開発はめんどくさくない。後、FTP とか SSH とか調べてみよう。

・・・・・

前々からやろうと思ってやってなかったのですが、とにかく個人プロジェクトレベルでも同期しておいた方が楽だ。「以前どう処理したっけ！？」とかプロジェクトで忘れた時も、会社でも自分のソースが読めるし！]]>
      
   </content>
</entry>
<entry>
   <title>RemoteProxy + Zend_Amf in AS3</title>
   <link rel="alternate" type="text/html" href="http://dev.convexstyle.net/2009/08/remoteproxy_zend_amf_in_as3.html" />
   <id>tag:dev.convexstyle.net,2009://1.127</id>
   
   <published>2009-08-25T13:07:53Z</published>
   <updated>2009-08-26T13:29:46Z</updated>
   
   <summary>Proxy class を extends した RemoteProxy class を作って Zend_Amf_Server にアクセス。 所謂、RemoteProxy Pattern を使用して RPC で Zend_Amf_Server 側の controller の関数をコール。 NetConnection オブジェクトで Zend_Amf_Server にアクセスする際に NetConnection.Connect.Success が NetStatusEvent で返ったのを確実に確認してから RPC しようと思ってたんだけど、NetConnection.Connect.Success って返らないんですね。NetConnection.Call.Failed などはきちんと返るんですが、接続成功時は NetStatusEvent の evt.info.code が何故か取得出来ない。...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="ActionSctipt 3.0" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="Flash" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="Flash Remoting" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="Zend Framework" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="8" label="ActionScript" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="27" label="ActionScript 3.0" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="44" label="Zend Framework" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://dev.convexstyle.net/">
      <![CDATA[<a href="http://livedocs.adobe.com/flex/3/langref/flash/utils/Proxy.html" target="_blank">Proxy</a> class を extends した RemoteProxy class を作って <a href="http://help.adobe.com/en_US/AS3LCR/Flash_10.0/flash/net/NetConnection.html" target="_blank">Zend_Amf_Server</a> にアクセス。
所謂、RemoteProxy Pattern を使用して RPC で Zend_Amf_Server 側の controller の関数をコール。

NetConnection オブジェクトで Zend_Amf_Server にアクセスする際に NetConnection.Connect.Success が NetStatusEvent で返ったのを確実に確認してから RPC しようと思ってたんだけど、NetConnection.Connect.Success って返らないんですね。NetConnection.Call.Failed などはきちんと返るんですが、接続成功時は NetStatusEvent の evt.info.code が何故か取得出来ない。

]]>
      <![CDATA[<pre>
package com.convexstyle.proxy
{
    dynamic public class CFZendAmfProxy extends Proxy implements IEventDispatcher
        {
            public function CFZendAmfProxy(gatewayUrl:String)
            {
                super();
                if(gatewayUrl == null)
                    throw new CFProxyError("GatewayUrl is not provided in CFZendAmfProxy.");
                 this._gatewayUrl = gatewayUrl;
                 this.init();
            }
            private function init():void
            {
                this._eventDispatcher    = new EventDispatcher(this);
                this._responder              = new Responder(onResultHandler, onStatusHandler);
                this._nc                          = new NetConnection();
                this._nc.objectEncoding = ObjectEncoding.AMF3;
                <strong>this._nc.addEventListener(NetStatusEvent.NET_STATUS, onNetStatusHandler, false, 0, true);</strong>
                this._nc.connect(this._gatewayUrl);
            }
            private function onNetStatusHandler(evt:NetStatusEvent):void
            {
                switch(evt.info.code)
                {
                    <strong>case "NetConnection.Connect.Success":</strong>
                    {
                        trace("@@@@@ Connected @@@@@");
                        break;
                    }
                    case "NetConnection.Connect.Failed":
                    case "NetConnection.Connect.Rejected":
                    case "NetConnection.Call.Failed":
                    case "NetConnection.Call.Prohibited":
                    {
                        this.dispatchEvent(new CFZendAmfProxyEvent(CFZendAmfProxyEvent.ERROR, null, {text: "Error: " + evt.info.code, code: evt.info.code}));
                        break;
                    }
                    default:
                    {
                        this.dispatchEvent(new CFZendAmfProxyEvent(CFZendAmfProxyEvent.ERROR, null, {text: "Error: " + evt.info.code, code: evt.info.code}));
                        break;
                    }			
                }
        }
        flash_proxy override function callProperty(method:*, ...params):*
        {
            this._call(method, params);
        }
    }
}
*一部省略
</pre>

例えば、下記の様に debug メソッドをコールする際に、NetConnection.Connect.Success と debug() 関数のどちらが早くコールされるかによって処理を加えようと思ったのだけど、特に何もせずに正常に挙動するから特に気にする必要は無いのか！？<a href="http://osflash.org/as3lrf" target="_blank">Lightweight Remoting Framework</a> のソースも参考までに確認してみたけど特に処理は無いな。

<pre>
this._zendAmfProxy = new CFZendAmfProxy("http://www.test.com/amfserver/server.php");
this._zendAmfProxy.addEventListener(CFZendAmfProxyEvent.RESULT, onResultHandler, false, 0, true);
this._zendAmfProxy.addEventListener(CFZendAmfProxyEvent.STATUS, onStatusHandler, false, 0, true);
this._zendAmfProxy.addEventListener(CFZendAmfProxyEvent.ERROR, onErrorHandler, false, 0, true);
<strong>this._zendAmfProxy.UserController_debug();</strong>
</pre>

ということは、多分特に気にしなくてもいいんだろう。

・・・・・

「<strong>参考サイト</strong>」
<a href="http://framework.zend.com/manual/ja/zend.amf.html" target="_blank">Zend_Amf について</a>
<a href="http://help.adobe.com/en_US/AS3LCR/Flash_10.0/flash/net/NetConnection.html" target="_blank">NetConnection について</a>
<a href="http://livedocs.adobe.com/flex/3/langref/flash/utils/Proxy.html" target="_blank">Proxy について</a>

「<strong>お勧め本</strong>」
<iframe src="http://rcm-jp.amazon.co.jp/e/cm?t=convexstyle-22&o=9&p=8&l=as1&asins=4798117129&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0" width="120" height="240"></iframe>]]>
   </content>
</entry>
<entry>
   <title>FlvPlayBack Component エラー + AS3（解決）</title>
   <link rel="alternate" type="text/html" href="http://dev.convexstyle.net/2009/08/flvplayback_component_as3.html" />
   <id>tag:dev.convexstyle.net,2009://1.125</id>
   
   <published>2009-08-20T13:38:33Z</published>
   <updated>2009-08-20T13:48:16Z</updated>
   
   <summary>先日のエントリー（FlvPlayBack Component エラー + AS3）で記述した FlvPlayBack Component で存在しない Flv へアクセスした際の Error が Catch 出来なかったことについて、どなたか分かりませんが有難いコメントを頂きまして解決しましたので、メモ。関数の詳細を見落としてたー！！ FlvPlayBack に getVideoPlayer(index:Number) というメソッドがあって、クラス内に FlvPlayBack が 1 つのみある状態（activeVideoPlayerIndex が 0 ）なので getVideoPlayer(0) で VideoPlayer オブジェクト を作成し、このオブジェクトの netStream という getter メソッドで NetStream オブジェクトを取得し、後は通常の NetStatusEvent で状態を listen して対応するという事らしいです。今回は存在しない...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="ActionSctipt 3.0" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="Flash" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="27" label="ActionScript 3.0" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="2" label="Flash" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://dev.convexstyle.net/">
      <![CDATA[<a href="http://dev.convexstyle.net/2009/08/flvplayback_component_as3_1.html" target="_blank">先日のエントリー（FlvPlayBack Component エラー + AS3）</a>で記述した FlvPlayBack Component で存在しない Flv へアクセスした際の Error が Catch 出来なかったことについて、どなたか分かりませんが有難いコメントを頂きまして解決しましたので、メモ。関数の詳細を見落としてたー！！

FlvPlayBack に <a href="http://help.adobe.com/en_US/AS3LCR/Flash_10.0/fl/video/FLVPlayback.html#getVideoPlayer()" target="_blank">getVideoPlayer(index:Number)</a> というメソッドがあって、クラス内に FlvPlayBack が 1 つのみある状態（activeVideoPlayerIndex が 0 ）なので getVideoPlayer(0) で <a href="http://help.adobe.com/en_US/AS3LCR/Flash_10.0/fl/video/VideoPlayer.html" target="_blank">VideoPlayer</a> オブジェクト を作成し、このオブジェクトの netStream という getter メソッドで <a href="http://help.adobe.com/en_US/AS3LCR/Flash_10.0/flash/net/NetStream.html" target="_blank">NetStream</a> オブジェクトを取得し、後は通常の <a href="http://help.adobe.com/en_US/AS3LCR/Flash_10.0/flash/events/NetStatusEvent.html" target="_blank">NetStatusEvent</a> で状態を listen して対応するという事らしいです。今回は存在しない Flv の URL を設定された時対処したかったので、NetStatusEvent の info.code が NetStream.Play.StreamNotFound になる時に対応出来ました。NetStream オブジェクトを通常の様に管理できるので close, seek, resume などのメソッド等も同様に対応できる様。

これで明快ですね！]]>
      <![CDATA[<pre>
package
{
	import fl.video.FLVPlayback;
	import fl.video.VideoPlayer;
	import flash.display.MovieClip;
	import flash.events.NetStatusEvent;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	public class TestCompPlayer extends MovieClip
	{
		private var _compPlayer:FLVPlayback;
		private var _txtDebug:TextField;
		private var _video:VideoPlayer;
		//-----------------------------------------------------------
		//  construct method
		//-----------------------------------------------------------
		public function TestCompPlayer()
		{
			super();
			this.init();
		}
		//-----------------------------------------------------------
		//  private method
		//-----------------------------------------------------------
		private function init():void
		{
			// Objects
			this._compPlayer = this["compPlayer"];
			this._txtDebug   = this["txtDebug"];
			this._video      = this._compPlayer.getVideoPlayer(0);
			// Objects Setting
			this._compPlayer.isLive
			this._txtDebug.autoSize      = TextFieldAutoSize.NONE;
			this._txtDebug.wordWrap      = true;
			this._txtDebug.multiline     = true;
			this._txtDebug.selectable    = false;
			this._txtDebug.condenseWhite = true;	
			// Play
			this._compPlayer.source = "http://www.convexstyle.com/no.flv";
			// Events
			this._video.netStream.addEventListener(NetStatusEvent.NET_STATUS, onNetStatusHandler, false, 0, true);
		}
		private function onNetStatusHandler(evt:NetStatusEvent):void
		{
			switch(evt.info.code)
			{
				case "<strong>NetStream.Play.StreamNotFound</strong>":
				{
					<strong>trace("Deal with Errors !!!!!");</strong>
					break;
				}
				default:
				{
					break;
				}
			}
			this._txtDebug.appendText(evt.info.code + "¥n");
		}	
	}	
}
</pre>

もやもやが晴れた。

・・・・・

<strong>「参考サイト」</strong>
<a href="http://help.adobe.com/en_US/AS3LCR/Flash_10.0/fl/video/FLVPlayback.html" target="_blank">FlvPlayBack について</a>
<a href="http://help.adobe.com/en_US/AS3LCR/Flash_10.0/fl/video/VideoPlayer.html" target="_blank">Video Player について</a>
<a href="http://help.adobe.com/en_US/AS3LCR/Flash_10.0/flash/net/NetStream.html" target="_blank">NetStream について</a>
<a href="http://help.adobe.com/en_US/AS3LCR/Flash_10.0/flash/events/NetStatusEvent.html" target="_blank">NetStatusEvent について</a>

・・・・・

<strong>「お勧め本」</strong>
<iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=convexstyle-22&o=9&p=8&l=as1&m=amazon&f=ifr&asins=0321426568" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0" width="120" height="240"></iframe>]]>
   </content>
</entry>

</feed>
