<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Laboratory &#8211; Mach3.laBlog</title>
	<atom:link href="https://blog.mach3.jp/category/laboratory/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.mach3.jp</link>
	<description></description>
	<lastBuildDate>Wed, 13 Aug 2025 06:03:04 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>
	<item>
		<title>SVG Colk Board で Vuex を使ってみた話</title>
		<link>https://blog.mach3.jp/2018/08/06/svgcolkboard-with-vuex.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Sun, 05 Aug 2018 22:39:24 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Illustrator]]></category>
		<category><![CDATA[localStorage]]></category>
		<category><![CDATA[SVG]]></category>
		<category><![CDATA[Vue]]></category>
		<category><![CDATA[Vuex]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=4430</guid>

					<description><![CDATA[先日リリースしたWebアプリ「SVG Colk Board」の紹介と、 その中身の話を少し綴っておきます。 SVG Colk Board を作った話 SVG Colk Board これは何？ Illustrator 上で [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>先日リリースしたWebアプリ「SVG Colk Board」の紹介と、 その中身の話を少し綴っておきます。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/Q6wVIsl911oqKE_s8_1B8U7lrpd6z5I6juY0Pm4ZQYCNiBQiTFtX_W0uWzDRU1gLE2PzdDu3PNmiHgrFUqafRIq8mJImNhPFXEb28mhTS4uEzxeD5yUDxiCXUKiPXO7u1W1RxcHUUQ=w1200-h630-no" alt=""/></figure>



<p></p>



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



<h2 class="wp-block-heading">SVG Colk Board を作った話</h2>



<p><a href="https://colkboard.netlify.com">SVG Colk Board</a></p>



<h3 class="wp-block-heading">これは何？</h3>



<p>Illustrator 上で図をコピーしてテキストエディタにペーストすると、SVGが出力されます。 しかし、そこで出力されるSVGは不要な記述も多く、末尾に付加されている謎文字のおかげで正常に表示されません。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/dpFNQv8ZK29VeQYJstKNhjaS0fiV3kHAE7el-OW2QO4IvcpSvX5x8KlW8ElqCciEhRn76u6sR2xk0paSmH2-5WisWehSuuqh81yh5XBhN5MVfHqZjoULSQBsk69gO-rYRYBZNKQnUQ=w1200-h480-no" alt=""/></figure>



<p></p>



<p>これらをクリーンに最適化する為に作ったのが SVG Colk Board です。</p>



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



<ol class="wp-block-list">
<li>Illustrator上で図をコピーする</li>



<li>それを SVG Colk Board 上でペーストする</li>



<li>配置された図を選択すると「SVG」「DataURI」ボタンが表示される</li>



<li>「SVG」「DataURI」のボタンをクリックすると、それぞれ最適化された結果がクリップボードにコピーされる</li>



<li>結果をテキストエディタにペースト</li>
</ol>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/SUNW2kVI7ky6Odgavh3-g5rTmJ3q--p_cSl6vDjXj-PJt-o9kLKsqfCkUrgz-qvm6Ar0E0v5izvtxxkW7R31t3eMaAFgD1zb25doXOPuU6xqOiCTxKQmsujJO0OF8GMhOy0QHhB8nQ=w1200-h800-no" alt=""/></figure>



<p></p>



<ul class="wp-block-list">
<li>ペーストした図のデータは localStorage に保存されるので、ブラウザを閉じた後も保持されます</li>



<li>つまり貼り付けられる図の数は localStorage の容量依存です</li>



<li>もちろんブラウザをまたいでは保持されません</li>
</ul>



<h2 class="wp-block-heading">SVG Colk Board の中身</h2>



<p>このアプリケーションは <a href="https://jp.vuejs.org/index.html">Vue.js</a> で作られています。 そして Vue と共に利用しているのが <a href="https://vuex.vuejs.org/ja/">Vuex</a> と <a href="https://github.com/robinvdvleuten/vuex-persistedstate">vuex-persistedstate</a> です。</p>



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



<p>ここでは詳しい説明を省きますが、 Vuexとは、中規模以上のアプリケーション開発向けの状態管理ライブラリで、 公式ではこのように説明されています。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Vuex は Vue.js アプリケーションのための 状態管理パターン + ライブラリです。 これは予測可能な方法によってのみ状態の変異を行うというルールを保証し、アプリケーション内の全てのコンポーネントのための集中型のストアとして機能します。<br /><a href="https://vuex.vuejs.org/ja">https://vuex.vuejs.org/ja</a></p>
</blockquote>



<p>簡潔に言うと、状態管理にストア（store）という概念を導入する為のライブラリです。 以下、ものすごくざっくりとした説明をします。</p>



<p>Vue.js のコンポーネントは各々が持つ data の値を基にビューを構築・描画し、必要に応じて処理を行います。 store というのはその data に似た振る舞いをしますが、 data が値へのアクセスで直接変更出来るのに対し、 store はセッターのようなメソッドを介してのみ値を変更する事ができ、 それにより値を保護し、変更を集中管理する事ができます。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/dQdUmU0-qeNxQBzUeWfUnx2-eu9AUC5Rx6ZnxT6hkE4yMs0RI2n3AVt2eL0vZzR_Z_KPZBQs3fyimpE6MyN3HvJtt3OOoGbuPXK4BlpCpmJ3wHIJtuuQveiFGPj5MTluMQbgY2doHg=w1200-h800-no" alt=""/></figure>



<p></p>



<p>ざっくりしすぎていてあまりイメージし辛いかと思いますので、下記ページを参考にしてください。</p>



<ul class="wp-block-list">
<li><a href="https://jp.vuejs.org/v2/guide/state-management.html">状態管理 — Vue.js</a></li>
</ul>



<p>先に述べた通り、中規模以上のプロジェクトでなければあまり恩恵にあずかれず、冗長になるだけと感じるかもしれません。 しかし、Vue.js を採用するという事は、ある程度の規模のあるプロジェクトとなる予測が立つとも言えるので、 転ばぬ先の Vuex を問答無用で入れてしまうのも選択肢の一つだと考えられます。</p>



<h3 class="wp-block-heading">vuex-persistedstate</h3>



<p>今回作った様なミニマムなアプリケーションでは正直Vuexは不向きな気がします。 それでもVuexを導入したのは、半分はVuexで習作してみるため、 もう半分はこの <strong>vuex-persistedstate</strong> を使うためです。</p>



<ul class="wp-block-list">
<li><a href="https://github.com/robinvdvleuten/vuex-persistedstate">robinvdvleuten/vuex-persistedstate: <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4be.png" alt="💾" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Persist Vuex state with localStorage.</a></li>
</ul>



<p>vuex-persistedstate は、Vuexのストアの中身（state）をまるっとlocalStorageに保存してくれるプラグインです。 Vuexでストアを書く時にちょっとインポートしてやれば簡単に導入できます。 （下記はREADMEのコードそのままです）</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">import</span> createPersistedState <span class="hljs-keyword">from</span> <span class="hljs-string">"vuex-persistedstate"</span>;

<span class="hljs-keyword">const</span> store = <span class="hljs-keyword">new</span> Vuex.Store({
  <span class="hljs-comment">// ...</span>
  <span class="hljs-attr">plugins</span>: &#91;createPersistedState()]
});
</code></span></pre>


<p>これで（同じブラウザで見る限りは）ページの状態を永続化できるという寸法です。 なんて便利なんでしょうか！</p>



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



<p>もともとはイラレが吐き出すSVGを最適化する事しか考えてなかったのですが、 ちょうどよいお題だと思って Vuex を使って習作してみたというお話でした。 このアプリで使用している netlify の知見も少しずつたまり始めたので、それはまたいずれ。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>時間を計測する装置について考えてみる</title>
		<link>https://blog.mach3.jp/2018/04/11/think-about-clock.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Wed, 11 Apr 2018 01:33:29 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Clock]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Netlify]]></category>
		<category><![CDATA[SVG]]></category>
		<category><![CDATA[Vue.js]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=4425</guid>

					<description><![CDATA[近代以降、人は時間にしばられ、あるいは守られながら生活をするようになりました。 ここでそれが良いことだとか悪いことだとか考えるような詮無い事はしません。 今日は、私達の暮らしに欠かせない「時間」を測定する装置について考え [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/1ZH-j9T0CZs7VUKh_b996DhyGwQEPaURj6DV4K_wOZsrOBKH1sX3aAJDsvP8mp24A5P5lkYqNq-M8kfZPogzfsduK5FxwRXWKXw_mME6JDtBaZoz5c1xgbWboO7leh6IltRg1Zl95w=w600-h315-no" alt="時間を計測する装置について考えてみる"/></figure>



<p></p>



<p>近代以降、人は時間にしばられ、あるいは守られながら生活をするようになりました。 ここでそれが良いことだとか悪いことだとか考えるような詮無い事はしません。 今日は、私達の暮らしに欠かせない「時間」を測定する装置について考えていきたいと思います。</p>



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



<h2 class="wp-block-heading">つまり時計である</h2>



<p>時間を計測する装置、つまるところ「時計」と呼ばれる装置なのですが、 今あるアナログ時計のデザインに私達はあまりにも慣れ親しみすぎてしまいました。 なのでその存在からは一旦離れて、 改めて私達の生活に必要な「時間」を測る装置のデザインについて思いを馳せます。</p>



<h3 class="wp-block-heading">なんでこんな事を考え始めたのか</h3>



<p><del>VueでSVGベースのコンポーネントを試してみたかったからです。</del> ハワイの住人は非常に緩やかな時間感覚をもっていて、それは「ハワイアン・タイム」などと呼ばれるそうです。 常日頃時間に追われて生活していると、ふとそういう物に憧れをもつ事があります。 「大雑把な時間感覚で、ゆるく生きていきたい」と。</p>



<p>そこで、大雑把に時間を把握できるデザインの時計を考えてみようと考えました。</p>



<h2 class="wp-block-heading">作ってみたサンプル達</h2>



<p>そしてこちらが作ってみたサンプルです。 実用性等はあまり深く考えずに自由に、4種ばかり作ってみました。</p>



<ul class="wp-block-list">
<li><a href="https://arclock.netlify.com/">ArClock</a></li>
</ul>



<h3 class="wp-block-heading">サンプル1 : 比較的普通なそれ</h3>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/JTcm7I6CTCNQs9y4srgBJ6gBsbbYXyaTOvbI63m1Tf1WnhDIBkAdBJ3ykzvHz7b5yBfFNJcULw6k5ON3wWXE0b57XgXNGcI0Jy-JDAwxTzLJZpIwq3fIyMN0k3SIw_WZ9bRvzjBV2Q=w600-h300-no" alt="比較的普通なそれ"/></figure>



<p></p>



<p>普段目にするアナログ時計にかなり近いデザインです。 異なる点と言えば、針が円弧になり、時間を表す部分が12時間ではなく24時間単位、つまり1日で1周になる所です。</p>



<p>なぜ今あるアナログ時計が24時間ではなく12時間で1週なのかは詳しく調べていないのでわかりませんが、 12時間の方がぱっと見てより精細に時間を知ることが出来るのは確かです。 ですので、より大雑把にする為に24時間にしてみました。</p>



<h3 class="wp-block-heading">サンプル2 : 波の様なそれ</h3>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/dPQh0WwZL5Ubqe4PVHeQxF3Cvjgw6C6akhLPs1XQDm9uBBjKOzNWZWPQQEhNWNhjvnFCJGm5daBNiCWZvR6fvKsu1bZkt5tMcvi-wy1kSzyhOgV3ti9VBGMXVrcfX6i1hXF18fMY9Q=w600-h300-no" alt="波の様なそれ"/></figure>



<p></p>



<p>このサンプルはちょっとお気に入りです。</p>



<p>時間部分のトータルが24時間になっているのはサンプル1と同様ですが、基点が朝の6時になっていて、右端からスタートします。 つまり、右の円弧は6時から18時までの「昼間」を表し、左の円弧は18時から翌6時までの「夜間」を表します。 右から左にしたのは、東から昇って西に沈む太陽をイメージしていたりします。</p>



<p>分と秒も一応なんとなく分かるようにはなっていますが、これは、あまりに動きがないとつまらないので付けたただの飾りです。 昼間/夜間のだいたい何時くらいなのかがわかれば良いというテーマの時計です。</p>



<h3 class="wp-block-heading">サンプル3 : 週を意識したそれ</h3>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/gUCx6WD4ElgJS_iVhwGKYO9yADxm_wAY7rb0-VDfe4VVPU0aUjm9ZXQKkXUzp6SMgfuyvzkhSf86VxDlhMo69xKR9110u1rwNObqvEUqEOHWj1IEWjvLHXHg2l3GkzAiRjnb98RYLQ=w600-h300-no" alt="週を意識したそれ"/></figure>



<p></p>



<p>もっと大雑把にしてみました。一週を一つの単位として表現してみた時計（？）です。 月曜日を起点として、現在週のどの辺りなのかを大まかにあらわします。 今回作った時計（？）の中で最も動きの無い、面白みのない物となりました。</p>



<p>日曜日を中央に押し込んだ理由は3つあります。 1つ目は、Saturday と Sunday で &#8220;S&#8221; が続いて見づらいこと、 2つ目は、7だと360を割り切れないこと、 3つ目は、6ならばリボルバーの弾倉っぽくなるのでイメージとして採用してみようと思った次第です。 （しかし、調べたら7発装填のリボルバーも存在する様でした。 <a href="https://ja.wikipedia.org/wiki/%E3%83%8A%E3%82%AC%E3%83%B3M1895">ナガンM1895 &#8211; Wikipedia</a> ）</p>



<p>この7つの曜日が全て赤く染まる時、我々は月曜日の到来に恐れおののく事でしょう。</p>



<h3 class="wp-block-heading">サンプル4 : 年を意識したそれ</h3>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/HDn-v33dYCDVJxh2hzZCafL1wKpRqnLAETmfmUvkpI8jkvMt5nbveKVx5YoLcNgH2H3Et4ZwXPyYTS-iLskgeuDi9T2su6SM9bqyvrLr92JvJIZRz31rUGcIzj1hHcwx3bgfmXp2Ag=w600-h300-no" alt="年を意識したそれ"/></figure>



<p></p>



<p>さらに単位を大きくして、年にしてみました。 年輪をイメージしていますが、輪になってないしひとつの層は別に年じゃないでしょう？というのは野暮な突っ込みです。 むしろゼンマイをイメージしていると言った方が理解を得られるかもしれません。</p>



<p>このゼンマイ状の線は、現在が1年のどの辺りなのかを示しますが、 半径ではなく線分の長さであらわしている為、見た目と実際に感覚としてズレが生じるでしょう。 しかし、年始の一ヶ月よりも年末の一ヶ月の方が短く思えるのはわりと一般的な感覚のように思えます。 そんな錯覚も表現出来てしまう時計であります。</p>



<p>角層の塗りは60秒で終端にたどり着きます。 ちょっとした動きが欲しかったのと、ぐるぐる動いているのが楽しかったので付けてみました。</p>



<h2 class="wp-block-heading">技術的な話</h2>



<p>これらのサンプルは全てインラインSVGで作られていて、 パスは一部の物を除いてほとんど <code>&lt;path&gt;</code> の <code>A</code> コマンドで描画してあります。 動きはほとんど <code>stroke-dash-array</code> と <code>stroke-dash-offset</code> で実装されていて、アニメーションは全て <code>transition</code> です。</p>



<p>せっかく Vue で作ったサンプルなので <code>&lt;path&gt;</code>　の <code>d</code> 属性を直接書き換えてアニメーションを、とも思ったのですが、 頂点の数が変わると <code>transition</code> は効かないので他の方法をとりました。</p>



<h3 class="wp-block-heading">SVGベースのVueコンポーネント</h3>



<p>インラインSVGをベースにしたVueコンポーネントを今回試してみましたが、なかなか面白いものです。 <code>&lt;path&gt;</code> の描き方を理解すると大抵の物は描けますし、動的に操作する事も容易です。 例えばデータを渡してグラフを描画するコンポーネント実装などでその実力を大いに発揮しそうです。というか、まさにそういうケースで先日発揮しました。</p>



<p>そういった部品を実装しててふと思い出したのが ActionScript3 で作るFlashコンテンツで、非常に類似しています。 AS3でも受け取ったデータから <code>Graphics</code> クラスで動的に描画をするなどしていましたね。 あんなイメージです。</p>



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



<p><strong>Netflix</strong> とよく似ている為よくタイポしてしまいがちな <strong>Netlify</strong> にデプロイしてみました。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><a href="https://www.netlify.com/">Netlify: All-in-one platform for automating modern web projects.</a><br />
  Build, deploy, and manage modern web projects</p>
</blockquote>



<p>このサービスは、GitHub等のリポジトリサービスと連携して、そのリポジトリの指定したブランチにpushするだけでデプロイが完了するというお手軽なWebサーバーです。 それに加えて、様々な機能をご利用いただけます。</p>



<ul class="wp-block-list">
<li>ビルドコマンドをデプロイ前に実行してくれる</li>



<li>Functions 機能で AWS Lambda にもデプロイできる</li>



<li>Form 機能でフォームリクエストをハンドリングできる</li>



<li>Let&#8217;s Encrypt によるSSL対応（独自ドメインが必要）</li>
</ul>



<p>Lambdaと連携出来るので、開発コストはさておき大体の事は実現できそうですね。 今回はビルドコマンドの実行ぐらいしか活用していませんが、機会があればがっつり使ってみたい所存です。</p>



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



<p>色々な時計を作ってみましたが、先に申し上げたとおり、実用出来る代物ではありません。 少なくとも、この国で今の生活をしているかぎりは…。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>デザイナーの為の黒い画面入門（前）</title>
		<link>https://blog.mach3.jp/2017/12/15/kuroigamen.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Fri, 15 Dec 2017 04:00:37 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Bash]]></category>
		<category><![CDATA[Command]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Terminal]]></category>
		<category><![CDATA[Windows]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=4379</guid>

					<description><![CDATA[Web制作の現場で「黒い画面」を使うことは、近年ではごく当たり前な事になってしまいました。 フロントエンドエンジニアの方はもちろん、マークアップエンジニアの方ならば抵抗は無いでしょう。 しかし、デザイナーさんには未だに「 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/ENwiBnvZJNeajEckqEMI7vL1oGLn8jCZo8b4CggIOMn-W_hMbpv8AwNcgBQtKRlXvos2pt3M6_KAjONWZ0zGBtFBV9qTdHOLRW43rJ5-AdSBoxEbfq4E57yfLZCvG93YriTEx9NipQ=w600-h315-no" alt=""/></figure>



<p></p>



<p>Web制作の現場で「黒い画面」を使うことは、近年ではごく当たり前な事になってしまいました。 フロントエンドエンジニアの方はもちろん、マークアップエンジニアの方ならば抵抗は無いでしょう。 しかし、デザイナーさんには未だに「黒い画面」は苦手意識がある方も少なくないのではないでしょうか。 その苦手意識を払拭する為に、少しばかり「黒い画面」への理解を深めてみましょう。</p>



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



<ol class="wp-block-list">
<li>デザイナーが触れる「黒い画面」</li>



<li>「黒い画面」ことターミナルとは</li>



<li>「黒い画面」の基本</li>



<li>「黒い画面」の怖い話</li>



<li>Windows環境での「黒い画面」</li>
</ol>



<h2 class="wp-block-heading">デザイナーが触れる「黒い画面」</h2>



<p>そもそもデザイナーが「黒い画面」に触れる事は数年前まではあまり考えられていませんでした。 黒い画面上の作業はあくまでもバックエンドエンジニアやプログラマーの領域であって、デザイナーが触れるのはPhotoshopやIllustratorといったグラフィカルなアプリケーションまでに留まっていたと思います。</p>



<p>ところがWebの技術が度重なる変化・進化を遂げ、JavaScriptやCSSをビルドするようになったり、Node.jsが台頭してきたりで、プロジェクトの「黒い画面」への依存度が一気に上がってきました。 マークアップエンジニアは勿論のこと、肩書がデザイナーの人間も「黒い画面」を触れるようになる必要が出てきたのです。</p>



<p>例えば、こんなケースであったり</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>人手不足でデザインに加えてマークアップもやる事になった。 CSSをビルドする為に「黒い画面」が必要だ。</p>
</blockquote>



<p>また例えば、こんなケースもあるでしょう。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>プロジェクトにデザイナーとしてジョインしたが、 マークアップエンジニアが作った画面をレビューする為に「黒い画面」でコマンドを叩かなければならない。</p>
</blockquote>



<h2 class="wp-block-heading">「黒い画面」ことターミナルとは</h2>



<p>まず「黒い画面」とは何なのか。その正体について軽く触れてみます。</p>



<p>Macにおける黒い画面である「ターミナル」は、GUI（グラフィカルインターフェース）によらず、 CUI（キャラクタユーザーインターフェース）、つまり文字列のコマンドでコンピュータを直接操作する為の物であると理解しておけば良いでしょう。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/t3M2x5B7re2YXricMJ3BMQHGJZrS2ytVZ52rM1iX0X5b4aaWmC1fSi7omPdMLpCbFzGBaEnCyLSjb2zFHeineH3x8Vw-liGb5enKgIdaDa1WeSh4BtohWwBAsWYo6Qd8zoLUtWAajg=w600-h400-no" alt=""/></figure>



<p></p>



<p>例えばMacでファイルを探し出すのにFinderを使用しますが、これはGUIによる機能ですね。 ターミナルでは、CUIで謎の呪文こと、コマンドを打ち込む事でそれとほぼおなじ事をすることが出来ます。 （勿論CUIなので見た目はただの文字列です） Finderをはじめとした、私達が普段パソコン上で使っているGUIアプリケーションは、ターミナルで行える処理を視覚的に見やすい形、そして操作しやすい形でラッピングされているのです。</p>



<p>ちなみに、MacOSXは元々Unix系のFreeBSD由来のOSで、 Unix系のコマンドの多くがそのまま使用できるのはその為です。 （Windowsについては後述しましょう）</p>



<h2 class="wp-block-heading">「黒い画面」の基本</h2>



<p>まずは黒い画面を立ち上げて触ってみましょう。 Mac環境ならば「アプリケーション」 &gt; 「ユーティリティ」 &gt; 「ターミナル」と辿っていけば立ち上がります。 あるいは Spotlight 検索で &#8220;term&#8221; あたりまで入力すれば出てくると思います。</p>



<p>ここまで「黒さ」を連呼していますが、Macでのデフォルトは白ベース黒文字の「白い画面」になっています。なんとなく、怖さが少し和らぎますね。</p>



<h3 class="wp-block-heading">コマンドを入力してみる</h3>



<p>黒い画面への入力については、キーボードで文字を入力するだけなので難しいことはないでしょう。 試しに一つコマンドを打ってみましょう。</p>


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

<p>[your user name]</p>



<p><code>whoami</code> コマンドは、現在ログインしているユーザーの名前を出力します。 貴方のユーザー名が表示されましたか？</p>



<h3 class="wp-block-heading">「何処」で「何」を対象に「何」するか</h3>



<p>コマンドを覚えていく前に、次の3つの事を意識するようにしてみましょう。</p>



<ol class="wp-block-list">
<li>現在どこのディレクトリにいるか</li>



<li>そこで何をするか</li>



<li>何を対象に行うか</li>
</ol>



<p>例えばこんなコマンドを打ったとします。</p>


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


<p>上の例では、現在いるディレクトリの中に <code>myfolder</code> という新しいディレクトリ（フォルダ）を作成しています。</p>



<p>もう少し詳しく見てみましょう。 コマンドはコンピューターへの命令であり、文法で言うところの述語です。 基本的に、コマンドは英語の文法に則っていて、述語であるコマンドの後には目的語を指定します。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/wasceiJfvA922YoSep9ps2wNuPvzLT9jvD7F6Az4gFN-V3ThCQNONIkLd99IdcRlAt4pska0jbltPNoszBd18bf8PS61tsd_hFM1mb5I8aFmynxm7FMAo25WHkZFAbE5M7axwyDb3Q=w600-h400-no" alt=""/></figure>



<p></p>



<p>この目的語は「引数（ひきすう）」と呼ばれ、上の例では <code>myfolder</code> が引数に値します。 つまり、 <code>myfolder</code> という名前で、ディレクトリを作る命令（ <code>mkdir</code> ）を行ったわけです。</p>



<p>また、命令によっては目的語を持たない（あるいは省略できる）場合もあります。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$ <span class="hljs-comment"># ユーザー名を出力するだけなので引数が必要ありません</span>
$ whoami
$ <span class="hljs-comment"># 引数を省略すると、ユーザーのホームディレクトリに移動します</span>
$ cd
</code></span></pre>


<p>さらにまた、目的語を二つとる命令もあります。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$ <span class="hljs-comment"># 目的語1（foo.txt）を、目的語2（bar.txt）として複製する</span>
$ cp foo.txt bar.txt
</code></span></pre>


<h3 class="wp-block-heading">ファイルやディレクトリを引数にする</h3>



<p>先程言ったように、コマンドには目的語である引数を渡す事が多いのですが、 その引数となるのはファイル名やディレクトリ名がほとんどです。</p>


<pre class="wp-block-code"><span><code class="hljs">$ rm ./needless.txt
</code></span></pre>


<p>上の例では、今いるディレクトリにある &#8220;needless.txt&#8221; という名前のファイルを削除しています。 ファイル名の前についている &#8220;./&#8221; は一体なんでしょうか？ これは「今いるディレクトリにあるファイル」という事を明示的に指定しています。</p>



<p>Unixのファイルシステムでは、ファイルの場所（パス）について次のような表現を用います。</p>



<ul class="wp-block-list">
<li>&#8220;.&#8221; &#8230; 現在のディレクトリ</li>



<li>&#8220;..&#8221; &#8230; 一つ上のディレクトリ</li>



<li>&#8220;/&#8221; &#8230; ディレクトリの境目</li>



<li>一番頭が &#8220;/&#8221; &#8230; ルートディレクトリからの絶対パス</li>
</ul>



<p>つまり上の例では、「現在いるディレクトリ下にあるneedless.txt」を指定しているわけです。</p>



<p>ここで「&#8221;./&#8221;は要らないのではないか」という疑問が浮かんだのではないでしょうか。 その通り、&#8221;./&#8221; は省略でき、次のように表現しても同じ処理を行います。</p>


<pre class="wp-block-code"><span><code class="hljs">$ rm needless.txt
</code></span></pre>


<p>省略できるのならば、なぜ例示でわざわざ &#8220;./&#8221; を付けたのかというと、その方が安心出来るからです。 <strong>ファイルを指定する時は、&#8221;./&#8221; や &#8220;../&#8221; からはじまる相対パスで表現する事をお勧めしたいです。</strong></p>



<p>特に、上で例に挙げている <code>rm</code> コマンドはファイルやディレクトリを削除してしまう<strong>破壊的</strong>なコマンドです。 必ず &#8220;./&#8221; ではじめる事を意識すれば、現在いるディレクトリを誤ったり、朦朧としながら作業をしていて操作ミスをしたりして、<strong>処理してはいけないファイルを処理してしまう</strong>危険性をわずかばかりではありますが、和らげる事ができます。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$ rm /the/path/to/target <span class="hljs-comment"># NG</span>
$ rm target <span class="hljs-comment"># NG</span>
$ rm ./target <span class="hljs-comment"># Good</span>
</code></span></pre>


<h3 class="wp-block-heading">「どのように」行うか（オプション）</h3>



<p>多くのコマンドは、「オプション」を渡すことで挙動をコントロールする事ができます。 ここでは <code>ls</code> コマンドを例に上げてみます。このコマンドは、ディレクトリ内にあるファイルをリスト表示してくれます。</p>


<pre class="wp-block-code"><span><code class="hljs">$ ls
bar.txt         directory       foo.html
</code></span></pre>


<p>何もオプションを渡さない場合、ただファイルの名前のみが羅列されます。 ファイル名だけだと情報が足りないので、<code>l</code> オプションを追加してみましょう。</p>


<pre class="wp-block-code"><span><code class="hljs">$ ls -l
total 16
-rw-r--r--@ 1 mach3  staff  212 12 12 16:03 bar.txt
drwxr-xr-x@ 2 mach3  staff   68 12 12 16:02 directory
-rw-r--r--@ 1 mach3  staff  248 12 12 16:03 foo.html
</code></span></pre>


<p>色々な情報が詰まったフォーマットで出力されました。 さらにドット（&#8221;.&#8221;）からはじまる隠しファイルも表示する為に、くわえて <code>a</code> オプションを指定してみます。</p>


<pre class="wp-block-code"><span><code class="hljs">$ ls -la
total 16
drwxr-xr-x@ 6 mach3  staff  204 12 12 16:19 .
drwxr-xr-x@ 8 mach3  staff  272 12 12 16:01 ..
-rw-r--r--@ 1 mach3  staff    0 12 12 16:19 .hidden
-rw-r--r--@ 1 mach3  staff  212 12 12 16:03 bar.txt
drwxr-xr-x@ 2 mach3  staff   68 12 12 16:02 directory
-rw-r--r--@ 1 mach3  staff  248 12 12 16:03 foo.html
</code></span></pre>


<p>またさらに、<code>t</code> オプションを追加して更新時間順にソートしてみましょう。 （デフォルトでは名前順です）</p>


<pre class="wp-block-code"><span><code class="hljs">$ ls -lat
total 16
drwxr-xr-x@ 6 mach3  staff  204 12 12 16:19 .
-rw-r--r--@ 1 mach3  staff    0 12 12 16:19 .hidden
-rw-r--r--@ 1 mach3  staff  248 12 12 16:03 foo.html
-rw-r--r--@ 1 mach3  staff  212 12 12 16:03 bar.txt
drwxr-xr-x@ 2 mach3  staff   68 12 12 16:02 directory
drwxr-xr-x@ 8 mach3  staff  272 12 12 16:01 ..
</code></span></pre>


<p>オプションを指定するルールがお分かりいただけたでしょうか。 オプションは主に1文字の英数字や短い言葉で指定し、 ダッシュ（&#8221;-&#8220;）の後ろに続けて打ち込む事で複数のオプションを合わせて利用する事ができます。 （このルールに則らないコマンドも存在するのでご注意ください）</p>



<p>各々のコマンドは、それぞれのオプションを持っています。 とても全てを覚えきれる物ではないので、その説明は次回に持ち越す事にします。</p>



<h2 class="wp-block-heading">「黒い画面」の怖い話</h2>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/txCfbYC-cAQIYd9z7Tw8xXo-vhALKquiYtaJeHsN9l7b8OPIB3SHrrD2XuDqjJmjYgy3ZZUpUSmkyvzvpYg8HGdZ_w1Vpxbg_4L6A7mkkUuKu5UiSby0hdadnT0GUAIeIseWpNLC7A=w600-h400-no" alt=""/></figure>



<p></p>



<p>「黒い画面は怖くない」と言いたいところですが、残念な事に「黒い画面」は怖いのです。</p>



<p>GUIのアプリケーションで警告が発せられるような処理でも、「黒い画面」は警告を発してくれません。 GUIのアプリケーションなら行わないような危険な処理も、「黒い画面」は実行してしまいます。 良く知らないままにコマンドを実行して、環境を壊してしまうなんていう悲劇も往々にしてあり得る事です。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>うまく動かないからネットで検索したコマンドコピペして実行したら、パソコンが起動しなくなった</p>
</blockquote>



<p>ジョークみたいな話ですが、実際に私の観測圏内で起こった出来事です。</p>



<p><strong>ネットで拾ったコマンドを調べずに実行しては絶対にいけません。</strong> コマンドがどのような処理を行う物なのか、渡している引数は何なのか、どのようなオプションで実行されているか、コピーしたコマンドはつまるところどういう命令なのか、 それらを調べて理解したうえで実行しましょう。 そして、インターネットは怖いところだという事を肝に銘じておきましょう。</p>



<h2 class="wp-block-heading">Windows環境における「黒い画面」</h2>



<p>Windowsにおける「黒い画面」は「コマンドプロンプト」と呼ばれる物ですが、これはおすすめできません。 WindowsはUnix由来でない為、Macで使えるような基本的なコマンドも使用できず、そもそもコマンド自体が非常に少なく、使い勝手がよくないのです。 「他と違う」という事は、つまり問題が起きた時に調べても解決策にたどり着きにくいという事です。</p>



<p>いくつか代替の手段があるので、そちらを使うようにした方が良いでしょう。</p>



<h3 class="wp-block-heading">1. Git Bash</h3>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/u9aXb_ZU7VmIGnpLgcfA-AIzV8TxNwTvuKGy6h6SXii5wSs8CXZc72179YudoHGVe7a9XufZU4lRZrYzzJClRlt6XlAKBjyOd1Mbqk9GClm2FWbKWeku4NnQqt7u-YF4qWtVwz1k_Q=w600-h400-no" alt=""/></figure>



<p></p>



<p>Windows環境で開発作業を行うのならば <a href="https://git-for-windows.github.io/">Git for windows</a> は恐らくインストールされているはずなので、 これにバンドルされている「Git Bash」を活用します。 インストールされてない場合は、インストールしましょう。Gitはもはや開発環境に無くてはならない存在です。</p>



<p>Git Bash は <strong>msys</strong> と呼ばれるエミュレータで動いており、いささかLinuxやMacとは使い勝手が違いますが、基本的なコマンドは使用する事ができます。 （msysは、昔なつかしのcygwinからのフォークです）</p>



<p>Git Bashのメリットは、Windowsにおける実行ファイル（.exe）が容易に呼び出せる点です。 ショートカット（.lnk）もちゃんと追随してくれるので、「好きな名前で好きなアプリを立ち上げる」なんていう設定も簡単にできます。（ここでは説明は割愛します）</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$ <span class="hljs-comment"># 現在いるディレクトリでエクスプローラーが立ち上がります</span>
$ explorer .
</code></span></pre>


<h3 class="wp-block-heading">2. Bash on Windows</h3>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/ci-gV4Us80WAwwRw3PgIrG7nK0D6OV69ubJazbRmKRIYKjMCTS2x3R63tBoXL3i0OOtlPw6_0Wi1ckRQcIp4mX0PX2DNq_mTF63fRawHeS30GHJvhJQVgbip5sS1AVBv-2TrwGdfKQ=w600-h400-no" alt=""/></figure>



<p></p>



<p>Windows10ならば、Windows上でUbuntuが動作します。 Windows Subsystem for Linux（WSL）と呼ばれる仕組みで、まさにLinuxがWindows上で動作していると思って良いでしょう。</p>



<p>中身はUbuntuなので、<code>apt</code> で楽々パッケージを追加インストールできるのが大きな魅力で、 参考になる情報もネットで収集しやすいです。</p>



<ul class="wp-block-list">
<li><a href="https://qiita.com/Aruneko/items/c79810b0b015bebf30bb">Bash on Ubuntu on Windowsをインストールしてみよう！ &#8211; Qiita</a></li>
</ul>



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



<ul class="wp-block-list">
<li>デザイナーも「黒い画面」が必要な時代になった</li>



<li>「黒い画面」の基本的な使い方を学ぶ</li>



<li>「黒い画面」は怖いので用法を守って正しく使う</li>



<li>インターネットの情報は鵜呑みにしてはいけない</li>



<li>Windowsでの「黒い画面」は Git Bash または Bash on Windows を活用しよう</li>
</ul>



<p>後編では最低限覚えておくと捗るコマンドと使い方を書くかもしれません。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>LESSTESTERのアップデートと最近得た知見の話</title>
		<link>https://blog.mach3.jp/2017/04/27/lesstester-update.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Thu, 27 Apr 2017 03:17:57 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[LESS]]></category>
		<category><![CDATA[LESSTESTER]]></category>
		<category><![CDATA[Vue.js]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=4366</guid>

					<description><![CDATA[数年ぶりに LESSTESTER をアップデートしました。 何故数年放置しておきながら今になってアップデートをしたかというと、 案件等で得た経験を試す実験場としてとてもお手頃だったからです。 アップデートのきっかけ LE [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>数年ぶりに <a href="https://lesstester.com">LESSTESTER</a> をアップデートしました。 何故数年放置しておきながら今になってアップデートをしたかというと、 案件等で得た経験を試す実験場としてとてもお手頃だったからです。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/-mC6ks_arBVTn88Y_pTh1StyTAXmDirNJbIZ21uxbj6k79vVxbwx3-oYrD1A4w41964fa9Ue1yo1_XHRgxfB8cc-1d9VLTRC23J2JNScPRsYB6F4uKYFsL0v_J_4srdvAXN7McTfHSme1cobaz4Li87CMrZXlSPt1P5pLh0tUpOpLNgeMbigdZGbrDHz5fq2K64CK5PWQ3FeyKBhJadLgX2youus6Vdjm6RqgXZUq6dSUJcrbBk5QFxM-No6zHW3p_8S4g8ftm80edb_yfh_Vad5Fq3e1qExDlqOkAJJ5_QzwHWFFAdGYrqZIWCgDetRf9pPVNjjaALC5xn3GR9UNyJfIByCeDA0Imtke_Lvcsur-qfraRuhs-CrJr1wDDA4cK3HcDZylqfQFblMbnFOOtArqo25e8aHoMvhVdJv9nPem5oEA3pVqOpxb0rA4DAjggbNHBUgVOPOlK44jLzd13p5Xjsz-ysdHB30oU3DBILK0LszFW_KKRG10ona3lIWtUxptsgEpLX9aQs4dQ9HLtzTb42Fi0gYphXgtPKBF4TWiX-X8PQhvfe1qVtJaCDTmbG4zo7bQlamKouwz35BuRjdHikkBmAMJQtZAe0y6p0hk7HkCR4L_c5n0Zeb-bediCQt55qffKgQFXSfbA_8gBqH65OJaJiil9f8e4tisA=w600-h315-no" alt="LESSTESTERのアップデートと最近得た知見の話"/></figure>



<p></p>



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



<h2 class="wp-block-heading">アップデートのきっかけ</h2>



<p>LESSTESTERを見直すきっかけになったのは、StackOverflowで<strong>「バージョンが古い。5年前のバージョン。（意訳）」</strong>と言及されていたのを見かけた事。 実際は、Less v1.7.0が出たのが2014年2月でLESSTESTERアップデートが翌3月なので3年しか経ってない事をここに釈明しておきます。 しかし、Lessのバージョンがv2.7.2まで上がっている間ずっと放置してしまったのは反省しないといけませんね。</p>



<p>cf) <a href="https://github.com/less/less.js">https://github.com/less/less.js</a></p>



<p>本当はLessユーザーも希少な様子なので閉めようかとも考えましたが、 せっかく公式にも取り上げてもらっていた事ですし、 案件で得られた経験値を試すついでにまるっと作り直してみようと思いました。</p>



<h2 class="wp-block-heading">そして出来たもの</h2>



<figure class="wp-block-image"><a href="https://lesstester.com"><img decoding="async" src="https://lh3.googleusercontent.com/KyESuArSXskHgoeL1ZheCP7miAXafDRhBgFgroddU41q8YUGRLbwebg7febLoEB60rDpttzHSJNGkXDOfMBlWqn97eA1ulmNDMFdt0bkKMJM-l8grIdVXOXlAARz39dHetqWYxiZTXGeKZCIXF1ppd-63L5L6Ds4A89HuRCtbyg_RpGYyQ6JLbEjCIOLr_12t0N1JCpITHwW-lGD5k_5USoA7ydFsG90JdODQNwqBlMw6m4_3GPZZA9MZYKPtUelDh7549bIMfzEQuMZOgdC9BMjdZdsYaPOYd7UoeTVLGxn46_ZxmlTnTwK3HRpJKvv8RWV_kTX2-gAACvbREV-eJuj2ULjhqrSjVIgKwZZpiGjkNTHLJdiuZQfiRAFmtW4NRFwho_jizrKpGDPfyFzMXnptipXgFIEwH8ajBRqAnsGoEQAte18G_Yep5y27hRie8aNax3AlH6xgrHu73d3q8i--UJ3mIrly_fxPn7mQeBl7aVToHeANKTCZtYh6wJxc8UmyaEjP8OfS7fSiKCQ4VkC_3O8KclubKOWJ9gxZoDcAtzhFIzYKWHleMIV7g3VUFEGi13qt7ZkF5rFO4ocDt-ucglKKxQOq6g2bcb9T9U07POhEfGozWfUk9w5h8-5NrXopyeSzrtxBBfhpjMpZgx2yCejBV4rf3gwH22Cdg=w600-h450-no" alt="LESSTESTER"/></a></figure>



<p></p>



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



<p>新しくついた機能 :</p>



<ul class="wp-block-list">
<li>ドラフトが端末に保存できるようになりました</li>



<li>Lessのバージョンを選択できるようになりました</li>



<li>キーマップに sublime が追加されました</li>



<li>リアルタイムコンパイル</li>
</ul>



<p>新しくつけようと思ったけどやめた機能 :</p>



<ul class="wp-block-list">
<li>URLでシェアする機能（理由 : コストのわりに使われ無さそう）</li>
</ul>



<p>活用した技術など :</p>



<ul class="wp-block-list">
<li>Vue.js &#8211; <a href="https://jp.vuejs.org/">https://jp.vuejs.org/</a></li>



<li>AWS S3の静的サイトホスティング</li>



<li>AWS Route53 + CloudFront でSSLに対応</li>



<li>（おまけ） さくらのメールボックス</li>
</ul>



<h2 class="wp-block-heading">感想</h2>



<p>ゼロから組み直したにしては、AWSとVue.jsが大変便利だったおかげで短時間で完成しました。</p>



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



<p>現在進行系で進んでいるプロジェクトで使っているのですが、 低い学習コストのわりに高機能かつ使い勝手が良く、規模問わず動的なWebアプリケーションを作るのに大変便利です。</p>



<h3 class="wp-block-heading">AWS S3</h3>



<p>言わずと知れたS3さんは便利すぎる。 もう全部これでいいんじゃないでしょうか。</p>



<h3 class="wp-block-heading">AWS Route53 + CloudFront</h3>



<p>SSL対応がこんなに簡単で安価になるとは、時代を感じます。 CloudFrontは高機能である反面、デプロイと変更の適用で結構待たされるので、いろいろな設定を試す段階ではちょっと辛い部分はありました。</p>



<p>また、今回は使っていませんが API Gateway / Lambda / RDS あたりは触る機会がどんどん増えていくのではないかなと思っています。</p>



<h3 class="wp-block-heading">さくらのメールボックス</h3>



<p>SSL対応の際にドメイン所有者の確認のためメールが送られるので、それを受け取る為に使いました。 年額1000円程度で複数ドメインを使用できるのでかなりリーズナブルです。 メールサーバの構築はなにかと面倒なので、ぜひ利用していきたい選択肢ですね。</p>



<p><a href="http://www.sakura.ne.jp/mail/">セキュリティ対策を強化したメールサーバー専用プラン【メールボックス】</a></p>



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



<p>お買い物もホビーも開発もAmazonに依存する時代の到来です。 それぞれのリソースについては時間があれば追って使い方などを記事にまとめておきたいところです。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>細かすぎて伝わらないjQuery拡張 (終) &#8211; Advent Calendar 2016</title>
		<link>https://blog.mach3.jp/2016/12/25/ac2016-25.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Sun, 25 Dec 2016 00:59:59 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Advent Calendar 2016]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=4332</guid>

					<description><![CDATA[今年のアドベントカレンダーは、23ほどのjQuery拡張関数を連日ご紹介してまいりました。 おさらい 毎度お世話になっているjQueryで、毎回書いてしまうちょこざいな関数をつらつらとしたためて来ました。 実際の中身はj [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image"><img decoding="async" src="https://goo.gl/ad8zjX" alt=""/></figure>



<p></p>



<p>今年のアドベントカレンダーは、23ほどのjQuery拡張関数を連日ご紹介してまいりました。</p>



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



<h2 class="wp-block-heading">おさらい</h2>



<p>毎度お世話になっているjQueryで、毎回書いてしまうちょこざいな関数をつらつらとしたためて来ました。 実際の中身はjQueryの機能への依存度はさほど高くない（？）ので、少しいじれば別にjQueryと一緒に使わなくても良い物もあったりします。 強いて言えば元々そんなにjQueryは好きではありませんが、結局使うことが多いので仕方ないですね。</p>



<h2 class="wp-block-heading">インデックス</h2>



<p>23個まとめてリストにしておきます。目次のようなもの。</p>



<dl>
<dt><strong><a href="/2016/12/02/ac2016-02.html">$.chainCase(str) :String</a></strong></dt>
<dd>キャメルケースの文字列をチェインケース・スネークケースに変換する<br />
jQuery依存度 : 無</dd>
<dt><strong><a href="/2016/12/03/ac2016-03.html">$.classify(obj) :Function</a></strong></dt>
<dd>クラスライクな関数を生成する<br />
jQuery依存度 : 中</dd>
<dt><strong><a href="/2016/12/04/ac2016-04.html">$.configify(obj) :Object</a></strong></dt>
<dd>オブジェクトに options を設定・変更する config() メソッドを実装する<br />
jQuery依存度 : 中</dd>
<dt><strong><a href="/2016/12/05/ac2016-05.html">$.dig(path, obj) :Any</a></strong></dt>
<dd>ドットシンタックスの文字列を渡すとそのオブジェクトを掘り起こして返す<br />
jQuery依存度 : 無</dd>
<dt><strong><a href="/2016/12/06/ac2016-06.html">$.escapeHTML(str) :String</a></strong></dt>
<dd>HTML文字列をエスケープする<br />
jQuery依存度 : 無</dd>
<dt><strong><a href="/2016/12/07/ac2016-07.html">$.eventify(obj) :Object</a></strong></dt>
<dd>オブジェクトにイベント管理のメソッド（on, off, trigger）を実装する<br />
jQuery依存度 : 低-中</dd>
<dt><strong><a href="/2016/12/08/ac2016-08.html">$.attributify(obj) :Object</a></strong></dt>
<dd>オブジェクトに属性管理のメソッド .attr() を実装する<br />
jQuery依存度 : 低</dd>
<dt><strong><a href="/2016/12/09/ac2016-09.html">$.format(template, str, str&#8230;) :String</a></strong></dt>
<dd>&#8220;%s%d&#8221; 形式のフォーマットに則って整形された文字列を返す<br />
jQuery依存度 : 無</dd>
<dt><strong><a href="/2016/12/10/ac2016-10.html">$.formatNumber(num) :String</a></strong></dt>
<dd>数値を三桁ずつカンマで区切った文字列で返す<br />
jQuery依存度 : 無</dd>
<dt><strong><a href="/2016/12/11/ac2016-11.html">$.observe(callback) :Deferred</a></strong></dt>
<dd>コールバック関数を渡してその返り値を監視する<br />
jQuery依存度 : 無</dd>
<dt><strong><a href="/2016/12/12/ac2016-12.html">$.parseQuery(str, asArray) :String</a></strong></dt>
<dd>URLのサーチ文字列（&#8221;?key=value&amp;key2=value2&#8243; ）をパースする<br />
jQuery依存度 : 低</dd>
<dt><strong><a href="/2016/12/13/ac2016-13.html">$.parseURL(str) :Object</a></strong></dt>
<dd>URL文字列をホスト名やサーチ文字列・ハッシュなどにパースする<br />
jQuery依存度 : 無</dd>
<dt><strong><a href="/2016/12/14/ac2016-14.html">$.random(start, end) :Any</a></strong></dt>
<dd>範囲の間からランダムな数値を取得したり、リストの中からランダムに値を取得する<br />
jQuery依存度 : 無</dd>
<dt><strong><a href="/2016/12/15/ac2016-15.html">$.rebase(obj, pattern) :Object</a></strong></dt>
<dd>オブジェクトに属しているメソッドをそのオブジェクトに bind する<br />
jQuery依存度 : 低</dd>
<dt><strong><a href="/2016/12/16/ac2016-16.html">$.render(template, data) :String|Function</a></strong></dt>
<dd>単機能のテンプレート関数<br />
jQuery依存度 : 低</dd>
<dt><strong><a href="/2016/12/17/ac2016-17.html">$.scrollTo(dest, offset, options, selector) :void</a></strong></dt>
<dd>ページあるいは要素の中身をアニメーションでスクロールする<br />
jQuery依存度 : 高</dd>
<dt><strong><a href="/2016/12/18/ac2016-18.html">$.fn.serializeObject() :Object</a></strong></dt>
<dd>フォーム要素をシリアライズして、オブジェクトで返す<br />
jQuery依存度 : 高</dd>
<dt><strong><a href="/2016/12/19/ac2016-19.html">$.fn.extract(asArray) :Object|Array</a></strong></dt>
<dd>非Form要素の内容をシリアライズする<br />
jQuery依存度 : 高</dd>
<dt><strong><a href="/2016/12/20/ac2016-20.html">$.series(callback, callback &#8230;) :Deferred</a></strong></dt>
<dd>連鎖的に直列処理を実行する<br />
jQuery依存度 : 高</dd>
<dt><strong><a href="/2016/12/21/ac2016-21.html">$.fn.submitAsync(props) :Deferred</a></strong></dt>
<dd>Form要素を非同期でsubmitする<br />
jQuery依存度 : 高</dd>
<dt><strong><a href="/2016/12/22/ac2016-22.html">$.times(count, callback) :void</a></strong></dt>
<dd>n回処理を繰り返す<br />
jQuery依存度 : 無</dd>
<dt><strong><a href="/2016/12/23/ac2016-23.html">$.timing.*</a></strong></dt>
<dd>User Timing API のラッパー<br />
jQuery依存度 : 無</dd>
<dt><strong><a href="/2016/12/24/ac2016-24.html">$.fn.transition(props, options) :jQueryObject</a></strong></dt>
<dd>$.fn.animate() のようにCSS Transitionを実現する<br />
jQuery依存度 : 高</dd>
</dl>



<h2 class="wp-block-heading">リポジトリ</h2>



<p>全て纏めた物をGithubのリポジトリにしてあります。ご自由にどうぞ。</p>



<p><a href="https://github.com/mach3/jquery-tiny-extentions">jquery-tiny-extentions @ GitHub</a></p>



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



<p>それでは皆様、良い年末をお過ごしください。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>細かすぎて伝わらないjQuery拡張 (24) &#034;$.fn.transition&#034; &#8211; Advent Calendar 2016</title>
		<link>https://blog.mach3.jp/2016/12/24/ac2016-24.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Sat, 24 Dec 2016 00:30:23 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Advent Calendar 2016]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=4318</guid>

					<description><![CDATA[$.fn.transition は、$.fn.animate の様にCSS Transitionを実現する関数です。 $.fn.transition(props, options) CSS Transition によるア [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image"><img decoding="async" src="https://goo.gl/ad8zjX" alt=""/></figure>



<p></p>



<p><strong>$.fn.transition</strong> は、<a href="http://api.jquery.com/animate/">$.fn.animate</a> の様にCSS Transitionを実現する関数です。</p>



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



<h2 class="wp-block-heading">$.fn.transition(props, options)</h2>



<p>CSS Transition によるアニメーションはJavaScriptによるアニメーションに比べてパフォーマンスが非常によく、綺麗です。 しかし一方で、非対応環境の為に .animate() を使わなければならない事が多いので、 両者で動作するように対応できる関数をしたためてみました。</p>



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


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-comment">// 要素を left: 100 に移動</span>
$(<span class="hljs-string">".item"</span>).transition({
    <span class="hljs-attr">left</span>: <span class="hljs-number">100</span>
}, {
    <span class="hljs-attr">duration</span>: <span class="hljs-number">300</span>, <span class="hljs-comment">// 所要時間 300ms</span>
    <span class="hljs-attr">delay</span>: <span class="hljs-number">100</span>, <span class="hljs-comment">// アニメーション開始までのディレイ 100ms</span>
    <span class="hljs-attr">easing</span>: <span class="hljs-string">"linear"</span> <span class="hljs-comment">// イージング関数の指定</span>
});
</code></span></pre>


<p>基本的な使い方は <strong>.animate()</strong> と概ね同じです。</p>



<ul class="wp-block-list">
<li>第一引数 : アニメーションするスタイル</li>



<li>第二引数 : オプション</li>
</ul>



<p>CSS Transition に対応していないレガシーな環境では $.fn.animate で代替しています。 イージング関数名として渡せるのは jQuery.easing の名前ではなく、 CSS Transition で定義されている名前です。（ease | linear | ease-in | ease-out | ease-in-out）</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-comment">// 要素をアニメーション後、削除</span>
$(<span class="hljs-string">".item"</span>).transition({
    <span class="hljs-attr">opacity</span>: <span class="hljs-number">0</span>,
    <span class="hljs-attr">right</span>: <span class="hljs-number">500</span>
}, {
    <span class="hljs-attr">done</span>: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        $(<span class="hljs-keyword">this</span>).remove();
    }
});
</code></span></pre>


<p><strong>.animate()</strong> 同様に、オプションで done を渡して完了時の処理を実装できます。 <strong>.animate()</strong> にあるその他多数のオプションは使えません。</p>



<p>また、stop() とかはできません。とまりません。</p>



<h2 class="wp-block-heading">コード</h2>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$.extend($.support, {
    <span class="hljs-attr">cssTransition</span>: (<span class="hljs-string">"transition"</span> <span class="hljs-keyword">in</span> <span class="hljs-built_in">document</span>.createElement(<span class="hljs-string">"i"</span>).style)
});

$.transition = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">props, options</span>)</span>{
    <span class="hljs-keyword">var</span> o, transition = &#91;];

    o = $.extend({
        <span class="hljs-attr">duration</span>: <span class="hljs-number">400</span>,
        <span class="hljs-attr">delay</span>: <span class="hljs-number">0</span>,
        <span class="hljs-attr">easing</span>: <span class="hljs-string">"ease"</span>,
        <span class="hljs-attr">done</span>: $.noop
    }, options);

    <span class="hljs-keyword">if</span>(! $.support.cssTransition){
        <span class="hljs-keyword">switch</span>(o.easing){
            <span class="hljs-keyword">case</span> <span class="hljs-string">"ease"</span>: o.easing = <span class="hljs-string">"swing"</span>;
            <span class="hljs-keyword">case</span> <span class="hljs-string">"ease-in"</span>: o.easing = <span class="hljs-string">"easeInSine"</span>;
            <span class="hljs-keyword">case</span> <span class="hljs-string">"ease-out"</span>: o.easing = <span class="hljs-string">"easeOutSine"</span>;
            <span class="hljs-keyword">case</span> <span class="hljs-string">"ease-in-out"</span>: o.easing = <span class="hljs-string">"easeInOutSine"</span>;
            <span class="hljs-keyword">default</span>: <span class="hljs-keyword">break</span>;
        }
        o.easing = (o.easing <span class="hljs-keyword">in</span> $.easing) ? o.easing : <span class="hljs-string">"swing"</span>;

        <span class="hljs-keyword">this</span>.stop().delay(o.delay).animate(props, {
            <span class="hljs-attr">duration</span>: o.duration,
            <span class="hljs-attr">easing</span>: o.easing,
            <span class="hljs-attr">done</span>: o.done
        });

        <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>;
    }

    $.each(props, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">key, value</span>)</span>{
        transition.push(
            &#91;
                key,
                o.duration + <span class="hljs-string">"ms"</span>,
                o.easing,
                o.delay + <span class="hljs-string">"ms"</span>
            ].join(<span class="hljs-string">" "</span>)
        );
    });
    transition = transition.join(<span class="hljs-string">","</span>);

    <span class="hljs-keyword">this</span>.each(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-keyword">var</span> el = $(<span class="hljs-keyword">this</span>),
            done = (<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>)</span>{
                o.done.call(<span class="hljs-keyword">this</span>, e);
                $(<span class="hljs-keyword">this</span>).css(<span class="hljs-string">"transition"</span>, <span class="hljs-string">""</span>).off(<span class="hljs-string">"transitionend"</span>, done);
            }).bind(<span class="hljs-keyword">this</span>);

        el.css(<span class="hljs-string">"transition"</span>, transition)
        .on(<span class="hljs-string">"transitionend"</span>, done)
        .css(props);

        setTimeout(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
            el.trigger(<span class="hljs-string">"transitionend"</span>);
        }, o.duration + <span class="hljs-number">33</span>);
    });

    <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>;
};
</code></span></pre>


<p>ベンダープレフィックス無しの &#8220;transition&#8221; を持たない環境は、使えない物とみなしています。 （面倒だったのもありますが、必要性もあまり感じなかった為）</p>



<p>非対応環境ではイージング関数を jQuery.easing の名前に書き換えています。 といっても、デフォルトで実装されているのは &#8220;swing&#8221; と &#8220;linear&#8221; だけなので、 <a href="http://gsgd.co.uk/sandbox/jquery/easing/">jQuery.easing プラグイン</a> も含めて、近しい物を割り当てています。 こちらも一緒に使う事で表現は豊かになりますが、なければないで、そこらへんが全部 &#8220;swing&#8221; になるだけです。</p>



<p>完了時の処理に &#8220;transitionend&#8221; を利用していますが、 これは実際に値が変わってトランジションが発生していないと発火しない代物なので、 時間経過と共に無理やり発火させています。 「アニメーションしないアニメーション」の完了時に何かしたい事なんてないだろうと思いますが、念のため。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>細かすぎて伝わらないjQuery拡張 (23) &#034;$.timing&#034; &#8211; Advent Calendar 2016</title>
		<link>https://blog.mach3.jp/2016/12/23/ac2016-23.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Fri, 23 Dec 2016 00:26:08 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Advent Calendar 2016]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=4314</guid>

					<description><![CDATA[$.timing は、User Timing API のラッパーです。 わずかな機能だけですが、非対応環境に擬似的に対応してみました。 User Timing API とは User Timing APIは、Webページ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image"><img decoding="async" src="https://goo.gl/ad8zjX" alt=""/></figure>



<p></p>



<p><strong>$.timing</strong> は、<a href="https://www.w3.org/TR/user-timing/">User Timing API</a> のラッパーです。 わずかな機能だけですが、非対応環境に擬似的に対応してみました。</p>



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



<h2 class="wp-block-heading">User Timing API とは</h2>



<p>User Timing APIは、Webページ上のパフォーマンスを計測するためのインターフェースです。 その役割と使い方は下記URLのエントリーで解説されています。</p>



<ul class="wp-block-list">
<li><a href="https://www.html5rocks.com/ja/tutorials/webperformance/usertiming/">User Timing API: あなたの Web アプリをもっと理解するために &#8211; HTML5 Rocks</a></li>
</ul>



<p>ものすごくざっくりと使い方を紹介すると、こんな感じ。</p>



<ul class="wp-block-list">
<li>mark() を使って任意のタイミングでタイムスタンプを「マーク」として記録</li>



<li>measure() を使って、記録したマーク間の所要時間を計測</li>



<li>タイムスタンプは1/1000ミリ秒という高精度で記録される</li>
</ul>



<p>執筆時点でのメジャーどころの対応状況は IE10+ / Edge / Firefox / Chrome / Opera 40+ となっていて、 IE9以前やSafari（iOS含）は非対応です。</p>



<h2 class="wp-block-heading">$.timing</h2>



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


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-comment">// マークを記録</span>
$.timing.mark(<span class="hljs-string">"foo"</span>);
$.timing.mark(<span class="hljs-string">"bar"</span>);

<span class="hljs-comment">// マーク間の所要時間を記録</span>
$.timing.measure(<span class="hljs-string">"from_foo_to_bar"</span>, <span class="hljs-string">"foo"</span>, <span class="hljs-string">"bar"</span>);

<span class="hljs-comment">// 名前からタイムスタンプを取得</span>
$.timing.get(<span class="hljs-string">"from_foo_to_bar"</span>); <span class="hljs-comment">// =&gt; number</span>

<span class="hljs-comment">// 記録したマークを全て取得</span>
$.timing.marks(); <span class="hljs-comment">// =&gt; object</span>

<span class="hljs-comment">// 記録したメジャーを全て取得</span>
$.timing.measures(); <span class="hljs-comment">// =&gt; object</span>
</code></span></pre>


<ul class="wp-block-list">
<li>.mark(name) でそのタイミングのタイムスタンプを記録します</li>



<li>.measure(name, start, end) で、開始マークから終了マークまでの所要時間を記録します</li>



<li>.get(name) で名前からマーク・メジャーの時間を数値で取得します</li>



<li>.marks() / .measures() で記録したマーク・メジャーを全てオブジェクトで取得</li>
</ul>



<h2 class="wp-block-heading">Polyfill とは呼べないモノ</h2>



<p>$.timing はほんの一部の機能しか実装していません。 また、擬似的に再現してみたとはいえ1/1000ミリ秒単位で計測はちょっと出来無さそうで、 Polyfillと呼ぶにはあまりに片手落ちですね。</p>



<p><a href="https://github.com/zloirock/core-js">core-js</a> あたりでPolyfillを書いているかも？と思いましたが、 中の人が<a href="https://github.com/zloirock/core-js/issues/130">「無理デス」</a> とおっしゃっています。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Thanks for proposal, but it can&#8217;t be polyfilled &#8211; only little part and with serious limitations.<br />
  <a href="https://github.com/zloirock/core-js/issues/130">https://github.com/zloirock/core-js/issues/130</a></p>
</blockquote>



<h2 class="wp-block-heading">コード</h2>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$.timing = {
    <span class="hljs-attr">_supported</span>: (<span class="hljs-string">"performance"</span> <span class="hljs-keyword">in</span> <span class="hljs-built_in">window</span>) &amp;&amp; (<span class="hljs-string">"timing"</span> <span class="hljs-keyword">in</span> <span class="hljs-built_in">window</span>.performance),
    <span class="hljs-attr">_data</span>: {},
    <span class="hljs-attr">_start</span>: (<span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>()).getTime(),

    <span class="hljs-attr">mark</span>: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">name</span>)</span>{
        <span class="hljs-keyword">if</span>(<span class="hljs-keyword">this</span>._supported){
            <span class="hljs-built_in">window</span>.performance.mark(name);
        } <span class="hljs-keyword">else</span> {
            <span class="hljs-keyword">this</span>._data&#91;name] = {
                <span class="hljs-attr">type</span>: <span class="hljs-string">"mark"</span>,
                <span class="hljs-attr">startTime</span>: (<span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>()).getTime() - <span class="hljs-keyword">this</span>._start
            };
        }
    },

    <span class="hljs-attr">marks</span>: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.getEntries(<span class="hljs-string">"mark"</span>, <span class="hljs-string">"startTime"</span>);
    },

    <span class="hljs-attr">measure</span>: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">name, start, end</span>)</span>{
        <span class="hljs-keyword">if</span>(<span class="hljs-keyword">this</span>._supported){
            <span class="hljs-built_in">window</span>.performance.measure(name, start, end);
        } <span class="hljs-keyword">else</span> {
            <span class="hljs-keyword">this</span>._data&#91;name] = {
                <span class="hljs-attr">type</span>: <span class="hljs-string">"measure"</span>,
                <span class="hljs-attr">duration</span>: <span class="hljs-keyword">this</span>.get(end) - <span class="hljs-keyword">this</span>.get(start)
            };
        }
    },

    <span class="hljs-attr">measures</span>: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.getEntries(<span class="hljs-string">"measure"</span>, <span class="hljs-string">"duration"</span>);
    },

    <span class="hljs-attr">get</span>: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">name</span>)</span>{
        <span class="hljs-keyword">if</span>(<span class="hljs-keyword">this</span>._supported){
            <span class="hljs-keyword">var</span> items = <span class="hljs-built_in">window</span>.performance.getEntriesByName(name);
            <span class="hljs-keyword">return</span> items.length ? items&#91;<span class="hljs-number">0</span>].startTime : <span class="hljs-keyword">void</span> <span class="hljs-number">0</span>;
        }
        <span class="hljs-keyword">return</span> (name <span class="hljs-keyword">in</span> <span class="hljs-keyword">this</span>._data) ? <span class="hljs-keyword">this</span>._data&#91;name].startTime : <span class="hljs-keyword">void</span> <span class="hljs-number">0</span>;
    },

    <span class="hljs-attr">getEntries</span>: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">type, key</span>)</span>{
        <span class="hljs-keyword">var</span> data = {};
        <span class="hljs-keyword">if</span>(<span class="hljs-keyword">this</span>._supported){
            <span class="hljs-built_in">window</span>.performance.getEntriesByType(type)
            .forEach(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">item</span>)</span>{
                data&#91;item.name] = item&#91;key];
            });
        } <span class="hljs-keyword">else</span> {
            $.each(<span class="hljs-keyword">this</span>._data, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">name, item</span>)</span>{
                <span class="hljs-keyword">if</span>(item.type === type){
                    data&#91;name] = item&#91;key];
                }
            });
        }
        <span class="hljs-keyword">return</span> data;
    }
};
</code></span></pre>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>細かすぎて伝わらないjQuery拡張 (22) &#034;$.times&#034; &#8211; Advent Calendar 2016</title>
		<link>https://blog.mach3.jp/2016/12/22/ac2016-22.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Thu, 22 Dec 2016 00:24:58 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Advent Calendar 2016]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=4310</guid>

					<description><![CDATA[$.times() は、n回処理を繰り返してくれる関数です。 $.times(count, callback) 使い方 第一引数に繰り返したい回数を整数で、 第二引数に実行したい関数を渡します。 関数には0からはじまるイ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image"><img decoding="async" src="https://goo.gl/ad8zjX" alt=""/></figure>



<p></p>



<p><strong>$.times()</strong> は、n回処理を繰り返してくれる関数です。</p>



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



<h2 class="wp-block-heading">$.times(count, callback)</h2>



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


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> str = <span class="hljs-string">""</span>;

$.times(<span class="hljs-number">10</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">index</span>)</span>{
    str += index;
});

<span class="hljs-built_in">console</span>.log(str); <span class="hljs-comment">// =&gt; "0123456789"</span>
</code></span></pre>


<p>第一引数に繰り返したい回数を整数で、 第二引数に実行したい関数を渡します。 関数には0からはじまるインデックスが渡されます。</p>



<h2 class="wp-block-heading">コード</h2>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$.times = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">count, callback</span>)</span>{
    <span class="hljs-keyword">var</span> i = count;
    <span class="hljs-keyword">while</span>(i--){
        callback(count - i - <span class="hljs-number">1</span>);
    }
};
</code></span></pre>


<p>正直細かすぎたかなって思ってます。</p>



<p>実際にプロダクトのコードに使われる事はあまりなく、デモデータの生成やテスト等で使ったりはします。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>細かすぎて伝わらないjQuery拡張 (21) &#034;$.fn.submitAsync&#034; &#8211; Advent Calendar 2016</title>
		<link>https://blog.mach3.jp/2016/12/21/ac2016-21.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Wed, 21 Dec 2016 00:18:24 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Advent Calendar 2016]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=4302</guid>

					<description><![CDATA[$.fn.submitAsync() は、form要素を非同期でsubmitするための関数です。 $.fn.submitAsync(options) 使い方 返り値は $.ajax() なので、then/done 等で結 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image"><img decoding="async" src="https://goo.gl/ad8zjX" alt=""/></figure>



<p></p>



<p><strong>$.fn.submitAsync()</strong> は、form要素を非同期でsubmitするための関数です。</p>



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



<h2 class="wp-block-heading">$.fn.submitAsync(options)</h2>



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


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">form</span> <span class="hljs-attr">action</span>=<span class="hljs-string">"/"</span> <span class="hljs-attr">method</span>=<span class="hljs-string">"post"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"demo-form"</span>&gt;</span> ... <span class="hljs-tag">&lt;/<span class="hljs-name">form</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">script</span>&gt;</span><span class="javascript">

$(<span class="hljs-string">"#demo-form"</span>).submitAsync()
.then(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
    <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"--送信完了--"</span>);
});

</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
</code></span></pre>


<p>返り値は $.ajax() なので、then/done 等で結果を受け取ることができます。 引数には $.ajax() のオプションを渡すことができます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$(<span class="hljs-string">"#demo-form"</span>).submitAsync({
    <span class="hljs-attr">url</span>: <span class="hljs-string">"/api/foo"</span>,
    <span class="hljs-attr">dataType</span>: <span class="hljs-string">"jsonp"</span>
})
.then(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{ ... });
</code></span></pre>


<p>送信先のURLは通常 action 属性が使用されますが、引数のオプションで上書きする事もできます。 リクエストメソッド（&#8221;type&#8221;）も同様。</p>



<h2 class="wp-block-heading">コード</h2>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$.fn.submitAsync = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">options</span>)</span>{
    <span class="hljs-keyword">var</span> props = $.extend({
        <span class="hljs-attr">url</span>: <span class="hljs-keyword">this</span>.prop(<span class="hljs-string">"action"</span>),
        <span class="hljs-attr">type</span>: <span class="hljs-keyword">this</span>.prop(<span class="hljs-string">"method"</span>),
        <span class="hljs-attr">data</span>: <span class="hljs-keyword">this</span>.serializeObject()
    }, options);
    <span class="hljs-keyword">return</span> $.ajax(props);
};
</code></span></pre>


<p>Form の属性を読んで $.ajax() するだけの簡単なお仕事ですね。なくてもまったく困りません。 尚、内部で先に紹介した <a href="2016/12/18/ac2016-18.html">$.fn.serializeObject()</a> を使用しています。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>細かすぎて伝わらないjQuery拡張 (20) &#034;$.series&#034; &#8211; Advent Calendar 2016</title>
		<link>https://blog.mach3.jp/2016/12/20/ac2016-20.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Tue, 20 Dec 2016 00:14:47 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Advent Calendar 2016]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=4298</guid>

					<description><![CDATA[$.series() は、連鎖的に直列処理を実行していく関数です。 $.series(callback, callback, &#8230;) 使い方 渡した関数が返す値によって、次の処理までの挙動が変わります。 $.s [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image"><img decoding="async" src="https://goo.gl/ad8zjX" alt=""/></figure>



<p></p>



<p><strong>$.series()</strong> は、連鎖的に直列処理を実行していく関数です。</p>



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



<h2 class="wp-block-heading">$.series(callback, callback, &#8230;)</h2>



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


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-comment">// 引数で渡した関数を順番に呼んでいきます</span>
$.series(
    <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"Process: 1"</span>);
        <span class="hljs-comment">// 数値（ミリ秒）を返すとその時間分次の処理を遅延させます</span>
        <span class="hljs-keyword">return</span> <span class="hljs-number">1000</span>;
    },
    <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"Process: 2"</span>);
        <span class="hljs-comment">// 何も返さない（undefined）場合は `return 1;` と同じ</span>
    },
    <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-comment">// Deferredオブジェクトを返すと処理完了時に次の処理に移行します</span>
        <span class="hljs-keyword">return</span> $.ajax({<span class="hljs-attr">url</span>: <span class="hljs-string">"/api"</span>}).done(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
            <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"Process: 3"</span>);
        });
    },
    <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-comment">// false を返すとそこで処理を中断して reject します</span>
        <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
    }
)
.then(
    <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"--処理完了--"</span>);
    },
    <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"--途中で処理が中断されました--"</span>);
    }
);
</code></span></pre>


