<?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="/ogaoga/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>HTML5を駆使したRakuten Technology Conference 2013サイト制作の内側</title>
		<link>/ogaoga/3370/</link>
		<pubDate>Fri, 06 Dec 2013 00:00:37 +0000</pubDate>
		<dc:creator><![CDATA[小笠原 努]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[デザイン]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Canvas]]></category>
		<category><![CDATA[Grunt]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Sass]]></category>

		<guid isPermaLink="false">/?p=3370</guid>
		<description><![CDATA[楽天では、10月26日に「Rakuten Technology Conference 2013」を開催し、多くの方にご来場頂きました。ご参加者の皆様、ありがとうございました！ 私が所属している「HTML5 Project...]]></description>
				<content:encoded><![CDATA[<p><a href="https://html5experts.jp/wp-content/uploads/2013/12/Rakuten-Technology-Conference-2013.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2013/12/Rakuten-Technology-Conference-2013-206x300.png" alt="Rakuten Technology Conference 2013 のトップページ" width="206" height="300" class="alignright size-medium wp-image-3380" style="border:1px solid gray" srcset="/wp-content/uploads/2013/12/Rakuten-Technology-Conference-2013-206x300.png 206w, /wp-content/uploads/2013/12/Rakuten-Technology-Conference-2013-705x1024.png 705w, /wp-content/uploads/2013/12/Rakuten-Technology-Conference-2013-142x207.png 142w, /wp-content/uploads/2013/12/Rakuten-Technology-Conference-2013.png 441w" sizes="(max-width: 206px) 100vw, 206px" /></a></p>

<p>楽天では、10月26日に「<a href="http://tech.rakuten.co.jp/" title="Rakuten Technology Conference 2013" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Rakuten Technology Conference 2013</a>」を開催し、多くの方にご来場頂きました。ご参加者の皆様、ありがとうございました！</p>

<p>私が所属している「HTML5 Project Team」が<a href="http://tech.rakuten.co.jp/timetable.html#session-e2" title="担当したセッション（HTML5 in Rakuten）" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">担当したセッション</a>では、今回制作を担当したカンファレンスのサイトについて発表をしました。技術者の祭典ということもあり、HTML5やフロントエンドの技術をふんだんに盛り込み、皆さんご存知の賑やかな楽天市場とはひと味違ったクールなサイトに仕上げました。ご覧頂けましたでしょうか？</p>

<p>当日のセッションの内容と重複しますが、今回は、HTML5の活用事例として、このサイトがどのような技術で作られたのか、<a href="http://www.slideshare.net/rakutentech/tech-conf2013e2" title="セッションでも使用したスライド（HTML5 in Rakuten）" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">セッションでも使用したスライド</a>を交えて紹介していきます。</p>

<h2>「Rakuten Technology Conference 2013」サイトのコンセプトと要求仕様</h2>

<p>このサイトでは、よくあるカンファレンスのサイトと同じく、講演者の紹介やタイムテーブルなどを公開しています。メインのターゲットユーザーはエンジニアで、日頃はPCをよく使い、最新のスマートフォンを持ち歩いていると想定しました。また、情報だけでなく技術面でもアピールする機会にしたかったこともあり、過剰なほどにあらゆる技術を盛り込んでいます。</p>

<p>サイトを構築する上で、いくつか要求仕様がありました。</p>

<ul>
    <li>情報の更新が頻繁に行われる</li>
    <li>SEOを考慮する</li>
    <li>サーバサイドスクリプトは使用しない</li>
</ul>

<p>これらを満たすために、</p>

<ul>
    <li>都度、複数のHTMLを編集するのではなく、スタッフから受け取ったデータ（JSON）からHTMLを生成する。</li>
    <li>サーバサイドスクリプトが使えないので、ローカルで生成する。</li>
</ul>

<p>という方針を定め、様々な技術を使って実現しました。</p>

<h2>活用した技術</h2>

<p>コンテンツ自体にもHTML5をはじめとした最新技術が使われていますが、制作面においても、最新のツールを駆使して効率化を図りました。</p>

<h3>Canvasを使ったインタラクティブな背景</h3>

<p>サイト全体にタイルをモチーフとした背景を採用していて、PCでご覧頂くと、マウスの動きに合わせてハイライトとされ、タイルが微妙に移動していることがわかるかと思います。この背景部分は、Canvas
で描画しています。PC向けにはタイルは固定幅ですが、タブレット向けでは画面幅に合わせてタイル幅を調整しています。また、Canvasの処理部分には<a href="http://www.createjs.com/#!/CreateJS" title="CreateJS" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">CreateJS</a>を使用しています。</p>

<h3>CSSによるスムーズなインタラクション</h3>

<p><a href="http://tech.rakuten.co.jp/" title="Rakuten Technology Conference 2013 のトップページ" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">トップページ</a>の「M」のタイルをクリックすると、実行委員長からのメッセージが表示されます。このとき、委員長の顔のタイルが拡張して、それに合わせて他のタイルが追いやられるようなアニメーションを行っています。この動きはCSSによって実現されていて、スマートフォンでも同様に動きます。これ以外にも、様々な場面でCSSによるアニメーションを使用しています。</p>

<h3>スマートフォン最適化とレスポンシブWebデザイン</h3>

<p>当日会場でスマートフォンからタイムテーブルを確認することを考慮し、スマートフォン対応をしました。タイムテーブルは縦横に長いコンテンツのため、スマートフォンとの相性は悪いのですが、時間帯ごとに横スクロールするようにして、閲覧性を確保しました。</p>

<p>各デバイスへの対応は、レスポンシブWebデザインで行いました。PCとスマートフォンでレイアウトが大きく異なるので、かなり苦戦しました。</p>

<p><a href="http://www.slideshare.net/rakutentech/tech-conf2013e2/92" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2013/12/Screen-Shot-2013-11-25-at-2.34.58-PM-300x224.png" alt="ページの幅ごとのレイアウト" width="300" height="224" class="aligncenter size-medium wp-image-3387" style="border:1px solid gray" srcset="/wp-content/uploads/2013/12/Screen-Shot-2013-11-25-at-2.34.58-PM-300x224.png 300w, /wp-content/uploads/2013/12/Screen-Shot-2013-11-25-at-2.34.58-PM-207x154.png 207w, /wp-content/uploads/2013/12/Screen-Shot-2013-11-25-at-2.34.58-PM.png 640w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<p>また、それぞれの表示ごとにJavaScriptの処理も異なっているため、ウィンドウ幅を監視して、表示の切り替わり時にそれぞれ適切な処理を実行するような仕組みも取り入れました。</p>

<h3>お気に入りのセッションをブックマークできるWeb Storage</h3>

<p>タイムテーブルで、お気に入りのセッションをブックマークできる機能を追加しました。ブックマークするとブラウザのlocalStorageに保存され、いつでもお気に入りのセッションだけを表示できます。</p>

<p>また、ページ上部のSpeakersやUpdatesの部分に、赤枠の数字が表示されますが、これは、前回閲覧したときのデータをlocalStorageに保持し、今回読み込んだデータ数の差を表示して、何件更新されたかを示しています（表示すると消えます）。</p>

<p><a href="http://www.slideshare.net/rakutentech/tech-conf2013e2/116" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2013/12/Screen-Shot-2013-11-27-at-10.57.51-AM-300x224.png" alt="Notification feature の説明図" width="300" height="224" class="aligncenter size-medium wp-image-3391" style="border:1px solid gray" srcset="/wp-content/uploads/2013/12/Screen-Shot-2013-11-27-at-10.57.51-AM-300x224.png 300w, /wp-content/uploads/2013/12/Screen-Shot-2013-11-27-at-10.57.51-AM-207x154.png 207w, /wp-content/uploads/2013/12/Screen-Shot-2013-11-27-at-10.57.51-AM.png 640w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<p>PCで登録したブックマークをカンファレンス当日にスマートフォンで呼び出せるように、URLでその情報を引き継げるようにはしていたのですが、UIを提供できませんでした。来年はその辺りも提供できればと思っています。</p>

<h3>PhantomJS + UnderscoreJSで更新負荷を下げる</h3>

<p><a href="http://phantomjs.org/" title="PhantomJS" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">PhantomJS</a>は、コマンドラインから呼び出せるWebKitエンジンで、今回は、テンプレートとデータからHTMLを生成する処理で利用しました。テンプレートエンジンは<a href="http://underscorejs.org/" title="Underscore.js" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Underscore.js</a>を利用しました。</p>

<p>講演者の情報やセッションの時間などの情報は開催日まで頻繁に更新があり、その度にHTMLを修正しているとかなりの手間となります。そのため、それらの情報をまとめるカンファレンススタッフに、データをJSON形式で記述して納品してもらうようにしました。納品されたJSONファイルをUnderscore.jsでテンプレートに適用して、HTMLを出力しました。</p>

<p>データは構造化されているため、例えばタイムテーブルのデータを更新すると、タイムテーブルだけではなく、その講演者のページの情報も同時に変更されます。また、セッションの場所の名称が変更されたときも、１箇所修正するだけで、すべての名称が新しいものに置き換わります。</p>

<p><a href="http://www.slideshare.net/rakutentech/tech-conf2013e2/139" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2013/12/Screen-Shot-2013-11-25-at-2.13.39-PM-300x225.png" alt="What&#039;s PhantomJS? の説明図" width="300" height="225" class="aligncenter size-medium wp-image-3393" style="border:1px solid gray" srcset="/wp-content/uploads/2013/12/Screen-Shot-2013-11-25-at-2.13.39-PM-300x225.png 300w, /wp-content/uploads/2013/12/Screen-Shot-2013-11-25-at-2.13.39-PM-207x155.png 207w, /wp-content/uploads/2013/12/Screen-Shot-2013-11-25-at-2.13.39-PM.png 640w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<h3>レスポンシブ対応がシンプルに記述できるSass / Compass</h3>

<p>CSSの生成には、おなじみ<a href="http://sass-lang.com/" title="Sass" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Sass</a>と<a href="http://compass-style.org/" title="Compass" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Compass</a>を使用しました。Sass内でif文を使って各デバイスの判定ができるようにして、レスポンシブ対応がシンプルに記述できました。</p>

<p><a href="http://www.slideshare.net/rakutentech/tech-conf2013e2/99" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2013/12/Screen-Shot-2013-11-25-at-2.23.10-PM-300x224.png" alt="Coding into Condition branch の説明図" width="300" height="224" class="aligncenter size-medium wp-image-3395" style="border:1px solid gray" srcset="/wp-content/uploads/2013/12/Screen-Shot-2013-11-25-at-2.23.10-PM-300x224.png 300w, /wp-content/uploads/2013/12/Screen-Shot-2013-11-25-at-2.23.10-PM-207x154.png 207w, /wp-content/uploads/2013/12/Screen-Shot-2013-11-25-at-2.23.10-PM.png 640w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<h3>Gruntによる処理の自動化</h3>

<p>PhantomJSでのHTMLの生成、Sass/Compassのコンパイル、ファイル操作などは<a href="http://gruntjs.com/" title="Grunt" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Grunt</a>を使い自動化しました。PhantomJSの呼び出し部分は、いいモジュールを見つけられなかったため、シェルコマンドを呼び出すタスクを書きました。</p>

<p><a href="http://www.slideshare.net/rakutentech/tech-conf2013e2/127" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2013/12/Screen-Shot-2013-11-25-at-2.26.25-PM-300x224.png" alt="Tools and flow の説明図" width="300" height="224" class="aligncenter size-medium wp-image-3397" style="border:1px solid gray" srcset="/wp-content/uploads/2013/12/Screen-Shot-2013-11-25-at-2.26.25-PM-300x224.png 300w, /wp-content/uploads/2013/12/Screen-Shot-2013-11-25-at-2.26.25-PM-207x154.png 207w, /wp-content/uploads/2013/12/Screen-Shot-2013-11-25-at-2.26.25-PM.png 640w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<p>このように、目的に合わせた最新技術に挑戦して、今回の「Rakuten Technology Conference 2013」のサイトを作り上げていて、私たちも様々な収穫がありました。まだ、パフォーマンスやユーザビリティなどで不十分な点もあるので、今後の課題として取り組みたいと思っています。</p>

<p>また、「サーバでスクリプト使えなくても、ローカルでRubyやPHPとか使えば楽じゃね？」という話もありますが（汗）、そこは我々「HTML5 Project Team」ということで、今回はフロントエンドの技術だけにこだわってみました。来年は、NodeベースのWebサーバに移行して、より簡単にサイトを更新できるようなことも考えています。</p>

<p>今後もこのような挑戦を続け、そこで得ていく知見を楽天のサービスに活かして行きたいと思っています。またこのような形で、いつもお世話になっているコミュニティにも還元できれば幸いです。今後ともよろしくお願いします。</p>

<p>このセッションのビデオは<a href="http://www.youtube.com/watch?v=BgCdgkHEn8M" title="YouTubeにアップ" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">YouTubeにアップ</a>されており、使ったスライドも<a href="http://www.slideshare.net/rakutentech/tech-conf2013e2" title="SlideShareで公開" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">SlideShareで公開</a>されています。もしよろしければそちらもご覧ください。</p>

<div style="float:left">

<!-- iframe plugin v.4.3 wordpress.org/plugins/iframe/ -->
<iframe width="398" height="224" src="//www.youtube.com/embed/BgCdgkHEn8M?rel=0" frameborder="0" 0="allowfullscreen" scrolling="yes" class="iframe-class"></iframe>

</div>

<div>

<!-- iframe plugin v.4.3 wordpress.org/plugins/iframe/ -->
<iframe src="http://www.slideshare.net/slideshow/embed_code/28399053" width="264" height="224" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px" 0="allowfullscreen" class="iframe-class"></iframe>

</div>

<div style="clear:both"></div>
]]></content:encoded>
			</item>
	</channel>
</rss>
