<?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>node.js &#8211; Mach3.laBlog</title>
	<atom:link href="https://blog.mach3.jp/tag/node-js/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.mach3.jp</link>
	<description></description>
	<lastBuildDate>Sat, 01 Oct 2016 01:00:04 +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>はじめてのモジュールバンドラー</title>
		<link>https://blog.mach3.jp/2016/10/01/module-bundler.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Sat, 01 Oct 2016 01:00:04 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[browserify]]></category>
		<category><![CDATA[Grunt]]></category>
		<category><![CDATA[module bundler]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[webpack]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=4184</guid>

					<description><![CDATA[近年流行りだした「モジュールバンドラー」ですが、いまでは必携と言えるほどの存在になりつつあります。 今回はそんなモジュールバンドラーをざっくりと紹介します。 モジュールバンドラーとは モジュールバンドラー（module  [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>近年流行りだした「モジュールバンドラー」ですが、いまでは必携と言えるほどの存在になりつつあります。 今回はそんなモジュールバンドラーをざっくりと紹介します。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/VdpRNQ7NMKNmrPWKUru-dUlKdJzVR09cRpqVuk7gdcI-lVvAPkjSphHZj0um_QulJef1yz-Nd18EupCQuW0n0PdPkCYaBC019U7wVN_5G0hD8jPyAA_G41Uiw9AnNHPo7Y9TbHITQ33PsEFBdh5I9sKf5I8MC3FhSakM_wisM8NXCpqI8XxlsaU7MmkGMvWXS8yNfTVbHroA0IRf_5RgrYDaTvSxkpX06J-51pbo9F4J0Zd0T8n9sF1tsRj4k4sIE7qhvd2nKWQXYYx0Pa54tFayPNhA5HC8j_oWtkxqioR_EBgm8_2RkQcYXR9o23o3ka-R9J7ltu9jAbNUHMuEYPFL89txuE0ZemJQpM3BL8SOE7zpMZfrKFKp7Mbyg14HkkLniM5sG2rw5tI1y1v3Smtw6BYC_KmwfSO-pzz2mLHHw2gpqddU0_c112pLsknI2oHOOUUQCwPFg6tXkc1PFTPdZqxngXAVgZsBG2QzUwIcseProf1ddo5CtYlC4HLVYOPlO-BxiaNPGmkvMN0uucaCXOTZUQfx9ExOaA-2rU9lE-rVFEkubFx0u5Bk00coIaIrAjMzY8FSb4c3SDTdMM-83ALzxLw3gVq7i7Tpsqk5xvVQ=w400-h150-no" alt=""/></figure>



<p></p>



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



<ol class="wp-block-list">
<li>モジュールバンドラーとは</li>



<li>どんな時に使いたい？</li>



<li>「requireを使える」ということ</li>



<li>様々なモジュールバンドラー</li>



<li>browserify を使ってみよう</li>



<li>browserify + Grunt で自動コンパイルする</li>



<li>まとめ</li>
</ol>



<h2 class="wp-block-heading">モジュールバンドラーとは</h2>



<p>モジュールバンドラー（module bundler）は、文字通りモジュールをひとまとめにする（bundle）ツールです。 あまり用語として聞き慣れませんが、モジュールバンドラーの代表格のひとつである <a href="https://webpack.github.io/">webpack</a> でも使用されている言葉です。 ひらたく言うと、JavaScriptの依存関係を解決し、それらをインクルードしたひとつのファイルにまとめてくれます。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/n_gfeC6P7-J8_bwTd4P52yEyCMiGRTeTvrVtuZP8NQ0B1YVG5QPI1aA14FqOy3EVYqNOPJXcTWlXruDYeBrfZcylUiRiCsm8vt9sJDi236Wds5lgWeTDWqGXarn88trcm7rKLunjdU2f-6CypAdbh2TwvxqpoD4RwFAzcWJ5kWqxM4DUJ41z0PXNQXkCU0y-Uyrz2Tqcqrp5tw4OcHr0g9XiD6Lr0Knn5FnLWf9FkrLqSIvgkh-7Yv2PvEEWBge70ezfO8LFx6kG-T6IWb6VBJr6s-iEb-87mJwLzEZCsvFCL2hKJOI3bH4Wn5brbRNUZKRC9AyrPKUzqMp-00nxrkTZa28jRwWwdnVTiXN6WjLyrspiIfEeEBlWp9n2Gz2bQYGMKhKj15H6zQvvqqJVNQ3p-0MHNf_OlVnF4FpgIPSuFAfe5v0RvIz2LRkdZ4_g9yE5hdC_O76Rgp4DPO9W1EvLjSn0mQRuN2keWueaAqU6sCuB4hUDT_JjR2plmVe1Yaxylpi96BwNsiENkiw7NmO6Wif0tzGwzsVpJHCkBZ0lK_s5E75R0E0M2a8pgxfulMGRodNVbei-uq2gnT6Spwqf52D4ycmMUbq0EpIQd04HRWrU=w482-h390-no" alt=""/></figure>



<p></p>



<p>上の図のように、 <code>require</code> で表現された依存関係を解決してゆき、 コンパイルする際にそれらを全て内包したファイルを作ってくれるのが一般的なモジュールバンドラーの振る舞いです。 <code>require</code> はもともとサーバーサイドJavaScript用に考えられた仕様なので、基本的にブラウザ上では動きません。 それをブラウザ上でも利用可能にするというのが主な目的です。</p>



<h2 class="wp-block-heading">どんな時に使いたい？</h2>



<h3 class="wp-block-heading">1. JavaScriptファイルを連結したい</h3>



<p>旧来JSファイルを連結する際には、まとめたいファイルを指定してシンプルにファイルを繋げていましたが、 この方法には「連結するファイルリストを管理しなければならない」という煩わしさがあります。</p>



<p>一方でモジュールバンドラーの場合はコード内の <code>require</code> を辿って必要なファイルだけを梱包してくれるので、 ファイルリストの管理から解放され、モジュールの取捨選択も一行の追加・削除だけで解決できます。</p>



<h3 class="wp-block-heading">2. JavaScriptでモジュールのインポートをしたい</h3>



<p>他言語で <code>import</code> や <code>require</code> を使っている方は「モジュールのインポートができる」事の素晴らしさも十分にご承知だと思います。 要するに、一行加えるだけで別ファイルに記述された機能がそのファイル内で利用できる様になるのです。</p>



<p>また同時に、コードを見直す際などに依存関係が一目瞭然になるのも大きな利点です。 Webアプリケーションの開発ではJavaScriptファイルが肥大化・複雑化するので、なんとしても欲しい仕組みですね。</p>



<h3 class="wp-block-heading">3. パッケージマネージャーを npm で一本化したい</h3>



<p><strong>bower</strong> 等のパッケージマネージャーを利用されている方は一度はその管理に頭を悩ませるでしょう。 <strong>bower</strong> はそれ自身を npm でインストールして、.bowerrc と bower.json で設定を行って管理するのですが、 「どうせ npm で package.json があるんだからそっちで一本化したい」となるわけですね。</p>



<p>モジュールバンドラーは基本的に node_modules ディレクトリからモジュールを探してインポートするので、 全て npm だけで解決する事ができ、管理が大変楽になります。</p>



<h3 class="wp-block-heading">4. node.js のモジュールをブラウザ上で使いたい</h3>



<p>node.js 向けに作られたモジュールも（一部をのぞいて）インポート可能です。</p>



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



<p>プロジェクトの規模が大きければ大きいほど、より効力を発揮すると言えそうです。</p>



<h2 class="wp-block-heading">「requireを使える」ということ</h2>



<p>node.js に明るくない方の為に簡単に補足をしておくと、 require / exports というのは node.js で使われているモジュールの読み込みの仕組みで、CommonJSなどと呼ばれていたりします。 例えばみんなだいすきjQueryを読み込みたい場合は、まず npm で jquery をインストールします。</p>


<pre class="wp-block-code"><span><code class="hljs">$ npm install jquery@1 --save
</code></span></pre>


<p>そしてJavaScript側で require します。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> $ = <span class="hljs-built_in">require</span>(<span class="hljs-string">"jquery"</span>);
</code></span></pre>


<p>これだけで、そのファイル内ではいつも通りに $ でjQueryを参照する事ができます。簡単ですね。</p>



<p>また、「そのファイル内では」という所がポイントで、上の例の記述はグローバルな空間を汚染しません。 つまり、そのファイルのコンテキスト外で jQuery を利用しようとしても、参照出来ないという事です。</p>



<h3 class="wp-block-heading">ローカルモジュールを組み込む</h3>



<p>npm で導入したのではない、自前のモジュールを読み込みたい場合は、そのファイルまでの相対パスで指定します。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> utils = <span class="hljs-built_in">require</span>(<span class="hljs-string">"./modules/utils"</span>);
</code></span></pre>


<p>ここで注意したいのは、相対パスを &#8220;./&#8221; からはじめている部分です。 これが &#8220;modules/utils&#8221; だとモジュールの名前だと判断され、 &#8220;modules/utils&#8221; という名前のモジュールを node_modules から探そうとしてしまいます。</p>



<h3 class="wp-block-heading">require できるローカルモジュールを作る</h3>



<p>モジュールの宣言は <strong>exports</strong> あるいは <strong>module.exports</strong> に代入して行います。 まずは <strong>exports</strong> から使ってみましょう。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-comment">// modules/utils.js</span>
exports.foo = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{ <span class="hljs-keyword">return</span> <span class="hljs-string">"foo"</span>; };
exports.bar = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{ <span class="hljs-keyword">return</span> <span class="hljs-string">"bar"</span>; };
</code></span></pre>


<p>このように書く事で、require の返り値がプロパティに foo と bar を備えたオブジェクトになります。 要するに、モジュール内で宣言されている <strong>exports</strong> オブジェクトを返しているわけですね。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> utils = <span class="hljs-built_in">require</span>(<span class="hljs-string">"./modules/utils"</span>);
utils.foo(); <span class="hljs-comment">// =&gt; "foo"</span>
</code></span></pre>


<p>対して <strong>module.exports</strong> は、返り値そのものを書き換えたい場合、たとえばオブジェクトではなく関数等にしたい時に有効です。 クラスを返したいケースなどで使えますね。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-comment">// modules/foo.js</span>
<span class="hljs-keyword">var</span> Foo = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{ ... };
<span class="hljs-built_in">module</span>.exports = Foo;
</code></span></pre>


<p>このようにすると、返り値は Foo 関数そのものとなります。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> Foo = <span class="hljs-built_in">require</span>(<span class="hljs-string">"./modules/foo"</span>);
<span class="hljs-keyword">var</span> foo = <span class="hljs-keyword">new</span> Foo();
</code></span></pre>


<h2 class="wp-block-heading">様々なモジュールバンドラー</h2>



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



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><a href="http://browserify.org/">Browserify</a> &#8211; <a href="http://browserify.org/">http://browserify.org/</a><br />
  Browserify lets you require(&#8216;modules&#8217;) in the browser by bundling up all of your dependencies.</p>
</blockquote>



<ul class="wp-block-list">
<li>単機能な方向性で、シンプルで簡単</li>



<li>Gulpとの相性はイマイチです</li>
</ul>



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



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><a href="https://webpack.github.io/">webpack</a> &#8211; <a href="https://webpack.github.io/">https://webpack.github.io/</a><br />
  webpack, the flexible module bundler</p>
</blockquote>



<ul class="wp-block-list">
<li>JSのバンドルに留まらず多機能ですが、設定が少々ややこしい</li>



<li>Gruntとの相性はイマイチです</li>



<li>AMD仕様でのモジュール定義も可能</li>



<li>browserifyと比較して速度でアドバンテージがある様です</li>
</ul>



<p>RequireJS という物もありましたが、モジュールの定義がCommonJSではなく本記事に沿わないので割愛します。 browserifyは単機能でシンプル、webpackは多機能という印象です。</p>



<h2 class="wp-block-heading">browserify を使ってみよう</h2>



<p>シンプルな browserify を実際に使ってみましょう。 前提条件として、node.js がインストールされている必要があります。</p>



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



<p>ターミナル等で browserify をインストールします。環境によっては <code>sudo</code> を頭に付ける必要があります。</p>


<pre class="wp-block-code"><span><code class="hljs">$ npm install -g browserify
</code></span></pre>


<p>インストールが完了すれば <code>browserify</code> コマンドが使用可能になります。</p>


<pre class="wp-block-code"><span><code class="hljs">$ browserify --help
Usage: browserify &#91;entry files] {OPTIONS}
</code></span></pre>


<h3 class="wp-block-heading">2. 実行する</h3>



<p>適当なJSファイルを用意して、<code>browserify</code> コマンドでコンパイルしてみましょう。</p>


<pre class="wp-block-code"><span><code class="hljs">$ browserify test.js -o bundle.js
</code></span></pre>


<p>こちらが基本形です。上のコマンドを実行すると、test.js をコンパイルした結果が bundle.js として保存されます。</p>



<h2 class="wp-block-heading">browserify + Grunt で自動コンパイルする</h2>



<p>browserify コマンドを毎度実行するのは面倒なので、 タスクランナー（Grunt）でファイルの更新を検知して自動的にコンパイルする環境をつくります。 （前述にもありますが、Gulp + browserify は少々手間がかかり説明に不向きなので、ここでは Grunt で説明します）</p>



<h3 class="wp-block-heading">ファイル構成例</h3>


<pre class="wp-block-code"><span><code class="hljs">/
├ html/
│ └ assets/
│      └ js/
│           ├ src/
│           │ ├ modules/
│           │ │ ├ mymodule-01.js
│           │ │ └ mymodule-02.js
│           │ └ main.js ... エントリーファイル
│           └ main.js ... コンパイル先のJSファイル
├ node_modules/
└ Gruntfile.js
</code></span></pre>


<h3 class="wp-block-heading">設定</h3>



<p>まず必要なモジュールをインストールします。</p>


<pre class="wp-block-code"><span><code class="hljs">$ npm install grunt grunt-browserify grunt-contrib-watch --save-dev
</code></span></pre>


<p>Gruntfile.js を用意します。タスクの設定は下記のような感じにしてみます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">grunt.initConfig({

    <span class="hljs-attr">browserify</span>: {
        <span class="hljs-attr">dev</span>: {
            <span class="hljs-attr">options</span>: {
                <span class="hljs-attr">borwserifyOptions</span>: {
                    <span class="hljs-attr">debug</span>: <span class="hljs-literal">true</span>
                }
            },
            <span class="hljs-attr">files</span>: &#91;
                {
                    <span class="hljs-attr">expand</span>: <span class="hljs-literal">true</span>,
                    <span class="hljs-attr">cwd</span>: <span class="hljs-string">"html/assets/js/src"</span>,
                    <span class="hljs-attr">src</span>: <span class="hljs-string">"*.js"</span>,
                    <span class="hljs-attr">dest</span>: <span class="hljs-string">"html/assets/js"</span>
                }
            ]
        }
    },

    <span class="hljs-attr">watch</span>: {
        <span class="hljs-attr">js</span>: {
            <span class="hljs-attr">files</span>: &#91;<span class="hljs-string">"html/assets/js/src/**/*.js"</span>],
            <span class="hljs-attr">tasks</span>: &#91;<span class="hljs-string">"browserify:dev"</span>]
        }
    }

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


<ul class="wp-block-list">
<li><code>html/assets/js/src/*.js</code> をエントリーファイルとして、同名ファイルを <code>html/assets/js/</code> に書き出します</li>



<li><code>html/assets/js/src/**/*.js</code> が変更されると、browserify タスクが走ってコンパイルを行います</li>



<li>browserify に渡すオプションは、<code>browserifyOptions</code> に記述します。 <code>debug</code> を true にするとソースマップを生成する様になります。</li>
</ul>



<p>準備が整ったら watch してみましょう。</p>


<pre class="wp-block-code"><span><code class="hljs">$ grunt watch
</code></span></pre>


<p>無事動きましたか？</p>



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



<p>モジュールバンドラーは昨年（2015年）あたりから流行りだして、 使ってみたところあまりにも効率が良く、今ではもう手放せない存在になりました。 CSSプリプロセッサ、タスクランナーと並んで、近年の素晴らしすぎる発明の一つですね。</p>
]]></content:encoded>
					
		
		
			</item>
		<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>&#034;WebSocket&#034; &#8211; Alphabetical Advent Calendar 2013</title>
		<link>https://blog.mach3.jp/2013/12/22/jaac2013-w-websocket.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Sun, 22 Dec 2013 01:58:46 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Advent Calendar 2013]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[Socket.io]]></category>
		<category><![CDATA[WebSocket]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=3781</guid>

					<description><![CDATA[&#8220;W&#8221; は WebSocket の &#8220;W&#8221;。 WebSocket WebSocket は、サーバーとクライアント間の双方向の通信をスムーズに行う為の技術です。 XMLHtt [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>&#8220;W&#8221; は WebSocket の &#8220;W&#8221;。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh4.googleusercontent.com/-nLLyR4zNEGA/UqR4mAUDnyI/AAAAAAAACYg/LwX_sRpA7Xk/s400/ac2013-w.png" alt="W"/></figure>



<p></p>



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



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



<p><strong>WebSocket</strong> は、サーバーとクライアント間の双方向の通信をスムーズに行う為の技術です。 XMLHttpRequest のように都度リクエストを送るのではなく、 一旦コネクションが貼られた後はそのコネクション上でメッセージを送り合ってデータのやり取りを行う為、 よりリアルタイム性が必要なアプリケーション、例えばチャットやオンラインゲーム等での活躍が期待されます。</p>



<h2 class="wp-block-heading">Socket.io</h2>



<p>WebSocket を恐ろしく簡単で使いやすい物に変えてしまうのが <strong>Socket.io</strong> です。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><a href="http://socket.io/">http://socket.io/</a><br />
  Socket.IO aims to make realtime apps possible in every browser and mobile device, blurring the differences between the different transport mechanisms. It&#8217;s care-free realtime 100% in JavaScript.</p>
</blockquote>



<p>node.js で楽にWebSocketのサーバが立ち上がるうえ、クライアントサイドでは WebSocket に非対応な環境の為に、 Flash で ActionScript3 の WebSocket API を使用してフォールバックを備えてくれています。</p>



<h3 class="wp-block-heading">WebSocket サーバの起動</h3>



<p>まず socket.io をインストールしましょう。</p>


<pre class="wp-block-code"><span><code class="hljs">$ npm install socket.io
</code></span></pre>


<p>そして起動用のスクリプトを書きます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-comment">// server.js</span>
<span class="hljs-keyword">var</span> io = <span class="hljs-built_in">require</span>(<span class="hljs-string">'socket.io'</span>).listen(<span class="hljs-number">8080</span>);
io.sockets.on(<span class="hljs-string">"connection"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">socket</span>)</span>{
    socket.emit(<span class="hljs-string">"hello"</span>, {<span class="hljs-attr">message</span>: <span class="hljs-string">"Thanks to connect !"</span>});
});
</code></span></pre>


<p>これは接続したクライアントに &#8220;hello&#8221; メッセージを送るだけのコードです。</p>



<p><strong>listen</strong> メソッドでポートを指定してサーバを起動します。 <strong>io.sockets.on</strong> メソッドでは、新たにリクエストのあったコネクションを受け取り、 そのコールバックの中で <strong>emit</strong> コマンドでクライアント側にメッセージを送ります。</p>



<p>node コマンドで WebSocket サーバを起動します。</p>


<pre class="wp-block-code"><span><code class="hljs">$ node server.js
</code></span></pre>


<p>これでサーバが立ち上がったと思います。 デーモン化したい時には <a href="https://github.com/nodejitsu/forever">forever</a> が便利です。</p>



<h3 class="wp-block-heading">クライアント側の処理</h3>



<p>WebSocketとは別に、Webサーバが立ち上がっていると仮定しましょう。 クライアント側では <strong>socket.io-client</strong> を使って WebSocket に接続します。 <strong>socket.io-client</strong> は bower でも npm でもインストールできます。</p>


<pre class="wp-block-code"><span><code class="hljs">$ bower install socket.io-client
</code></span></pre>


<p>ここではサーバから送った &#8220;hello&#8221; メッセージを受け取ってみます。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"bower_components/socket.io-client/dist/socket.io.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">script</span>&gt;</span><span class="javascript">
    <span class="hljs-keyword">var</span> socket = io.connect(<span class="hljs-string">"http://example.com:8080"</span>);
    socket.on(<span class="hljs-string">"hello"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">data</span>)</span>{
        <span class="hljs-built_in">console</span>.log(data.message); <span class="hljs-comment">// "Thanks to connect !"</span>
    });
</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
</code></span></pre>


<p>サーバから <strong>emit</strong> で送ったメッセージは、クライアント側で <strong>on</strong> で受け取る事ができます。 逆に、サーバ側にメッセージを送る時はクライアント側で <strong>emit</strong> し、サーバ側で <strong>on</strong> で受け取ります。</p>



<h3 class="wp-block-heading">全てのソケットにメッセージを送る</h3>



<p>上のサーバスクリプトでは、引数で渡された <strong>socket</strong> オブジェクトで emit を行っていましたが、 この socket はそのクライアントのみのコネクションです。 接続している全てのユーザにメッセージを送りたい場合は、socket にぶら下がっている broadcast を使用します。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">socket.emit(<span class="hljs-string">"message"</span>, ... ); <span class="hljs-comment">// 自分にメッセージを送る</span>
socket.broadcast.emit(<span class="hljs-string">"message"</span>, ...); <span class="hljs-comment">// 自分以外にメッセージを送る</span>
</code></span></pre>


<p>broadcast は自分以外のコネクションを指します。</p>



<h2 class="wp-block-heading">極めてシンプルなチャットの習作</h2>



<p>Socket.io を使って極めてシンプルなチャットプログラムを作ってみます。 上で挙げた機能のみを使用して、その場限りのチャットをする事が出来ます。 ルームや認証などは一切省いています。</p>



<p>まずHTMLは、ニックネームとメッセージを入力するインプットと、メッセージログを出力する #log で構成されます。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-comment">&lt;!-- HTML --&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">form</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"form-message"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">label</span>&gt;</span>ニックネーム: <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"nickname"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">label</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">label</span>&gt;</span>メッセージ: <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"message"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">label</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"submit"</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">form</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">hr</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">ul</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"log"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span>
</code></span></pre>


<p>次にクライアント側の JavaScript ですが、例をシンプルにする為に jQuery を使用します。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-comment">/* クライアント JavaScript */</span>
<span class="hljs-keyword">var</span> socket = io.connect(<span class="hljs-string">"http://example.com:8080"</span>);

socket.on(<span class="hljs-string">"connect"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
    $(<span class="hljs-string">"#nickname"</span>).on(<span class="hljs-string">"change"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>)</span>{
        socket.emit(<span class="hljs-string">"set nickname"</span>, {
            <span class="hljs-attr">nickname</span>: <span class="hljs-keyword">this</span>.value
        });
    });
    $(<span class="hljs-string">"#form-message"</span>).on(<span class="hljs-string">"submit"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>)</span>{
        e.preventDefault();
        <span class="hljs-keyword">var</span> input = $(<span class="hljs-string">"#message"</span>);
        socket.emit(<span class="hljs-string">"send message"</span>, {
            <span class="hljs-attr">message</span>: input.val()
        });
        input.val(<span class="hljs-string">""</span>);
    });
});

