<?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/"
		xmlns:xhtml="http://www.w3.org/1999/xhtml"
>

<channel>
	<title>TONPOOBLOG &#187; ActionScript3</title>
	<atom:link href="http://www.tonpoo.com/blog/category/flash/actionscript3/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.tonpoo.com/blog</link>
	<description>神宮前にあるWEB制作事務所「株式会社ブリコルール（bricoleur inc.）」に所属しているFlash（ActionScript）開発＆WEB制作プロジェクト「Tonpoo.com」のブログです。</description>
	<lastBuildDate>Wed, 01 Feb 2012 11:18:08 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tonpoo.com/blog/category/flash/actionscript3/feed/" />
		<item>
		<title>[briccolog]Brightcoveの動画再生ができるけどUIが効かない？</title>
		<link>http://www.tonpoo.com/blog/2011/09/briccolog-brightcove-ui/</link>
		<comments>http://www.tonpoo.com/blog/2011/09/briccolog-brightcove-ui/#comments</comments>
		<pubDate>Thu, 22 Sep 2011 03:49:46 +0000</pubDate>
		<dc:creator>tonpoo</dc:creator>
				<category><![CDATA[ActionScript3]]></category>
		<category><![CDATA[briccolog]]></category>

		<guid isPermaLink="false">http://www.tonpoo.com/blog/?p=1287</guid>
		<description><![CDATA[会社のブログに記事を書きました。Brightcoveの動画組み込みに関連して、動画再生ができるのに、ボリューム調整などのUIパーツをクリックすることができないという問題が発生したので、その解決方法などについて触れています。 briccolog &#187; Brightcoveの動画再生ができるけどUIが効かない？]]></description>
			<content:encoded><![CDATA[<p>会社のブログに記事を書きました。<strong>Brightcove</strong>の動画組み込みに関連して、<strong>動画再生ができるのに、ボリューム調整などのUIパーツをクリックすることができない</strong>という問題が発生したので、その解決方法などについて触れています。</p>
<p><strong><a href="http://blog.bricoleur.in/archives/1047" target="_blank">briccolog &raquo; Brightcoveの動画再生ができるけどUIが効かない？</a></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tonpoo.com/blog/2011/09/briccolog-brightcove-ui/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tonpoo.com/blog/2011/09/briccolog-brightcove-ui/" />
	</item>
		<item>
		<title>[briccolog]Brightcoveの動画をFlashコンテンツに読み込む</title>
		<link>http://www.tonpoo.com/blog/2011/07/briccolog-brightcove-flash/</link>
		<comments>http://www.tonpoo.com/blog/2011/07/briccolog-brightcove-flash/#comments</comments>
		<pubDate>Tue, 12 Jul 2011 03:47:15 +0000</pubDate>
		<dc:creator>tonpoo</dc:creator>
				<category><![CDATA[ActionScript3]]></category>
		<category><![CDATA[briccolog]]></category>

		<guid isPermaLink="false">http://www.tonpoo.com/blog/?p=1284</guid>
		<description><![CDATA[会社のブログに記事を書きました。Brightcoveさんの動画配信プラットフォームを使って、Flashコンテンツの中に指定の動画を読み込み・表示する方法についての記事です。 briccolog &#187; Brightcoveの動画をFlashコンテンツに読み込む]]></description>
			<content:encoded><![CDATA[<p>会社のブログに記事を書きました。<strong>Brightcove</strong>さんの動画配信プラットフォームを使って、Flashコンテンツの中に指定の動画を読み込み・表示する方法についての記事です。</p>
<p><strong><a href="http://blog.bricoleur.in/archives/970" target="_blank">briccolog &raquo; Brightcoveの動画をFlashコンテンツに読み込む</a></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tonpoo.com/blog/2011/07/briccolog-brightcove-flash/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tonpoo.com/blog/2011/07/briccolog-brightcove-flash/" />
	</item>
		<item>
		<title>TextLayoutFormatに挑戦：その１</title>
		<link>http://www.tonpoo.com/blog/2010/11/textlayoutformat/</link>
		<comments>http://www.tonpoo.com/blog/2010/11/textlayoutformat/#comments</comments>
		<pubDate>Wed, 17 Nov 2010 17:01:56 +0000</pubDate>
		<dc:creator>tonpoo</dc:creator>
				<category><![CDATA[ActionScript3]]></category>
		<category><![CDATA[FlashDevelop]]></category>

		<guid isPermaLink="false">http://www.tonpoo.com/blog/?p=1208</guid>
		<description><![CDATA[縦書きの文字列を表示する必要が出てきたので、TextLayoutFormat (TLF)について勉強してみます。 まだ制作用のPCにFlash CS5が入っていない（というか、CS4も入っていない。使ってるのはCS3です）ので、このままだとTLFが使えない。CS5はそのうち導入する予定だけど、取り急ぎFlashDevelop + Flex4SDKの組み合わせでなんとかならんか試してみます。 サンプルの入手 SourceForgeにAdobeがTLFのページを作っているので、そこからサンプルファイルをゲット。 Text Layout Framework / Dashboard 上記のページの上の方にある「Download examples.」というリンクをクリックして、サンプルファイル一式の詰まったzipファイルをダウンロード。解凍して出てくるのは「actionscript」「flex」という2つのフォルダ。「flex」の方はmxmlでの開発用なので、今回使うのは「actionscript」フォルダの方かな。 FlashDevelopで開く FlashDevelopを立ち上げ、上部メニューから「プロジェクト＞プロジェクトをインポート」を選択。ダウンロードした「actionscript」フォルダの中にある「TextLayout&#165;.actionScriptProperties」を選択。 すると無事にプロジェクトが開いた！やった～。 早速Ctrl+Enterでプロジェクトをテスト。あれ？エラーが出る？？ C:&#165;Program Files&#165;FlashDevelop&#165;Tools&#165;flexsdk&#165;frameworks&#165;flex-config.xml(53): Error: unable to open &#8216;libs/player/9.0/playerglobal.swc&#8217; む。FlashPlayerの書き出しバージョンの問題か？というわけで、FlashDevelopのプロジェクト設定の「書き出し」タブでプレーヤーのバージョンをFlashPlayer10に変更。 改めてプロジェクトをテスト。すると・・・おお、ビルド成功！！ swcの読み込み さてさていろいろいじってみるか。・・・と思ったものの、あれ？TLF関係のクラスのコード補完が出ない？調べてみると、どうやらTLF関連のswcファイルを設定しないとコード補完などが使えない様子。というわけで、swcファイルを読み込みます。 FlashDevelopのインストール時にFlexSDKも一緒にインストールした場合、TLF関連のswcであるtextLayout.swcは、以下の場所にあります。 C:&#165;Program Files&#165;FlashDevelop&#165;Tools&#165;flexsdk&#165;frameworks&#165;libs&#165;textLayout.swc というわけで、プロジェクト設定の「コンパイラー設定」タブを開きます。 で、「Advanced &#124; 高度な設定」の中にあるSWC Librariesの行をクリックし、右端に表示されるボタンをクリックして出てくる「文字列コレクション　エディタ」のウィンドウに上記のパスをペースト。 すると、TLF関係のクラスに色がついて、コード補完も使えるようになりました！ ちなみにこのswcファイル、先程のSourceForgeのサイトからも落とせる模様。 File Manager &#8211; SourceForge Downloads 上記のDownload textLayout_build.zipと書いてある箇所をクリックすると、swcやらasやらドキュメントやらまとめて入ってるzipファイルがゲットできます。Looking for the latest version?と書いてあるから、ひょっとするとSDK付属のものとバージョンが違うのかな？ 縦書きの表示 次に縦書き表示に挑戦。参考にしたのは下記のページ feb19.jp blog [...]]]></description>
			<content:encoded><![CDATA[<p>縦書きの文字列を表示する必要が出てきたので、<strong>TextLayoutFormat (TLF)</strong>について勉強してみます。</p>
<p><a href="http://www.tonpoo.com/blog/2010/11/textlayoutformat/ss10_genji/" rel="attachment wp-att-1211"><img src="http://www.tonpoo.com/blog/wp-content/uploads/2010/11/ss10_genji.jpg" alt="" title="ss10_genji" width="410" height="350" class="alignnone size-full wp-image-1211" /></a></p>
<p>
まだ制作用のPCにFlash CS5が入っていない（というか、CS4も入っていない。使ってるのはCS3です）ので、このままだとTLFが使えない。CS5はそのうち導入する予定だけど、取り急ぎ<strong>FlashDevelop + Flex4SDK</strong>の組み合わせでなんとかならんか試してみます。</p>
<p><span id="more-1208"></span></p>
<h2>サンプルの入手</h2>
<p>SourceForgeにAdobeがTLFのページを作っているので、そこからサンプルファイルをゲット。</p>
<p><strong><a href="http://sourceforge.net/adobe/tlf/home/" target="_blank">Text Layout Framework / Dashboard</a></strong><br />
<a href="http://www.tonpoo.com/blog/2010/11/textlayoutformat/ss1_sourceforge/" rel="attachment wp-att-1216"><img src="http://www.tonpoo.com/blog/wp-content/uploads/2010/11/ss1_sourceforge.jpg" alt="" title="ss1_sourceforge" width="452" height="452" class="alignnone size-full wp-image-1216" /></a></p>
<p>上記のページの上の方にある「<strong>Download examples.</strong>」というリンクをクリックして、サンプルファイル一式の詰まったzipファイルをダウンロード。解凍して出てくるのは「<strong>actionscript</strong>」「<strong>flex</strong>」という2つのフォルダ。「flex」の方はmxmlでの開発用なので、今回使うのは「actionscript」フォルダの方かな。</p>
<h2>FlashDevelopで開く</h2>
<p>FlashDevelopを立ち上げ、上部メニューから「<strong>プロジェクト＞プロジェクトをインポート</strong>」を選択。ダウンロードした「actionscript」フォルダの中にある「<strong>TextLayout&yen;.actionScriptProperties</strong>」を選択。</p>
<p><a href="http://www.tonpoo.com/blog/2010/11/textlayoutformat/ss2_openproject/" rel="attachment wp-att-1221"><img src="http://www.tonpoo.com/blog/wp-content/uploads/2010/11/ss2_openproject.jpg" alt="" title="ss2_openproject" width="500" height="347" class="alignnone size-full wp-image-1221" /></a></p>
<p>すると無事にプロジェクトが開いた！やった～。</p>
<p><a href="http://www.tonpoo.com/blog/2010/11/textlayoutformat/ss3_fd/" rel="attachment wp-att-1224"><img src="http://www.tonpoo.com/blog/wp-content/uploads/2010/11/ss3_fd.jpg" alt="" title="ss3_fd" width="600" height="439" class="alignnone size-full wp-image-1224" /></a></p>
<p>早速Ctrl+Enterでプロジェクトをテスト。あれ？エラーが出る？？</p>
<blockquote><p>C:&yen;Program Files&yen;FlashDevelop&yen;Tools&yen;flexsdk&yen;frameworks&yen;flex-config.xml(53): Error: unable to open &#8216;libs/player/9.0/playerglobal.swc&#8217;</p>
</blockquote>
<p>む。FlashPlayerの書き出しバージョンの問題か？というわけで、FlashDevelopの<strong>プロジェクト設定</strong>の「<strong>書き出し</strong>」タブでプレーヤーのバージョンを<strong>FlashPlayer10</strong>に変更。</p>
<p><a href="http://www.tonpoo.com/blog/2010/11/textlayoutformat/ss4_playersettings/" rel="attachment wp-att-1227"><img src="http://www.tonpoo.com/blog/wp-content/uploads/2010/11/ss4_playersettings.jpg" alt="" title="ss4_playersettings" width="478" height="513" class="alignnone size-full wp-image-1227" /></a></p>
<p>改めてプロジェクトをテスト。すると・・・おお、ビルド成功！！</p>
<p><a href="http://www.tonpoo.com/blog/2010/11/textlayoutformat/ss5_helloworld/" rel="attachment wp-att-1228"><img src="http://www.tonpoo.com/blog/wp-content/uploads/2010/11/ss5_helloworld.jpg" alt="" title="ss5_helloworld" width="500" height="401" class="alignnone size-full wp-image-1228" /></a></p>
<h2>swcの読み込み</h2>
<p>さてさていろいろいじってみるか。・・・と思ったものの、あれ？<strong>TLF関係のクラスのコード補完が出ない？</strong>調べてみると、どうやらTLF関連の<strong>swcファイル</strong>を設定しないとコード補完などが使えない様子。というわけで、swcファイルを読み込みます。</p>
<p>FlashDevelopのインストール時にFlexSDKも一緒にインストールした場合、TLF関連のswcである<strong>textLayout.swc</strong>は、以下の場所にあります。</p>
<p><code><strong>C:&yen;Program Files&yen;FlashDevelop&yen;Tools&yen;flexsdk&yen;frameworks&yen;libs&yen;textLayout.swc</strong></code></p>
<p>というわけで、プロジェクト設定の「<strong>コンパイラー設定</strong>」タブを開きます。</p>
<p><a href="http://www.tonpoo.com/blog/2010/11/textlayoutformat/ss6_swcsetting/" rel="attachment wp-att-1231"><img src="http://www.tonpoo.com/blog/wp-content/uploads/2010/11/ss6_swcsetting.jpg" alt="" title="ss6_swcsetting" width="478" height="513" class="alignnone size-full wp-image-1231" /></a></p>
<p>で、「<strong>Advanced | 高度な設定</strong>」の中にある<strong>SWC Libraries</strong>の行をクリックし、右端に表示されるボタンをクリックして出てくる「<strong>文字列コレクション　エディタ</strong>」のウィンドウに上記のパスをペースト。</p>
<p><a href="http://www.tonpoo.com/blog/2010/11/textlayoutformat/ss7_swcsetting_path/" rel="attachment wp-att-1232"><img src="http://www.tonpoo.com/blog/wp-content/uploads/2010/11/ss7_swcsetting_path.jpg" alt="" title="ss7_swcsetting_path" width="485" height="289" class="alignnone size-full wp-image-1232" /></a></p>
<p>すると、TLF関係のクラスに色がついて、<strong>コード補完も使えるようになりました！</strong></p>
<p><a href="http://www.tonpoo.com/blog/2010/11/textlayoutformat/ss8_fd/" rel="attachment wp-att-1233"><img src="http://www.tonpoo.com/blog/wp-content/uploads/2010/11/ss8_fd.jpg" alt="" title="ss8_fd" width="600" height="439" class="alignnone size-full wp-image-1233" /></a></p>
<p>ちなみにこのswcファイル、先程のSourceForgeのサイトからも落とせる模様。</p>
<p><strong><a href="http://sourceforge.net/downloads/tlf.adobe/" target="_blank">File Manager &#8211; SourceForge Downloads</a></strong><br />
<a href="http://www.tonpoo.com/blog/2010/11/textlayoutformat/ss9_swcdownload/" rel="attachment wp-att-1234"><img src="http://www.tonpoo.com/blog/wp-content/uploads/2010/11/ss9_swcdownload.jpg" alt="" title="ss9_swcdownload" width="514" height="382" class="alignnone size-full wp-image-1234" /></a></p>
<p>上記の<strong>Download textLayout_build.zip</strong>と書いてある箇所をクリックすると、swcやらasやらドキュメントやらまとめて入ってるzipファイルがゲットできます。Looking for the latest version?と書いてあるから、ひょっとするとSDK付属のものとバージョンが違うのかな？</p>
<h2>縦書きの表示</h2>
<p>次に縦書き表示に挑戦。参考にしたのは下記のページ</p>
<p><strong><a href="http://feb19.jp/blog/archives/000185.php" target="_blank">feb19.jp blog &#8211; Flash CS5 を予習　～Text Layout Framework (TLF) 編～</a></strong></p>
<p>先程のAdobeのサンプルに、feb19さんのコードを参考にしてコードを追加してみました。とりあえず縦書き表示させるために、TextFlow.directionプロパティとTextFlow.blockProgressionプロパティを設定。</p>
<p>
<pre class="brush: as3; title: ; notranslate">////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
//&lt;br /&gt;
//  ADOBE SYSTEMS INCORPORATED&lt;br /&gt;
//  Copyright 2008-2009 Adobe Systems Incorporated&lt;br /&gt;
//  All Rights Reserved.&lt;br /&gt;
//&lt;br /&gt;
//  NOTICE: Adobe permits you to use, modify, and distribute this file&lt;br /&gt;
//  in accordance with the terms of the license agreement accompanying it.&lt;br /&gt;
//&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////&lt;/p&gt;
&lt;p&gt;package {&lt;br /&gt;
	import flash.display.Sprite;&lt;br /&gt;
	import flash.text.engine.TextBaseline;&lt;br /&gt;
	import flashx.textLayout.formats.BlockProgression;&lt;/p&gt;
&lt;p&gt;	import flashx.textLayout.compose.StandardFlowComposer;&lt;br /&gt;
	import flashx.textLayout.container.ContainerController;&lt;br /&gt;
	import flashx.textLayout.elements.ParagraphElement;&lt;br /&gt;
	import flashx.textLayout.elements.SpanElement;&lt;br /&gt;
	import flashx.textLayout.elements.TextFlow;&lt;br /&gt;
	import flashx.textLayout.formats.Direction;&lt;/p&gt;
&lt;p&gt;	/** Simplest possible &amp;quot;Hello, World&amp;quot; text example */&lt;br /&gt;
	public class HelloWorld extends Sprite&lt;br /&gt;
	{&lt;br /&gt;
		public function HelloWorld()&lt;br /&gt;
		{&lt;br /&gt;
			var textFlow:TextFlow = new TextFlow();&lt;br /&gt;
			textFlow.locale = &amp;quot;ja&amp;quot;;&lt;br /&gt;
			textFlow.direction = Direction.LTR;&lt;br /&gt;
			textFlow.blockProgression  = BlockProgression.RL;&lt;/p&gt;
&lt;p&gt;			var p:ParagraphElement = new ParagraphElement();&lt;br /&gt;
			textFlow.addChild(p);&lt;/p&gt;
&lt;p&gt;			var span:SpanElement = new SpanElement();&lt;br /&gt;
			span.text = &amp;quot;当帝の外戚の大臣一派が極端な圧迫をして源氏に不愉快な目を見せることが多くなって行く。つとめて冷静にはしていても、このままで置けば今以上な禍いが起こって来るかもしれぬと源氏は思うようになった。&amp;quot;;&lt;br /&gt;
			span.fontSize = 24;&lt;br /&gt;
			p.addChild(span);&lt;/p&gt;
&lt;p&gt;			textFlow.flowComposer.addController(new ContainerController(this, this.stage.stageWidth, this.stage.stageHeight));&lt;br /&gt;
			textFlow.flowComposer.updateAllControllers();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}</pre>
</p>
<p>feb19さんのコードと比べると、一部のクラス名が変わっている模様（<strong>DisplayObjectContainerController</strong> → <strong>ContainerController</strong>とか）<br />
んでテストしてみたのがこちら。</p>
<p><a href="http://www.tonpoo.com/blog/2010/11/textlayoutformat/ss10_genji/" rel="attachment wp-att-1211"><img src="http://www.tonpoo.com/blog/wp-content/uploads/2010/11/ss10_genji.jpg" alt="" title="ss10_genji" width="410" height="350" class="alignnone size-full wp-image-1211" /></a></p>
<p>おお～。縦書きになってる！・・・<del>けど、<strong>文末の句読点の位置おかしくね？</strong>ということで、その後feb19さんのページを参考にさらにコードをいくつか追加みたんですが、まだ解決せず。今後の課題ですな。</del>とりあえず、縦書きが表示できたので今日のところは良しとします。<br />
追記：解決しました。<strong>textFlow.direction</strong>の値が<strong>Direction.RTL</strong>だったのを<strong>Direction.LTR</strong>にしたら直りました。</p>
<p>ちょっと戸惑ったのは<strong>TextFlow</strong>インスタンス。これ、DisplayObjectじゃないんですね。じゃあどうやってステージ（など）に表示させてるんだろう？と思ったら、feb19さんの記事に書いてありました。</p>
<blockquote><p>テキストを入れていったら、TextFlow.flowComposer.addController() で DisplayObejctContainer のツリーに参加させて、TextFlow.flowComposer.updateAllContainers() で内容を更新します。</p>
</blockquote>
<p>なるほどー。<strong>TextField</strong>とは全く扱い方が違うんですね。これは早く慣れねば。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tonpoo.com/blog/2010/11/textlayoutformat/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tonpoo.com/blog/2010/11/textlayoutformat/" />
	</item>
		<item>
		<title>IEでブラウザの「戻る」ボタンでページに戻ってきた際に、stageWidthとstageHeightの値が取得できない</title>
		<link>http://www.tonpoo.com/blog/2010/09/ie-stagewidth-stageheight/</link>
		<comments>http://www.tonpoo.com/blog/2010/09/ie-stagewidth-stageheight/#comments</comments>
		<pubDate>Fri, 03 Sep 2010 10:35:42 +0000</pubDate>
		<dc:creator>tonpoo</dc:creator>
				<category><![CDATA[ActionScript3]]></category>
		<category><![CDATA[SWFObject]]></category>
		<category><![CDATA[Troubles]]></category>

		<guid isPermaLink="false">http://www.tonpoo.com/blog/?p=1191</guid>
		<description><![CDATA[ああ・・・。IEよ、またお前なのね。コトのきっかけになったのはクライアントからの swfを埋め込んだhtmlページについて、サーバにアップしてIEでアクセスする分には問題ないが、ローカル環境でIEで開くとオブジェクトの位置が大幅にずれる。 ・・・というご指摘。調べてみると確かにそうなっていることを確認。さらに調べてみると、サーバにアップしたものについても IEでswfの埋めこんであるhtmlページ（A）を表示。 そのまま別のURLに遷移。 ブラウザの「戻る」ボタンで（A）に戻る。 するとswf内のオブジェクトの位置が大幅にずれる。 ・・・という現象を発見（汗）。「ななな、なんじゃこりゃあああああ！」と思ってさらにさらに調べてみると、下記の記事を発見。 stageWidth is zero in IE &#124; Blog &#124; Jodie O&#8217;Rourke IEでstage.stageWidthとstageHeightの値が０になる &#8211; フリーで活動するWeb屋のメモ帳 SWFObjectのDynamic Publishingを使うとIEとかでStage.stageWidthとheightが一瞬ゼロになるという都市伝説は実在した！ &#124; Katapad Design IEでstage.stageWidth及びstage.stageHeightが取得できない？ ・・・みなさん、苦労されてきたんですね。とりあえず、上記のみなさんの記事と今回の実際のファイルから、自分なりに発生条件や不具合の内容から解決方法までまとめてみました。 発生条件 SWFObjectを使っていること（「フリーで活躍するWeb屋のメモ帳」さんの記事では、SWFObjectを使っていなくても同じ現象に遭遇してるようなので、SWFObject非使用でも発生するのかもしれません）。 動的パブリッシュ（Dynamic Publishing）を使っている。 IEで表示（Katapad Designさんの記事では、Mac版のFirefoxでも発生するという記述があります）。 同一swfファイルの2回目以降の読み込み時に不具合が発生（私がローカル環境で検証した際には、初回の読み込み時から発生していました）。 発生する不具合 コンテンツの開始時にstage.stageWidthとstage.stageHeightの値がゼロになる。 この不具合が発生する原因そのものについてはよくわかりません。IEそのものかIE版FlashPlayerなどの潜在的なバグではないかと思いますが、それはMicrosoftなりAdobeなりが対応してくれるのを待つしか無い。 ポイントとしては、ドキュメントクラスのEvent.ADDED_TO_STAGEイベントが発生したタイミングでも、stageWidthとstageHeightの値がゼロだということ。さらに、Event.RESIZEで監視しても、初回のイベント発生時にはやはりstageWidthとstageHeightの値がゼロになりました。 対処法 「HAYASAKA修行ブログ」さんで述べられているように、解決策はいろいろあります。自分としては、「Event.ADDED_TO_STAGEの発生時にstageWidthとstageHeightの値がゼロだった場合、Event.ENTER_FRAMEでstageWidthとstageHeightの値を監視し、両方の値がゼロではなくなったら処理を継続する」という方法を採用し、汎用のユーティリティクラスメソッド（Utils.stageSizeWaiter）としてまとめてみました。 Utils.as 実際に利用する場合には、ドキュメントクラスで以下のように使います。 Main.as Katapad DesignさんのようにEventDispatcherにしたほうがスマートかなと思ったりもしてますが、こういう方法もあるってことで・・・。 ああ、疲れました（汗）。]]></description>
			<content:encoded><![CDATA[<p>ああ・・・。<strong>IEよ、またお前なのね。</strong>コトのきっかけになったのはクライアントからの</p>
<blockquote>
<p>swfを埋め込んだhtmlページについて、サーバにアップしてIEでアクセスする分には問題ないが、<strong>ローカル環境でIEで開くとオブジェクトの位置が大幅にずれる。</strong></p>
</blockquote>
<p>・・・というご指摘。調べてみると確かにそうなっていることを確認。さらに調べてみると、サーバにアップしたものについても</p>
<ol>
<li>IEでswfの埋めこんであるhtmlページ（A）を表示。</li>
<li>そのまま別のURLに遷移。</li>
<li><strong>ブラウザの「戻る」ボタンで（A）に戻る。</strong></li>
<li>するとswf内のオブジェクトの位置が大幅にずれる。</li>
</ol>
<p>・・・という現象を発見（汗）。<strong>「ななな、なんじゃこりゃあああああ！」</strong>と思ってさらにさらに調べてみると、下記の記事を発見。</p>
<ul>
<li><a href="http://jodieorourke.com/view.php?id=79&amp;blog=news" target="_blank"><strong>stageWidth is zero in IE | Blog | Jodie O&#8217;Rourke</strong></a></li>
<li><a href="http://blog.apri-cot.com/2010/03/iestagestagewidthstageheight.html" target="_blank"><strong>IEでstage.stageWidthとstageHeightの値が０になる &#8211; フリーで活動するWeb屋のメモ帳</strong></a></li>
<li><a href="http://katapad.com/wp/2009/05/19/stage_size_zero_issue_with_swfobject_on_ie/" target="_blank"><strong>SWFObjectのDynamic Publishingを使うとIEとかでStage.stageWidthとheightが一瞬ゼロになるという都市伝説は実在した！ | Katapad Design</strong></a></li>
<li><a href="http://blog.magical-remix.net/urame/archives/552" target="_blank"><strong>IEでstage.stageWidth及びstage.stageHeightが取得できない？</strong></a></li>
</ul>
<p>・・・みなさん、苦労されてきたんですね。とりあえず、上記のみなさんの記事と今回の実際のファイルから、自分なりに発生条件や不具合の内容から解決方法までまとめてみました。</p>
<p><span id="more-1191"></span></p>
<h2>発生条件</h2>
<ul>
<li><strong>SWFObjectを使っている</strong>こと（「フリーで活躍するWeb屋のメモ帳」さんの記事では、SWFObjectを使っていなくても同じ現象に遭遇してるようなので、SWFObject非使用でも発生するのかもしれません）。</li>
<li><strong>動的パブリッシュ（Dynamic Publishing）</strong>を使っている。</li>
<li><strong>IEで表示</strong>（Katapad Designさんの記事では、Mac版のFirefoxでも発生するという記述があります）。</li>
<li><strong>同一swfファイルの2回目以降の読み込み時</strong>に不具合が発生（私がローカル環境で検証した際には、初回の読み込み時から発生していました）。</li>
</ul>
<h2>発生する不具合</h2>
<h3><strong>コンテンツの開始時にstage.stageWidthとstage.stageHeightの値がゼロになる。</strong></h3>
<p>この不具合が発生する原因そのものについてはよくわかりません。IEそのものかIE版FlashPlayerなどの潜在的なバグではないかと思いますが、それはMicrosoftなりAdobeなりが対応してくれるのを待つしか無い。</p>
<p>ポイントとしては、ドキュメントクラスの<strong>Event.ADDED_TO_STAGE</strong>イベントが発生したタイミングでも、<strong>stageWidthとstageHeightの値がゼロ</strong>だということ。さらに、<strong>Event.RESIZE</strong>で監視しても、<strong>初回のイベント発生時にはやはりstageWidthとstageHeightの値がゼロ</strong>になりました。</p>
<h2>対処法</h2>
<p>「HAYASAKA修行ブログ」さんで述べられているように、解決策はいろいろあります。自分としては、「<strong>Event.ADDED_TO_STAGEの発生時にstageWidthとstageHeightの値がゼロだった場合、Event.ENTER_FRAMEでstageWidthとstageHeightの値を監視し、両方の値がゼロではなくなったら処理を継続する</strong>」という方法を採用し、汎用のユーティリティクラスメソッド（Utils.stageSizeWaiter）としてまとめてみました。</p>
<h3>Utils.as</h3>
<pre class="brush: as3; title: ; notranslate">package {
	import flash.display.Stage;
	import flash.events.Event;

	public class Utils {
		private static var _nextFunction:Function;	//ステージサイズ取得後に実行する継続処理
		private static var _targetStage:Stage;	//ステージへの参照
		public static function stageSizeWaiter(targetStage:Stage, nextFunction:Function):void {
			if ((targetStage.stageWidth * targetStage.stageHeight) == 0) {
				//stageWidthとstageHeightの値がゼロの場合はENTER_FRAMEで監視
				_nextFunction = nextFunction;
				_targetStage = targetStage;
				targetStage.addEventListener(Event.RESIZE, stageSizeListener, false, 0, true);
			}else {
				//stageWidthとstageHeightの値が取得済みの場合はそのまま継続処理を続行
				nextFunction();
			}
		}
		private static function stageSizeListener(e:Event = null):void {
			if ((_targetStage.stageWidth * _targetStage.stageHeight) != 0) {
				_nextFunction();	//継続処理を実行
				_targetStage.removeEventListener(Event.RESIZE, stageSizeListener);	//不要になったイベントリスナを削除
				_nextFunction = null;	//不要な参照を破棄
				_targetStage = null;	//不要な参照を破棄
			}
		}
	}
}</pre>
<p>実際に利用する場合には、ドキュメントクラスで以下のように使います。</p>
<h3>Main.as</h3>
<pre class="brush: as3; title: ; notranslate">package  {
	import flash.events.Event;
	import Utils;

	public final class Main extends Sprite{
		public function Main() {
			this.addEventListener(Event.ADDED_TO_STAGE, onAddedToStage, false, 0, true);
		}
		private function onAddedToStage(e:Event):void {
			this.removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
			/*
			* ADDED_TO_STAGEイベントが発生したら、ステージへの参照と
			* ステージサイズ確定後に実行するファンクションを引数に
			* して、Utils.stageSizeWaiterを実行。
			*/
			Utils.stageSizeWaiter(this.stage, onStageSizeObtained);
		}
		private function onStageSizeObtained():void {
			/*
			* このファンクションの実行時には確実にstageWidthと
			* stageHeightの値が確定している。
			*/
			sw = this.stage.stageWidth;
			sh = this.stage.stageHeight;
		}
	}
}</pre>
<p>Katapad DesignさんのようにEventDispatcherにしたほうがスマートかなと思ったりもしてますが、こういう方法もあるってことで・・・。</p>
<p>ああ、疲れました（汗）。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tonpoo.com/blog/2010/09/ie-stagewidth-stageheight/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tonpoo.com/blog/2010/09/ie-stagewidth-stageheight/" />
	</item>
		<item>
		<title>IE+SWFのSSL領域との通信時に発生するトラブルについて</title>
		<link>http://www.tonpoo.com/blog/2010/07/swf_ssl_ie_error/</link>
		<comments>http://www.tonpoo.com/blog/2010/07/swf_ssl_ie_error/#comments</comments>
		<pubDate>Thu, 29 Jul 2010 07:22:45 +0000</pubDate>
		<dc:creator>tonpoo</dc:creator>
				<category><![CDATA[ActionScript3]]></category>
		<category><![CDATA[Troubles]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://www.tonpoo.com/blog/?p=1186</guid>
		<description><![CDATA[とある案件でちょっとハマったので備忘録がわりにメモ。まず今回のファイル構成は以下のとおり。 処理の流れとしては、 （1）main.swfからSSLサーバのcrossdomain.xmlを読み込み。 （2）main.swfからdata_output.phpにアクセスし、読み込む画像のURL一覧を記載したXMLデータを取得。 （3）（2）で取得したXMLデータをもとに、個別の画像を読み込み。 ・・・という、割とよくあると言えばよくある構成です。ポイントはやっぱりSSL領域とのクロスドメイン通信があること。ドメイン名が同じでも、非SSLのサーバとSSLサーバとでは別ドメインと判断されるんですよね。 で、一通り作ってサーバにアップしたところ、FirefoxやChromeやSafariでは動くのになぜかIEだけ画像が表示されない！crossdomain.xmlはきちんと記述できてるし、XMLデータを非SSL側のサーバに設置すればIEでも動くので、どこで止まってるんだろうと調べたところ、（2）のXMLデータ取得のところでポシャってることが判明。で、Google先生に尋ねて出てきたのが以下の記事： クロスドメインポリシーファイル(crossdomain.xml)設定について &#124; さわいじり Internet Explorer が SSL 経由によるファイルのダウンロードで &#8220;No-Cache&#8221; ヘッダーを処理できない FLASH + SSL +WinIE（FLASH-JP.COM &#8211; フォーラム） tyoro.exe: no-cacheとSSLとIEとファイルダウンロード つまりこれはIEに起因する問題で、非SSL領域のSWF（に限らず、Ajax通信などでも同じでしょう）からSSL領域のデータをリクエストした際、サーバからのレスポンスヘッダにPragma: no-cacheが含まれているとIE側で正しく処理ができないんだそうです。なんとご無体な・・・。 FirefoxでHttpFox使ってdata_output.phpのレスポンスヘッダを調べてみたところ、あったあったありましたよPragma:no-cacheが。ということで、php側に対応を依頼しました。 しかしこれ随分と前から存在する問題のようですけど、IE側では修正（変更？）する予定は無いんでしょうか・・・。]]></description>
			<content:encoded><![CDATA[<p>とある案件でちょっとハマったので備忘録がわりにメモ。まず今回のファイル構成は以下のとおり。</p>
<p><a href="http://www.tonpoo.com/blog/wp-content/uploads/2010/07/fig.jpg"><img src="http://www.tonpoo.com/blog/wp-content/uploads/2010/07/fig_thumb.jpg" border="0" alt="fig" title="fig" width="500" height="447" style="display: inline; border: 0px;" /></a></p>
<p>処理の流れとしては、</p>
<p>（1）main.swfからSSLサーバのcrossdomain.xmlを読み込み。<br />
（2）main.swfからdata_output.phpにアクセスし、読み込む画像のURL一覧を記載したXMLデータを取得。<br />
（3）（2）で取得したXMLデータをもとに、個別の画像を読み込み。</p>
<p>・・・という、割とよくあると言えばよくある構成です。ポイントはやっぱり<strong>SSL領域とのクロスドメイン通信</strong>があること。ドメイン名が同じでも、非SSLのサーバとSSLサーバとでは別ドメインと判断されるんですよね。</p>
<p>で、一通り作ってサーバにアップしたところ、FirefoxやChromeやSafariでは動くのに<strong>なぜかIEだけ画像が表示されない！</strong>crossdomain.xmlはきちんと記述できてるし、XMLデータを非SSL側のサーバに設置すればIEでも動くので、どこで止まってるんだろうと調べたところ、（2）のXMLデータ取得のところでポシャってることが判明。で、Google先生に尋ねて出てきたのが以下の記事：</p>
<ul>
<li><strong><a href="http://www.sawaijiri.com/2009/04/01/no66/" target="_blank">クロスドメインポリシーファイル(crossdomain.xml)設定について | さわいじり</a></strong></li>
<li><strong><a href="http://support.microsoft.com/default.aspx?scid=http://www.microsoft.com/japan/support/kb/articles/323/3/08.asp" target="_blank">Internet Explorer が SSL 経由によるファイルのダウンロードで &#8220;No-Cache&#8221; ヘッダーを処理できない</a></strong></li>
<li><strong><a href="http://www.flash-jp.com/modules/newbb/viewtopic.php?topic_id=181&amp;forum=7" target="_blank">FLASH + SSL +WinIE（FLASH-JP.COM &#8211; フォーラム）</a></strong></li>
<li><strong><a href="http://tyoro.orz.ne.jp/exe/2010/01/nocachesslie.html" target="_blank">tyoro.exe: no-cacheとSSLとIEとファイルダウンロード</a></strong></li>
</ul>
<p>つまりこれはIEに起因する問題で、非SSL領域のSWF（に限らず、Ajax通信などでも同じでしょう）からSSL領域のデータをリクエストした際、<strong>サーバからのレスポンスヘッダにPragma: no-cacheが含まれているとIE側で正しく処理ができない</strong>んだそうです。なんとご無体な・・・。</p>
<p>Firefoxで<strong><a href="https://addons.mozilla.org/ja/firefox/addon/6647/" target="_blank">HttpFox</a></strong>使ってdata_output.phpのレスポンスヘッダを調べてみたところ、あったあったありましたよ<strong>Pragma:no-cache</strong>が。ということで、php側に対応を依頼しました。</p>
<p>しかしこれ随分と前から存在する問題のようですけど、IE側では修正（変更？）する予定は無いんでしょうか・・・。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tonpoo.com/blog/2010/07/swf_ssl_ie_error/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tonpoo.com/blog/2010/07/swf_ssl_ie_error/" />
	</item>
		<item>
		<title>Error calling method on NPObject</title>
		<link>http://www.tonpoo.com/blog/2010/07/error-calling-method-on-npobject/</link>
		<comments>http://www.tonpoo.com/blog/2010/07/error-calling-method-on-npobject/#comments</comments>
		<pubDate>Fri, 02 Jul 2010 02:37:05 +0000</pubDate>
		<dc:creator>tonpoo</dc:creator>
				<category><![CDATA[ActionScript3]]></category>
		<category><![CDATA[SWFObject]]></category>
		<category><![CDATA[SWFWheel]]></category>
		<category><![CDATA[Troubles]]></category>

		<guid isPermaLink="false">http://www.tonpoo.com/blog/?p=1166</guid>
		<description><![CDATA[製作中のとあるフルFlashサイト。ブラウザで普通に確認してる分には問題なく動作していたため全く気がつかなかったが、Firefoxのエラーコンソールを開いてみると「Error calling method on NPObject」というJavaScriptエラーが頻発！「なんじゃこりゃ」ということで早速調べてみたところ、原因がわかりました。 まず、今回のサイトは以下のような条件が揃っていました。 SWFファイルのドメインと、そのSWFファイルを埋め込んで表示するHTMLファイルのドメインが異なっている（SWFは http://www.hogehoge.home/movie.swf にあり、HTMLファイルは http://user.hogehoge.home/index.html にある、というような感じ） マウスホイール対応のためにSWFWheelを使用 SWFファイルの埋め込みにSWFObjectを使用 そしてSWFWheelのサイトを見ていたところ、以下のような注意書きが： その他 外部ドメインからの読み込み SWFWheelを使ったswfファイルを、外部ドメインから読み込む場合、HTML側とActionScript側の両方でExternalInterfaceの動作を明示的に許可する必要があります。 HTML側にて、paramタグ及びembedタグでallowScriptAccessの値にalwaysを指定する。 ActionScript側にて、Security.allowDomain等で許可するドメインを指定する。 ビンゴですね。1.の方は対応済みだったんですが、2.の方が未対応でした。ところで今回のサイト、サブドメインの数が一定でなく、運用後に随時追加される可能性があります。ので、ワイルドカードを使って以下のようなコードを追加。 結果は・・・？ダメでした。まだエラーが出ます。うーん、もしかしてワイルドカードでサブドメインを指定するのは無理なのか？ということで、今度は以下のコードで実験。 成功！エラーがでなくなりました。全ドメインを対象にしてしまうのは危険といえば危険ですが、現時点ではこれが最善の策でしょうか。]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.tonpoo.com/blog/wp-content/uploads/2010/07/ss.jpg" border="0" alt="ss" title="ss" width="494" height="307" style="display: inline; border: 0px;" /></p>
<p>製作中のとあるフルFlashサイト。ブラウザで普通に確認してる分には問題なく動作していたため全く気がつかなかったが、Firefoxのエラーコンソールを開いてみると「<strong><span style="color: #ff0000;">Error calling method on NPObject</span></strong>」というJavaScriptエラーが頻発！「<strong>なんじゃこりゃ</strong>」ということで早速調べてみたところ、原因がわかりました。</p>
<p>まず、今回のサイトは以下のような条件が揃っていました。</p>
<ul>
<li>SWFファイルのドメインと、そのSWFファイルを埋め込んで表示するHTMLファイルの<strong>ドメインが異なっている</strong>（SWFは http://www.hogehoge.home/movie.swf にあり、HTMLファイルは http://user.hogehoge.home/index.html にある、というような感じ）</li>
<li>マウスホイール対応のために<strong><a href="http://www.libspark.org/wiki/SWFWheel" target="_blank">SWFWheel</a></strong>を使用</li>
<li>SWFファイルの埋め込みに<strong><a href="http://code.google.com/p/swfobject/" target="_blank">SWFObject</a></strong>を使用</li>
</ul>
<p>そしてSWFWheelのサイトを見ていたところ、以下のような<a href="http://www.libspark.org/wiki/SWFWheel#%E5%A4%96%E9%83%A8%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%8B%E3%82%89%E3%81%AE%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF" target="_blank">注意書き</a>が：</p>
<blockquote>
<h2>その他</h2>
<h3 id="外部ドメインからの読み込み">外部ドメインからの読み込み</h3>
<p>SWFWheelを使ったswfファイルを、外部ドメインから読み込む場合、HTML側とActionScript側の両方でExternalInterfaceの動作を明示的に許可する必要があります。</p>
<ol>
<li>HTML側にて、paramタグ及びembedタグでallowScriptAccessの値にalwaysを指定する。</li>
<li>ActionScript側にて、Security.allowDomain等で許可するドメインを指定する。</li>
</ol>
</blockquote>
<p><strong>ビンゴ</strong>ですね。1.の方は対応済みだったんですが、2.の方が未対応でした。ところで今回のサイト、サブドメインの数が一定でなく、運用後に随時追加される可能性があります。ので、ワイルドカードを使って以下のようなコードを追加。</p>
<pre class="brush: as3; title: ; notranslate">Security.allowDomain(&quot;*.hogehoge.home&quot;);</pre>
<p>結果は・・・？ダメでした。まだエラーが出ます。うーん、もしかして<strong>ワイルドカードでサブドメインを指定するのは無理</strong>なのか？ということで、今度は以下のコードで実験。</p>
<pre class="brush: as3; title: ; notranslate">Security.allowDomain(&quot;*&quot;);</pre>
<p>成功！<strong>エラーがでなくなりました</strong>。全ドメインを対象にしてしまうのは危険といえば危険ですが、現時点ではこれが最善の策でしょうか。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tonpoo.com/blog/2010/07/error-calling-method-on-npobject/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tonpoo.com/blog/2010/07/error-calling-method-on-npobject/" />
	</item>
		<item>
		<title>Flash Communication Server：プロキシサーバに関する問題</title>
		<link>http://www.tonpoo.com/blog/2010/06/proxyservertrouble/</link>
		<comments>http://www.tonpoo.com/blog/2010/06/proxyservertrouble/#comments</comments>
		<pubDate>Thu, 24 Jun 2010 04:22:04 +0000</pubDate>
		<dc:creator>tonpoo</dc:creator>
				<category><![CDATA[ActionScript2]]></category>
		<category><![CDATA[ActionScript3]]></category>
		<category><![CDATA[Translation]]></category>

		<guid isPermaLink="false">http://www.tonpoo.com/blog/?p=1137</guid>
		<description><![CDATA[HTTPトンネリングの件に関連して、FCS関連でプロキシサーバを経由した場合の接続方法についての下記の記事も簡単に和訳しました。 Macromedia &#8211; Developer Center : Tunneling Macromedia Flash Communications through Firewalls and Proxy Servers. Page 3 例によって文書自体が古い上に意訳・適当な訳文ですが、HTTPトンネリングと同じく何かの参考までに。 ※注：HTTPトンネリングの記事同様、こちらもリンク先が無くなってしまいました。アドビサイトにどこかに原文残ってないのかな・・・。 プロキシサーバに関する問題 内部のネットワークとインターネットとの中継役としてプロキシサーバを利用することで、組織のネットワーク環境をより安全にすることができる。WEBプロキシサーバというのは通常、ネットワークの通信料を削減するためのキャッシングサーバとして利用される。とはいえ、プロキシサーバの使い道は他にもある。 ネットワークレイヤーのファイヤーウォールとプロキシサーバを組み合わせることで、WEBへのアクセス自体は確保した上で、組織のネットワーク内にあるワークステーションから外部のネットワークに対して直接アクセスする必要がなくなる。ブラウザはリモートのサーバに対してWEBページのデータを直接要求するのではなく、プロキシサーバに対して要求しなければならない。ページのデータがキャッシュされていなかった場合には、プロキシサーバがリモートのサーバに対してリクエストを行ない、返ってきたデータをブラウザに戻すことになる。プロキシサーバが中継役として存在する場合、ファイヤーウォールは基本的にネットワーク内部から外部に対して直接送出されるリクエストは全てブロックするように設定されていることが多い―――たとえそれが80番ポートに対するものであったとしても。プロキシサーバだけが80番ポートを通じて外側の世界との接続を許されているのだ（図8を参照）。 HTTPトンネリングを使わない場合、プロキシサーバの内側にいて、インターネットへの直接接続が許可されていない環境にあるユーザーはコミュニケーションサーバへの接続ができない。HTTPトンネリングを使えばできるようになることがしばしばある。プロキシサーバからしてみれば、RTMPTを使った接続要求というのは通常のHTTPリクエストと同様に捉えられる。コミュニケーションサーバからのレスポンスもHTTPレスポンスと同様に判断される。このため、プロキシサーバはRTMPTリクエストの送出もコミュニケーションサーバからのデータ受信についても対応できるはずである。ところが、HTTPトンネリングがうまくいくかどうかは保証されていないのだ。プロキシサーバにはWEBページをキャッシュする中継役以上の機能がある。それは、外部のネットワークリソースに対するアクセスの制御ということだ。例えば、プロキシの管理者はアクセス禁止サイトのリストを作成し、プロキシサーバ内の全ユーザーに対して、それらのサイトへのアクセスを拒否することができる。プロキシサーバの中には、さらに詳細にデータの調査やフィルタリングが可能なものもある。例えば、特定のコンテンツや、text/thmlのようなMIMEタイプのみを許可することもできる。WEBサーバがWEBページのデータをブラウザに対して返す際、HTTPヘッダにはContentTypeというデータが含まれる。WEBサーバがWEBページのデータを送出する場合のHTTPヘッダの書式は以下のようになる： HTTP/1.1 200 OK Server: Netscape-Enterprise/6.0 Date: Sat, 24 May 2003 01:09:43 GMT Content-type: text/html Etag: "c96066c3-1-0-1e8" Last-modified: Tue, 25 Jun 1996 19:11:18 GMT Content-length: 488 Accept-ranges: bytes また、画像データを送出する場合のHTTPヘッダの書式は以下のようになる： HTTP/1.1 200 OK Server: [...]]]></description>
			<content:encoded><![CDATA[<p><strong><a href="http://www.tonpoo.com/blog/2010/06/httptunnelingprotocol/">HTTPトンネリングの件</a></strong>に関連して、FCS関連で<strong>プロキシサーバを経由した場合の接続方法</strong>についての下記の記事も簡単に和訳しました。</p>
<p><strong><a href="http://www.adobe.com/devnet/flashcom/articles/firewalls_proxy03.html" target="_blank">Macromedia &#8211; Developer Center : Tunneling Macromedia Flash Communications through Firewalls and Proxy Servers. Page 3</a></strong></p>
<p>例によって文書自体が古い上に意訳・適当な訳文ですが、HTTPトンネリングと同じく何かの参考までに。</p>
<p><span style="color: #ff0000;">※注：HTTPトンネリングの記事同様、こちらもリンク先が無くなってしまいました。アドビサイトにどこかに原文残ってないのかな・・・。</span></p>
<hr />
<h2>プロキシサーバに関する問題</h2>
<p>内部のネットワークとインターネットとの中継役としてプロキシサーバを利用することで、組織のネットワーク環境をより安全にすることができる。WEBプロキシサーバというのは通常、ネットワークの通信料を削減するためのキャッシングサーバとして利用される。とはいえ、プロキシサーバの使い道は他にもある。</p>
<p>ネットワークレイヤーのファイヤーウォールとプロキシサーバを組み合わせることで、WEBへのアクセス自体は確保した上で、組織のネットワーク内にあるワークステーションから外部のネットワークに対して直接アクセスする必要がなくなる。ブラウザはリモートのサーバに対してWEBページのデータを直接要求するのではなく、プロキシサーバに対して要求しなければならない。ページのデータがキャッシュされていなかった場合には、プロキシサーバがリモートのサーバに対してリクエストを行ない、返ってきたデータをブラウザに戻すことになる。プロキシサーバが中継役として存在する場合、ファイヤーウォールは基本的にネットワーク内部から外部に対して直接送出されるリクエストは全てブロックするように設定されていることが多い―――たとえそれが80番ポートに対するものであったとしても。プロキシサーバだけが80番ポートを通じて外側の世界との接続を許されているのだ（図8を参照）。</p>
<p>HTTPトンネリングを使わない場合、プロキシサーバの内側にいて、インターネットへの直接接続が許可されていない環境にあるユーザーはコミュニケーションサーバへの接続ができない。HTTPトンネリングを使えばできるようになることがしばしばある。プロキシサーバからしてみれば、RTMPTを使った接続要求というのは通常のHTTPリクエストと同様に捉えられる。コミュニケーションサーバからのレスポンスもHTTPレスポンスと同様に判断される。このため、プロキシサーバはRTMPTリクエストの送出もコミュニケーションサーバからのデータ受信についても対応できるはずである。ところが、HTTPトンネリングがうまくいくかどうかは保証されていないのだ。プロキシサーバにはWEBページをキャッシュする中継役以上の機能がある。それは、外部のネットワークリソースに対するアクセスの制御ということだ。例えば、プロキシの管理者はアクセス禁止サイトのリストを作成し、プロキシサーバ内の全ユーザーに対して、それらのサイトへのアクセスを拒否することができる。プロキシサーバの中には、さらに詳細にデータの調査やフィルタリングが可能なものもある。例えば、特定のコンテンツや、text/thmlのようなMIMEタイプのみを許可することもできる。WEBサーバがWEBページのデータをブラウザに対して返す際、HTTPヘッダにはContentTypeというデータが含まれる。WEBサーバがWEBページのデータを送出する場合のHTTPヘッダの書式は以下のようになる：</p>
<blockquote>
<pre>HTTP/1.1 200 OK
Server: Netscape-Enterprise/6.0
Date: Sat, 24 May 2003 01:09:43 GMT
<strong>Content-type: text/html</strong>
Etag: "c96066c3-1-0-1e8"
Last-modified: Tue, 25 Jun 1996 19:11:18 GMT
Content-length: 488
Accept-ranges: bytes</pre>
</blockquote>
<p>また、画像データを送出する場合のHTTPヘッダの書式は以下のようになる：</p>
<blockquote>
<pre>HTTP/1.1 200 OK
Server: Netscape-Enterprise/6.0
Date: Sat, 24 May 2003 01:51:17 GMT
<strong>Content-type: image/gif</strong>
Etag: "782311ca-126-0-f1ae"
Last-modified: Mon, 06 May 2002 21:10:38 GMT
Content-length: 61870
Accept-ranges: bytes</pre>
</blockquote>
<p>Macromedia Flash Communication Serverが返すデータはテキストデータではないが、HTTPヘッダにはContent-typeの記述が含まれない。そして、Content-typeが記述されていない場合にはtext/htmlと判断されてしまう。このため、RTMPTのトラフィックであっても、全てのプロキシサーバを通過できるという保証は無いのである。プロキシサーバとアプリケーションレイヤのファイヤーウォールというものが、システムアドミニストレータの設定した幅広いバリエーションのルールに従ってコンテンツのフィルタリングを行うように作られているということを考慮すれば、これはおかしなことではない。ITセキュリティの部署が正規のHTML文書といくつかの画像フォーマット（image/GIFなど）のみを許可すると決定したならば、それを実現するための精巧なツールが開発されるということだ。もしRTMPT接続さえも通さないプロキシサーバの場合は、組織のファイヤーウォール担当の管理者に連絡を取り、プロキシサーバの例外設定が可能かどうか確認するといい。</p>
<p><strong><img src="http://www.tonpoo.com/blog/wp-content/uploads/2010/06/fig08.gif" border="0" alt="fig08" title="fig08" width="360" height="150" style="display: inline; border: 0px;" /> </strong></p>
<p>図8.プロキシサーバとファイヤーウォール</p>
<p><strong>注：</strong>各端末（Workstation）はインターネットに直接接続することはできず、必ずプロキシサーバを通してリソース要求を行うことになる。プロキシサーバはインターネットからリソースを取得し、それを各端末に転送する。各端末がファイヤーウォールを越えて外部のシステムにアクセスすることは決してない。</p>
<h3>一度に複数のポートを利用する</h3>
<p>Macromediaは先日、Flash Communication Server バージョン1.5のリリースとともに、Flash Communication Serverコンポーネントのアップデート版をリリースした。このアップデートの目玉のひとつが、Simple Connectコンポーネント内部に新規に追加されたコードである。このアップデートによって、デフォルトのRTMPポート（1935）経由で到達できないサーバへの接続時間を短縮するための機能が追加された。Simple Connectコンポーネントのアプリケーションディレクトリのパラメーターに「rtmp」が指定されていて、かつポート番号が指定されていない場合、Simple Connectコンポーネントは次のように動作する：</p>
<ol>
<li>NetConnectionオブジェクトを生成し、指定されたアドレスに対して、1935番ポートを使って通常の接続を試みる。</li>
<li>2つめのNetConnectionオブジェクトを生成し、250ミリ秒待機した後、サーバに対して80番ポートを使ったRTMPT接続を試みる。</li>
<li>先に接続が成功した方を受け入れ、もう片方のNetConnectionオブジェクトは接続を閉じてから破棄する。</li>
</ol>
<p>厳密に言えばこのようなやり方は必要ない。FlashPlayerはデフォルトでまず1935番ポートを使ったRTMP接続を試み、その後443番ポート、80番ポートを試みる。その後、80番ポートを使ったRTMPT接続を試みるからだ。ただしこれらの試みは時間がかかる。はじめのRTMP接続が失敗した場合、250ミリ秒後に80番ポートを使ったRMTPT接続を試みることで、接続プロセスにかかる時間は劇的に短縮されるのだ。このコンポーネントの作りを理解するため、FCSimpleConnectClassの<code>actualConnect()</code>メソッドを見てみよう。すべての人がSimple Connectコンポーネントを使うわけではないので、以下に示すコードは本来のコードを少々編集したものになっている。ただし行っている処理はほぼ同じだ。筆者はこのコードをメインのタイムラインに記述したが、よりオブジェクト指向的なアプローチで書き換えることも可能である。</p>
<pre class="brush: as3; title: ; notranslate">//接続に成功するとonConnectファンクションが実行される
function onConnect(nc) {
	_global.main_nc = nc;// グローバル変数に接続成功済みのNetConnectionオブジェクトを記録
	// 確認のためURIをtraceし、使用中のプロトコルを確認
	trace(&quot;onConnect&gt; &quot;+nc.uri);
	// 接続に成功したNetConnectionオブジェクトのためのonStatusハンドラを生成
	main_nc.onStatus = function(info) {
		//ここに各種のイベントをハンドルするためのコードを記述
		//以下のコードはinfoオブジェクトの内容を出力するもの
		trace(&quot;----main_nc.onStatus----&quot;);
		for (var p in info) {
			trace(p+&quot;: &quot;+info[p]);
		}
	};
	//あとは他のコンポーネントに接続したりプログラムを初期化するなど・・・
}

//接続に失敗するとonConnectFailedファンクションが実行される
function onConnectFailed(info) {
	//infoオブジェクトを検証し、接続失敗の原因についてレポートする
	//以下のコードは単にinfoオブジェクトの内容をtraceしているだけなので、
	//各自でエラーハンドリングコードを書き換えること
	trace(&quot;----onConnectFailed----&quot;);
	//infoオブジェクトの全プロパティの分ループ処理
	for (var p in info) {
		trace(p+&quot;: &quot;+info[p]);
		// If the application rejects the connection and passes back
		// and application object loop through all its properties too.
		if (p == &quot;application&quot;) {
			var appObj = info.application;
			for (var q in appObj) {
				trace(&quot;   &quot;+q+&quot;: &quot;+appObj[q]);
			}
		}
	}
}

//RTMP接続用のNetConnectionオブジェクトを生成
rtmp_nc = new NetConnection();
//こちらの接続が先に成功した場合に、rtmpt_ncオブジェクトを破棄するための
//onStatusハンドラを生成
rtmp_nc.onStatus = function(info) {
	this.pending = false;
	if (info.code == &quot;NetConnection.Connect.Success&quot;) {
		if (rtmpt_nc.pending) {
			rtmpt_nc.onStatus = null;
			rtmpt_nc.close();
			rtmpt_nc = null;
			clearInterval(connectionID);
		}
		onConnect(this);
	} else if (!rtmpt_nc.pending) {
		onConnectFailed(info);
	}
};

//RTMPT接続用のNetConnectionオブジェクトを生成
rtmpt_nc = new NetConnection();
//こちらの接続が先に成功した場合に、rtmp_ncオブジェクトを破棄するための
//onStatusハンドラを生成
rtmpt_nc.onStatus = function(info) {
	this.pending = false;
	if (info.code == &quot;NetConnection.Connect.Success&quot;) {
		if (rtmp_nc.pending) {
			rtmp_nc.onStatus = null;
			rtmp_nc.close();
			rtmp_nc = null;
		}
		onConnect(this);
	} else if (!rtmp_nc.pending) {
		onConnectFailed(info);
	}
};

//どちらのNetConnectionオブジェクトについてもペンディングフラグを立てておく
rtmp_nc.pending = true;
rtmpt_nc.pending = true;

//rtmp接続を試みる
rtmp_nc.connect(&quot;rtmp://host.domain.com/myApp/myInstance&quot;,userName,password);

//rtmpt接続を400ミリ秒後に行うように設定
connectionID = setInterval(connectRTMPT, 400);

//このファンクションが実行されたらインターバルを破棄してRTMPT接続を試みる
function connectRTMPT() {
	clearInterval(connectionID);
	rtmpt_nc.connect(&quot;rtmpt://host.domain.com/myApp/myInstance&quot;,userName,password);
}
//80番ポートが使えず、8080番ポートを使う場合などのconnectRTMPTメソッドの記述例は以下のとおり
function connectRTMPT() {
	clearInterval(connectionID);
	rtmpt_nc.connect(&quot;rtmpt://myHost.myDomain.com:8080/myApp/myInstance&quot;,userName,password);
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.tonpoo.com/blog/2010/06/proxyservertrouble/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tonpoo.com/blog/2010/06/proxyservertrouble/" />
	</item>
		<item>
		<title>Flash Communication Server：HTTPトンネリングプロトコルについて</title>
		<link>http://www.tonpoo.com/blog/2010/06/httptunnelingprotocol/</link>
		<comments>http://www.tonpoo.com/blog/2010/06/httptunnelingprotocol/#comments</comments>
		<pubDate>Tue, 15 Jun 2010 05:39:32 +0000</pubDate>
		<dc:creator>tonpoo</dc:creator>
				<category><![CDATA[ActionScript2]]></category>
		<category><![CDATA[ActionScript3]]></category>
		<category><![CDATA[Translation]]></category>

		<guid isPermaLink="false">http://www.tonpoo.com/blog/?p=1114</guid>
		<description><![CDATA[諸事情からFlashCommunicationServerへのHTTPトンネリング接続の方法について調べる機会があり、下記のドキュメントを簡単に和訳してみました。 HTTP Tunneling protocols ※注：リンク先が無くなってしまいました・・・。げ、原文まだどっかに残ってないかな・・・。 旧Macromedia時代の文書で、例によってかなり意訳・適当な訳文ですが、何かの参考までに。 HTTPトンネリングプロトコル RTMP、RTMPT、RTMPS FlashPlayerはFlashCommunicationServerと通信する際、デフォルトではRTMPプロトコルを使い、1935番ポートに接続する。 失敗したら443番ポートと80番ポートでの接続を試みる。 ファイヤーウォールが設定されている場合、非標準のポートを経由したTCP/IP通信が許可されていないことがあるため。 これらの手法で、およそ96%のユーザーをカバーすることができるはず。 100%に近いユーザーをカバーするためには（もしあれば）プロクシを通すか、ファイヤーウォールのためにHTTP通信しかできない場合などはHTTPトンネリングを使ってHTTPプロトコル越しにRTMPパケットを送信することになる。 以前のFlashPlayerでは、サーバへの通信要求は常にRTMPプロトコルで行われ、オプションとしてポート番号を指定することが可能であった。以下のコードでは、RTMPを利用し、1935番、443番、80番の3つのポートを使った計3回の接続を試みる。 以下のようにしてポート番号を指定した場合には、指定されたポート番号を使った1回の接続のみを試みる。 現在のFlashPlayerでは、以下の3つのうちどれか一つのプロトコルを使った接続がサポートされるようになった。 RTMP（デフォルトポート：1935） RTMPT（HTTPを経由したトンネリング。デフォルトポート：80） RTMPS（HTTPSを経由したトンネリング。デフォルトポート：443） コードの書式は以下のようになる。 上記の場合、各プロトコルのデフォルトポートに対しての計1回の接続のみを試みる。 ポート番号を指定する場合の書式は以下の通り。 上記の場合は、指定されたポートに対しての計1回の接続を試みる。 また、以下のような特殊な接続方法もある。 この場合、RTMP:1935を試みたあとにRTMPT:80（昔のHTTP:80に代わるもの）を試みる。 新しいFlashPlayerでは、これは「万が一の場合の代替手法」として機能している。もしデフォルトの方法が失敗した場合、FlashPlayerは80番ポートでの接続を試みる。おそらくこれがHTTPトンネリングのための最も一般的な手法であろう。 メモ：HTTPトンネリングはリアルタイムな音声・映像配信のパフォーマンスに影響をおよぼすことがある。 ・・・結論としては、以下の方法がベスト、っていう認識でいいのかな。]]></description>
			<content:encoded><![CDATA[<p>諸事情から<strong>FlashCommunicationServerへのHTTPトンネリング接続</strong>の方法について調べる機会があり、下記のドキュメントを簡単に和訳してみました。</p>
<p><strong><a href="http://kb2.adobe.com/cps/166/tn_16631.html" target="_blank">HTTP Tunneling protocols</a></strong></p>
<p><span style="color: #ff0000;">※注：リンク先が無くなってしまいました・・・。げ、原文まだどっかに残ってないかな・・・。</span></p>
<p>旧Macromedia時代の文書で、例によってかなり意訳・適当な訳文ですが、何かの参考までに。</p>
<hr />
<h2>HTTPトンネリングプロトコル</h2>
<h3>RTMP、RTMPT、RTMPS</h3>
<p>FlashPlayerはFlashCommunicationServerと通信する際、デフォルトではRTMPプロトコルを使い、1935番ポートに接続する。 失敗したら443番ポートと80番ポートでの接続を試みる。 ファイヤーウォールが設定されている場合、非標準のポートを経由したTCP/IP通信が許可されていないことがあるため。 これらの手法で、およそ96%のユーザーをカバーすることができるはず。</p>
<p>100%に近いユーザーをカバーするためには（もしあれば）プロクシを通すか、ファイヤーウォールのためにHTTP通信しかできない場合などはHTTPトンネリングを使ってHTTPプロトコル越しにRTMPパケットを送信することになる。</p>
<p>以前のFlashPlayerでは、サーバへの通信要求は常にRTMPプロトコルで行われ、オプションとしてポート番号を指定することが可能であった。以下のコードでは、RTMPを利用し、1935番、443番、80番の3つのポートを使った計3回の接続を試みる。</p>
<pre class="brush: as3; title: ; notranslate">nc.connect(&quot;rtmp://mysite.com/myapp&quot;);</pre>
<p>以下のようにしてポート番号を指定した場合には、指定されたポート番号を使った1回の接続のみを試みる。</p>
<pre class="brush: as3; title: ; notranslate">nc.connect(&quot;rtmp://mysite.com:PORT/myapp&quot;);</pre>
<p>現在のFlashPlayerでは、以下の3つのうちどれか一つのプロトコルを使った接続がサポートされるようになった。</p>
<ul>
<li><strong>RTMP</strong>（デフォルトポート：1935）</li>
<li><strong>RTMPT</strong>（HTTPを経由したトンネリング。デフォルトポート：80）</li>
<li><strong>RTMPS</strong>（HTTPSを経由したトンネリング。デフォルトポート：443）</li>
</ul>
<p>コードの書式は以下のようになる。</p>
<ul>
<li>
<pre class="brush: as3; title: ; notranslate">nc.connect(&quot;rtmpt://flashteam.macromedia.com/myapp&quot;);</pre>
</li>
<li>
<pre class="brush: as3; title: ; notranslate">nc.connect(&quot;rtmps://flashteam.macromedia.com/myapp&quot;);</pre>
</li>
</ul>
<p>上記の場合、各プロトコルのデフォルトポートに対しての計1回の接続のみを試みる。</p>
<p>ポート番号を指定する場合の書式は以下の通り。</p>
<ul>
<li>
<pre class="brush: as3; title: ; notranslate">nc.connect(&quot;rtmp://flashteam.macromedia.com:PORT/myapp&quot;);</pre>
</li>
<li>
<pre class="brush: as3; title: ; notranslate">nc.connect(&quot;rtmpt://flashteam.macromedia.com:PORT/myapp&quot;);</pre>
</li>
<li>
<pre class="brush: as3; title: ; notranslate">nc.connect(&quot;rtmps://flashteam.macromedia.com:PORT/myapp&quot;);</pre>
</li>
</ul>
<p>上記の場合は、指定されたポートに対しての計1回の接続を試みる。</p>
<p><strong>また、以下のような特殊な接続方法もある。</strong></p>
<ul>
<li>
<pre class="brush: as3; title: ; notranslate">nc.connect(&quot;rtmp://flashteam.macromedia.com/myapp&quot;);</pre>
</li>
</ul>
<p>この場合、RTMP:1935を試みたあとにRTMPT:80<strong>（昔のHTTP:80に代わるもの）</strong>を試みる。</p>
<p>新しいFlashPlayerでは、これは「万が一の場合の代替手法」として機能している。もしデフォルトの方法が失敗した場合、FlashPlayerは80番ポートでの接続を試みる。おそらくこれがHTTPトンネリングのための最も一般的な手法であろう。</p>
<p><strong>メモ：</strong>HTTPトンネリングはリアルタイムな音声・映像配信のパフォーマンスに影響をおよぼすことがある。</p>
<hr />
<p>・・・結論としては、以下の方法がベスト、っていう認識でいいのかな。</p>
<pre class="brush: as3; title: ; notranslate">nc.connect(&quot;rtmp://flashteam.macromedia.com/myapp&quot;);</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.tonpoo.com/blog/2010/06/httptunnelingprotocol/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tonpoo.com/blog/2010/06/httptunnelingprotocol/" />
	</item>
		<item>
		<title>AlivePDFを使ってSWFからPDF出力</title>
		<link>http://www.tonpoo.com/blog/2010/05/alivepdf/</link>
		<comments>http://www.tonpoo.com/blog/2010/05/alivepdf/#comments</comments>
		<pubDate>Mon, 10 May 2010 09:48:58 +0000</pubDate>
		<dc:creator>tonpoo</dc:creator>
				<category><![CDATA[ActionScript3]]></category>
		<category><![CDATA[alivepdf]]></category>

		<guid isPermaLink="false">http://www.tonpoo.com/blog/?p=1061</guid>
		<description><![CDATA[SWFから動的にPDFファイルを生成するためのライブラリであるAlivePDFをちょっと使ってみました。 alivepdf &#8211; Project Hosting on Google Code AIRなら単体でのPDF出力も可能なようですが、SWFファイルからだと単体では無理で、サーバー側にファイル出力用（？）のphpプログラムを設置する必要があるようです。ただ、そのphpプログラムも提供されていたので、とりあえず単純なプログラムを組んで試してみました。 試しに組んでみたファイルのドキュメントクラスは以下の通り。 PDFインスタンスを生成 まずはnew演算子でPDFインスタンスを生成。引数には「印刷方向」「単位」「印刷サイズ」「印刷角度」を指定できます。何も指定しなくてもいいようですが、サンプルでは「印刷角度」以外を指定してます。 印刷方向 Orientation.LANDSCAPE：横向き Orientation.PORTRAIT：縦向き 単位 Unit.CM：センチメートル Unit.INCHES：インチ Unit.MM：ミリメートル Unit.POINT：ポイント 印刷サイズ Size.A3：A3 Size.A4：A4 Size.A5：A5 Size.LEGAL：リーガル Size.LETTER：レター Size.TABLOID：タブロイド 「印刷サイズ」でA4やA5の他にレターやリーガルがあるあたりは欧米の紙サイズが基準になってるためですね。B4やB5など上記に無いサイズを指定する場合は・・・どうしたらいいんでしょ。 PDFの表示モードを指定 次に出力したPDFファイルを開いたときの表示モードをPDF.setDisplayModeで指定。引数には「ズーム」「レイアウト」「モード」「拡大率」を指定できます（サンプルでは「ズーム」と「レイアウト」のみ指定）。 ズーム Display.DEFAULT：デフォルト Display.FULL_PAGE：ページ全体を表示 Display.FULL_WIDTH：ページ幅を基準に表示 Display.REAL：よくわからない。100%表示ってこと？ レイアウト Layout.SINGLE_PAGEが「単一ページ」のことだろうと思うんですが、他の値（Layout.ONE_COLUMN / Layout.TWO_COLUMN_LEFT / Layout.TWO_COLUMN_RIGHT / Layout.TWO_COLUMN_RIGHT / Layout.TWO_PAGE_LEFT）については試してないのでよく分かりません。おそらく複数ページ同時表示とかだと思うんですが・・・。 拡大率 数値で拡大率を指定できるようです。 PDFのページを追加 次に、PDF.addPage()メソッドを使ってページを追加します。単純にこのaddPageメソッドを例えば10回繰り返すと、空のページ10ページで構成されるPDFファイルができます。 テキストの追加 まずはPDF.textStyleメソッドで文字色を指定。引数には色指定の他にも下記のオプションが指定できますが、今回は割愛。 文字色 colors.IColorクラスというのがあって、そのクラスオブジェクトを指定するようです。とりあえずサンプルに従ってcolors.RGBColorインスタンスを指定してみました。 透過率 0～1の数値（Number）で文字の透過率を指定できます。 [...]]]></description>
			<content:encoded><![CDATA[<p>SWFから動的にPDFファイルを生成するためのライブラリであるAlivePDFをちょっと使ってみました。</p>
<p><strong><a href="http://code.google.com/p/alivepdf/" target="_blank">alivepdf &#8211; Project Hosting on Google Code</a></strong></p>
<p>AIRなら単体でのPDF出力も可能なようですが、SWFファイルからだと単体では無理で、サーバー側にファイル出力用（？）のphpプログラムを設置する必要があるようです。ただ、そのphpプログラムも提供されていたので、とりあえず単純なプログラムを組んで試してみました。<br />
<span id="more-1061"></span></p>
<p>試しに組んでみたファイルのドキュメントクラスは以下の通り。</p>
<pre class="brush: as3; title: ; notranslate">package  {
	import flash.display.MovieClip;
	import flash.events.MouseEvent;
	import org.alivepdf.colors.RGBColor;
	import org.alivepdf.display.Display;
	import org.alivepdf.fonts.CoreFont;
	import org.alivepdf.fonts.FontFamily;
	import org.alivepdf.fonts.Style;
	import org.alivepdf.images.ImageFormat;
	import org.alivepdf.layout.Layout;
	import org.alivepdf.layout.Orientation;
	import org.alivepdf.layout.Size;
	import org.alivepdf.layout.Unit;
	import org.alivepdf.pdf.PDF;
	import org.alivepdf.saving.Download;
	import org.alivepdf.saving.Method;
	import utils.Utils;

	/**
	 * ...
	 * @author bricoleur.inc / Tonpoo.com
	 */
	public final class AlivePDFSample extends MovieClip{

		public function AlivePDFSample() {
			this.stage.addEventListener(MouseEvent.MOUSE_DOWN, onClick, false, 0, true);
		}
		private function onClick(e:MouseEvent):void {
			//PDFインスタンスを生成
			var myPDF:PDF = new PDF(Orientation.PORTRAIT, Unit.MM, Size.A4);
			//PDFの表示モードを指定
			myPDF.setDisplayMode(Display.FULL_PAGE, Layout.SINGLE_PAGE);
			//PDFのページを追加
			myPDF.addPage();

			//文字色を設定
			myPDF.textStyle ( new RGBColor ( 0xFF0000 ) );
			//フォントサイズを指定
			myPDF.setFontSize ( 18 );
			//ページの位置（？）を指定
			myPDF.setXY( 10, 40 );
			//マルチセルの追加
			myPDF.addMultiCell ( 300, 1, &quot;This is my PDF Headline&quot; );

			//PDFの出力
			myPDF.save(Method.REMOTE, &quot;http://www.tonpoo.com/_test/create.php&quot;, Download.ATTACHMENT, &quot;sample.pdf&quot;);
		}
	}
}</pre>
<h3>PDFインスタンスを生成</h3>
<pre class="brush: as3; title: ; notranslate">//PDFインスタンスを生成
var myPDF:PDF = new PDF(Orientation.PORTRAIT, Unit.MM, Size.A4);</pre>
<p>まずはnew演算子でPDFインスタンスを生成。引数には「印刷方向」「単位」「印刷サイズ」「印刷角度」を指定できます。何も指定しなくてもいいようですが、サンプルでは「印刷角度」以外を指定してます。</p>
<dl>
<dt>印刷方向</dt>
<dd>
<ul>
<li><strong>Orientation.LANDSCAPE</strong>：横向き</li>
<li><strong>Orientation.PORTRAIT</strong>：縦向き</li>
</ul>
</dd>
<dt>単位</dt>
<dd>
<ul>
<li><strong>Unit.CM</strong>：センチメートル</li>
<li><strong>Unit.INCHES</strong>：インチ</li>
<li><strong>Unit.MM</strong>：ミリメートル</li>
<li><strong>Unit.POINT</strong>：ポイント</li>
</ul>
</dd>
<dt>印刷サイズ</dt>
<dd>
<ul>
<li><strong>Size.A3</strong>：A3</li>
<li><strong>Size.A4</strong>：A4</li>
<li><strong>Size.A5</strong>：A5</li>
<li><strong>Size.LEGAL</strong>：リーガル</li>
<li><strong>Size.LETTER</strong>：レター</li>
<li><strong>Size.TABLOID</strong>：タブロイド</li>
</ul>
</dd>
</dl>
<p>「印刷サイズ」でA4やA5の他にレターやリーガルがあるあたりは欧米の紙サイズが基準になってるためですね。B4やB5など上記に無いサイズを指定する場合は・・・どうしたらいいんでしょ。</p>
<h3>PDFの表示モードを指定</h3>
<pre class="brush: as3; title: ; notranslate">//PDFの表示モードを指定
myPDF.setDisplayMode(Display.FULL_PAGE, Layout.SINGLE_PAGE);</pre>
<p>次に出力したPDFファイルを開いたときの表示モードを<strong>PDF.setDisplayMode</strong>で指定。引数には「ズーム」「レイアウト」「モード」「拡大率」を指定できます（サンプルでは「ズーム」と「レイアウト」のみ指定）。</p>
<dl>
<dt>ズーム</dt>
<dd>
<ul>
<li><strong>Display.DEFAULT</strong>：デフォルト</li>
<li><strong>Display.FULL_PAGE</strong>：ページ全体を表示</li>
<li><strong>Display.FULL_WIDTH</strong>：ページ幅を基準に表示</li>
<li><strong>Display.REAL</strong>：よくわからない。100%表示ってこと？</li>
</ul>
</dd>
<dt>レイアウト</dt>
<dd><strong>Layout.SINGLE_PAGE</strong>が「単一ページ」のことだろうと思うんですが、他の値（<strong>Layout.ONE_COLUMN / Layout.TWO_COLUMN_LEFT / Layout.TWO_COLUMN_RIGHT / Layout.TWO_COLUMN_RIGHT / Layout.TWO_PAGE_LEFT</strong>）については試してないのでよく分かりません。おそらく複数ページ同時表示とかだと思うんですが・・・。</dd>
<dt>拡大率</dt>
<dd>数値で拡大率を指定できるようです。</dd>
</dl>
<h3>PDFのページを追加</h3>
<pre class="brush: as3; title: ; notranslate">//PDFのページを追加
myPDF.addPage();</pre>
<p>次に、<strong>PDF.addPage()</strong>メソッドを使ってページを追加します。単純にこのaddPageメソッドを例えば10回繰り返すと、空のページ10ページで構成されるPDFファイルができます。</p>
<h3>テキストの追加</h3>
<pre class="brush: as3; title: ; notranslate">//文字色を設定
myPDF.textStyle ( new RGBColor ( 0xFF0000 ) );
//フォントサイズを指定
myPDF.setFontSize ( 18 );
//ページの位置（？）を指定
myPDF.setXY( 10, 40 );
//マルチセルの追加
myPDF.addMultiCell ( 300, 1, &quot;This is my PDF Headline&quot; );</pre>
<p>まずは<strong>PDF.textStyle</strong>メソッドで文字色を指定。引数には色指定の他にも下記のオプションが指定できますが、今回は割愛。</p>
<dl>
<dt>文字色</dt>
<dd><strong>colors.IColor</strong>クラスというのがあって、そのクラスオブジェクトを指定するようです。とりあえずサンプルに従って<strong>colors.RGBColor</strong>インスタンスを指定してみました。</dd>
<dt>透過率</dt>
<dd>0～1の数値（Number）で文字の透過率を指定できます。</dd>
<dt>レンダリングモード</dt>
<dd>整数値（int）を指定する事でテキストレンダリングモードを指定できるそうですが、なんのことやら・・・。</dd>
<dt>単語間スペース</dt>
<dd>数値（Number）で単語間のスペースの値を指定できます。</dd>
<dt>文字間スペース</dt>
<dd>数値（Number）で文字間のスペースの値を指定できます。</dd>
<dt>スケール</dt>
<dd>数値（Number）で、Text scalingが指定できます。Text scalingって何でしょう・・・</dd>
<dt>行間</dt>
<dd>数値（Number）で行間を指定できます。</dd>
</dl>
<p>次に<strong>PDF.setFontSize</strong>メソッドでフォントサイズを設定します。引数には整数値（int）が入ります。</p>
<p>次に<strong>PDF.setXY</strong>メソッドでページ内のX,Y位置を指定します。これって、要はこの後に配置するマルチセルの配置位置、って認識でいいんですかね・・・。</p>
<p>でもってその後に<strong>PDF.addMultiCell</strong>メソッドでテキストを含むセルを配置します。まだよくわかってないんですが、どうやらこの「<strong>セル</strong>」というのがPDFのページ内にいろいろ配置する単位のような感じなんですかね。引数には「幅」「高さ」「テキスト」「ボーダー」「横揃え」「塗り（？）」を指定できるようです。</p>
<h3>PDFの出力</h3>
<pre class="brush: as3; title: ; notranslate">//PDFの出力
myPDF.save(Method.REMOTE, &quot;http://www.tonpoo.com/xxxxxxxxx/create.php&quot;, Download.ATTACHMENT, &quot;sample.pdf&quot;);</pre>
<p>最後に、<strong>PDF.save</strong>メソッドを使って内容を出力します。引数に指定できるのは「データ送信形式」「送信先URL」「ダウンロード形式」「ファイル名」「表示フレーム名」です。</p>
<dl>
<dt>データ送信形式</dt>
<dd>サーバー側にデータを送信してPDFを生成する場合は<strong>Method.REMOTE</strong>、AIRを使った場合などでローカル側のみでPDFを生成する場合は<strong>Method.LOCAL</strong>を指定するようです。</dd>
<dt>送信先URL</dt>
<dd>Method.REMOTEの場合に、送信先のphpファイルのURLをここで指定します。</dd>
<dt>ダウンロード形式</dt>
<dd>PDFをブラウザ内で表示する場合は<strong>Download.INLINE</strong>、保存ダイアログを出して保存させる場合は<strong>Download.ATTACHMENT</strong>を指定します。</dd>
<dt>ファイル名</dt>
<dd>pdfファイルのファイル名を指定します。</dd>
<dt>表示フレーム名</dt>
<dd>フレーム内で展開されているコンテンツの場合に、PDFを開く先のフレーム名を指定する、ようです。</dd>
</dl>
<p>ちなみにサーバー側に設置するphp（create.php）のサンプルファイルは、前バージョンのAlivePDFのソースコード一式の中に入っていたものを流用しました。</p>
<pre class="brush: php; title: ; notranslate">&lt;?php

$method = $_GET['method'];
$name = $_GET['name'];

if ( isset ( $GLOBALS[&quot;HTTP_RAW_POST_DATA&quot;] )) {

	// get bytearray
	$pdf = $GLOBALS[&quot;HTTP_RAW_POST_DATA&quot;];

	// add headers for download dialog-box
	header('Content-Type: application/pdf');
	header('Content-Length: '.strlen($pdf));
	header('Content-disposition:'.$method.'; filename=&quot;'.$name.'&quot;');
	echo $pdf;

}  else echo 'An error occured.';

?&gt;</pre>
<p>とりあえず実際にアップして確認した所、PDFファイルが生成されてダウンロードできることを確認できました。次は任意のMovieClipの内容などをそのまま出力する方法とかですね。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tonpoo.com/blog/2010/05/alivepdf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tonpoo.com/blog/2010/05/alivepdf/" />
	</item>
		<item>
		<title>SWFWheelを使ってみる</title>
		<link>http://www.tonpoo.com/blog/2010/04/swfwheel/</link>
		<comments>http://www.tonpoo.com/blog/2010/04/swfwheel/#comments</comments>
		<pubDate>Fri, 23 Apr 2010 15:10:16 +0000</pubDate>
		<dc:creator>tonpoo</dc:creator>
				<category><![CDATA[ActionScript3]]></category>
		<category><![CDATA[SWFWheel]]></category>

		<guid isPermaLink="false">http://www.tonpoo.com/blog/?p=1014</guid>
		<description><![CDATA[AS3から実装された、マウスホイールを検知するMouseEvent.MOUSE_WHEELイベントはMacでは動作しない、というのは知っていて、その問題を解消するためのライブラリがあるという話も聞いていたのですが、実際に使ってみる機会に遭遇したので、備忘録もかねて導入までのフローをメモしてみました。ちなみに参考にしたのはfeb19さんの以下の記事： feb19.jp blog &#8211; SWFWheelを使う 導入したライブラリはSWFWheelです。実際の導入フローは以下の通り： SWFWheel.asのダウンロード まずはasファイルのダウンロード。Spark projectのSWFWheelのページの「ソースコードはこちら」または「リポジトリブラウザで閲覧」からディレクトリを掘っていってSWFWheel.asを見つけてダウンロード。めんどくさい人は以下のリンクを右クリック→「名前を付けて保存」で。 http://www.libspark.org/svn/as3/SWFWheel/trunk/src/org/libspark/ui/SWFWheel.as SWFWheel.asの配置 ダウンロードしてきたSWFWheel.asはそのまま配置するのではなく、適切なフォルダを作ってその中に配置する。例えば以下のようなフォルダ構成になっていた場合： /project/fla/ flaファイルの格納フォルダ /project/as/ クラスファイル（asファイル）の格納フォルダ /project/deploy/ swfファイルやhtmlファイルの格納フォルダ /project/as/フォルダの中に「org」フォルダを作成。その中に「libspark 」フォルダを作成。その中にさらに「ui」フォルダを作成し、その中に配置する。実際に作業するflaファイルやそのドキュメントクラス、公開用のhtmlファイルやjsファイルも含めると、全体の構成は以下のようになる。 /project/fla/ flaファイルの格納フォルダ /project/fla/main.fla メインのflaファイル /project/as/ クラスファイル（asファイル）の格納フォルダ /project/as/Main.as main.flaのドキュメントクラス /project/as/org/libspark/ui/SWFWheel.as SWFWheel.asの配置場所 /project/deploy/ swfファイルやhtmlファイルの格納フォルダ /project/deploy/main.swf main.flaの出力ファイル /project/deploy/main.html main.swfを表示するhtmlファイル /project/deploy/js/swfobject.js swfファイルをhtmlファイルに埋め込むためのJavaScriptライブラリ HTML側の調整 今回はSWFObject2を使った想定なので、SWFObject 2 HTML and JavaScript ジェネレーター v1.2を使って埋め込みコードを生成。その際、以下の点をチェックする。 「Flashコンテンツのid」と「属性：name」を設定する。 「Flashコンテンツのid」と「属性：name」の値は同一のものにする。 allowscriptaccessの値をalwaysにする。 できたサンプルソースは以下の通り。 SWFWheelクラスのインポートと初期化 ではドキュメントクラスMain.asの記述開始。まずはSWFWheelのインポートと初期化。初期化に使うのはSWFWheel.initializeメソッドで、引数としてステージへの参照を渡す。 マウスホイールイベントの検出 次に実際にマウスホイールイベントを検出してみる。マウスホイールイベントのハンドラメソッドで受け取るMouseEventのdeltaプロパティというのがマウスホイールを 1 [...]]]></description>
			<content:encoded><![CDATA[<p>AS3から実装された、マウスホイールを検知する<strong>MouseEvent.MOUSE_WHEEL</strong>イベントはMacでは動作しない、というのは知っていて、その問題を解消するためのライブラリがあるという話も聞いていたのですが、実際に使ってみる機会に遭遇したので、備忘録もかねて導入までのフローをメモしてみました。ちなみに参考にしたのはfeb19さんの以下の記事：</p>
<p><strong><a href="http://feb19.jp/blog/archives/000167.php" target="_blank">feb19.jp blog &#8211; SWFWheelを使う</a></strong></p>
<p>導入したライブラリは<strong>SWFWheel</strong>です。実際の導入フローは以下の通り：<br />
<span id="more-1014"></span></p>
<h2>SWFWheel.asのダウンロード</h2>
<p>まずはasファイルのダウンロード。<strong><a href="http://www.libspark.org/wiki/SWFWheel" target="_blank">Spark projectのSWFWheelのページ</a></strong>の「ソースコードはこちら」または「リポジトリブラウザで閲覧」からディレクトリを掘っていってSWFWheel.asを見つけてダウンロード。めんどくさい人は以下のリンクを右クリック→「名前を付けて保存」で。</p>
<p><a href="http://www.libspark.org/svn/as3/SWFWheel/trunk/src/org/libspark/ui/SWFWheel.as" target="_blank">http://www.libspark.org/svn/as3/SWFWheel/trunk/src/org/libspark/ui/SWFWheel.as</a></p>
<h2>SWFWheel.asの配置</h2>
<p>ダウンロードしてきたSWFWheel.asはそのまま配置するのではなく、適切なフォルダを作ってその中に配置する。例えば以下のようなフォルダ構成になっていた場合：</p>
<dl>
<dt>/project/fla/</dt>
<dd>flaファイルの格納フォルダ</dd>
<dt>/project/as/</dt>
<dd>クラスファイル（asファイル）の格納フォルダ</dd>
<dt>/project/deploy/</dt>
<dd>swfファイルやhtmlファイルの格納フォルダ</dd>
</dl>
<p>/project/as/フォルダの中に「org」フォルダを作成。その中に「libspark<br />
」フォルダを作成。その中にさらに「ui」フォルダを作成し、その中に配置する。実際に作業するflaファイルやそのドキュメントクラス、公開用のhtmlファイルやjsファイルも含めると、全体の構成は以下のようになる。</p>
<dl>
<dt>/project/fla/</dt>
<dd>flaファイルの格納フォルダ</dd>
<dt>/project/fla/main.fla</dt>
<dd>メインのflaファイル</dd>
<dt>/project/as/</dt>
<dd>クラスファイル（asファイル）の格納フォルダ</dd>
<dt>/project/as/Main.as</dt>
<dd>main.flaのドキュメントクラス</dd>
<dt style="color:#ff0000;">/project/as/org/libspark/ui/SWFWheel.as</dt>
<dd style="color:#ff0000;">SWFWheel.asの配置場所</dd>
<dt>/project/deploy/</dt>
<dd>swfファイルやhtmlファイルの格納フォルダ</dd>
<dt>/project/deploy/main.swf</dt>
<dd>main.flaの出力ファイル</dd>
<dt>/project/deploy/main.html</dt>
<dd>main.swfを表示するhtmlファイル</dd>
<dt>/project/deploy/js/swfobject.js</dt>
<dd>swfファイルをhtmlファイルに埋め込むためのJavaScriptライブラリ</dd>
</dl>
<h2>HTML側の調整</h2>
<p>今回はSWFObject2を使った想定なので、<a href="http://www.tonpoo.com/docs/swfobject_generator/" target="_blank">SWFObject 2 HTML and JavaScript ジェネレーター v1.2</a>を使って埋め込みコードを生成。その際、以下の点をチェックする。</p>
<ul>
<li>「<strong>Flashコンテンツのid</strong>」と「<strong>属性：name</strong>」を設定する。</li>
<li>「Flashコンテンツのid」と「属性：name」の<strong>値は同一のものにする。</strong></li>
<li><strong>allowscriptaccess</strong>の値を<strong>always</strong>にする。</li>
</ul>
<p><img src="http://www.tonpoo.com/blog/wp-content/uploads/2010/04/ss_swfobject.png" alt="ss_swfobject" title="ss_swfobject" width="412" height="616" class="alignnone size-full wp-image-1028" /><br />
できたサンプルソースは以下の通り。</p>
<pre class="brush: xml; title: ; notranslate">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; lang=&quot;ja&quot; xml:lang=&quot;ja&quot;&gt;
	&lt;head&gt;
		&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
		&lt;title&gt;&lt;/title&gt;
		&lt;meta http-equiv=&quot;Content-Script-Type&quot; content=&quot;text/javascript;&quot; /&gt;
		&lt;script type=&quot;text/javascript&quot; src=&quot;js/swfobject.js&quot;&gt;&lt;/script&gt;
		&lt;script type=&quot;text/javascript&quot;&gt;
			var flashvars = {};
			var params = {};
			params.allowscriptaccess = &quot;always&quot;;
			var attributes = {};
			attributes.id = &quot;flashAreaContent&quot;;
			attributes.name = &quot;flashAreaContent&quot;;
			swfobject.embedSWF(&quot;main.swf&quot;, &quot;myAlternativeContent&quot;, &quot;800&quot;, &quot;600&quot;, &quot;9.0.0&quot;, false, flashvars, params, attributes);
		&lt;/script&gt;
	&lt;/head&gt;
	&lt;body&gt;
		&lt;div id=&quot;myAlternativeContent&quot;&gt;
			&lt;a href=&quot;http://www.adobe.com/go/getflashplayer_jp&quot;&gt;
				&lt;img src=&quot;http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif&quot; alt=&quot;Get Adobe Flash player&quot; /&gt;
			&lt;/a&gt;
		&lt;/div&gt;
	&lt;/body&gt;
&lt;/html&gt;</pre>
<h2>SWFWheelクラスのインポートと初期化</h2>
<p>ではドキュメントクラスMain.asの記述開始。まずはSWFWheelのインポートと初期化。初期化に使うのは<strong>SWFWheel.initialize</strong>メソッドで、<strong>引数としてステージへの参照を渡す</strong>。</p>
<pre class="brush: as3; title: ; notranslate">package  {
	import flash.display.MovieClip;
	import org.libspark.ui.SWFWheel;

	public class Main extends MovieClip{
		public function Main() {
			SWFWheel.initialize(this.stage);	//SWFWheelの初期化。引数としてステージへの参照を渡す。
		}
	}

}</pre>
<h2>マウスホイールイベントの検出</h2>
<p>次に実際にマウスホイールイベントを検出してみる。マウスホイールイベントのハンドラメソッドで受け取るMouseEventの<strong>delta</strong>プロパティというのが<strong>マウスホイールを 1 目盛り回すごとにスクロールする行数を示す</strong>そうなので、試しにtraceさせてみる。</p>
<pre class="brush: as3; title: ; notranslate">package  {
	import flash.display.MovieClip;
	import flash.events.MouseEvent;
	import org.libspark.ui.SWFWheel;

	public class Main extends MovieClip{
		public function Main() {
			SWFWheel.initialize(this.stage);
			this.addEventListener(MouseEvent.MOUSE_WHEEL, onMouseWheel, false, 0, true);
		}
		private function onMouseWheel(e:MouseEvent):void {
			trace(&quot;onMouseWheel:&quot;, e.delta);
		}
	}
}</pre>
<p>出た出た。あとはこの値を使って具体的な処理を追加するだけですね。Macで動くかどうかは一通りのファイルをサーバーにアップして確認。で、きちんと動きました。これで問題ありません！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tonpoo.com/blog/2010/04/swfwheel/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tonpoo.com/blog/2010/04/swfwheel/" />
	</item>
	</channel>
</rss>

