<?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="/t32k/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>PostCSSとcssnextで最新CSS仕様を先取り！</title>
		<link>/t32k/17235/</link>
		<pubDate>Mon, 28 Sep 2015 00:00:55 +0000</pubDate>
		<dc:creator><![CDATA[石本 光司]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[CSS]]></category>

		<guid isPermaLink="false">/?p=17235</guid>
		<description><![CDATA[どうも、Kaizen Platform, Inc.の@t32kです。今日はPostCSSについて解説しようと思います。PostCSSについてはそれを解説した同僚のスライドも素晴らしいので、そちらも参考にしてもらえば幸いで...]]></description>
				<content:encoded><![CDATA[<p>どうも、<a href="https://kaizenplatform.com/ja/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Kaizen Platform, Inc.</a>の<a href="https://twitter.com/t32k" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">@t32k</a>です。今日は<a href="https://twitter.com/postcss" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">PostCSS</a>について解説しようと思います。PostCSSについてはそれを解説した同僚のスライドも素晴らしいので、そちらも参考にしてもらえば幸いです。</p>

<ul>
<li><a href="https://speakerdeck.com/jmblog/postcss-tohahe-ka" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">PostCSS とは何か // Speaker Deck</a></li>
</ul>

<h2>PostCSSとはなにか？</h2>

<p>PostCSSは、<a href="https://github.com/postcss/autoprefixer" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Autoprefixer</a>の作者でも有名なロシアの<a href="https://github.com/ai" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Andrey Sitnik</a>氏が開発しているツールです。</p>

<ul>
<li><strong><a href="https://github.com/postcss/postcss" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">postcss/postcss</a></strong></li>
</ul>

<p>公式のレポジトリのREADMEには以下のように書かれています。</p>

<blockquote><p>PostCSS is a tool for transforming styles with JS plugins. These plugins can support variables and mixins, transpile future CSS syntax, inline images, and more.</p></blockquote>

<p>PostCSSはCSSのスタイルを変更するためのツールと言えますが、実際に、どのスタイルを変更するかは各種プラグインによって行われます。</p>

<p>PostCSS自体はCSSパーサーでそれによって生成されるAST(抽象構文木、Abstract Syntax Tree)を扱うAPIを提供しているにすぎません。</p>

<h3>PostCSSの使用例</h3>

<p>例えば、<a href="https://github.com/postcss/postcss-size" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">postcss-size</a>というプラグインを使えば、独自ショートカットプロパティである<code>size</code>が以下のように使用可能になります。</p>

<p></p><pre class="crayon-plain-tag">/* 変換前のCSS */
.rectangle {
	size: 400px 200px;
}
.square {
	size: 250px;
}</pre><p></p>

<p></p><pre class="crayon-plain-tag">/* 変換後のCSS */
.rectangle {
	width: 400px;
	height: 200px;
}
.square {
	width: 250px;
	height: 250px;
}</pre><p></p>

<p>プラグインを使うことで、<code>size</code>プロパティが現状のブラウザでも解釈できる<code>width</code>と<code>height</code>プロパティのCSSに置き換わったのが確認できます。</p>

<p>では、実際にGulpでPostCSSとそのプラグインを使用するにはどうしたらよいのか、見ていきましょう。</p>

<p></p><pre class="crayon-plain-tag">var gulp = require('gulp');
var postcss = require('gulp-postcss');

gulp.task('css', function () {
  return gulp.src('src/css/*.css')
    .pipe(postcss([ require('postcss-size') ])
    .pipe(gulp.dest('dest/css'));
});</pre><p></p>

<p>簡単ですね。<code>postcss</code>の引数の配列に使いたいプラグインを指定するだけです。<code>gulp css</code>とコマンドを打てば、先ほどのCSSが生成されるようになります。</p>

<p>AutoprefixerもまたPostCSSのプラグインの一種なので、これを先ほどのタスクに追加したのが下記のコードです。Autoprefixerのオプションの設定に<code>last 2 versions</code>を設定していますが、基本的には配列の中にプラグインを足していくだけです。</p>

<p></p><pre class="crayon-plain-tag">gulp.task('css', function () {
  return gulp.src('src/css/*.css')
    .pipe(postcss([
			require('postcss-size'), 
			require('autoprefixer')({ browsers: ['last 2 versions'] })
		])
    .pipe(gulp.dest('dest/css'));
});</pre><p></p>

<p>今回はGulpでのタスク実行例でしたが、もちろん<a href="https://github.com/nDmitry/grunt-postcss" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Grunt</a>などの他のビルドツールにもPostCSSは対応していますので、みなさんの好きなビルドツールを使うことができます。</p>

<p>PostCSSのプラグインはおおまかに分類すると以下のようなカテゴリーのものがあり、<a href="https://github.com/postcss/postcss#plugins" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">現在100種類以上のプラグイン</a>が存在します。</p>

<ul>
<li><strong>Future CSS syntax</strong> 新しいCSS構文が使えます</li>
<li><strong>Fallbacks</strong>　未対応のブラウザでもその効果を再現します</li>
<li><strong>Language extensions</strong>　for文やif文などの言語拡張します</li>
<li><strong>Optimizations</strong>　ミニファイなどの最適化をします</li>
<li><strong>Shortcuts</strong>　便利なショートカットです</li>
<li><strong>Analytics</strong>　<a href="http://www.stylestats.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">StyleStats</a>のような分析をします</li>
</ul>

<h2>cssnextでFuture CSS syntaxを先取る！</h2>

<p>前述の通り、PostCSSには便利なプラグインがたくさんあり、フロントエンド開発の助けとなることでしょう。しかし、そういったことは既にSassでもできていることなので、メリットとは感じることも少ないかもしれません。個人的にPostCSSを使う一番の意味としてはFuture CSS syntaxを先取ることが可能であるということです。</p>

<p>例えば、CSSで変数を使いたい場合、Sassでは<code>$</code>記号を使い宣言しますが、言うまでもなくこれはSassによる独自構文であり、CSSの標準構文でありません。</p>

<p></p><pre class="crayon-plain-tag">/* 変換前のSass */
$brand-color: #88E18E;

.logo {
	color: $brand-color;
}</pre><p></p>

<p></p><pre class="crayon-plain-tag">/* 変換後のCSS */
.logo {
	color: #88E18E;
}</pre><p></p>

<p>W3Cの<a href="http://www.w3.org/TR/css-variables/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CSS Custom Properties for Cascading Variables Module</a>に対応した現在の書き方だと以下のようになります。</p>

<p></p><pre class="crayon-plain-tag">/* 変換前のCSS */
:root {
	--brand-color: #88E18E;
}

.logo {
	color: var(--brand-color)
}</pre><p></p>

<p>そして、このCSSは<a href="https://github.com/postcss/postcss-custom-properties" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">postcss-custom-properties</a>プラグインを使えば、Sass同様、通常のCSS 2.1に対応したコードに変換することができます。</p>

<p>このような、新しい標準仕様CSSを使うことができるPostCSSプラグインをまとめたパッケージが<strong>cssnext</strong>です。これを使えば、<code>postcss-custom-properties</code>、<code>postcss-custom-selectors</code>…のように、いちいち一つひとつプラグインを読み込まなくても大丈夫になります。</p>

<ul>
<li><strong><a href="http://cssnext.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">cssnext &#8211; Use tomorrow&#8217;s CSS syntax, today.</a></strong></li>
</ul>

<p>cssnextが内包しているFuture CSS syntaxプラグイン一覧</p>

<ul>
<li>custom properties &amp; <code>var()</code></li>
<li>custom media queries</li>
<li>custom selectors</li>
<li><code>color()</code> support</li>
<li><code>hwb()</code> support</li>
<li><code>rebeccapurple</code></li>
<li>:not` pseudo-class (to l.3)</li>
<li>filters (svg fallback)</li>
<li>::pseudo syntax (<code>:</code> compat)</li>
<li>reduced <code>calc()</code></li>
<li>media queries ranges</li>
<li>automatic vendor prefixes</li>
<li><code>gray()</code> support</li>
<li>hexa <code>#rrggbbaa</code> support</li>
<li><code>:matches</code> pseudo-class</li>
<li>font-variant (to font-feature-settings)</li>
<li><code>rem</code> units fallback (to px)</li>
</ul>

<p>上記のパッケージを使えば、JavaScriptにおける<a href="https://babeljs.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Babel</a>のような使い方がCSSにおいても可能です。</p>

<p>ただ、今年策定されたECMAScript 6のように仕様が固まっているものが少なく、標準に沿った記述をしていても未来の仕様変更に伴い、コードを変更しなければならないといったリスクも存在します。</p>

<ul>
<li><a href="https://css-tricks.com/the-trouble-with-preprocessing-based-on-future-specs/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">The Trouble With Preprocessing Based on Future Specs | CSS-Tricks</a></li>
</ul>

<p>この点については、cssnextの作者であるMaxime Thirouin氏は<a href="https://css-tricks.com/the-trouble-with-preprocessing-based-on-future-specs/#comment-1595997" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">cssnextはsemverを遵守している</a>ので、プラグインをアップデートしたらコードが使えなくなるといったことは防げるとも述べています（互換性がない変更はメジャーアップデートするので、マイナーアップデートで止めれば危険性はないです。semverに関しては以前に取り上げたので次の記事を参照してください）。</p>

<ul>
<li><a href="https://html5experts.jp/t32k/11746/" data-wpel-link="internal">t32k、怒られる！セマンティック バージョニングしてますか？ | HTML5Experts.jp</a></li>
</ul>

<p>なにはともあれ、個人的にはSassばかりに目を向けていた昨今なので、CSSの標準仕様に目を向けるという面でも、このようなプラグインを使うことに意味はあるかと考えます。さすがに、cssnextのパッケージに入っているプラグインの仕様すべて追いかけるのは厳しいので、自分が本当に使いたいFuture Specプラグインだけ選んで、それだけ気にかけるというのが落としどころかと思います。</p>

<h2>PostCSSの普及</h2>

<p>自分にとって必要なプラグインだけ選んで使えるPostCSSの使い勝手の良さから、利用者は増えています。『<a href="http://sassandcompass.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Sass and Compass for Designers</a>』の著者であるBen Frain氏がSassからPostCSSに乗り換えたという記事は話題になりました。</p>

<ul>
<li><a href="http://benfrain.com/breaking-up-with-sass-postcss/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Breaking up with Sass: it&#8217;s not you, it&#8217;s me &#8211; Ben Frain</a></li>
</ul>

<p>また、フロントエンド開発者のためのコード共有サイト<a href="http://codepen.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CodePen</a>においても、SassやLessなどの他のCSSプリプロセッサ同様に、PostCSSをサポートするようになりました。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/09/codepen.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/09/codepen.png" alt="codepen" width="640" height="253" class="aligncenter size-full wp-image-17237" srcset="/wp-content/uploads/2015/09/codepen.png 640w, /wp-content/uploads/2015/09/codepen-300x119.png 300w, /wp-content/uploads/2015/09/codepen-207x82.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>世界で最も使われているであろうCSSフレームワークBootstrapが、Version 4においてLessからSassに移行したと最近話題になりましたが、Version 5においては、さらにSassからPost CSSに移行するであろうと作者のMark Otto氏がTweetしたのも興味深いです。</p>

<p><a href="https://twitter.com/mdo/status/591364406816079873" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2015/09/twitter.png" alt="Oh, btw—Bootstrap 4 will be in SCSS. And if you care, v5 will likely be in PostCSS because holy crap that sounds cool." width="640" height="334" class="aligncenter size-full wp-image-17279" srcset="/wp-content/uploads/2015/09/twitter.png 640w, /wp-content/uploads/2015/09/twitter-300x157.png 300w, /wp-content/uploads/2015/09/twitter-207x108.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<h2>Sassから乗り換えるべきか？</h2>

<p>さて、これまでSass、Less、Stylusと群雄割拠のCSSプリプロセッサ時代において、ようやくSassで落ち着きそうなところに、また新しい技術が出てきて困惑しているあなた！大丈夫、僕もそうです！</p>

<p>PostCSSでできることはたいていSassでもできる（ないものはRubyで拡張しなければなりませんが…）ので、機能面で乗り換えるメリットというのはあまりないかもしれません。ただ、パフォーマンス面ではRuby Sassを使っている方ではあれば、少し考慮したほうがよいかもしれません。圧倒的にコンパイル速度が違います。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/09/speed.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/09/speed.png" alt="speed" width="640" height="472" class="aligncenter size-full wp-image-17238" srcset="/wp-content/uploads/2015/09/speed.png 640w, /wp-content/uploads/2015/09/speed-300x221.png 300w, /wp-content/uploads/2015/09/speed-207x153.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<ul>
<li>『<a href="https://speakerdeck.com/jmblog/postcss-tohahe-ka?slide=55" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">PostCSS とは何か</a>』より</li>
</ul>

<p>ただ2007年頃から開発されているSassは仕様的に安定していますし、コミュニティも成熟していますから、あなたの開発プロジェクトに新メンバーが入ってきてもSassであれば問題なく受け入れることがあっても、PostCSSで書かれたコードにはすこし驚く可能性があるでしょう（<a href="https://github.com/jonathantneal/precss" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">PreCSS</a>というパッケージを使えば、PostCSSをのプラグインを使用しSassと似たようなコードを記述可能です）。</p>

<ul>
<li><a href="https://jdsteinbach.com/sass/not-breaking-up-sass/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Why I’m Not Breaking Up with Sass | James Steinbach</a></li>
</ul>

<p>各自のプロジェクトに合わせて、技術を選択していけばよいでしょう。個人的には自分が1人でやっているプロジェクトであれば最近はPostCSSを採用しています。そもそも、Sassの機能においても<code>@extend</code>や<code>@mixin</code>といったこともあまり使いませんし、Too muchな面は否めません。自分としては変数(<code>postcss-custom-properties</code>)と<code>@import</code>によるconcat(<code>postcss-import</code>)さえあれば問題ないといった印象だからです。</p>

<p>Webは常に進化し続けているものなので、それを構成しているコードも変わってくるのは当然でしょう。この際にPostCSSで最新仕様を先取ることで、未来のCSSについていろいろ考えるキッカケにしてもらえば幸いです。</p>
]]></content:encoded>
			</item>
		<item>
		<title>【後編】Material Designの今がわかる「Material Now」―Google I/O 2015</title>
		<link>/t32k/15349/</link>
		<pubDate>Tue, 23 Jun 2015 23:00:17 +0000</pubDate>
		<dc:creator><![CDATA[石本 光司]]></dc:creator>
				<category><![CDATA[デザイン]]></category>
		<category><![CDATA[Google I/O]]></category>
		<category><![CDATA[Material Design]]></category>
		<category><![CDATA[Material Now]]></category>

		<guid isPermaLink="false">/?p=15349</guid>
		<description><![CDATA[連載： Google I/O 2015 特集 (3)この記事は2015年5月28日に行われたGoogle I/O 2015「Material Now」セッションの翻訳です。「Material Now」では、Materia...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/google_io_2015/" class="series-313" title="Google I/O 2015 特集" data-wpel-link="internal">Google I/O 2015 特集</a> (3)</div><p>この記事は2015年5月28日に行われたGoogle I/O 2015「Material Now」セッションの翻訳です。「Material Now」では、Material Designがリリースされてからの1年間の状況や反響、事例等を取り上げています。本翻訳の後編は、Google社のデザインに対する取り組みと、Material Designの採用事例について記述します。</p>

<h2>Design Sprints</h2>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/06/09.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/06/09.jpg" alt="" width="640" height="339" class="aligncenter size-full wp-image-15326" srcset="/wp-content/uploads/2015/06/09.jpg 640w, /wp-content/uploads/2015/06/09-300x159.jpg 300w, /wp-content/uploads/2015/06/09-207x110.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<ul>
<li><a href="https://developers.google.com/design-sprint/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Design Sprint | Google Developers</a></li>
</ul>

<p>私たちはみなさんにMaterialをもっと好きになってもらいたいですし、みなさんのフィードバックをMaterialに取り込みたいと考えています。みなさんと対話するために、去年から私たちはいくつかのプログラムを始めています。</p>

<p>スターターのために、私たちはGoogleでDesign Sprintsを行いました。マウンテンビューのキャンパスでガレージと呼ばれる場所で、1日かけてデザインワークショップをします。いくつかの企業を招いて、そのチームのデザイナー、プログラムマネージャー、エンジニアが一緒にプロダクト開発における特定の問題に取り組むのです。</p>

<p>私たちはそれをサポートするのですが、それはなにも既存のアプリのMaterial Design化だけでなく、アプリデザインをいろんな観点からサポートするのです。これはとても素敵な取り組みで、私たちはみなさんが抱えている問題が何なのかを理解することができます。とても真剣で濃密なプロセスですが、反応はとても良いものでした。私たちは17の企業と協力し、今もこれ続けています。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/06/05.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/06/05.jpg" alt="" width="640" height="340" class="aligncenter size-full wp-image-15334" srcset="/wp-content/uploads/2015/06/05.jpg 640w, /wp-content/uploads/2015/06/05-300x159.jpg 300w, /wp-content/uploads/2015/06/05-207x110.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>加えて、私たちは100以上のデザインレビュー、それは1、2時間の短いセッションで、私たちのデザイナーの何人かがみなさんのデザインチームとMaterial Designの実装について話し合うのです。これもまたみなさんと協力しあえることができ、技術・デザイン両面からみなさんをサポートすることができます。</p>

<p>I/Oではデザインのセッションが他にもありますので、ぜひとも、みなさんチェックしてみてください。もし、このようなデザインレビューができないのなら、どうか<a href="http://www.google.com/design/about/#hello-world" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">design@google.com</a>まで連絡ください。</p>

<h2>FORM</h2>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/06/form.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/06/form.png" alt="form" width="640" height="363" class="aligncenter size-full wp-image-15360" srcset="/wp-content/uploads/2015/06/form.png 640w, /wp-content/uploads/2015/06/form-300x170.png 300w, /wp-content/uploads/2015/06/form-207x117.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<ul>
<li><a href="http://www.google.com/design/form/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">FORM</a></li>
</ul>

<p>昨年、Googleで初めてデザインカンファレンスを、ここサンフランシスコで開催しました。このイベントはとても素晴らしいものとなりました。このイベントは招待制なので、みなさんの中でどれだけの人がこのイベントに行けるかどうかは私にはわかりませんが、デザインコミュニティに繋がっていればその機会があることでしょうし、私たちは世界中のデザイナーを招き、講演をし、パネルディスカッションをし、ハンズオンのワークショップもしました。次のFORMを企画していますので、どうぞご期待ください。</p>

<h2>Material Design in the Wild</h2>

<p>さて、Material Designについてはここで終わりです。なぜなら、私たちはみなさんにもっと美しいアプリを作ってほしいですし、もっと直感的な体験をみなさんのユーザー・顧客に届けてほしいと考えています。</p>

<p>ここでセッションを終えますが、みなさんが実装したMaterialの事例について話す時間を設けることにしましょう。私たちはいくつかのMaterial Designを採用しようとする企業と話す機会を得ました。そして彼のストーリーを聞きました。そこで彼らの事例についてシェアしたいと思います。</p>

<h3>Trello</h3>

<p>まず、<a href="https://play.google.com/store/apps/details?id=com.trello" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Trello</a>です。いくつかのプロジェクトを組織したりシェアするのに便利です。MobileリードのHamidはTrelloのMaterial Design化することで、プロダクトそれ自体、デザインにフォーカスすることができたと言っています。さらにははっきりとしたインパクトも数字として現れています。</p>

<ul>
<li>週間ユーザーあたりのセッション数が10%増加</li>
<li>セッションあたりのボード作成数が42%増加</li>
<li>セッションあたりのボードを追加するユーザー数が63%増加</li>
</ul>

<h3>The Hunt</h3>

<p>次にファッションスタイルを共有する<a href="https://play.google.com/store/apps/details?id=thehunt.shoptap.thehunt" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">The Hunt</a>ですが、プロダクトデザイナーのJennyは、Material Designはデザインチームをスムーズに拡張してくれるものであり非常に助かっており、それはまたチームを加速させるものだと述べています。私たちは非常に嬉しかったです。なぜならこれは私たちが望んでいたことだからです。同様に、HuntのMaterial Design化で、以前と比べて<strong>”Hunts”が30%増加</strong>しました。</p>

<h3>Pocket Casts</h3>

<p>最後に、ポッドキャストアプリの<a href="https://play.google.com/store/apps/details?id=au.com.shiftyjelly.pocketcasts" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Pocket Casts</a>ですが、前述のアプリと同じような効果をあげていますし、Material Design化により3<strong>0%も売上が増加</strong>しました。ファンタスティックですね！</p>

<p>このような事例は、なぜMaterialを採用するのかといった証明になりますし、まさしく私たちが進むべきものです。私たちは、みなさんが現在やっていることをさらに集中・加速させることを手助けしようとしているのです。もし、Material Design化に対して説得を要するのならこれらの事例をぜひとも使ってもらいたいです。</p>

<p>みなさんのこのような素晴らしい成果に私たちは非常に感動しました。もう少しこのようなアプリに対してより多くのみなさんにシェアや賞賛をしてもらいたいと考え、私たちPlayチームとDevチームは18の素晴らしいMaterial Designアプリを選択し、ショーケースとしてみなさんにシェアしたいと思います。</p>

<ul>
<li><a href="https://play.google.com/store/apps/collection/promotion_3001769_io_awards" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Best-In-Class Android Design &#8211; Google Play の Android アプリ</a></li>
</ul>

<p>昨年、Material Designを紹介する動画を作成しましたが、実際それらはフェイクのアプリですが、今回並んでいるのは実際のみなさんが作ったまぎれもないリアルなアプリです。私たちは非常に興奮しております。</p>

<h2>Material Design Award</h2>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/06/05.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/06/05.png" alt="" width="640" height="338" class="aligncenter size-full wp-image-15328" srcset="/wp-content/uploads/2015/06/05.png 640w, /wp-content/uploads/2015/06/05-300x158.png 300w, /wp-content/uploads/2015/06/05-207x109.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<ul>
<li><a href="http://www.google.com/design/articles/material-design-awards/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Material Design Awards &#8211; Articles &#8211; Google Design</a></li>
</ul>

<p>さらに私たちは、特定の分野でもっとも素晴らしいMaterial Designをしているアプリを表彰するためのMaterial Design Awardも用意しました。今年は6つのカテゴリーから選びました。これらのアプリはまさしくMaterial Designのパイオニアです。</p>

<ul>
<li>Adaptive Layouts &#8211; <a href="https://play.google.com/store/apps/details?id=com.ideashower.readitlater.pro" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Pocket</a></li>
<li>Immersive Imagery &#8211; <a href="https://play.google.com/store/apps/details?id=com.bhphoto" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">B&amp;H Photo Video Pro Audio</a></li>
<li>Elegant Typography &#8211; <a href="https://play.google.com/store/apps/details?id=com.nytimes.android" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">NYTimes – Latest News</a></li>
<li>Seamless Browsing &#8211; <a href="https://play.google.com/store/apps/details?id=au.com.shiftyjelly.pocketcasts" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Pocket Casts</a></li>
<li>Crafted Simplicity &#8211; <a href="https://play.google.com/store/apps/details?id=com.samruston.weather" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Weather Timeline &#8211; Forecast</a></li>
<li>Delightful Animation &#8211; <a href="https://play.google.com/store/apps/details?id=com.tumblr" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Tumblr</a></li>
</ul>

<p>私たちMaterial Designチーム全体は非常にみなさんに感謝いたしております。なぜなら、システムそれ自体はただのアイデアに過ぎませんが、みなさんの日々の仕事のがんばり、貢献、革新のおかげで、Material Designがリアルなものとして、実際に手に触れるものとなったのです。本当にありがとうございます。</p>

<p>そういうわけで、Material Designの最初の一年は素晴らしくわくわくするような成功した一年でした。私たちは引き続き、みなさんとコミュニケーションしていきたいと考えています。何が機能して、何が機能しないのか、などみなさんから学びたい。次の一年はさらに素晴らしい一年となることを楽しみにしていますし、また来年ここGoogle I/OでMaterial Designの2歳の誕生日を祝うために集まりましょう。今日は本当にありがとうございました。</p>
]]></content:encoded>
		
		<series:name><![CDATA[Google I/O 2015 特集]]></series:name>
	</item>
		<item>
		<title>【前編】Material Designの今がわかる「Material Now」―Google I/O 2015</title>
		<link>/t32k/15318/</link>
		<pubDate>Tue, 23 Jun 2015 03:01:09 +0000</pubDate>
		<dc:creator><![CDATA[石本 光司]]></dc:creator>
				<category><![CDATA[デザイン]]></category>
		<category><![CDATA[Google I/O]]></category>
		<category><![CDATA[Material Design]]></category>
		<category><![CDATA[Material Now]]></category>

		<guid isPermaLink="false">/?p=15318</guid>
		<description><![CDATA[連載： Google I/O 2015 特集 (2)この記事は2015年5月28日に行われたGoogle I/O 2015「Material Now」セッションの翻訳です。「Material Now」では、Materia...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/google_io_2015/" class="series-313" title="Google I/O 2015 特集" data-wpel-link="internal">Google I/O 2015 特集</a> (2)</div><p>この記事は2015年5月28日に行われたGoogle I/O 2015「Material Now」セッションの翻訳です。「Material Now」では、Material Designがリリースされてからの1年間の状況や反響、事例等を取り上げています。本翻訳の前編は、Material Designの普及状況とアップデート内容について記述します。</p>

<p><a href="https://www.youtube.com/watch?v=8UicJ0SxBwA" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2015/06/01.png" alt="" width="640" height="357" class="aligncenter size-full wp-image-15330" srcset="/wp-content/uploads/2015/06/01.png 640w, /wp-content/uploads/2015/06/01-300x167.png 300w, /wp-content/uploads/2015/06/01-207x115.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<ul>
<li><a href="https://events.google.com/io2015/schedule?sid=35718f8b-b6d4-e411-b87f-00155d5066d7#day1/35718f8b-b6d4-e411-b87f-00155d5066d7" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Material Now &#8211; Google I/O 2015</a></li>
</ul>

<p>こんにちは、みなさん。私の名前は<a href="https://plus.google.com/+MatiasDuarte/posts" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Matias Duarte</a>です。今日はMaterial Nowについてお話したいと思います。まずは、ハッピーバースデー！Materialですね。記念すべきマイルストーンです。昨年のI/Oで私たちはMaterial Designを紹介しました。私たちは異なるプラットフォーム、異なるスクリーンサイズを超えたデザインシステムを作りたかったのです。私たちはモダンなグラフィックデザインと現実的なユーティリティ、ユーザービリティを組み合わせたかったのです。そして、後づけではないモーションデザインを重視したシステムを作りたかったのです。</p>

<p>信じられないかもしれませんが、私たちがMaterial Designを作っていた時、どのようにそれが受け入れられるのか、少しナーバスでした。しかし、ふたを開けてみれば、私たちはそれを気に入っていましたし、こんな素敵なクオートも見かけました。</p>

<blockquote>
  <p>Material Designは単なるタブレット・スマートフォン用のデザインではない。それはプロダクトが何百万というユーザーにどうコミュニケーションするのかシステマティックなアプローチである。<br>
  &mdash; Gizmodo</p>
</blockquote>

<p>また開発者のみなさんも、良い反応を示してくれました。</p>

<blockquote>
  <p>Googleはデザインゲームを次に進めた。それは絶対的な美的感覚に頼る変わりに、個々のデザイナーをより自由にする原則を定義したのだ。<br>
  &mdash; Sacha Greif Creator of Folyo, Telescope, and Sidebar</p>
</blockquote>

<p>もちろん、デザイナーのみなさんもMaterial Designが何を解決しようとしているのか、そのシステムが、すべてのインタラクティブなプラットフォーム上でデザインする上で助けになると、とても理解しているよう思えます。</p>

<blockquote>
  <p>Material Designは、Web全体のビジュアルを根本的に変えるポテンシャルを持っている。<br>
  &mdash; Armin Vit Under Consideration/Brand New</p>
</blockquote>

<p>こういった感想を聞けて、私たちはホッとしました。しかし、本当にみなさんが聞きたいのは、どのくらいMaterialが役に立っているのか？ということでしょう。私たちGoogleは数字が好きですので、ここでMaterial Designに関する数字を見ていきましょう。</p>

<h2>Material Designに関するデータ</h2>

<p>まずは、私たちのMaterial Designガイドラインを見ていきましょう。私たちはこれを親しみを込めて、『スペック』と呼んでいます。この一年足らずで、<strong>250万ユニークビジター</strong>がこのスペックに訪れました。これはとても良い結果だと私は考えます。もし、あなたがYoutuberであったり猫動画をアップロードしている人であれば、これはそんなに良い結果とは言えないでしょう。しかし、これはデザインガイドラインですよ？すごくありませんか？</p>

<p>もっと重要なことに、このうち<strong>60%以上のユーザーが再訪問</strong>しているのです。これはMaterial Designガイドライン決して一度チラ見すれば理解できるものではないですし、何度も何度も見るような役立つリファレンスだということでしょう。特に、カラー、タイポグラフィとアイコン、そしてもちろん、FAB（Floating Action Button）などのコンポーネントのセクションが特に閲覧されているようです。</p>

<p>デザイナーだけでなく、開発者のみなさんもMaterialを使っています。Polymerに目を向ければ、MaterialコンポーネントをWebに実装するために必要なシステム、Paper Elementの仕様書が<strong>250万回も閲覧</strong>されています。もっと重要なことは、<strong>10万ものWebプロジェクト</strong>で、このフレームワークが使われていることです。</p>

<p>また、みなさんが気にかけているのはAndroid上ではどのくらいなのか？でしょう。Play Store上では<strong>25万近くのMaterial Designを実装したアプリ</strong>を確認することができます。たぶん、これはそんなに大きな数字ではないでしょう。なぜなら何十億というAndroidデバイスがあるというのに、もしくはPlay Storeができてからの7年間どれだけのアプリがリリースされたのだろうか？と考えるからです。</p>

<p>違う観点からこの数字を見れば、2014年10月にLollipop(Android 5.0)がリリースされてから、Play Storeで出されたアプリの<strong>40％はMaterial Designを採用</strong>しています。これは良い結果だと考えています。<strong>新しくできたアプリの3つに1つはMaterial</strong>の恩恵を受けているからです。</p>

<p>これらは始まりにしかすぎませんが、私たちはもっとこの数字を大きくしたいと考えています。デザインに終わりはありません。そこでこれらの数字をどのように大きくするのか、またいかに早く普及させるのか、そしてMaterialをみなさんにいかに簡単に使ってもらうか説明したいと思います。</p>

<p>私たちは、より良く、より包括的にするためにMaterial Designガイドラインのアップデートを公開以来、続けています。実際、私たちはこれまで<a href="https://www.google.com/design/spec/whats-new/whats-new.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">2回アップデート</a>を既にしています。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/06/02.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/06/02.png" alt="" width="640" height="339" class="aligncenter size-full wp-image-15333" srcset="/wp-content/uploads/2015/06/02.png 640w, /wp-content/uploads/2015/06/02-300x159.png 300w, /wp-content/uploads/2015/06/02-207x110.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>最初は2014年11月、Organizing Objects、Navigation Drawers、スクローリングテクニック、Swipe to Reflesh、プロダクトアイコンのセクションを追加しました。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/06/03.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/06/03.png" alt="" width="640" height="338" class="aligncenter size-full wp-image-15327" srcset="/wp-content/uploads/2015/06/03.png 640w, /wp-content/uploads/2015/06/03-300x158.png 300w, /wp-content/uploads/2015/06/03-207x109.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>2015年4月のアップデートでは、Data Tables、App StructureなどのMaterial Designのガイドラインを多く追記しました。</p>

<h2>2015年5月のアップデート</h2>

<p>そして今日、2015年5月はガイドライン公開後もっとも大きなアップデートとなります。非常に多くのものを追加しました。その中にはデザインパターンのリニューアルも含まれています。</p>

<h3>Floating Action Button</h3>

<p><img src="http://i.imgur.com/VMdu06n.gif" alt="Floating Action Button" /></p>

<p>そう、みなさんも好きなFABです。スペック公開時は非常に限定したガイドラインになっており、どのようにフローティングアクションボタンが振る舞うのか、もっと違うトランスフォームがあるのではないか、もっと柔軟性があっては良いのではないかとみなさん考えたことでしょう。私たちもそう思います。よって今日はこの<a href="http://www.google.com/design/spec/components/buttons-floating-action-button.html#" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">FABパターン</a>を拡張したいと思います。これによりもっと柔軟にFABをみなさんのアプリに実装することができることでしょう。</p>

<h3>Material Icon Library</h3>

<p><a href="https://www.google.com/design/icons/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2015/06/Screen-Shot-2015-06-11-at-9.09.39-PM.png" alt="Screen Shot 2015-06-11 at 9.09.39 PM" width="640" height="315" class="aligncenter size-full wp-image-15343" srcset="/wp-content/uploads/2015/06/Screen-Shot-2015-06-11-at-9.09.39-PM.png 640w, /wp-content/uploads/2015/06/Screen-Shot-2015-06-11-at-9.09.39-PM-300x148.png 300w, /wp-content/uploads/2015/06/Screen-Shot-2015-06-11-at-9.09.39-PM-207x102.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>また、今日はスペックにまったく新しいリソース、<a href="https://www.google.com/design/icons/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Material Iconライブラリ</a>を追加しました。このサイトには750以上ものみなさんのプロジェクトで簡単に使えるアイコンあります。しかも、ワンクリックでプロジェクトに導入できるようにしてあります。アプリ開発者のみなさんはすべての必要な解像度のアイコンをここでダウンロードできます。さらにこれらのアイコンをWebフォントとしてもリリースしてますので、リガチャ（合字）として利用できるので、みなさんはアイコンの名前をタイプするだけで実装できます。とってもクールですよね？</p>

<h3>Adaptive Layout</h3>

<p><img src="/wp-content/uploads/2015/06/layout_adaptive_breakpoints_01.png" alt="layout_adaptive_breakpoints_01" width="640" height="282" class="aligncenter size-full wp-image-15346" srcset="/wp-content/uploads/2015/06/layout_adaptive_breakpoints_01.png 640w, /wp-content/uploads/2015/06/layout_adaptive_breakpoints_01-300x132.png 300w, /wp-content/uploads/2015/06/layout_adaptive_breakpoints_01-207x91.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<ul>
<li><a href="https://www.google.com/design/spec/layout/adaptive-ui.html#" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Adaptive UI &#8211; Layout &#8211; Google design guidelines</a></li>
</ul>

<p>Material Designについての要望で一番大きなものと１つとしてアダプティブレイアウトがあります。このため、今回はスケーラブルで一貫性のあるグリッド、レイアウト間でのブレークポイント、振る舞いなど関する詳細なセクションを新たに追加しました。この新しいパターンはきっとどのコンテキストにもなじむことでしょう。</p>

<h3>Device Metrics</h3>

<p><a href="https://www.google.com/design/tool/devices/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2015/06/Screen-Shot-2015-06-11-at-9.11.50-PM.png" alt="Screen Shot 2015-06-11 at 9.11.50 PM" width="640" height="337" class="aligncenter size-full wp-image-15345" srcset="/wp-content/uploads/2015/06/Screen-Shot-2015-06-11-at-9.11.50-PM.png 640w, /wp-content/uploads/2015/06/Screen-Shot-2015-06-11-at-9.11.50-PM-300x158.png 300w, /wp-content/uploads/2015/06/Screen-Shot-2015-06-11-at-9.11.50-PM-207x109.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<ul>
<li><a href="https://www.google.com/design/tool/devices/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Device Metrics &#8211; Google Design</a></li>
</ul>

<p>加えて、アダプティブデザインのためにデバイスのサイズレファレンスを新たにサイトに追加しました。これは、ウェアラブルだろうと、携帯端末であろうとも、タブレット・ラップトップであろうとも任意のサイズのデバイス上でデザインするときに役立つでしょう。そしてキーとなる解像度や密度を発見できるでしょう。もっと重要なことは、これによってどのデバイス・向きで、どのアダプティブテンプレート・パターンを使うべきか理解できるようになったことでしょう。この2つのリソースがみなさんの役に立つことを祈っています。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/06/04.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/06/04.png" width="640" height="338" class="aligncenter size-full wp-image-15331" srcset="/wp-content/uploads/2015/06/04.png 640w, /wp-content/uploads/2015/06/04-300x158.png 300w, /wp-content/uploads/2015/06/04-207x109.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>もちろん、ほかにもたくさんのアップデートがあります。意味のあるモーションについて解説したセクション、ローンチスクリーン、エンプティステートなどの追加と、多くのアップデートがなされました。</p>

<p>そして、現在Material Designはほかのプロダクト、TV、Auto、VRのCardboardに対しても適用できるよう、ガイドラインを追加しました。</p>

<p>今回の大型アップデートによって、みなさんのデザインのお役に立てること祈っていますし、私たちに引き続きフィードバックをください。そうすれば、私たちはアップデートを続けることができます。</p>

<p>私たちはガイドライン・ツール、リファレンスの枠を超えたかったのです。つまり、それらはいくぶんか静的で、ドライ、権威的なのです。そこで、私たちはデザイナーがダイレクトに繋がれる場所にするために、<a href="http://www.google.com/design/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Google Design</a>を新しくリニューアルしました。</p>

<p>つまり、それをデザイナーと開発者のコミュニティにしたかったのです。どうしてデザインをするのか、どのようにデザインするのかといった情報をシェアする場所として考えています。実用的な記事やビデオを配信することで、デザイナー・開発者が抱えている関心事、例えば、どのようにブランド・アイデンティティを損なわずMaterial Designを実装するのかなどを解決できると思っています。</p>

<p>また、Android、iOS、Webと異なるプラットフォーム間でデザインを簡単にするTipsなどの記事などもあります。私たちはみなさんにどこでも快適にMaterialを使ってほしいと思っています。チュートリアルもちろん、Material Designの裏側のシーンを収めたビデオなどもありますので、どうぞチェックしてみてください。</p>

<h2>Polymer</h2>

<p><a href="https://www.polymer-project.org/1.0/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2015/06/Screen-Shot-2015-06-11-at-10.06.53-PM.png" alt="Screen Shot 2015-06-11 at 10.06.53 PM" width="640" height="266" class="aligncenter size-full wp-image-15352" srcset="/wp-content/uploads/2015/06/Screen-Shot-2015-06-11-at-10.06.53-PM.png 640w, /wp-content/uploads/2015/06/Screen-Shot-2015-06-11-at-10.06.53-PM-300x125.png 300w, /wp-content/uploads/2015/06/Screen-Shot-2015-06-11-at-10.06.53-PM-207x86.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<ul>
<li><a href="https://www.polymer-project.org/1.0/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Welcome &#8211; Polymer</a></li>
</ul>

<p>ここまで紹介してきた技術はデザイナーにとって、Materialを表現する上で便利なものですが、今日は開発者のカンファレンスですからMaterialを実装する上で役立つものを紹介したいと思います。</p>

<p>もちろん、最初はPolymerです。今日Polymer 1.0がアナウンスされました。これはパフォーマンス的にも満足が得られるようになったり、安定したり、APIが固定されたことを意味します。PolymerはモダンなWebプラットフォームとモバイルプラットフォームのために必要なものです。もしPolymerを使えば、簡単にスケール可能なアプリケーションを作ることができるでしょう。Polymer開発チームはパフォーマンス改善のために、一行毎にPolymerのコードを書き直したと私に言いました。とっても速くなりましたよ。つまり、プロダクション用途に使ってもらっても問題ないということであり、高品質のアプリのようなものをWeb上でも作成可能ということです。</p>

<p>さらに、Polymer Starter kitとCatalogはMaterial Designのアプリ作成にとりかかる前に、すべてのPaper Elementsを実際に使って試してみることができます。デモやサンプルも含んでいて、とっても見やすいサイトになっていますし、コマンドラインを使わなくてもクールなショッピングカートで各エレメンツをダウンロードできます。</p>

<h2>Android Design Library</h2>

<p>もちろん、MaterialはAndroid 5.0、Mでも使うことができますが、みなさんは2つの気にかかっていることでしょう。もっと簡単に使いやすいコンポーネントがないのか、そして後方互換性も広く対応してほしいと。</p>

<p><a href="http://developer.android.com/tools/support-library/index.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Support Library</a>は常に後方互換性と対峙しています。これはプラグ・アンド・プレイシステムなので、古いAndroidバージョンで新しい機能を動かすことができます。昨年、Materialをリリースしたとき、appcompat libraryを提供しました。これは基本的なレイアウトとスタイリングをサポートするライブラリです。</p>

<p>今回紹介する新しいライブラリはAndroid Design Libraryです。このライブラリはMaterial Designのコアエレメントを使うことができ、隠蔽化された実装を簡単に導入することもできます。例えば、以前シンプルなFABを実装するにも5,6つのXMLファイルが必要でしたが、今日からは1つのフローティングアクションボタンの要素を追加するだけです。新しいライブラリは、他にも簡単に実装できるシャドウ付きのカード、複雑なサイドナビゲーションも、Navigation Drawer Viewにドロップするだけで、スペック通りの動作をするコンポーネントを実装できます。</p>

<p>同様にMaterialタブもまた、アプリに簡単に実装できます。私のお気に入りであり、複雑なコンポーネントで知られるツールバースクローリングも１つのコンポーネントにピンチなどの動作を設定するだけで実装できます。パレットは去年紹介しましたが、今日はそれが6倍速くなりました。詳細について知りたければデベロッパーサイトを確認して下さい。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/06/07.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/06/07.png" alt="後方互換性" width="640" height="339" class="aligncenter size-full wp-image-15332" srcset="/wp-content/uploads/2015/06/07.png 640w, /wp-content/uploads/2015/06/07-300x159.png 300w, /wp-content/uploads/2015/06/07-207x110.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>先ほど、私はSupport libraryは完全なMaterialコンポーネントを提供していない、つまり簡単にデプロイできない、より多くのAndroidデバイスに提供できていないと申し上げました。現在、LoliipopはAndroidデバイスの10%程度しかありませんが、今回紹介した新しいSupport libraryを使用すれば、Android2.1以上のデバイスにMaterialを提供することができます。最高じゃありませんか？</p>

<p>（後編に続きます）</p>
]]></content:encoded>
		
		<series:name><![CDATA[Google I/O 2015 特集]]></series:name>
	</item>
		<item>
		<title>「StyleStats」を活用してCSSを評価する、Evaluating CSS─Frontrend Conference</title>
		<link>/t32k/13504/</link>
		<pubDate>Fri, 06 Mar 2015 03:00:08 +0000</pubDate>
		<dc:creator><![CDATA[石本 光司]]></dc:creator>
				<category><![CDATA[デザイン]]></category>
		<category><![CDATA[StyleStats]]></category>

		<guid isPermaLink="false">/?p=13504</guid>
		<description><![CDATA[連載： Frontrend Conference 特集 (5)本記事は、2015年2月21日に行われたFrontrend Conferenceの「Evaluating CSS」の内容を紹介します。 はじめに こんにちは、...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/frontrend/" class="series-251" title="Frontrend Conference 特集" data-wpel-link="internal">Frontrend Conference 特集</a> (5)</div><p>本記事は、2015年2月21日に行われた<a href="http://frontrend.github.io/conference/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Frontrend Conference</a>の「Evaluating CSS」の内容を紹介します。</p>

<h2>はじめに</h2>

<p><a href="https://speakerdeck.com/t32k/evaluating-css" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2015/03/01.png" alt="Evaluating CSS" /></a></p>

<p>こんにちは、<a href="https://twitter.com/t32k" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">@t32k</a>です。今日はEvaluating CSSというタイトルでCSSの解析ツール、<a href="https://github.com/t32k/stylestats" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">StyleStats</a>に関して説明したいと思います。ちなみにEvaluateというのは『評価する、価値を見極める』といった意味の単語です。</p>

<p>宣伝ですが、今年から<a href="https://frontendweekly.tokyo/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Frontend Weekly</a>という無料のメールマガジンというか、海外の役立つリソースを紹介するウィークリーメールをやってますので、こちらも登録いただけると大変私嬉しいです。</p>

<h2>なぜCSSはそんなに難しいのか？</h2>

<p>では、まずなぜCSSはこんなに難しいのか考えてみましょう？いやいや、CSSってすごく、すごく単純ですよね。</p>

<p><img src="/wp-content/uploads/2015/03/02.png" alt="CSSの構造" /></p>

<p>こういったひとつのRuleがあります。divとsectionというSelectorがあります。その中にDeclarationをしていきます。DeclarationはPropertyとValueから成り立っています。</p>

<p>どうですか、これだけ見るには、すごく簡単ですよね。これのどこが難しいのでしょうか？ちょっと冷静に考えてみてください。ただ単純にCSSを書き連ねていくのは、誰でもできます。しかし、それのメンテンナンス性を維持しつつ、スケーラブル性も保ちながら管理していくのは非常に難しいです。</p>

<p>なぜならCSSにはスコープもなければ、抽象化する術も持たないので、どうしても冗長に書かざるを得なくなってしまいますし、現状はセレクタの命名規則でなんとかまかなうしかないのです。</p>

<p>JavaScriptサイドはよいですね。ES6などでどんどんと強力な機能が追加されていっています。しかし、CSSはプロパティは増えれども構造的にはなにも進化してません。SassなどのCSSプリプロセッサーなどは登場してきてますが、結局コンパイルしてしまえば、ただのCSSです。CSSには頑張ってほしいところです。</p>

<h3>CSSサイズファイルの増加</h3>

<p><img src="/wp-content/uploads/2015/03/03.png" alt="CSSのサイズの変遷" /></p>

<p>CSSは冗長的にしか書けませんので、時と共にじわじわと増加していきます。上記のグラフは、私が制作していたWebアプリケーションのデプロイ毎にCSSファイルサイズを記録しています。2回ほど大きく減少していますが、これは私が不慣れな書き方をしていたのをリファクタリングした結果でして、そのようなコードがなくなれば、あとはじわじわとファイルサイズが増加していくだけです。</p>

<p>私はこれが非常に怖い問題だと思っています。例えば、CSSのせいでレイアウトが崩れた！といったバグなどありますが、そういったものは探せば原因が見つかってすぐに直せます。たいした問題ではありません。しかし、このようにゆっくりとファイルサイズが増加していく場合は、それが問題だと認識しづらいという点が問題です。</p>

<p><a href="https://developers.google.com/web/fundamentals/performance/critical-rendering-path/index?hl=ja" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">クリティカルレンダリングパス</a>の観点から言えば、CSSファイルサイズがダウンロード・パースされるまでレンダリングはブロックされます。つまり、レンダリング遅延の問題が懸念されます。では表示遅延が問題（体感できるように）になってから、解決にリファクタリングしようとしても、スパゲッティ化したコードを一体どこから手を付けていいのかわからない状況に陥ります。</p>

<h3>デザインに依存</h3>

<p>また、CSSはデザインに大きく依存します。いくらあなたがスーパーCSSハッカーであろうとも、どうしようもないデザインをベースにコーディングすれば、どうしようもないスタイルシートができ上がります。</p>

<p><img src="/wp-content/uploads/2015/03/04.png" alt="Webデザインの3つのレイヤー" /></p>

<p><strong>Contents(HTML)</strong>、<strong>Presentation(CSS)</strong>、<strong>Behavior(JavaScript)</strong>といったWebデザインの3つのレイヤーがありますが、結局、HTML/CSSコーディングというのはビジュアルデザイン（PSD）から、ContentsとPresentationを分離させる作業ともいえます。</p>

<p>イレギュラーなデザインパターンを、CSS側で吸収するのは限度があります。そのため、最近ではページをデザインするのではなく、システムをデザインする考え方がよいです。つまり、ひとつひとつのコンポーネント（部品）から成り立つCSSであれば、部品を組み合わせることで、CSSの増加させずにさまざまなビジュアルパターンを制作することができます。</p>

<p>そのためには、スタイル（コンポーネント）ガイドのようなものを日常的に管理し、デザイナーとそれを参照しながらデザインをしてもらうといった制作スタイルも考えられます。</p>

<h3>CSSエンジニアになる</h3>

<p>しかしデザインもまた、突発的なデザイン変更やクライアントの希望などで、一貫性を保つことが難しい場合もあります。それを『デザイナーの責任だー！』と言っていれば、私たちはただのコーダーで終わるしかありません。私たち側でもよりよいものを作るために努力しなければなりません。</p>

<p>個人的にはエンジニアとはそういう存在だと思っています。だから私はCSSエンジニアになりたいと思いました。</p>

<blockquote>エンジニアとは、主に工学（エンジニアリング）分野の専門的な技術を持った実践者のことである。</blockquote>

<ul>
<li><a href="http://ja.wikipedia.org/wiki/%E6%8A%80%E8%A1%93%E8%80%85" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">技術者 &#8211; Wikipedia</a></li>
</ul>

<p>エンジニアとは上記のような人のことを言うそうです。さらにソフトウェアエンジニアリングのWikipediaを見てみると、<a href="http://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA%E5%B7%A5%E7%A8%8B" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ソフトウェアの開発プロセス</a>というものがありました。</p>

<p>CSSにおける <strong>要求 · 仕様</strong> は、デザイナーが出してくるPSDでしょう。ここに関しては今までどおりデザイナーと対話する必要があります。</p>

<p><strong>アーキテクチャ · 設計</strong> に関しては、HTML5エキスパートである谷さんの『<a href="http://www.amazon.co.jp/dp/B00M0ESXUI" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Web制作者のためのCSS設計の教科書</a>』を読めば大丈夫でしょう。</p>

<p>問題は、<strong>実装 · テスト</strong> と <strong>展開 · 保守</strong> の2つの段階でコレといったモノがないことです。私はこの辺りを解決するモノがほしかったのです。</p>

<h2>CSSを評価してみましょう</h2>

<p>そういう理由で、私は<a href="http://www.stylestats.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">StyleStats</a>を作成しました。StyleStatsにスタイルシートに解析させることで、さまざまな指標が得られます。v5.0.1時点で29の指標を確認することができます。基本的な使い方と各種指標の意味は、以前書いた記事を参照してください。</p>

<ul>
<li><a href="https://html5experts.jp/t32k/5743/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">自分の書いたコードが即座に解析できる「StyleStats」でCSSを測ろう！ | HTML5Experts.jp</a></li>
</ul>

<p>v5.0.0でいろいろコマンドラインのオプション名が変わっていますので、ヘルプでご確認ください。
</p><pre class="crayon-plain-tag">$ stylestats -h

  Usage: stylestats [options] 

  Options:

    -h, --help             output usage information
    -V, --version          output the version number
    -c, --config [path]    set configurations
    -f, --format [format]  set the output format 
    -t, --template [path]  set the template path for output formant
    -s, --specs [path]     run test with your test specs file
    -n, --number           show only numeral metrics
    -m, --mobile           set the mobile user agent</pre><p>
CSSと十把一絡げにいっても、HTML5エキスパートの谷さんが書くCSSと、新卒エンジニアの書くそれとでは大きく違うことでしょう。しかし、違うフィールドの人が一見してみれば同じように見えるでしょう。そこでStyleStatsに解析させてみれば、数値的に比較できれば違いが分かります。エキスパートの書いたCSSであれば、CSSでバッドプラクティスと思われる指標の数値は低く、ファイルサイズもまた小さいことでしょう。そういったことがStyleStatsでは目視で確認するより圧倒的に速く理解できます。</p>

<h3>類似ツール</h3>

<p>まずは、<a href="http://cssdig.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CSS Dig</a>というChrome拡張機能があります。解析したいページに行き、拡張ボタンを押すだけで解析できます。</p>

<p>次に<a href="http://cssstats.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CSS Stats</a>というWebアプリケーションがあります。Specificity Graphなど、StyleStatsにはない機能もあります。</p>

<p>StyleStatsもCLIだけでなく、GUIとしてのWebアプリケーションが提供されています。</p>

<ul>
<li><a href="http://www.stylestats.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">StyleStats &#8211; Useful tool to collect CSS statistics</a></li>
</ul>

<p>また、npmモジュールとしてProgrammaticalに利用することもできるため、他にGruntやGulpからも利用することができます。また、解析が終わったらSlackに結果を投稿するなどのインテグレーションも考えられます。</p>

<p><img src="/wp-content/uploads/2015/03/05.png" alt="Slack Integration" /></p>

<p>おかげさまで、<a href="https://moniteur.herokuapp.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">FT Labs</a>や<a href="http://ianfeather.co.uk/css-at-lonely-planet/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Lonely Planet</a>などの世界的な企業でStyleStatsは使われております。</p>

<p>結局、私が欲しかったのはエンジニアリングとしてのツールで、それを継続的インテグレーションに組み込みたかったという点があります。</p>

<p><img src="/wp-content/uploads/2015/03/06.png" alt="CI" /></p>

<p>CIプロセスにCSSの評価を組み込めば、CSSを書く人だけでなく、デザイナーやバックエンドのエンジニアも今のCSSの状態が分かるようになります。その中で、StyleStatsでどのようにモニターとテストをすればよいか説明します。</p>

<h3>モニター</h3>

<p>前述のとおり、CSSは徐々に徐々に増えていきます。気づいたら手遅れになっていた、ということのないように常日頃から監視しておく必要性があります。StyleStatsを使えば、Jenkins上から実行させ、それをグラフとしてプロットすることができます。これは<a href="https://html5experts.jp/t32k/5743/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">前回の記事</a>でも紹介したとおりです。</p>

<p><img src="/wp-content/uploads/2015/03/07.png" alt="moniteur" /></p>

<p>また、最近ではFT Labsの方が<a href="https://github.com/kaelig/moniteur" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">kaelig/moniteur</a>というモニタリングWebアプリケーションを作成してくれました。<code>git clone</code>してきて、ローカルでも動作させることが可能です。Webアプリケーションのとして動かすにはRedisサーバーを使うことになるのですが、そこまで難しくはないので試してみてください。</p>

<h4>User Specified Selectors</h4>

<p>v5.0.0で追加された新規指標のUser Specified Selectorsは、ユーザー指定のセレクタ数をカウントすることができます。config.jsonで<code>"userSpecifiedSelectors"</code>の値に任意の正規表現を記述することで、指標を表示させることができます。</p>

<p>これにより、例えばBEMでのModifierの数やElementの数などカウントするこもできますし、CSSを記述する人が独自の命名規則（独自の接頭辞を持つクラスセレクタ等）さえ、守っていればいろいろ計測することができます。</p>

<h3>テスト</h3>

<p>次にテストですが、CSSには古くから<a href="http://csslint.net/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CSS Lint</a>があります。これはさまざまなエディタのプラグインが揃っていたりGrunt/Gulpのプラグインもあるので、多くの人が使われているかと思います。</p>

<p>しかし、これは単純に使ってたらエラーが出るだけのものです。例えば、古くから運用しているサイトのCSSを解析したい場合、昔にIDセレクタを使っていたといったことがあります。そこで、StyleStatsでは5個以上あったらエラーとするなど、任意の値でCSSをテストすることできます。
</p><pre class="crayon-plain-tag">{
  "defaults": {
    "suiteName": "StyleStats Test Suite for sample.css",
    "text": "{metric}: {actual} should be {operation} {expected}",
    "operation": "&lt;",
    "reporter": "spec"
  },
  "results": {
    "simplicity": {
      "min": 0.4
    },
    "size": 20000,
    "dataUriSize": 8000,
    "idSelectors": 20,
    "importantKeywords": {
      "min": 2,
      "max": 8
    },
    "javascriptSpecificSelectors": 1
  }
}</pre><p>
上記のコードのようにtest-specs.jsonでテストのしきい値を設定します。例えば上記の条件だと、IDセレクタが20個以上だったらエラーでビルドが中止されます。</p>

<p>StyleStatsでテストできる指標は数値的なものであれば何でもできますので、例えば単純にsizeに着目してもいいですし、先ほど説明したUser Specified Selectorsを使って、独自の基準を設けてもらっても大丈夫です。大事なのは皆の前でテストを失敗させる（エラーにならないほうが良いのですが）ことでCSSの問題をプロジェクトチーム全体の問題にすることです。</p>

<p><img src="/wp-content/uploads/2015/03/08.png" alt="test" /></p>

<h2>まとめ</h2>

<p>そういうわけで、CSSはいまだにどうしようもないですが、CSSを扱う人間までがどうしようもないわけではありません。CSSの問題は一人で解決できないので、その問題をチームで共有しましょう。</p>

<p>現状のCSSを状態を常に確認し、ある程度のしきい値をあらかじめ決めておく。肥大化してエラーが出る度になぜクリアできないのか皆で話し合う。そうすることによって、CSSを扱う私たちの価値も上がっていくのではないでしょうか。</p>
]]></content:encoded>
		
		<series:name><![CDATA[Frontrend Conference 特集]]></series:name>
	</item>
		<item>
		<title>t32k、怒られる！セマンティック バージョニングしてますか？</title>
		<link>/t32k/11746/</link>
		<pubDate>Tue, 09 Dec 2014 02:00:29 +0000</pubDate>
		<dc:creator><![CDATA[石本 光司]]></dc:creator>
				<category><![CDATA[システム開発]]></category>
		<category><![CDATA[semver]]></category>

		<guid isPermaLink="false">/?p=11746</guid>
		<description><![CDATA[どうも、バンクーバーでぶらぶらしている@t32kです。最近は暇なのでもっぱらOSS活動に勤しんでおります。そんなわけで日々のアプリケーション開発において重要になってくるのがバージョニングです。 今日はセマンティック バー...]]></description>
				<content:encoded><![CDATA[<p>どうも、バンクーバーでぶらぶらしている<a href="https://twitter.com/t32k" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">@t32k</a>です。最近は暇なのでもっぱらOSS活動に勤しんでおります。そんなわけで日々のアプリケーション開発において重要になってくるのがバージョニングです。</p>

<p>今日はセマンティック バージョニングについて解説します。自身が公開しているライブラリやパッケージのコードを何かしら修正したら、それに伴いバージョンを上げるのが一般的だと思うのですが、実はどのようにバージョンを上げるのが適切なのか、昔の私は理解していませんでした。</p>

<p>『いっぱい変更したのでメジャーバージョン上げてみるか』、『今回の修正は軽微なものだし、マイナーバージョンを上げるか』などと、なんとなくにバージョニングをしていました。</p>

<h2>t32k、怒られる！</h2>

<p><blockquote>If the plugin&#8217;s API changes dramatically (for example, when sortOrder option is renamed to config), there should be a major version update. See http://semver.org./</blockquote></p>

<ul>
<li><a href="https://github.com/csscomb/grunt-csscomb/issues/15" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Use semantic versioning · Issue #15 · csscomb/grunt-csscomb</a></li>
</ul>

<p>そんなときに起こったのが上記の事件です。<a href="https://github.com/csscomb/grunt-csscomb" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">grunt-csscomb</a>という私が管理しているGruntプラグインですが、そのアップデートの際に私がバージョニングを間違えてしまい、同じCSSCombチームのロシアのサンクトペテルブルク在住の青年エンジニアに怒られている悲惨な状況です。</p>

<p>彼の言い分は、「APIを変更したので、この場合はSemantic Versioningのルールに従ってメジャーバージョンを上げるべきであり、そうすることでユーザーも予測・対応しやすい」とのことです。</p>

<p>恥ずかしながら、この時初めてSemantic Versioningなるものを知りました。それよりも30歳も過ぎた大人がですね、地球の裏側ほど離れている、見たこともない青年に怒られている事実に私はへこみましたorz…</p>

<h2>セマンティック バージョニングの翻訳</h2>

<p>ということで、そのSemantic Versioningなるものを勉強してみました。</p>

<ul>
<li><a href="http://semver.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Semantic Versioning 2.0.0</a></li>
</ul>

<p>Semantic VersioningはGravatarsの考案者であり、GitHubの共同創設者でもあるTom Preston-Werner氏によって作成されました。去年、<a href="https://www.ruby-lang.org/ja/news/2013/12/21/ruby-version-policy-changes-with-2-1-0/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Rubyのバージョニングにも導入</a>されて話題になってましたね。</p>

<p>勉強がてら翻訳して、先日プルリクエストがマージされましたので、現在日本語でも閲覧可能です。</p>

<ul>
<li><strong><a href="http://semver.org/lang/ja/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">セマンティック バージョニング 2.0.0</a></strong></li>
</ul>

<p>2度とですね、僕みたいな悲しいおっさんを増やしたくないので、皆さんもちゃんと読んでOSS活動しましょう。</p>

<h2>セマンティック バージョニングの導入</h2>

<p>詳細は公式サイトを見てもらえればよいのですが、なにせ長いですので、ざっくり、最低限、以下のことだけ覚えてください。</p>

<ol>
<li><strong>APIの変更に互換性のない場合は、メジャーバージョン上げる</strong></li>
<li><strong>後方互換性があり機能性を追加した場合は、マイナーバージョンを上げる</strong></li>
<li><strong>後方互換性を伴うバグ修正をした場合は、パッチバージョンを上げる</strong></li>
</ol>

<p>例えばVersion 3.2.1の場合、メジャーバージョンは3、マイナーバージョンは2、パッチバージョンは1ということになります。</p>

<p>一番重要なのはAPIに変更があった場合、メジャーバージョンを変更しなければならないということです。先のgrunt-csscombの件も<code>sortOrder</code>というオプション名を<code>config</code>に変更したので、このプラグインを使用しているユーザーはGruntfileを更新しなければならないケースが出てきます。</p>

<p>逆を言えば、セマンティック バージョニングが浸透しているコンテキストにおいては、メジャーバージョンのアップデートだけ気にしていれば、ユーザーは気軽に自身の依存しているパッケージをアップデートできるということです。</p>

<p>複雑なアプリケーションになればなるほど、依存するパッケージも多くなるので、それらをアップデートする際にちゃんと動作するのか、ひとつひとつ気に病むのは大変ですよね。セマンティック バージョニングという共通ルールは、そういった問題を解決するためにあります。</p>

<p>以前までのバージョンに対する私の一般的な印象は、大きければ大きいほど安定しているといったものでした。実際、そういった意味で商業的なバージョニングもあります（大した機能追加もないのに、大げさなバージョン名をつけるなど）。</p>

<p>例えば、Google Chromeは2014年12月現在バージョン39ですが、これはセマンティック バージョニングの観点から言えば、バージョン1.0でパブリックなAPIが定まってから38回もAPIが変更されたということになります（実際は<a href="http://blog.chromium.org/2010/07/release-early-release-often.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">高速リリースサイクル</a>のためですが&#8230;）。</p>

<p>そのため、セマンティック バージョニングにとってメジャーバージョンが大きいということは開発者にとっては、APIがコロコロ変わるということであまり好ましくない状況といえるかもしれません。</p>

<p>しかし、気軽に作成・公開したパッケージで、『やっぱりこのメソッド名イケてないわー変えたいわー』といような状況が考えられます。そのような場合、新旧のAPIを両方残し、旧APIをdeprecatedと宣言して、マイナーバージョンを上げるだけに留めたほうがよいでしょう。</p>

<p>実際、私の作っている<a href="https://html5experts.jp/t32k/5743/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CSSの指標を計測するパッケージStyleStats</a>も、比較的軽微なAPIの変更を3回もしたため、あっという間にバージョンが4になってしまった経験があります。その都度、APIの変更がどういったものなのかユーザーに確認させるのは良くないことです。</p>

<p>そうゆうわけで、まとめますと、</p>

<ul>
<li>セマンティック バージョニングを守ろう</li>
<li><a href="http://efcl.info/2014/07/20/git-tag-to-release-github/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">リリースノートをちゃんと書こう</a></li>
</ul>

<p>です。ありがとございました。</p>

<p><strong>合わせて読みたい</strong></p>

<ul>
<li><a href="http://www.atmarkit.co.jp/fjava/column/andoh/andoh51.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">意外と知らないバージョン表記・数字の豆知識 &#8211; ＠IT</a></li>
</ul>
]]></content:encoded>
			</item>
		<item>
		<title>自分の書いたコードが即座に解析できる「StyleStats」でCSSを測ろう！</title>
		<link>/t32k/5743/</link>
		<pubDate>Thu, 20 Mar 2014 00:00:06 +0000</pubDate>
		<dc:creator><![CDATA[石本 光司]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Node.js]]></category>

		<guid isPermaLink="false">/?p=5743</guid>
		<description><![CDATA[こんにちわ、@t32kだよ！ 私は仕事では主にHTML/CSSコーディングを担当しているのですが、自分の書いたCSSがイケてるのか、そうでないのか、気になります。私、気になります！そうでなくても、他プロジェクトのCSSの...]]></description>
				<content:encoded><![CDATA[<p>こんにちわ、<a href="https://twitter.com/t32k/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">@t32k</a>だよ！</p>

<p>私は仕事では主にHTML/CSSコーディングを担当しているのですが、自分の書いたCSSがイケてるのか、そうでないのか、気になります。私、気になります！そうでなくても、他プロジェクトのCSSのレビューをお願いされたりすることもあるので、そのCSSがどのような状態であるのか、すばやく簡単に理解する必要性がありました。</p>

<p>そこで私は、<strong>StyleStats</strong>というNode.js製のツールを作りました。</p>

<ul>
<li><strong><a href="https://github.com/t32k/stylestats" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">t32k/stylestats &#8211; GitHub</a></strong></li>
</ul>

<p>StyleStatsの使い方はとても簡単です。ターミナルから下記コマンドを打てば、すぐにCSSを解析した結果が得られます。</p>

<p><code>
$ npm install -g stylestats
$ stylestats http://t32k.me/static/blog/skelton.css
</code></p>

<p><strong>stylestats</strong>の引数に調べたいCSSファイルのパス（複数ファイル、リモートファイル対応）を入力すれば解析してくれます。</p>

<p>解析結果：</p>

<p><code>
StyleStats!
┌─────────────────────────────────┬──────────────────────┐
│ Stylesheets                     │ 1                    │
├─────────────────────────────────┼──────────────────────┤
│ Size                            │ 15.1KB               │
├─────────────────────────────────┼──────────────────────┤
│ Rules                           │ 207                  │
├─────────────────────────────────┼──────────────────────┤
│ Selectors                       │ 424                  │
├─────────────────────────────────┼──────────────────────┤
│ Simplicity                      │ 48.82%               │
├─────────────────────────────────┼──────────────────────┤
│ Most Identifers                 │ 4                    │
├─────────────────────────────────┼──────────────────────┤
│ Most Identifers Selector        │ nav ul li a          │
├─────────────────────────────────┼──────────────────────┤
│ Lowest Cohesion                 │ 24                   │
├─────────────────────────────────┼──────────────────────┤
│ Lowest Cohesion Selector        │ a.button             │
├─────────────────────────────────┼──────────────────────┤
│ Total Unique Font Sizes         │ 15                   │
├─────────────────────────────────┼──────────────────────┤
│ Unique Font Size                │ 10px                 │
│                                 │ 11px                 │
├─────────────────────────────────┼──────────────────────┤
│ Total Unique Colors             │ 11                   │
├─────────────────────────────────┼──────────────────────┤
│ Unique Color                    │ #000                 │
│                                 │ #777                 │
├─────────────────────────────────┼──────────────────────┤
│ Id Selectors                    │ 14                   │
├─────────────────────────────────┼──────────────────────┤
│ Universal Selectors             │ 0                    │
├─────────────────────────────────┼──────────────────────┤
│ Unqualified Attribute Selectors │ 7                    │
├─────────────────────────────────┼──────────────────────┤
│ Javascript Specific Selectors   │ 0                    │
├─────────────────────────────────┼──────────────────────┤
│ Important Keywords              │ 6                    │
├─────────────────────────────────┼──────────────────────┤
│ Float Properties                │ 4                    │
├─────────────────────────────────┼──────────────────────┤
│ Media Queries                   │ 8                    │
├─────────────────────────────────┼──────────────────────┤
│ Properties Count                │ width: 53            │
│                                 │ padding-left: 32     │
└─────────────────────────────────┴──────────────────────┘
</code></p>

<h2>なぜCSSを解析する必要があるのか？</h2>

<p>単純にCSSを記述することは非常に簡単です。スタイルを当てたいターゲットをセレクタで表現し、そのブロックの中にプロパティと値を宣言していくだけです。</p>

<p>この方法は閲覧するだけのドキュメントをスタイル付けするのには問題はなかったでしょう。しかし、現在、私たちが作っているWebサイトというのは単純に読むだけのドキュメントというよりかは、アプリケーションに近い性質があります。アプリケーションというのはユーザーがしてほしいタスクを実行するもので状態変化などを伴いますし、デスクトップアプリケーションを見れば分かる通り、ボタンのような多種多様なUIコンポーネントを必要とします。また、Webアプリケーションはひっきりなしにリニューアルされ、UIコンポーネントを修正したり、削除したり、追加する必要性があります。</p>

<p>Webアプリケーションを実現するために、従来のドキュメント型のサイトを構築してきたようなCSSの記述の仕方をしていれば、すぐさまCSSはスパゲッティ化することでしょう。そこで私たちは、CSSを書く上でのベストプラクティスを理解しなければなりません。</p>

<ul>
<li><a href="https://github.com/stubbornella/csslint/wiki/Rules" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Rules · stubbornella/csslint Wiki</a></li>
</ul>

<p>基本的には<a href="http://www.jshint.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">JSHint</a>のように、CSSにも<a href="http://csslint.net/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CSS Lint</a>があるので、こういったツールを使えばよいと思います。StyleStatsで出力される指標は、CSS Lintで指摘される項目を参考にしたものなので、StyleStatsを実行することで、そのベストプラクティスから自分のコードがどれだけ適応しているのか確認することができます。</p>

<p>CSSは基本的にUIに責任を持っているため、JavaScriptのように致命的なエラーになることが少ないかと思います。しかし、これがやっかいな問題だと思います。なんとなく使っていないコードが残っていたり、なんとなく非効率なセレクターを書いてたりして、問題が顕在化したときに対処しようと思っても、スパゲッティすぎてどうすることもできない（Command+A Delete!）ということがあります。</p>

<p>そうならないためにも、日々のコード品質チェックは欠かせないものと思います。</p>

<ul>
<li><a href="https://github.com/es-analysis/plato" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">es-analysis/plato</a></li>
<li><a href="http://es-analysis.github.io/plato/examples/jquery/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Plato &#8211; JavaScript Introspection</a></li>
</ul>

<p>JavaScriptにPlatoという解析ツールがあるのですが、ちょうどこれのCSS版となれるよう今後ともStyleStatsを開発していくつもりです。</p>

<h2>各種指標の意味</h2>

<p>単純にファイルサイズだけを見ていても、そのCSSが良いCSSなのか悪いCSSなのかよく分かりませんので、その他にもCSS Lintをベースとした指標があります。</p>

<p><code>
$ stylestats -c path/to/.stylestatsrc
</code></p>

<p>のように、<code>.stylestatsrc</code>といった<a href="https://github.com/t32k/stylestats/blob/master/test/fixture/.stylestatsrc" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">設定JSONファイル</a>を一緒に読み込むことで、指標の表示・非表示などカスタマイズできます。</p>

<p>今回解説する指標はv2.2.1時での指標となります。今後、変更や追加などが想定されますので、留意しておいてください。</p>

<p><img src="http://i.imgur.com/kdCndXt.png" alt="" /></p>

<h3>Stylesheets</h3>

<p><code>stylesheets</code> : boolean</p>

<p>解析するスタイルシートの数。下記のように3つのファイルを解析すれば、この値は3になります。</p>

<p><code>
$ stylestats path/to/foo.css path/to/bar.css path/to/baz.css
</code></p>

<h3>Size</h3>

<p><code>"stylesheets": true</code></p>

<p>解析するスタイルシートのファイルサイズです。複数読み込んだ場合は、合計値となります（以後の指標に関しても同じ）。</p>

<h3>Data Uri Size と　Raito Of Data Uri Size</h3>

<p><code>"dataUriSize": true, "raitoOfDataUriSize": true,</code></p>

<p>スタイルシート内のインライン画像のサイズとスタイルシートに対する割合です。画像をインライン画像にすることでHTTPリクエストを抑えることができますが、外部CSSファイルがダウンロードされないとレンダリングが始まらないので、この数値が大きすぎるのもよくありません。</p>

<h3>Gzipped Size</h3>

<p><code>"gzippedSize": false</code></p>

<p>解析するスタイルシートのgzip後のファイルサイズです。処理が重いのでデフォルトでは、OFF(<code>false</code>)にしてあります。</p>

<h3>Rules</h3>

<p><code>"rules": true</code></p>

<p>ルール（宣言ブロック）の数です（上図参照）。</p>

<h3>Selectors</h3>

<p><code>"selectors": true</code></p>

<p>セレクタの数です（上図参照）。</p>

<h3>Simplicity</h3>

<p><code>"simplicity": true</code></p>

<p>Rules / Selectors をパーセンテージで表したものです。これは個人的に追加した指標なのですが、Sassの<code>@extend</code>などで継承していると下記のような状態になったりします。もちろんこれはバッドプラクティス的な継承の使い方かと思います。</p>

<p><a href="http://www.slideshare.net/t32k/sasscompass-20689960/63" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="http://i.imgur.com/rRcAxBK.png" alt="" /></a></p>

<p>このようにならないためにも、1つのルールには1つのセレクタが対応しているほうが、シンプルで都合がよいかとおもいます。</p>

<h3>Most Identifers と Most Identifers Selector</h3>

<p><code>"mostIdentifers": true,　"mostIdentifersSelector": true</code></p>

<p>セレクタの中で最も識別子が多いセレクタとその数を表示します。</p>

<p><code>
.foo .bar .baz { color: red; }
</code></p>

<p>上記のセレクタの識別子は、3つとなります。これもSassのネストのような機能を使っていると、深くなる傾向がありますので、気をつけてください。</p>

<h3>Lowest Cohesion と Lowest Cohesion Selector</h3>

<p><code>"lowestCohesion": true, "lowestCohesionSelector": true</code></p>

<p>cohesionは凝集度のことです。凝集度に関してはWikipediaを参照。</p>

<blockquote>凝集度（ぎょうしゅうど、コヒージョン、cohesion）とは、情報工学においてモジュール内のソースコードが特定の機能を提供すべく如何に協調しているかを表す度合いである。IPAが実施する情報処理技術者試験では、強度(きょうど、ストレングス、strength)という言葉が使われる。凝集度は順序尺度の一種であり、「凝集度が高い」とか「凝集度が低い」といった言い方で使われる。凝集度の高いモジュールは、堅牢性、信頼性、再利用性、読みやすさなどの点で好ましく、凝集度の低いモジュールは保守/評価/再利用/読解が難しいため、好ましくないとされる。</blockquote>

<ul>
<li><a href="http://ja.wikipedia.org/wiki/%E5%87%9D%E9%9B%86%E5%BA%A6" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">凝集度 &#8211; Wikipedia</a></li>
</ul>

<p>Lowest Cohesionは、<a href="http://article.enja.io/articles/solidcss.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">SOLID CSS</a>のSingle Responsibility Principle / 単一責任の原則に由来していて、一つのルールにあまりいろいろなスタイルを詰め過ぎないほうがよいです。そこで、Lowest Cohesionは各ルール内で一番宣言数が多いルールのセレクタと宣言数を表します。</p>

<h3>Total Unique Font Sizes と Unique Font Size</h3>

<p><code>"totalUniqueFontSizes": true, "uniqueFontSize": true</code></p>

<p>ユニークなフォントサイズとその数です。現状、<code>font-size</code>プロパティで宣言されている値をとっています。<code>font</code>プロパティによるショートカットで宣言されている値を取得できていません。</p>

<h3>Total Unique Colors と Unique Color</h3>

<p><code>"totalUniqueColors": true, "uniqueColor": true</code></p>

<p>ユニークなカラーとその数です、現状、<code>color</code>プロパティで宣言されている値を取得しています。<code>background-color</code>、<code>border-color</code>などの値を含むかは検討中です。</p>

<h3>ID Selectors</h3>

<p><code>"idSelectors": true</code></p>

<p>IDセレクタを含むセレクタの数です。</p>

<h3>Universal Selectors</h3>

<p><code>"universalSelectors": true</code></p>

<p>ユニバーサルセレクタを含むセレクタの数です。</p>

<h3>Unqualified Attribute Selectors</h3>

<p><code>"unqualifiedAttributeSelectors": true</code></p>

<p>不適切な属性セレクタの数です。</p>

<p><code>
.selected [type=text] {
    color: red;
}
</code></p>

<p>上記はこれに該当しますが、下記は該当しません。なぜならセレクタは右から左へと解析されるので、上記のセレクタの場合すべての要素をチェックするからです。</p>

<p><code>
.selected [type=text] a {
    color: red;
}
</code></p>

<ul>
<li><a href="https://github.com/stubbornella/csslint/wiki/Disallow-unqualified-attribute-selectors" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Disallow unqualified attribute selectors · stubbornella/csslint Wiki</a></li>
</ul>

<h3>Javascript Specific Selectors</h3>

<p><code>"javascriptSpecificSelectors": /[#\.]js\-/g</code></p>

<p><code>js-*</code>のようなJavaScript専用のセレクタを含む数です。DOMをJavaScriptから操作する場合、id属性やclass属性をフックとして利用します。これらの属性値には<code>js-*</code>のような接頭辞をつけて、JavaScript専用のものとし、これらのセレクタにはスタイルを付与しないほうが、独立性を保てます。</p>

<p>デフォルトの接頭辞には<code>js-*</code>を指定していますが、任意の正規表現オブジェクトを渡すことで変更可能です。</p>

<p>参考：</p>

<ul>
<li><a href="http://article.enja.io/articles/about-html-semantics-and-front-end-architecture.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">About HTML semantics and front-end architecture | en.ja Article</a></li>
</ul>

<h3>Important Keywords</h3>

<p><code>"importantKeywords": true</code></p>

<p><code>!important</code>の宣言数です。</p>

<h3>Float Properties</h3>

<p><code>"floatProperties": true</code></p>

<p><code>float</code>プロパティの宣言数です。あれこれfloatしてレイアウトをこねくり回すより、最初からグリッドフレームワークの導入を考えたほうが得策な場合もあります。</p>

<ul>
<li><a href="https://github.com/stubbornella/csslint/wiki/Disallow-too-many-floats" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Disallow too many floats · stubbornella/csslint Wiki</a></li>
</ul>

<h3>Media Queries</h3>

<p><code>"mediaQueries": true</code></p>

<p>Media Queriesの宣言数です。</p>

<h3>Properties Count</h3>

<p><code>"propertiesCount": 10</code></p>

<p>どのプロパティがどれだけ宣言されているのか、デフォルトではTop10までランキング出力してくれます。大体のCSSの傾向というか、見れて楽しいです。全部見たかったら、<code>{"propertiesCount": 1000}</code>といった風に指定すればよいです。個人的にこれが欲しかったので作ったという背景もあります。</p>

<p>v2.2.1では以上の指標ですが、こういった指標があったら便利だなとか、この指標はこうしたほうがよいなどありましたら、どんどんIssuesをあげてください。よろしくお願いします。</p>

<ul>
<li><a href="https://github.com/t32k/stylestats/issues?state=open" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Issues · t32k/stylestats</a></li>
</ul>

<h2>CIツールとの統合</h2>

<p><code>
stylestats path/to/stylesheet.css -t csv
</code></p>

<p>という風にすればCSV形式で出力できるので、これを使って<a href="http://jenkins-ci.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Jenkins CI</a>上でファイルサイズの変遷など記録したいと思います。</p>

<ul>
<li><a href="https://github.com/t32k/stylestats/wiki/Plot-with-Jenkins" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Plot with Jenkins · t32k/stylestats Wiki</a></li>
</ul>

<p><a href="http://www.cloudbees.com/jenkins/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CloudBees</a>社のサービスを使えば、月100分までのビルドが無料でJenkinsをクラウド上で利用できるので、それで試すのもよいかと思います。</p>

<p>Jenkins上で、グラフを作るために<a href="https://wiki.jenkins-ci.org/display/JENKINS/Plot+Plugin" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Plot Plugin</a>をインストールします。このプラグインは、Java properties、CSV、XMLにファイルを読み込みんでグラフを生成してくれます。</p>

<p>あとは、<a href="https://wiki.jenkins-ci.org/display/JENKINS/NodeJS+Plugin" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">NodeJS Plugin</a>などで、Node.jsとStyleStatsをインストールすれば準備完了です。</p>

<p><img src="http://i.imgur.com/PcH645t.png" alt="" /></p>

<p>ビルドの処理にStyleStatsを実行し、CSVで出力し、ビルド後の処理でそのCSVを読み込んであげれば、完了です。</p>

<p>あとは、GitHubと連携してレポジトリにコミットしたら、ビルドを実行させるなどトリガを設定してもらえればと思います。</p>

<p>File Size:
<img src="http://i.imgur.com/1c0cwgo.png" alt="1c0cwgo.png (750×450)" /></p>

<p>Style Info:
<img src="http://i.imgur.com/kF0CLWt.png" alt="kF0CLWt.png (750×450)" /></p>

<p>あとはデータが貯まると、こんなかんじでグラフが生成されます。CSSのリファクタリングは地道な作業ですので、ファイルサイズだけでなく、セレクタ数やルール数など細かい指標の変遷をチェックしていれば、モチベーションも持続できるかと思います。ぜひとも、導入してみてください。</p>

<p>また、ローカルで確認したい場合はGrunt/Gulpプラグインもありますので、そちらを使ってもらえるとよいです。</p>

<ul>
<li><a href="https://github.com/tvooo/grunt-stylestats" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">tvooo/grunt-stylestats</a></li>
<li><a href="https://github.com/1000ch/gulp-stylestats" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">1000ch/gulp-stylestats</a></li>
</ul>

<p>今後はtestspecファイルを認識できるようにし、例えばImpotant Keywordsが10個以上だったらテストを失敗させるといったことを、Jenkins・Travis-CIなどでできるようにしたいと思っています。</p>

<p>みなさんもぜひ使ってみてくださいね！</p>

<p>[追記] 2014年4月4日</p>

<ul>
<li><a href="http://www.stylestats.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Online tool for StyleStats</a></li>
</ul>

<p>オンラインでStyleStatsを使えるツールを公開しました。</p>
]]></content:encoded>
			</item>
	</channel>
</rss>
