<?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>Server &#8211; Mach3.laBlog</title>
	<atom:link href="https://blog.mach3.jp/tag/server/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.mach3.jp</link>
	<description></description>
	<lastBuildDate>Fri, 30 Oct 2015 09:03:49 +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>SSIを手元の環境で再現してみる実験</title>
		<link>https://blog.mach3.jp/2015/10/30/easy-ssi.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Fri, 30 Oct 2015 09:03:49 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[Server]]></category>
		<category><![CDATA[Server Side Include]]></category>
		<category><![CDATA[SSI]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=4149</guid>

					<description><![CDATA[SSI（サーバーサイドインクルード）を使用したページの制作時、 いちいち Apache を立ち上げて動作確認するのが面倒だと感じる事はないでしょうか。 今回は手元の環境で簡単な似非SSIを再現してみる実験の話です。 SS [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>SSI（サーバーサイドインクルード）を使用したページの制作時、 いちいち Apache を立ち上げて動作確認するのが面倒だと感じる事はないでしょうか。 今回は手元の環境で簡単な似非SSIを再現してみる実験の話です。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/-_FFonSWfMyg/VjMxaQZ7O4I/AAAAAAAADA0/YB0H4qobLbA/s400-Ic42/2015-1030-00.png" alt="SSIを手元の環境で再現してみる実験"/></figure>



<p></p>



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



<h2 class="wp-block-heading">SSIについて</h2>



<p>SSIそのものについては周知の事と思いますが、 HTMLのコメントノードを使ってサーバ側でコンテンツをインクルードする仕組みです。 例えば、HTML内に次のようなコメントを書いておきます。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-comment">&lt;!--#include virtual="/common/header.html"--&gt;</span>
</code></span></pre>


<p>そうすると、サーバ側で自動的に <strong>/common/header.html</strong> をその部分に読み込んだHTMLを吐き出してくれます。</p>



<p>Apache等のSSIに対応したWebサーバで閲覧すれば良いだけの話ですが、 その為にApacheを用意するのもいささか面倒に感じる事もあるでしょう。</p>



<h2 class="wp-block-heading">GruntでSSIしてみる</h2>



<p>まずは <a href="">Grunt</a> の <a href="">grunt-contrib-connect</a> を使ってSSIを再現してみます。 <strong>middleware</strong> オプションを使ってサーバ側で置換してしまいます。</p>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-tag">grunt</span><span class="hljs-selector-class">.initConfig</span>({
    <span class="hljs-attribute">connect</span>: {
        dev: {
            options: {
                base: <span class="hljs-string">"html"</span>,
                port: <span class="hljs-number">8080</span>,
                keepalive: true,
                <span class="hljs-comment">/* ↓ これを使います */</span>
                middleware: <span class="hljs-built_in">function</span>(){ ... }
            }
        }
    }
});
</code></span></pre>


<p>まず必要なモジュールを読み込んでおきます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> fs = <span class="hljs-built_in">require</span>(<span class="hljs-string">"fs"</span>),
    path = <span class="hljs-built_in">require</span>(<span class="hljs-string">"path"</span>),
    url = <span class="hljs-built_in">require</span>(<span class="hljs-string">"url"</span>);
</code></span></pre>


<p>middleware の実装は以下のようにしました。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">middleware: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">connect, options, middlewares</span>)</span>{
    middlewares.unshift(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">req, res, next</span>)</span>{
        <span class="hljs-keyword">var</span> pattern, root, file, html;

        pattern = <span class="hljs-regexp">/&lt;!--#include\s+?(virtual|file)="(.+?)".*?--&gt;/g</span>;
        root = options.base&#91;<span class="hljs-number">0</span>];
        file = path.join(root, url.parse(req.url).pathname).replace(<span class="hljs-regexp">/\/$/</span>, <span class="hljs-string">"/index.html"</span>);

        <span class="hljs-keyword">if</span>(<span class="hljs-regexp">/\.s?html$/</span>.test(file) &amp;&amp; fs.existsSync(file)){
            html = fs.readFileSync(file, <span class="hljs-string">"utf-8"</span>).replace(pattern, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">a, key, value</span>)</span>{
                <span class="hljs-keyword">var</span> inc = (key === <span class="hljs-string">"virtual"</span>) ? path.join(root, value)
                : path.join(file.replace(<span class="hljs-regexp">/&#91;^\/]+$/</span>, <span class="hljs-string">""</span>), value);
                <span class="hljs-keyword">return</span> fs.existsSync(inc) ? fs.readFileSync(inc) : <span class="hljs-string">""</span>;
            });
            <span class="hljs-keyword">return</span> res.end(html);
        }
        <span class="hljs-keyword">return</span> next();
    });
    <span class="hljs-keyword">return</span> middlewares;
}
</code></span></pre>


<ol class="wp-block-list">
<li>拡張子が <strong>.html</strong> あるいは <strong>.shtml</strong> の時だけ処理します</li>



<li>SSIのパターンを見つけたら、該当ファイルを読み込んで差し替えます</li>



<li>該当ファイルがなければなにもせずに静的ファイルを吐き出します</li>
</ol>



<p>試してませんが、Gulpでも同じ事が出来るでしょう。</p>



<p>なお、<strong>#include</strong> のみ処理し、<strong>#set</strong> や <strong>#echo</strong> 等の他のコマンドは全スルーしております。 これらも使いたい場合は <a href="https://github.com/67726e/node-ssi">node-ssi</a> 等を使ってmiddleware内でパースすると良いと思います。 （さすがに <strong>exec</strong> コマンドはサポートしてなさそうですが…）</p>



<p>SSIが見られるのは主に大きめのWebサイトのテンプレートですが、 経験上 <strong>#include</strong> 以外が使われているケースはほとんど見られません。</p>



<h2 class="wp-block-heading">フロントでSSIしてみる</h2>



<p>すでにSSIじゃなくなってますが、フロント側（JavaScript）でSSIを再現してみます。 むりやり名前をつけるならばFEI（フロントエンドインクルード）とかになるんでしょうか…。 とはいえ、XHRを使う都合上なんらかのサーバを通して確認する事になります。</p>



<p>先に申し上げておきますと、全くおすすめはできません。 特にJavaScriptも絡んだページ制作では、かなりの悪影響が予想されます。 当然本番で使用するのはもってのほかなので、ただの実験の記録として読み流してください。</p>



<h3 class="wp-block-heading">パターン1: innerHTMLで強引に</h3>



<p>ページ末尾でこのようなコードを実行してみました。</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> body = <span class="hljs-built_in">document</span>.getElementsByTagName(<span class="hljs-string">"body"</span>).item(<span class="hljs-number">0</span>);
    body.innerHTML.replace(
        <span class="hljs-regexp">/&lt;!--#include.+?(?:file|virtual)="(.+?)".*?--&gt;/g</span>,
        <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">key, value</span>)</span>{
            <span class="hljs-keyword">var</span> xhr = <span class="hljs-keyword">new</span> XMLHttpRequest();
            xhr.open(<span class="hljs-string">"GET"</span>, value);
            xhr.addEventListener(<span class="hljs-string">"readystatechange"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>)</span>{
                <span class="hljs-keyword">if</span>(<span class="hljs-keyword">this</span>.readyState === <span class="hljs-number">4</span> &amp;&amp; <span class="hljs-keyword">this</span>.status &lt; <span class="hljs-number">400</span>){
                    body.innerHTML = body.innerHTML.replace(key, <span class="hljs-keyword">this</span>.responseText);
                }
            });
            xhr.send();
        }
    );
}());
</code></span></pre>


