<?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>Grunt &#8211; Mach3.laBlog</title>
	<atom:link href="https://blog.mach3.jp/tag/grunt/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>新しくなったスプレッドシートと簡易データベース化</title>
		<link>https://blog.mach3.jp/2014/07/29/ghostsheet2.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Tue, 29 Jul 2014 06:11:18 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Google Drive]]></category>
		<category><![CDATA[Grunt]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Spreadsheet]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=3862</guid>

					<description><![CDATA[いつであったかあまり記憶は定かではないですが、去年ぐらいに Google スプレッドシートが新しくアップデートされました。 今回は、新しい Google スプレッドシートでも旧バージョンと同じようにAjaxで簡易データベ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>いつであったかあまり記憶は定かではないですが、去年ぐらいに Google スプレッドシートが新しくアップデートされました。 今回は、新しい Google スプレッドシートでも旧バージョンと同じようにAjaxで簡易データベース化出来ないかと考えてみた話です。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/--dZVIvAjb_M/U9c2b8IXzcI/AAAAAAAAChE/rZNY_b3qe0o/s400/2014-0729-00.png" alt="新しくなったスプレッドシートと簡易データベース化"/></figure>



<p></p>



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



<h2 class="wp-block-heading">新しくなった Google スプレッドシート</h2>



<p>今までは個人設定をいじる事で旧バージョンのスプレッドシートを使い続ける事ができたのですが、 先日からそのオプションが設定画面から消えていて、特別な方法をとらないと<strong>旧バージョンのスプレッドシートを新規作成出来なくなりました</strong>。 （すでに作成したスプレッドシートは変更されない様です）</p>



<p>刷新された Google スプレッドシートにどのような素晴らしい機能が追加されたかは未だあまり把握していませんが、 現状で確かな事は、<del style="text-decoration:line-through">旧バージョンで使えたRSSやJSONでの公開APIが実装されていないという事です。 今後実装されるかどうかはわかりません。</del></p>



<p><a href="/2013/06/04/spreadsheet-as-db-for-php-ajax.html">以前書いたGhostsheet</a>はそれらの公開APIを利用した物だったので、<del style="text-decoration:line-through">新しいスプレッドシートでは使用する事ができません</del>。</p>



<dl>
<dt>2014/11/20 追記</dt>
<dd>現在ではAPIが整備された様で、新しいスプレッドシートでも旧Ghostsheetが正常に動作する事を確認しました。<br />
<a href="https://blog.mach3.jp/2013/06/04/spreadsheet-as-db-for-php-ajax.html">Googleスプレッドシートを簡易DBとして利用する -　PHP+Ajax編</a></dd>
</dl>



<h2 class="wp-block-heading">Ghostsheet も新しくしました</h2>



<p>とはいえ、pubhtml（Webページの公開）APIは利用可能なので、それをスクレイピングしてデータ化する物を新たに書きました。 全く別物になったのでリポジトリも改めています。</p>



<ul class="wp-block-list">
<li><a href="https://github.com/mach3/ghostsheet2">mach3/ghostsheet2 @ GitHub</a></li>
</ul>



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



<p>以前と同様に、スプレッドシートを作成して「Webに公開」します。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>name</th><th>age:integer</th><th>email</th><th>active:bool</th></tr></thead><tbody><tr><td>John</td><td>23</td><td>john@example.com</td><td>true</td></tr><tr><td>Tom</td><td>18</td><td>tom@example.com</td><td>false</td></tr></tbody></table></figure>



<p>一行目のヘッダ部分でデータの型を指定する事が出来ます。 上記にある <strong>integer</strong>、<strong>bool</strong> の他に、<strong>float</strong>、<strong>json</strong> が利用出来ます。 省略時は <strong>string</strong> になります。</p>



<p>そしてスプレッドシートのキーをメモしておきます。スプレッドシートのキーはURLの下記太文字の箇所になります。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<figure class="wp-block-embed"><div class="wp-block-embed__wrapper">
https://docs.google.com/spreadsheets/d/00X_xxxXX_0xXxxXx00XXXxx-xxXXxX0-XxXxXx0XxxX/edit#gid=0
</div></figure>
</blockquote>



<p>このキーをそのまま引数にしてメソッドの呼び出しをします。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="php"><span class="hljs-meta">&lt;?php</span>

<span class="hljs-keyword">require</span> <span class="hljs-string">"the/path/to/ghostsheet/phplib/Ghostsheet.php"</span>;

$gs = <span class="hljs-keyword">new</span> Ghostsheet();
$gs-&gt;config(<span class="hljs-string">"cache_dir"</span>, <span class="hljs-string">"./cache"</span>);
$data = $gs-&gt;load(<span class="hljs-string">"00X_xxxXX_0xXxxXx00XXXxx-xxXXxX0-XxXxXx0XxxX"</span>);
var_dump($data);
</span></code></span></pre>


<p>結果は連想配列で返され、&#8221;sheets&#8221; の中に各シートのデータが格納されるようになっています。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">array</span>(<span class="hljs-number">3</span>) {
  &#91;<span class="hljs-string">"title"</span>]=&gt;
  string(<span class="hljs-number">4</span>) <span class="hljs-string">"My Spreadsheet"</span>
  &#91;<span class="hljs-string">"key"</span>]=&gt;
  string(<span class="hljs-number">44</span>) <span class="hljs-string">"00X_xxxXX_0xXxxXx00XXXxx-xxXXxX0-XxXxXx0XxxX"</span>
  &#91;<span class="hljs-string">"sheets"</span>]=&gt;
  <span class="hljs-keyword">array</span>(<span class="hljs-number">2</span>) { ... }
}
</code></span></pre>


<h3 class="wp-block-heading">旧版との大きな違い</h3>



<p>旧版ではスプレッドシートに含まれるシート名で引くためには複数回リクエストしなければなりませんでしたが、 pubhtmlでは全てのシートがひとつのWebページで公開される為、一回のリクエストで済みます。 あまり大量のデータになると辛そうですが、そういった大きなデータでは利用すべきではないと思うので、 結果的には効率が良くなったと言えそうです。</p>



<h3 class="wp-block-heading">メソッドの使い分け</h3>



<p>Ghostsheet にはデータを取得する為に4つのメソッドがあります。</p>



<ul class="wp-block-list">
<li><strong>load</strong>
<ul class="wp-block-list">
<li>キャッシュファイルが期限切れでなければそれを使用</li>



<li>そうでなければリモートから最新のデータを取得し、キャッシュファイルを更新</li>
</ul>
</li>



<li><strong>cache</strong>
<ul class="wp-block-list">
<li>キャッシュの生死に関わらずキャッシュのデータを返す</li>
</ul>
</li>



<li><strong>fetch</strong>
<ul class="wp-block-list">
<li>キャッシュの生死に関わらずリモートからデータを取得</li>



<li>キャッシュの更新は行わない</li>
</ul>
</li>



<li><strong>update</strong>
<ul class="wp-block-list">
<li>キャッシュの生死に関わらずリモートからデータを取得</li>



<li>キャッシュの更新を行う</li>
</ul>
</li>
</ul>



<p>一見すると <strong>load</strong> で良さそうですが、その場合、キャッシュの期限が切れるたびにレスポンスが遅くなるタイミングが出てきてしまいます。 対策としてはデータの取得は常にキャッシュから行い、非同期で <strong>load</strong> を呼び出すのがレスポンスに優しそうです。</p>



<h3 class="wp-block-heading">（おまけ） Gruntタスク</h3>



<p>おまけ機能としてGruntタスクをつけておきました。 スプレッドシートのデータを引っ張ってJSONファイルとしてローカルに保存するだけの簡単な物です。 シートのデータを元に静的サイトをジェネレートしたい場合などに使えたり、使えなかったり。</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">ghostsheet</span>: {
        dev: {
            files: {
                <span class="hljs-string">"./data/mydata.json"</span>: <span class="hljs-string">"00X_xxxXX_0xXxxXx00XXXxx-xxXXxX0-XxXxXx0XxxX"</span>
            }
        }
    }
});

