<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>azul</title>
	<atom:link href="http://www.azul.systems-noel.jp/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.azul.systems-noel.jp</link>
	<description>Something about programming ;P</description>
	<lastBuildDate>Tue, 22 May 2012 08:29:35 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Yii FrameworkとPostgreSQLでdatetimeがtimeとして扱われてしまう。</title>
		<link>http://www.azul.systems-noel.jp/2012/05/yii-framework%e3%81%a8postgresql%e3%81%a7datetime%e3%81%8ctime%e3%81%a8%e3%81%97%e3%81%a6%e6%89%b1%e3%82%8f%e3%82%8c%e3%81%a6%e3%81%97%e3%81%be%e3%81%86%e3%80%82/</link>
		<comments>http://www.azul.systems-noel.jp/2012/05/yii-framework%e3%81%a8postgresql%e3%81%a7datetime%e3%81%8ctime%e3%81%a8%e3%81%97%e3%81%a6%e6%89%b1%e3%82%8f%e3%82%8c%e3%81%a6%e3%81%97%e3%81%be%e3%81%86%e3%80%82/#comments</comments>
		<pubDate>Tue, 22 May 2012 08:05:16 +0000</pubDate>
		<dc:creator>delfino</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[Yii Framework]]></category>

		<guid isPermaLink="false">http://www.azul.systems-noel.jp/?p=107</guid>
		<description><![CDATA[まぁ、この組み合わせがレアなのかもしれませんけど。 Yii FrameworkをPostgreSQLで使う時にMigrationで遭遇する問題の対応方法です。  タイトル通りでdatetime型として宣言したものがtim [...]]]></description>
			<content:encoded><![CDATA[<p>まぁ、この組み合わせがレアなのかもしれませんけど。<br />
Yii FrameworkをPostgreSQLで使う時にMigrationで遭遇する問題の対応方法です。</p>
<p><span id="more-107"></span> タイトル通りでdatetime型として宣言したものがtime型にマッピングされてしまう問題。<br />
おそらくはMigrationのCDbMigration::createTable()なんかでカラムの型をdatetimeにした時に遭遇するでしょう。<br />
<a href="https://github.com/yiisoft/yii/issues/193">datetime type in postgresql migrations </a>で報告されていますが、現状1.1.10ではまだ修正されていないようです。</p>
<p>原因はframework.db.schema.pgsql.CPgsqlSchemaのプロパティ$columnTypesがよろしくないこと。<br />
このプロパティは連想配列なのですが、キー「datetime」に対して値「time」が設定されています。<br />
コアに手をいれるのは今度のメンテナンスのことを考えればさけるべきでしょう。<br />
ということで、コアに手を入れないでプロパティ$columnTypesを変更します。</p>
<p>Yii Frameworkは厳密なディレクトリ構成の規則がありませんので、今回はprotectedディレクトリの下にCPgsqlSchemaを拡張した独自クラスを実装して対応します。<br />
protectedディレクトリのどこに配備するかはそれぞれだと思うのですが、application.components.db.schema.pgsql.CMigratePgsqlSchemaとして実装します。<br />
実装は以下の通り。</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
/**
 * Extended CPgsqlSchema.
 * This class fixes datetime type mapping in migration
 */
class CMigratePgsqlSchema extends CPgsqlSchema
{
	/**
	 * Fixed datetime type
	 * @var array the abstract column types mapped to physical column types.
	 */
	public $columnTypes = array(
		'pk'        =&gt; 'serial NOT NULL PRIMARY KEY',
		'string'    =&gt; 'character varying (255)',
		'text'      =&gt; 'text',
		'integer'   =&gt; 'integer',
		'float'     =&gt; 'double precision',
		'decimal'   =&gt; 'numeric',
		'datetime'  =&gt; 'timestamp',
		'timestamp' =&gt; 'timestamp',
		'time'      =&gt; 'time',
		'date'      =&gt; 'date',
		'binary'    =&gt; 'bytea',
		'boolean'   =&gt; 'boolean',
		'money'     =&gt; 'decimal(19,4)',
	);
}
</pre>
<p>このクラスをprotected/components/db/schema/pgsqlディレクトリにCMigratePgsqlSchema.phpとして配備して、このクラスを利用する様に設定ファイルを変更してあげます。<br />
Migrationを実行する際に参照されるのはprotected/config/console.phpですから、通常はconsole.phpの設定を変更してcomponentsのキー項目dbにキーdriverMapを追加します。</p>
<pre class="brush: php; title: ; notranslate">
	'components'=&gt;array(
		'db'=&gt;array(
			'class'            =&gt; 'system.db.CDbConnection',
			'driverMap'        =&gt; array('pgsql'=&gt;'application.components.db.schema.pgsql.CMigratePgsqlSchema'),
			'connectionString' =&gt; 'pgsql:host=接続文字列',
			'username'         =&gt; 'ユーザ名',
			'password'         =&gt; 'パスワード',
		),
</pre>
<p>以上、Yii FrameworkとPostgreSQLでdatetimeがtimeとして扱われてしまう場合の対処方法でした。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.azul.systems-noel.jp/2012/05/yii-framework%e3%81%a8postgresql%e3%81%a7datetime%e3%81%8ctime%e3%81%a8%e3%81%97%e3%81%a6%e6%89%b1%e3%82%8f%e3%82%8c%e3%81%a6%e3%81%97%e3%81%be%e3%81%86%e3%80%82/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>EclipseでSVNのプロパティを自動設定する</title>
		<link>http://www.azul.systems-noel.jp/2012/05/eclipse%e3%81%a7svn%e3%81%ae%e3%83%97%e3%83%ad%e3%83%91%e3%83%86%e3%82%a3%e3%82%92%e8%87%aa%e5%8b%95%e8%a8%ad%e5%ae%9a%e3%81%99%e3%82%8b/</link>
		<comments>http://www.azul.systems-noel.jp/2012/05/eclipse%e3%81%a7svn%e3%81%ae%e3%83%97%e3%83%ad%e3%83%91%e3%83%86%e3%82%a3%e3%82%92%e8%87%aa%e5%8b%95%e8%a8%ad%e5%ae%9a%e3%81%99%e3%82%8b/#comments</comments>
		<pubDate>Tue, 22 May 2012 07:10:33 +0000</pubDate>
		<dc:creator>delfino</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[SVN]]></category>

		<guid isPermaLink="false">http://www.azul.systems-noel.jp/?p=100</guid>
		<description><![CDATA[あんまりしょっちゅうやることでもないのでメモ。 Eclipse系IDEでSubversiveを使ってSVNを利用する場合にSVNの属性を自動で追加する方法。 ~/.subversion/configを編集してもいいのです [...]]]></description>
			<content:encoded><![CDATA[<p>あんまりしょっちゅうやることでもないのでメモ。<br />
Eclipse系IDEでSubversiveを使ってSVNを利用する場合にSVNの属性を自動で追加する方法。</p>
<p><span id="more-100"></span></p>
<p>~/.subversion/configを編集してもいいのですが、Preferences-&gt;Team-&gt;SVN-&gt;Properties ConfigurationのImportで以下を食べさせる。</p>
<pre class="brush: plain; title: ; notranslate">
[miscellany]
enable-auto-props = yes

[auto-props]
# Scriptish formats
*.bat        = svn:eol-style=native;svn:keywords=Id Author Rev HeadURL LastChangedDate LastChangedBy LastChangedRevision;svn-mine-type=text/plain
*.bsh        = svn:eol-style=native;svn:keywords=Id Author Rev HeadURL LastChangedDate LastChangedBy LastChangedRevision;svn:mime-type=text/x-beanshell
*.cgi        = svn:eol-style=native;svn:keywords=Id Author Rev HeadURL LastChangedDate LastChangedBy LastChangedRevision;svn-mine-type=text/plain
*.cmd        = svn:eol-style=native;svn:keywords=Id Author Rev HeadURL LastChangedDate LastChangedBy LastChangedRevision;svn-mine-type=text/plain
*.js         = svn:eol-style=native;svn:keywords=Id Author Rev HeadURL LastChangedDate LastChangedBy LastChangedRevision;svn:mime-type=text/javascript
*.php        = svn:eol-style=native;svn:keywords=Id Author Rev HeadURL LastChangedDate LastChangedBy LastChangedRevision;svn:mime-type=text/x-php
*.pl         = svn:eol-style=native;svn:keywords=Id Author Rev HeadURL LastChangedDate LastChangedBy LastChangedRevision;svn:mime-type=text/x-perl;svn:executable
*.pm         = svn:eol-style=native;svn:keywords=Id Author Rev HeadURL LastChangedDate LastChangedBy LastChangedRevision;svn:mime-type=text/x-perl
*.py         = svn:eol-style=native;svn:keywords=Id Author Rev HeadURL LastChangedDate LastChangedBy LastChangedRevision;svn:mime-type=text/x-python;svn:executable
*.sh         = svn:eol-style=native;svn:keywords=Id Author Rev HeadURL LastChangedDate LastChangedBy LastChangedRevision;svn:mime-type=text/x-sh;svn:executable

# Image formats
*.bmp        = svn:mime-type=image/bmp
*.gif        = svn:mime-type=image/gif
*.ico        = svn:mime-type=image/ico
*.jpeg       = svn:mime-type=image/jpeg
*.jpg        = svn:mime-type=image/jpeg
*.png        = svn:mime-type=image/png
*.tif        = svn:mime-type=image/tiff
*.tiff       = svn:mime-type=image/tiff

# Data formats
*.pdf        = svn:mime-type=application/pdf
*.avi        = svn:mime-type=video/avi
*.doc        = svn:mime-type=application/msword
*.eps        = svn:mime-type=application/postscript
*.gz         = svn:mime-type=application/gzip
*.mov        = svn:mime-type=video/quicktime
*.mp3        = svn:mime-type=audio/mpeg
*.ppt        = svn:mime-type=application/vnd.ms-powerpoint
*.ps         = svn:mime-type=application/postscript
*.psd        = svn:mime-type=application/photoshop
*.rdf        = svn:eol-style=native;svn:keywords=Id
*.rss        = svn:eol-style=native;svn:keywords=Id
*.rtf        = svn:mime-type=text/rtf
*.swf        = svn:mime-type=application/x-shockwave-flash
*.tgz        = svn:mime-type=application/gzip
*.wav        = svn:mime-type=audio/wav
*.xls        = svn:mime-type=application/vnd.ms-excel
*.zip        = svn:mime-type=application/zip

# Text formats
.htaccess    = svn:eol-style=native;svn:keywords=Id Author Rev HeadURL LastChangedDate LastChangedBy LastChangedRevision;svn:mime-type=text/plain
*.css        = svn:eol-style=native;svn:keywords=Id Author Rev HeadURL LastChangedDate LastChangedBy LastChangedRevision;svn:mime-type=text/css
*.dtd        = svn:eol-style=native;svn:keywords=Id Author Rev HeadURL LastChangedDate LastChangedBy LastChangedRevision;svn:mime-type=text/xml
*.html       = svn:eol-style=native;svn:keywords=Id Author Rev HeadURL LastChangedDate LastChangedBy LastChangedRevision;svn:mime-type=text/html
*.ini        = svn:eol-style=native;svn:keywords=Id Author Rev HeadURL LastChangedDate LastChangedBy LastChangedRevision;svn:mime-type=text/plain
*.sql        = svn:eol-style=native;svn:keywords=Id Author Rev HeadURL LastChangedDate LastChangedBy LastChangedRevision;svn:mime-type=text/x-sql
*.txt        = svn:eol-style=native;svn:keywords=Id Author Rev HeadURL LastChangedDate LastChangedBy LastChangedRevision;svn:mime-type=text/plain
*.xhtml      = svn:eol-style=native;svn:keywords=Id Author Rev HeadURL LastChangedDate LastChangedBy LastChangedRevision;svn:mime-type=text/xhtml+xml
*.xml        = svn:eol-style=native;svn:keywords=Id Author Rev HeadURL LastChangedDate LastChangedBy LastChangedRevision;svn:mime-type=text/xml
*.xsd        = svn:eol-style=native;svn:keywords=Id Author Rev HeadURL LastChangedDate LastChangedBy LastChangedRevision;svn:mime-type=text/xml
*.xsl        = svn:eol-style=native;svn:keywords=Id Author Rev HeadURL LastChangedDate LastChangedBy LastChangedRevision;svn:mime-type=text/xml
*.xslt       = svn:eol-style=native;svn:keywords=Id Author Rev HeadURL LastChangedDate LastChangedBy LastChangedRevision;svn:mime-type=text/xml
*.xul        = svn:eol-style=native;svn:keywords=Id Author Rev HeadURL LastChangedDate LastChangedBy LastChangedRevision;svn:mime-type=text/xul
*.yml        = svn:eol-style=native;svn:keywords=Id Author Rev HeadURL LastChangedDate LastChangedBy LastChangedRevision;svn:mime-type=text/plain
CHANGES      = svn:eol-style=native;svn:keywords=Id Author Rev HeadURL LastChangedDate LastChangedBy LastChangedRevision;svn:mime-type=text/plain
COPYING      = svn:eol-style=native;svn:keywords=Id Author Rev HeadURL LastChangedDate LastChangedBy LastChangedRevision;svn:mime-type=text/plain
INSTALL      = svn:eol-style=native;svn:keywords=Id Author Rev HeadURL LastChangedDate LastChangedBy LastChangedRevision;svn:mime-type=text/plain
Makefile*    = svn:eol-style=native;svn:keywords=Id Author Rev HeadURL LastChangedDate LastChangedBy LastChangedRevision;svn:mime-type=text/plain
README       = svn:eol-style=native;svn:keywords=Id Author Rev HeadURL LastChangedDate LastChangedBy LastChangedRevision;svn:mime-type=text/plain
TODO         = svn:eol-style=native;svn:keywords=Id Author Rev HeadURL LastChangedDate LastChangedBy LastChangedRevision;svn:mime-type=text/plain

# Code formats
*.c          = svn:eol-style=native;svn:keywords=Id Author Rev HeadURL LastChangedDate LastChangedBy LastChangedRevision;svn:mime-type=text/plain
*.cpp        = svn:eol-style=native;svn:keywords=Id Author Rev HeadURL LastChangedDate LastChangedBy LastChangedRevision;svn:mime-type=text/plain
*.h          = svn:eol-style=native;svn:keywords=Id Author Rev HeadURL LastChangedDate LastChangedBy LastChangedRevision;svn:mime-type=text/plain
*.java       = svn:eol-style=native;svn:keywords=Id Author Rev HeadURL LastChangedDate LastChangedBy LastChangedRevision;svn:mime-type=text/plain
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.azul.systems-noel.jp/2012/05/eclipse%e3%81%a7svn%e3%81%ae%e3%83%97%e3%83%ad%e3%83%91%e3%83%86%e3%82%a3%e3%82%92%e8%87%aa%e5%8b%95%e8%a8%ad%e5%ae%9a%e3%81%99%e3%82%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>bulkloader de list</title>
		<link>http://www.azul.systems-noel.jp/2011/02/bulkloader-de-list/</link>
		<comments>http://www.azul.systems-noel.jp/2011/02/bulkloader-de-list/#comments</comments>
		<pubDate>Tue, 01 Feb 2011 15:33:42 +0000</pubDate>
		<dc:creator>delfino</dc:creator>
				<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://www.azul.systems-noel.jp/?p=87</guid>
		<description><![CDATA[本人も忘れかけていましたが、たまには何か書いておきます。 ということで、今回はGoogle App Engine for pythonのbulkloaderでlist型を扱う場合、です。 さてさて、BigTableのデー [...]]]></description>
			<content:encoded><![CDATA[<p>
本人も忘れかけていましたが、たまには何か書いておきます。<br />
ということで、今回はGoogle App Engine for pythonのbulkloaderでlist型を扱う場合、です。
</p>
<p><span id="more-87"></span></p>
<p>
さてさて、BigTableのデータのダウンロードやアップロードを可能にするbulkloaderですが、Google App Engine1.3.5より後のバージョンではGoogle App Engineが設定ファイル(bulkloader.yaml)を自動生成してくれるので、扱いやすくなりました。<br />
が、自動生成できるのは比較的標準的な型だけなのでlist型を扱うには設定ファイルを変更する必要があります。
</p>
<p>
まずはbulkloaderを使う手順を順を追って。<br />
詳細はGoogle App Engineのドキュメント<a href="http://code.google.com/intl/ja/appengine/docs/python/tools/uploadingdata.html#Configuring_the_Bulk_Loader">Bulk Loader の設定</a>を参照ですが、まずは<a href="http://code.google.com/intl/ja/appengine/docs/python/tools/uploadingdata.html#Using_Automatic_Configuration">設定ファイルの自動生成</a>を行ってbulkloader.yamlを作ります。<br />
アプリケーションのルートディレクトリに移動して以下のコマンドを実行。
</p>
<pre class="code">&nbsp;
appcfg.py create_bulkloader_config --filename=bulkloader.yaml
&nbsp;</pre>
<p>
そうするとアプリケーションのルートディレクトリにbulkloader.yamlという名前のbulkloaderの設定ファイルができあがります。<br />
bulkloader.yamlの中身はtransformersに対して配列でモデルがぶらさがる形です。<br />
今回はCSVを使うのでconnectorにcsvを設定します。<br />
それからpropertyにkeyを扱うところにはモデルの名前を設定する必要があります。<br />
このあたりはドキュメントの<a href="http://code.google.com/intl/ja/appengine/docs/python/tools/uploadingdata.html#Editing_the_Configuration_File">設定ファイルの編集</a>を参考にしてください。
</p>
<p>
で、ドキュメントにはlist型を扱う方法には触れてないのですが、例えばkind: Permissionのroleがlist型のプロパティで複数のロールを持てた場合にはどうするかっていうと。<br />
結論だけ書くとこんな感じ。
</p>
<pre class="code">&nbsp;
- property: role
external_name: role
import_transform: &quot;lambda s: [long(v) for i in s.split('-')]&quot;
export_transform: &quot;lambda l: '-'.join([str(v) for v in l])&quot;
&nbsp;</pre>
<p>
import_transformやexport_transformに対してlambdaを指定してあげます。<br />
出力のフォーマットがCSVなので区切り文字にはカンマを使えないのでハイフンでわけてます。<br />
ソースコードを見てないので、なんですけど、多分import_transformやexport_transformはevalで実行されて、結果を呼び出し可能オブジェクトとして実行されるんでしょうね。<br />
なので色々こねることができると思います。<br />
例えばkeyのlistを扱うなら
</p>
<pre class="code">&nbsp;
import_transform: &quot;lambda s: [transform.create_foreign_key('TODO: fill in Kind name', True)(i) for i in s.split('-')]&quot;
export_transform: &quot;lambda l: '-'.join([transform.key_id_or_name_as_string(k) for k in l])&quot;
&nbsp;</pre>
<p>
でいけます。文字列型の場合には区切り文字に気をつけないとですね。<br />
おまけでもうひとつ。<br />
開発サーバは複数のリクエストを同時に扱えませんから、開発サーバにbulkloaderでデータをアップロードする時には
</p>
<pre class="code">&nbsp;
appcfg.py upload_data --config_file=bulkloader.yaml --filename=your_file_name_here --kind=you_kind_here --url=http://localhost:8080/remote_api --num_threads=1
&nbsp;</pre>
<p>
という風に&#8211;num_threadsを1に設定しておく必要があります。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.azul.systems-noel.jp/2011/02/bulkloader-de-list/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP5.3 de デザパタ(Abstract Factory)</title>
		<link>http://www.azul.systems-noel.jp/2009/12/php5-3-de-%e3%83%87%e3%82%b6%e3%83%91%e3%82%bfabstract-factory/</link>
		<comments>http://www.azul.systems-noel.jp/2009/12/php5-3-de-%e3%83%87%e3%82%b6%e3%83%91%e3%82%bfabstract-factory/#comments</comments>
		<pubDate>Mon, 07 Dec 2009 09:37:00 +0000</pubDate>
		<dc:creator>delfino</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.azul.systems-noel.jp/?p=86</guid>
		<description><![CDATA[はい、お勉強かねがね今さらデザインパターンです。 PHP5.3系ならでは、な実装ができないものかなぁと考えてみます。 まずはAbstract Factoryからです まずは抽象クラスから。 Factoryクラスです。 a [...]]]></description>
			<content:encoded><![CDATA[<p>
はい、お勉強かねがね今さらデザインパターンです。<br />
PHP5.3系ならでは、な実装ができないものかなぁと考えてみます。<br />
まずはAbstract Factoryからです</p>
<p><span id="more-86"></span></p>
<p>
まずは抽象クラスから。<br />
Factoryクラスです。<br />
abstractfactory/factory/Factory.php
</p>
<pre class="code">&nbsp;
<span class="kw2">&lt;?php</span>
namespace abstractfactory\factory;
&nbsp;
<span class="coMULTI">/**
* Abstract Factory
* @author $Author$
*
*/</span>
abstract <span class="kw2">class</span> Factory <span class="br0">&#123;</span>
<span class="coMULTI">/**
* Factory type 1
* @var integer
*/</span>
const TYPE_1 = <span class="nu0">1</span>;
&nbsp;
<span class="coMULTI">/**
* Factory type 2
* @var integer
*/</span>
const TYPE_2 = <span class="nu0">2</span>;
&nbsp;
<span class="coMULTI">/**
* Return factory
* @return Factory
*/</span>
<span class="kw2">public</span> <a target="_blank"  href="http://www.php.net/static"><span class="kw3">static</span></a> <span class="kw2">function</span> getFactory<span class="br0">&#40;</span><span class="re0">$type</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$type</span> == self::<span class="me2">TYPE_1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="kw1">return</span> <span class="kw2">new</span> ConcreteFactory1<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span> <span class="kw1">else</span> <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$type</span> == self::<span class="me2">TYPE_2</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="kw1">return</span> <span class="kw2">new</span> ConcreteFactory2<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span>
throw <span class="kw2">new</span> \Exception<span class="br0">&#40;</span><span class="st0">'Argument of '</span> . <span class="kw2">__CLASS__</span> . <span class="st0">'::'</span> . <span class="kw2">__METHOD__</span> . <span class="st0">'() must be constant of '</span> . <span class="kw2">__CLASS__</span> <span class="br0">&#41;</span>;
<span class="br0">&#125;</span>
&nbsp;
<span class="coMULTI">/**
* Create Product1
* @return Product1
*/</span>
abstract <span class="kw2">public</span> <span class="kw2">function</span> createProduct1<span class="br0">&#40;</span><span class="br0">&#41;</span>;
&nbsp;
<span class="coMULTI">/**
* Product2
* @return Product2
*/</span>
abstract <span class="kw2">public</span> <span class="kw2">function</span> createProduct2<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span></pre>
<p>
次にProduct11クラス。<br />
Productは2つ扱うことにしてみます。<br />
abstractfactory/product/Product1.php
</p>
<pre class="code">&nbsp;
<span class="kw2">&lt;?php</span>
namespace abstractfactory\product;
&nbsp;
<span class="coMULTI">/**
* Abstract Product1
* @author $Author$
*/</span>
abstract <span class="kw2">class</span> Product1 <span class="br0">&#123;</span>
<span class="coMULTI">/**
* Output class name of this Product
*/</span>
abstract <span class="kw2">public</span> <span class="kw2">function</span> showName<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span></pre>
<p>
Product2クラス。<br />
abstractfactory/product/Product2.php
</p>
<pre class="code">&nbsp;
<span class="kw2">&lt;?php</span>
namespace abstractfactory\product;
&nbsp;
<span class="coMULTI">/**
* Abstract Product2
* @author $Author$
*/</span>
abstract <span class="kw2">class</span> Product2 <span class="br0">&#123;</span>
<span class="coMULTI">/**
* Output class name of this Product
*/</span>
abstract <span class="kw2">public</span> <span class="kw2">function</span> showName<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span></pre>
<p>
そしてFactoryを使用するClientクラス。<br />
abstractfactory/Client.php
</p>
<pre class="code">&nbsp;
<span class="kw2">&lt;?php</span>
namespace abstractfactory;
&nbsp;
<span class="coMULTI">/**
* Factory Client
* @author $Author$
*/</span>
<span class="kw2">class</span> Client <span class="br0">&#123;</span>
<span class="coMULTI">/**
* Handle Products of specified type Factory
* @param integer $type
*/</span>
<span class="kw2">public</span> <span class="kw2">function</span> handleProduct<span class="br0">&#40;</span><span class="re0">$type</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
try <span class="br0">&#123;</span>
<span class="re0">$factory</span> = factory\Factory::<span class="me2">getFactory</span><span class="br0">&#40;</span><span class="re0">$type</span><span class="br0">&#41;</span>;
<span class="re0">$factory</span>-&gt;<span class="me1">createProduct1</span><span class="br0">&#40;</span><span class="br0">&#41;</span>-&gt;<span class="me1">showName</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="re0">$factory</span>-&gt;<span class="me1">createProduct2</span><span class="br0">&#40;</span><span class="br0">&#41;</span>-&gt;<span class="me1">showName</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span> catch <span class="br0">&#40;</span>\Exception <span class="re0">$e</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
throw <span class="re0">$e</span>;
<span class="br0">&#125;</span>
<span class="br0">&#125;</span>
<span class="br0">&#125;</span>
&nbsp;</pre>
<p>
じゃあ実装クラスです。<br />
Factoryクラスの実装その1である、ConcreteFactory1クラス。<br />
abstractfactory/factory/ConcreteFactory1.php
</p>
<pre class="code">&nbsp;
<span class="kw2">&lt;?php</span>
namespace abstractfactory\factory;
&nbsp;
<span class="coMULTI">/**
* ConcreteFactory1
* @author $Author$
*/</span>
<span class="kw2">class</span> ConcreteFactory1 <span class="kw2">extends</span> Factory <span class="br0">&#123;</span>
&nbsp;
<span class="coMULTI">/**
* Create ConcreteProduct1_1
* @return ConcreteProduct1_1
*/</span>
<span class="kw2">public</span> <span class="kw2">function</span> createProduct1<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="kw1">return</span> <span class="kw2">new</span> \abstractfactory\product\ConcreteProduct1_1<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span>
&nbsp;
<span class="coMULTI">/**
* Create ConcreteProduct1_2
* @return ConcreteProduct1_2
*/</span>
<span class="kw2">public</span> <span class="kw2">function</span> createProduct2<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="kw1">return</span> <span class="kw2">new</span> \abstractfactory\product\ConcreteProduct1_2<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre>
<p>
Factoryクラスの実装その2である、ConcreteFactory2クラス。<br />
abstractfactory/factory/ConcreteFactory2.php
</p>
<pre class="code">&nbsp;
<span class="kw2">&lt;?php</span>
namespace abstractfactory\factory;
&nbsp;
<span class="coMULTI">/**
* ConcreteFactory2
* @author $Author$
*/</span>
<span class="kw2">class</span> ConcreteFactory2 <span class="kw2">extends</span> Factory <span class="br0">&#123;</span>
&nbsp;
<span class="coMULTI">/**
* Create ConcreteProduct2_1
* @return ConcreteProduct2_1
*/</span>
<span class="kw2">public</span> <span class="kw2">function</span> createProduct1<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="kw1">return</span> <span class="kw2">new</span> \abstractfactory\product\ConcreteProduct2_1<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span>
&nbsp;
<span class="coMULTI">/**
* Create ConcreteProduct2_2
* @return ConcreteProduct2_2
*/</span>
<span class="kw2">public</span> <span class="kw2">function</span> createProduct2<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="kw1">return</span> <span class="kw2">new</span> \abstractfactory\product\ConcreteProduct2_2<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre>
<p>
ConcreteFactory1クラスが生成するProduct1の実装クラスであるConcreteProduct1_1クラス。<br />
abstractfactory/product/ConcreteProduct1_1.php
</p>
<pre class="code">&nbsp;
<span class="kw2">&lt;?php</span>
namespace abstractfactory\product;
&nbsp;
<span class="coMULTI">/**
* Concrete Product1_1
* @author $Author$
*/</span>
<span class="kw2">class</span> ConcreteProduct1_1 <span class="kw2">extends</span> Product1 <span class="br0">&#123;</span>
<span class="coMULTI">/**
* Return class name of this Product
* @return string
*/</span>
<span class="kw2">public</span> <span class="kw2">function</span> showName<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<a target="_blank"  href="http://www.php.net/print"><span class="kw3">print</span></a> <span class="kw2">__CLASS__</span> . PHP_EOL;
<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre>
<p>
ConcreteFactory1クラスが生成するProduct2の実装クラスであるConcreteProduct1_2クラス。<br />
abstractfactory/product/ConcreteProduct1_2.php
</p>
<pre class="code">&nbsp;
<span class="kw2">&lt;?php</span>
namespace abstractfactory\product;
&nbsp;
<span class="coMULTI">/**
* Concrete Product1_2
* @author $Author$
*/</span>
<span class="kw2">class</span> ConcreteProduct1_2 <span class="kw2">extends</span> Product2 <span class="br0">&#123;</span>
<span class="coMULTI">/**
* Return class name of this Product
* @return string
*/</span>
<span class="kw2">public</span> <span class="kw2">function</span> showName<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<a target="_blank"  href="http://www.php.net/print"><span class="kw3">print</span></a> <span class="kw2">__CLASS__</span> . PHP_EOL;
<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre>
<p>
ConcreteFactory2クラスが生成するProduct1の実装クラスであるConcreteProduct2_1クラス。<br />
abstractfactory/product/ConcreteProduct2_1.php
</p>
<pre class="code">&nbsp;
<span class="kw2">&lt;?php</span>
namespace abstractfactory\product;
&nbsp;
<span class="coMULTI">/**
* Concrete Product2_1
* @author $Author$
*/</span>
<span class="kw2">class</span> ConcreteProduct2_1 <span class="kw2">extends</span> Product1 <span class="br0">&#123;</span>
<span class="coMULTI">/**
* Return class name of this Product
* @return string
*/</span>
<span class="kw2">public</span> <span class="kw2">function</span> showName<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<a target="_blank"  href="http://www.php.net/print"><span class="kw3">print</span></a> <span class="kw2">__CLASS__</span> . PHP_EOL;
<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre>
<p>
ConcreteFactory2クラスが生成するProduct2の実装クラスであるConcreteProduct2_2クラス。<br />
abstractfactory/product/ConcreteProduct2_2.php
</p>
<pre class="code">&nbsp;
<span class="kw2">&lt;?php</span>
namespace abstractfactory\product;
&nbsp;
<span class="coMULTI">/**
* Concrete Product2_2
* @author $Author$
*/</span>
<span class="kw2">class</span> ConcreteProduct2_2 <span class="kw2">extends</span> Product2 <span class="br0">&#123;</span>
<span class="coMULTI">/**
* Return class name of this Product
* @return string
*/</span>
<span class="kw2">public</span> <span class="kw2">function</span> showName<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<a target="_blank"  href="http://www.php.net/print"><span class="kw3">print</span></a> <span class="kw2">__CLASS__</span> . PHP_EOL;
<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre>
<p>
以上でクラスは出そろったので、実行ファイル<br />
abstractfactory/abstractfactory.php
</p>
<pre class="code">&nbsp;
<span class="kw2">&lt;?php</span>
namespace abstractfactory;
&nbsp;
<a target="_blank"  href="http://www.php.net/define"><span class="kw3">define</span></a><span class="br0">&#40;</span><span class="st0">'DIR'</span>, <a target="_blank"  href="http://www.php.net/dirname"><span class="kw3">dirname</span></a><span class="br0">&#40;</span><span class="kw2">__FILE__</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
&nbsp;
<span class="kw1">require_once</span><span class="br0">&#40;</span><a target="_blank"  href="http://www.php.net/dir"><span class="kw3">DIR</span></a> . DIRECTORY_SEPARATOR . <span class="st0">'Client.php'</span><span class="br0">&#41;</span>;
&nbsp;
<span class="kw1">require_once</span><span class="br0">&#40;</span><a target="_blank"  href="http://www.php.net/dir"><span class="kw3">DIR</span></a> . DIRECTORY_SEPARATOR . <span class="st0">'factory'</span> . DIRECTORY_SEPARATOR . <span class="st0">'Factory.php'</span><span class="br0">&#41;</span>;
<span class="kw1">require_once</span><span class="br0">&#40;</span><a target="_blank"  href="http://www.php.net/dir"><span class="kw3">DIR</span></a> . DIRECTORY_SEPARATOR . <span class="st0">'factory'</span> . DIRECTORY_SEPARATOR . <span class="st0">'ConcreteFactory1.php'</span><span class="br0">&#41;</span>;
<span class="kw1">require_once</span><span class="br0">&#40;</span><a target="_blank"  href="http://www.php.net/dir"><span class="kw3">DIR</span></a> . DIRECTORY_SEPARATOR . <span class="st0">'factory'</span> . DIRECTORY_SEPARATOR . <span class="st0">'ConcreteFactory2.php'</span><span class="br0">&#41;</span>;
&nbsp;
<span class="kw1">require_once</span><span class="br0">&#40;</span><a target="_blank"  href="http://www.php.net/dir"><span class="kw3">DIR</span></a> . DIRECTORY_SEPARATOR . <span class="st0">'product'</span> . DIRECTORY_SEPARATOR . <span class="st0">'Product1.php'</span><span class="br0">&#41;</span>;
<span class="kw1">require_once</span><span class="br0">&#40;</span><a target="_blank"  href="http://www.php.net/dir"><span class="kw3">DIR</span></a> . DIRECTORY_SEPARATOR . <span class="st0">'product'</span> . DIRECTORY_SEPARATOR . <span class="st0">'Product2.php'</span><span class="br0">&#41;</span>;
<span class="kw1">require_once</span><span class="br0">&#40;</span><a target="_blank"  href="http://www.php.net/dir"><span class="kw3">DIR</span></a> . DIRECTORY_SEPARATOR . <span class="st0">'product'</span> . DIRECTORY_SEPARATOR . <span class="st0">'ConcreteProduct1_1.php'</span><span class="br0">&#41;</span>;
<span class="kw1">require_once</span><span class="br0">&#40;</span><a target="_blank"  href="http://www.php.net/dir"><span class="kw3">DIR</span></a> . DIRECTORY_SEPARATOR . <span class="st0">'product'</span> . DIRECTORY_SEPARATOR . <span class="st0">'ConcreteProduct1_2.php'</span><span class="br0">&#41;</span>;
<span class="kw1">require_once</span><span class="br0">&#40;</span><a target="_blank"  href="http://www.php.net/dir"><span class="kw3">DIR</span></a> . DIRECTORY_SEPARATOR . <span class="st0">'product'</span> . DIRECTORY_SEPARATOR . <span class="st0">'ConcreteProduct2_1.php'</span><span class="br0">&#41;</span>;
<span class="kw1">require_once</span><span class="br0">&#40;</span><a target="_blank"  href="http://www.php.net/dir"><span class="kw3">DIR</span></a> . DIRECTORY_SEPARATOR . <span class="st0">'product'</span> . DIRECTORY_SEPARATOR . <span class="st0">'ConcreteProduct2_2.php'</span><span class="br0">&#41;</span>;
&nbsp;
<span class="re0">$client</span> = <span class="kw2">new</span> Client<span class="br0">&#40;</span><span class="br0">&#41;</span>;
try <span class="br0">&#123;</span>
<span class="re0">$client</span>-&gt;<span class="me1">handleProduct</span><span class="br0">&#40;</span>factory\Factory::<span class="me2">TYPE_1</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span> catch <span class="br0">&#40;</span>\Exception <span class="re0">$e</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<a target="_blank"  href="http://www.php.net/print"><span class="kw3">print</span></a> <span class="re0">$e</span>-&gt;<span class="me1">getMessage</span><span class="br0">&#40;</span><span class="br0">&#41;</span> . PHP_EOL;
<span class="br0">&#125;</span>
&nbsp;
try <span class="br0">&#123;</span>
<span class="re0">$client</span>-&gt;<span class="me1">handleProduct</span><span class="br0">&#40;</span>factory\Factory::<span class="me2">TYPE_2</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span> catch <span class="br0">&#40;</span>\Exception <span class="re0">$e</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<a target="_blank"  href="http://www.php.net/print"><span class="kw3">print</span></a> <span class="re0">$e</span>-&gt;<span class="me1">getMessage</span><span class="br0">&#40;</span><span class="br0">&#41;</span> . PHP_EOL;
<span class="br0">&#125;</span>
&nbsp;
try <span class="br0">&#123;</span>
<span class="re0">$client</span>-&gt;<span class="me1">handleProduct</span><span class="br0">&#40;</span><span class="nu0">999</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span> catch <span class="br0">&#40;</span>\Exception <span class="re0">$e</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<a target="_blank"  href="http://www.php.net/print"><span class="kw3">print</span></a> <span class="re0">$e</span>-&gt;<span class="me1">getMessage</span><span class="br0">&#40;</span><span class="br0">&#41;</span> . PHP_EOL;
<span class="br0">&#125;</span></pre>
<p>
で、実行ファイルを実行すると以下の様な出力が得られます。
</p>
<pre>
abstractfactory\product\ConcreteProduct1_1
abstractfactory\product\ConcreteProduct1_2
abstractfactory\product\ConcreteProduct2_1
abstractfactory\product\ConcreteProduct2_2
Argument of abstractfactory\factory\Factory::abstractfactory\factory\Factory::getFactory() must be constant of abstractfactory\factory\Factory
</pre>
<p>
残念ながらPHP5.3らしいことって何もできなかったですね＾＾；<br />
名前空間を入れてみた、とか機能とはあんまり関係ないことだけです。<br />
Abstract FactoryパターンだとClientがFactoryとProductの実装を知る必要がないので、<br />
FactoryやProductのサブクラスが増えた場合には、FactoryとProductのサブクラスを実装して<br />
Clientを使うクラスで使用するFactoryの識別(Factory::TYPE_n)を切り替える処理を実装すれば<br />
他のクラスは便利に再利用できそうです。
</p>
<p>
大切なのはClientクラスは抽象クラスであるFactoryとProductしか扱わないこと。<br />
ここに実装クラスが入ってくると、このパターンの意味がなくなってしまいます。<br />
そして注意が必要なのは、Factoryの識別(Factory::TYPE_n)を誰が判断するか、ですね。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.azul.systems-noel.jp/2009/12/php5-3-de-%e3%83%87%e3%82%b6%e3%83%91%e3%82%bfabstract-factory/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PHPでJavaのEnumっぽい何かを手っ取り早く</title>
		<link>http://www.azul.systems-noel.jp/2009/08/php%e3%81%a7java%e3%81%aeenum%e3%81%a3%e3%81%bd%e3%81%84%e4%bd%95%e3%81%8b%e3%82%92%e6%89%8b%e3%81%a3%e5%8f%96%e3%82%8a%e6%97%a9%e3%81%8f/</link>
		<comments>http://www.azul.systems-noel.jp/2009/08/php%e3%81%a7java%e3%81%aeenum%e3%81%a3%e3%81%bd%e3%81%84%e4%bd%95%e3%81%8b%e3%82%92%e6%89%8b%e3%81%a3%e5%8f%96%e3%82%8a%e6%97%a9%e3%81%8f/#comments</comments>
		<pubDate>Thu, 20 Aug 2009 06:00:52 +0000</pubDate>
		<dc:creator>delfino</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.azul.systems-noel.jp/?p=85</guid>
		<description><![CDATA[色々出尽くしてそうなねたですが、Enumクラスを定義して、 それを継承してうんにゃらとかはなしな方向で考えます。 JavaのEnumをエミュレートしたいわけでもなく、です。 要件としては、 1.静的にインスタンスにアクセ [...]]]></description>
			<content:encoded><![CDATA[<p>
色々出尽くしてそうなねたですが、Enumクラスを定義して、<br />
それを継承してうんにゃらとかはなしな方向で考えます。<br />
JavaのEnumをエミュレートしたいわけでもなく、です。<br />
要件としては、<br />
1.静的にインスタンスにアクセスしたい。<br />
2.そのインスタンスは一意であることを保障したい。<br />
3.タイプヒンティングを使いたい。<br />
とか、そういうことです。</p>
<p><span id="more-85"></span></p>
<p>
とあるクラスに一意に定義された値で処理を行いたい時にどうしてますか?<br />
オブジェクト定数を使ってもいいのですが、そうするとタイプヒンティングが使えないので、<br />
予定していない値が渡された時の処理を考える必要があります。
</p>
<pre class="code">&nbsp;
<span class="kw2">&lt;?php</span>
<span class="coMULTI">/**
* Type
*/</span>
<span class="kw2">class</span> Type <span class="br0">&#123;</span>
<span class="coMULTI">/**
* Type A
* @var integer
*/</span>
const A = <span class="nu0">0</span>;
&nbsp;
<span class="coMULTI">/**
* Type B
* @var integer
*/</span>
const B = <span class="nu0">1</span>;
&nbsp;
<span class="coMULTI">/**
* Type C
* @var integer
*/</span>
const C = <span class="nu0">2</span>;
<span class="br0">&#125;</span>
&nbsp;
<span class="coMULTI">/**
* Chech Type
* @param integer $type Type to check
*/</span>
<span class="kw2">function</span> checkType<span class="br0">&#40;</span><span class="re0">$type</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$type</span> == Type::<span class="me2">A</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<a target="_blank"  href="http://www.php.net/print"><span class="kw3">print</span></a> <span class="st0">&quot;Type is Type A<span class="es0">\n</span>&quot;</span>;
<span class="br0">&#125;</span> <span class="kw1">else</span> <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$type</span> == Type::<span class="me2">B</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<a target="_blank"  href="http://www.php.net/print"><span class="kw3">print</span></a> <span class="st0">&quot;Type is Type B<span class="es0">\n</span>&quot;</span>;
<span class="br0">&#125;</span> <span class="kw1">else</span> <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$type</span> == Type::<span class="me2">C</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<a target="_blank"  href="http://www.php.net/print"><span class="kw3">print</span></a> <span class="st0">&quot;Type is Type C<span class="es0">\n</span>&quot;</span>;
<span class="br0">&#125;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="re0">$a</span> = Type::<span class="me2">A</span>;
<span class="re0">$b</span> = Type::<span class="me2">B</span>;
<span class="re0">$c</span> = Type::<span class="me2">C</span>;
&nbsp;
checkType<span class="br0">&#40;</span><span class="re0">$a</span><span class="br0">&#41;</span>;<span class="co1">//Type is A</span>
checkType<span class="br0">&#40;</span><span class="re0">$b</span><span class="br0">&#41;</span>;<span class="co1">//Type is B</span>
checkType<span class="br0">&#40;</span><span class="re0">$c</span><span class="br0">&#41;</span>;<span class="co1">//Type is C</span>
&nbsp;
checkType<span class="br0">&#40;</span><span class="nu0">5</span><span class="br0">&#41;</span>;<span class="co1">//Not expected</span>
checkType<span class="br0">&#40;</span><span class="kw2">null</span><span class="br0">&#41;</span>;<span class="co1">//Type is A, but not expected</span>
checkType<span class="br0">&#40;</span><span class="kw2">new</span> stdClass<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<span class="co1">//Error, but not expected</span>
&nbsp;</pre>
<p>
予定しない値が渡った時の処理を考えるのも、ですが、<br />
せっかくタイプヒンティングがあるので、<br />
タイプヒンティングをうまく使う方法を考えます。
</p>
<pre class="code">&nbsp;
<span class="kw2">&lt;?php</span>
<span class="coMULTI">/**
* Type
*/</span>
<span class="kw2">class</span> Type <span class="br0">&#123;</span>
<span class="coMULTI">/**
* Instances of this class
* @var array
*/</span>
<span class="kw2">private</span> <a target="_blank"  href="http://www.php.net/static"><span class="kw3">static</span></a> <span class="re0">$instances</span> = <a target="_blank"  href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span>;
&nbsp;
<span class="coMULTI">/**
* Return Type A
* @return Type
*/</span>
<span class="kw2">public</span> <a target="_blank"  href="http://www.php.net/static"><span class="kw3">static</span></a> <span class="kw2">function</span> A<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="kw1">if</span><span class="br0">&#40;</span>!<a target="_blank"  href="http://www.php.net/isset"><span class="kw3">isset</span></a><span class="br0">&#40;</span>self::<span class="re0">$instances</span><span class="br0">&#91;</span><span class="kw2">__METHOD__</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
self::<span class="re0">$instances</span><span class="br0">&#91;</span><span class="kw2">__METHOD__</span><span class="br0">&#93;</span> = <span class="kw2">new</span> Type<span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span>
<span class="kw1">return</span> self::<span class="re0">$instances</span><span class="br0">&#91;</span><span class="kw2">__METHOD__</span><span class="br0">&#93;</span>;
<span class="br0">&#125;</span>
&nbsp;
<span class="coMULTI">/**
* Return Type B
* @return Type
*/</span>
<span class="kw2">public</span> <a target="_blank"  href="http://www.php.net/static"><span class="kw3">static</span></a> <span class="kw2">function</span> B<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="kw1">if</span><span class="br0">&#40;</span>!<a target="_blank"  href="http://www.php.net/isset"><span class="kw3">isset</span></a><span class="br0">&#40;</span>self::<span class="re0">$instances</span><span class="br0">&#91;</span><span class="kw2">__METHOD__</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
self::<span class="re0">$instances</span><span class="br0">&#91;</span><span class="kw2">__METHOD__</span><span class="br0">&#93;</span> = <span class="kw2">new</span> Type<span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span>
<span class="kw1">return</span> self::<span class="re0">$instances</span><span class="br0">&#91;</span><span class="kw2">__METHOD__</span><span class="br0">&#93;</span>;
<span class="br0">&#125;</span>
&nbsp;
<span class="coMULTI">/**
* Return Type C
* @return Type
*/</span>
<span class="kw2">public</span> <a target="_blank"  href="http://www.php.net/static"><span class="kw3">static</span></a> <span class="kw2">function</span> C<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="kw1">if</span><span class="br0">&#40;</span>!<a target="_blank"  href="http://www.php.net/isset"><span class="kw3">isset</span></a><span class="br0">&#40;</span>self::<span class="re0">$instances</span><span class="br0">&#91;</span><span class="kw2">__METHOD__</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
self::<span class="re0">$instances</span><span class="br0">&#91;</span><span class="kw2">__METHOD__</span><span class="br0">&#93;</span> = <span class="kw2">new</span> Type<span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span>
<span class="kw1">return</span> self::<span class="re0">$instances</span><span class="br0">&#91;</span><span class="kw2">__METHOD__</span><span class="br0">&#93;</span>;
<span class="br0">&#125;</span>
&nbsp;
<span class="coMULTI">/**
* Ordinal of this Class
* @var integer
*/</span>
<span class="kw2">private</span> <span class="re0">$ordinal</span>;
&nbsp;
<span class="coMULTI">/**
* Private constructor
* @param integer $ordinal Ordinal of this Class
*/</span>
<span class="kw2">private</span> <span class="kw2">function</span> __construct<span class="br0">&#40;</span><span class="re0">$ordinal</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="re0">$this</span>-&gt;<span class="me1">ordianl</span> = <span class="re0">$ordinal</span>;
<span class="br0">&#125;</span>
&nbsp;
<span class="coMULTI">/**
* Revoke clone
*/</span>
<span class="kw2">public</span> <span class="kw2">function</span> __clone<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
throw <span class="kw2">new</span> BadFunctionCallException<span class="br0">&#40;</span><span class="st0">'Clone is not allowed.'</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="coMULTI">/**
* Chech Type
* @param Type $type Type to check
*/</span>
<span class="kw2">function</span> checkType<span class="br0">&#40;</span>Type <span class="re0">$type</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$type</span> == Type::<span class="me2">A</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<a target="_blank"  href="http://www.php.net/print"><span class="kw3">print</span></a> <span class="st0">&quot;Type is Type A<span class="es0">\n</span>&quot;</span>;
<span class="br0">&#125;</span> <span class="kw1">else</span> <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$type</span> == Type::<span class="me2">B</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<a target="_blank"  href="http://www.php.net/print"><span class="kw3">print</span></a> <span class="st0">&quot;Type is Type B<span class="es0">\n</span>&quot;</span>;
<span class="br0">&#125;</span> <span class="kw1">else</span> <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$type</span> == Type::<span class="me2">C</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<a target="_blank"  href="http://www.php.net/print"><span class="kw3">print</span></a> <span class="st0">&quot;Type is Type C<span class="es0">\n</span>&quot;</span>;
<span class="br0">&#125;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="re0">$a</span> = Type::<span class="me2">A</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="re0">$b</span> = Type::<span class="me2">B</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="re0">$c</span> = Type::<span class="me2">C</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;
&nbsp;
checkType<span class="br0">&#40;</span><span class="re0">$a</span><span class="br0">&#41;</span>;<span class="co1">//Type is A</span>
checkType<span class="br0">&#40;</span><span class="re0">$b</span><span class="br0">&#41;</span>;<span class="co1">//Type is B</span>
checkType<span class="br0">&#40;</span><span class="re0">$c</span><span class="br0">&#41;</span>;<span class="co1">//Type is C</span>
&nbsp;
checkType<span class="br0">&#40;</span><span class="kw2">null</span><span class="br0">&#41;</span>;<span class="co1">//Error</span>
checkType<span class="br0">&#40;</span><span class="kw2">new</span> stdClass<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<span class="co1">//Error</span>
checkType<span class="br0">&#40;</span><span class="kw2">new</span> Type<span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<span class="co1">//Error</span>
<span class="re0">$a2</span> = clone <span class="re0">$a</span>;<span class="co1">//BadFunctionCallException</span>
&nbsp;</pre>
<p>
スタティックメソッドでインスタンスにアクセスするようにしました。<br />
privateなconstructorと__cloneメソッドを実装して、<br />
外部からのインスタンス作成と複製を無効にすれば<br />
インスタンスが一意であることが保障されます。<br />
タイプヒンティングを使っているので、<br />
checkType()の内部では$typeはTypeのインスタンスであることが保障されます。
</p>
<p>
タイプヒンティングは便利なのですが、<br />
足りてないところもあって、やきもきさせてくれます。<br />
例えばスカラー型やオブジェクト型のタイプヒンティングが使えれば、<br />
もっと便利に使えますよね。<br />
PHPにはstdClassというクラスがあるのですが、stdClassはJavaのObject型とは違って、<br />
全てのクラスのスーパークラスではありません。
</p>
<pre class="code">&nbsp;
<span class="kw2">function</span> foo<span class="br0">&#40;</span><span class="coMULTI">/** not allowed */</span>integer <span class="re0">$i</span>, <span class="coMULTI">/** not allowed */</span>object <span class="re0">$o</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><span class="br0">&#125;</span>
&nbsp;</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.azul.systems-noel.jp/2009/08/php%e3%81%a7java%e3%81%aeenum%e3%81%a3%e3%81%bd%e3%81%84%e4%bd%95%e3%81%8b%e3%82%92%e6%89%8b%e3%81%a3%e5%8f%96%e3%82%8a%e6%97%a9%e3%81%8f/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cairngormをもう少し便利に使う(1.ViewHelper拡張)</title>
		<link>http://www.azul.systems-noel.jp/2009/04/cairngorm%e3%82%92%e3%82%82%e3%81%86%e5%b0%91%e3%81%97%e4%be%bf%e5%88%a9%e3%81%ab%e4%bd%bf%e3%81%861-viewhelper%e6%8b%a1%e5%bc%b5/</link>
		<comments>http://www.azul.systems-noel.jp/2009/04/cairngorm%e3%82%92%e3%82%82%e3%81%86%e5%b0%91%e3%81%97%e4%be%bf%e5%88%a9%e3%81%ab%e4%bd%bf%e3%81%861-viewhelper%e6%8b%a1%e5%bc%b5/#comments</comments>
		<pubDate>Thu, 02 Apr 2009 02:27:19 +0000</pubDate>
		<dc:creator>delfino</dc:creator>
				<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://www.azul.systems-noel.jp/?p=84</guid>
		<description><![CDATA[Cairngormを使う時はViewHelperにロジックを実装していきますが、 Cairngormは汎用的に作られているので、お約束のコーディングが増えてきます。 例えば、Viewに設定した全てのValidatorの実 [...]]]></description>
			<content:encoded><![CDATA[<p>
Cairngormを使う時はViewHelperにロジックを実装していきますが、<br />
Cairngormは汎用的に作られているので、お約束のコーディングが増えてきます。<br />
例えば、Viewに設定した全てのValidatorの実行だったり、<br />
全てのValidatorの検証結果のクリアだったり、<br />
CairngormEventのdispatchだったり、<br />
こういうお約束なコードを全てのViewHelperに実装するのは<br />
コードの量も増えますし、同じようなコードを何度も書くのは、バグの発生率も高まります。<br />
なるべくシンプルな実装のViewHelperを使えるように<br />
ViewHelperを拡張したExtendedViewHelperを考えてみます。
</p>
<p><span id="more-84"></span></p>
<p>
ということで、今delfinoが使っているExtendedViewHelperです。<br />
ViewHelperを実装する場合には、このExtendedViewHelperを拡張して実装しています。<br />
ちなみに、こういうお約束の内容はFlex Builder(というかeclipse)のスニペットに登録しておくと便利です。<br />
以下、ExtendedViewHelperのソースです。
</p>
<pre class="code">&nbsp;
package $<span class="br0">&#123;</span>PackageName<span class="br0">&#125;</span> <span class="br0">&#123;</span>
<span class="kw3">import</span> com.<span class="me1">adobe</span>.<span class="me1">cairngorm</span>.<span class="kw3">control</span>.<span class="me1">CairngormEvent</span>;
<span class="kw3">import</span> com.<span class="me1">adobe</span>.<span class="me1">cairngorm</span>.<span class="kw3">control</span>.<span class="me1">CairngormEventDispatcher</span>;
<span class="kw3">import</span> com.<span class="me1">adobe</span>.<span class="me1">cairngorm</span>.<span class="me1">view</span>.<span class="me1">ViewHelper</span>;
&nbsp;
<span class="kw3">import</span> flash.<span class="me1">events</span>.<span class="me1">Event</span>;
&nbsp;
<span class="kw3">import</span> mx.<span class="me1">events</span>.<span class="me1">FlexEvent</span>;
<span class="kw3">import</span> mx.<span class="me1">events</span>.<span class="me1">ValidationResultEvent</span>;
<span class="kw3">import</span> mx.<span class="me1">validators</span>.<span class="me1">Validator</span>;
&nbsp;
<span class="coMULTI">/**
* ExtendedViewHelper
* @author $Author$
*
*/</span>
<span class="kw3">public</span> <span class="kw2">class</span> ExtendedViewHelper <span class="kw3">extends</span> ViewHelper <span class="br0">&#123;</span>
&nbsp;
<span class="coMULTI">/**
/**
* CairngormEventDispatcher
*/</span>
protected <span class="kw3">static</span> <span class="kw2">var</span> dispatcher:CairngormEventDispatcher = CairngormEventDispatcher.<span class="me1">getInstance</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;
&nbsp;
<span class="coMULTI">/**
* ViewLocator
*/</span>
protected <span class="kw3">static</span> <span class="kw2">var</span> locator:ViewLocator = ViewLocator.<span class="me1">getInstance</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;
&nbsp;
<span class="coMULTI">/**
* Validators of ExtendedViewHelper
*/</span>
protected <span class="kw2">var</span> validators:<span class="kw3">Array</span> = <span class="kw2">new</span> <span class="kw3">Array</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;
&nbsp;
<span class="coMULTI">/**
* initialization
* @param document view of ViewHelper
* @param id id of ViewHelper
*
*/</span>
override <span class="kw3">public</span> <span class="kw2">function</span> initialized<span class="br0">&#40;</span>document:<span class="kw3">Object</span>, id:<span class="kw3">String</span><span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span>
<span class="kw3">super</span>.<span class="me1">initialized</span><span class="br0">&#40;</span>document, id<span class="br0">&#41;</span>;
<span class="kw3">this</span>.<span class="me1">view</span>.<span class="me1">addEventListener</span><span class="br0">&#40;</span>FlexEvent.<span class="me1">CREATION_COMPLETE</span>, <span class="kw3">this</span>.<span class="me1">initViewHelper</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span>
&nbsp;
<span class="coMULTI">/**
* Initialize method of ExtendedViewHelper.&lt;br /&gt;
* Override this method at sub classes.
* @param event Evet
*
*/</span>
protected <span class="kw2">function</span> initViewHelper<span class="br0">&#40;</span>event:Event<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><span class="br0">&#125;</span>
&nbsp;
<span class="coMULTI">/**
* Dispatch specified CairngormEvent.
* @param cairngormEvent
*
*/</span>
protected <span class="kw2">function</span> dispatch<span class="br0">&#40;</span>cairngormEvent:CairngormEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span>
dispatcher.<span class="me1">dispatchEvent</span><span class="br0">&#40;</span>cairngormEvent<span class="br0">&#41;</span>;
<span class="br0">&#125;</span>
&nbsp;
<span class="coMULTI">/**
* Validate all Validators
* @return validate result
*
*/</span>
protected <span class="kw2">function</span> validate<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">Boolean</span> <span class="br0">&#123;</span>
<span class="kw1">if</span><span class="br0">&#40;</span>Validator.<span class="me1">validateAll</span><span class="br0">&#40;</span>validators<span class="br0">&#41;</span>.<span class="kw3">length</span> &lt; <span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="kw1">return</span> <span class="kw2">true</span>;
<span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span>
<span class="kw1">return</span> <span class="kw2">false</span>;
<span class="br0">&#125;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="coMULTI">/**
* Clear all Validation result
*
*/</span>
protected <span class="kw2">function</span> clearValidators<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span>
<span class="kw1">for</span> each<span class="br0">&#40;</span><span class="kw2">var</span> validator :Validator <span class="kw1">in</span> <span class="kw3">this</span>.<span class="me1">validators</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
validator.<span class="me1">dispatchEvent</span><span class="br0">&#40;</span><span class="kw2">new</span> ValidationResultEvent<span class="br0">&#40;</span>ValidationResultEvent.<span class="me1">VALID</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="br0">&#125;</span>
<span class="br0">&#125;</span>
&nbsp;</pre>
<p>
少し説明をすると、ViewHelperのinitializedメソッドをオーバライドして、<br />
ViewのCREATION_COMPLETE時にinitViewHelperがコールバックとして呼ばれるように設定しているのと、<br />
ExtendedViewHelperのdispatcherフィールドにCairngormEventDispatcherを設定しています。
</p>
<p>
initViewHelperはViewのCREATION_COMPLETE時に呼ばれますから、<br />
ここで例えばViewにEventListenerを設定したり、Validatorを設定したりします。<br />
Viewに設定するValidatorは、ExtendedViewHelperのvalidatorsに追加しておくと<br />
validateメソッドやclearValidatorsメソッドの対象にすることができます。
</p>
<p>
dispatchメソッドは、CairngormEventを発行する際に
</p>
<pre class="code">&nbsp;
CairngormEventDispatcher.<span class="me1">getInstance</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">dispatchEvent</span><span class="br0">&#40;</span>cairngormEvent<span class="br0">&#41;</span>;
&nbsp;</pre>
<p>
と、いちいち書くのもおっくうなので、
</p>
<pre class="code">&nbsp;
<span class="kw3">this</span>.<span class="me1">dispatch</span><span class="br0">&#40;</span>cairngormEvent<span class="br0">&#41;</span>;
&nbsp;</pre>
<p>
と手抜きをする為のメソッドです。<br />
毎回インスタンスの取得を行わないだけ、少しクライアントにも優しい部分もあるかもしれません。
</p>
<p>
validateメソッドは、フィールドvalidatorsに格納されているValidatorの検証を実行します。<br />
ありがちな処理で、OKボタン押下時のコールバックなんかに使います。
</p>
<pre class="code">&nbsp;
<span class="kw3">private</span> <span class="kw2">function</span> onOKClick<span class="br0">&#40;</span>event:Event<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span>
<span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">this</span>.<span class="me1">validate</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="co1">//検証がOKなら処理の実行</span>
<span class="br0">&#125;</span>
<span class="br0">&#125;</span>
&nbsp;</pre>
<p>
とか、こんな感じですね。
</p>
<p>
そして、clearValidatorsメソッドは、<br />
フィールドvalidatorsに格納されているValidatorの検証結果をクリアします。<br />
例えば、何かのVOの編集をする為のViewなんかで、<br />
検証結果が残ったままなのもあれなので、こんな感じに使います。
</p>
<pre class="code">&nbsp;
<span class="kw3">public</span> <span class="kw2">function</span> <span class="kw3">set</span> vo<span class="br0">&#40;</span>value:VO<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span>
<span class="kw3">this</span>._vo = value;
<span class="kw3">this</span>.<span class="me1">clearValidators</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span>
&nbsp;</pre>
<p>
と、いうことでまずはViewHelperの拡張クラスについて、でした。<br />
次はこの拡張ViewHelperを使ったViewHelperの実装についての予定です。<br />
その後はCairngormEvent、そしてCommandについて、まとめてまいります。<br />
そして、PureMVCについても、Cairngormシリーズの後にまとめます。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.azul.systems-noel.jp/2009/04/cairngorm%e3%82%92%e3%82%82%e3%81%86%e5%b0%91%e3%81%97%e4%be%bf%e5%88%a9%e3%81%ab%e4%bd%bf%e3%81%861-viewhelper%e6%8b%a1%e5%bc%b5/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Flexのクラスとサーバサイドのクラスのマッピングがうまくいかないケース</title>
		<link>http://www.azul.systems-noel.jp/2008/04/flex%e3%81%ae%e3%82%af%e3%83%a9%e3%82%b9%e3%81%a8%e3%82%b5%e3%83%bc%e3%83%90%e3%82%b5%e3%82%a4%e3%83%89%e3%81%ae%e3%82%af%e3%83%a9%e3%82%b9%e3%81%ae%e3%83%9e%e3%83%83%e3%83%94%e3%83%b3%e3%82%b0/</link>
		<comments>http://www.azul.systems-noel.jp/2008/04/flex%e3%81%ae%e3%82%af%e3%83%a9%e3%82%b9%e3%81%a8%e3%82%b5%e3%83%bc%e3%83%90%e3%82%b5%e3%82%a4%e3%83%89%e3%81%ae%e3%82%af%e3%83%a9%e3%82%b9%e3%81%ae%e3%83%9e%e3%83%83%e3%83%94%e3%83%b3%e3%82%b0/#comments</comments>
		<pubDate>Fri, 25 Apr 2008 09:20:53 +0000</pubDate>
		<dc:creator>delfino</dc:creator>
				<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://www.azul.systems-noel.jp/?p=83</guid>
		<description><![CDATA[はい、ものすごく久しぶりの更新です。 Flexでサーバサイドとの連携を行う場合には、プリミティブ型を使う以外に Flex側のクラスとサーバサイドのクラスをマッピングさせることがよくあります。 で、このマッピングでちょっと [...]]]></description>
			<content:encoded><![CDATA[<p>
はい、ものすごく久しぶりの更新です。<br />
Flexでサーバサイドとの連携を行う場合には、プリミティブ型を使う以外に<br />
Flex側のクラスとサーバサイドのクラスをマッピングさせることがよくあります。<br />
で、このマッピングでちょっとはまってしまったのでメモです。
</p>
<p><span id="more-83"></span></p>
<p>
今回のメモはFlex側のアプリケーションの問題なので、<br />
サーバサイドのアーキテクチャは関係ありません。<br />
(サーバサイドがamfphpでもPyAMFでもBlazeDSでもLSDSでも)
</p>
<p>
例えばFlex側でこんなクラスhoge.Hoge.asを書いたとします。</p>
<pre class="code">&nbsp;
package hoge <span class="br0">&#123;</span>
<span class="br0">&#91;</span>RemoteClass<span class="br0">&#40;</span>alias = <span class="st0">&quot;hoge.Hoge&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span>
<span class="kw3">public</span> <span class="kw2">class</span> Hoge <span class="br0">&#123;</span>
<span class="kw3">public</span> <span class="kw2">var</span> <span class="kw3">name</span>:<span class="kw3">String</span>;
<span class="kw3">public</span> <span class="kw2">var</span> value:<span class="kw3">String</span>;
<span class="br0">&#125;</span>
<span class="br0">&#125;</span>
&nbsp;</pre>
<p>そして、サーバサイドにはhoge.Hogeクラスのオブジェクト配列を返すHogeService.getHogeが実装されているとします。<br />
で、サーバサイドのServiceをRemoteObjectとかで呼んで、結果をDataGridに格納するとします。<br />
例えばこんなFlexアプリケーションhogeAppli.mxmlがあるとします。</p>
<pre class="code">&nbsp;
&lt;?<span class="kw3">xml</span> <span class="kw3">version</span>=<span class="st0">&quot;1.0&quot;</span> encoding=<span class="st0">&quot;utf-8&quot;</span>?&gt;
&lt;mx:Application xmlns:mx=<span class="st0">&quot;http://www.adobe.com/2006/mxml&quot;</span> layout=<span class="st0">&quot;absolute&quot;</span>&gt;
&lt;mx:Script&gt;
&lt;!<span class="br0">&#91;</span>CDATA<span class="br0">&#91;</span>
<span class="kw3">import</span> mx.<span class="me1">rpc</span>.<span class="me1">events</span>.<span class="me1">ResultEvent</span>;
<span class="kw3">private</span> <span class="kw2">function</span> getResult<span class="br0">&#40;</span>event:ResultEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span>
dgHoge.<span class="me1">dataProvider</span> = event.<span class="me1">result</span>;
<span class="br0">&#125;</span>
<span class="br0">&#93;</span><span class="br0">&#93;</span>&gt;
&lt;/mx:Script&gt;
&lt;mx:RemoteObject id=<span class="st0">&quot;remoteObject&quot;</span> destination=<span class="st0">&quot;default&quot;</span> source=<span class="st0">&quot;HogeService&quot;</span> result=<span class="st0">&quot;{getResult(event)}&quot;</span>/&gt;
&lt;mx:VBox x=<span class="st0">&quot;0&quot;</span> y=<span class="st0">&quot;0&quot;</span>&gt;
&lt;mx:DataGrid id=<span class="st0">&quot;dgHoge&quot;</span>&gt;
&lt;mx:columns&gt;
&lt;mx:DataGridColumn headerText=<span class="st0">&quot;Name&quot;</span> dataField=<span class="st0">&quot;name&quot;</span>/&gt;
&lt;mx:DataGridColumn headerText=<span class="st0">&quot;Value&quot;</span> dataField=<span class="st0">&quot;value&quot;</span>/&gt;
&lt;/mx:columns&gt;
&lt;/mx:DataGrid&gt;
&lt;mx:<span class="kw3">Button</span> id=<span class="st0">&quot;btnGetHoge&quot;</span> label=<span class="st0">&quot;getHoge&quot;</span> click=<span class="st0">&quot;{remoteObject.getHoge()}&quot;</span>/&gt;
&lt;/mx:VBox&gt;
&nbsp;
&lt;/mx:Application&gt;
&nbsp;</pre>
</p>
<p>
さて、btnGetHogeがクリックされて、HogeServiceのgetHogeが実行された後<br />
getResultメソッドの引数eventのresultに格納されているのは、何のクラスのオブジェクト配列でしょう。<br />
hoge.Hogeクラスが定義されていてマッピングも定義されているのでhoge.Hogeクラスのオブジェクト配列になりそうなものですけど<br />
実際にはObjectクラスのオブジェクト配列になります。<br />
どうしてこういうことになるのかというと、<br />
Flexのソースツリーの中にhoge.Hoge.asが含まれていたとしても<br />
アプリケーション(この場合はhogeAppli.mxml)からhoge.Hogeクラスが参照されない限りは<br />
hoge.Hoge.asはクラスマッピングの対象にならないようです。<br />
FlexBuilderでは、hoge.Hoge.asにシンタックスの間違いがあってコンパイルが通らないようなソースであっても<br />
ビルドが通ってしまいますから、そもそもコンパイルの対象にならないのかもしれませんね。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.azul.systems-noel.jp/2008/04/flex%e3%81%ae%e3%82%af%e3%83%a9%e3%82%b9%e3%81%a8%e3%82%b5%e3%83%bc%e3%83%90%e3%82%b5%e3%82%a4%e3%83%89%e3%81%ae%e3%82%af%e3%83%a9%e3%82%b9%e3%81%ae%e3%83%9e%e3%83%83%e3%83%94%e3%83%b3%e3%82%b0/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>ez Publishを使ったみた。</title>
		<link>http://www.azul.systems-noel.jp/2008/02/ez-publish%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%9f%e3%81%bf%e3%81%9f%e3%80%82/</link>
		<comments>http://www.azul.systems-noel.jp/2008/02/ez-publish%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%9f%e3%81%bf%e3%81%9f%e3%80%82/#comments</comments>
		<pubDate>Fri, 22 Feb 2008 04:10:36 +0000</pubDate>
		<dc:creator>delfino</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.azul.systems-noel.jp/?p=82</guid>
		<description><![CDATA[ez Publishを使ったみたわけですが、ちょっと覚書。 Site AccessをHostモードにした場合 なんですが、[SiteAccessSettings]セクションのHostMatchMapItems[]ディレク [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://ez.no/" target="_blank">ez Publish</a>を使ったみたわけですが、ちょっと覚書。</p>
<p><span id="more-82"></span></p>
<h3>Site AccessをHostモードにした場合</h3>
<p>
なんですが、[SiteAccessSettings]セクションのHostMatchMapItems[]ディレクティブが<br />
インストールウィザードで指定したものが反映されてないみたいです。<br />
ezflow_site_userとezflow_site_adminがデフォルトの<br />
ezflow_site_user.<em>ドメイン名</em>とezflow_site_admin.<em>ドメイン名</em>になっています。<br />
修正してあげないとサイトにアクセスできないので、<br />
インストールウィザードが終了した後に<br />
<em>ez Publish install directory</em>/settings/override/site.ini.append.phpを修正いたしましょう。<br />
後は<em>ez Publish install directory</em>/settings/siteaccess以下にあるディレクトリ内のsite.ini.append.phpにある<br />
[SiteSettings]セクションのAdditionalLoginFormActionURLも直したほうがよさげ。
</p>
<p>
Site AccessをデフォルトのURIにした場合には<br />
URLが<em>ez Publish Site</em>/index.php?Hogeとかそんな感じで生成されます。<br />
これを<em>ez Publish Site</em>/Hogeにしたい場合にはSite AccessをHostにする必要があります。<br />
この場合はVirtualHostを使うことになるのですが、共有サーバとかでVirtualHostを使えないけど<br />
サブドメインを使えるような場合(どのケースかとかはぐたぐた長くなるので割愛)には<br />
site.iniの[SiteAccessSettings]セクションにForceVirtualHost=trueと指定してあげるとどうにかなるかもしれません。
</p>
<h3>なんかFLVが再生されないような</h3>
<p>
Delfinoの環境では再生されませんでした。<br />
原因その1はflashvarsでmoviepathという変数を渡しているのですが<br />
これが2回出力されている
</p>
<pre>
moviepath=moviepath=Hoge
</pre>
<p>
のも原因かもしれないのでとりあえずテンプレートを修正。<br />
あ、これez Flowを使ってる場合の話です。<br />
他は試してないので分りません。<br />
<em>ez Publish install directory</em>/extension/ezflow/design/ezflow/override/templates/block/video.tplを修正します。<br />
47行目で
</p>
<pre>
&lt;param name="flashvars" value="moviepath={$flash_var}" /&gt;
</pre>
<p>
としているので
</p>
<pre>
&lt;param name="flashvars" value="{$flash_var}" /&gt;
</pre>
<p>
に修正。<br />
これでmoviepathが2重に送信されることはなくなったわけですが･･･はい、やっぱり流れませんね。<br />
ものがSWFなので手を出せません。<br />
ez Publishはオープンソースなので、もしかしたらソースが手に入るのかもですけど<br />
ちょっとそこまで試す気になれないのでここまで。<br />
久しぶりの更新も覚書。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.azul.systems-noel.jp/2008/02/ez-publish%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%9f%e3%81%bf%e3%81%9f%e3%80%82/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>amfphp1.9を高速化する。</title>
		<link>http://www.azul.systems-noel.jp/2007/11/amfphp1-9%e3%82%92%e9%ab%98%e9%80%9f%e5%8c%96%e3%81%99%e3%82%8b%e3%80%82/</link>
		<comments>http://www.azul.systems-noel.jp/2007/11/amfphp1-9%e3%82%92%e9%ab%98%e9%80%9f%e5%8c%96%e3%81%99%e3%82%8b%e3%80%82/#comments</comments>
		<pubDate>Wed, 21 Nov 2007 15:21:13 +0000</pubDate>
		<dc:creator>delfino</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.azul.systems-noel.jp/?p=81</guid>
		<description><![CDATA[書こう書こうと思ってて後回しにしていたことですが、 amfphp1.9をそのまま使ってるともったいないですんです。 amfphpの前リーダであるPatrickさんの5 1/2 blogの Amfphp 1.9 beta  [...]]]></description>
			<content:encoded><![CDATA[<p>
書こう書こうと思ってて後回しにしていたことですが、<br />
amfphp1.9をそのまま使ってるともったいないですんです。<br />
amfphpの前リーダであるPatrickさんの5 1/2 blogの<br />
<a href="http://www.5etdemi.com/blog/archives/2007/01/amfphp-19-beta-2-ridiculously-faster/" target="_blank">Amfphp 1.9 beta 2 &#8211; ridiculously faster</a>というエントリからの話です。<br />
･･･もう一年近く前のエントリなんですけど＾＾；
</p>
<p><span id="more-81"></span></p>
<h3>てっとり早く結論</h3>
<p>
結論から書くと、AMFのエンコードとデコードを行う<br />
AMFEXTというextensionがありますから、<br />
そのextensionをPHPにインストールしておくと<br />
amfphp1.9がextensionを認識して、高速に動作するようになる、ということです。<br />
Patrickさんによると<br />
<em>We&#8217;ve tested it through and through, it is very stable, and let me tell you, <strong>it is ridiculously fast</strong>.<br /></em><br />
<em>テストにテストを重ねてみたけど、とても安定していて、言わせてもらうなら、<strong>これめっちゃ早いで</strong>。<br /></em><br />
とのことです。(いつもながらに適当訳)
</p>
<h3>で、どうするか</h3>
<p>
<a href="http://www.teslacore.it/wiki/index.php?title=AMFEXT" target="_blank">AMFEXTのサイト</a>からソースやバイナリがダウンロードできます。<br />
Windowsユーザなら、バイナリのzipをダウンロードすると、<br />
bin/windows以下にPHPのバージョンごとのdllがありますから、<br />
使っているPHPのバージョンに該当するdllをPHPのextensionディレクトリに放り込んで<br />
php.iniにphp_extension=php_amf.dllと追記して、Webサーバを再起動すればよしです。<br />
Linuxユーザの場合は、phpizeを使ってPECL拡張モジュールとしてコンパイルできるそうです。<br />
これは試してないので、説明ができません＾＾；<br />
Linuxの場合は、php.iniにextension=amf.soを追記です。
</p>
<p>
extensionのセットアップが完了したらphpinfo()を実行するとamfの項目がでてきます。<br />
で、amfphpのgateway.phpに直接ブラウザからアクセスしてみると、<br />
「AMF C Extension is loaded and enabled.」の一文が増えてます。<br />
後はextensionの力で高速になったamfphpが使える、ということですね。
</p>
<h3>ところが色々ありまして</h3>
<p>
AMFEXTを有効にした状態で、S2Baseのamfphpプラグインを使ってみたんですけど<br />
どうもS2Dao_ArrayListのマッピングが変わってるみたいで、<br />
AMFEXTを有効にしていない時のソースコードそのままでは動いてくれませんでした＾＾；<br />
原因を調べてみないと、と思ってそのままになっていたので<br />
AMFEXTの話を書いてなかったんです。＾＾；；
</p>
<p>
で、思い立ってちらっとソースを見ていると･･･AMFEXTってPHPライセンスじゃありませんか。<br />
と、いうことは、AMFEXTを使った成果物はASL2.0に移行できる･･･のかな？<br />
考えてみればエンコーダとデコーダがあるってことは、<br />
amfphpでいうところのGatewayを作れば、S2AMF.PHP5･･･ですか？<br />
ようやくコミッタらしい何かができますか？<br />
そしてまたなれない翻訳大会の開始ですか？
</p>
<p>
amfphp1.9にはgzipサポートの機能があったり<br />
<a href="http://www.5etdemi.com/blog/archives/2007/01/amfphp-19-beta-2-ridiculously-faster/" target="_blank">Amfphp 1.9 beta 2 &#8211; ridiculously faster</a>には、<br />
amfphp1.9の新機能の紹介が色々と書かれています。<br />
amfphp1.9は、まだ公式サイトのドキュメントに落ちてない状態ですから<br />
Patricさんのこのエントリを参考に色々と試してみるのもよいかと思われます。<br />
amfphp2.0はどうなるかな。<br />
SourceForgeの方では、ちょっと動きがないようですが。
</p>
<h3>追記</h3>
<p>
AMFEXTのサイトに書いてあるのですが、<br />
AMFEXTって<a href="http://pecl.php.net/package/amfext" target="_blank">PECL</a>でも公開されています。<br />
PECLのはVersionが0.9.1になってますから、<br />
AMFEXTのサイトにある0.9より新しいということになると思うのですが、<br />
なんかヘッダファイルの更新日時が微妙ですね･･･＾＾；<br />
そして、amfphpのSorceForgeのCVSにはAMFEXTが置かれてますね･･･。<br />
こっちの方は最終更新が3/22ですから、うーん＾＾；；<br />
AMFEXTのサイトには、SorceForgeに移行するよって書いてあるんですけど<br />
一体どこに･･･あるんだろう･･･。<br />
PECLのが最新版と思えばいいのかな･･･＾＾；；；</p>
]]></content:encoded>
			<wfw:commentRss>http://www.azul.systems-noel.jp/2007/11/amfphp1-9%e3%82%92%e9%ab%98%e9%80%9f%e5%8c%96%e3%81%99%e3%82%8b%e3%80%82/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ViewHelperを使ったPopUpについて考えてみる。</title>
		<link>http://www.azul.systems-noel.jp/2007/11/viewhelper%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%9fpopup%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6%e8%80%83%e3%81%88%e3%81%a6%e3%81%bf%e3%82%8b%e3%80%82/</link>
		<comments>http://www.azul.systems-noel.jp/2007/11/viewhelper%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%9fpopup%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6%e8%80%83%e3%81%88%e3%81%a6%e3%81%bf%e3%82%8b%e3%80%82/#comments</comments>
		<pubDate>Wed, 21 Nov 2007 02:57:26 +0000</pubDate>
		<dc:creator>delfino</dc:creator>
				<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://www.azul.systems-noel.jp/?p=80</guid>
		<description><![CDATA[CairngormでViewHelperを使っているコンポーネントをPopupしたい場合どうするか、という話です。 ちょっと卵が先かニワトリが先か、ということで考えてしまったのでメモ。 Cairngormでは、ViewL [...]]]></description>
			<content:encoded><![CDATA[<p>
CairngormでViewHelperを使っているコンポーネントをPopupしたい場合どうするか、という話です。<br />
ちょっと卵が先かニワトリが先か、ということで考えてしまったのでメモ。
</p>
<p><span id="more-80"></span></p>
<p>
Cairngormでは、ViewLocatorを使ってViewとロジックを分離します。<br />
アプリケーションの見た目に関る部分はMXMLに記述して、動作に関る部分はViewHelperに記述することで<br />
見た目と動作を別のものにするわけですね。<br />
具体的にはMXMLの中でそのViewに該当するViewLocatorを宣言しておきます。<br />
Hogeというコンポーネントに対するViewHelperがHogeViewHelperならこんな感じです。
</p>
<pre class="code">&nbsp;
<span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;utf-8&quot;</span><span class="re2">?&gt;</span></span>
<span class="sc3"><span class="re1">&lt;mx:Panel</span>
<span class="re0">xmlns:mx</span>=<span class="st0">&quot;http://www.adobe.com/2006/mxml&quot;</span>
<span class="re0">xmlns:viewhelper</span>=<span class="st0">&quot;hoge.viewhelper.*&quot;</span> <span class="re2">&gt;</span></span>
<span class="sc3"><span class="re1">&lt;viewhelper:HogeViewHelper</span> <span class="re0">id</span>=<span class="st0">&quot;hogeViewHelper&quot;</span> <span class="re2">/&gt;</span></span>
&nbsp;</pre>
<p>
そうするとHogeViewのインスタンスが生成された時に<br />
HogeViewHelperのインスタンスが生成されて、<br />
HogeViewHelperのviewフィールドにHogeViewのインスタンスへの参照が設定されます。<br />
で、あわせてViewLocatorにMXMLで指定したHogeViewHelperのidをキーとして<br />
(Cairngormのドキュメントで言うところのcanonical name)<br />
HogeViewHelperのインスタンスが登録されます。<br />
後はViewLocatorのインスタンスにgetViewHelper(&#8220;hogeViewHelper&#8221;)とすると<br />
HogeViewHelperのインスタンスを返してくれます。
</p>
<p>
もう少しつっこんで書くと、<br />
HogeViewHelperのスーパクラスであるViewHelperクラスには<br />
initializedメソッドが定義されていて、<br />
このメソッドの中で自身のviewとidを設定して、<br />
対象となるViewに対してイベントリスナを設定しています。<br />
イベントリスナはEvent.ADDEDとEvent.REMOVEDで<br />
対象となるViewが表示対象となった時には<br />
ViewLocatorに対して自身を登録して、<br />
対象となるViewが表示対象外となった時には<br />
ViewLocatorに対して自身をします。
</p>
<p>
つまり、ViewHelperの準備が完了するには以下のステップがあります。
</p>
<ol>
<li>ViewHelperが設定されたViewのインスタンスが生成される。</li>
<li>ViewHelperのインスタンスが生成される。</li>
<li>ViewHelperがimplementsしているIMXMLObjectのinitializedメソッドが呼ばれる。</li>
<li>initializedメソッドの中でViewHelperのidフィールドとviewフィールドが設定される。</li>
<li>initializedメソッドの中でViewに対してイベントリスナが登録される。</li>
<li>Viewが表示対象となる。(ApplicationでaddChildされるとか)</li>
<li>イベントリスナに登録されたコールバックメソッドの中でViewHelperがViewLocatorに登録される。</li>
</ol>
<p>
これでようやくViewLocatorからViewHelperが取得できるようになるわけです。<br />
反対にViewが表示対象外(ApplicationでremoveChildされるとか)すると<br />
イベントリスナに登録されたコールバックメソッドの中でViewLocatorからViewHelperが削除されます。
</p>
<p>
はい、長々書きましたけど次に進みます。<br />
FlexでPopUpを実現するには、PopUpManagerというクラスの3つのスタティックメソッドを使います。<br />
シグネチャはこんな感じになってます。
</p>
<pre class="code">&nbsp;
<span class="kw3">public</span> <span class="kw3">static</span> <span class="kw2">function</span> addPopUp<span class="br0">&#40;</span>window:IFlexDisplayObject, parent:DisplayObject, modal:<span class="kw3">Boolean</span> = <span class="kw2">false</span>, childList:<span class="kw3">String</span> = <span class="kw2">null</span><span class="br0">&#41;</span>:<span class="kw3">void</span>
<span class="kw3">public</span> <span class="kw3">static</span> <span class="kw2">function</span> createPopUp<span class="br0">&#40;</span>parent:DisplayObject, className:<span class="kw2">Class</span>, modal:<span class="kw3">Boolean</span> = <span class="kw2">false</span>, childList:<span class="kw3">String</span> = <span class="kw2">null</span><span class="br0">&#41;</span>:IFlexDisplayObject
<span class="kw3">public</span> <span class="kw3">static</span> <span class="kw2">function</span> removePopUp<span class="br0">&#40;</span>popUp:IFlexDisplayObject<span class="br0">&#41;</span>:<span class="kw3">void</span>
&nbsp;</pre>
<p>
addPopUpかcreatePopUpでPopUpを表示して、removePopUpでPopUpを削除します。<br />
addPopUpとcreatePopUpの違いは、<br />
PopUpの対象をインスタンスで指定するか(addPopUp)<br />
クラス名で指定するか(createPopUp)の違いです。
</p>
<p>
何も考えずApplicationの中でPopUpするなら、こんなコードを書くわけです。
</p>
<pre class="code">&nbsp;
<span class="kw2">var</span> hogeView:HogeView = <span class="kw2">new</span> HogeView<span class="br0">&#40;</span><span class="br0">&#41;</span>;
PopUpManager.<span class="me1">addPopUp</span><span class="br0">&#40;</span>hogeView, <span class="kw3">this</span>, <span class="kw2">true</span><span class="br0">&#41;</span>;
&nbsp;</pre>
<p>
さて、ViewHelperを使うならどうしましょう。<br />
しれっと考えるとViewHelperの中にpopUpとかいうメソッドを作って<br />
それを呼びたいところですが、Viewのインスタンスが存在していないと<br />
ViewHelperのインスタンスも存在していません。<br />
ViewHelperがViewLocatorに登録されるのは<br />
Viewが表示対象になった後なので、こんなコードもアウトです。
</p>
<pre class="code">&nbsp;
<span class="kw2">var</span> hogeView:HogeView = <span class="kw2">new</span> HogeView<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="kw2">var</span> hogeViewHelper:HogeViewHelper = HogeViewHelper<span class="br0">&#40;</span>ViewLocator.<span class="me1">getInstance</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getViewHelper</span><span class="br0">&#40;</span><span class="st0">&quot;hogeViewHelper&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
hogeViewHelper.<span class="me1">popUp</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;
&nbsp;</pre>
<p>
Viewが表示対象になるまではViewLocatorからViewHelperを取得できないので<br />
PopUpしてからじゃないとViewHelperを使うことができない。ということです。<br />
付け加えておくと、PopUpするためにはPopUp対象となる親コンポーネントを指定する必要があるので<br />
親コンポーネントのViewHelperにViewを返すメソッドを定義しておいて、<br />
子コンポーネントのViewHelperから親コンポーネントのViewHelperを取得して<br />
親コンポーネントのViewHelperから親コンポーネントを取得してっていう<br />
何やらスパゲッティな予感漂う実装になっちゃいますね。
</p>
<p>
はい、ということでこんな感じの実装はどうでしょう。<br />
まず親コンポーネントのViewHelperにこんなメソッドを用意しておきます。
</p>
<pre class="code">&nbsp;
<span class="kw3">public</span> <span class="kw2">function</span> createPopUp<span class="br0">&#40;</span>className:<span class="kw2">Class</span>, modal:<span class="kw3">Boolean</span> = <span class="kw2">false</span>, childList:<span class="kw3">String</span> = <span class="kw2">null</span><span class="br0">&#41;</span>:IFlexDisplayObject <span class="br0">&#123;</span>
<span class="kw2">var</span> parent:DisplayObject = ;
<span class="kw1">return</span> PopUpManager.<span class="me1">createPopUp</span><span class="br0">&#40;</span>parent, className, modal<span class="br0">&#41;</span>;
<span class="br0">&#125;</span>
&nbsp;</pre>
<p>
で、PopUpする子コンポーネントのViewHelperにはこんなメソッドを。
</p>
<pre class="code">&nbsp;
<span class="kw3">public</span> <span class="kw2">function</span> <span class="kw3">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span>
<span class="kw2">var</span> window:IFlexDisplayObject = IFlexDisplayObject<span class="br0">&#40;</span><span class="kw3">this</span>.<span class="me1">view</span><span class="br0">&#41;</span>;
PopUpManager.<span class="me1">removePopUp</span><span class="br0">&#40;</span>window<span class="br0">&#41;</span>;
<span class="br0">&#125;</span>
&nbsp;</pre>
<p>
closeメソッドはこんな感じ親コンポーネントに実装することもできるでしょうけど
</p>
<pre class="code">&nbsp;
<span class="kw3">public</span> <span class="kw2">function</span> <span class="kw3">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span>
<span class="kw2">var</span> hogeViewHelper:HogeViewHelper = HogeViewHelper<span class="br0">&#40;</span>ViewLocator.<span class="me1">getInstance</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getViewHelper</span><span class="br0">&#40;</span><span class="st0">&quot;hogeViewHelper&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
<span class="kw2">var</span> window:IFlexDisplayObject = IFlexDisplayObject<span class="br0">&#40;</span>hogeViewHelper.<span class="me1">getView</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
PopUpManager.<span class="me1">removePopUp</span><span class="br0">&#40;</span>window<span class="br0">&#41;</span>;
<span class="br0">&#125;</span>
&nbsp;</pre>
<p>
これだとHogeViewHelper側にViewを返すメソッド(getView())が必要になるので<br />
ちょっといやな予感がしますね。<br />
ちなみに親コンポーネントのViewHelperのcreatePopUpは、<br />
addPopUpメソッドでもいける･･･と思います･･･試してませんけど＾＾；<br />
PopUpManagerのremovePopUpメソッドが実行された時には、<br />
REMOVEDなEventがdiapatchされますので、<br />
ViewLocatorからHogeViewHelperの登録は削除されます。<br />
つまり、後処理もちゃんとしてくれてるってことですね。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.azul.systems-noel.jp/2007/11/viewhelper%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%9fpopup%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6%e8%80%83%e3%81%88%e3%81%a6%e3%81%bf%e3%82%8b%e3%80%82/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
