そう言えば、base タグってありましたね。

ポーランド人のプログラマの同僚にぼそってささやかれて、先日はっとしました。
と言うのは、物凄く基本的な話ですが、下記の様なタグの存在をこの世からすっかり忘れていました。

<head>
	<base href="http://www.convexstyle.com/" />
</head>

これがあることで、Zend Framework 内で
www.convexstyle.com/controller
www.convexstyle.com/controller/
www.convexstyle.com/controller/action
www.convexstyle.com/controller/action/
を同じ処理出来るんですよね。

2 番目と 4 番目がディレトトリと見なされて、アセット関連のパスがおかしくなるのが嫌だったのでこれまでは Zend Framework 内で Smarty をテンプレートとして使う際に base タグを使わずに、例えば、<img src="<% $homeUrl %>images/sample.jpg" /> とか物凄い効率悪いやり方をしてました。

なのでこれからは

<head>
	<base href="<% $homeUrl %>" />
</head>

にして <img src="images/sample.jpg" /> でいいじゃんと思いました。
基本を忘れちゃいけないなあ。

一点問題は、<a href="#top">top</a> の様な内部リンクに関しては $homeUrl が http://www.convexstyle.com/ の場合、絶えずリンク先が http://www.convexstyle.com/#top になってしまうんですよね。この場合現状のページトップに行きたいのに IndexController にアクセスしてしまうので、これを避ける際は、やはりこういう場合は controller 側で対応して、view 側に 現状の controller や action やスラッシュとかを <a href="<% $currentUrl %>#top">top</a> の様な形で渡さないといけないですね。 もともと自分は javascript でページ top への移動は内部リンクと JQuery の animate で対応してたんですが、知らない間に scrollTo という JQuery のプラグインが存在していたので、これもまた <a href="Javascript:void(0);" onClick="goTop();">top</a> 的にすれば全く Zend の URL 構造は依存せず対応出来ますね。知らないで効率悪かったという話です。

・・・・・

参考サイト
base タグ
scrollTo (JQuery Plugin)

ページの一番上へ移動

Papervision3D:各 View 要素からの参照方法(考え方)

例えば、下記の様な構成が papervision3D コンテンツにあったとして、

PaperVision3D View 概要図

Item.as から TestView3D.as 内の BasicView, viewport3D, CameraObject3D, CameraObject3D.target, Mouse3D などを参照したい場合、Item クラスは DisplayObject3D の子クラスなので参照を持っていない。

これまではインターフェースに下記の様な function setAsset(view:BasicView, viewport:Viewport3D, camera:CamerObject3D) 的な関数を設定して各 DisplayObject3D の子クラスを作成し、各構成要素が override して受け渡していたんだけど、いちいち設定したり構成が深くなると面倒くさかったりしていた。

この記事の続きを読む »

ページの一番上へ移動

FlvPlayBack Component エラー + AS3

最近のプロジェクトを通して納期の都合上 FlvPlayBack を本格的に使ってみたのだけど、「存在しない Flv の URL を source に指定するとエラーが取得出来ない。」という挙動に悩まされた。色々なパターンで様々な挙動をするので気づいた点を忘れない様にメモ。

FlvPlayBack の source プロパティに存在しない URL を設定した場合に Error が Throw されるんですが、これは try/catch で処理すればと思って色々トライしてみたんですが、全然 catch してくれませんでした。source を指定して FlvPlayBack を play する流れで、おそらく処理的なタイムラグなのか play がコールされた後に source 側で Error を Throw するのでどうしてもプログラム上でエラーを catch 出来ないのではないのかなとか考えてます。

例えば、http://www.test.com/no.flv という存在しない URL を FlvPlayBack の source に設定すると下記の様なエラーが起こってしまい、完全にプロセスが止まってしまいます。

compPlayer.source = "http://www.test.com/no.flv";
try
{
    compPlayer.play();
}
catch(e:Error)
{
    trace("@@@ ERROR @@@ " + e);
}
Error opening URL 'http://www.test.com/no.flv'
VideoError: 1000: Unable to make connection to server or to find FLV on server
    at fl.video::VideoPlayer/stop()
    at fl.video::FLVPlayback/http://www.adobe.com/2007/flash/flvplayback/internal::showFirstStream()
    at fl.video::FLVPlayback/http://www.adobe.com/2007/flash/flvplayback/internal::handleVideoEvent()
    at flash.events::EventDispatcher/dispatchEventFunction()
    at flash.events::EventDispatcher/dispatchEvent()
    at fl.video::VideoPlayer/http://www.adobe.com/2007/flash/flvplayback/internal::setState()
    at fl.video::VideoPlayer/http://www.adobe.com/2007/flash/flvplayback/internal::httpNetStatus()

この様な静的な URL の設定の場合は書き間違えさえしなければ問題ないのですが、動的に処理する時には問題なので、ここの方が setTimeOut で解決しているみたいなので自分も同様に Timer を使って処理を加えて対応してみました。しかし、機能を切り出しモック的に対応すると動作が正常に動いても、本番環境では安定した挙動をしませんでした。一応色々な状況の挙動を試してみたので、下記に記述しておこう。

この記事の続きを読む »

ページの一番上へ移動

FlvPlayBack Component エラー + AS3(解決)

先日のエントリー(FlvPlayBack Component エラー + AS3)で記述した FlvPlayBack Component で存在しない Flv へアクセスした際の Error が Catch 出来なかったことについて、どなたか分かりませんが有難いコメントを頂きまして解決しましたので、メモ。関数の詳細を見落としてたー!!

FlvPlayBack に getVideoPlayer(index:Number) というメソッドがあって、クラス内に FlvPlayBack が 1 つのみある状態(activeVideoPlayerIndex が 0 )なので getVideoPlayer(0) で VideoPlayer オブジェクト を作成し、このオブジェクトの netStream という getter メソッドで NetStream オブジェクトを取得し、後は通常の NetStatusEvent で状態を listen して対応するという事らしいです。今回は存在しない Flv の URL を設定された時対処したかったので、NetStatusEvent の info.code が NetStream.Play.StreamNotFound になる時に対応出来ました。NetStream オブジェクトを通常の様に管理できるので close, seek, resume などのメソッド等も同様に対応できる様。

これで明快ですね!

この記事の続きを読む »

ページの一番上へ移動

RemoteProxy + Zend_Amf in AS3

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 が何故か取得出来ない。

この記事の続きを読む »

ページの一番上へ移動

Flash Builder 4 Beta/Flex Builder 3 + SVN

自分のローカルの開発環境は 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 にプラグインをインストール。

SVN Repository Explorer

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

(1) Subclipse をダウンロード
tigris.orgダウンロードページから最新の安定板をダウンロードする。

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

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

(4) SVN Interface の変更。
Windows の Eclipse For PHP Developer では JavaHL では ssh+svn でアクセス出来なかったので、一応、SVN interface を SVNKit に変更。Windows > Perspective もしくは 右上のボタンから SVN Repository Explorer を起動して svn+ssh で自分のサーバのレポジトリにアクセスして、好きなワークフォルダをチェックアウト。http の場合は JavaHL で良い模様。

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

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


ちなみに Eclipse For PHP Developer には Subclipse, Aptana, SmartyEditor 辺りのプラグインを入れ、特に開発はめんどくさくない。後、FTP とか SSH とか調べてみよう。

・・・・・

前々からやろうと思ってやってなかったのですが、とにかく個人プロジェクトレベルでも同期しておいた方が楽だ。「以前どう処理したっけ!?」とかプロジェクトで忘れた時も、会社でも自分のソースが読めるし!

ページの一番上へ移動