<p>渡した関数が返す値によって、次の処理までの挙動が変わります。</p>



<ul class="wp-block-list">
<li>数値 : 数値（ミリ秒）待機してから次の処理へ</li>



<li>Deferred : resolveされてから次の処理へ</li>



<li>false : 一連の処理を中断してrejectする</li>



<li>undefined : 何も返さない場合は 1 を返した場合と同じ</li>
</ul>



<p><strong>$.series()</strong> は Deferred を返すので、完了・失敗を <strong>then()</strong> 等で受け取る事ができます。</p>



<h2 class="wp-block-heading">コード</h2>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$.series = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
    <span class="hljs-keyword">var</span> df = $.Deferred(),
        args = <span class="hljs-built_in">arguments</span>,
        i = <span class="hljs-number">-1</span>,
        timer = <span class="hljs-literal">null</span>,
        run;

    run = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-keyword">var</span> r;

        clearTimeout(timer);
        i += <span class="hljs-number">1</span>;
        <span class="hljs-keyword">if</span>(i &gt;= args.length){
            <span class="hljs-keyword">return</span> df.resolve();
        }
        r = args&#91;i]();
        <span class="hljs-keyword">if</span>(<span class="hljs-literal">false</span> === r){
            df.reject();
        }
        r = (r === <span class="hljs-keyword">void</span> <span class="hljs-number">0</span>) ? <span class="hljs-number">1</span> : r;
        <span class="hljs-keyword">switch</span>($.type(r)){
            <span class="hljs-keyword">case</span> <span class="hljs-string">"number"</span>: timer = setTimeout(run, r); <span class="hljs-keyword">break</span>;
            <span class="hljs-keyword">case</span> <span class="hljs-string">"object"</span>:
                <span class="hljs-keyword">if</span>($.isFunction(r.then)){
                    r.then(run ,<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
                        df.reject();
                    });
                }
                <span class="hljs-keyword">break</span>;
            <span class="hljs-keyword">default</span>: <span class="hljs-keyword">break</span>;
        }
    }

    run();

    <span class="hljs-keyword">return</span> df;
};
</code></span></pre>


<p>Cに必要なAとBをやって、Dに必要なCをやってからDやって…というような感じに連鎖的に直列処理したい時や、 タイムラインで組んだアニメーション等が作れそうですね。</p>



<p>普通に <strong>Deferred</strong> 等で繋いでいっても良いんですが、コードが見づらくなってしまうので、 気持ちよく書きたいがためにうまれた関数です。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
