<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>diwao日記</title>
    <link>http://diwao.com/index.xml</link>
    <description>Recent content on diwao日記</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>ja</language>
    <lastBuildDate>Sun, 25 Jun 2017 16:26:03 +0900</lastBuildDate>
    <atom:link href="http://diwao.com/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>JavaScriptのオブジェクト（連想配列）をjsonファイルとしてダウンロードする</title>
      <link>http://diwao.com/2017/06/js-object-file-download.html</link>
      <pubDate>Sun, 25 Jun 2017 16:26:03 +0900</pubDate>
      
      <guid>http://diwao.com/2017/06/js-object-file-download.html</guid>
      <description>

&lt;p&gt;&lt;img src=&#34;http://diwao.com/image/post/dev/engineer_cat.jpg&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;p&gt;JavaScriptだけでファイルのダウンロードなんてできっこない、そういうのはバックエンドの領分でしょ。そう思っていた時期が私にもありました。しかし先日、実はできるということがわかったので、今回はJavaScriptだけでjsonファイルをダウンロードするのに挑戦したいと思います。&lt;/p&gt;

&lt;p&gt;応用すれば複数のapiからデータを取得して、jsで合体させてから1ファイルとしてダウンロードなんてこともできてしまう！　夢が広がりますね。&lt;/p&gt;

&lt;h2 id=&#34;blobオブジェクトを作る&#34;&gt;Blobオブジェクトを作る&lt;/h2&gt;

&lt;p&gt;早速ですが、ダウンロードファイルを作るためにはBlobオブジェクトというものを使います。オブジェクトの作り方は次の通り。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;const blob = new Blob(blobParts[, options]);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href=&#34;https://developer.mozilla.org/ja/docs/Web/API/Blob/Blob&#34;&gt;MDNのドキュメント&lt;/a&gt;によると、blobPartsの方にファイル化したいデータを渡し、optionsでファイル形式を指定するみたいですね。今回はオブジェクト形式のデータをjsonファイルとしてダウンロードしたいので、コードはこんな感じ↓になります。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;const data = {
  name: &#39;diwao&#39;,
  url: &#39;http://diwao.com&#39;
};