<p>innerHTML にはコメントも含まれているので、それらを強引に文字列置換してしまって差し替えています。 やさしさがかけらもない、ひどいコードです。 このコードの最も大きなデメリット（いや、デメリットしかありませんが）は、 要素に結びつけたJavaScriptが全く動かなくなる点でしょう。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-built_in">document</span>.getElementById(<span class="hljs-string">"my-button"</span>)
.addEventListener(<span class="hljs-string">"click"</span>, <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-string">"click"</span>);
});
</code></span></pre>


<p>このような処理が書いてあったとしても、これは全く動きません。 innerHTML を書き換えると同時にDOMを破壊してしまい、上で参照している <strong>#my-button</strong> という要素とのつながりが断ち切られてしまう為です。</p>



<h3 class="wp-block-heading">パターン2: DOMインターフェースを使って</h3>



<p>ページの末尾で次のようなコードを実行します。</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> each = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">list, callback</span>)</span>{
        <span class="hljs-keyword">return</span> <span class="hljs-built_in">Array</span>.prototype.forEach.call(list, callback);
    };

    <span class="hljs-keyword">var</span> parseSSI = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">nodes</span>)</span>{
        each(nodes, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">node</span>)</span>{
            <span class="hljs-keyword">var</span> match, xhr;

            <span class="hljs-keyword">if</span>(node.childNodes.length){ <span class="hljs-keyword">return</span> parseSSI(node.childNodes); }
            <span class="hljs-keyword">if</span>(node.nodeType !== <span class="hljs-number">8</span>){ <span class="hljs-keyword">return</span>; }

            match = node.nodeValue.match(<span class="hljs-regexp">/#include.+?(?:virtual|file)="(.+?)"/</span>);

            <span class="hljs-keyword">if</span>(match){
                xhr = <span class="hljs-keyword">new</span> XMLHttpRequest();
                xhr.open(<span class="hljs-string">"GET"</span>, match&#91;<span class="hljs-number">1</span>]);
                xhr.addEventListener(<span class="hljs-string">"readystatechange"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
                    <span class="hljs-keyword">if</span>(<span class="hljs-keyword">this</span>.readyState !== <span class="hljs-number">4</span> || <span class="hljs-keyword">this</span>.status &gt;= <span class="hljs-number">400</span>){ <span class="hljs-keyword">return</span>; }
                    <span class="hljs-keyword">var</span> tmp = <span class="hljs-built_in">document</span>.createElement(<span class="hljs-string">"div"</span>);
                    tmp.innerHTML = <span class="hljs-keyword">this</span>.responseText;
                    each(tmp.childNodes, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">child</span>)</span>{
                        node.parentNode.insertBefore(child, node);
                    });
                });
                xhr.send();
            }
        });
    };

    parseSSI(<span class="hljs-built_in">document</span>.getElementsByTagName(<span class="hljs-string">"body"</span>));
}());
</code></span></pre>