socket.on(<span class="hljs-string">"message"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">data</span>)</span>{
    $(<span class="hljs-string">"&lt;li&gt;"</span>).append($(<span class="hljs-string">"&lt;strong&gt;"</span>).text(data.nickname))
    .append($(<span class="hljs-string">"&lt;span&gt;"</span>).text(data.message))
    .prependTo(<span class="hljs-string">"#log"</span>);
});
</code></span></pre>


<p>クライアントサイドの JavaScript はこのような働きをします。</p>



<ul class="wp-block-list">
<li>#nickname の内容が変更されると <strong>&#8220;set nickname&#8221;</strong> メッセージを送ってニックネームを変更する</li>



<li>#form-message がサブミットされると、#message から <strong>&#8220;send message&#8221;</strong> でメッセージを送信する</li>



<li>サーバから <strong>&#8220;message&#8221;</strong> が届いたら、 #log の中に追加して表示する</li>
</ul>



<p>最後にサーバ側では、上記の処理をサポートするように記述します。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-comment">/* サーバ JavaScript */</span>
<span class="hljs-keyword">var</span> io = <span class="hljs-built_in">require</span>(<span class="hljs-string">'socket.io'</span>).listen(<span class="hljs-number">8080</span>);

io.sockets.on(<span class="hljs-string">"connection"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">socket</span>)</span>{
    <span class="hljs-keyword">var</span> anonymous = <span class="hljs-string">"名無しさん"</span>;
    <span class="hljs-keyword">var</span> nickname = <span class="hljs-literal">null</span>;
    socket.on(<span class="hljs-string">"set nickname"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">data</span>)</span>{
        nickname = data.nickname;
    });
    socket.on(<span class="hljs-string">"send message"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">data</span>)</span>{
        <span class="hljs-keyword">if</span>(! data.message){ <span class="hljs-keyword">return</span>; }
        <span class="hljs-keyword">var</span> vars = {
            <span class="hljs-attr">nickname</span>: nickname || anonymous,
            <span class="hljs-attr">message</span>: data.message
        };
        socket.emit(<span class="hljs-string">"message"</span>, vars);
        socket.broadcast.emit(<span class="hljs-string">"message"</span>, vars);
    });
});
</code></span></pre>


