<?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>Re:Creator&#039;s Kansai （リクリ） &#187; xml</title>
	<atom:link href="http://www.re-creators.jp/tag/xml/feed" rel="self" type="application/rss+xml" />
	<link>http://www.re-creators.jp</link>
	<description>Re:Creator&#039;s Kansai（リクリ）は関西のクリエイターの交流、勉強会・セミナーの開催を目的としたコミュニティです。</description>
	<lastBuildDate>Thu, 11 Mar 2010 09:47:19 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>知ったかFlash　第四回</title>
		<link>http://www.re-creators.jp/blog/2008/12/02_163.html</link>
		<comments>http://www.re-creators.jp/blog/2008/12/02_163.html#comments</comments>
		<pubDate>Tue, 02 Dec 2008 14:23:00 +0000</pubDate>
		<dc:creator>kgm</dc:creator>
				<category><![CDATA[ブログ]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[キャッシュ]]></category>
		<category><![CDATA[キャッシュ対策]]></category>

		<guid isPermaLink="false">http://re-creators.weblike.jp/?p=163</guid>
		<description><![CDATA[どーも、お久しぶりです。kgmです。
久々の投稿です。
今回は、Flashのキャッシュ対策のTipsと、それを一歩踏み込んだものを紹介します。
一歩踏み込んだ・・・ってのをカンタンに説明しておくと、
「キャッシュ対策の定 [...]]]></description>
			<content:encoded><![CDATA[<p>どーも、お久しぶりです。kgmです。<br />
久々の投稿です。</p>
<p>今回は、Flashのキャッシュ対策のTipsと、それを一歩踏み込んだものを紹介します。<br />
一歩踏み込んだ・・・ってのをカンタンに説明しておくと、<br />
「<strong>キャッシュ対策の定番となっている手法を使うと、クエリのせいでログ解析が困難！</strong>」<br />
というのを解決するものです。</p>
<p>では早速。</p>
<p><span id="more-163"></span></p>
<p>まずは、rss的なXMLを読み込む場合を考えて見ましょう。</p>
<p>FlashのHelpにも書いていますが、基本的には下記のようなコードでXMLを取得することができます。</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript"><span style="color: #000000; font-weight: bold;">var</span> rssXml:<span style="color: #0066CC;">XML</span> = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">XML</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
rssXml.<span style="color: #0066CC;">ignoreWhite</span> = <span style="color: #000000; font-weight: bold;">true</span>;
rssXml.<span style="color: #0066CC;">load</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;http://hoge.com/rss.xml&quot;</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>しかし、これだけでは問題があります。<br />
ブラウザによって挙動は違いますが、物によってはキャッシュが強く、ブラウザの更新ボタンなどで更新しただけではXMLの内容がリフレッシュされないことがあります。<br />
これでは非常にマズイです。最新の情報を表示することができません。</p>
<p>そこで、定番となるTipsが下記です。</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript"><span style="color: #000000; font-weight: bold;">var</span> rssXml:<span style="color: #0066CC;">XML</span> = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">XML</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
rssXml.<span style="color: #0066CC;">ignoreWhite</span> = <span style="color: #000000; font-weight: bold;">true</span>;
rssXml.<span style="color: #0066CC;">load</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;http://hoge.com/rss.xml?&quot;</span>+<span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">floor</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">random</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">*</span><span style="color: #cc66cc;">1000</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>どこが変わったかというと、読み込む対象のXMLのURLが<br />
<strong>&#8220;http://hoge.com/rss.xml?&#8221;+Math.floor(Math.random()*1000)</strong>となっています。</p>
<p>これは、<strong>&#8220;http://hoge.com/rss.xml&#8221;</strong>に、GET方式でクエリとして乱数（ランダムな数字）をくっつける事で、ブラウザに「<strong>前回とは違うファイル（リクエスト）である</strong>」と認識させることにより、しっかり新しいファイルを読み込ませるというものです。</p>
<p><strong>Math.floor(Math.random()*1000)</strong>というのは、言葉で書くと<br />
<strong>括弧の中の数字の小数点以下を切り捨て！（ランダムな0～1までの小数点以下ありの数字をつくります！それを1000倍！）</strong>ということです。</p>
<p>結果、0～1000までの数字（正確には0 <= n < 1000です）を通常のURLにクエリとして追加することとなります。<br />
つまり、<strong>&#8220;http://hoge.com/rss.xml?123&#8243;</strong>というURLをリクエストすることになります。</p>
<p>ひとまずは、これにより当初の問題は解決します。<br />
（もちろん、1/1000程度の確率でクエリもかぶりますが・・・一般的には無視することが多いみたいです。）</p>
<p><em>*追記　乱数ではなく、 &#8220;?&#8221;+new Date().getTime(); とすれば読み込み時刻をクエリとするので、上記問題は回避しやすくなります。ただ、ログのファイル名がほぼ無限になりますが・・・</em></p>
<p><strong>・・・しかし！</strong>ここで新たな問題が発生します。<br />
リクエストするURLが</p>
<p><strong>&#8220;http://hoge.com/rss.xml?123&#8243;</strong><br />
<strong>&#8220;http://hoge.com/rss.xml?321&#8243;</strong><br />
<strong>&#8220;http://hoge.com/rss.xml?456&#8243;</strong></p>
<p>といったように、リクエストするURLが毎回違うわけですからサーバーのログにも当然そのようにのこります。</p>
<p>見慣れたApacheのログであれば、<br />
<strong>hoge.com &#8211; - [02/Dec/2008:22:46:49 +0900] &#8220;GET /rss.xml?523 HTTP/1.1&#8243; 200 1272</strong><br />
<strong>hoge.com &#8211; - [02/Dec/2008:22:46:51 +0900] &#8220;GET /rss.xml?778 HTTP/1.1&#8243; 200 1272</strong><br />
<strong>hoge.com &#8211; - [02/Dec/2008:22:46:53 +0900] &#8220;GET /rss.xml?515 HTTP/1.1&#8243; 200 1272</strong>といった感じで残ってしまいます。</p>
<p>これでは、ログ解析が大変煩雑になります。<br />
rss.xmlについているクエリ自体はまったく意味を持ちません。</p>
<p>ですので解析時にクエリを無視しなければなりませんが、その場合は<br />
「<strong>rss.xmlのクエリだけ無視する</strong>」<br />
という設定にしなければ、意味を持つクエリまで無視されるような状況が想定されます。</p>
<p>これがカンタンにできるログ解析ソフトであれば問題ないでしょうが、その作業が必要なことを明示しておかなければログ解析する人がとっても困ります。</p>
<p>そこで、クエリを使わずにキャッシュが強いブラウザでも大丈夫な読み込み方法が下記です。<br />
実装する際のコードなども含まれた状態にしています。</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript"><span style="color: #0066CC;">System</span>.<span style="color: #0066CC;">useCodepage</span> = <span style="color: #000000; font-weight: bold;">true</span>;<span style="color: #808080; font-style: italic;">//XMLがShift_Jisの場合に必要</span>
<span style="color: #000000; font-weight: bold;">var</span> rssXml:<span style="color: #0066CC;">XML</span> = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">XML</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<span style="color: #808080; font-style: italic;">//XMLを作成</span>
rssXml.<span style="color: #0066CC;">ignoreWhite</span> = <span style="color: #000000; font-weight: bold;">true</span>;<span style="color: #808080; font-style: italic;">//お約束</span>
<span style="color: #000000; font-weight: bold;">var</span> result_lv:<span style="color: #0066CC;">LoadVars</span> = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">LoadVars</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<span style="color: #808080; font-style: italic;">//sendAndLoadで読み込むので、結果格納用のLoadVars</span>
result_lv.<span style="color: #0066CC;">onLoad</span> = <span style="color: #000000; font-weight: bold;">function</span><span style="color: #66cc66;">&#40;</span>success:<span style="color: #0066CC;">Boolean</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><span style="color: #808080; font-style: italic;">//読み込み完了時動作</span>
 <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>success<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
  <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">unescape</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">this</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;<span style="color: #808080; font-style: italic;">//読み込み結果を出力ウインドウで確認。unescapeが重要です。</span>
  rssXml.<span style="color: #0066CC;">parseXML</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">unescape</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">this</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;<span style="color: #808080; font-style: italic;">//読み込んだ結果をXMLにパース。unescapeが重要です。</span>
  txt.<span style="color: #0066CC;">text</span> = rssXml.<span style="color: #0066CC;">firstChild</span>.<span style="color: #0066CC;">firstChild</span>.<span style="color: #0066CC;">firstChild</span>.<span style="color: #0066CC;">firstChild</span>.<span style="color: #0066CC;">nodeValue</span>;<span style="color: #808080; font-style: italic;">//ノードの値を表示したり格納したり。</span>
 <span style="color: #66cc66;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
  <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Error connecting to server.&quot;</span><span style="color: #66cc66;">&#41;</span>;<span style="color: #808080; font-style: italic;">//読み込み失敗。</span>
 <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">var</span> send_lv:<span style="color: #0066CC;">LoadVars</span> = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">LoadVars</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<span style="color: #808080; font-style: italic;">//読み込みLoadVars</span>
send_lv.<span style="color: #006600;">id</span> = <span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">floor</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">random</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">*</span><span style="color: #cc66cc;">1000</span><span style="color: #66cc66;">&#41;</span>;<span style="color: #808080; font-style: italic;">//上記に、POST用の乱数くっつけます。</span>
send_lv.<span style="color: #0066CC;">sendAndLoad</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;http://hoge.com/rss.xml&quot;</span>,result_lv,<span style="color: #ff0000;">&quot;POST&quot;</span><span style="color: #66cc66;">&#41;</span>;<span style="color: #808080; font-style: italic;">//POSTで読み込みます。</span></pre></div></div>

<p>何をしているかと言うと・・・</p>
<ul>
<li>用意されたXMLのload関数を使わずに、外部プログラムと通信するLoadVarsのsendAndLoad関数を用いる</li>
<li>POSTメソッドでXMLファイルにアクセスする</li>
<li>さらにPOSTに乱数を仕込む事によって新しいリクエストであることを強調。</li>
<li>上記で得られるのは、新しいXMLの内容であるが”テキスト”として読み込まれる</li>
<li>そこでXML.parseXML()関数を使い、テキストをXMLにパースする</li>
</ul>
<p>という方法を取っています。<br />
これにより、クエリを残さずに最新ファイルを表示することができます。</p>
<p>ただ・・・当然ですが<br />
<strong>hoge.com &#8211; - [02/Dec/2008:22:46:33 +0900] &#8220;POST /rss.xml HTTP/1.1&#8243; 200 1272</strong><br />
というように、POSTでの要求というログが残ります。</p>
<p>また、サーバー環境やログ解析環境によっては期待した効果が得られないこともあるかもしれません。<br />
結局、ログ解析者との意思疎通は必要になってくるかもしれません。</p>
<p>以上、意外とググっても見つからない問題だったので自分のやり方を書いてみました。<br />
ほかにもやり方があるかも知れません。いい方法があれば、ぜひ教えてください！！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.re-creators.jp/blog/2008/12/02_163.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