<p>body配下にぶら下がっている要素をすべて走査して、 コメントノード（<strong>nodeType === 8</strong>）だった場合にパターンと照合して処理します。</p>



<p>こちらのパターンはDOMを破壊しませんが、不完全なHTMLをモジュールとして読み込んだ場合に、それを補完してしまう欠点があります。 例えば次のような部品を読み込んだ場合。 （古き掲示板CGIのテンプレートを彷彿とさせる構成ですね）</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-comment">&lt;!-- header.html --&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">header</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>...<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">nav</span>&gt;</span>...<span class="hljs-tag">&lt;/<span class="hljs-name">nav</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">header</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">article</span>&gt;</span>
<span class="hljs-comment">&lt;!-- /header.html --&gt;</span>

ここにコンテンツがはいります。

<span class="hljs-comment">&lt;!-- footer.html --&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">article</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">footer</span>&gt;</span>...<span class="hljs-tag">&lt;/<span class="hljs-name">footer</span>&gt;</span>
<span class="hljs-comment">&lt;!-- /footer.html --&gt;</span>
</code></span></pre>


<p>不完全な要素が補完されてしまう為、想定と異なる構成になってしまい、当然見た目も崩れてしまうでしょう。</p>



<p>このような使い方をしなければ、SSIを模した形のモジュールライブラリとして使い様があるか…？とも考えましたが、 DOMを全走査しなければならない為、コスト的にあまり良策とは言い難いですね。 改善策はなくもなさそうですが、「そこまでやる必要がどこにあるのか」と考えてしまったのでそこで放棄いたしました。</p>



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