const blob = new Blob([JSON.stringify(data, null, &#39;  &#39;)], {type: &#39;application\/json&#39;});
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;上のコードの&lt;code&gt;blob&lt;/code&gt;をconsole.logで見てみるとこうなってました。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Blob {size: 50, type: &amp;quot;application/json&amp;quot;}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ちゃんとオブジェクトは作れたみたいですね。&lt;/p&gt;

&lt;h2 id=&#34;ダウンロード用のurlを作る&#34;&gt;ダウンロード用のURLを作る&lt;/h2&gt;

&lt;p&gt;さて、続いてはURL.createObjectURLメソッドを使って、ファイルをダウンロードするときに必要となるURLの生成をやっていきましょう。&lt;/p&gt;

&lt;p&gt;URL.createObjectURLメソッドは、FileオブジェクトかBlobオブジェクトを引数として受け取り、受け取ったオブジェクトを表すURLを生成します。コードにするとこうですね。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;const url = URL.createObjectURL(blob);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;あとはここで作ったurlをa要素に設定し、download属性を利用すればダウンロードできるようになります。&lt;/p&gt;

&lt;h2 id=&#34;デモ&#34;&gt;デモ&lt;/h2&gt;

&lt;p&gt;実際にファイルダウンロードを実行できるデモを作ってみました。input要素に入力した内容をjsonファイルとしてダウンロードできる、というものです。&lt;/p&gt;

&lt;p&gt;&lt;p data-height=&#34;365&#34; data-theme-id=&#34;0&#34; data-slug-hash=&#34;QgqNZE&#34; data-default-tab=&#34;result&#34; data-user=&#34;diwao&#34; data-embed-version=&#34;2&#34; data-pen-title=&#34;file download sample&#34; class=&#34;codepen&#34;&gt;See the Pen &lt;a href=&#34;https://codepen.io/diwao/pen/QgqNZE/&#34;&gt;file download sample&lt;/a&gt; by diwao (&lt;a href=&#34;https://codepen.io/diwao&#34;&gt;@diwao&lt;/a&gt;) on &lt;a href=&#34;https://codepen.io&#34;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;
&lt;script async src=&#34;https://production-assets.codepen.io/assets/embed/ei.js&#34;&gt;&lt;/script&gt;&lt;/p&gt;

&lt;p&gt;MacのChrome(59)、Safari(10.1.1)で動作確認済み。FireFoxは動きませんでした。MDNのドキュメントにも、BlobはJavaScriptネイティブなフォーマットではない、URL.createObjectURLは実験段階の機能であるなどの記述があったので、まだ実際の案件で使うのは難しいかもですね。試してないけどIEは動かなさそう……。&lt;/p&gt;

&lt;p&gt;とはいえ、利用ブラウザが限定された管理画面などでは使いどころあると思うので、こういうこともできるというのは覚えておいて損はないかと。&lt;/p&gt;

&lt;h2 id=&#34;参考&#34;&gt;参考&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/ja/docs/Web/API/Blob&#34;&gt;Blob - Web API インターフェイス | MDN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/ja/docs/Web/API/URL/createObjectURL&#34;&gt;window.URL.createObjectURL - Web API インターフェイス | MDN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://app.codegrid.net/entry/file-api-filereader-api&#34;&gt;File API入門 - File APIとFileReader APIの利用 | CodeGrid&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>息子氏「タミヤロボットスクール先行テスト体験会vol.1」でロボットプログラミングを楽しむの巻</title>
      <link>http://diwao.com/2017/06/robot-programming-sendai.html</link>
      <pubDate>Fri, 23 Jun 2017 10:43:23 +0900</pubDate>
      
      <guid>http://diwao.com/2017/06/robot-programming-sendai.html</guid>
      <description>

&lt;p&gt;&lt;img src=&#34;http://diwao.com/image/post/2017/06/robot-programming-sendai_01.jpg&#34; alt=&#34;スタッフさん手作りのロボット&#34; /&gt;&lt;/p&gt;

&lt;p&gt;子供向けのプログラミング勉強会「タミヤロボットスクール先行テスト体験会」に息子と一緒に参加してきました。参加したといっても主役は子供なので親の私は見てるだけ。&lt;/p&gt;

&lt;p&gt;キャタピラのついたラジコンみたいなロボットをプログラミングで動かすっていう、キッズならワクワクすること間違いなしのやつ。案の定、息子めちゃ楽しんでました。イベントのダイジェスト動画（20秒くらい）作ってみたのでよかったらどうぞ。&lt;/p&gt;

&lt;div class=&#34;video&#34; style=&#34;position: relative; padding-top: 56.25%;&#34;&gt;
  &lt;iframe style=&#34;position:absolute; top: 0; left: 0; width: 100%; height: 100%;&#34; src=&#34;https://www.youtube.com/embed/TnUVYMGy_Nc?rel=0&amp;amp;controls=0&#34; frameborder=&#34;0&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;h2 id=&#34;マジカルコンパス主催&#34;&gt;マジカルコンパス主催&lt;/h2&gt;

&lt;p&gt;今回のイベントは、一般社団法人マジカルコンパスが主催したもの。マジカルコンパスは子供向けにプログラミング学習の普及活動を行っている団体です。長町（仙台市）にイベントスペースがあり、そこでScratchやIchigoJamなど、いろいろなツールを使ったプログラミングのワークショップなどを開催しているとのこと。&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;http://magicalcompath.org/&#34;&gt;一般社団法人マジカルコンパス ― Magical ComPath&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;http://diwao.com/2017/05/pcn_sendai_ichigojam.html&#34;&gt;この間参加したIchigoJamのワークショップ&lt;/a&gt;も同じ場所での開催でして、その時に世話になったPCN仙台の方が今回もスタッフをしていたのでサポートも万全でした。感謝。&lt;/p&gt;

&lt;h2 id=&#34;イベント概要&#34;&gt;イベント概要&lt;/h2&gt;

&lt;h3 id=&#34;ロボットとは何か&#34;&gt;ロボットとは何か&lt;/h3&gt;

&lt;p&gt;イベントの始まりは、まずロボットってなんだろうというお話から。今日これから自分たちが作るものはなんなのか、世の中のどんなところで使われているのかといったことを知る。これすごく大事なことですね。&lt;/p&gt;

&lt;p&gt;我々世代で「ロボット」といえば&lt;a href=&#34;https://www.softbank.jp/robot/consumer/products/&#34;&gt;Pepperくん&lt;/a&gt;みたいな人型をイメージする人が多いと思いますが、いまのロボットは人型とは限りません。例えばエレベーターは、ボタンを押すとその階まできてくれて、行きたい階を押すとそこまで運んでくれる。例えばゆりかもめは、自動運転で動いており、強風だったら勝手に止まったりもする。このように、何らかの指示や情報を受け取り、それに応じて勝手に動いてくれるものがロボットなのだと。&lt;/p&gt;

&lt;p&gt;共通するのはinとoutがあること。そして、ロボットを動かすためにはinとoutの間にコンピュータとプログラムが必要となる。先ほど、指示や情報に応じて「勝手に動く」とあったが、実はそれはロボットが勝手にやっているのではなく、判断するためのプログラムを人が書いている。この勉強会では、そのプログラムとoutの動きの部分を作っていく。&lt;/p&gt;

&lt;p&gt;といった具合に、順を追ってロボットのプログラミングをするとはどういうことか、を子供にもわかる言葉や表現で説明してくれていました。&lt;/p&gt;

&lt;p&gt;こうやって仕組みを知っておくってすごく大事で、これを知ってやるのと知らないでやるのとでは後の理解度が全然変わってくると思います。初学者向け、子供向けとしては理想的な進め方だなと思いました。&lt;/p&gt;

&lt;p&gt;座学の後は、実際に手を動かしてどんどんロボットを動かしていきます。ちなみにロボットは一人一台最初から完成品が用意されているのですが、これらは全てスタッフさんの手作りだそうです。結構作るの大変そうなのに人数分とかすごい🤖&lt;/p&gt;

&lt;h3 id=&#34;ロボットを動かしてみる&#34;&gt;ロボットを動かしてみる&lt;/h3&gt;

&lt;p&gt;まず最初はロボットを前へ動かすプログラムから。キーボードをロボットにつないでコマンドを入力すると前進しを始めますが、動いたはいいものの今度は延々と進み続けて止まらなくなってしまいます。子供たちも軽くパニック。&lt;/p&gt;

&lt;p&gt;人間だったら壁にぶつかりそうになったとき自らの判断で止まりますが、ロボットは命令を忠実に実行するので、壁にぶつかってもなお前に進み続けてしまいます。じゃあ止めるためにはどうするか？　そう「止まれ」という命令が必要ですね、って流れになるわけです。こうやって、あえて失敗を経験させるのもまたすごく大事。&lt;/p&gt;

&lt;p&gt;そのあとは、前へ進んで1秒後に止まるなど、複数の動作をまとめて実行させたり、プログラムを保存してキーボードがなくても動くように、といったことをやってました。&lt;/p&gt;

&lt;h3 id=&#34;じゃんけんゲーム&#34;&gt;じゃんけんゲーム&lt;/h3&gt;

&lt;p&gt;&lt;img src=&#34;http://diwao.com/image/post/2017/06/robot-programming-sendai_02.jpg&#34; alt=&#34;じゃんけんゲームの様子&#34; /&gt;&lt;/p&gt;

&lt;p&gt;一通り動かし方を学んだら次はゲームで対決です。まず最初はじゃんけんゲーム。ぐるぐるとロボットをその場で回転させるプログラムを組み、グーチョキパーと書いてある紙の上で動かしてじゃんけんをするというもの。&lt;/p&gt;

&lt;p&gt;勉強のためのプログラミングってあまり面白くないし継続しにくいけど、こうしてゲームをするとか、何か目的があるプログラミングはやっていて楽しいし創意工夫も生まれてきやすいですよね。&lt;/p&gt;

&lt;h3 id=&#34;ここまでgoカート&#34;&gt;ここまでGOカート&lt;/h3&gt;

&lt;p&gt;最後はスタート地点から動かして、目印と目印の間の狙った場所にロボットを止められるかどうかを競うゲーム。何回挑戦してもいいし、まずは動かしてみてその都度調整していこうぜっていうスタンス。&lt;/p&gt;

&lt;p&gt;目印手前で止まってしまった時には「半分くらいまで進んだね。じゃあもっと先で止めるにはどうしたらいいだろう？」とか、答えは言わずに子供たち自身に考えさせる感じ。子供たちは子供たちで、そう言われて考えた仮説がピタッとはまった時にめっちゃ嬉しそうでした。これは子供の考える力を養ういいゲームだなと思いましたです。&lt;/p&gt;

&lt;h2 id=&#34;正式なスクールは来年開講予定&#34;&gt;正式なスクールは来年開講予定&lt;/h2&gt;

&lt;p&gt;今回は「先行テスト体験会」というものなので一回限りでおしまいでしたが、2018年の4月に正式なものとして改めてスクールが始まるそうです。また、正式なスクールの開始に先駆けて、今年の10月から全6回の講座も開催予定とのこと。&lt;/p&gt;

&lt;p&gt;今回参加してうちの息子は相当楽しかったらしく、また次も行きたいというとりますので、10月のやつは多分また参加すると思います。 まぁロボットプログラミングとか楽しくないわけがないですよね。自分が子供のときにこういうのあって欲しかった。いまのキッズたちが羨ましいぜ！&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Vue.jsのチュートリアルを進めていたらcomponentのところでハマった話</title>
      <link>http://diwao.com/2017/06/vue-tutorial-trouble.html</link>
      <pubDate>Thu, 22 Jun 2017 22:31:22 +0900</pubDate>
      
      <guid>http://diwao.com/2017/06/vue-tutorial-trouble.html</guid>
      <description>

&lt;p&gt;&lt;img src=&#34;http://diwao.com/image/post/dev/vuejs.jpg&#34; alt=&#34;Vuejs公式サイトのスクショ&#34; /&gt;&lt;/p&gt;

&lt;p&gt;ここ最近管理画面系のサイトを作ることが多く、そろそろフレームワークでも導入したいなという気持ちが高まってまいりました。ReactやAngularをバリバリ使いこなせたら素敵だなと思いつつも、実際にそれらが必要になるほど大規模な開発ってあまりないんですよね。もっと簡易的なもので事足りちゃう。&lt;/p&gt;

&lt;p&gt;というわけでVue.jsのお勉強を始めたのですが、しょっぱなのチュートリアルで詰まったところがあったので、同じような境遇に陥った人のため、そして自分自身のメモのために解決方法を書いておこうと思います。&lt;/p&gt;

&lt;h2 id=&#34;ハマったところ&#34;&gt;ハマったところ&lt;/h2&gt;

&lt;p&gt;Vue.jsを勉強し始めた人が最初に出会うであろう公式サイトのチュートリアル、&lt;a href=&#34;https://jp.vuejs.org/v2/guide/#コンポーネントによる構成&#34;&gt;はじめに&lt;/a&gt;の「コンポーネントによる構成」のところ。書いてある通りに&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;ol&amp;gt;
  &amp;lt;todo-item&amp;gt;&amp;lt;/todo-item&amp;gt;
&amp;lt;/ol&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;Vue.component(&#39;todo-item&#39;, {
  template: &#39;&amp;lt;li&amp;gt;This is a todo&amp;lt;/li&amp;gt;&#39;
});
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;とやってもVue.jsによるレンダリングが行われない……。consoleにエラーも出ないので原因が分からずしばらくハマりました。&lt;/p&gt;

&lt;h2 id=&#34;解決方法&#34;&gt;解決方法&lt;/h2&gt;

&lt;p&gt;なんでだろうなと思ったら公式サイトの&lt;a href=&#34;https://jp.vuejs.org/v2/guide/components.html&#34;&gt;コンポーネント&lt;/a&gt;の項目に理由が書いてありました。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;一度登録すると、コンポーネントはカスタム要素 &lt;my-component&gt; として親のインスタンスのテンプレートで使用できます。コンポーネントが root の Vue インスタンスをインスタンス化する前に登録されているか確認してください。
via - &lt;a href=&#34;https://jp.vuejs.org/v2/guide/components.html&#34;&gt;コンポーネント - Vue.js&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;ここに書いてある通り、コンポーネントを使うためには、その親をVueインスタンス化しておく必要があったみたいです。&lt;/p&gt;

&lt;p&gt;これに従ってHTML側でidを振り&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;ol id=&amp;quot;list&amp;quot;&amp;gt;
  &amp;lt;todo-item&amp;gt;&amp;lt;/todo-item&amp;gt;
&amp;lt;/ol&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;jsにインスタンス化する処理を追記します。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Vue.component(&#39;todo-item&#39;, {
  template: &#39;&amp;lt;li&amp;gt;This is a todo&amp;lt;/li&amp;gt;&#39;
});

// ここ追記
new Vue({
  el: &#39;#list&#39;
});
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;これでVueのコンポーネントが動くようになりました！&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;それにしてもVue.jsは日本語のドキュメントがあっていいですね。サイトも見やすいしとっつきやすい。引き続きチュートリアル進めて何か作ってみるところまでやってみたいと思います。&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://jp.vuejs.org/&#34;&gt;Vue.js&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>nvmで不要なバージョンのNode.jsを削除する方法</title>
      <link>http://diwao.com/2017/06/nvm-node-uninstall.html</link>
      <pubDate>Fri, 16 Jun 2017 23:57:56 +0900</pubDate>
      
      <guid>http://diwao.com/2017/06/nvm-node-uninstall.html</guid>
      <description>&lt;p&gt;&lt;img src=&#34;http://diwao.com/image/post/dev/nodejs_logo.jpg&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;p&gt;nvmでインストールするNode.jsのバージョンを間違えてしまった。あるあるですね。&lt;/p&gt;

&lt;p&gt;そのまま残しておいても害があるわけではないですが、かといって意味もないので削除してキレイにしておきましょう。削除方法はターミナルで下記のコマンドを実行するだけでOKです。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ nvm uninstall 削除したいバージョン
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;例えば、v5.4.1を削除したい時は&lt;code&gt;$ nvm uninstall 5.4.1&lt;/code&gt;となります。削除されたかどうか確認したい時は&lt;code&gt;$ nvm ls&lt;/code&gt;でどうぞ。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>[CSS] ホバーすると下線がニュっと伸びるアニメーションの作り方</title>
      <link>http://diwao.com/2017/06/css-hover-underline-animation.html</link>
      <pubDate>Thu, 15 Jun 2017 21:58:31 +0900</pubDate>
      
      <guid>http://diwao.com/2017/06/css-hover-underline-animation.html</guid>
      <description>

&lt;p&gt;&lt;img src=&#34;http://diwao.com/image/post/2017/06/css_hover_underline_animation.jpg&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;p&gt;メニューなどをホバーするとボーダーがアニメーションしつつニュっと伸びていく演出、最近よく見かけますよね。ちょっとした小技なんだけど、見かけると「お、やるじゃん」と思わせるアイツ。今日はこれの作り方を書いてみたいと思います。&lt;/p&gt;

&lt;h2 id=&#34;変化させるのは擬似要素&#34;&gt;変化させるのは擬似要素&lt;/h2&gt;

&lt;p&gt;このアニメーション、実現する方法はいろいろあると思うのですが、今回は::after擬似要素を使う形でやっていきます。コードの説明に入る前に、どうやってアニメーションを実現させるのか、まずはその考え方、流れをみていきましょう。&lt;/p&gt;

&lt;p&gt;まずはホバーさせる要素を用意します。&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://diwao.com/image/post/2017/06/css_hover_underline_animation_01.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;p&gt;次に、その要素の中に何も中身を持たない（&lt;code&gt;content: &#39;&#39;;&lt;/code&gt;）::after擬似要素を作ります。さらに、この擬似要素に形と色を与えて下線のベースを作ります。&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://diwao.com/image/post/2017/06/css_hover_underline_animation_02.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;p&gt;この::after擬似要素をホバーさせるテキストの左下に配置します。&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://diwao.com/image/post/2017/06/css_hover_underline_animation_03.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;p&gt;ホバーに合わせて::after擬似要素のwidthの値を変化させることで線の伸び縮みを実現することができる、という寸法です。&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://diwao.com/image/post/2017/06/css_hover_underline_animation_04.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;p&gt;超ざっくり説明だけどなんとなく仕組みはわかったはず。&lt;/p&gt;

&lt;h2 id=&#34;サンプルコード&#34;&gt;サンプルコード&lt;/h2&gt;

&lt;p&gt;では実際にコードを見ていきましょう。まずhtmlはシンプルにこんな感じ↓のものを用意。アニメーションするメニューという想定なのでaタグにしてみました。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;a class=&amp;quot;underline&amp;quot; href=&amp;quot;/&amp;quot;&amp;gt;ホバーしてね&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;そして、下線アニメーションのスタイルがこちら↓&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;.underline {
  display: inline-block;
  padding-bottom: 4px;
  position: relative;
}

.underline::after {
  background-color: tomato;
  bottom: 0;
  content: &#39;&#39;;
  display: block;
  height: 1px;
  left: 0;
  position: absolute;
  transition: .5s all;
  width: 0;
}

.underline:hover::after {
  width: 100%;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;::after擬似要素の&lt;code&gt;height: 1px;&lt;/code&gt;は線の太さ。&lt;code&gt;width: 0;&lt;/code&gt;とすることで、デフォルト状態ではボーダーを非表示にしています。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;position: absolute;&lt;/code&gt;と&lt;code&gt;left: 0;&lt;/code&gt;、&lt;code&gt;bottom: 0;&lt;/code&gt;で下線を&lt;code&gt;.underline&lt;/code&gt;の左下に配置。さらに::after擬似要素に&lt;code&gt;transition&lt;/code&gt;を設定し、ホバー時に&lt;code&gt;width: 100%;&lt;/code&gt;とすることで、左から右へと伸びていく線のアニメーションを実現しています。&lt;/p&gt;

&lt;h2 id=&#34;デモ&#34;&gt;デモ&lt;/h2&gt;

&lt;p&gt;サンプルでは左から右へのアニメーションを作りましたが、leftをrightに変えれば逆向きにできますし、bottomをtopに変えればテキストの上に線を引くこともできます。&lt;/p&gt;

&lt;p&gt;こちらに3パターンのデモを作ってみたので良かったら実際に動きチェックしてみてください。&lt;/p&gt;

&lt;p&gt;&lt;p data-height=&#34;265&#34; data-theme-id=&#34;0&#34; data-slug-hash=&#34;WOGvwL&#34; data-default-tab=&#34;result&#34; data-user=&#34;diwao&#34; data-embed-version=&#34;2&#34; data-pen-title=&#34;ホバーで下線がアニメーション&#34; data-preview=&#34;true&#34; class=&#34;codepen&#34;&gt;See the Pen &lt;a href=&#34;https://codepen.io/diwao/pen/WOGvwL/&#34;&gt;ホバーで下線がアニメーション&lt;/a&gt; by diwao (&lt;a href=&#34;https://codepen.io/diwao&#34;&gt;@diwao&lt;/a&gt;) on &lt;a href=&#34;https://codepen.io&#34;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;
&lt;script async src=&#34;https://production-assets.codepen.io/assets/embed/ei.js&#34;&gt;&lt;/script&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;いろいろ応用効くし使いどころも多いので、こういう作り方も覚えておくといんじゃないでしょうか。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>静的なサイトにDisqusでコメント欄を設置する</title>
      <link>http://diwao.com/2017/06/install-disqus.html</link>
      <pubDate>Wed, 14 Jun 2017 00:48:47 +0900</pubDate>
      
      <guid>http://diwao.com/2017/06/install-disqus.html</guid>
      <description>

&lt;p&gt;このブログは&lt;a href=&#34;https://gohugo.io/&#34;&gt;Hugo&lt;/a&gt;という静的サイトジェネレータを使って運営しています。完全に静的なHTMLなのでページの表示などは早いのですが、その反面サーバ処理を必要とする動的なコンテンツは用意されていません。&lt;/p&gt;

&lt;p&gt;具体的にいうと、WordPressや一般的なブログサービスなら簡単に設置できるメールフォームや人気記事、コメント欄といったパーツは、Hugoの標準機能には存在していなかったりします。&lt;/p&gt;

&lt;p&gt;そんな静的なサイトでも、簡単にコメント機能を実装できるDisqusというサービスがあります。このブログにも設置してみたので、導入方法をご紹介したいと思います。&lt;/p&gt;

&lt;h2 id=&#34;disqusの利用方法&#34;&gt;Disqusの利用方法&lt;/h2&gt;

&lt;p&gt;まずは&lt;a href=&#34;https://disqus.com/&#34;&gt;Disqusの公式サイト&lt;/a&gt;にアクセスして、「GET STARTED」をクリック。その後必要な情報を入力してアカウントを作成します。
&lt;img src=&#34;http://diwao.com/image/post/2017/06/install-disqus-01.png&#34; alt=&#34;Disqus公式サイト&#34; /&gt;&lt;/p&gt;

&lt;p&gt;「I want to installl Disuqs on my site」を選択。
&lt;img src=&#34;http://diwao.com/image/post/2017/06/install-disqus-02.png&#34; alt=&#34;やりたい操作を選択&#34; /&gt;&lt;/p&gt;

&lt;p&gt;導入するサイトの情報を入力。
&lt;img src=&#34;http://diwao.com/image/post/2017/06/install-disqus-03.png&#34; alt=&#34;自サイトの情報を入力&#34; /&gt;&lt;/p&gt;

&lt;p&gt;プランを選びます。有料プランもありますがとりあえずコメント機能を使うだけなので無料のBasicを選択。
&lt;img src=&#34;http://diwao.com/image/post/2017/06/install-disqus-04.png&#34; alt=&#34;プラン選択&#34; /&gt;&lt;/p&gt;

&lt;p&gt;続いてDisqusを設置するサイトの種類を選択します。WordPress、Tumblrなどなど様々なCMSやサービスのアイコンが並びますが、今回は静的サイトへの設置なのでわき目もくれず一番下にある「I don’t see my platform liseted, install manually with Universal Code」を選びます
&lt;img src=&#34;http://diwao.com/image/post/2017/06/install-disqus-05.png&#34; alt=&#34;コードをコピー&#34; /&gt;&lt;/p&gt;

&lt;p&gt;あとは画面に表示されたコードをコピーし、htmlファイル内のコメントを表示したい箇所にペーストするだけでOKです。
&lt;img src=&#34;http://diwao.com/image/post/2017/06/install-disqus-06.png&#34; alt=&#34;コメント設置用コード&#34; /&gt;&lt;/p&gt;

&lt;p&gt;この通り、あっという間にコメント欄を設置することができました！
&lt;img src=&#34;http://diwao.com/image/post/2017/06/install-disqus-07.png&#34; alt=&#34;&#39;コメント設置完了&#39;&#34; /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;これだけでPCにもSPにも対応してます。いやー、簡単&amp;amp;便利ですね。これでコメントし放題。せっかくなので活用してやってください。コメントお待ちしておりますー。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>.htaccessで404ページを設定する</title>
      <link>http://diwao.com/2017/06/404-htaccess.html</link>
      <pubDate>Tue, 13 Jun 2017 00:42:09 +0900</pubDate>
      
      <guid>http://diwao.com/2017/06/404-htaccess.html</guid>
      <description>

&lt;p&gt;&lt;img src=&#34;http://diwao.com/image/post/2017/06/404-htaccess.jpg&#34; alt=&#34;見つからない男性&#34; /&gt;&lt;/p&gt;

&lt;p&gt;Hugoでテーマを作ると自動的に404.htmlという404エラー用のhtmlファイルが生成されます。こいつは読んで字のごとく404エラー、つまりサイト上で存在しないURLにアクセスされた時に表示するページのことです。&lt;/p&gt;

&lt;p&gt;このファイルを表示させるための設定方法はいくつかありますが、今回は.htaccessで設定してみました。&lt;/p&gt;

&lt;h2 id=&#34;設定方法&#34;&gt;設定方法&lt;/h2&gt;

&lt;p&gt;.htaccessファイルをエディタで開いて次の一文を追記します。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ErrorDocument 404 /404.html
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;追記して保存したら、このファイルをサーバのドキュメントルートにアップすればOKです。404.htmlも同じくドキュメントルートに置いてあげましょう。&lt;/p&gt;

&lt;p&gt;その後、&lt;code&gt;http://diwao.com/hogehoge.html&lt;/code&gt;などの存在しないurlにアクセスしてみると&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://diwao.com/image/post/2017/06/404-htaccess-01.png&#34; alt=&#34;404ページ&#34; /&gt;&lt;/p&gt;

&lt;p&gt;この通り、ちゃんと404ページを表示されるようになりました！&lt;/p&gt;

&lt;p&gt;ちなみに、一部のレンタルサーバなどでは.htaccessが使えないところもあるみたいなので、まずは自分の使ってるサーバで.htaccessが使えるかどうか確認してみてくださいね。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Pure CSSを使ってブログのテーマをリニューアルしました</title>
      <link>http://diwao.com/2017/06/new-hugo-theme.html</link>
      <pubDate>Mon, 12 Jun 2017 23:38:55 +0900</pubDate>
      
      <guid>http://diwao.com/2017/06/new-hugo-theme.html</guid>
      <description>

&lt;p&gt;&lt;img src=&#34;http://diwao.com/image/post/2017/06/new-hugo-theme.png&#34; alt=&#34;Pure CSS&#34; /&gt;&lt;/p&gt;

&lt;p&gt;思い立ってブログのテーマをリニューアルしました。前回は完全自作だったけど今回はCSSフレームワークを使ってみました。&lt;a href=&#34;http://getbootstrap.com/&#34;&gt;Bootstrap&lt;/a&gt;くらいしか使ったことなかったけど色々あるんですね。&lt;/p&gt;

&lt;h2 id=&#34;cssフレームワーク&#34;&gt;CSSフレームワーク&lt;/h2&gt;

&lt;p&gt;CSSフレームワークと一括りにしてみても、その中身は千差万別。いろんなコンポーネントを兼ね備えた壮大なやつもあれば、必要最低限のスタイルだけに絞ったシンプルなやつもあります。&lt;/p&gt;

&lt;p&gt;このブログだと全然本格的なものはいらなくて、グリッドレイアウトとベースになるいい感じのスタイルがあればそれで十分。という心持ちでいろいろ調べてみたところ、この辺が良さげかなと。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://milligram.io/&#34;&gt;Milligram&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://getskeleton.com/&#34;&gt;Skeleton&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://purecss.io/&#34;&gt;Pure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://sujansundareswaran.com/fictoan/&#34;&gt;FICTOAN&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Milligramの雰囲気が好きだったのですが、画面幅に応じてグリッドの段組を変更することができないみたいだったので断念。その他も色々試してみた結果、いちばん求めているものに近そうなPure CSSにしてみました。Yahooブランドで安心感もありますし。&lt;/p&gt;

&lt;p&gt;&lt;p data-height=&#34;265&#34; data-theme-id=&#34;0&#34; data-slug-hash=&#34;xrOKEd&#34; data-default-tab=&#34;html,result&#34; data-user=&#34;diwao&#34; data-embed-version=&#34;2&#34; data-pen-title=&#34;Pure CSS&#34; class=&#34;codepen&#34;&gt;See the Pen &lt;a href=&#34;https://codepen.io/diwao/pen/xrOKEd/&#34;&gt;Pure CSS&lt;/a&gt; by diwao (&lt;a href=&#34;https://codepen.io/diwao&#34;&gt;@diwao&lt;/a&gt;) on &lt;a href=&#34;https://codepen.io&#34;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;
&lt;script async src=&#34;https://production-assets.codepen.io/assets/embed/ei.js&#34;&gt;&lt;/script&gt;&lt;/p&gt;

&lt;p&gt;こんな感じに&lt;code&gt;.pure-【なんちゃら】&lt;/code&gt;って形のクラスをつけていくだけでレイアウトやパーツが作れます。今回はレスポンシブ用のグリッドCSSも読み込んで、画面幅に応じて段組が可変するようにしてみました。&lt;/p&gt;

&lt;p&gt;▼PC
&lt;img src=&#34;http://diwao.com/image/post/2017/06/new-hugo-theme-01.png&#34; alt=&#34;PC版TOPページ&#34; /&gt;&lt;/p&gt;

&lt;p&gt;▼タブレット
&lt;img src=&#34;http://diwao.com/image/post/2017/06/new-hugo-theme-02.png&#34; alt=&#34;タブレット版TOPページ&#34; /&gt;&lt;/p&gt;

&lt;p&gt;▼スマホ
&lt;img src=&#34;http://diwao.com/image/post/2017/06/new-hugo-theme-03.png&#34; alt=&#34;スマホ版TOPページ&#34; /&gt;&lt;/p&gt;

&lt;p&gt;このようなレイアウトも簡単に作れちゃいます。こりゃ開発の時短にもなりますわ。&lt;/p&gt;

&lt;h2 id=&#34;フォント&#34;&gt;フォント&lt;/h2&gt;

&lt;p&gt;フォントはGoogle Fonts+日本語早期アクセスを使ってみました。さわらびゴシックというやつ。Noto Sans Japaneseと迷ったけど、実際当ててみてさわらびの方が読みやすいと思いまして。&lt;/p&gt;

&lt;p&gt;Webフォント=重いってイメージがあったのですが、天下のグーグル先生だからなのか意外と表示も速い気がします。&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://googlefonts.github.io/japanese/&#34;&gt;Google Fonts + 日本語 早期アクセス • Google Fonts + Japanese Early Access&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&#34;アイコン&#34;&gt;アイコン&lt;/h2&gt;

&lt;p&gt;フッターのアイコンはIconfinderというサイトのものを使わせていただきました。Web系のアイコンが充実してるしSVG形式も使えるのが嬉しい。&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://www.iconfinder.com/&#34;&gt;Iconfinder - 1,725,000+ free and premium icons&lt;/a&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;そんなこんなでいろんなツールや素材にお世話になりつつの全面リニューアルでした。全体的に前よりもちょっとシャレオツになった気がします。CSSフレームワークって偉大ですね。デザインできない人にとっては強い味方だなと改めて感じました。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>HTML5の機能でバリデーションを設定し、その結果をJavaScriptで取得する</title>
      <link>http://diwao.com/2017/06/html5-form-checkvalidity.html</link>
      <pubDate>Sun, 11 Jun 2017 23:27:37 +0900</pubDate>
      
      <guid>http://diwao.com/2017/06/html5-form-checkvalidity.html</guid>
      <description>

&lt;p&gt;&lt;img src=&#34;http://diwao.com/image/post/2017/06/html5_form_checkvalidity.jpg&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;p&gt;HTML5ではフォーム機能が大幅に拡張されていて、標準機能だけでもそれなりのバリデーション（入力チェック）を実装できます。&lt;/p&gt;

&lt;p&gt;標準機能でバリデーションを設定した際、そのバリデーションが通っているかどうかで処理を分岐させたい、ということはよくあると思います。その時に使えるのがJavaScriptのcheckValidityメソッドです。&lt;/p&gt;

&lt;h2 id=&#34;formに対して実行&#34;&gt;formに対して実行&lt;/h2&gt;

&lt;p&gt;checkValidityメソッドはform要素に対して実行すると、その時のフォーム全体の入力状況を見てすべてバリデートが通っていればtrue、そうでなければfalseを返します。&lt;/p&gt;

&lt;p&gt;例えば、以下のフォームがあったとします。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;form id=&amp;quot;form&amp;quot;&amp;gt;
  &amp;lt;div&amp;gt;
    名前：&amp;lt;input id=&amp;quot;name&amp;quot; type=&amp;quot;text&amp;quot; required&amp;gt;
  &amp;lt;/div&amp;gt;
  &amp;lt;div&amp;gt;
    年齢：&amp;lt;input id=&amp;quot;age&amp;quot; type=&amp;quot;number&amp;quot;&amp;gt;
  &amp;lt;/div&amp;gt;
  &amp;lt;div&amp;gt;
    メール：&amp;lt;input id=&amp;quot;email&amp;quot; type=&amp;quot;email&amp;quot;&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/form&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;この時、何も入力しないままform要素に対してcheckValidityを実行すると、&lt;code&gt;&amp;lt;input id=&amp;quot;name&amp;quot; type=&amp;quot;text&amp;quot; required&amp;gt;&lt;/code&gt;が必須項目となっているため、ここが不正となりfalseを返します↓&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;const form = document.getElementById(&#39;form&#39;);
console.log(form. checkValidity());  //false
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;form内のすべての要素でバリデーションが通ったときだけtrueを返します。&lt;/p&gt;

&lt;h2 id=&#34;input要素を指定して実行&#34;&gt;input要素を指定して実行&lt;/h2&gt;

&lt;p&gt;checkValidityメソッドはformだけではなく、個別のinput要素でも実行することができます。先ほどと同じフォームに対して、i何も入力しない状態で以下のJavaScriptを実行したとします。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;const form = document.getElementById(&#39;form&#39;);
const age = document.getElementById(&#39;age&#39;);

console.log(form.checkValidity()); //false
console.log(age.checkValidity()); //true
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;この時、&lt;code&gt;&amp;lt;input id=&amp;quot;name&amp;quot; type=&amp;quot;text&amp;quot; required&amp;gt;&lt;/code&gt;の必須項目があるため、フォーム全体としてはfalseとなりますが、&lt;code&gt;&amp;lt;input id=&amp;quot;age&amp;quot; type=&amp;quot;number&amp;quot;&amp;gt;&lt;/code&gt;単体としてはtrueを返します。&lt;/p&gt;

&lt;h2 id=&#34;サンプル&#34;&gt;サンプル&lt;/h2&gt;

&lt;p&gt;例に挙げたフォームで、実際にcheckValidityの挙動を確認できるデモを作りました。「フォームをチェック」ボタンをクリックするとformに、「ageをチェック」ボタンをクリックするとidがageのinput要素に対してcheckValidityを実行した結果を返します。&lt;/p&gt;

&lt;p&gt;&lt;p data-height=&#34;265&#34; data-theme-id=&#34;0&#34; data-slug-hash=&#34;QgNgoQ&#34; data-default-tab=&#34;result&#34; data-user=&#34;diwao&#34; data-embed-version=&#34;2&#34; data-pen-title=&#34;checkvalidateサンプル&#34; class=&#34;codepen&#34;&gt;See the Pen &lt;a href=&#34;https://codepen.io/diwao/pen/QgNgoQ/&#34;&gt;checkvalidateサンプル&lt;/a&gt; by diwao (&lt;a href=&#34;https://codepen.io/diwao&#34;&gt;@diwao&lt;/a&gt;) on &lt;a href=&#34;https://codepen.io&#34;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;
&lt;script async src=&#34;https://production-assets.codepen.io/assets/embed/ei.js&#34;&gt;&lt;/script&gt;&lt;/p&gt;

&lt;h2 id=&#34;参考&#34;&gt;参考&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/ja/docs/Learn/HTML/Forms/Data_form_validation&#34;&gt;データフォームの検証 - ウェブ開発を学ぶ | MDN&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Hugoの自作テーマを配布できる形にする</title>
      <link>http://diwao.com/2017/06/hugo-theme-packaging.html</link>
      <pubDate>Sat, 10 Jun 2017 10:58:45 +0900</pubDate>
      
      <guid>http://diwao.com/2017/06/hugo-theme-packaging.html</guid>
      <description>

&lt;p&gt;このブログは&lt;a href=&#34;https://gohugo.io/&#34;&gt;Hugo&lt;/a&gt;という静的サイトジェネレータで構築しています。テーマも自作しているのですが、よくよく調べたらテーマをちゃんと管理できてなかったみたいなので、いろいろその辺の構造などを見直しました。以下、やったことをメモ。&lt;/p&gt;

&lt;h2 id=&#34;themesディレクトリを使ってなかった&#34;&gt;themesディレクトリを使ってなかった&lt;/h2&gt;

&lt;p&gt;Hugoでテーマを使うときは、ルート直下にある「themes」というディレクトリの中にテーマファイルを置き、「config.toml」で使うテーマを指定する、というやり方が一般的なやり方だそうです。ところが、私はそれを知らずにルート直下にある「archetypes」や「layouts」ディレクトリの中に直接ファイルを置いて、それをガシガシ編集する形でサイトを作っていました。&lt;/p&gt;

&lt;p&gt;どうやら、このルート直下にある「archetype」や「layouts」ディレクトリの中にファイルをおくと、設定しているテーマよりも優先的に使用されるという仕組みらしく、テーマの一部を上書きたい時に使うのが本来の用途のようです。&lt;/p&gt;

&lt;p&gt;私のやり方でも動作に問題はないのですが、このままだとテーマの切り替えができなかったり、管理が色々とやりにくそうなので、本来あるべき形にファイルの構造を整理してあげよう、というのが今回の目的です。&lt;/p&gt;

&lt;h2 id=&#34;必要なファイルをまとめる&#34;&gt;必要なファイルをまとめる&lt;/h2&gt;

&lt;p&gt;では早速進めていきます。まずはHugoで管理しているのサイトのルート（「static」や「archetypes」ディレクトリや「config.toml」などが置いてあるディレクトリ）の直下に「themes」という名前のディレクトリを作ります。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ mkdir themes
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;作成したthemesディレクトリに移動し、自作テーマ用のディレクトリを作成します。今回は仮に「my_theme」という名前にします。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ cd themes
$ mkdir my_theme
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;my_themeディレクトリの中に、テーマに必要なファイルを入れていきます（コピーではなく移動させました）。実際にディレクトリに放り込んだのは以下のファイル。
ちなみにこれはあくまで私の環境の場合なので、自作テーマの作り次第ではファイル数など変わってきます。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/archetypes/default.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/layouts&lt;/code&gt;ディレクトリの中身全部&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/static/css/&lt;/code&gt;ディレクトリの中身全部&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/static/js&lt;/code&gt;ディレクトリの中身全部&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/static/image/&lt;/code&gt;内のテーマに関する画像ファイルだけ&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;そして最後にmy_themeディレクトリ直下に&lt;code&gt;theme.toml&lt;/code&gt;ファイルを新規で作成。中身は&lt;a href=&#34;https://github.com/rakuishi/hugo-zen&#34;&gt;Hugo Zen&lt;/a&gt;を参考にこんな感じにしてみました。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;name = &amp;quot; my_theme&amp;quot;
license = &amp;quot;MIT&amp;quot;
licenselink = &amp;quot;&amp;quot;
description = &amp;quot;my_theme is a sapmle theme.&amp;quot;
tags = [&amp;quot;blog&amp;quot;]
features = [&amp;quot;blog&amp;quot;, &amp;quot;themes&amp;quot;]
min_version = 0.1

[author]
    name = &amp;quot;diwao&amp;quot;
    homepage = &amp;quot;http://diwao.com/&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;テーマを適用する&#34;&gt;テーマを適用する&lt;/h2&gt;

&lt;p&gt;ここまでの流れでテーマを使用する準備ができたのですが、このままではまだ「my_theme」は適用されていません。このサイトでどのテーマを使うのかを記述する必要があります。といっても簡単で、サイトのルートにある「config.toml」に&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;theme = &#39;my_theme&#39;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;こんな感じに&lt;code&gt;theme = &#39;テーマ名&#39;&lt;/code&gt;と追記してあげるだけでOKです。これでテーマが管理しやすく、また別のサイトに適用させることも簡単になり扱いやすくなりました。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Kindleで購入した期間限定 無料お試し版を削除する方法</title>
      <link>http://diwao.com/2017/06/kindle_limited_free_delete.html</link>
      <pubDate>Fri, 09 Jun 2017 01:05:56 +0900</pubDate>
      
      <guid>http://diwao.com/2017/06/kindle_limited_free_delete.html</guid>
      <description>

&lt;p&gt;&lt;img src=&#34;http://diwao.com/image/post/2017/06/kindle_limited_free_delete.jpg&#34; alt=&#34;コンテンツと端末の管理&#34; /&gt;&lt;/p&gt;

&lt;p&gt;Kindleの期間限定無料お試し版でつい色んなマンガをDLしてしまう……あるあるじゃないでしょうか。無料で読んでみて、面白かったら続きを買うってジャッジできるのでありがたいのですが、ひとつだけ困ったことがあります。&lt;/p&gt;

&lt;p&gt;それは期間を過ぎたら読めなくなってしまう、のはまあ当然だと思うのですが、読めない状態のままサーバ上にその書籍のデータが残り続けること。これが邪魔で消したいなと思ったのですが、やり方ちょっとわかりにくかったのでメモっておきます。&lt;/p&gt;

&lt;h2 id=&#34;削除は-コンテンツと端末の管理-から&#34;&gt;削除は「コンテンツと端末の管理」から&lt;/h2&gt;

&lt;p&gt;まずはAmazonにログインし、アカウントサービスから「コンテンツと端末の管理」をクリックします。&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://diwao.com/image/post/2017/06/kindle_limited_free_delete_01.png&#34; alt=&#34;コンテンツと端末の管理&#34; /&gt;&lt;/p&gt;

&lt;p&gt;購入したKindle本がずらーっと出てきます。検索窓に「期間限定」と入力して絞り込みましょう。&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://diwao.com/image/post/2017/06/kindle_limited_free_delete_02.png&#34; alt=&#34;コンテンツ一覧&#34; /&gt;&lt;/p&gt;

&lt;p&gt;削除したい本をチェックをつけて削除ボタンを押せばデータを完全に削除できます。&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://diwao.com/image/post/2017/06/kindle_limited_free_delete_02.png&#34; alt=&#34;コンテンツ削除確認画面&#34; /&gt;&lt;/p&gt;

&lt;p&gt;なお、削除のチェックは一度に最大10件までしかつけられません。数が多い場合は、面倒ですが10件ずつ地道に削除していきましょう。&lt;/p&gt;

&lt;p&gt;間違って有料で買ったやつを削除しちゃうと、おそらく再度購入が必要になってしまうので削除する時はくれぐれも慎重に。&lt;/p&gt;

&lt;div class=&#34;kaerebalink-box&#34; style=&#34;text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;&#34;&gt;&lt;div class=&#34;kaerebalink-image&#34; style=&#34;float:left;margin:0 15px 10px 0;&#34;&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B01J94SZCM/otaman0517-22/&#34; target=&#34;_blank&#34; &gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51QNV8acCXL._SL160_.jpg&#34; style=&#34;border: none;&#34; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&#34;kaerebalink-info&#34; style=&#34;line-height:120%;/zoom: 1;overflow: hidden;&#34;&gt;&lt;div class=&#34;kaerebalink-name&#34; style=&#34;margin-bottom:10px;line-height:120%&#34;&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B01J94SZCM/otaman0517-22/&#34; target=&#34;_blank&#34; &gt;Fire HD 8 タブレット (Newモデル) 16GB、ブラック&lt;/a&gt;&lt;div class=&#34;kaerebalink-powered-date&#34; style=&#34;font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%&#34;&gt;posted with &lt;a href=&#34;http://kaereba.com&#34; rel=&#34;nofollow&#34; target=&#34;_blank&#34;&gt;カエレバ&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;kaerebalink-detail&#34; style=&#34;margin-bottom:5px;&#34;&gt; Amazon     &lt;/div&gt;&lt;div class=&#34;kaerebalink-link1&#34; style=&#34;margin-top:10px;&#34;&gt;&lt;div class=&#34;shoplinkamazon&#34; style=&#34;display:inline;margin-right:5px&#34;&gt;&lt;a href=&#34;http://www.amazon.co.jp/gp/search?keywords=kindle&amp;__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&amp;tag=otaman0517-22&#34; target=&#34;_blank&#34; &gt;Amazon&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;booklink-footer&#34; style=&#34;clear: left&#34;&gt;&lt;/div&gt;&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>ChromeのシークレットウインドウでFlashを有効にする方法</title>
      <link>http://diwao.com/2017/06/chrome_secret_flash_enable.html</link>
      <pubDate>Thu, 08 Jun 2017 00:02:30 +0900</pubDate>
      
      <guid>http://diwao.com/2017/06/chrome_secret_flash_enable.html</guid>
      <description>&lt;p&gt;調べたけどなかなか情報が見つからなかったのでメモ。ChromeのシークレットウインドウでFlashを実行させる方法です。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Chromeの設定画面(&lt;code&gt;chrome://settings/&lt;/code&gt;)を開く&lt;/li&gt;
&lt;li&gt;画面下の「詳細設定を表示…」をクリック&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;プライバシー&lt;/strong&gt;という項目の「コンテンツの設定…」ボタンをクリック&lt;/li&gt;
&lt;li&gt;ちょっと下にスクロールするとFlashという項目があるので、そこにある「例外の管理…」ボタンをクリック&lt;/li&gt;
&lt;li&gt;「Flash 例外」ウインドウの下の方にシークレットモードセッションにのみ適用される云々と書かれたボックスがあるので、そこにFlashを有効にしたいURLを入力する&lt;/li&gt;
&lt;li&gt;完了ボタンをクリックでOKです&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;以上！&lt;/p&gt;

&lt;p&gt;※Mac OS X用 バージョン 58.0.3029.110 (64-bit)で確認&lt;/p&gt;

&lt;div class=&#34;kaerebalink-box&#34; style=&#34;text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;&#34;&gt;&lt;div class=&#34;kaerebalink-image&#34; style=&#34;float:left;margin:0 15px 10px 0;&#34;&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B01LX3JDW8/otaman0517-22/&#34; target=&#34;_blank&#34; &gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/61h%2B-VwyCuL._SL160_.jpg&#34; style=&#34;border: none;&#34; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&#34;kaerebalink-info&#34; style=&#34;line-height:120%;/zoom: 1;overflow: hidden;&#34;&gt;&lt;div class=&#34;kaerebalink-name&#34; style=&#34;margin-bottom:10px;line-height:120%&#34;&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B01LX3JDW8/otaman0517-22/&#34; target=&#34;_blank&#34; &gt;秘密 THE TOP SECRET [DVD]&lt;/a&gt;&lt;div class=&#34;kaerebalink-powered-date&#34; style=&#34;font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%&#34;&gt;posted with &lt;a href=&#34;http://kaereba.com&#34; rel=&#34;nofollow&#34; target=&#34;_blank&#34;&gt;カエレバ&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;kaerebalink-detail&#34; style=&#34;margin-bottom:5px;&#34;&gt;生田斗真 松竹 2017-01-06    &lt;/div&gt;&lt;div class=&#34;kaerebalink-link1&#34; style=&#34;margin-top:10px;&#34;&gt;&lt;div class=&#34;shoplinkamazon&#34; style=&#34;display:inline;margin-right:5px&#34;&gt;&lt;a href=&#34;http://www.amazon.co.jp/gp/search?keywords=%E7%A7%98%E5%AF%86&amp;__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&amp;tag=otaman0517-22&#34; target=&#34;_blank&#34; &gt;Amazon&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;booklink-footer&#34; style=&#34;clear: left&#34;&gt;&lt;/div&gt;&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>[JavaScript] PC内の画像ファイルをブラウザに表示する</title>
      <link>http://diwao.com/2017/06/js_filereader_img.html</link>
      <pubDate>Wed, 07 Jun 2017 11:22:14 +0900</pubDate>
      
      <guid>http://diwao.com/2017/06/js_filereader_img.html</guid>
      <description>

&lt;p&gt;前回の記事では、PC内のjsonファイルを読み込んで画面に表示するという処理をつくってみました。&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;http://diwao.com/2017/06/js_filereader_json.html&#34;&gt;[JavaScript] サーバ処理を介さずPC内のjsonファイルを画面に表示する - diwao日記&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;今回は前回のコードをちょっとアレンジして、PC内の画像ファイルを読み込んでブラウザに表示するというの処理を作ってみたいと思います。では早速いってみよー。&lt;/p&gt;

&lt;h2 id=&#34;readasdataurlでファイルの内容を取得する&#34;&gt;readAsDataURLでファイルの内容を取得する&lt;/h2&gt;

&lt;p&gt;ファイルの読み込みにはFileReaderオブジェクトを使います。input[type=&amp;ldquo;file”]要素でFileオブジェクトを取得するんでしたね。この辺は前回と同じなので細かい説明は割愛。&lt;/p&gt;

&lt;p&gt;さて、前回はファイルの内容をテキストとして表示しました。読み込むファイルの中身がテキストならこれで良いのですが、今回は画像を表示するのでそのままではダメそうです。そう、imgタグのsrcに設定するファイルのパスが必要になることは想像に難くありません。&lt;/p&gt;

&lt;p&gt;srcに設定するパスを取得するのにはFileReaderオブジェクトのreadAsDataURLメソッドを使います。これは読み込んだファイルを示すdata: URL の文字列（base64 エンコーディングされたもの）を取得するメソッドです。取得した結果はFileTeadオブジェクトのresultプロパティに格納されます。&lt;/p&gt;

&lt;h2 id=&#34;コードとサンプル&#34;&gt;コードとサンプル&lt;/h2&gt;

&lt;p&gt;と、いったことを踏まえて作ったサンプルがこちら。画像ファイルを選択すると、その画像が画面に表示されるという簡単なものです。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;input type=&amp;quot;file&amp;quot; id=&amp;quot;file&amp;quot; class=&amp;quot;btn&amp;quot; accept=&amp;quot;image/*&amp;quot;&amp;gt;
&amp;lt;div id=&amp;quot;result&amp;quot; class=&amp;quot;result&amp;quot;&amp;gt;ここに画像が表示されます&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;window.onload = () =&amp;gt; {
  const file = document.getElementById(&#39;file&#39;);
  const result = document.getElementById(&#39;result&#39;);
  const reader = new FileReader();

  // ファイルが選択されたらファイルのdata:URL文字列を保存
  file.addEventListener(&#39;change&#39;, function(e){
    reader.readAsDataURL(e.target.files[0]);
  });

  // ファイルの読み込みが終わったら内容を表示
  reader.onload = function(e){
    result.innerHTML = `&amp;lt;img src=&amp;quot;${e.target.result}&amp;quot; alt=&amp;quot;&amp;quot;&amp;gt;`;
  };
};
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;p data-height=&#34;265&#34; data-theme-id=&#34;0&#34; data-slug-hash=&#34;mwJYdZ&#34; data-default-tab=&#34;result&#34; data-user=&#34;diwao&#34; data-embed-version=&#34;2&#34; data-pen-title=&#34;フロントから画像を読み込む&#34; class=&#34;codepen&#34;&gt;See the Pen &lt;a href=&#34;https://codepen.io/diwao/pen/mwJYdZ/&#34;&gt;フロントから画像を読み込む&lt;/a&gt; by diwao (&lt;a href=&#34;https://codepen.io/diwao&#34;&gt;@diwao&lt;/a&gt;) on &lt;a href=&#34;https://codepen.io&#34;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;
&lt;script async src=&#34;https://production-assets.codepen.io/assets/embed/ei.js&#34;&gt;&lt;/script&gt;&lt;/p&gt;

&lt;p&gt;input要素で選択した画像ファイルをreadAsDataURLで取得し、その値をimgタグのsrcに突っ込んで画像を表示させています。アップロード前のプレビューとか、何かと使い所はありそうなので覚えておいて損はないかと。&lt;/p&gt;

&lt;h2 id=&#34;参考&#34;&gt;参考&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/ja/docs/Web/API/FileReader&#34;&gt;FileReader - Web API インターフェイス | MDN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/ja/docs/Web/API/FileReader/readAsDataURL&#34;&gt;FileReader.readAsDataURL() - Web API インターフェイス | MDN&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>[JavaScript] サーバ処理を介さずPC内のjsonファイルを画面に表示する</title>
      <link>http://diwao.com/2017/06/js_filereader_json.html</link>
      <pubDate>Tue, 06 Jun 2017 00:02:34 +0900</pubDate>
      
      <guid>http://diwao.com/2017/06/js_filereader_json.html</guid>
      <description>

&lt;p&gt;jsonといえばajaxで受け取ってフロントでゴニョゴニョするデータというイメージだったのですが、ローカルから読み込んでフロントだけで扱うこともできるんですね。割と最近知って色々使い所ありそうだなと思ったのでメモっておこうと思います。&lt;/p&gt;

&lt;h2 id=&#34;filereaderを使う&#34;&gt;FileReaderを使う&lt;/h2&gt;

&lt;p&gt;ざっくりとサンプルを作ってみました。PC内jsonファイルを選択すると、そのファイルの中身を表示するというものです。ソースコードはこちら。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;input type=&amp;quot;file&amp;quot; id=&amp;quot;file&amp;quot;&amp;gt;
&amp;lt;div id=&amp;quot;result&amp;quot;&amp;gt;ここに結果が表示されます&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;window.onload = () =&amp;gt; {
  const file = document.getElementById(&#39;file&#39;);
  const result = document.getElementById(&#39;result&#39;);
  //  FileReaderオブジェクトを生成
  const reader = new FileReader();

  // ファイルが選択されたらFileReaderオブジェクトにファイルをテキストとして保存
  file.addEventListener(&#39;change&#39;, function(e){
    reader.readAsText(e.target.files[0]);
  });

  // ファイルの読み込みが終わったら内容を表示
  reader.onload = function(e){
    result.innerText = e.target.result;
  };
};
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;サンプルはこちら↓&lt;/p&gt;

&lt;p&gt;&lt;p data-height=&#34;265&#34; data-theme-id=&#34;0&#34; data-slug-hash=&#34;LLEjRm&#34; data-default-tab=&#34;result&#34; data-user=&#34;diwao&#34; data-embed-version=&#34;2&#34; data-pen-title=&#34;フロントだけでローカルのjsonファイルを読み込む&#34; class=&#34;codepen&#34;&gt;See the Pen &lt;a href=&#34;https://codepen.io/diwao/pen/LLEjRm/&#34;&gt;フロントだけでローカルのjsonファイルを読み込む&lt;/a&gt; by diwao (&lt;a href=&#34;https://codepen.io/diwao&#34;&gt;@diwao&lt;/a&gt;) on &lt;a href=&#34;https://codepen.io&#34;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;
&lt;script async src=&#34;https://production-assets.codepen.io/assets/embed/ei.js&#34;&gt;&lt;/script&gt;&lt;/p&gt;

&lt;p&gt;ポイントはFileReaderオブジェクト。これを使うことでユーザのPC内にあるファイルをWebから非同期的に読み込むことができるようになります。&lt;/p&gt;

&lt;h2 id=&#34;処理の概要&#34;&gt;処理の概要&lt;/h2&gt;

&lt;p&gt;大体の流れはコード内のコメントに書いた通りなのですが、もう少し細かい部分について分解して説明してみたいと思います。&lt;/p&gt;

&lt;h3 id=&#34;input要素からfileオブジェクトを取得&#34;&gt;input要素からFileオブジェクトを取得&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;// ファイルが選択されたらFileReaderオブジェクトにファイルをテキストとして保存
file.addEventListener(&#39;change&#39;, function(e){
  reader.readAsText(e.target.files[0]);
});
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ここでは、input要素に対してchangeイベントを設定しています。input要素の値が変わったら、すなわちファイルが何か選択されたら何らかの処理を実行するというものですね。&lt;/p&gt;

&lt;p&gt;で、実際に実行している処理がこちら↓&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;reader.readAsText(e.target.files[0]);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ここで出てくる&lt;code&gt;e.target&lt;/code&gt;とはつまりinput要素のことで、&lt;code&gt;e.target.files&lt;/code&gt;はFileListオブジェクトを意味します。FileLIstオブジェクトにはユーザーが選択したファイルを示すFileオブジェクトが含まれており、複数ファイルを選択していればそれらを一気に扱うこともできるようです。&lt;/p&gt;

&lt;p&gt;今回は1ファイルしか選択しない想定なので、Fileオブジェクトがひとつという前提で&lt;code&gt;e.target.files[0]&lt;/code&gt;とし、FileListオブジェクトの最初のデータとしてFileオブジェクトを取得しています。そうやって取得したFileオブジェクトをFileReaderのreadAsTextメソッド渡しているというのがこの部分の処理でした。&lt;/p&gt;

&lt;p&gt;ちなみに、大体お察しかと思いますがreadAsTextメソッドは読んで字のごとくファイルの内容を文字列として保存するメソッドです。&lt;/p&gt;

&lt;h3 id=&#34;ファイル読み込み時の処理にはonloadを使う&#34;&gt;ファイル読み込み時の処理にはonloadを使う&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;// ファイルの読み込みが終わったら内容を表示
reader.onload = function(e){
  result.innerText = e.target.result;
};
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ここではファイルの読み込みが終わったら、その内容を表示するといった処理をしています。&lt;/p&gt;

&lt;p&gt;FileReader.onloadに設定した処理はファイルの読み込みが成功したときに発火します。読み込みが完了したときというのはつまり先ほど説明したreadAsTextメソッドの処理が完了したらということですね。&lt;/p&gt;

&lt;p&gt;また、この関数の中の&lt;code&gt;e.target&lt;/code&gt;は変数&lt;code&gt;reader&lt;/code&gt;を指しているので、&lt;code&gt;e.target.result&lt;/code&gt;はFileReaderオブジェクトのresultプロパティということになります。resultプロパティはファイルの読み込みが終了したあとに有効となるもので、ここではreadAsTextメソッドの結果、つまりファイルの内容を文字列として格納しています。&lt;/p&gt;

&lt;p&gt;なので、それをdomのinnerTextに代入すればファイルの中身を画面上に表示できるというわけです。&lt;/p&gt;

&lt;h2 id=&#34;jsonファイルならデータとして扱うことも可&#34;&gt;jsonファイルならデータとして扱うことも可&lt;/h2&gt;

&lt;p&gt;読み込んだファイルをjsonファイルであれば、readAsTextメソッドでテキスト化したデータをJSON.parseすることで自由に扱うことも可能です。読み込んだデータをサーバに送信すればインポート機能みたいなものも作れたりするでしょうし、色々と応用が利きそうな気がします。&lt;/p&gt;

&lt;h2 id=&#34;参考&#34;&gt;参考&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/ja/docs/Web/API/FileReader&#34;&gt;FileReader - Web API インターフェイス | MDN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/ja/docs/Web/API/FileReader/readAsText&#34;&gt;FileReader.readAsText() - Web API インターフェイス | MDN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/ja/docs/Using_files_from_web_applications&#34;&gt;Web アプリケーションからファイルを扱う | MDN&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Youtubeの埋め込み動画をレスポンシブ対応させる方法</title>
      <link>http://diwao.com/2017/06/youtube_embed_responsive.html</link>
      <pubDate>Mon, 05 Jun 2017 19:19:08 +0900</pubDate>
      
      <guid>http://diwao.com/2017/06/youtube_embed_responsive.html</guid>
      <description>

&lt;p&gt;Youtubeの埋め込み動画を使ったサイトの構築はよくありますが、画面幅に応じて拡大縮小させる、いわゆるレスポンシブ対応するにはちょっと工夫が入ります。今回はそのやり方を紹介。&lt;/p&gt;

&lt;h2 id=&#34;max-widthだと上下に余白が出る&#34;&gt;max-widthだと上下に余白が出る&lt;/h2&gt;

&lt;p&gt;動画をレスポンシブ対応させようとしてよくやりがちなのが、画像と同じように&lt;code&gt;max-width: 100%;&lt;/code&gt;とするやり方。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&amp;quot;video&amp;quot;&amp;gt;
  &amp;lt;iframe width=&amp;quot;560&amp;quot; height=&amp;quot;315&amp;quot; src=&amp;quot;https://www.youtube.com/embed/S5st_BGFpLI?rel=0&amp;quot; frameborder=&amp;quot;0&amp;quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;.video {
  width: 100%;
}

.video iframe {
  max-width: 100%;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;p data-height=&#34;500&#34; data-theme-id=&#34;0&#34; data-slug-hash=&#34;mwdXrr&#34; data-default-tab=&#34;result&#34; data-user=&#34;diwao&#34; data-embed-version=&#34;2&#34; data-pen-title=&#34;Youtube埋め込み動画レスポンシブ デモ1&#34; class=&#34;codepen&#34;&gt;See the Pen &lt;a href=&#34;https://codepen.io/diwao/pen/mwdXrr/&#34;&gt;Youtube埋め込み動画レスポンシブ デモ1&lt;/a&gt; by diwao (&lt;a href=&#34;https://codepen.io/diwao&#34;&gt;@diwao&lt;/a&gt;) on &lt;a href=&#34;https://codepen.io&#34;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;
&lt;script async src=&#34;https://production-assets.codepen.io/assets/embed/ei.js&#34;&gt;&lt;/script&gt;&lt;/p&gt;

&lt;p&gt;これでも埋め込み動画を縮小させることは可能なのですが、画面サイズが大きくなった時に動画が大きくなっていかないですし、狭めた時にも上下に黒い余白ができてしまったりしてキレイに表示させることができません。&lt;/p&gt;

&lt;h2 id=&#34;iframeのpositonをabsoluteに&#34;&gt;iframeのpositonをabsoluteに&lt;/h2&gt;

&lt;p&gt;先ほどの問題を解決する方法はちょっと複雑で、iframeの親要素を横幅に対して可変させるように作り、かつiframeをその中めいいっぱい広がるようにしてレスポンシブ対応を実現させます。完成形のコードはこちら↓&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&amp;quot;video&amp;quot;&amp;gt;
  &amp;lt;iframe width=&amp;quot;560&amp;quot; height=&amp;quot;315&amp;quot; src=&amp;quot;https://www.youtube.com/embed/S5st_BGFpLI?rel=0&amp;quot; frameborder=&amp;quot;0&amp;quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;.video {
  padding-top: 56.25%;
  position: relative;
  width: 100%;
}

.video iframe {
   height: 100%;
   left: 0;
   position: absolute;
   top: 0;
   width: 100%;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ひとつづつ見ていきましょう。まずiframeの親要素である&lt;code&gt;.video&lt;/code&gt;から。&lt;code&gt;width: 100%;&lt;/code&gt;とし、画面の横幅に応じてwidthが可変するようにします。そして&lt;code&gt;padding-top: 52.65%;&lt;/code&gt;がポイントになるのですが、これは埋め込み動画の高さを確保するための指定です。&lt;/p&gt;

&lt;p&gt;上下のpaddingを%で指定した時、その値は親要素のwidthを基準に計算される、という特徴があります（詳しくはこちら → &lt;a href=&#34;http://diwao.com/2017/06/padding_margin_per.html&#34;&gt;上下のpaddingとmarginの%指定は親要素の横幅を基準に計算される - diwao日記&lt;/a&gt;）。&lt;/p&gt;

&lt;p&gt;これを応用すると、画面幅に応じて高さも可変する要素を作ることができまして、今回はそれを使います。 &lt;strong&gt;Youtube埋め込み動画の縦横比は16:9&lt;/strong&gt; なので、横幅を100%とした時の高さは9/16 * 100 = 56.25%となります。なので&lt;code&gt;padding-top:56.25%;&lt;/code&gt;で動画の高さが確保できるというわけです。&lt;/p&gt;

&lt;p&gt;このままだとpadding-topの分、子要素であるiframeが下に押し出されてしまうので、&lt;code&gt;.video&lt;/code&gt;に&lt;code&gt;postiion: relative;&lt;/code&gt;、iframeに&lt;code&gt;positon: absolute;&lt;/code&gt;と&lt;code&gt;top: 0;&lt;/code&gt;、&lt;code&gt;left: 0;&lt;/code&gt;を指定してiframeの位置を&lt;code&gt;.video&lt;/code&gt;の左上に重ねてあげます。&lt;/p&gt;

&lt;p&gt;あとはiframeに&lt;code&gt;width: 100%;&lt;/code&gt;、&lt;code&gt;height: 100%;&lt;/code&gt;とすれば、iframeが&lt;code&gt;.video&lt;/code&gt;をぴったりと覆う形となり、期待通りレスポンシブな動きをしてくれるようになるというわけです。&lt;/p&gt;

&lt;p&gt;&lt;p data-height=&#34;500&#34; data-theme-id=&#34;0&#34; data-slug-hash=&#34;MoWQwB&#34; data-default-tab=&#34;result&#34; data-user=&#34;diwao&#34; data-embed-version=&#34;2&#34; data-pen-title=&#34;Youtube埋め込み動画レスポンシブ デモ2&#34; class=&#34;codepen&#34;&gt;See the Pen &lt;a href=&#34;https://codepen.io/diwao/pen/MoWQwB/&#34;&gt;Youtube埋め込み動画レスポンシブ デモ2&lt;/a&gt; by diwao (&lt;a href=&#34;https://codepen.io/diwao&#34;&gt;@diwao&lt;/a&gt;) on &lt;a href=&#34;https://codepen.io&#34;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;
&lt;script async src=&#34;https://production-assets.codepen.io/assets/embed/ei.js&#34;&gt;&lt;/script&gt;&lt;/p&gt;

&lt;p&gt;分かりやすく説明できている自信はないですが、仕組みを分かってしまえば難しいことではないので、ぜひサイト制作に取り入れてみてください。&lt;/p&gt;

&lt;div class=&#34;kaerebalink-box&#34; style=&#34;text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;&#34;&gt;&lt;div class=&#34;kaerebalink-image&#34; style=&#34;float:left;margin:0 15px 10px 0;&#34;&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B01MYFIMHP/otaman0517-22/&#34; target=&#34;_blank&#34; &gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/61AtRMLViYL._SL160_.jpg&#34; style=&#34;border: none;&#34; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&#34;kaerebalink-info&#34; style=&#34;line-height:120%;/zoom: 1;overflow: hidden;&#34;&gt;&lt;div class=&#34;kaerebalink-name&#34; style=&#34;margin-bottom:10px;line-height:120%&#34;&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B01MYFIMHP/otaman0517-22/&#34; target=&#34;_blank&#34; &gt;大正義&lt;/a&gt;&lt;div class=&#34;kaerebalink-powered-date&#34; style=&#34;font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%&#34;&gt;posted with &lt;a href=&#34;http://kaereba.com&#34; rel=&#34;nofollow&#34; target=&#34;_blank&#34;&gt;カエレバ&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;kaerebalink-detail&#34; style=&#34;margin-bottom:5px;&#34;&gt;ポルカドットスティングレイ ユニバーサルシグマ/半泣きビビレコーズ 2017-04-26    &lt;/div&gt;&lt;div class=&#34;kaerebalink-link1&#34; style=&#34;margin-top:10px;&#34;&gt;&lt;div class=&#34;shoplinkamazon&#34; style=&#34;display:inline;margin-right:5px&#34;&gt;&lt;a href=&#34;http://www.amazon.co.jp/gp/search?keywords=%E3%83%9D%E3%83%AB%E3%82%AB%E3%83%89%E3%83%83%E3%83%88&amp;__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&amp;tag=otaman0517-22&#34; target=&#34;_blank&#34; &gt;Amazon&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;booklink-footer&#34; style=&#34;clear: left&#34;&gt;&lt;/div&gt;&lt;/div&gt;
</description>
    </item>
    
  </channel>
</rss>