<?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>XML &#8211; Mach3.laBlog</title>
	<atom:link href="https://blog.mach3.jp/tag/xml/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.mach3.jp</link>
	<description></description>
	<lastBuildDate>Mon, 09 Dec 2013 01:39:36 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>
	<item>
		<title>&#034;JSON&#034; &#8211; Alphabetical Advent Calendar 2013</title>
		<link>https://blog.mach3.jp/2013/12/09/jaac2013-j-json.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Mon, 09 Dec 2013 01:39:36 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Advent Calendar 2013]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[XML]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=3705</guid>

					<description><![CDATA[&#8220;J&#8221; は JSON の &#8220;J&#8221;。 JSON JSON は &#8220;JavaScript Object Notation&#8221; の略称で、 今や息をするように [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>&#8220;J&#8221; は JSON の &#8220;J&#8221;。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-9E0KuvqEZT4/UqR4icv8cKI/AAAAAAAACYg/N2xSaWsMPwU/s400/ac2013-j.png9" alt="J"/></figure>



<p></p>



<span id="more-3705"></span>



<h2 class="wp-block-heading">JSON</h2>



<p>JSON は &#8220;JavaScript Object Notation&#8221; の略称で、 今や息をするように当たり前のように使われているデータフォーマットです。</p>



<ul class="wp-block-list">
<li>サイズが少なくて済む</li>



<li>書式に馴染みがある（JavaScriptのオブジェクトリテラルほぼそのまま）</li>



<li>データの型をそのまま活かせる</li>
</ul>



<p>などの特徴を持ち、Webアプリケーションのデータのやり取りだけでなく、 node.js のパッケージ定義ファイル（package.json）や、 Sublime Text 2 等ソフトウェアの設定ファイル等、様々な場面で目にするようになりました。</p>



<h3 class="wp-block-heading">生成・パース</h3>



<p>JSON文字列の生成・展開は <strong>JSON</strong> オブジェクトの <strong>stringify</strong> / <strong>parse</strong> メソッドを通して行うことが出来ます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> person = {
    <span class="hljs-attr">name</span>: <span class="hljs-string">"john"</span>,
    <span class="hljs-attr">age</span>: <span class="hljs-number">15</span>,
    <span class="hljs-attr">active</span>: <span class="hljs-literal">true</span>,
    <span class="hljs-attr">tags</span>: &#91;<span class="hljs-string">"JavaScript"</span>, <span class="hljs-string">"CSS"</span>, <span class="hljs-string">"HTML"</span>]
};

<span class="hljs-keyword">var</span> json = <span class="hljs-built_in">JSON</span>.stringify(person);
<span class="hljs-comment">// '{"name":"john","age":15,"active":true,"tags":&#91;"JavaScript","CSS","HTML"]}'</span>
<span class="hljs-keyword">var</span> parsed = <span class="hljs-built_in">JSON</span>.parse(json);
<span class="hljs-comment">// { name: "john", ... }</span>
</code></span></pre>


<p>JSON APIは古いブラウザ等では使えない場合もありますが、 その場合は <a href="https://github.com/douglascrockford/JSON-js">json2.js</a> などを利用する事で、 レガシーな環境でも <strong>JSON.parse/stringify</strong> を使用出来るようになります。 あるいは、パースするだけならば jQuery に <strong>$.parseJSON</strong> メソッドが用意されています。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$.parseJSON(<span class="hljs-string">'{"name":"john","age":15,"active":true,"tags":&#91;"JavaScript","CSS","HTML"]}'</span>);
</code></span></pre>


<h3 class="wp-block-heading">型 と toJSON メソッド</h3>



<p>型を活かせるとは言っても全てがそうなのではなく、JSONで表現できる型は限られています。 JSONはあくまでJSONであって、JavaScriptではないという事ですね。</p>



<p>表現できる型は以下となります。</p>



<ul class="wp-block-list">
<li>数値</li>



<li>文字列</li>



<li>真偽値</li>



<li>配列</li>



<li>オブジェクト（連想配列）</li>



<li>null</li>
</ul>



<p>それ以外の型については、Date オブジェクトのように <strong>toJSON</strong> メソッドを持つ物であればその結果が代入されます。 （Date.toJSON は ISO文字列を返します） ただし、パース時に元のオブジェクトに変換してくれたりはしません。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> data = {
    <span class="hljs-attr">date</span>: <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>()
};
<span class="hljs-built_in">JSON</span>.stringify(date); <span class="hljs-comment">// {"date":"2013-11-11T03:46:11.583Z"}</span>
</code></span></pre>


<p>つまり、<strong>toJSON</strong> メソッドを定義してさえ置けば、そのままJSONに渡せてしまうという事です。 backbone.js の Model や Collection には toJSON メソッドが実装されており、そのままスムーズにデータのやり取りをする事が出来ます。 自前のクラス等をつくる際には toJSON を生やしておくと色々捗りそうです。</p>



<h2 class="wp-block-heading">JSONPath</h2>



<p>全く違う話になりますが、XMLのデータの必要な情報にだけアクセスする <strong>XPath</strong> という物があります。 XML文書あるいはそのデータから <strong>&#8220;//chapter[@title=&#8221;第1章&#8221;]/paragraph&#8221;</strong> のような文字列表現で条件を指定することで、 条件に適合するデータを抽出するという物なのですが、 JSON にも同じ趣向のライブラリがあります。それが <strong>JSONPath</strong> です。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong><a href="http://goessner.net/articles/JsonPath">http://goessner.net/articles/JsonPath</a></strong><br />
  JSONPath is a lightweight component that allows to find and extract relevant portions out of JSON structures on the client as well as on the server.</p>
</blockquote>



<p>JavaScriptの実装は、90行程度に収まっています。 簡単な例で試してみましょう。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> data = {
    <span class="hljs-attr">length</span>: <span class="hljs-number">3</span>,
    <span class="hljs-attr">items</span>: &#91;
        {
            <span class="hljs-attr">name</span>: <span class="hljs-string">"JavaScript 第6版"</span>,
            <span class="hljs-attr">price</span>: <span class="hljs-number">4410</span>,
            <span class="hljs-attr">author</span>: <span class="hljs-string">"David Flanagan"</span>
        },
        {
            <span class="hljs-attr">name</span>: <span class="hljs-string">"JavaScript: The Good Parts"</span>,
            <span class="hljs-attr">price</span>: <span class="hljs-number">1890</span>,
            <span class="hljs-attr">author</span>: <span class="hljs-string">"Douglas Crockford"</span>
        },
        {
            <span class="hljs-attr">name</span>: <span class="hljs-string">"JavaScriptパターン"</span>,
            <span class="hljs-attr">price</span>: <span class="hljs-number">2940</span>,
            <span class="hljs-attr">author</span>: <span class="hljs-string">"Stoyan Stefanov"</span>
        }
    ]
};

<span class="hljs-comment">// price が2000超の本の著者を抽出する</span>
<span class="hljs-keyword">var</span> authors = jsonPath(data, <span class="hljs-string">"$.items&#91;?(@.price&gt;2000)].author"</span>);
<span class="hljs-comment">// &#91;"David Flanagan", "Stoyan Stefanov"]</span>
</code></span></pre>


<p>&#8220;$&#8221; がルートを示し、そこから &#8220;.&#8221; で下層を辿っていき、&#8221;?&#8221; を使って属性でフィルタをかけたりする事ができます。 &#8220;@&#8221; は自身のノードを指します。 詳しい書式については <a href="http://goessner.net/articles/JsonPath">参考ページ</a> にXPathとの対応表として掲載されています。</p>



<p>慣れないと時間がかかりそうですが、大きなデータからの抽出に役立つかもしれません。</p>



<h2 class="wp-block-heading">参考資料</h2>



<ul class="wp-block-list">
<li><a href="http://json.org/json-ja.html">JSON</a></li>



<li><a href="https://github.com/douglascrockford/JSON-js">douglascrockford/JSON-js</a></li>



<li><a href="http://api.jquery.com/jQuery.parseJSON/">jQuery.parseJSON() | jQuery API Documentation</a></li>



<li><a href="http://goessner.net/articles/JsonPath/">JSONPath &#8211; XPath for JSON</a></li>



<li><a href="https://code.google.com/p/jsonpath/">jsonpath &#8211; XPath like syntax for JSON &#8211; Google Project Hosting</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>はじめてのRaphael (2) : イベント編</title>
		<link>https://blog.mach3.jp/2011/12/27/get-started-with-raphael-02.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Tue, 27 Dec 2011 00:59:59 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Raphael]]></category>
		<category><![CDATA[SVG]]></category>
		<category><![CDATA[XML]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=2215</guid>

					<description><![CDATA[Raphaelチュートリアルの第二回です。 今回は、描画された図のマウスイベントを操作する方法を紹介します。 シンプルな例 まずはシンプルな例から。 紙に円を描き、マウスでクリックされた時になんらかの処理を行います。 E [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Raphaelチュートリアルの第二回です。<br />
今回は、描画された図のマウスイベントを操作する方法を紹介します。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh5.googleusercontent.com/-w_T4nvskWAY/TviL_ZGH7KI/AAAAAAAABbw/1IWLCmMQhsc/s400/201112262358.png" alt="はじめてのRaphael (2) : イベント編"/></figure>



<p></p>



<span id="more-2215"></span>



<h2 class="wp-block-heading">シンプルな例</h2>



<p>まずはシンプルな例から。<br />
紙に円を描き、マウスでクリックされた時になんらかの処理を行います。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
    <span class="hljs-keyword">var</span> paper, myCircle, onClick ;

    <span class="hljs-comment">/**
     * 紙に円を描きます。
     * myCircleには、Elementオブジェクトが格納されます。
     */</span>
    paper = <span class="hljs-keyword">new</span> Raphael( <span class="hljs-string">"paper"</span>, <span class="hljs-number">640</span>, <span class="hljs-number">480</span> );
    myCircle = paper.circle( <span class="hljs-number">100</span>, <span class="hljs-number">100</span>, <span class="hljs-number">32</span> )
        .attr( { <span class="hljs-attr">fill</span> : <span class="hljs-string">"#345"</span>, <span class="hljs-attr">stroke</span> : <span class="hljs-string">"none"</span> } );

    <span class="hljs-comment">/**
     * Element.click() で
     * マウスクリックイベントのハンドラを設定できます。
     * ハンドラ内のthisはElementオブジェクトです。
     */</span>
    myCircle.click( <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-built_in">console</span>.log( <span class="hljs-keyword">this</span>.type ); <span class="hljs-comment">// =&gt; "circle"</span>
        alert( <span class="hljs-string">"さわんな！"</span> );
    });

})();
</code></span></pre>


<p>Element.click() メソッドの引数に関数を渡すだけなので、とても簡単。</p>



<p>円に限らず、ほとんどのシェイプ描画メソッドはElementオブジェクトを返します。<br />
イベントやアニメーションをいじりたい場合は、<br />
この例での変数「myCircle」のように返り値を格納しておくと良いですね。<br />
勿論、メソッドチェーンで一気に書いてしまう事もできます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">paper.circle( <span class="hljs-number">100</span>, <span class="hljs-number">100</span>, <span class="hljs-number">32</span> )
    .attr( { <span class="hljs-attr">fill</span> : <span class="hljs-string">"#345"</span>, <span class="hljs-attr">stroke</span> : <span class="hljs-string">"none"</span> } )
    .click( <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        alert( <span class="hljs-string">"さわんな！"</span> );
    });
</code></span></pre>


<h3 class="wp-block-heading">イベントハンドラの登録解除</h3>



<p>設定したイベントハンドラを解除するのは、<br />
そのメソッドに接頭辞「un」をつけたメソッドを使います。<br />
例えばclick() で登録したハンドラの登録解除は、unclick() を使用します。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">/**
 * click() で登録
 */</span>
<span class="hljs-keyword">var</span> onClick = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">()</span></span>{ alert(<span class="hljs-string">"さわんな！"</span>); };
myCircle.click( onClick );

<span class="hljs-comment">/**
 * unclick() で登録解除
 */</span>
myCircle.unclick( onClick ); <span class="hljs-comment">// もうさわっても怒られません。</span>
</code></span></pre>


<h2 class="wp-block-heading">イベントの色々</h2>



<p>clickの他にも様々なマウスイベント用のメソッドが用意されています。</p>



<h3 class="wp-block-heading">おなじみのイベント</h3>



<p>まず、これらのおなじみの方々。<br />
恐らく名前を見るだけで、どんな役割なのかすぐに分かることでしょう。</p>



<ul class="wp-block-list">
<li>click （クリック）</li>



<li>dblclick （ダブルクリック）</li>



<li>mousedown （マウスダウン）</li>



<li>mousemove （マウスムーブ）</li>



<li>mosueout （マウスアウト）</li>



<li>mouseover （マウスオーバー）</li>



<li>mouseup （マウスアップ）</li>
</ul>



<h3 class="wp-block-heading">タッチ関係のイベント</h3>



<p>スマートフォン向けの、タッチイベントも実装されています。</p>



<ul class="wp-block-list">
<li>touchcancel （タッチキャンセル）</li>



<li>touchend （タッチエンド）</li>



<li>touchmove （タッチムーブ）</li>



<li>touchstart （タッチスタート）</li>
</ul>



<h2 class="wp-block-heading">jQueryのような、hover()</h2>



<p>jQuery.hover() は、マウスが入ってきた時と離れていく時のハンドラを<br />
同時に設定する事が出来る便利なメソッドですが、<br />
それとほぼ同じ役割をし、名前も同じ hover() メソッドが用意されています。</p>



<dl>
<dt>Element.hover( f_in, f_out );</dt>
<dd><em>f_in</em> (Function) マウスが入ってきた時の処理<br />
<em>f_out</em> (Function) マウスが離れていく時の処理</dd>
</dl>



<pre class="wp-block-preformatted">/**
 * マウスオーバーで塗り色を変えるサンプル。
 */
myCircle.hover(
    function(){
        console.log( "くんな！" );
        this.attr( "fill", "#c00" );
    },
    function(){
        console.log( "にげんな！" );
        this.attr( "fill", "#345" );
    }
);
</pre>



<h2 class="wp-block-heading">drag() で要素のドラッグを実装する</h2>



<p>Element.drag() を使う事で、要素のドラッグに必要な<br />
マウスダウン時、マウスムーブ時、マウスアップ時のイベントをまとめて設定できます。<br />
ただし、ActionScriptのstartDrag()のように要素の移動まで面倒みてくれるわけではないので、<br />
各イベントハンドラにそれらを実装してあげる必要があります。</p>



<h3 class="wp-block-heading">Element.drag()</h3>



<dl>
<dt>Element.drag( onmove, onstart, onend );</dt>
<dd><em>onmove</em> (Function) マウスムーブ時の処理<br />
<em>onstart</em> (Function) ドラッグ開始時の処理（マウスダウン）<br />
<em>onend</em> (Function) ドラッグ終了時の処理（マウスアップ）</dd>
</dl>



<p>これらのコールバックは全て渡される引数が違うので注意が必要です。<br />
特におさえておくべきは、第一引数のonmoveです。</p>



<h3 class="wp-block-heading">onmove</h3>



<dl>
<dt>onmove : function( dx, dy, x, y, event )</dt>
<dd><em>dx</em> : ドラッグ開始位置からの相対的座標（x）<br />
<em>dy</em> : ドラッグ開始位置からの相対的座標（y）<br />
<em>x</em> : 現在のx座標<br />
<em>y</em> : 現在のy座標<br />
<em>event</em> : イベントオブジェクト</dd>
</dl>



<p>わざわざ相対的座標を渡しているのは、<br />
マウス座標をそのまま要素のx,y座標に代入してしまうと<br />
予想と違う位置に要素が移動してしまう為。<br />
どの部分をクリックしてドラッグしても、<br />
要素はマウスの右下にぶらさがる形になってしまいますね。</p>



<p>つまり、こんなかんじになるでしょう。</p>



<ol class="wp-block-list">
<li>onstartでドラッグ前の要素の座標を記録しておく</li>



<li>onmoveで、1.で記録した座標と相対的座標をあわせて計算</li>
</ol>



<pre class="wp-block-preformatted">(function(){
    var paper, myRect;

    paper = new Raphael( "paper", 640, 480 );
    myRect = paper.rect( 100, 100, 32, 32 )
        .attr( { fill : "#345", stroke : "none" } );

    myRect.drag(
        /**
         * マウスムーブ時の処理
         */
        function( dx, dy, x, y, e ){
            /**
             * Element.data() で初期の座標を取り出して
             * dx, dyを加算して移動
             */
            this.attr({
                x : this.data("x") + dx,
                y : this.data("y") + dy
            });
        },
        /**
         * ドラッグ開始時の処理
         */
        function( x, y, e ){
            /**
             * 要素の座標をElement.data()で記録
             */
            this.data( "x", this.attr("x") );
            this.data( "y", this.attr("y") );
            this.attr( "fill", "#c00" );
        },
        /**
         * ドラッグ終了時の処理
         */
        function( e ){
            this.attr( "fill", "#345" );
        }
    );
})();
</pre>



<h3 class="wp-block-heading">jQueryのようなdata()が便利</h3>



<p>RaphaelのElementオブジェクトには<br />
jQuery.data() と似たような機能が同名のメソッドで実装されていて、<br />
上記のコールバック内で使われているように<br />
情報を保持しておくのに便利です。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-comment">// 値の設定</span>
myElement.data( <span class="hljs-string">"foo"</span>, <span class="hljs-string">"bar"</span> );
<span class="hljs-comment">// 値の取得</span>
<span class="hljs-built_in">console</span>.log( my.Element.data( <span class="hljs-string">"foo"</span> ) ); <span class="hljs-comment">// =&gt; bar</span>
</code></span></pre>


<h2 class="wp-block-heading">デモ</h2>



<p>デモをこちらにまとめました。</p>



<p>» <a href="http://jsfiddle.net/mach3ss/UJE3N/1/">はじめてのRaphael(2) : イベント編 via jsFiddle</a></p>



<p><iframe style="width: 100%; height: 300px" src="http://jsfiddle.net/mach3ss/UJE3N/1/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe></p>



<h2 class="wp-block-heading">まとめ</h2>



<p>Raphaelは、意外とjQueryのメソッドと共通点があり、<br />
導入にあまり苦労しなさそうで助かります。<br />
描画とイベントが操れれば、簡単なRUIを実現できてしまいますね。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>はじめてのRaphael (1) : お絵かき編</title>
		<link>https://blog.mach3.jp/2011/12/06/get-started-with-raphael-01.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Tue, 06 Dec 2011 07:41:40 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Raphael]]></category>
		<category><![CDATA[SVG]]></category>
		<category><![CDATA[XML]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=2140</guid>

					<description><![CDATA[SVGが少しずつ市民権を獲得し始めている昨今のWWWですが、 Raphaelとは、そのSVGをコントロールするのに非常に便利なライブラリです。 公式によさげなチュートリアルがなかったのもあり、 今回はその使い方をまとめて [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>SVGが少しずつ市民権を獲得し始めている昨今のWWWですが、<br />
Raphaelとは、そのSVGをコントロールするのに非常に便利なライブラリです。<br />
公式によさげなチュートリアルがなかったのもあり、<br />
今回はその使い方をまとめてみようという試み。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh5.googleusercontent.com/-Dz76C91TtBw/Tt3G7jLx-eI/AAAAAAAABag/mLOuNHHj_8g/s400/201112061638.png" alt="はじめてのRaphael (1) : お絵かき編"/></figure>



<p></p>



<span id="more-2140"></span>



<h2 class="wp-block-heading">Raphaelとは</h2>



<p>RaphaelはSVGで図を描画するためのフレームワークです。<br />
正しくは「Raphaël」と書きますが、<br />
毎度めんどくさいのでRaphaelでいきます。</p>



<h3 class="wp-block-heading">なにをしてくれるのか</h3>



<ul class="wp-block-list">
<li>SVGが動かないクラシックなIE環境の為に、VMLでも出力してくれます。</li>



<li>イベントやアニメーションまわりも簡単に実装できるようになっています。</li>
</ul>



<p>特に助かるのがVML対応。<br />
旧ブラウザをサポートしなければならないケースには、<br />
ぜひとも導入したいライブラリですね。</p>



<h2 class="wp-block-heading">極めてシンプルな例</h2>



<p>Rraphaelで図を描画する手順は、ざっくりとこんな感じ。</p>



<ol class="wp-block-list">
<li>まず紙（paper）を用意する</li>



<li>その紙に図を描く。<br /><br />矩形（rect）や円形（circle）等、基本となるシンプルな図形はステンシルが用意されています。<br /><br />そうでない物は、フリーハンド（path）で描く事ができます。</li>



<li>描かれた図に、色や線種等のスタイルを設定します。</li>
</ol>



<h3 class="wp-block-heading">HTML</h3>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"my-paper-0"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
</code></span></pre>


<h3 class="wp-block-heading">JavaScript</h3>


<pre class="wp-block-code"><span><code class="hljs language-php">(<span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">()</span></span>{
    <span class="hljs-comment">/**
    * &#91;1] Raphael()でキャンバス（paper）をつくる
    */</span>
    <span class="hljs-keyword">var</span> paper = Raphael( <span class="hljs-string">"my-paper-0"</span>, <span class="hljs-number">64</span>, <span class="hljs-number">64</span> );
    <span class="hljs-comment">/**
    * &#91;2] circle()で円を描画し、
    * &#91;3] attr()で属性を設定する
    */</span>
    paper.circle( <span class="hljs-number">32</span>, <span class="hljs-number">32</span>, <span class="hljs-number">24</span> )
       .attr( { fill : <span class="hljs-string">"#345"</span>, stroke : <span class="hljs-string">"none"</span> } );
})();
</code></span></pre>


<p>Raphael() は、Paperというオブジェクトを返します。<br />
図の描画は、そのPaperオブジェクトが持つメソッドを通して行う事になります。</p>



<h2 class="wp-block-heading">基本図形を描いてみる</h2>



<p>矩形（rect）、円形（circle）、楕円形（ellipse）等の基本図形は、<br />
Paperのメソッドを使って簡単に描画する事ができます。</p>



<h3 class="wp-block-heading">円形</h3>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-comment">/**
 * Paper.circle( x, y, radius );
 */</span>
<span class="hljs-selector-tag">paper</span><span class="hljs-selector-class">.circle</span>( 32, 32, 24 );
</code></span></pre>


<h3 class="wp-block-heading">矩形</h3>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">/**
 * Paper.rect( x, y, width, height, radius );
 */</span>
paper.rect( <span class="hljs-number">8</span>, <span class="hljs-number">8</span>, <span class="hljs-number">48</span>, <span class="hljs-number">48</span> ); <span class="hljs-comment">// 普通の矩形</span>
paper.rect( <span class="hljs-number">8</span>, <span class="hljs-number">8</span>, <span class="hljs-number">48</span>, <span class="hljs-number">48</span>, <span class="hljs-number">8</span> ); <span class="hljs-comment">// 半径8の角丸矩形</span>
</code></span></pre>


<h3 class="wp-block-heading">楕円形</h3>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-comment">/**
 * Paper.ellipse( x, y, horizontalRadius, virticalRadius );
 */</span>
<span class="hljs-selector-tag">paper</span><span class="hljs-selector-class">.ellipse</span>( 32, 32, 16, 24 );
</code></span></pre>


<h2 class="wp-block-heading">Pathで自由に描いてみる</h2>



<p>イラレ等の「ペンツール」のような感じで自由に図を描く事ができるのが、<br />
Paper.path()メソッドです。 まずはシンプルな三角形で例を示してみましょう。</p>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-comment">/**
 * Paper.path( pathString );
 */</span>
<span class="hljs-selector-tag">paper</span><span class="hljs-selector-class">.path</span>( "<span class="hljs-selector-tag">M32</span>,8<span class="hljs-selector-tag">L56</span>,56<span class="hljs-selector-tag">H8L32</span>,8<span class="hljs-selector-tag">Z</span>" );
</code></span></pre>


<p>path() の引数には、SVGで定義されているPath要素のコマンドを渡します。<br />
文法は非常にシンプルで、アルファベット一文字で表されるコマンド毎に切り分けられます。<br />
上記コードのコマンドを分解してみると…</p>



<ol class="wp-block-list">
<li><em>&#8220;M32,8&#8221;</em> : 32,8に移動する（MoveTo）</li>



<li><em>&#8220;L56,56&#8221;</em> : 現在地から56,56まで線を描画する（LineTo）</li>



<li><em>&#8220;H8&#8221;</em> : x座標8まで水平線を描画する（HorizontalLineTo）</li>



<li><em>&#8220;L32,8&#8221;</em> : 32,8まで線を描画する（LineTo）</li>



<li><em>&#8220;Z&#8221;</em> : パスを閉じる</li>
</ol>



<p>これらを一気に書いて表した感じですね。</p>



<h3 class="wp-block-heading">コマンド（抜粋）</h3>



<dl>
<dt>M (MoveTo)</dt>
<dd>座標（x,y）に移動します</dd>
<dt>L (LineTo)</dt>
<dd>座標（x,y）まで線を描画します</dd>
<dt>H (HorizontalLineTo)</dt>
<dd>座標（x）まで水平線を描画します</dd>
<dt>V（VirticalLineTo)</dt>
<dd>座標（y）まで垂直線を描画します</dd>
<dt>C (CurveTo)</dt>
<dd>複数の座標をコントロールポイントとして引数に受け取り、ベジェ曲線を描画します。</dd>
</dl>



<p>コマンドを大文字で表記すると、座標を絶対位置として扱い、<br />
小文字で表記すると現在地からの相対位置とします。</p>



<p>それぞれのコマンドについては公式ドキュメントか、SVGの仕様書を参考にしましょう。</p>



<ul class="wp-block-list">
<li><a href="http://www.w3.org/TR/SVG/paths.html">Paths – SVG 1.1 (Second Edition)</a></li>



<li><a href="http://raphaeljs.com/reference.html#Paper.path">Raphaël Reference</a></li>
</ul>



<h3 class="wp-block-heading">もう少し複雑な例</h3>



<p>三角形よりももうすこし複雑な例として、<br />
Pathを使って矢印を描画してみます。</p>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-tag">paper</span><span class="hljs-selector-class">.path</span>( "<span class="hljs-selector-tag">M32</span>,8<span class="hljs-selector-tag">L56</span>,32<span class="hljs-selector-tag">L48</span>,40<span class="hljs-selector-tag">L40</span>,32<span class="hljs-selector-tag">V56H24V32L16</span>,40<span class="hljs-selector-tag">L8</span>,32<span class="hljs-selector-tag">L32</span>,8<span class="hljs-selector-tag">Z</span>" )
    <span class="hljs-selector-class">.attr</span>( { <span class="hljs-attribute">fill </span>: <span class="hljs-string">"#345"</span>, stroke : <span class="hljs-string">"none"</span> } );
</code></span></pre>


<h2 class="wp-block-heading">デモ</h2>



<p>デモをこちらにまとめました。<br />
ご参考までに。</p>



<ul class="wp-block-list">
<li><a href="http://jsfiddle.net/mach3ss/bkXNb/1/">はじめてのRaphael (1) : お絵かき編 via jsFiddle</a></li>
</ul>



<p><iframe style="width: 100%; height: 300px" src="http://jsfiddle.net/mach3ss/bkXNb/1/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe></p>



<h2 class="wp-block-heading">まとめ</h2>



<p>図形を描くのに色々メソッドやコマンドを覚えたりしなければいけませんが、<br />
恐らくSVGを直に書く際にも役に立つ知識なので、無駄にはならないと思います。</p>



<p>さらに複雑なものを描かなければならない時は、<br />
他の楽な方法がありますが、それはまた別の記事で。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>PHP : Webページからフィードの在り処をつきとめる</title>
		<link>https://blog.mach3.jp/2011/02/01/discover-feed-url-from-webpage.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Tue, 01 Feb 2011 02:11:20 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[Feed]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[RSS]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[XPath]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=1502</guid>

					<description><![CDATA[URLからWebページにアクセスし、フィードのURLを抽出するスクリプトを書いてみるメモ。 XPathでやってみた 「フィードをオートディスカバリーする XPath &#8211; IT戦記」を参考に DOMXpathで [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>URLからWebページにアクセスし、フィードのURLを抽出するスクリプトを書いてみるメモ。</p>



<figure class="wp-block-image"><img decoding="async" src="http://lh5.ggpht.com/_JJkNs5Ixl70/TUbrP6o7c5I/AAAAAAAABKY/2iCkkM6rRiw/201102010202.png" alt="PHP : Webページからフィードの在り処をつきとめる"/></figure>



<p></p>



<span id="more-1502"></span>



<h2 class="wp-block-heading">XPathでやってみた</h2>



<p>「<a href="http://d.hatena.ne.jp/amachang/20080808/1218171377">フィードをオートディスカバリーする XPath &#8211; IT戦記</a>」を参考に<br />
<a href="http://php.net/manual/ja/class.domxpath.php">DOMXpath</a>で処理してみました。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$doc = DOMDocument::loadHTMLFile( $url );
$xpath = <span class="hljs-keyword">new</span> DOMXpath( $doc );
</code></span></pre>


<p>DOMXPathはDOMDocumentをコンストラクタの引数に食べさせて使います。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$q = <span class="hljs-string">'/html/head/link&#91;contains(@rel, "alternate")]'</span>
    . <span class="hljs-string">'&#91;@type="application/x.atom+xml" or @type="application/atom+xml" or '</span>
    . <span class="hljs-string">'@type="application/xml" or @type="text/xml" or '</span>
    . <span class="hljs-string">'@type="application/rss+xml" or @type="application/rdf+xml"]'</span>;
$eles = $xpath-&gt;query( $q );
</code></span></pre>


<p>基本的には先述の記事と同じ処理。<br />
<em>「rel属性に&#8221;alternate&#8221;を含み、尚且つtype属性がそれっぽいlink要素をください」</em><br />
というクエリです。</p>



<p>DOMXPath::queryにクエリを渡せば実行結果をDOMNodeListで返してくれますので、<br />
こんな感じに、条件にあったlink要素の1個目のhref属性を取得。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$eles-&gt;item(<span class="hljs-number">0</span>)-&gt;getAttribute(<span class="hljs-string">"href"</span>);
</code></span></pre>


<h3 class="wp-block-heading">ファイナルコード</h3>



<dl>
<dt>関数にまとめたもの</dt>
<dd><a href="https://gist.github.com/420b0f92c210fd77d0c8">WebページからフィードのURLを抽出する。（XPath版）- GitHub</a></dd>
</dl>



<h2 class="wp-block-heading">DOMDocumentでもやってみる</h2>



<p>同じ処理を、試しに<a href="http://php.net/manual/ja/class.domdocument.php">DOMDocument</a>でも書いてみる事に。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$doc = DOMDocument::loadHTMLFile( $url );

$types = <span class="hljs-keyword">array</span>(
    <span class="hljs-string">"application/x.atom+xml"</span>,
    <span class="hljs-string">"application/atom+xml"</span>,
    <span class="hljs-string">"application/xml"</span>,
    <span class="hljs-string">"text/xml"</span>,
    <span class="hljs-string">"application/rss+xml"</span>,
    <span class="hljs-string">"application/rdf+xml"</span>
);
</code></span></pre>


<p>下準備。DOMDocumentを生成しつつ、属性値のリストを作っておく。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$feedUrl = <span class="hljs-keyword">null</span>;
$links = $doc-&gt;getElementsByTagName(<span class="hljs-string">"link"</span>);
<span class="hljs-keyword">for</span>( $i = <span class="hljs-number">0</span>; $i &lt; $links-&gt;length; $i ++ ){
    $link = $links-&gt;item( $i );
    <span class="hljs-keyword">if</span>( !stristr( $link-&gt;getAttribute(<span class="hljs-string">"rel"</span>), <span class="hljs-string">"alternate"</span> ) ||
        !in_array( $link-&gt;getAttribute(<span class="hljs-string">"type"</span>), $types ) ){ <span class="hljs-keyword">continue</span>; }
    $feedUrl = $link-&gt;getAttribute(<span class="hljs-string">"href"</span>);
    <span class="hljs-keyword">if</span>( !<span class="hljs-keyword">empty</span>($feedUrl) ){ <span class="hljs-keyword">break</span>; }
}
</code></span></pre>


<p>link要素のリストを取得してループでぐるりとまわします。<br />
何をしているのかわかりやすいですが、XPathの方がスマートな印象。</p>



<h3 class="wp-block-heading">ファイナルコード</h3>



<dl>
<dt>関数にまとめたもの。</dt>
<dd><a href="https://gist.github.com/77725d74919ace6f7475">WebページからフィードのURLを抽出する。（DOMDocument版）- GitHub</a></dd>
</dl>



<h2 class="wp-block-heading">まとめ</h2>



<p>Webページを取得してごにょごにょしたい場合はXPathが便利そう！</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>PHPでXMLの名前空間つきタグを読み込む色々</title>
		<link>https://blog.mach3.jp/2010/12/14/various-xml-on-php.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Tue, 14 Dec 2010 02:00:43 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Namespace]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[RSS]]></category>
		<category><![CDATA[SimpleXML]]></category>
		<category><![CDATA[XML]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=1239</guid>

					<description><![CDATA[PHPのSimpleXMLでRSSを読み込もうと思ったら、名前空間つきのタグが読み込めなかったので、色々な方法を試してみた備忘録。 実験の対象として、はてなブックマークのホットエントリのRSSを使ってみます。 Simpl [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>PHPのSimpleXMLでRSSを読み込もうと思ったら、名前空間つきのタグが読み込めなかったので、色々な方法を試してみた備忘録。</p>



<figure class="wp-block-image"><img decoding="async" src="http://lh4.ggpht.com/_JJkNs5Ixl70/TQYhLrkHwpI/AAAAAAAABHE/fvW42rTywRo/201012132235.png" alt="PHPでXMLの名前空間つきタグを読み込む色々"/></figure>



<p></p>



<span id="more-1239"></span>



<p>実験の対象として、はてなブックマークのホットエントリのRSSを使ってみます。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$url = <span class="hljs-string">"http://b.hatena.ne.jp/hotentry.rss"</span>;
$str = file_get_contents( $url );
</code></span></pre>


<h2 class="wp-block-heading">SimpleXMLを使う方法</h2>



<p>普通にSimpleXMLで読み込むと、<dc:date>や<hatena:bookmarkcount>など、<em>名前空間</em>プレフィックスつきのタグを読み込むことが出来ません。</hatena:bookmarkcount></dc:date></p>


<pre class="wp-block-code"><span><code class="hljs language-php">$simplexml = simplexml_load_string( $str );
var_dump( $simplexml );
</code></span></pre>


<figure class="wp-block-image"><img decoding="async" src="http://lh3.ggpht.com/_JJkNs5Ixl70/TQYh-Hhc3gI/AAAAAAAABHI/4b57ADi-xzg/201012132234.png" alt="消えてしまう名前空間プレフィックスつきタグ"/></figure>



<p></p>



<p>SimpleXMLで名前空間つきタグを扱うには、childrenメソッドを使います。例えば、<em><hatena:bookmarkcount></hatena:bookmarkcount></em>の値を取得する場合、 次のように掘っていく必要があります。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$simplexml-&gt;item&#91;$i]-&gt;children(<span class="hljs-string">"hatena"</span>, <span class="hljs-keyword">true</span>)-&gt;bookmarkcount;
</code></span></pre>


<p>ループでitem要素全てまとめて処理してみます。 それぞれのitem要素にhatena-&gt;bookmarkcountが追加されます。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$simplexml = simplexml_load_string( $str );
$i = count( $simplexml-&gt;item );
<span class="hljs-keyword">while</span>( $i-- ){
    $simplexml-&gt;item&#91;$i]-&gt;hatena-&gt;bookmarkcount = $simplexml-&gt;item&#91;$i]-&gt;children(<span class="hljs-string">"hatena"</span>, <span class="hljs-keyword">true</span>)-&gt;bookmarkcount;
}
var_dump( $simplexml );
</code></span></pre>


<h2 class="wp-block-heading">DOMDocumentクラスを使う</h2>



<p>DOM文書を読み込むためのDOMDocumentクラスを使ってみます。 JavaScriptでも使うような、<em>getElementsByTagName</em>なんていうお馴染みのメソッドを使って文書構造を掘っていきます。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$dom = DOMDocument::loadXML( $str );
<span class="hljs-keyword">foreach</span>( $dom-&gt;getElementsByTagName(<span class="hljs-string">"item"</span>) <span class="hljs-keyword">as</span> $item ){
    <span class="hljs-keyword">foreach</span>( $item-&gt;childeNodes <span class="hljs-keyword">as</span> $node ){
        <span class="hljs-keyword">if</span>( $node-&gt;nodeType === <span class="hljs-number">1</span> ){
            <span class="hljs-keyword">echo</span> <span class="hljs-string">"{$node-&gt;nodeName} : {$node-&gt;nodeValue}"</span>;
        }
    }
}
</code></span></pre>


<p><strong>nodeType</strong>には、ノードの種類が整数で渡されています。上で言う「1」はエレメントノードですね。 勿論、プレフィックスつきのタグも問題なく読み込めます。</p>



<p>cf) <a href="http://www.php.net/manual/ja/dom.constants.php">PHP: 定義済み定数 &#8211; Manual</a></p>



<p>出力時に楽なように、エントリーをまとめて一つの配列に突っ込んでみます。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$dom = DOMDocument::loadXML( $str );
$entries = <span class="hljs-keyword">array</span>();
<span class="hljs-keyword">foreach</span>( $dom-&gt;getElementsByTagName( <span class="hljs-string">"item"</span> ) <span class="hljs-keyword">as</span> $item ){
    $entry = <span class="hljs-keyword">array</span>();
    <span class="hljs-keyword">foreach</span>( $item-&gt;childNodes <span class="hljs-keyword">as</span> $node ){
        <span class="hljs-keyword">if</span>( $node-&gt;nodeType !== <span class="hljs-number">1</span> ) <span class="hljs-keyword">continue</span>;
        <span class="hljs-keyword">if</span>( $item-&gt;getElementsByTagName( $node-&gt;nodeName )-&gt;length &gt; <span class="hljs-number">1</span> ){
            <span class="hljs-keyword">if</span>( !<span class="hljs-keyword">isset</span>( $entry&#91; $node-&gt;nodeName ] ) ){
                $entry&#91; $node-&gt;nodeName ] = <span class="hljs-keyword">array</span>();
            }
            array_push( $entry&#91; $node-&gt;nodeName ], $node-&gt;nodeValue );
        } <span class="hljs-keyword">else</span> {
            $entry&#91; $node-&gt;nodeName ] = $node-&gt;nodeValue;
        }
    }
    array_push( $entries, $entry );
}
var_dump( $entries );
</code></span></pre>


<p>複数あるタグは配列で対応。書いてみたものの…DOMDocumentのまま使った方が使いやすい気もしたり。<br />
むしろこういう使い方するならSimpleXML使った方がよいですね。</p>



<h2 class="wp-block-heading">XMLReaderクラスを使う</h2>



<p>SimpleXMLやDOMDocumentが、XMLの情報をドッカンと丸ごとメモリに置いておくのに大して、<br />
XMLReaderはfopenのようにポインタの位置だけを保持しておく為、メモリに優しく高速。らしい。<br />
ですが、ポインタの位置だけだと正直使い辛いのも事実。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$xml = XMLReader::load( $url, <span class="hljs-keyword">null</span>, LIBXML_NOBLANKS );
<span class="hljs-keyword">while</span>( $xml-&gt;read() ){
    <span class="hljs-keyword">echo</span> <span class="hljs-string">"{$xml-&gt;nodeType} : {$xml-&gt;name} = {$xml-&gt;value} @ {$xml-&gt;depth} &lt;br /&gt;"</span>;
}
</code></span></pre>


<p>$xml-&gt;read()でノードを一つずつ読み進んでいく感じ。<br />
多階層なXMLを読んでいくのは骨が折れそう。<br />
これは重た～いXMLを読まなきゃいけない時用の代物ですね。</p>



<h2 class="wp-block-heading">まとめ</h2>



<p>名前に違わず相当楽ですね、SimpleXML。<br />
名前空間つきのタグも処理したい場合等は、DOMDocumentの方がシンプルに処理出来そう。<br />
XMLReaderはパフォーマンスを意識したい場合に。</p>



<p>上手に使い分けたいですね！</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<dl>
<dt>2010/12/18</dt>
<dd>マニュアルのリンクを修正</dd>
</dl>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>AS3備忘録: 設定用のXMLファイルへのパスをflashvarsで指定する</title>
		<link>https://blog.mach3.jp/2010/05/16/as3-xml-on-flashvars.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Sun, 16 May 2010 23:58:00 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[XML]]></category>
		<guid isPermaLink="false">http://lab.mach3.jp/2010/05/16/as3%e5%82%99%e5%bf%98%e9%8c%b2-%e8%a8%ad%e5%ae%9a%e7%94%a8%e3%81%aexml%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%b8%e3%81%ae%e3%83%91%e3%82%b9%e3%82%92flashvars%e3%81%a7%e6%8c%87%e5%ae%9a%e3%81%99.html</guid>

					<description><![CDATA[先日取引先から、納品したFlashについて問い合わせがありまして、 「設定用のXMLファイルの場所をswfと一緒に移動したら動かなくなった」とのこと。 XMLファイルへのパスをスタティックに指定してしまうと、 こういう事 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>先日取引先から、納品したFlashについて問い合わせがありまして、<br />
<em>「設定用のXMLファイルの場所をswfと一緒に移動したら動かなくなった」</em>とのこと。</p>



<p>XMLファイルへのパスをスタティックに指定してしまうと、<br />
こういう事態に対処出来なくなり、メンテナンス性を欠くのでは？<br />
という事でflashvarsでXMLファイルへのパスを渡す方式にして解決しました。</p>



<span id="more-37"></span>



<p>こんな感じでflashvarsは渡してあげます。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">param</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"flashvars"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"xmlpath=/the/path/to/"</span> /&gt;</span>
</code></span></pre>


<p>AS3で受け取ります。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Main</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">MovieClip</span></span>{
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">Main</span><span class="hljs-params">()</span> </span>{
        <span class="hljs-keyword">var</span> xmlpath = loaderInfo.parameters&#91;<span class="hljs-string">"xmlpath"</span>];
        <span class="hljs-keyword">var</span> ul:URLLoader = <span class="hljs-keyword">new</span> URLLoader;
        ul.addEventListener(Event.COMPLETE, onXmlLoaded);
        ul.load( <span class="hljs-keyword">new</span> URLRequest( xmlpath + <span class="hljs-string">"config.xml"</span> ) );
    }
    <span class="hljs-keyword">private</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">onXmlLoaded</span><span class="hljs-params">(e:Event)</span>:<span class="hljs-title">void</span></span>{
        <span class="hljs-comment">// do something</span>
    }
}
</code></span></pre>


<p>モノによってはそうすべきではないケースもあるかもしれませんが、<br />
お客さんが直接手作業で更新するようなローテーションバナー等は<br />
こういう仕様にしてあげたほうが安心ですね。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>AS3備忘録: XML読み込み～BulkLoaderで一括ロード</title>
		<link>https://blog.mach3.jp/2010/04/01/as3-bulkloader-xml.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Thu, 01 Apr 2010 21:19:00 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[XML]]></category>
		<guid isPermaLink="false">http://lab.mach3.jp/2010/04/01/as3%e5%82%99%e5%bf%98%e9%8c%b2-xml%e8%aa%ad%e3%81%bf%e8%be%bc%e3%81%bf%ef%bd%9ebulkloader%e3%81%a7%e4%b8%80%e6%8b%ac%e3%83%ad%e3%83%bc%e3%83%89.html</guid>

					<description><![CDATA[XMLでリストを読み込み、画像をロードする… というのはFlashコンテンツを作る上でかなり頻出する処理ですが、 それを簡易化する「BulkLoader」が広く知られています。 今日はXML読み込みからBulkLoade [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>XMLでリストを読み込み、画像をロードする…<br />
というのはFlashコンテンツを作る上でかなり頻出する処理ですが、<br />
それを簡易化する「BulkLoader」が広く知られています。</p>



<figure class="wp-block-image"><img decoding="async" src="http://lh6.ggpht.com/_JJkNs5Ixl70/S7SCqdAAwPI/AAAAAAAAA58/lTQ1Rd_ncKI/201004012020.png" alt="BulkLoader"/></figure>



<p></p>



<p>今日はXML読み込みからBulkLoaderによる一括ロードまでを<br />
軽く備忘録しておきます。</p>



<p><a href="http://code.google.com/p/bulk-loader/">bulk-loader &#8211; Project Hosting on Google Code</a></p>



<figure class="wp-block-image"><img decoding="async" src="http://lh3.ggpht.com/_JJkNs5Ixl70/S7SBxv-0cLI/AAAAAAAAA58/OVm1-BieK8g/201004012015.png" alt="BulkLoader"/></figure>



<p></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>BulkLoaderは、複雑なローディング処理をより簡単に行う為に書かれたAS3ライブラリです。</p>
</blockquote>



<p>早速、手順を追って書いてみるとします。</p>



<h2 class="wp-block-heading">1. ライブラリをインポートするなど</h2>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-tag">import</span> <span class="hljs-selector-tag">br</span><span class="hljs-selector-class">.com</span><span class="hljs-selector-class">.stimuli</span><span class="hljs-selector-class">.loading</span>.*;
</code></span></pre>


<p>保存場所に注意。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">private</span> <span class="hljs-keyword">var</span> imagelist:XMLList;
</code></span></pre>


<p>URLのリストを格納しておく用の変数を準備しておきます。</p>



<h2 class="wp-block-heading">2. XMLをロードする</h2>



<p>XMLのロードはBulkLoaderを使わずにシンプルに書きます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> ul:URLLoader = <span class="hljs-keyword">new</span> URLLoader;
ul.addEventListener(Event.COMPLETE, onXmlLoaded);
ul.load( <span class="hljs-keyword">new</span> URLRequest(<span class="hljs-string">"list.xml"</span>) );
</code></span></pre>


<p>読み込むXMLはこんなのにしておきます。<br />
実際はもうちょっと複雑な物になると思われますが…</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-meta">&lt;?xml version="1.0" charset="utf-8" ?&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">data</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">items</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">item</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"1"</span>&gt;</span>images/a.png<span class="hljs-tag">&lt;/<span class="hljs-name">item</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">item</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"2"</span>&gt;</span>images/b.png<span class="hljs-tag">&lt;/<span class="hljs-name">item</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">item</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"3"</span>&gt;</span>images/c.png<span class="hljs-tag">&lt;/<span class="hljs-name">item</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">items</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">data</span>&gt;</span>
</code></span></pre>


<h2 class="wp-block-heading">3. 読み込んだXMLを処理する</h2>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">private</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">onXmlLoaded</span><span class="hljs-params">(e:Event)</span>:<span class="hljs-title">void</span> </span>{
    <span class="hljs-keyword">var</span> data:XML = <span class="hljs-keyword">new</span> XML(e.target.data);
    imagelist = <span class="hljs-keyword">new</span> XMLList( data.items.item );
    <span class="hljs-keyword">var</span> bloader = <span class="hljs-keyword">new</span> BulkLoader(<span class="hljs-string">"imageloader"</span>);
    <span class="hljs-keyword">var</span> item:*;
    <span class="hljs-keyword">for</span> each( item in imagelist) {
        bloader.add( item.toString() );
    }
    bloader.addEventListener(BulkProgressEvent.COMPLETE, onImagesLoaded);
    bloader.addEventListener(BulkProgressEvent.PROGRESS, onImageProgress);
    bloader.addEventListener(BulkLoader.ERROR, onImageError);
    bloader.start();
}
</code></span></pre>


<p>BulkLoaderのコンストラクタには、ユニークな名前をつけてあげます。<br />
（ここでは<em>imageloader</em>）</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> bloader = <span class="hljs-keyword">new</span> BulkLoader(<span class="hljs-string">"imageloader"</span>);
</code></span></pre>


<p>itemにはURL文字列が格納されたXMLオブジェクトが入っているので、<br />
<em>toString()</em> でStringに変えてあげましょう。<br />
URLを<em>BulkLoader.add</em>につっこむと、BulkLoaderの読み込みリストに追加されます。</p>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-tag">bloader</span><span class="hljs-selector-class">.add</span>( <span class="hljs-selector-tag">item</span><span class="hljs-selector-class">.toString</span>() );
</code></span></pre>


<p>イベントは、<em>complete</em>と<em>progress</em>が登録できます。<br />
APIドキュメントのイベントには記述されていませんが、<em>error</em>イベントも受け取る事もできます。</p>



<p><em>BulkLoader.start</em>で読み込み処理が開始されます。<br />
URLLoader.loadみたいなもの。</p>



<h2 class="wp-block-heading">4. イベントハンドラ</h2>



<h3 class="wp-block-heading">progressイベント</h3>


<pre class="wp-block-code"><span><code class="hljs language-javascript">private <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">onImageProgress</span>(<span class="hljs-params">e:Event</span>):<span class="hljs-title">void</span> </span>{
    trace( <span class="hljs-built_in">Math</span>.floor((e.target.percentLoaded * <span class="hljs-number">100</span>)) + <span class="hljs-string">"%"</span> );
}
</code></span></pre>


<p>BulkLoader.parcentLoaded で全体の読み込み率を取得できます。<br />
BulkLoader.bytesTotal, bytesLoadedもあるのでこちらも活用できますね。</p>



<h3 class="wp-block-heading">errorイベント</h3>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">private</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">onImageError</span><span class="hljs-params">(e:Event)</span>:<span class="hljs-title">void</span> </span>{
    trace(e.target.getFailedItems());
}
</code></span></pre>


<p>読み込みエラーが発生した時に呼ばれます。<br />
BulkLoader.getFailedItemsでエラーの出たアイテムの情報が取得できます。</p>



<h2 class="wp-block-heading">5. 完了時の処理</h2>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">private</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">onImagesLoaded</span><span class="hljs-params">(e:Event)</span>:<span class="hljs-title">void</span> </span>{
    <span class="hljs-keyword">var</span> item:*;
    <span class="hljs-keyword">var</span> bmp:DisplayObject;
    <span class="hljs-keyword">var</span> margin:int = <span class="hljs-number">10</span>;
    <span class="hljs-keyword">var</span> point:Point = <span class="hljs-keyword">new</span> Point( margin, margin );
    <span class="hljs-keyword">for</span> each( item in imagelist ) {
        bmp = addChild( e.target.getBitmap(item.toString() ) );
        bmp.x = point.x;
        bmp.y = point.y;
        point.x += bmp.width + margin;
    }
}
</code></span></pre>


<p>10ピクセルの余白ごとにぺたぺたと横に画像を連ねるだけの簡単な処理をしています。<br />
ポイントは、<em>BulkLoader.getBitmap()</em>。</p>


<pre class="wp-block-code"><span><code class="hljs">bmp = addChild( e.target.getBitmap(item.toString() ) );
</code></span></pre>


<p>このメソッドに登録時につっこんだURLを入れると、<br />
そのURLの画像をBitmapオブジェクトで引っ張ってきてくれます。なんて便利な。</p>



<p>他の形式で受け取りたい場合は、色々と用意されています。<br />
<em>getMovieClip, getSound, getSprite, getText,<br />
getXML, getBitmapData, getContent, getBinary</em><br />
などなどなど。<br />
汎用的な<em>get</em>なんていうメソッドもあります。<br />
読み込んだファイルに応じて最適なものを使えば良いですね。</p>



<p>より詳しくは公式のドキュメントをご覧ください。<br />
<a href="http://code.google.com/p/bulk-loader/w/list">Wiki Pages &#8211; bulk-loader &#8211; Project Hosting on Google Code</a></p>



<p>本当は自分で似たようなのを書いてたんですが、<br />
あまりにもこっちが便利なので愛用することに。<br />
書く前に検索すればよいのですが、勉強になるので結果オーライです。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>AS3備忘録: XMLをロードする</title>
		<link>https://blog.mach3.jp/2010/03/29/as3-load-xml.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Mon, 29 Mar 2010 23:04:00 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Adobe]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[XML]]></category>
		<guid isPermaLink="false">http://lab.mach3.jp/2010/03/29/as3%e5%82%99%e5%bf%98%e9%8c%b2-xml%e3%82%92%e3%83%ad%e3%83%bc%e3%83%89%e3%81%99%e3%82%8b.html</guid>

					<description><![CDATA[人は忘れていく生き物。 必要になる度に細部を忘れていたりしてリファレンス見たりしちゃうので、 この際ログっておきます。AS3でのXMLロード。 メインに使われるのはURLLoaderクラス。 flash.net.URLL [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>人は忘れていく生き物。<br />
必要になる度に細部を忘れていたりしてリファレンス見たりしちゃうので、<br />
この際ログっておきます。AS3でのXMLロード。</p>



<span id="more-80"></span>



<p>メインに使われるのはURLLoaderクラス。<br />
<a href="http://livedocs.adobe.com/flash/9.0_jp/ActionScriptLangRefV3/flash/net/URLLoader.html">flash.net.URLLoader (ActionScript 3.0)</a></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>URLLoader クラスは、指定した URL からテキスト、バイナリデータ、または URL エンコード形式の変数をダウンロードする際に使用します。動的なデータ駆動アプリケーションで使用するテキストファイル、XML、その他の情報をダウンロードする場合に便利です。</p>
</blockquote>



<p>XMLやテキストファイルはもちろん、画像などのバイナリデータのロードにも活用します。<br />
画像等の場合はLoaderを使ったりもできますが、Loaderはロード完了時にイベント等を拾えないので<br />
ローディングインジケータなんかを付けたい場合はやはりURLLoaderを使うことになります。</p>



<p>基本はこうですね。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> ul:URLLoader = <span class="hljs-keyword">new</span> URLLoader;
ul.addEventListener(Event.COMPLETE, xmlOnComplete);
<span class="hljs-keyword">var</span> req:URLRequest = <span class="hljs-keyword">new</span> URLRequest(<span class="hljs-string">"content.xml"</span>);
ul.load(req);
</code></span></pre>


<p>loadメソッドの引数にはURLObjectを使用します。<br />
※私はよく勢いでURLをそのままぶち込んでしまってエラー吐かせます（!!）<br />
xmlOnLoadedにはロード完了時のイベントハンドラを登録します。<br />
イベントハンドラの引数にはEventオブジェクトが渡されるので、きちんと受け取りましょう。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">xmlOnComplete</span><span class="hljs-params">(e:Event)</span>:<span class="hljs-title">void</span></span>{
    trace(<span class="hljs-string">"---XML successfully loaded---"</span>);
    <span class="hljs-keyword">var</span> xml:XML = <span class="hljs-keyword">new</span> XML(e.target.data);
    <span class="hljs-comment">// do something</span>
}
</code></span></pre>


<p>e.targetにはイベント配布元のURLLoaderさんが格納されているので、<br />
e.target.dataからXMLの内容を受け取る事ができます。<br />
XML関数でXMLオブジェクトにしたら、あとは煮るなり焼くなり好きにしてください。<br />
XMLオブジェクトの美味しい煮方焼き方は下記を参考にしてください。</p>



<ul class="wp-block-list">
<li><a href="http://livedocs.adobe.com/flash/9.0_jp/ActionScriptLangRefV3/XML.html">XML &#8211; ActionScript 3.0 コンポーネントリファレンスガイド</a></li>



<li><a href="http://itpro.nikkeibp.co.jp/article/COLUMN/20080507/300850/">第18回　ActionScript3.0でXMLデータを扱うための基礎 &#8211; Flash CS3入門　基本からActionScriptまで：ITpro</a></li>
</ul>



<p>URLLoaderオブジェクトは、完了時のcompleteの他にも様々なイベントを配信します。<br />
エラー処理等をする場合にはこれらを活用しましょう。</p>



<dl>
<dt>httpStatus</dt>
<dd>URLLoader.load() を呼び出して HTTP 経由でデータへのアクセスを試みたときに Flash Player がその要求のステータスコードを検出して返すことが可能な環境にある場合に送出されます。（flash.events.HTTPStatusEvent）</dd>
<dt>ioError</dt>
<dd>URLLoader.load() の呼び出し時に致命的なエラーが発生してダウンロードが終了した場合に送出されます。（flash.events.IOErrorEvent）</dd>
<dt>open</dt>
<dd>URLLoader.load() メソッドの呼び出しによりダウンロード処理が開始されると送出されます。</dd>
<dt>progress</dt>
<dd>ダウンロード処理を実行中にデータを受信したときに送出されます。（flash.events.ProgressEvent）</dd>
</dl>



<p>スクリプトをまとめるとこんな感じです。</p>



<h3 class="wp-block-heading">ActionScript</h3>


<pre class="wp-block-code"><span><code class="hljs language-php">package{
    import flash.events.&lt;em&gt;;
    import flash.display.&lt;/em&gt;;
    import flash.net.*;
    <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">main</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Sprite</span></span>{
        <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">main</span><span class="hljs-params">()</span>:<span class="hljs-title">void</span></span>{
            <span class="hljs-keyword">var</span> ul:URLLoader = <span class="hljs-keyword">new</span> URLLoader;
            ul.addEventListener(Event.COMPLETE, xmlOnComplete);
            <span class="hljs-keyword">var</span> req:URLRequest = <span class="hljs-keyword">new</span> URLRequest(<span class="hljs-string">"content.xml"</span>);
            ul.load(req);
        }
        <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">xmlOnComplete</span><span class="hljs-params">(e:Event)</span>:<span class="hljs-title">void</span></span>{
            trace(<span class="hljs-string">"--load complete--"</span>);
            <span class="hljs-keyword">var</span> xml:XML = <span class="hljs-keyword">new</span> XML(e.target.data);
            trace(<span class="hljs-string">"appls's price : "</span> + xml.items.item.(name==<span class="hljs-string">"apple"</span>).price);
        }
    }
}
</code></span></pre>


<h3 class="wp-block-heading">XML</h3>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-meta">&lt;?xml version="1.0" charset="utf-8" ?&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">data</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">items</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">item</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"1"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">name</span>&gt;</span>apple<span class="hljs-tag">&lt;/<span class="hljs-name">name</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">price</span>&gt;</span>1000<span class="hljs-tag">&lt;/<span class="hljs-name">price</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">item</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">item</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"2"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">name</span>&gt;</span>orange<span class="hljs-tag">&lt;/<span class="hljs-name">name</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">price</span>&gt;</span>1500<span class="hljs-tag">&lt;/<span class="hljs-name">price</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">item</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">item</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"3"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">name</span>&gt;</span>grape<span class="hljs-tag">&lt;/<span class="hljs-name">name</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">price</span>&gt;</span>2000<span class="hljs-tag">&lt;/<span class="hljs-name">price</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">item</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">items</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">data</span>&gt;</span>
</code></span></pre>]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