<p>socket オブジェクトには set/get が実装されており、その接続毎のデータを保持する事ができますが、 コールバックを受け取るタイプで少し例が冗長になってしまう為、ここでは単なる変数として <strong>nickname</strong> を定義しています。</p>



<p>WebSocket の働きが、なんとなく伝わったでしょうか。</p>



<h2 class="wp-block-heading">その他のヒント</h2>



<h3 class="wp-block-heading">限定されたユーザにメッセージを送りたい</h3>



<p>例えばチャットルームのような物が存在していて、その中だけでメッセージをやりとりしたい時の為に、 Socket.io には <a href="https://github.com/LearnBoost/socket.io/wiki/Rooms">「ルーム機能」</a> なる物があります。 ルームは入室・退室する事ができ、そのルームの中にいるメンバーだけに通知をする事ができます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-comment">/*  サーバ JavaScript */</span>
socket.join(<span class="hljs-string">"ChatRoom"</span>); <span class="hljs-comment">// 入室します</span>
socket.leave(<span class="hljs-string">"ChatRoom"</span>); <span class="hljs-comment">// 退室します</span>
io.sockets.in(<span class="hljs-string">"ChatRoom"</span>).emit( ... ); <span class="hljs-comment">// ルーム内のメンバーにだけ emit</span>
</code></span></pre>


<p>ルーム内にメッセージを送るには、<strong>io.sockets</strong> を <strong>in()</strong> メソッドで絞り込んで emit します。</p>



<p>また、コネクションからクライアントを切り分ける <a href="http://socket.io/#how-to-use">ネームスペース機能</a> という物もあります。 &#8220;/chat&#8221; のようにネームスペースを定義してそこに接続したクライアントだけでデータのやり取りをします。 サーバ側では <strong>of()</strong> でクライアントを絞り込んで処理をかき分けます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-comment">/*  サーバ JavaScript */</span>
<span class="hljs-keyword">var</span> chat = io.sockets.of(<span class="hljs-string">"/chat"</span>);
chat.on(<span class="hljs-string">"connection"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">socket</span>)</span>{
    socket.on(<span class="hljs-string">"send message"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">data</span>)</span>{
        chat.emit( ... );
    });
});
</code></span></pre>


<p>クライアント側では、コネクション時に &#8220;/chat&#8221; を足して接続します。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-comment">/* クライアント JavaScript */</span>
<span class="hljs-keyword">var</span> socket = io.connect(<span class="hljs-string">"http://example.com:8080/chat"</span>);
</code></span></pre>


<p>また、ネームスペースとルーム両方で絞り込む事もできます。</p>



<h3 class="wp-block-heading">セッションを管理したい</h3>



<p>socket.io のセッションは基本的にその接続限りです。 ページをリロードしたり、新しいタブで開いたりした時点で新しいコネクションが貼り直され、id も更新されてしまいます。 その為、認証などでセッションの保持をしたい場合は少し工夫が必要です。</p>



<p><a href="https://github.com/learnboost/socket.io/wiki">socket.io の wiki</a> にいくつかその為のレシピやモジュールが公開されていますが、 基本的に <strong>express</strong> や <strong>connect</strong> など、node.js ベースの解決策になっているので、 socket.io を採用する場合はWebサーバも express を選択した方が良さそうですね。 （特に他の物を使う理由もなさそうですが）</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><a href="https://github.com/wcamarao/session.socket.io">session.socket.io (SessionSockets) </a><br />
  This tiny node module simplifies your web sockets app when using http sessions from express or connect middlewares. It has no dependencies and can be initialized using any session store and cookie parser compatible with express or connect.</p>
</blockquote>



<p>こちらは socket.io でセッションを管理する為の node モジュールです。</p>



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



<ul class="wp-block-list">
<li><a href="http://ja.wikipedia.org/wiki/WebSocket">WebSocket &#8211; Wikipedia</a></li>



<li><a href="http://socket.io/">Socket.IO: the cross-browser WebSocket for realtime apps.</a></li>



<li><a href="https://github.com/learnboost/socket.io/wiki">Home · LearnBoost/socket.io Wiki</a></li>



<li><a href="http://d.hatena.ne.jp/Jxck/20110730/1312042603">Socket.IO API 解説 &#8211; Block Rockin’ Codes</a></li>



