<?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/"
	xmlns:series="http://organizeseries.com/"
	>

<channel>
	<title>増井 雄一郎 &#8211; HTML5Experts.jp</title>
	<atom:link href="/masuidrive/feed/" rel="self" type="application/rss+xml" />
	<link>https://html5experts.jp</link>
	<description>日本に、もっとエキスパートを。</description>
	<lastBuildDate>Sat, 07 Jul 2018 03:14:05 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.7.19</generator>
	<item>
		<title>ブラウザで3Dグラフィックを扱うWebGL、最新版 2.0のドラフト版が公開</title>
		<link>/masuidrive/2520/</link>
		<pubDate>Tue, 17 Sep 2013 10:57:11 +0000</pubDate>
		<dc:creator><![CDATA[増井 雄一郎]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[WebGL]]></category>
		<category><![CDATA[ブラウザ]]></category>

		<guid isPermaLink="false">/?p=2520</guid>
		<description><![CDATA[2013/9/16、WebGL Working Groupはブラウザで3Dグラフィックを扱うWebGLの最新版 WebGL 2.0のドラフト版が公開しました。 WebGL 2 Specification WebGL 2の...]]></description>
				<content:encoded><![CDATA[<p>2013/9/16、WebGL Working Groupはブラウザで3Dグラフィックを扱うWebGLの最新版 WebGL 2.0のドラフト版が公開しました。</p>

<ul>
<li><a href="http://www.khronos.org/registry/webgl/specs/latest/2.0/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">WebGL 2 Specification</a></li>
</ul>

<p>WebGL 2の最大の特徴は、2012年10月に標準化された組み込み向け3DグラフィックAPIのOpenGL ES 3.0の機能をベースにしているところです。</p>

<p>OpenGL ESは3DグラフィックをサポートするためのAPIで、WebGLではこの機能をブラウザ内で使えるようにすることで、ゲーム機の3Dグラフィックのような高度な3D表現をJavascriptから操作することが可能になります。</p>

<p>既に多くのブラウザではWebGL 1をサポートしており、すでにゲームを中心に使われる様になってきました。ChromeのCMでも使われていた<a href="http://chrome.com/maze/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Chrome World Wide Maze</a>で使われていたので、実はWebGLを見たことがある人は多いと思います。(本記事ではWebGL 1.0をWebGL 1と表記します)</p>

<p>WebGL 2では、WebGL 1をベースに上位互換性を保ちつつ、さらなるパフォーマンス向上と多くの機能強化を行ってきました。</p>

<h2>WebGL 2の特徴</h2>

<p>WebGL 2はOpenGL ES 3.0をベースとしているため、その特徴をそのまま引き継いでいます。
大きな特徴は、陰影処理やマッピングなどの高度な表現の最適化です。3Dグラフィックでもリアリティある表現が多く求められるようになり、そのような複雑な処理を行いやすくする機能が充実しています。</p>

<p><a href="https://plus.google.com/101501294230020638079/posts" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Brandon Jones氏</a>は、<a href="http://blog.tojicode.com/2013/09/whats-coming-in-webgl-20.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">TojiCode: What&#8217;s coming in WebGL 2.0</a>にて、WebGL 2の特徴と新機能を次のようにまとめています。各項目の詳細については元記事を参照してください</p>

<h3>特徴</h3>

<ul>
<li>Multiple Render Targets &#8211; 陰影処理などの遅延を行うDeferred Shadingの基礎技術</li>
<li>Instancing &#8211; 同じオブジェクトが沢山ある処理を早くする</li>
<li>Vertex Array Objects &#8211; 頂点計算の処理をまとめて行う</li>
<li>Fragment Depth &#8211; フラグメントのデプス値をサポート</li>
</ul>

<h3>新機能</h3>

<ul>
<li>Multisampled Renderbuffers</li>
<li>3D Texture</li>
<li>Sampler Objects</li>
<li>Uniform Buffer Objects</li>
<li>Sync Objects</li>
<li>Query Objects</li>
<li>Transform Feedback</li>
</ul>

<h2>実装状況</h2>

<p>WebGL 2は、Firefoxで実装が進められており、現在公開されている<a href="http://nightly.mozilla.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Nightly build</a>で動かすことができます。</p>

<p><a href="https://wiki.mozilla.org/Platform/GFX/WebGL2" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Mozilla WikiのWebGL2ページ</a>では、サンプルコードも掲載されており、自分で試すことができます。</p>

<p>まとまったデモのソースコードなどはまだ公開されていませんが、下記の多くのオブジェクトを影付きで動かすデモがYoutubeで公開されています。</p>

<p><iframe width="420" height="315" src="http://www.youtube.com/embed/_DuHAQuEJKE?feature=oembed&#038;wmode=opaque" frameborder="0" allowfullscreen></iframe></p>

<p>今後、Web上でも3D表現を使ったゲームやコンテンツが増えていくと予想されます。</p>

<p>WebGLの最大の問題は、Internet Explorerではサポートされていないことだと言われてきましたが、現在ベータ版のInternet Explorer 11からWebGL 1のサポートを開始しました。これによりさらにWebGLによる開発が活発化していくでしょう。</p>

<p>3Dグラフィックの分野は、まだまだ発展中の分野で新機能やパフォーマンスの向上が継続的に行われています。</p>

<p>WebGL 2はOpenGL ES 3.0という最新の3Dグラフィック環境を、ブラウザとJavascriptで試すことができるため、3Dプログラミングに興味のある方は注目してみると面白いのではないでしょうか。</p>
]]></content:encoded>
			</item>
		<item>
		<title>HTML5でサイトを高速化─wri.peで学ぶ、イマドキのWebアプリの作りかた（後編）</title>
		<link>/masuidrive/807/</link>
		<comments>/masuidrive/807/#respond</comments>
		<pubDate>Tue, 16 Jul 2013 02:00:31 +0000</pubDate>
		<dc:creator><![CDATA[増井 雄一郎]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Web Storage]]></category>
		<category><![CDATA[wri.pe]]></category>
		<category><![CDATA[イマドキのWebアプリの作りかた]]></category>
		<category><![CDATA[パフォーマンス]]></category>

		<guid isPermaLink="false">/?p=807</guid>
		<description><![CDATA[連載： イマドキのWebアプリの作りかた (2)前回の記事では、 wri.peの紹介と、HTML5のApplication Cacheを使ったHTMLや画像などの読み込み高速化の話をしました。今回は、Web Storag...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/app-lobo/" class="series-150" title="イマドキのWebアプリの作りかた" data-wpel-link="internal">イマドキのWebアプリの作りかた</a> (2)</div><p><a href="https://html5experts.jp/masuidrive/594/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">前回の記事</a>では、 <a href="https://wri.pe/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">wri.pe</a>の紹介と、HTML5のApplication Cacheを使ったHTMLや画像などの読み込み高速化の話をしました。今回は、Web StorageのlocalStorage/sessionStorageを使い、Ajax通信部分と表示の高速化を行う手法を説明しましょう。
<span id="more-807"></span></p>

<h2>localStorageを用いた通信と表示の高速化</h2>

<p>前回のApplication Cacheで、HTMLの読み込みが高速化されました。これでも十分速くはなったのですが、画面に全ての情報が表示されるまでには、ちょっと時間がかかります。</p>

<p>wri.peではメモの一覧や、メモ本体の読み込み・保存はXHR(XMLHttpRequestの略。Ajax通信で使うモジュール名)を使って行っています。この内容は常に変更されるためApplication Cacheに入れるわけには行きません。そのため、実際に画面に全ての情報が表示されるのは、XHRでメモ一覧を取得した後になります。</p>

<p>回線が安定していれば大体一秒程度の時間ですが、ページ遷移ごとに1秒待たされると「さくさく動く」という感じではなくなってしまいます。</p>

<p>そこで、サーバから取得した情報をJavaScriptでキャッシュしておき、次回アクセス時には、このキャッシュの内容を表示してから、XHRを使い最新の情報をサーバから取得するようにします。</p>

<p>これにより、まずはキャッシュの内容を表示し、その後XHRで取得した内容を表示するため、キャッシュが古かった場合には、画面の書き換えが発生します。</p>

<p>一つのブラウザでwri.peを使っていれば、前回の保存内容が最新のモノなので、多くの場合はキャッシュで問題ありません。</p>

<p>JavaScriptでキャッシュを行うには、<a href="http://www.w3.org/TR/webstorage/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Web Storage</a>のlocalStorageという機能を使います。</p>

<p>localStorageでは、<code>localStorage.key1 = 'ABC';</code>の様にlocalStorageオブジェクトに設定したデータをページの遷移やリロードに関わらず保存します。ここにXHRで取得した情報を入れておけば、キャッシュとして利用することができます。</p>

<p>localStorageに保存したデータは、プロトコル、ホスト名、ポートが同一の場合に読み出すことができます。そのため、同一ホスト名で動いている別のJavaScriptから情報を読み出せるため、独自ドメインなどで運用しない場合は、気をつけて使用してください。</p>

<p>XHRとlocalStorageを使ったサンプルが下記の様になります。</p>

<p>(invalid jsdo.it code)</p>

<p>効果を分かりやすくするために、通信部分に1秒の遅延を入れてあります。リロードするたびにランダムでJSONを取得しますが、その前に前回取得したJSONを表示する様になっています。</p>

<p>このようにlocalStorageに前回のアクセス情報を保存しておくことで、XHRを待たずにユーザに情報を表示させることができます。</p>

<h2>iOSで勝手に再読込がかかってもsessionStorageがあれば大丈夫</h2>

<p>iOSでWebアプリを作る上での最大の敵は、別のウインドウや別のアプリに切り替えた後、アプリのウインドウに戻った際に行われるページのリロードにあると思います。</p>

<p>この仕組みのおかげでユーザが入力中の内容が消えてしまい、ユーザビリティが大きく損なわれてしまいます。wri.peでもメモを入力中に他のアプリに切り替えただけで、メモが消えてしまってはメモ帳として使うことができません。</p>

<p>入力中の内容を常にlocalStorageに入れておけば、再読込がされても内容を保持することができます。しかしlocalStorageはドメイン単位で保持されるので、複数のタブでwri.peを開いていた場合、保持内容が上書きされてしまいます。</p>

<p>Web StorageにはlocalStorage以外に、sessionStorageという規格があります。localStorageは同一ドメインで共有された情報でしたが、sessionStorageはウインドーやタブごとに情報が保持されます。</p>

<p>sessionStorageを使ったサンプルが下記の様になります。sessionStorage.draft_bodyという変数はページが再読込されても保持されます。ウインドウやアプリの切り替えに伴う再読込でも、sessionStorageの内容は保持されます。</p>

<p>(invalid jsdo.it code)</p>

<p>wri.peに限らず入力フォームがありスマートフォン対応しているサイトの場合には、このsessionStorageを使う事でユーザビリティを大幅に向上できます。数行のJavaScriptで対応できるのでスマートフォン対応しているサイトぜひ試してみてください。</p>

<h2>デザインはdribbbleから</h2>

<p>wri.peを公開後、よく聞かれるのはデザインについてです。wri.peはアプリアイコンと英語の査読を除いて一人で作りました。</p>

<p>デザインをイチから考えるのは難しいので、まずは定番の<a href="http://twitter.github.io/bootstrap/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Twitter Bootstrap</a>を使ってとりあえずアプリを作りました。</p>

<p>その上で、<a href="http://dribbble.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">dribbble</a>という世界のデザイナがデザインやスクリーンショットを投稿するSNSサイト上で「<a href="http://dribbble.com/search?q=webapp" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">webapp</a>」や「<a href="http://dribbble.com/search?q=mail" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">mail</a>」などのキーワードで検索して、自分が目指すようなデザインを探します。</p>

<p>そこで、左にナビゲーションバーを出し、大きなアイコンを表示しているサイトがいくつかあり、これを参考にして、下記の様なデザインにしました。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2013/07/design2.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img class="aligncenter size-medium wp-image-837" alt="wri.pe デザイン - 1" src="/wp-content/uploads/2013/07/design2-300x188.png" width="300" height="188" srcset="/wp-content/uploads/2013/07/design2-300x188.png 300w, /wp-content/uploads/2013/07/design2-207x129.png 207w, /wp-content/uploads/2013/07/design2.png 640w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<p>はじめは上のような感じで作ったのですが、ナビゲーションとアプリの境目がはっきりするように、下のように色を調整してみました。</p>

<p><img class="aligncenter size-medium wp-image-839" alt="wri.pe デザイン - 2" src="/wp-content/uploads/2013/07/design31-300x156.png" width="300" height="156" /></p>

<p>これだと画面に特徴がなく印象が弱いので、白黒を基本にして特徴色として自分の好きなオレンジを選びました。カラーコードを決めるのは<a href="http://www.colourlovers.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">COLOURlovers</a>を参考にしました。</p>

<div id="attachment_604" style="width: 310px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2013/07/8856658928_e82a471d40_o.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img class="size-medium wp-image-604" alt="wri.pe" src="/wp-content/uploads/2013/07/8856658928_e82a471d40_o-300x187.png" width="300" height="187" srcset="/wp-content/uploads/2013/07/8856658928_e82a471d40_o-300x187.png 300w, /wp-content/uploads/2013/07/8856658928_e82a471d40_o-1024x640.png 1024w, /wp-content/uploads/2013/07/8856658928_e82a471d40_o-207x129.png 207w, /wp-content/uploads/2013/07/8856658928_e82a471d40_o.png 640w" sizes="(max-width: 300px) 100vw, 300px" /></a><p class="wp-caption-text">wri.pe</p></div>

<div id="attachment_605" style="width: 167px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2013/07/8856047123_c76d9a0e4f_o.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img class="size-medium wp-image-605" alt="wri.pe（モバイル）" src="/wp-content/uploads/2013/07/8856047123_c76d9a0e4f_o-157x300.png" width="157" height="300" srcset="/wp-content/uploads/2013/07/8856047123_c76d9a0e4f_o-157x300.png 157w, /wp-content/uploads/2013/07/8856047123_c76d9a0e4f_o-537x1024.png 537w, /wp-content/uploads/2013/07/8856047123_c76d9a0e4f_o-108x207.png 108w, /wp-content/uploads/2013/07/8856047123_c76d9a0e4f_o.png 336w" sizes="(max-width: 157px) 100vw, 157px" /></a><p class="wp-caption-text">wri.pe（モバイル）</p></div>

<p>フリーでアイコンを配布しているサイトは多くあるのですが、サイズの変更が容易なことと、CSSのみで管理が容易な事から<a href="http://fortawesome.github.io/Font-Awesome/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Font Awesome</a>というWeb Fontsを使っています。</p>

<p>Web FontsもCSS3の一機能で、ブラウザで使うフォントを外部から読み込む事ができます。Font Awesomeでは外字領域にいろいろなアイコンを定義して配布しています。</p>

<p>Font Awesomeはベクターなので、サイズを変更しても絵が崩れない、アイコンの色をCSSで指定できるという利点があります。しかし単色のアイコンしかないという欠点もあります。</p>

<p>デザインができなくても、このように既存のツールや情報の組み合わせで、それっぽいサイトを作ることができます。</p>

<h2>デスクトップもスマートフォンも一つのHTMLで実現</h2>

<p>Twitter Bootstrapでは、<a href="http://twitter.github.io/bootstrap/scaffolding.html#responsive" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">&#8220;Responsive utility&#8221;</a>を使うことで、一つのHTMLで複数のデバイスに対応させる事ができます。wri.peも開発当初はこの機能を使っていたのですが、最近のスマートフォンは解像度が上がりタブレットとの境界が曖昧になっており、単純にタブレットやスマートフォンといった区別では、使いやすいサイトを作るのが困難だと感じました。</p>

<p>そこで、Bootstrapを参考にしつつ、スマートフォンやタブレットでは、縦と横でレイアウトが変わるようなライブラリを自作する事にしました。</p>

<p>仕組みとしては非常に簡単で、起動時にJavaScriptでデバイスの種類を判定して、bodyタグのクラスに追加します。これでHTMLのクラス指定だけで、複数デバイス対応のHTMLを書くことができます。
</p><pre class="crayon-plain-tag">var userAgent = window.navigator.userAgent.toLowerCase();

var device_type = 'desktop';
if(userAgent.indexOf('ipad') &amp;gt; 0 ||
   userAgent.indexOf('iphone') &amp;gt; 0 ||
   userAgent.indexOf('ipod') &amp;gt; 0 ||
   userAgent.indexOf('android') &amp;gt; 0) {
   var win = $(window);
   if(win.width() &amp;gt; win.height()){
       device_type = 'tablet';
   }
   else {
       device_type = 'phone';
   }
}

$(document.body).addClass(device_type);</pre><p>
すこし書きやすくするために、下記の様なCSSも定義します。
</p><pre class="crayon-plain-tag">body.desktop .hidden-desktop,
body.desktop .visible-phone,
body.desktop .visible-tablet
{
    display: none;
}

body.phone .visible-desktop,
body.phone .hidden-phone,
body.phone .visible-tablet
{
    display: none;
}

body.tablet .visible-desktop,
body.tablet .visible-phone,
body.tablet .hidden-tablet
{
    display: none;
}</pre><p>
この様に定義しておくことで、デスクトップでのみ表示させたい部分を<code>&lt;div class="visible-desktop"&gt;...&lt;/div&gt;</code>で囲うだけで、スマートフォンやタブレットでは表示されなくなります。</p>

<p>(invalid jsdo.it code)</p>

<p>wri.peでは、このようにHTML内でデバイス毎に、表示・非表示を指定することで一枚のHTMLで複数のデバイスに対応しています。</p>

<h2>おわりに</h2>

<p>2回に渡って、wri.peでHTML5をどのように活用しているかについて解説させて頂きました。</p>

<p>HTML5はアニメーションや見た目の互換性などビジュアル面が注目されがちですが、Application CacheやWeb Storageなどロジック方面も大幅に強化されおり、プログラマとしても面白い点がたくさんあります。今後HTML5が普及していく上で、この記事が少しでも参考になれば幸いです。</p>

<p>「<a href="https://html5experts.jp/masuidrive/594/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">wri.peで学ぶ、イマドキのWebアプリの作りかた（前編）</a>」を読む</p>
]]></content:encoded>
			<wfw:commentRss>/masuidrive/807/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<series:name><![CDATA[イマドキのWebアプリの作りかた]]></series:name>
	</item>
		<item>
		<title>wri.peで学ぶ、イマドキのWebアプリの作りかた（前編）</title>
		<link>/masuidrive/594/</link>
		<comments>/masuidrive/594/#respond</comments>
		<pubDate>Tue, 09 Jul 2013 11:34:44 +0000</pubDate>
		<dc:creator><![CDATA[増井 雄一郎]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Application Cache]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[wri.pe]]></category>
		<category><![CDATA[イマドキのWebアプリの作りかた]]></category>
		<category><![CDATA[パフォーマンス]]></category>

		<guid isPermaLink="false">/?p=594</guid>
		<description><![CDATA[連載： イマドキのWebアプリの作りかた (1)エキスパートが手がけたプロダクトを題材に技術的な解説を行っていくシリーズ連載、今回は wri.peです。 難しい機能の実装や、先進的なAPIの利用を通じて、執筆者が得たノウ...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/app-lobo/" class="series-150" title="イマドキのWebアプリの作りかた" data-wpel-link="internal">イマドキのWebアプリの作りかた</a> (1)</div><p>エキスパートが手がけたプロダクトを題材に技術的な解説を行っていくシリーズ連載、今回は <a href="https://wri.pe/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">wri.pe</a>です。
難しい機能の実装や、先進的なAPIの利用を通じて、執筆者が得たノウハウを余すところなく紹介していきます。</p>

<p><span id="more-594"></span></p>

<h2>HTML5を活用したメモ帳アプリ [wri.pe]</h2>

<p>最近、仕事で作っている<a href="http://miil.me/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ミイル</a>が忙しかったり、趣味で作っている<a href="http://mobiruby.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">MobiRuby</a>がなかなか進まなかったりして、個人でWebサービス的なモノを作っていない事が自分としてちょっと気になっていました。</p>

<p>そこで息抜きとして、ゴールデンウイークに集中してWebサービスを一つ作ろう！と思い立ち、<a href="https://wri.pe/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">wri.pe</a>というWebサービスの開発に着手しました。</p>

<p>wri.peは自分が使いたいと思えるメモ帳を作ったので、下記の様な特徴を持っています。</p>

<ul>
<li><a href="http://ja.wikipedia.org/wiki/Markdown" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Markdown</a>フォーマットをサポート</li>
<li>Gmailの様なアーカイブ機能</li>
<li>全文検索</li>
<li>カレンダーへのマッピング</li>
<li>iPhone / iPadをサポート</li>
<li>キーボードで操作ができる</li>
</ul>

<p>ゴールデンウイーク期間中に一通り作った後、一カ月ほど自分で使いながらブラッシュアップし、6月3日に正式にリリースしました。</p>

<p>初めて個人でプレスリリースを打ってみたところ、個人でリリースしたWebサービスとしては多くの国内外の<a href="http://worklista.com/users/masuidrive/tag/wripe" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">メディアやブログ</a>に取り上げていただきました。</p>

<div id="attachment_604" style="width: 310px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2013/07/8856658928_e82a471d40_o.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img class="size-medium wp-image-604" alt="wri.pe" src="/wp-content/uploads/2013/07/8856658928_e82a471d40_o-300x187.png" width="300" height="187" srcset="/wp-content/uploads/2013/07/8856658928_e82a471d40_o-300x187.png 300w, /wp-content/uploads/2013/07/8856658928_e82a471d40_o-1024x640.png 1024w, /wp-content/uploads/2013/07/8856658928_e82a471d40_o-207x129.png 207w, /wp-content/uploads/2013/07/8856658928_e82a471d40_o.png 640w" sizes="(max-width: 300px) 100vw, 300px" /></a><p class="wp-caption-text">wri.pe</p></div>

<div id="attachment_605" style="width: 167px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2013/07/8856047123_c76d9a0e4f_o.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img class="size-medium wp-image-605" alt="wri.pe（モバイル）" src="/wp-content/uploads/2013/07/8856047123_c76d9a0e4f_o-157x300.png" width="157" height="300" srcset="/wp-content/uploads/2013/07/8856047123_c76d9a0e4f_o-157x300.png 157w, /wp-content/uploads/2013/07/8856047123_c76d9a0e4f_o-537x1024.png 537w, /wp-content/uploads/2013/07/8856047123_c76d9a0e4f_o-108x207.png 108w, /wp-content/uploads/2013/07/8856047123_c76d9a0e4f_o.png 336w" sizes="(max-width: 157px) 100vw, 157px" /></a><p class="wp-caption-text">wri.pe（モバイル）</p></div>

<h2>wri.peが目指すモノ</h2>

<p>wri.peは息抜きで作ったモノですが、せっかく作るのだからといくつかの目標を立てました。詳しくは<a href="http://blog.masuidrive.jp/index.php/2013/06/03/wripe-app/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ブログ</a>をご覧頂きたいのですが、その中の一つに、新しい技術で製品レベルのサイトを作った場合に起こる問題点などを把握したいという目標がありました。</p>

<p>HTML5の機能やBackboneJSなど耳にすることはあっても、実際に製品レベルのサイトで使って大丈夫なのか自分の肌感覚として把握できていないと仕事などで使うことができません。</p>

<p>HTML5というと、CSS3を用いたアニメーションや3D表現、ビデオやオーディオの標準化など、ブラウザ上の表現力向上が多く取り上げられます。
またHTML5の仕様には入りませんでしたが、WebSocketを用いたリアルタイム通信やGeolocation APIを使った位置情報の取得なども、広義のHTML5として話題になっています。</p>

<p>そこでwri.peでは、HTML5の中でも速度の向上にターゲットを絞って、新しい機能を使ってみることにしました。</p>

<h2>サイトの高速化のためにHTML5を使用する</h2>

<p>ほとんどのブラウザでは、通信をキャッシュする機能を有していて、同じページや画像の表示を高速化しています。
このキャッシュの制御はWebサーバで設定を行い、HTTPヘッダに特別な値を設定する事で有効期限などを設定することができます。
HTML5では、そうした既存のキャッシュ機構に加えて、<a href="http://www.whatwg.org/specs/web-apps/current-work/#applicationcache" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Application Cache</a>というキャッシュ機構を持っています。</p>

<h2>Application Cacheで通信を減らそう</h2>

<p>このApplication Cacheは本来、Webアプリをオフラインでも動かすために、通信状況に関係なくHTMLや画像を読み込むことのできるキャッシュとして設計されました。
しかし通常のWebサイトでもこのApplication Cacheを使うことで、画像などを読み込むためのネットワークアクセスを抑制し、ページの読み込み速度を上げることができます。</p>

<p>Application Cacheは、マニフェストファイルと呼ばれるファイルにキャッシュしたいファイル名を書くだけでキャッシュが行われます。そのため、HTMLやJavaScriptファイルに変更の必要がなく、手軽に導入できるというメリットがあります。</p>

<p>変更頻度の低いロゴなどの画像やCSSなどをこのマニフェストファイルに記述し、HTMLの中でマニフェストファイルのパスを指定するだけです。</p>

<p>なお、wri.peでは<a href="https://github.com/wycats/rack-offline" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">rack-offline</a>というライブラリを使い、マニフェストファイルを生成しています。</p>

<p>例) http://wri.pe/application.appcache</p>

<pre><code>CACHE MANIFEST
# 91ccff4f438451ad735c534b974c29e2ff1b08a9da4e71f928b5fc2f4ba6bd02
/assets/app-437607bb972a49c7922a504cfe02226a.css
/assets/app-7c794995cb685c8412ee2f1facea67e3.js
/fonts/fontawesome-webfont-311.ttf
/fonts/fontawesome-webfont-311.woff
/images/wripe114s.png
/images/dropbox_icon128.png
/images/wripe400s.png
/images/wripe-top880.png
/images/masuidrive64.jpg

NETWORK:
*
</code></pre>

<p>HTML部</p>

<pre><code>:html:
&lt;!DOCTYPE html&gt;
&lt;html lang="en" manifest="application.manifest" xmlns:og="http://ogp.me/ns#" xmlns:fb="http://www.facebook.com/2008/fbml"&gt;
&lt;head&gt;
....
</code></pre>

<p>Application Cacheでは、コメントも含めマニフェストファイルが１文字でも変更されるとキャッシュが破棄され、ネットワークから最新のデータが読み込まれます。
このキャッシュの制御はJavaScriptから行う事が可能なのですが、iOS 6ではバグがあるようでJavaScriptからキャッシュの更新などが正しく行えないようです。</p>

<p>またリソースの変更後にマニフェストファイルを更新しても、その変更が反映されるのは次回の読み込み時になります。そのため、更新頻度の高いファイルをキャッシュする用途にはあまり向きません。</p>

<p>wri.peでは、RailsのAssets Pipelineという機能を使い、JavaScriptとCSSをそれぞれ一つのファイルにまとめることで、ファイルの読み込み回数を減らし、表示を高速化しています。</p>

<p>実際に読み込み時間を比較してみます。赤い縦の線が、大体画面に表示される時間だと思ってください。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2013/07/noncache.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img class="aligncenter size-large wp-image-606" alt="noncache" src="/wp-content/uploads/2013/07/noncache-1024x250.png" width="1024" height="250" srcset="/wp-content/uploads/2013/07/noncache-1024x250.png 1024w, /wp-content/uploads/2013/07/noncache-300x73.png 300w, /wp-content/uploads/2013/07/noncache-207x50.png 207w, /wp-content/uploads/2013/07/noncache.png 640w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></p>

<p><a href="https://html5experts.jp/wp-content/uploads/2013/07/cached.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img class="aligncenter size-large wp-image-607" alt="cached" src="/wp-content/uploads/2013/07/cached-1024x256.png" width="1024" height="256" srcset="/wp-content/uploads/2013/07/cached-1024x256.png 1024w, /wp-content/uploads/2013/07/cached-300x75.png 300w, /wp-content/uploads/2013/07/cached-207x51.png 207w, /wp-content/uploads/2013/07/cached.png 640w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></p>

<p>キャッシュのない状態では1,150ms、キャッシュありでは200msほどになります。</p>

<p>テストでは、回線が高速なため、思ったよりも差が出なくなっていますが、スマホなどでキャッシュなしの場合には、これより数倍遅くなる事が多いと思われます。キャッシュありの場合では回線速度に依存せず、安定して高速な読み込みが可能です。</p>

<p>また、Application Cacheにキャッシュされているファイルは、ネットに繋がっていない状態でも読み出すことができます。
試しにPCをネットから切り離すか、iPhone/Androidをフライトモードにして、https://wri.pe/app にアクセスしてみてください。全てのファイルがキャッシュから読み込まれるため、ネットに繋がっていない状態でも同じように表示されるでしょう。</p>

<p>ただしメモ帳のデータはApplication Cacheには入っていないので、本来であればオフライン時に読み込むことはできません。しかしそれらの情報はまた別の方法でキャッシュしているため、オフライン状態でもメモ一覧が表示されるのです。</p>

<h2>次回予告</h2>

<p>今回はApplication Cacheを使い、各種ファイルの読み込みを高速化する手法を取り上げました。</p>

<p>wri.peでは、メモ帳データのようにAjax通信で取り出すためキャッシュしにくいデータも、localStorageを使いキャッシュしています。</p>

<p>次回はlocalStorageを用いたデータのキャッシュや、PC向けブラウザ、iPhone/Android、iPadなどのタブレットを一つのHTMLで対応する手法について解説します。</p>

<p>「<a href="https://html5experts.jp/masuidrive/807/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">HTML5でサイトを高速化─wri.peで学ぶ、イマドキのWebアプリの作りかた（後編）</a>」に続きます。</p>
]]></content:encoded>
			<wfw:commentRss>/masuidrive/594/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<series:name><![CDATA[イマドキのWebアプリの作りかた]]></series:name>
	</item>
	</channel>
</rss>