<span class="hljs-selector-tag">grunt</span><span class="hljs-selector-class">.loadNpmTasks</span>("<span class="hljs-selector-tag">ghostsheet2</span>");
</code></span></pre>


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



<p>わりと力技なパースなので、できれば用意されたAPIを使いたい気持ちもありますが…</p>



<p>ちなみに一応旧版でも新規作成する方法は残されていて、下記指定のURLにアクセスするだけで可能です。 旧版のデータが残されている以上、当面は使えそうです。</p>



<ul class="wp-block-list">
<li><a href="https://g.co/oldsheets">https://g.co/oldsheets</a></li>
</ul>



<p>cf) <a href="https://support.google.com/docs/answer/3541068?hl=ja">新しい Google スプレッドシートについて &#8211; ドキュメント エディタ ヘルプ</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>MarkdownからEPUB データを生成する「grunt-mdeb」を書いてみた</title>
		<link>https://blog.mach3.jp/2014/02/13/grunt-mdeb.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Thu, 13 Feb 2014 01:53:12 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[EPUB]]></category>
		<category><![CDATA[Grunt]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Markdown]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=3823</guid>

					<description><![CDATA[先日の記事で軽く触れた、Markdown から EPUB データを生成する Grunt タスクの体裁を整えてパブリッシュしてみました。 grunt-mdeb mach3/grunt-mdeb @ GitHub Grunt [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>先日の記事で軽く触れた、Markdown から EPUB データを生成する Grunt タスクの体裁を整えてパブリッシュしてみました。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh4.googleusercontent.com/-xyzdsDoO95M/Uvi88blGlPI/AAAAAAAACcs/l11vRUxF410/s400/2014-0210-00.png" alt="MarkdownからEPUB データを生成する「grunt-mdeb」を書いてみた"/></figure>



<p></p>



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



<h2 class="wp-block-heading">grunt-mdeb</h2>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><a href="https://github.com/mach3/grunt-mdeb">mach3/grunt-mdeb @ GitHub</a><br />
  Grunt task to publish markdown docs as EPUB 3.0 book.</p>
</blockquote>



<p>Markdown書類とJSONの設定ファイルからEPUBデータを作成します。 ナビゲーションドキュメント（論理目次＋視覚目次）はMarkdownを元に出力されるXHTMLから抽出されて自動的に生成されます。 名前の「mdeb」は「Markdown to eBook」の略です。</p>



<h3 class="wp-block-heading">動作環境</h3>



<p>タスクの中でシェルコマンドを叩いている箇所があるので、 bash等が動く環境でないと動作しません。 Mac OSX や Linux なら問題ありませんが、 Windowsの場合は Git CUI（MinGW）や cygwin 環境で使用する必要があります。 Git CUI は msysgit で Git 環境を導入していれば同梱されているのでお勧めです。</p>



<ul class="wp-block-list">
<li><a href="http://msysgit.github.io/">Git for Windows</a></li>



<li><a href="http://www.mingw.org/">MinGW | Minimalist GNU for Windows</a>（Git CUIの中身です）</li>



<li><a href="http://www.cygwin.com/">Cygwin</a></li>
</ul>



<h3 class="wp-block-heading">デモ兼ドキュメント</h3>



<p>ドキュメントは grunt-mdeb のリポジトリの「demo」の中に document.epub として保存されています。 これは実際に mdeb タスクで生成された EPUB データです。 変換される前の Markdown は demo/src に、EPUBデータにコンパイルされる前の XHTML データは demo/dest/tmp に格納されています。</p>



<ul class="wp-block-list">
<li><a href="https://github.com/mach3/grunt-mdeb/tree/master/demo/src">demo/src （Markdownデータ）</a></li>



<li><a href="https://github.com/mach3/grunt-mdeb/tree/master/demo/dest/tmp">demo/dest/tmp （XHTMLデータ）</a></li>
</ul>



<h2 class="wp-block-heading">基本的な使い方</h2>



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



<p>npm でタスクをインストールします。</p>


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


<h3 class="wp-block-heading">2. タスクの設定</h3>



<p>Gruntfile.js で &#8220;grunt-mdeb&#8221; を読み込み、&#8221;mdeb&#8221; タスクを設定します。</p>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-tag">grunt</span><span class="hljs-selector-class">.loadNpmTasks</span>("<span class="hljs-selector-tag">grunt-mdeb</span>");

<span class="hljs-selector-tag">grunt</span><span class="hljs-selector-class">.initConfig</span>({
    <span class="hljs-attribute">mdeb</span>: {
        dist: {
            options: {},
            <span class="hljs-selector-tag">src</span>: "<span class="hljs-selector-tag">src</span>",
            <span class="hljs-selector-tag">dest</span>: "<span class="hljs-selector-tag">dest</span>"
        }
    }
});
</code></span></pre>


<p><strong>src</strong> と <strong>dest</strong> は必須項目で、それぞれ元データと出力データの格納ディレクトリを指定します。 <a href="https://github.com/mach3/grunt-mdeb/blob/master/demo/src/data/06.md">options</a> は任意でオプションを設定してください。</p>



<h3 class="wp-block-heading">3. データ構成</h3>



<p>src ディレクトリの中に元データを格納していきますが、次のような構成にします。 （各ディレクトリの名前は先述のオプションで変更する事ができます）</p>


<pre class="wp-block-code"><span><code class="hljs">src/
├ assets/
├ data/
│ ├ cover.md
│ ├ 01.md
│ ├ 02.md
│ └ ...
└ publish.json
</code></span></pre>


<p><strong>data</strong> ディレクトリにはコンテンツの元になる Markdown 書類を格納します。 <strong>assets</strong> ディレクトリにはスタイルシートや画像などの依存ファイルを格納します。 assets ディレクトリの中身は全て複製されて EPUB データに同梱されます。</p>



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



<p>publish.json には、タイトルや著者名をはじめ、EPUBデータを構成する為の情報を全て記述します。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">{
    <span class="hljs-string">"meta"</span>: {
        <span class="hljs-string">"name"</span>: <span class="hljs-string">"document"</span>,
        <span class="hljs-string">"title"</span>: <span class="hljs-string">"My First Book"</span>,
        <span class="hljs-string">"author"</span>: <span class="hljs-string">"mach3"</span>,
        ...
    },
    <span class="hljs-string">"assets"</span>: {
        <span class="hljs-string">"coverImage"</span>: <span class="hljs-string">"assets/img/cover.jpg"</span>,
        <span class="hljs-string">"commonStyle"</span>: <span class="hljs-string">"assets/css/common.css"</span>,
        ...
    },
    <span class="hljs-string">"items"</span>: &#91;
        <span class="hljs-string">"data/cover.md"</span>,
        <span class="hljs-string">"data/01.md"</span>,
        <span class="hljs-string">"data/02.md"</span>
        ...
    ]
}
</code></span></pre>


<p>中のデータは３つのセクションにわかれています。</p>



<ul class="wp-block-list">
<li><strong>meta</strong><br /><br />書籍の基本的な情報を格納する</li>



<li><strong>assets</strong><br /><br />画像やスタイルシート等の情報を格納する</li>



<li><strong>items</strong><br /><br />コンテンツドキュメントの元となる Markdown ドキュメントを列挙する</li>
</ul>



<p>items の一番最初のドキュメントは表紙ページとして扱われる点にご注意ください。 項目のさらなる詳細やサンプルは <a href="https://github.com/mach3/grunt-mdeb/blob/master/demo/src/data/03.md">ドキュメント</a> に記してあります。</p>



<h3 class="wp-block-heading">5. コンパイルする</h3>



<p>mdeb タスクを実行して EPUB ファイルを生成します。</p>


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


<p>コンパイルに成功すると、dest ディレクトリの中に生成した EPUB データと、EPUB に固める直前のデータが格納されています。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">dest/
├ tmp/
│ ├ OEBPS/
│ ├ META-INF/
│ └ mimetype
└ <span class="hljs-built_in">document</span>.epub
</code></span></pre>


<h2 class="wp-block-heading">注意点</h2>



<ul class="wp-block-list">
<li><br /><p>中のシェルスクリプトには rm -r なども含まれているので、使用にはご注意ください。 コンパイルを開始する前に dest ディレクトリ内の *.epub ファイルと temp ディレクトリの中全てを削除してクリーンな状態にする様になっています。</p><br /></li>



<li><br /><p>一応バリデーションは通るように書かれていますが、あまり盲信せずに一応確認するようにしましょう。 <a href="https://github.com/mach3/grunt-mdeb/blob/master/demo/src/data/06.md">オプション</a> で、 コンパイル完了時に epubcheck を実行する事も出来るようになっています。 （別途 <a href="https://github.com/IDPF/epubcheck">epubcheck</a> のインストールが必要です）</p><br /></li>



<li><br /><p>grunt-mdeb を使用して被ったいかなる損害についても、対応はいたしかねます。</p><br /></li>
</ul>



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



<p>私は物を書くときにいつも Markdown だったので、 そのまま EPUB に出来たら楽だろうな、と思って作ってみたパッケージです。 ブログを Markdown で書かれている方も多いと思うので、 何かの役に立つことがあれば。</p>



<h2 class="wp-block-heading">追記</h2>



<dl>
<dt>2014/02/13</dt>
<dd>サンプルコードの initConfig の中身が間違っていたので修正</dd>
</dl>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