<p>SSIの環境が必要になるケースは今後もまだなくなりはしないと思います。 そういった案件に限って1ページのみの制作という事もよくある話なので、 出来るだけ手元の環境でさくっと再現してしまいたいですね。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>すぐに使える簡易サーバーでHTMLをチェックする3つの方法</title>
		<link>https://blog.mach3.jp/2012/09/21/check-html-with-simple-server.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Fri, 21 Sep 2012 00:55:13 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Application]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Server]]></category>
		<category><![CDATA[Sublime Text]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=2668</guid>

					<description><![CDATA[Webページが「file://～」だとうまく動かない…でも一々サーバーにアップしたり環境整備するのが面倒…。 そんな時に使える簡易サーバーのご紹介です。 HTTPでアクセスしてチェックしたいケースとは Webページを制作 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Webページが「file://～」だとうまく動かない…でも一々サーバーにアップしたり環境整備するのが面倒…。 そんな時に使える簡易サーバーのご紹介です。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-sY0U3GH3EUQ/UFsE9BnCBHI/AAAAAAAABmg/oB_Tmh8nkP0/s400/20120920-00.png" alt="すぐに使える簡易サーバーでHTMLをチェックする3つの方法"/></figure>



<p></p>



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



<h2 class="wp-block-heading">HTTPでアクセスしてチェックしたいケースとは</h2>



<p>Webページを制作している時、多くの場合はそのままブラウザで開けば動作チェックが出来ますが、 サーバーを通してHTTPでアクセスしないと正常に動作しないケースもあります。</p>



<p>つまり、「file:～」ではなく、「http:～」でアクセスしたい。例えば、</p>



<ul class="wp-block-list">
<li>ChromeからAjaxのテストをしたい</li>



<li>各種ウィジェットのスクリプトの表示をチェックしたい</li>
</ul>



<p>Chromeのケースは起動オプション（&#8221;&#8211;allow-file-access-from-files&#8221;）で解決できますし、 ウィジェットもスクリプトの中身を少しいじれば動くことが多いですが、 いずれもWebサーバーを通せば難なく動作するわけで、それがすぐに出来るのならばその方がシンプルではないかな、と思うわけです。</p>



<h2 class="wp-block-heading">ではどうしようか</h2>



<p>既にXAMPP/MAMPPや仮想マシン等でサーバ環境がある場合は良いのですが、 バーチャルホスト等の諸設定をこなすのが面倒くさかったり、とにかくささっと確認したいような場合は、 簡易的なサーバを利用してのチェックがお勧めです。</p>



<p>サッと起動して、サッ確認し、終わったらサッと終了する。</p>



<p>ここでは、3つの方法を提案してみます。</p>



<ol class="wp-block-list">
<li>SublimeServerでチェックする</li>



<li>PHP5.4+のビルトインサーバーでチェックする</li>



<li>ローカルプロキシでチェックする</li>
</ol>



<h2 class="wp-block-heading">SublimeServer でチェックする</h2>



<p>もし貴方が<a href="http://www.sublimetext.com/2">Sublime Text 2</a>を使って制作をしているのならば、これを使わない手はないでしょう。 <a href="https://github.com/learning/SublimeServer">Sublime Server</a>は、Sublime Text 2で動作する簡易Webサーバープラグインです。</p>



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



<p><a href="https://github.com/learning/SublimeServer">learning/SublimeServer</a></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Allow you run a HTTP Server in SublimeText 2, and serves all the open project folders</p>
</blockquote>



<p>メリットは、作業環境からすぐに実行できる点ですね。</p>



<h3 class="wp-block-heading">インストール</h3>



<ol class="wp-block-list">
<li>「<a href="http://wbond.net/sublime_packages/package_control">Sublime Package Control</a>」をインストール</li>



<li>コマンドパレットから <em>「Install Package」>「SublimeServer」</em> と打ち込む</li>
</ol>



<p>※プラグインの導入法については<a href="/2012/01/sublime-text-and-nettuts-fetch.html">以前書いた記事</a>などをご参考に</p>



<h3 class="wp-block-heading">使い方</h3>



<ol class="wp-block-list">
<li><em>「Tools」>「SublimeServer」>「Start SublimeServer」</em>で起動</li>



<li>確認したいHTMLファイルを開いて、右クリックし、<em>「View This File in Browser」</em></li>
</ol>



<figure class="wp-block-image"><img decoding="async" src="https://lh4.googleusercontent.com/--Wz2xFc_cYY/UFsAj8pt3aI/AAAAAAAABmA/c1KECRnWQJE/s500/20120920-01.png" alt="SublimeServer"/></figure>



<p></p>



<p>これで、デフォルトのブラウザで目的のファイルが開かれます。 URLは以下のようになります。プロジェクトがルートディレクトリのような扱いになっていますね。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>http://localhost:8080/[folder name]/index.html</p>
</blockquote>



<p>ポート番号の<em>「8080」</em>は、<em>「Tools」&gt;「SublimeServer」&gt;「Settings」</em> で変更できます。</p>



<h2 class="wp-block-heading">PHP5.4+のビルトインサーバーでチェックする</h2>



<p>マシンにPHP5.4以降がインストールされているのあらば、 PHPにビルトインされている簡易Webサーバーが利用できます。</p>



<p><a href="http://www.php.net/manual/ja/features.commandline.webserver.php">PHP: ビルトインウェブサーバー &#8211; Manual</a></p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-mAMfF2zpPVw/UFsAjxoDqVI/AAAAAAAABmA/6-bx2aM43BM/s500/20120920-02.png" alt="PHP5.4+のビルトインサーバー"/></figure>



<p></p>



<p>メリットはPHPの動作チェックが出来る点ですが、 簡易的な物なのでrewrite等は動かず、そこらへんに依存するFW等の動作は難しいでしょう。 そういう大掛かりな物は、きちんと仮想環境を構築してテストしましょう。</p>



<h3 class="wp-block-heading">使い方</h3>



<p>※PHP5.4以降が導入済みで、パスが通っている前提で話を進めます。</p>



<ol class="wp-block-list">
<li>ターミナル（あるいはコマンドプロンプト）を開く</li>



<li><br /><p>目的のファイルがあるディレクトリまで移動して、以下のコマンドを実行する</p><br /><blockquote><p>php -S localhost:8080</p></blockquote><br /></li>



<li><br /><p>ブラウザを開いてアドレスバーにURLを入力する</p><br /><blockquote><p>http://localhost:8080/index.html</p></blockquote><br /></li>
</ol>



<p>実行したディレクトリがルートディレクトリの扱いになります。</p>



<h2 class="wp-block-heading">ローカルプロキシでマッピングする</h2>



<p>これは前述した2つの方法と違い、ローカルでWebサーバーを起動するのではなく、 ローカルプロキシを利用して、或るドメインへのアクセスをローカルのファイルにマッピングする方法です。</p>



<p>…と言ってもピンと来ないですね。</p>



<p>例えば、<em>「http://example.com/index.html」</em>というファイルへブラウザでアクセスするとして、 その<em>「index.html」</em>の内容を、ローカルにあるファイルに差し替える事が出来ます。 そうすることで、あたかも<em>インターネット上にそのファイルがあるかのように</em>振る舞ってくれるわけですね。</p>



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



<p>ここでは、ローカルプロキシツールのCharlesを使ってみます。 有料ではありますがクロスプラットフォームで開発されていて、Windows/Mac/Linux版が用意されています。</p>



<p><a href="http://www.charlesproxy.com/">Charles Web Debugging Proxy • HTTP Monitor / HTTP Proxy / HTTPS &amp; SSL Proxy / Reverse Proxy</a></p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-9IYim2_Ei-M/UFsAkn-AIWI/AAAAAAAABmA/u9RlpKyMMpY/s500/20120920-03.png" alt="Charles Web Debugging Proxy"/></figure>



<p></p>



<h3 class="wp-block-heading">使い方</h3>



<ol class="wp-block-list">
<li><em>「Tools」>「Map To Local」</em>で設定ダイアログを開きます</li>



<li><em>「Add」</em>で新しくマッピングを作成します</li>



<li><br /><p>下記のような要領で入力して<em>「OK」</em></p><br /><figure><img decoding="async" src="https://lh5.googleusercontent.com/-HPnv5-g9DVE/UFsE9DN1OxI/AAAAAAAABmg/CbYSrAd8NmA/s500/20120920-04.png" alt="Edit Mapping - Charles"></figure><br /></li>



<li><br /><p>設定したURLにアクセスします</p><br /><blockquote><p>http://local.test/index.html</p></blockquote><br /></li>
</ol>



<p>ドメインは、名前解決が出来る必要があります。 プロジェクトに使用する予定のドメインを使うか、適当な「local.test」などの名前をあてがってhostsファイルに127.0.0.1などで書き込んでおくか、 あるいはexample.comやlocalhostを利用するなどしましょう。</p>



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



<p>これらの方法は、DirectoryIndexが指定できなかったりパフォーマンスが悪かったりする為、あくまでも簡易的なチェック向けです。 が、それで十分な場合は多いに制作の手助けになってくれる事でしょう。</p>



<p>特にローカルプロキシは、こういったケースに因らず、様々なシーンで開発効率をあげてくれるので、 （むしろそちらの方がメインですね） ぜひとも導入しておくべきだと思います。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>PHPメモ : file_get_contentsの代替にcURLを使う</title>
		<link>https://blog.mach3.jp/2010/12/21/use-curl-for-filegetcontents.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Tue, 21 Dec 2010 02:00:58 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[cURL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Server]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=1257</guid>

					<description><![CDATA[PHPで外部のリソースを取得するのに大変便利なfile_get_contents関数ですが、 cURLの環境があるなら利用したほうがパフォーマンスがいいぞというお話。 パフォーマンスの差 具体的にどれくらいパフォーマンス [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>PHPで外部のリソースを取得するのに大変便利な<a href="http://php.net/manual/ja/function.file-get-contents.php">file_get_contents</a>関数ですが、<br />
<a href="http://curl.haxx.se/">cURL</a>の環境があるなら利用したほうがパフォーマンスがいいぞというお話。</p>



<figure class="wp-block-image"><img decoding="async" src="http://lh3.ggpht.com/_JJkNs5Ixl70/TQ-OyjppmCI/AAAAAAAABHg/AaOvwHPJ3Qw/201012210211.png" alt="file_get_contentsの代替にcURLを使う"/></figure>



<p></p>



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



<h2 class="wp-block-heading">パフォーマンスの差</h2>



<p>具体的にどれくらいパフォーマンスが変わるのかというと…<br />
モバイル回線のノートでYahoo!のトップページを取得してざっくり計測したところ、</p>



<ul class="wp-block-list">
<li>file_get_contents : 4秒前後</li>



<li>cURL : 2秒前後</li>
</ul>



<p>概ねこんな感じとなりました。<br />
勿論時間帯や回線など様々な要因にもよりますが、<br />
ちょっと無視出来ない数字ですね。</p>



<h2 class="wp-block-heading">cURLを使う</h2>



<h3 class="wp-block-heading">簡単な使い方</h3>



<p>cf) <a href="http://php.net/manual/ja/book.curl.php">PHP: cURL &#8211; Manual</a></p>



<ol class="wp-block-list">
<li><em>curl_init()</em>で初期化</li>



<li><em>curl_setopt()</em>でオプションを設定して</li>



<li><em>curl_exec()</em>で実行</li>



<li><em>curl_close()</em>で終了</li>
</ol>



<p>というのが一連の流れです。<br />
curl_setoptで渡すオプションにより、cURLさんにどんな動作をさせるのかを設定します。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$url = <span class="hljs-string">"http://www.example.com"</span>;
$ch = curl_init(); <span class="hljs-comment">// 1. 初期化</span>
curl_setopt( $ch, CURLOPT_URL, $url ); <span class="hljs-comment">// 2. オプションを設定</span>
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, <span class="hljs-keyword">true</span> );
$result = curl_exec( $ch ); <span class="hljs-comment">// 3. 実行してデータを得る</span>
curl_close(); <span class="hljs-comment">// 4. 終了</span>
</code></span></pre>


<h3 class="wp-block-heading">オプションについて</h3>



<p>オプション一覧<br />
cf) <a href="http://www.php.net/manual/ja/function.curl-setopt.php">PHP: curl_setopt &#8211; Manual</a></p>



<p>今回使うものだけ軽くメモ。</p>



<dl>
<dt>CURLOPT_URL</dt>
<dd>アクセスするurlです。これがないと始まりません。</dd>
<dt>CURLOPT_HEADER</dt>
<dd>ヘッダ文字列を一緒に出力するかどうかのBoolean値。<br />
邪魔なのでfalseにします。</dd>
<dt>CURLOPT_RETURNTRANSFER</dt>
<dd>curl_execの返り値を文字列にする為のBoolean値。<br />
これをtrueにしてやらないと、データが直接出力されます。</dd>
<dt>CURLOPT_TIMEOUT</dt>
<dd>cURLさんに頑張ってもらう秒数です。<br />
これを超えると諦めてfalseを返します。</dd>
</dl>



<h2 class="wp-block-heading">関数にまとめてみる</h2>



<p>簡単に使えるように関数にまとめてみます。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">curl_get_contents</span><span class="hljs-params">( $url, $timeout = <span class="hljs-number">60</span> )</span></span>{
    $ch = curl_init();
    curl_setopt( $ch, CURLOPT_URL, $url );
    curl_setopt( $ch, CURLOPT_HEADER, <span class="hljs-keyword">false</span> );
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, <span class="hljs-keyword">true</span> );
    curl_setopt( $ch, CURLOPT_TIMEOUT, $timeout );
    $result = curl_exec( $ch );
    curl_close( $ch );
    <span class="hljs-keyword">return</span> $result;
}

<span class="hljs-comment">// test</span>
$result = curl_get_contents( <span class="hljs-string">"http://www.example.com"</span>, <span class="hljs-number">120</span> );
</code></span></pre>


<p>第二引数はタイムアウトの秒数です。</p>



<h2 class="wp-block-heading">おわりに</h2>



<p>オプションを見るだけでも分かるように、cURLは他にも相当色々な事が出来そうです。<br />
「Curl」だと別のプログラミング言語の事をさしてしまうので注意。</p>



<ul class="wp-block-list">
<li><a href="http://curl.haxx.se/">cURL公式</a></li>



<li><a href="http://ja.wikipedia.org/wiki/CURL">cURL &#8211; Wikipedia</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>jQueryによるAjaxリクエストをサーバ側で検知する</title>
		<link>https://blog.mach3.jp/2010/11/02/detect-jquery-ajax.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Tue, 02 Nov 2010 06:31:28 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Server]]></category>
		<category><![CDATA[Tips]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=1047</guid>

					<description><![CDATA[jQueryでXmlHttpRequestを介してアクセスされたのかどうかを判別する方法です。 Ajaxで呼ばれた時とそうでない場合で出力を分けたりする時に使えそうですね。 Learning jQuery &#8211; [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>jQueryでXmlHttpRequestを介してアクセスされたのかどうかを判別する方法です。<br />
Ajaxで呼ばれた時とそうでない場合で出力を分けたりする時に使えそうですね。</p>



<figure class="wp-block-image"><img decoding="async" src="http://lh6.ggpht.com/_JJkNs5Ixl70/TM7K99SgQjI/AAAAAAAABFA/TvsJOVLVVww/201011012311.png" alt="Detecting Ajax Events on the Server"/></figure>



<p></p>



<p><a href="http://www.learningjquery.com/">Learning jQuery &#8211; Tips, Techniques, Tutorials</a></p>



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



<h2 class="wp-block-heading">簡単な仕組み</h2>



<p>ネタ元はこの記事です。<br />
<a href="http://www.learningjquery.com/2010/03/detecting-ajax-events-on-the-server">Detecting Ajax Events on the Server » Learning jQuery &#8211; Tips, Techniques, Tutorials</a></p>



<p>どうやらjQueryはXmlHttpRequestでリクエストをする際に<br />
「X-Requested-With」というヘッダに<br />
「xmlHttpRequest」という値を格納しているそうな。<br />
jQuery…なんという愛でしょう。</p>



<p>jQueryの素晴らしさを実感すると同時に、<br />
やはり一度はソースを熟読しておくべきだなぁと感じますね。<br />
参考になる設計手法とか、恐らく随所に見られる事でしょう！</p>



<h2 class="wp-block-heading">取得してみる</h2>



<p>PHPとRubyで、試しに取得してみました。</p>



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


<pre class="wp-block-code"><span><code class="hljs language-php">$xhr = ( @$_SERVER&#91;<span class="hljs-string">"HTTP_X_REQUESTED_WITH"</span>] === <span class="hljs-string">"XMLHttpRequest"</span> );
<span class="hljs-keyword">echo</span> ($xhr) ? <span class="hljs-string">"jQuery Ajax"</span> : <span class="hljs-string">"Requested Directly"</span> ;
</code></span></pre>


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


<pre class="wp-block-code"><span><code class="hljs language-php">xhr = ( ENV&#91;<span class="hljs-string">"HTTP_X_REQUESTED_WITH"</span>] === <span class="hljs-string">"XMLHttpRequest"</span> )
<span class="hljs-keyword">print</span> (xhr) ? <span class="hljs-string">"jQuery Ajax"</span> : <span class="hljs-string">"Requested Directly"</span>
</code></span></pre>


<p>ちなみにこのヘッダが渡されるのは、あくまでもXMLHttpRequestを介して行われた通信だけです。<br />
それ以外のもの、例えばJSONP等の場合は渡されないので注意しましょう。<br />
（JSONPはscript要素を追加しているだけなので、XMLHttpRequestは使用していません）<br />
cf) <a href="/2010/10/jquery-jsonp.html">jQueryはJSONPの理解の妨げになるか？</a></p>



<p>ネタ元のブログも素晴らしいです！<br />
今回初めて知ったのですが、是非とも全てに目を通したいです。<br />
<a href="http://www.learningjquery.com/">Learning jQuery &#8211; Tips, Techniques, Tutorials</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>サーバ管理のお手元に～VIエディタのチートシート</title>
		<link>https://blog.mach3.jp/2010/05/06/vi-cheetsheet.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Thu, 06 May 2010 01:36:00 +0000</pubDate>
				<category><![CDATA[WebClip]]></category>
		<category><![CDATA[CheetSheet]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Server]]></category>
		<category><![CDATA[VI]]></category>
		<guid isPermaLink="false">http://lab.mach3.jp/2010/05/06/%e3%82%b5%e3%83%bc%e3%83%90%e7%ae%a1%e7%90%86%e3%81%ae%e3%81%8a%e6%89%8b%e5%85%83%e3%81%ab%ef%bd%9evi%e3%82%a8%e3%83%87%e3%82%a3%e3%82%bf%e3%81%ae%e3%83%81%e3%83%bc%e3%83%88%e3%82%b7%e3%83%bc%e3%83%88.html</guid>

					<description><![CDATA[VIエディタと言えばサーバ管理者やLinuxユーザーにとっては手放せない存在。 そんなVIエディタのコマンドチートシートがSmashing Magazineで、配布されていました。 VI Editor / Linux T [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>VIエディタと言えばサーバ管理者やLinuxユーザーにとっては手放せない存在。<br />
そんなVIエディタのコマンドチートシートが<a href="http://www.smashingmagazine.com/">Smashing Magazine</a>で、配布されていました。</p>



<figure class="wp-block-image"><img decoding="async" src="http://lh5.ggpht.com/_JJkNs5Ixl70/S-Gd3vmdWsI/AAAAAAAAA4U/nwmHeeNVY28/s800/201005060119.png" alt="VIエディタのコマンドチートシート"/></figure>



<p></p>



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



<p><a href="http://www.smashingmagazine.com/2010/05/03/vi-editor-linux-terminal-cheat-sheet-pdf/">VI Editor / Linux Terminal Cheat Sheet (PDF) &#8211; Smashing Magazine</a></p>



<figure class="wp-block-image"><img decoding="async" src="http://lh5.ggpht.com/_JJkNs5Ixl70/S-Gd39YA-jI/AAAAAAAAA4Y/0_8GgwB__JQ/s800/201005060121.png" alt="VI Editor / Linux Terminal Cheat Sheet"/></figure>



<p></p>



<p>こんなかんじに綺麗にまとめられています。<br />
リンク先ではPDFにてダウンロード出来るので、印刷して目につくところに貼っておくと便利。<br />
私も本当に限られた機能しか使っていなかったので、重宝しそうです。</p>



<p>VIのチートシートとしては、このグラフィカルなやつも結構有名ですね。</p>



<p><a href="http://www.viemu.com/a_vi_vim_graphical_cheat_sheet_tutorial.html">Graphical vi-vim Cheat Sheet and Tutorial</a></p>



<figure class="wp-block-image"><img decoding="async" src="http://lh4.ggpht.com/_JJkNs5Ixl70/S-Gd4K6aQXI/AAAAAAAAA4c/YUzxskcR1qM/s800/201005060126.png" alt="Graphical vi-vim Cheat Sheet and Tutorial"/></figure>



<p></p>



<p>これはデスクトップの壁紙にして使えそう。</p>



<p>この手のチートシートで日本語で書かれたものはあまり見かけないですが、<br />
必要とする人の多くが英語で十分だと感じているからでしょうか。<br />
それとも面倒だからでしょうか。（まぁもちろん面倒ですが！）</p>



<p>面倒くさがりやの私は感謝の気持ちを胸に、<br />
ありがたく活用させて頂きたく思います。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