<li><a href="https://github.com/wcamarao/session.socket.io">session.socket.io (SessionSockets) </a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>&#034;node-webkit&#034; &#8211; Alphabetical Advent Calendar 2013</title>
		<link>https://blog.mach3.jp/2013/12/13/jaac-n-node-webkit.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Fri, 13 Dec 2013 01:46:17 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Advent Calendar 2013]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[node-webkit]]></category>
		<category><![CDATA[node.js]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=3724</guid>

					<description><![CDATA[&#8220;N&#8221; は node-webkit の &#8220;N&#8221;。 node-webkit node-webkit は、HTML + CSS + JavaScript でネイティブアプリケー [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>&#8220;N&#8221; は node-webkit の &#8220;N&#8221;。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-sfUrlKvY_uc/UqR4jlYXMuI/AAAAAAAACYg/WulO3x5-j-Y/s400/ac2013-n.png" alt="N"/></figure>



<p></p>



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



<h2 class="wp-block-heading">node-webkit</h2>



<p>node-webkit は、HTML + CSS + JavaScript でネイティブアプリケーションを作る事が出来る、 Chromiumをバンドルした node.js ベースのランタイムです。 Mac / Windows / Linux 用にそれぞれビルドする事が可能で、1セットのコードからクロスプラットフォームを実現出来ます。</p>



<p>Titanium Desktop や Adobe AIR 等と似たような存在ですが、 組み込んだ JavaScript からそのまま node.js のモジュールを利用出来るという大きなメリットがあります。 勿論 Titanium や AIR と同じように node-webkit 独自のAPIも提供されています。</p>



<h2 class="wp-block-heading">アプリケーションを作ってみる (Mac編)</h2>



<p>実際にシンプルなMac向けのアプリケーションを作ってみる事にします。</p>



<h3 class="wp-block-heading">下準備</h3>



<p>まず node-webkit をダウンロードしてインストールしておきましょう。 （ビルドする場合には同梱する事になるのですが、開発中はアプリケーションから開いた方が効率が良いと思います。）</p>



<p><a href="https://github.com/rogerwang/node-webkit#downloads">Download / rogerwang/node-webkit</a></p>



<p>上記URLの Download から、各環境向けにビルドしたバイナリが取得できます。 Mac 用のバイナリをダウンロードし、普段アプリケーションをインストールするのと同じように、 <strong>node-webkit.app</strong> をアプリケーションフォルダにコピーします。</p>



<h3 class="wp-block-heading">ファイル構成</h3>



<p>アプリケーションを立ち上げるのに最低限必要な物は次の要素です。</p>


<pre class="wp-block-code"><span><code class="hljs">app.nw/
├ package.json
└ application/
     └ index.html
</code></span></pre>


<ul class="wp-block-list">
<li>app.nw : アプリケーションのルートディレクトリ</li>



<li>package.json : マニフェストファイルとなります</li>



<li>application : アプリケーションのリソースを格納するディレクトリ</li>



<li>index.html : アプリケーション本体です</li>
</ul>



<h3 class="wp-block-heading">package.json</h3>



<p>package.json はアプリケーションの基本的な情報を書き込んでいきます。 このファイルが無かったり記法が間違っていたりするとアプリケーションは立ち上がりません。 中身は JSON で記述し、アプリケーションの名前やメインファイルのパス、ウィンドウの見た目などを指定する事ができます。</p>


<pre class="wp-block-code"><span><code class="hljs language-json">{
    <span class="hljs-attr">"name"</span>: <span class="hljs-string">"nw-hello"</span>,
    <span class="hljs-attr">"version"</span>: <span class="hljs-string">"0.0.0"</span>,
    <span class="hljs-attr">"main"</span>: <span class="hljs-string">"application/index.html"</span>,
    <span class="hljs-attr">"window"</span>: {
        <span class="hljs-attr">"width"</span>: <span class="hljs-number">800</span>,
        <span class="hljs-attr">"height"</span>: <span class="hljs-number">600</span>,
        <span class="hljs-attr">"toolbar"</span>: <span class="hljs-literal">false</span>
    }
}
</code></span></pre>


<p>&#8220;main&#8221; で指定したファイルがアプリケーションの本体となります。</p>



<p>設定項目はこの他に沢山用意されています。 項目の詳細については公式のwikiに詳しく記載されていますのでそちらをご覧ください。<br />
<a href="https://github.com/rogerwang/node-webkit/wiki/Manifest-format">Manifest format · rogerwang/node-webkit Wiki</a></p>



<h3 class="wp-block-heading">index.html</h3>



<p>メインファイルとなるHTMLでは、普段通りのHTML/CSS/JavaScriptを記述していけば良いです。 勿論 js や css ファイル等を外部リソースにしても構いません。</p>



<p>ここでは試しに node.js の機能を少し使ってみます。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>
    Hello, <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"user-name"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">script</span>&gt;</span><span class="javascript">
    <span class="hljs-keyword">var</span> cp = <span class="hljs-built_in">require</span>(<span class="hljs-string">"child_process"</span>);
    <span class="hljs-keyword">var</span> userName = <span class="hljs-built_in">document</span>.getElementById(<span class="hljs-string">"user-name"</span>);
    cp.exec(<span class="hljs-string">"whoami"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e, out, error</span>)</span>{
        userName.innerHTML = out;
    });
</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
</code></span></pre>


<p>アプリケーションを立ち上げると &#8220;Hello, [ユーザー名]&#8221; と表示されます。 ユーザー名を取得する為の whoami コマンドの実行に node.js の <strong>child_process</strong> を使用しています。</p>



<h3 class="wp-block-heading">アプリケーションを立ち上げる</h3>



<p>はじめにインストールした node-webkit.app を使ってアプリケーションを立ち上げます。 ターミナルで <strong>open</strong> コマンドを使い、引数にアプリケーションのディレクトリを指定します。</p>


<pre class="wp-block-code"><span><code class="hljs">$ open -a node-webkit /the/path/to/app.nw
</code></span></pre>


<p>または、node-webkit をインストールしておくと *.nw に関連付けがされる様なので、 finder から app.nw を叩くか、直接 open コマンドでも開きます。</p>


<pre class="wp-block-code"><span><code class="hljs">$ open /the/path/to/app.nw
</code></span></pre>


<p>無事立ち上がりましたか？</p>



<h3 class="wp-block-heading">Windowsの場合はどうなるか</h3>



<p>Windowsの環境でも基本的な開発の仕方はかわりません。 アプリケーションの起動は、ダウンロードしたバイナリ（nw.exe）にアプリケーションディレクトリをドラッグドロップして行います。</p>



<p>（パスを通して引数にディレクトリを渡して起動する事も出来ますが、それをする人は稀でしょう）</p>



<h2 class="wp-block-heading">パッケージングする （Mac編）</h2>



<p>このままではこのアプリケーションは自分の環境でしか動かないので、 他のコンピューターでも使用出来るようにします。 といっても、Macの場合は恐ろしく簡単で、 node-webkit.app を複製してファイルを差し替えるだけで出来てしまいます。</p>



<p>node-webkit.app は finder で見るとファイルのように見えますが、 実際は次のような構造のディレクトリになっています。</p>


<pre class="wp-block-code"><span><code class="hljs">node-webkit.app/
└ Contents/
     ├ Frameworks/
     ├ Info.plist
     ├ MacOS/
     ├ PkgInfo
     └ Resources/
</code></span></pre>


<p>この <strong>Resources</strong> の中にアプリケーションのディレクトリを入れ、 node-webkit.app を <strong>hello.app</strong> のようにリネームしてあげれば完成です。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml">hello.app/
└ Contents/
     ├ <span class="hljs-tag">&lt;<span class="hljs-name">省略</span>&gt;</span>
     └ Resources/
          └ app.nw/
               ├ package.json
               └ application/
</code></span></pre>


<p>こんな感じになりますね。</p>



<h2 class="wp-block-heading">パッケージングする （Windows編）</h2>



<p>Windows向けのアプリケーションは、Macのようにディレクトリのままリリースする方法と、 アプリケーションディレクトリを exe ファイルに結合する方法があります。</p>



<p>まずはWindows用のバイナリをダウンロードして zip を展開しておきましょう。これは共通して使用します。<br />
<a href="https://github.com/rogerwang/node-webkit#downloads">https://github.com/rogerwang/node-webkit#downloads</a></p>



<h3 class="wp-block-heading">ディレクトリのままパッケージングする</h3>



<p>Macのようにディレクトリのままコピーしてしまう方法も取ることが出来ます。 但し、package.json は nw.exe と同じディレクトリになければなりませんので、 アプリケーションディレクトリの中身をそのままコピーするイメージです。 （その為、アプリケーションのリソースはまとめて <strong>application/</strong> 等に格納しておくと管理が楽です）</p>


<pre class="wp-block-code"><span><code class="hljs">node-webkit-vX.X.X-win-ja32
├ credits.html
├ *.dll
├ nw.exe
├ nw.pak
├ nwsnapshot.exe
├ package.json
└ application/
     └ index.html
</code></span></pre>


<p>nw.exe はアプリケーションの名前にあわせてリネームしておくと良いでしょう。 ディレクトリ内の dll ファイルや pak ファイルは動作時に必要なので、まとめて同梱して配布しましょう。</p>



<h3 class="wp-block-heading">結合してパッケージングする</h3>



<p>まず、node-webkitのディレクトリの中に、アプリケーションディレクトリを zip 圧縮した物を格納します。</p>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-tag">node-webkit-vX</span><span class="hljs-selector-class">.X</span><span class="hljs-selector-class">.X-win-ja32</span>
├ <span class="hljs-selector-tag">nw</span><span class="hljs-selector-class">.exe</span>
├ &lt;省略&gt;
└ <span class="hljs-selector-tag">app</span><span class="hljs-selector-class">.zip</span>（<span class="hljs-selector-tag">zip</span>ファイル）
</code></span></pre>


<p>zip 圧縮する際に注意しなければならないのは、zip のルートに package.json がなければならない点です。 多くの圧縮ツールは圧縮時に同名フォルダを中に作ってその中に展開してしまいますが、その構成ではアプリケーションは正常に立ち上がりません。 Git CUI 等にある zip コマンドを使用した方が手っ取り早いかもしれませんね。</p>



<p>結合は、コマンドライン（コマンドプロンプト）で行います。</p>


<pre class="wp-block-code"><span><code class="hljs">&gt; copy /b nw.exe+app.zip hello-world.exe
</code></span></pre>


<p>Mac等の環境でシェルコマンドで行う事もできます。</p>


<pre class="wp-block-code"><span><code class="hljs">$ cat nw.exe app.zip &gt; hello-world.exe
</code></span></pre>


<p>これで完成です。古い nw.exe と app.zip は削除しておきましょう。</p>



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



<ul class="wp-block-list">
<li><a href="https://github.com/rogerwang/node-webkit">rogerwang/node-webkit</a></li>



<li><a href="https://github.com/rogerwang/node-webkit/wiki">Home · rogerwang/node-webkit Wiki</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>node-webkit でアプリを習作してみた話</title>
		<link>https://blog.mach3.jp/2013/11/21/try-node-webkit.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Thu, 21 Nov 2013 01:26:02 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Application]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[node-webkit]]></category>
		<category><![CDATA[node.js]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=3578</guid>

					<description><![CDATA[node-webkit というのは、HTML+CSS+JSでデスクトップアプリケーションが作れるランタイムです。 故あってこれでアプリを作ろうという企画がありましたので、 学習の為に簡単な物を作ってみました。 つくってみ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p><a href="https://github.com/rogerwang/node-webkit">node-webkit</a> というのは、HTML+CSS+JSでデスクトップアプリケーションが作れるランタイムです。 故あってこれでアプリを作ろうという企画がありましたので、 学習の為に簡単な物を作ってみました。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh5.googleusercontent.com/-2ZIHlAMG8-Y/UozUUgYC-1I/AAAAAAAACP0/cTlFDcxj8eo/s400/20131121-00.png" alt="node-webkit でアプリを習作してみた話"/></figure>



<p></p>



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



<h2 class="wp-block-heading">つくってみたもの</h2>



<h3 class="wp-block-heading"><a href="https://github.com/mach3/imaguria">Imaguria</a></h3>



<figure class="wp-block-embed"><div class="wp-block-embed__wrapper">
https://github.com/mach3/imaguria
</div></figure>



<p>画像を Data URI に変換する node-webkit 製の単機能アプリケーション。 画像をアプリケーション画面にドロップするか、 コピーした画像をアプリケーション画面にペーストすると、 Data URI が表示されます。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh4.googleusercontent.com/-rHEZ-EgmaCA/UozUUvsFvSI/AAAAAAAACP4/avJQ2x1D4Zc/s500/20131121-01.png" alt="Imaguria"/></figure>



<p></p>



<p>Windows版とMac版をご用意しました。 あまり使い道が思いつきませんが、せっかく作ったのでもしよろしければ。</p>



<p>この内容ならWebアプリケーションで十分用を足せるので あまり良い題材とは言えないかもしれませんが、 なにせ手頃な題材が思いつかなかったので。</p>



<p>おかげでおおまかな開発の流れがわかりました。</p>



<h2 class="wp-block-heading">作ってみた感想</h2>



<p>node-webkit は chronium を内包しているので、Webの技術でデスクトップアプリケーションが作れます。 Adobe AIR や Titanium Desktop 等に似た存在ですね。</p>



<p>強みの一つは、独自のAPIの他に node.js をフロントのJavaScriptから利用できる点で、 <strong>require(&#8230;)</strong> 等してモジュールを利用する事ができます。</p>



<p>node.js がそうであるように、Win / Mac / Linux のいずれでも動くマルチプラットフォームのアプリケーションが開発出来ます。 どの環境でも chronium がベースになるので、 Web開発者が常に悩まされ続けてきたクロスブラウザなどという物に縛られずに新しい技術を使い放題です。 これは結構書いていて爽快ですね。</p>



<p>node.js でローカルのファイルシステムを扱える他、Webストレージや Web SQLなどもサポートしている様です。</p>



<p>ちなみに、開発はMacがダントツでやり易かったです。</p>



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



<ul class="wp-block-list">
<li><a href="https://github.com/rogerwang/node-webkit">rogerwang/node-webkit</a></li>



<li><a href="https://github.com/rogerwang/node-webkit/wiki">Home · rogerwang/node-webkit Wiki</a></li>
</ul>



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



<p>node-webkit でのアプリの作り方はまた別の機会にします。</p>



<p>Webの技術でデスクトップアプリケーションを作るための選択肢が一つ増えました。喜ばしいことです。 これとは別に、Windows8のストアアプリもJavaScriptで開発出来る様ですよ。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>コーダーさんの為のGrunt入門（前編）〜導入編</title>
		<link>https://blog.mach3.jp/2013/03/21/gruntjs.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Thu, 21 Mar 2013 01:56:11 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Build]]></category>
		<category><![CDATA[Grunt.js]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[Tools]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=3048</guid>

					<description><![CDATA[以前はmakeを使って納品用のデータをビルドしていたりしたのですが、 去年くらいから代替にGruntを使ってみています。 この度0.3.xから0.4系に切り替えたので、覚書も兼ねてGruntの導入・使い方を記しておきます [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>以前はmakeを使って納品用のデータをビルドしていたりしたのですが、 去年くらいから代替にGruntを使ってみています。 この度0.3.xから0.4系に切り替えたので、覚書も兼ねてGruntの導入・使い方を記しておきます。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/-InKstkN_iLo/UUl5hpVLk2I/AAAAAAAACAg/zGNCjzkb8f0/s400/20120320-00.png" alt="コーダーさんの為のGrunt入門（前編）〜導入編"/></figure>



<p></p>



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



<ol class="wp-block-list">
<li>Gruntってなに</li>



<li>Gruntを導入する</li>



<li>使ってみよう</li>



<li>どんなタスクがあるの？</li>



<li>その他Gruntの魅力</li>



<li>まとめ</li>
</ol>



<h2 class="wp-block-heading">Grunt ってなに</h2>



<figure class="wp-block-image"><img decoding="async" src="https://lh4.googleusercontent.com/-cQXlXiOFRt0/UUl5hobAbMI/AAAAAAAACAg/9MA4u_DNuj0/s500/20120320-01.png" alt="GRUNT: The JavaScript Task Runner"/></figure>



<p></p>



<ul class="wp-block-list">
<li><a href="http://gruntjs.com/">GRUNT: The JavaScript Task Runner</a></li>
</ul>



<p>Gruntはnode.jsベースで作られたタスクベースのコマンドラインビルドツールです。</p>



<h3 class="wp-block-heading">ビルドツールってなに</h3>



<p>ビルドは、ソースファイル群を元にして、実行出来る成果物を生成するプロセスの事を指します。</p>



<p>cf) <a href="http://goo.gl/jZUQU">ビルド (ソフトウェア) &#8211; Wikipedia</a></p>



<p>鍋に鶏と野菜とコンソメを入れて煮込んだらポトフが出来るとして、 鍋の役割を担ってくれるのがビルドツールです。（そんな認識であっているかな？） レシピを設定しておくことが出来るので、いつでもすぐに美味しいポトフがお楽しみ頂けます。</p>



<p>具体的には、Web制作では主にJavaScriptファイルを結合・圧縮したり、 Less/Sass/Stylus等のCSSプリコンパイラの結果を生成したり、 画像の最適化などを行い、最終的に動作するWebページにしていきます。</p>



<h2 class="wp-block-heading">Gruntを導入する</h2>



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



<p>まずはGruntを導入してみます。node.jsベースなのでまず node.jsをインストールし、</p>


<pre class="wp-block-code"><span><code class="hljs">$ npm install -g grunt-cli
</code></span></pre>


<p>等とします。環境によってはsudo等が必要です。</p>



<p>grunt-cli はローカルにインストールされたgruntを呼び出すだけの係の人なので、 別途gruntも入れておく必要があります。プロジェクトルートか、あるいはその親ディレクトリにインストールしておきましょう。</p>


<pre class="wp-block-code"><span><code class="hljs">$ npm install grunt
</code></span></pre>


<h2 class="wp-block-heading">使ってみよう</h2>



<h3 class="wp-block-heading">Gruntfile.js</h3>



<p>プロジェクトディレクトリに <em>Gruntfile.js</em> ファイルを用意して設定を記述し、 そのディレクトリで <em>grunt</em> コマンドを実行するとビルドが始まります。</p>



<p>Gruntfile.js の中身は、例えば次のようになります。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-built_in">module</span>.exports = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">grunt</span>)</span>{

    <span class="hljs-comment">// `loadnpmTasks`で使用したいタスクを読み込んでおく</span>
    grunt.loadNpmTasks(<span class="hljs-string">"grunt-contrib-uglify"</span>);

    <span class="hljs-comment">// `initConfig` で基本設定</span>
    grunt.initConfig({
        <span class="hljs-attr">uglify</span> : {
            <span class="hljs-attr">dist</span> : {
                <span class="hljs-attr">src</span> : &#91;<span class="hljs-string">"assets/js/script.js"</span>],
                <span class="hljs-attr">dest</span> : <span class="hljs-string">"assets/js/script.min.js"</span>
            }
        }
    });

    <span class="hljs-comment">// `registerTask` でタスクに名前をつける</span>
    <span class="hljs-comment">// "default" でデフォルトのタスクを設定</span>
    grunt.registerTask(<span class="hljs-string">"default"</span>, &#91;<span class="hljs-string">"uglify"</span>]);

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


<h3 class="wp-block-heading">タスクについて</h3>



<p>Gruntに命令する処理を「タスク」と呼びます。</p>



<p>上の例では&#8221;uglify&#8221;というタスクに、&#8221;dist&#8221;という作業を任せています。 &#8220;uglify&#8221;は<a href="https://github.com/mishoo/UglifyJS">uglify.js</a> を使用してJavaScriptの圧縮を行なってくれるタスクで、 &#8220;src&#8221; にあるファイルリストをひとまとめにして圧縮した結果を &#8220;dest&#8221; のファイルに保存します。</p>



<p>タスクははじめから入ってるわけではないので、 使いたい物を都度インストールしましょう。</p>


<pre class="wp-block-code"><span><code class="hljs">$ npm install grunt-contrib-uglify
</code></span></pre>


<h3 class="wp-block-heading">ビルドの実行</h3>



<p>上の例ではデフォルトのタスクにuglifyが設定されているので、引数なしで</p>


<pre class="wp-block-code"><span><code class="hljs">$ grunt
</code></span></pre>


<p>とすればタスクが実行され、assets/js/script.js を圧縮した結果が assets/js/script.min.js として保存されます。</p>



<p>タスクを指定して実行したい場合は、引数にタスクの名前を渡します。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml">$ grunt uglify # <span class="hljs-symbol">&amp;lt;</span>= uglifyタスクを実行
$ grunt uglify:dist # <span class="hljs-symbol">&amp;lt;</span>= minタスクのdistという名前の作業を実行
</code></span></pre>


<h2 class="wp-block-heading">どんなタスクがあるの？</h2>



<p>以下が代表的だと思しきプラグインです。 （&#8221;contrib&#8221; とついている物は公式のものです。） 使いたい物を npm install でインストールし、 <em>loadNpmTasks</em> で読み込んで使用しましょう。</p>



<ul class="wp-block-list">
<li><a href="https://github.com/gruntjs/grunt-contrib-concat">grunt-contrib-concat</a> &#8211; ファイルを結合します</li>



<li><a href="https://github.com/gruntjs/grunt-contrib-uglify">grunt-contrib-uglify</a> &#8211; JavaScriptファイルを圧縮します</li>



<li><a href="https://github.com/gruntjs/grunt-contrib-cssmin">grunt-contrib-cssmin</a> &#8211; CSSファイルを圧縮します</li>



<li><a href="https://github.com/gruntjs/grunt-contrib-watch">grunt-contrib-watch</a> &#8211; ファイルの更新を監視して任意のタスクを実行します</li>



<li><a href="https://github.com/gruntjs/grunt-contrib-copy">grunt-contrib-copy</a> &#8211; ファイルやディレクトリをコピーします</li>



<li><a href="https://github.com/gruntjs/grunt-contrib-clean">grunt-contrib-clean</a> &#8211; ファイルやディレクトリを削除します</li>
</ul>



<p>具体的な設定例等は、各リポジトリのREADMEをご覧ください。 また、その他にも多くのタスクがあるので使えそうな物があったらピックアップしてみるといいでしょう。</p>



<ul class="wp-block-list">
<li><a href="http://gruntjs.com/plugins">Plugins &#8211; Grunt: The JavaScript Task Runner</a></li>
</ul>



<h2 class="wp-block-heading">その他Gruntの魅力</h2>



<p>なんといっても、JavaScriptベースである為にプラグイン開発が非常に身近にある点だと思います。</p>



<p>cf) <a href="http://gruntjs.com/creating-tasks">Creating tasks &#8211; Grunt: The JavaScript Task Runner</a></p>



<p>JavaScriptに心得のある人ならば、自分が使いやすいようなタスク・プラグインを自前で開発して、 自分好みの開発環境を構築していく事が出来ます。 また、その為に便利なインターフェイスも十分整備されています。 有用なプラグインが書けたら、npmにパブリッシュしておけばいつでも使えますね。</p>



<p>まさにnode様様といったところです。</p>



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



<p>Grunt の概要をざっくり紹介しました。</p>



<p>これだけではそこまで有用と思われないかもしれませんが、 多くのコーダーさんにとって威力を発揮するのは、やはりCSSプリコンパイラのビルドだと思います。 後編ではそのあたりを紹介してみます。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>パッケージマネージャー「Bower」が大変便利で捗りそうです</title>
		<link>https://blog.mach3.jp/2013/01/29/bower.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Tue, 29 Jan 2013 01:56:23 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Library]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[Package]]></category>
		<category><![CDATA[Resources]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=2982</guid>

					<description><![CDATA[外部リソースをプロジェクトにインストールするのに、今まではSublimeText2のNettuts+ Fetchを使用していましたが、 node.jsベースのパッケージマネージャーの「Bower」が大変良さそうだったので [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>外部リソースをプロジェクトにインストールするのに、今までは<a href="http://www.sublimetext.com/">SublimeText2</a>の<a href="/2012/01/sublime-text-and-nettuts-fetch.html">Nettuts+ Fetch</a>を使用していましたが、 node.jsベースのパッケージマネージャーの「Bower」が大変良さそうだったのでレポートをしたためておきます。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/-bYchZSyBnIg/UQaR7UpP18I/AAAAAAAAB7U/5grWWoVm2Vg/s400/20130129-00.png" alt="パッケージマネージャー「Bower」が大変便利で捗りそうです"/></figure>



<p></p>



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



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



<h3 class="wp-block-heading"><a href="http://twitter.github.com/bower/">BOWER &#8211; THE BROWSER PACKAGE MANAGER html, css, and javascript</a></h3>



<figure class="wp-block-image"><img decoding="async" src="https://lh5.googleusercontent.com/-lxzVaMvIoiY/UQaR7b2h0QI/AAAAAAAAB7U/pJJptRHExwo/s500/20130129-01.png" alt="Bower"/></figure>



<p></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Bower is a package manager for the web. Bower lets you easily install assets such as images, CSS and JavaScript, and manages dependencies for you.</p>



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



<p>BowerはWeb開発向けのパッケージマネージャーです。画像・CSS・JavaScriptといったリソースを簡単にインストールする事ができ、依存関係を管理してくれます。</p>
</blockquote>



<p>新しいプロジェクトをスタートする度に毎回jQuery等のリソースを複製して設置するのは面倒です。 そこでBowerを利用する事で、コマンドラインから簡単に最新のパッケージを、依存リソースと一緒にインストールする事ができます。</p>



<p>また、プロジェクトの設定ファイル（bower.json）を作成して依存リソースを記しておけば、 コマンド一発で全てダウンロード、あるいはアップデートする事ができます。 プロジェクトに必要なライブラリがチームメンバーにとって一目瞭然になるのもメリットですね。</p>



<p>見ての通り、Twitter開発陣プレゼンツのリソースです。 リリース当初小耳には挟んでいたのですが、実用するまでには至らず。実際使ってみたら大変便利でした。</p>



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



<p>まずは Bower をインストールします。必要に応じて、sudoなどしましょう。 （node.jsを先にインストールしておく必要があります）</p>


<pre class="wp-block-code"><span><code class="hljs">$ npm install -g bower
</code></span></pre>


<p>Windowsユーザーの場合は、Gitがコマンドプロンプトから呼べないと上手く動作しないそうです。 公式にあるように、msysgitインストール時に &#8220;Run Git from the Windows Command Prompt&#8221;のチェックを入れるか、 あるいは Git CUIの環境でnode.jsへのパスを通しておけば使えます。</p>



<p>cf) <a href="https://npmjs.org/package/bower">公式ドキュメント参照 (&#8220;Windows users&#8221;の項)</a></p>



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



<h3 class="wp-block-heading">パッケージをインストールする</h3>



<p>まずはコマンドラインからパッケージ単体をインストールしてみます。&#8221;install&#8221; コマンドでパッケージ名を指定します。</p>


<pre class="wp-block-code"><span><code class="hljs">$ bower install jquery
</code></span></pre>


<p>すると、カレントディレクトリに「bower_components」ディレクトリが作成され、その中にパッケージがインストールされます。 こんなかんじに。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><pre class="wp-block-code"><span><code class="hljs">ProjectRoot/
└ bower_components/
    └ jquery/
         ├ jquery.js
         ├ jquery.min.js
         ├ component.json
         └ composer.json
</code></span></pre></blockquote>



<p class="caution">
    デフォルトの名前が&#8221;components&#8221;から変更になっています &#8211; 2013/09/05
</p>



<p>パッケージ名を連記する事で複数のパッケージを一度にインストールする事もできます。</p>


<pre class="wp-block-code"><span><code class="hljs">$ bower install jquery modernizr mustache
</code></span></pre>


<p>バージョンを決め打ちしてインストールするにはシャープ記号で区切って指定することができます。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$ bower install jquery<span class="hljs-comment">#1.8.2</span>
$ bower install jquery<span class="hljs-comment">#1.8.x</span>
$ bower install jquery<span class="hljs-comment">#1.8</span>
...
</code></span></pre>


<h3 class="wp-block-heading">パッケージをアップデートする</h3>



<p>インストールしたパッケージは &#8220;update&#8221; コマンドでアップデートできます。</p>


<pre class="wp-block-code"><span><code class="hljs">$ bower update
</code></span></pre>


<h3 class="wp-block-heading">欲しいパッケージを探す</h3>



<p>欲しいパッケージがBowerに登録されているかどうかは &#8220;search&#8221; コマンドで探すことができます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$ bower search mustache

    - mustache git:<span class="hljs-comment">//github.com/janl/mustache.js</span>
    - grunt-mustache git:<span class="hljs-comment">//github.com/jonschlinkert/grunt-mustache.git</span>
</code></span></pre>


<h3 class="wp-block-heading">欲しいパッケージが見つからないんだけど？</h3>



<p>Bowerに登録されていないパッケージをインストールするにはいくつかの方法があります。 例えば、<a href="http://headjs.com">headjs</a>をインストールしたい場合。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$ bower install https:<span class="hljs-comment">//github.com/headjs/headjs</span>
$ bower install headjs/headjs
$ bower install https:<span class="hljs-comment">//raw.github.com/headjs/headjs/master/dist/head.js</span>
$ bower install ../../the/path/to/head.js
</code></span></pre>


<p>それぞれ次の物を指定してインストールしています。2番目が楽でいいですね。</p>



<ol class="wp-block-list">
<li>GitHubのリポジトリURL</li>



<li>GitHubのショートハンド</li>



<li>リソースの直接URL</li>



<li>リソースのローカルパス</li>
</ol>



<p>&#8220;register&#8221; コマンドでパッケージを新規登録する事も出来ますが、特定の条件が必要になる為、ここでは詳しく触れないでおきます。</p>



<h2 class="wp-block-heading">プロジェクトを作成する</h2>



<p>プロジェクトの設定ファイル &#8220;bower.json&#8221; を作っておく事で、 必要なパッケージを一括してインストール・アップデートする事ができます。</p>



<p>プロジェクトのルートディレクトリに&#8221;bower.json&#8221;を作成し、次のような要領で入力します。</p>



<p class="caution">
    設定ファイル名が&#8221;component.json&#8221;から変更になっています &#8211; 2013/09/05
</p>


<pre class="wp-block-code"><span><code class="hljs language-json">{
    <span class="hljs-attr">"name"</span> : <span class="hljs-string">"My Awersome Project"</span>,
    <span class="hljs-attr">"version"</span> : <span class="hljs-string">"1.0.0"</span>,
    <span class="hljs-attr">"dependencies"</span> : {
        <span class="hljs-attr">"jquery"</span> : <span class="hljs-string">"1.8"</span>,
        <span class="hljs-attr">"modernizr"</span> : <span class="hljs-literal">null</span>,
        <span class="hljs-attr">"mustache"</span> : <span class="hljs-literal">null</span>
    }
}
</code></span></pre>


<p>基本的に &#8220;dependencies&#8221; に必要なリソースを追加していく形になります。 見ての通り、キーにパッケージ名、値にバージョンを記載するオブジェクトリテラルになっており、 バージョンが &#8220;null&#8221; になっている場合は最新版をインストールします。</p>



<p>後は、引数なしで &#8220;install&#8221; コマンドを実行するだけで、依存リソースが一括してダウンロードされます。便利。</p>


<pre class="wp-block-code"><span><code class="hljs">$ bower install
</code></span></pre>


<p>また、「見つからないパッケージ」をインストールするためには、バージョンの代わりに前述の例のようなURLあるいはパス等を入力します。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-string">"dependencies"</span> : {
    ...
    <span class="hljs-string">"headjs"</span> : <span class="hljs-string">"headjs/headjs"</span>
}
</code></span></pre>


<h2 class="wp-block-heading">インストール先ディレクトリをカスタマイズする</h2>



<p>Bowerは &#8220;.bowerrc&#8221; というファイルでカスタマイズする事ができます。</p>



<p>例えば、パッケージのインストール先を &#8220;bower_components&#8221; ディレクトリから他の場所に移したい場合、 プロジェクトルートに &#8220;.bowerrc&#8221; ファイルを作成して次のように入力しておきます。</p>


<pre class="wp-block-code"><span><code class="hljs language-json">{
        <span class="hljs-attr">"directory"</span> : <span class="hljs-string">"assets/vendors"</span>
}
</code></span></pre>


<p>また、 &#8220;.bowerrc&#8221; を自分のホームディレクトリに置いておく事で、自分が作る全てのプロジェクトにカスタマイズを適用する事ができますが、 そのプロジェクトを誰かと共有する際に問題が生じそうなので、基本的にはプロジェクトに同梱しておいた方が良いと思います。</p>



<h2 class="wp-block-heading">Nettuts+ のチュートリアル動画</h2>



<h3 class="wp-block-heading"><a href="http://www.youtube.com/watch?v=USk1ie30z5k">A RequireJS, Backbone, and Bower Starter Template</a></h3>



<p><iframe width="480" height="360" src="http://www.youtube.com/embed/USk1ie30z5k?rel=0" frameborder="0" allowfullscreen=""></iframe></p>



<p>Nettuts+ によるチュートリアル動画です。 Bowerの基本的な使い方に加えて、RequireJSとBackboneによるスタートアップについて解説しています。 参考に、是非。</p>



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



<p>node.js が出てから、JSベースの便利ツールが沢山出て来ましたね。 有り難りつつも、しっかり楽をさせてもらいましょう。</p>



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



<dl>
<dt>2013/09/05</dt>
<dd>bowerバージョンアップによる設定ファイルとディレクトリ名の変更について記載</dd>
</dl>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>スタイルガイドを生成する「StyleDocco」の使用感</title>
		<link>https://blog.mach3.jp/2013/01/07/styledocco.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Mon, 07 Jan 2013 01:31:35 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Grunt.js]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[Styledocco]]></category>
		<category><![CDATA[Styleguide]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=2944</guid>

					<description><![CDATA[先日スタイルガイドを制作する機会がありまして、 せっかくなので、スタイルガイドの生成に利用したStyleDoccoの使用感などをまとめておきます。 スタイルガイドについて ざっくり言うとスタイルシートのドキュメントです。 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>先日スタイルガイドを制作する機会がありまして、 せっかくなので、スタイルガイドの生成に利用したStyleDoccoの使用感などをまとめておきます。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh4.googleusercontent.com/-n9KiTBJByMY/UOlgq5P3IrI/AAAAAAAAB5s/Lnug37hl7KA/s400/20120106-00.png" alt="スタイルガイドを生成する「StyleDocco」の使用感"/></figure>



<p></p>



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



<h2 class="wp-block-heading">スタイルガイドについて</h2>



<p>ざっくり言うとスタイルシートのドキュメントです。</p>



<p>自分一人で完結するその場限りのページなら良いのですが、 複数人のチームで組み込んでいたり、メンテナンス担当が他の方だったりする場合、 プロジェクトのCSSをドキュメント化しておく必要が出てきますね。例えば、</p>



<ul class="wp-block-list">
<li>どのような命名規則や方針で書かれていて</li>



<li>どこになにがあり</li>



<li>どのようなモジュールがどこで使えて</li>



<li>そのモジュールはどうするとどのような挙動を起こすのか</li>
</ul>



<p>等をまとめておく文書になると思います。 規模によってはかなり骨な作業になりそうです。</p>



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



<ul class="wp-block-list">
<li><a href="http://jacobrask.github.com/styledocco/">StyleDocco</a></li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>StyleDocco generates documentation and style guide documents from your stylesheets.</p>
</blockquote>



<p>スタイルシートを読み込んで、自動的にドキュメンテーションを生成してくれるツールです。</p>



<p>その為の記法に従う必要がありますが、 基本的にはCSSの記述の前に、コメント（ /* */ )で、概要文とプレビュー用のHTMLを書くだけです。 もちろんそのままCSSとしても機能します。</p>



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



<p>早速インストールをしてみます。 node.jsで動作するので、先に導入しておきましょう。</p>



<p>node.jsが入ったら、npmコマンドを叩くだけです。<br />
※環境によってはsudoや管理者権限が必要だったりします。</p>


<pre class="wp-block-code"><span><code class="hljs">$ npm install -g styledocco
</code></span></pre>


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



<h3 class="wp-block-heading">CSSの書き方</h3>



<p>前述の通り、ドキュメントの生成にはその為の記法に従う必要があります。</p>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-comment">/*
# ボタン

基本的なボタンスタイル。

    &lt;button class="button"&gt;ボタン&lt;/button&gt;

*/</span>

<span class="hljs-selector-class">.button</span> {
    <span class="hljs-attribute">border-radius</span>:<span class="hljs-number">4px</span>;
    <span class="hljs-attribute">border</span>:<span class="hljs-number">1px</span> solid <span class="hljs-number">#ccc</span>;
    <span class="hljs-attribute">background-color</span>:<span class="hljs-number">#f9f9f9</span>;
}
</code></span></pre>


<ul class="wp-block-list">
<li>概要文はMarkdown記法に対応しています。</li>



<li>プレビュー用のHTMLにはインデントが必要です。<br /><br />（タブでもいけましたが、一応公式によれば4スペースとの事です。）</li>
</ul>



<h3 class="wp-block-heading">生成コマンド</h3>



<p>インストールすると <code>styledocco</code> コマンドが使用出来るようになります。 以下は、「css」ディレクトリの中のファイルを元にドキュメントを生成する例。 出力先はデフォルトで「docs」ディレクトリになります。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$ styledocco -n <span class="hljs-string">"My Project"</span> css
</code></span></pre>


<p>使いそうな引数オプションはここらへんでしょうか。</p>



<ul class="wp-block-list">
<li>&#8211;name -n プロジェクト名（ドキュメントタイトルになります）</li>



<li>&#8211;out -o 出力ディレクトリ（デフォルトはdocs）</li>



<li>&#8211;preprocessor 使用するプリプロセッサ（Sassとかlessのコマンドを渡します）</li>
</ul>



<p>例えば以下は「My Project」というタイトルで、「styles」フォルダのソースを元に「mydocs」へ出力をし、 プリプロセッサには「lessc」コマンドを使用する事になります。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">styledocco -n <span class="hljs-string">"My Project"</span> -o mydocs --preprocessor <span class="hljs-string">"lessc"</span> styles
</code></span></pre>


<p>cf) <a href="http://jacobrask.github.com/styledocco/index.html#usage">StyleDocco &#8211; Usage</a></p>



<h3 class="wp-block-heading">gruntで自動化など</h3>



<p>gruntでwatchして自動化したい場合は、<a href="https://github.com/indieisaconcept/grunt-styleguide">grunt-styleguide</a>等を利用します。 （諸事情により私は使いませんでした）</p>



<ul class="wp-block-list">
<li><a href="https://github.com/indieisaconcept/grunt-styleguide">indieisaconcept/grunt-styleguide · GitHub</a></li>
</ul>



<p>あるいは <a href="https://github.com/sindresorhus/grunt-shell">grunt-shell</a> でシェルコマンドを書いたり、 自分でタスクを書くなどして、うまいこと楽をすると良いでしょう。</p>



<h2 class="wp-block-heading">その他、細かい使用感など</h2>



<h3 class="wp-block-heading">ページのはじめに謎の空白のボックスが？</h3>



<p>ちょっとハマった箇所ですが、ページの一番はじめのセクションで謎の空白ボックスが生まれてしまいました。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh4.googleusercontent.com/-R7TDcIMjxHs/UOlgq8NnCHI/AAAAAAAAB5s/8bVqDgymdjw/s500/20120106-01.png" alt="ページのはじめに謎の空白のボックスが"/></figure>



<p></p>



<p>概要文のコメントの先頭に改行を挟んでしまうとこうなります。</p>


<pre class="wp-block-code"><span><code class="hljs">/*

# これはダメ



/*
# こうしましょう
</code></span></pre>


<h3 class="wp-block-heading">プレビューHTML前の改行</h3>



<p>概要文とHTMLの間は基本的に1行空いていればいいのですが、 概要文がMarkdownのリスト等になっている様な場合は2行以上あけないとプレビューが正常に表示されません。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml">/*
# ボタン

* リスト
* リスト


    <span class="hljs-comment">&lt;!--こういったケースは2行あけましょう。--&gt;</span>
</code></span></pre>


<h3 class="wp-block-heading">プリコンパイラも併せて使うと重たい？</h3>



<p>私の携わったプロジェクトではSass+bootstrapで実装をしていた為、 Sassの重さとbootstrapのボリュームが相まってcss自体のジェネレートに少々時間を要しました。 それに加えて、StyleDoccoのドキュメント生成もある程度時間がかかるため、合わせ技で相当遅くなります。 gruntで自動化をしなかったのはその為です。</p>



<p>ただ、ファイル数やボリュームにも因る所が大きいので一概には言えません。 また、逆に最適化をする機会にも繋がるとも言えますね。</p>



<h3 class="wp-block-heading">ナビゲーションの生成について</h3>



<p>ドキュメントのヘッダナビゲーションには、 スタイルシートのファイル毎にメニューが生成されます。 また、フォルダでファイルを分けている場合は、プルダウンメニューになります。</p>



<p>例えばこのような構造にしてあった場合</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><pre class="wp-block-code"><span><code class="hljs">css/
  ├ common/
  │   ├ foo.css
  │   ├ bar.css
  │   └ baz.css
  ├ components/
  ├ widgets/
  └ README.md
</code></span></pre></blockquote>



<p>このような感じに出力されます。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh5.googleusercontent.com/--AxdiR0u-y0/UOlgq8-MQ6I/AAAAAAAAB5s/esRZQKbgp-s/s500/20120106-02.png" alt="ナビゲーションの生成"/></figure>



<p></p>



<p>ただし、Macでは問題なかったのですが、当方のWindows環境ではサブフォルダを全て無視されてしまいました。 Issueに投げてみたので、何か反応があったらお伝えします。</p>



<h3 class="wp-block-heading">ドキュメントページのパフォーマンス</h3>



<p>生成されたドキュメントページで動作がもたつくな、と感じたので中身をみてみました。</p>



<p>StyleDoccoのドキュメントページは、ページ毎にひとつのHTMLになっています。 CSSやJavaScriptなどの外部リソースはありません。完全にひとつのファイルです。</p>



<p>プレビューの出力はどうやっているのかというと</p>



<ol class="wp-block-list">
<li>iframeを動的に生成して、そこに自分自身を読み込む</li>



<li>読まれたHTMLでプレビューを生成し、描画する</li>
</ol>



<p>という処理をHTMLファイルに記述されたJavaScriptで行なっているようです。</p>



<p>JSで動的に生成している関係上、物とボリュームによっては描画や目次の生成などの動作がもたつく場合があります。 が、「単一ファイルでいきたい！！」というポリシーがひしひしと伝わってくるので、これはこういう物だと思って割り切りました。</p>



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



<p>自前のテンプレートでスタイルガイドを書く手もありますが、 うまく用途にマッチするのであれば、こういうツールを使って楽をしていきたいですね。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>JavaScriptのテストツール「testem」が素晴らしいぞ</title>
		<link>https://blog.mach3.jp/2012/10/31/js-testem-script.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Wed, 31 Oct 2012 00:30:00 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Jasmine]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[Test]]></category>
		<category><![CDATA[Testem]]></category>
		<category><![CDATA[Tutorial]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=2757</guid>

					<description><![CDATA[JavaScriptユニットテスト一年生の私が、Nettuts+ のチュートリアルで知ったテストツール 「testem」のお陰で大変捗ったので是非お勧めしたく、ここで紹介してみます。 testem ってなに testem [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>JavaScriptユニットテスト一年生の私が、<a href="http://net.tutsplus.com/tutorials/javascript-ajax/make-javascript-testing-fun-with-testem/">Nettuts+ のチュートリアル</a>で知ったテストツール 「<a href="https://lh6.googleusercontent.com/-PfCvl0NLxAk/UJALoNXxsFI/AAAAAAAABo8/nUGSw2u6OTc/s400/20121031-00.png">testem</a>」のお陰で大変捗ったので是非お勧めしたく、ここで紹介してみます。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-PfCvl0NLxAk/UJALoNXxsFI/AAAAAAAABo8/nUGSw2u6OTc/s400/20121031-00.png" alt=""/></figure>



<p></p>



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



<h2 class="wp-block-heading">testem ってなに</h2>



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



<ul class="wp-block-list">
<li><a href="https://github.com/airportyh/testem">testem via GitHub : airportyh/testem</a></li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Unit testing in Javascript can be tedious and painful, but Testem makes it so easy that you will actually want to write tests.</p>
</blockquote>



<p>要するに、面倒なJSのユニットテストをより快適にしてみんなでハッピーにテスト書こうよ！というツールです。 testem自体は<em>node.js</em>ベースで動作し、<em>Jasmine/QUnit/Mocha</em>に対応しています。（デフォルトはJasmine）</p>



<p>test&#8217;em は<em>&#8220;Test them&#8221;</em>の省略形でしょう。 どんなテストもまとめて引き受けますよ！という事だと思います。</p>



<h3 class="wp-block-heading">具体的になにしてくれるの</h3>



<p>例えばJasmineで<em>「基礎的で面倒なテストの開始の仕方」</em>をした場合、</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<ol class="wp-block-list">
<li>Jasmineのコードをとってきて設置し、</li>



<li>SpecRunner.html を編集し、</li>



<li>ブラウザでそのHTMLを開き、</li>



<li>テストを書いてブラウザをリフレッシュする</li>
</ol>
</blockquote>



<p>と、こんな感じの作業をプロジェクトの度に繰り返す事になります。</p>



<p>これが、testemでは</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<ol class="wp-block-list">
<li>設定ファイルを書く</li>



<li>testem コマンドを叩く</li>
</ol>
</blockquote>



<p>だけでテストが始まります。</p>



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



<p>もしnode.jsが既にインストールされている環境ならば、<em>npm</em>コマンドだけで簡単に導入できます。 （node.jsがまだ入っていないのであれば、まずそちらを先に<a href="http://nodejs.org/">インストール</a>しましょう）</p>


<pre class="wp-block-code"><span><code class="hljs">$ npm install -g testem
</code></span></pre>


<p>正常にインストールできませんでしたか？ 環境によっては<em>sudo</em>が必要になるかもしれません。</p>


<pre class="wp-block-code"><span><code class="hljs">$ sudo npm install -g testem
</code></span></pre>


<p>これでtestemコマンドが使えるようになったはずです。 ヘルプでも覗いてみましょう。</p>


<pre class="wp-block-code"><span><code class="hljs">$ testem -h
</code></span></pre>


<h2 class="wp-block-heading">テストをしてみよう</h2>



<p>早速テストをしてみようと思います。仮に、次のようなディレクトリ構造にしてみましょう。 scripts/<em>.js がテスト対象のライブラリ、tests/</em>.js がテストです。 testem.json が設定ファイルになります。</p>


<pre class="wp-block-code"><span><code class="hljs">./
├ scripts/
│   └ foobar.js
├ tests/
│   └ test-foobar.js
└ testem.json （設定ファイル）
</code></span></pre>


<h3 class="wp-block-heading">設定ファイルを書く</h3>



<p>設定ファイルはJSONで記述します。必要最低限の設定は、こんな感じになります。</p>


<pre class="wp-block-code"><span><code class="hljs language-json">{
    <span class="hljs-attr">"framework"</span> : <span class="hljs-string">"jasmine"</span>,
    <span class="hljs-attr">"src_files"</span> : &#91;
        <span class="hljs-string">"scripts/foobar.js"</span>,
        <span class="hljs-string">"tests/test-foobar.js"</span>
    ]
}
</code></span></pre>


<ul class="wp-block-list">
<li><br /><p><em>framework</em><br /><br />使いたいテストフレームワークを書きます。デフォルトはJasmineなので、Jasmineを使う場合は省略できます。</p><br /></li>



<li><br /><p><em>src_files</em><br /><br />読み込むソースファイルを配列で記述しておきます。</p><br /></li>
</ul>



<h3 class="wp-block-heading">テストを開始する</h3>



<p><em>testem</em>コマンドを叩けばテストは開始されます。</p>


<pre class="wp-block-code"><span><code class="hljs">$ testem
</code></span></pre>


<p>実行すると次のような画面が表示されます。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/-TZqBngXCrzg/UJALoJRmoLI/AAAAAAAABo8/_c1s8iHfZrg/s500/20121031-01.png" alt=""/></figure>



<p></p>



<p>表示されたURL（http://localhost:7357）を、テストしたいブラウザで開きます。すると…</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh4.googleusercontent.com/-RBqfnMLtAEE/UJALojblQxI/AAAAAAAABo8/BxySZa4wyKk/s500/20121031-03.png" alt=""/></figure>



<p></p>



<p>ブラウザにはJasmineのテスト結果が。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh4.googleusercontent.com/-QUbIOHh-vo0/UJALoBMroFI/AAAAAAAABo8/uGn0I0tuapY/s500/20121031-02.png" alt=""/></figure>



<p></p>



<p>ターミナルにもテスト結果が表示されます。</p>



<h3 class="wp-block-heading">ファイル更新を検知してくれる</h3>



<p>ソースファイルあるいはtestem.jsonを編集すると、更新を検知してブラウザとターミナルを自動的にリフレッシュしてくれます。 わざわざブラウザをアクティブにして更新する必要はありません。後はひたすらテストを書いていくのみです。</p>



<h2 class="wp-block-heading">実行時に自動的にブラウザを開く</h2>



<p>わざわざURLをコピーしてブラウザのアドレスバーに貼り付けるのが面倒！ そんな人の為に、<em>&#8220;launch_in_dev&#8221;</em>という設定項目があります。 設定ファイルにこれを追記する事で、<em>testem</em>コマンド実行時に自動的に、指定したブラウザでURLを開いてくれます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">{
    <span class="hljs-string">"launch_in_dev"</span> : &#91;
        <span class="hljs-string">"Chrome"</span>
    ],
    ...
}
</code></span></pre>


<p>使えるブラウザのリストは、次のコマンドで知ることができます。</p>


<pre class="wp-block-code"><span><code class="hljs">$ testem launchers
</code></span></pre>


<p>Windows環境ならIE7,IE8,IE9等も表示されますね。 公式のREADMEによれば、IE9のモード切り替えでのテストだそうです。</p>



<p>ただし、この設定はテスト開始時に新しいウィンドウを開いてしまいます。 その開き方が好きでない方は、大人しくブックマークに登録しておきましょう。 （私はそうしました）</p>



<h2 class="wp-block-heading">Nettuts+ のチュートリアル</h2>



<p>基本的な部分は上で紹介していますが、CofeeScriptのコンパイルを挟んだりなど、 もう少し突っ込んだ使い方はNettuts+のチュートリアル動画でわかりやすく解説されていました。 英語ですが、作業画面見ているだけでも参考になると思います。</p>



<h3 class="wp-block-heading"><a href="http://www.youtube.com/watch?v=I0Py_tqCkTo">Make JavaScript Testing Fun With Testem &#8211; YouTube</a></h3>



<p><iframe width="500" height="375" src="http://www.youtube.com/embed/I0Py_tqCkTo" frameborder="0" allowfullscreen=""></iframe></p>



<p>cf) <a href="http://net.tutsplus.com/tutorials/javascript-ajax/make-javascript-testing-fun-with-testem/">Make JavaScript Testing Fun With Testem | Nettuts+</a></p>



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



<p>面倒な部分を全部任せられるので、快適にテストをはじめられますね。 テストフレームワークだけでも有難いのに、至れり尽くせりで幸せです。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>naveで簡単！node.jsの導入メモ (Ubuntu）</title>
		<link>https://blog.mach3.jp/2011/02/22/install-nodejs-with-nave.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Tue, 22 Feb 2011 02:11:00 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Application]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=1547</guid>

					<description><![CDATA[「nave」というのはnode.jsを導入するためのシェルスクリプトです。 インストールを簡略化してくれるだけでなく、 複数のバージョンを切り替えて起動する事が出来る優れもの。 今回のお題は、naveでnode.jsを導 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>「<a href="https://github.com/isaacs/nave">nave</a>」というのは<a href="http://nodejs.org/">node.js</a>を導入するためのシェルスクリプトです。<br />
インストールを簡略化してくれるだけでなく、<br />
複数のバージョンを切り替えて起動する事が出来る優れもの。<br />
今回のお題は、naveでnode.jsを導入する覚書など。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh4.googleusercontent.com/_JJkNs5Ixl70/TVPbZqReqOI/AAAAAAAABLM/lFf6HbNy8Vo/201102102134.png" alt="naveで簡単！node.jsの導入メモ (Ubuntu）"/></figure>



<p></p>



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



<h2 class="wp-block-heading">nave.shの導入</h2>



<p><a href="https://github.com/isaacs/nave">isaacs/nave &#8211; GitHub</a></p>



<p>私はノートのUbuntuで導入してみましたよ。<br />
<em>nave.sh</em>はGitに乗っかっているので<em>clone</em>してくれば良いです。<br />
導入先は、俺々ルールに則った<em>~/opt/</em>に。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">cd ~<span class="hljs-regexp">/opt/</span> git clone http:<span class="hljs-comment">//github.com/isaacs/nave.git</span>
</code></span></pre>


<h2 class="wp-block-heading">とりあえず最新版のnode.jsを入れてみる</h2>


<pre class="wp-block-code"><span><code class="hljs language-javascript">cd ~<span class="hljs-regexp">/opt/</span>nave/ ./nave.sh install latest
</code></span></pre>


<p>基本的にnave.shに引数を渡して実行するだけです。<br />
上のコマンド例は、最新版（<em>latest</em>）をインストール（<em>install</em>）してるわけですね。<br />
極めてシンプル。使い方に迷ったら、黙って「<em>./nave.sh help</em>」。</p>



<h3 class="wp-block-heading">つまづくかもしれないポイント</h3>



<p>まず、nave.shの動作自体に<em>curl</em>が必要らしいので、<br />
入ってないのなら導入しておきましょう。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">sudo apt-<span class="hljs-keyword">get</span> install curl
</code></span></pre>


<p>他には、<em>g++</em>や<em>openssl</em>などが要求されますので、こちらもインストール。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">sudo apt-<span class="hljs-keyword">get</span> install g++ sudo apt-<span class="hljs-keyword">get</span> install libssl-dev
</code></span></pre>


<p>他にも不足している物があったら、エラーをみて都度導入してあげましょう。</p>



<p>全ての環境が完了するとインストールが始まります。<br />
少々時間を要するので、正座して待ちましょう。</p>



<h3 class="wp-block-heading">使用するnode.jsを選択する</h3>



<p>インストールが完了しても、まだnode.jsは使えません。<br />
<em>use</em>コマンドを使ってどのバージョンを使用するかを選択する必要があります。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">./nave.sh <span class="hljs-keyword">use</span> <span class="hljs-title">latest</span>
</code></span></pre>


<p>これで、最新版のnode.jsへのパスが通り、<br />
nodeコマンドが使用可能になります！おめでとう！</p>



<p>ただし、一度ログアウトすると未選択に戻ってしまい、毎度useしてあげないといけません。<br />
煩わしい場合は.bashrcにでも書いておくか、usemainコマンドを使ってみるか。</p>



<p>注意点としては、&#8221;use latest&#8221;した時に最新版が未だインストールされてないと、<br />
長～いインストールが開始されてしまいます。<br />
なので、.bashrcとかに書く場合はバージョンを決め打ちしておいた方が良い気がします。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">./nave.sh <span class="hljs-keyword">use</span> 0.4.1
</code></span></pre>


<p>すでにインストール済みのnode.jsのリストは、&#8221;nave ls&#8221;で見られます。</p>


<pre class="wp-block-code"><span><code class="hljs">./nave.sh ls
</code></span></pre>


<h2 class="wp-block-heading">ついでにnpmも入れておく</h2>



<p><a href="http://npmjs.org/">npm &#8211; Node Package Manager</a></p>



<p>npmというのは、node.js用のパッケージマネージャ。<br />
せっかくなので入れておきましょう。<br />
公式いくとワンラインインストールのコマンドが書いてあるので、それで瞬殺です。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">curl http:<span class="hljs-comment">//npmjs.org/install.sh | sh</span>
</code></span></pre>


<h2 class="wp-block-heading">テストする</h2>



<p><a href="http://nodejs.org/">node.js公式</a>にあるスクリプトでHello,Worldしてみましょう。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> http = <span class="hljs-built_in">require</span>(<span class="hljs-string">'http'</span>);
http.createServer(<span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">req, res</span>) </span>{
    res.writeHead(<span class="hljs-number">200</span>, {<span class="hljs-string">'Content-Type'</span>: <span class="hljs-string">'text/plain'</span>});
    res.end(<span class="hljs-string">'Hello World\n'</span>);
}).listen(<span class="hljs-number">8124</span>, <span class="hljs-string">"127.0.0.1"</span>);
<span class="hljs-built_in">console</span>.log(<span class="hljs-string">'Server running at http://127.0.0.1:8124/'</span>);
</code></span></pre>


<p>このスクリプトを「example.js」等に保存して次のコマンドを入力。</p>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-tag">node</span> <span class="hljs-selector-tag">example</span><span class="hljs-selector-class">.js</span>
</code></span></pre>


<p>あとはWebブラウザで「http://127.0.0.1:8124/」にアクセスして<br />
「Hello World」が表示されれば成功です。<br />
たったこれだけでWebサーバが立ち上がっちゃうなんて素敵ですね。</p>



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



<p>巷で話題のnode.jsを入れて、ちまちま弄ってみてます。<br />
一体どんな事が出来るようになるのか、イベントドリブンとやらに期待が高まりますね。</p>



<p>ちなみに、「nvm」（Node Version Manager)なんてのもあるみたいです。<br />
» <a href="https://github.com/creationix/nvm">creationix/nvm &#8211; GitHub</a></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
