OmniAICreator/Qiita-1.07M huggingface dataset:
swiftで背景とかテキストにグラデーションを設定

## グラデーションを設定

#### 背景に設定
```
// 縦向き
let gradient: CAGradientLayer = CAGradientLayer()
gradient.name = "gradationLayer"
gradient.frame = horizonView.bounds
gradient.startPoint = CGPoint(x: 0.5, y: 1.0)
gradient.endPoint = CGPoint(x: 0.5, y: 0.0)
let gradientColors = [UIColor(red: 225.0 / 255.0, green: 228.0 / 255.0, blue: 232.0 / 255.0, alpha: 1.0).cgColor, UIColor(red: 117.0 / 255.0, green: 46.0 / 255.0, blue: 228.0 / 255.0, alpha: 1.0).cgColor]
gradient.colors = gradientColors
verticalView.layer.insertSublayer(gradient, at: 0)


// 横向き
let gradient: CAGradientLayer = CAGradientLayer()
gradient.name = "gradationLayer"
gradient.frame = horizonView.bounds
gradient.startPoint = CGPoint(x: 1.0, y: 0.5)
gradient.endPoint = CGPoint(x: 0.0, y: 0.5)
let gradientColors = [UIColor(red: 225.0 / 255.0, green: 228.0 / 255.0, blue: 232.0 / 255.0, alpha: 1.0).cgColor, UIColor(red: 117.0 / 255.0, green: 46.0 / 255.0, blue: 228.0 / 255.0, alpha: 1.0).cgColor]
gradient.colors = gradientColors
horizonView.layer.insertSublayer(gradient, at: 0)


// グラデーションから色を変更したい時は、下記のようにlayerをhiddenにする
for layer in horizonView.layer.sublayers! {
　　　　if layer.name == "gradationLayer" {
  　　　　layer.isHidden = true
  }
}
```

#### テキストに設定
テキストをグラデーションにしたい時は下記のように、UIColor(patternImage: UIImage)で色を定義し、設定する。

```
let gradationImage = UIImage(named: "GradationImage")!
gradationTextLabel.textColor = UIColor(patternImage: gradationImage)
```


## できたもの
<img width="423" alt="スクリーンショット 2016-12-10 18.02.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/57963/133be4b7-a7a2-5de7-0026-b9454b4b5bed.png">
Spring MVC でネストされたフォームデータを受け渡しする

前提として、フォームデータといっているのは `Content-Type: application/x-www-form-encoded` で送信されるデータのことです。

Spring MVC のコントローラーで、ネストされたデータ構造を持つオブジェクトとして、フォームデータを受け取るとき、どのように送信すればよいか、というのが今回のテーマです。

# 環境

- Java 1.8.0_91
- Maven 3.3.9 (Maven wrapper)
- Spring Boot 1.4.0.RELEASE

```
$ ./mvnw -version
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T01:41:47+09:00)
Maven home: /Users/yo1000/.m2/wrapper/dists/apache-maven-3.3.9-bin/2609u9g41na2l7ogackmif6fj2/apache-maven-3.3.9
Java version: 1.8.0_91, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_91.jdk/Contents/Home/jre
Default locale: ja_JP, platform encoding: UTF-8
OS name: "mac os x", version: "10.11.5", arch: "x86_64", family: "mac"
```

# ネストされたフォームデータ

今回扱うのはこんなデータ。

```java:Receipt.java
public class Receipt {
    private long receiptId;
    private String shopName;
    private List<Item> items = new ArrayList<>();

    // Getter, Setter

    public static class Item {
        private long itemId;
        private String itemName;
        private int price;
        private int quantity;

        // Getter, Setter
    }
}
```

これをコントローラーで、以下のように受けたい場合を想定。**`＠RestController` や、`@RequestBody` は使用しないのが今回のポイント。(`application/json` では受け取らない。)**

```java:ReceiptController.java
@Controller
@RequestMapping("receipt")
public class ReceiptController {
    private ReceiptService receiptService;

    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public void post(Receipt receipt) {
        receiptService.create(receipt);
    }
}
```

# データの送信

以上のような場合に、どのようにデータを送信すればよいでしょうか。`application/json` で受けるわけではないので、JSON で送信することもできません。

以下に実際の送信例を挙げます。

```html:receipt.html
<form action="/receipt" method="post">
  <input type="text" name="receiptId">
  <input type="text" name="shopName">
  <input type="text" name="items[0].itemId">
  <input type="text" name="items[0].itemName">
  <input type="text" name="items[0].price">
  <input type="text" name="items[0].quantity">
  <input type="text" name="items[1].itemId">
  <input type="text" name="items[1].itemName">
  <input type="text" name="items[1].price">
  <input type="text" name="items[1].quantity">
  ..
</form>
```

このように、ネストされたフィールドへアクセスするのに必要なパスを、`name` 属性にガッツリ書いてあげないといけません。リストだと添え字の指定も必要なのでよりわかりづらい。

Javacript で jQuery などを使用している場合には、以下のように書くこともできます。

```js:receipt.js
var receipt = {
  receiptId: "1000",
  shopName: "おみせ"
};

for(var i = 0; i < 5; i++) {
  receipt['items[' + i + '].itemId']   = "200" + i;     // 2000, 2001, ..
  receipt['items[' + i + '].itemName'] = "しょうひん" + i; // しょうひん0, しょうひん1, ..
  receipt['items[' + i + '].price']    = "50" + i;      // 500, 501, ..
  receipt['items[' + i + '].quantity'] = "1" + i;       // 10, 11, ..
}

$.post({
  url         : "/receipt",
  data        : $.param(data),
  processData : false
}).done(function (data, textStatus, jqXhr) {
  // anything to do.
})
```

こちらの書き方もなかなかにアレですね。
と、こんな具合にすることで、`Content-Type: application/x-www-form-encoded` で、Spring MVC のコントローラーにデータを渡せるようになります。

エンドポイントのコンテンツタイプなどにこだわって実装したい場合には、覚えておくと良いかもしれません。
chrome extensionのマニフェストバージョンをアップデートする

## マニフェストのバージョンが古い
はるか昔に作ったchrome extensionをアップデートしようと思い立った。ソースコードを修正してダッシュボードから変更を公開しようとすると、マニフェストのバージョンが古いとのエラーが！バージョン２のマニフェストしか受け付けないようになっていた。

## 修正する
- `"manifest_version": 2`を追加
- `"version": "1.0.2"`の箇所を書き換える（versionが同じままだとエラーが出る）

昔はcrxとかいう形式でパッケージングしないといけなかったような記憶があるけど、今はzipパッケージでソースをアップロードできるようになっていた。
windows10から共有フォルダにアクセスできない場合

# 手順
1. コントロールパネル→ユーザーアカウント→windows資格情報の管理→windows資格情報の追加
2. 項目を入力して**OK**
3. 共有フォルダにアクセスできる

# 参考
https://dekiru.net/article/14524/
魔法のことば「そもそも」

## はじめに

この記事は[行動指針 Advent Calendar 2016](http://www.adventar.org/calendars/1751)の11日目の記事です。
後輩に誘われたのでやってみる。

## 行動指針

困ったら唱えてみよう魔法の言葉「そもそも」

例:

* この機能のこのバグが直せない…
    * そもそもこの機能必要なんだっけ？やりたいことは何？
* ここなんか挙動が変だな…
    * そもそもどんな挙動が正道なんだっけ？
* 問い合わせが多いから電話のサポート時間を増やそう
    * そもそもなんで問い合わせが多いんだっけ？問い合わせ自体を減らせないか？
* ここの文言AとB、どっちが分かりやすいかな
    * そもそもなんでここに注意文言必要なんだっけ？アイコンとか画像で説明できない？
* 納期に間に合わないから休出しなきゃ
    * そもそもその納期は守らなきゃいけない納期だっけ？
* 外部のAPIを使ってこういうことがしたいんだけどそれに対応するエンドポイントがない
    * そもそもそれAPI使う必要ある？代替手段あるのでは？
* タスクが多すぎて捌ききれない
    * そもそもそれ全部やらなきゃいけないタスク？


## まとめ

「そもそも」がゲシュタルト崩壊してきましたが、ようするに目の前の課題だけを見るのではなく課題の「本質」まで立ち返ることが大事だよってことです。
これが伝われば僕は満足です。

## おわりに

書いてみて思いましたが、人に伝えるために書いたというよりは自分がどういうことに気をつけて仕事をしているかの振り返り効果が大きいなと感じました。
皆さんも是非自分の行動指針を書き起こしてみましょう。
外部サービスと連携するときのゆる心得

初めて外部サービスのAPIを使って自分のシステムと連携するとき、
慣れている人には当たり前だけど見落としがちなことをまとめてみます。

## リクエスト・レスポンスのログをとる

普段、私たちはログの存在を忘れています。
必要になるのは、何か予期せぬことが起こったときです。

外部サービスへのリクエストについての問い合わせをする際には、
十中八九リクエストIDなどの情報が必要になります。

どこかのサービスと連携する時、そのサービスの全てを知ることはできません。
最低限「どんなリクエストを送り、何が返ってきた（あるいは返ってこなかった）」ということを
後からトレースできるようにしておきましょう。

## ログローテーションは忘れずに

ログローテーションを適切に行なっておきましょう。
Disk Fullでログが書き込めなくなって処理が止まる...
なんてことは無いだろうと思っても意外と起こるものです。

## タイムアウト時の挙動を決めておく

APIリクエストとは、いろんな理由で失敗するものです。
リクエスト側のサービスの問題の場合もあるし、API提供側の問題もあるし、
その間のネットワークの問題もあります。
エラーレスポンスが返ってくればいいですが、リクエストしたまま何も返ってこない
なんてことも時には起こります。

レスポンスは何秒まで待つのか、その後はどう処理するのか
といったことは、リクエスト側でポリシーをもっておくよいでしょう。

## レファレンスにないレスポンスが返っても問題ないようにしておく

XMLで返ってくるはずなのに、とあるエラーだけはHTMLが返ってきたりとか
レファレンスのエラーコードのリストには乗っていないエラーコードが返ってきたとか、
そういうことも少なからずあります。
自分のサービス側で新しくリリースされたAPIの機能に追随していなかった、なんてこともあるかもしれません。
何が返ってきても、処理が中断しないような実装にしておくことが重要です。

## リトライする

色々気をつけていても、理由がよく分からずリクエストが失敗することはあります。
HTTPステータスコードで500番台（サーバーエラー）が返ってきた場合などは、
リクエストの再試行（リトライ）を行なうと、リクエストの成功率が上がります。

[exponential backoffのメモ](https://siguniang.wordpress.com/2013/07/13/notes-on-exponential-backoff/)

## わからないことは聞く

どこまで情報が開示されていても、外部サービスはよそのサービスです。
中の人にしかわからないことだってあります。
聞ける窓口がある場合はさっさと聞いてみましょう。
どうしても情報が得られないときは「多分こうだろう」と見切りをつけることもありますが
不安要素はなるべく減らしたいものです。


## 終わりに

いかがでしたでしょうか。
リクエストする側のサービスの規模や性質によって、気をつける観点が変わってくるかもしれませんが、
大体上記のようなことを気をつけておくと、ストレスが少なく外部サービスとの連携ができるのではないかと思います。
それでは、楽しいAPIライフを。
Monacaというサイトを使って、プレゼンタイマーを作ったんですがうまく動作しません。どこが悪いのか、うまく作動できるにはどうすればいいでしょうか？ 

Monacaというサイトを使って、プレゼンタイマーを作ったんですがうまく動作しません。どこが悪いのか、うまく作動できるにはどうすればいいでしょうか？ 
３っつの時間が測れて、測り終わったら一つずつ鳴るようにしたいんですけどどのようにすればいいでしょうか？

そのほかに改善点や、他のプレゼンタイマーの作り方など教えてください。







    <html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
        <meta http-equiv="Content-Security-Policy" content="default-src * data:; style-src * 'unsafe-inline'; script-src * 'unsafe-inline' 'unsafe-eval'">
        <script src="components/loader.js"></script>
        <link rel="stylesheet" href="components/loader.css">
        <link rel="stylesheet" href="css/style.css">
        <script>
        </script>
    </head>
    <body>
    	<br />
        
        <form name="timer">
    <input type="text" value="">分
    <input type="text" value="">秒
    
    <input type="text" value="">分
    <input type="text" value="">秒
    
    
    <input type="text" value="">分
    <input type="text" value="">秒
    
    
    
    
    
    <br>
    <input type="button" value="スタート" onclick="cntStart()">
    <input type="button" value="ストップ" onclick="cntStop()">
    </form>
        
        
    </body>
    
    
    
    <script>
    
    var timer1; //タイマーを格納する変数（タイマーID）の宣言
    
    
    //カウントダウン関数を1000ミリ秒毎に呼び出す関数
    function cntStart()
    {
      document.timer.elements[6].disabled=true;
      timer1=setInterval("countDown()",1000);
    }
    
    //タイマー停止関数
    function cntStop()
    {
      document.timer.elements[6].disabled=false;
      clearInterval(timer1);
    }
    
    //カウントダウン関数
    function countDown()
    {
      var min=document.timer.elements[0].value;
      var sec=document.timer.elements[1].value;
      
      var min=document.timer.elements[2].value;
      var sec=document.timer.elements[3].value;
      
      
      var min=document.timer.elements[4].value;
      var sec=document.timer.elements[5].value;
      
      
     
      if( (min=="") && (sec=="") )
      {
        alert("時刻を設定してください！");
        reSet();
      }
      else
      {
        if (min=="") min=0;
        min=parseInt(min);
        
        if (sec=="") sec=0;
        sec=parseInt(sec);
        
        tmWrite(min*60+sec-1);
      }
    }
    
    //残り時間を書き出す関数
    function tmWrite(int)
    {
      int=parseInt(int);
      
      if (int<=0)
      {
        reSet();
        alert("時間です！");
      }
      else
      {
        //残り分数はintを60で割って切り捨てる
        document.timer.elements[0].value=Math.floor(int/60);
        //残り秒数はintを60で割った余り
        document.timer.elements[1].value=int % 60;
      }
    }
    
    //フォームを初期状態に戻す（リセット）関数
    function reSet()
    {
      document.timer.elements[0].value="0";
      document.timer.elements[1].value="0";
      
      
      document.timer.elements[2].value="0";
      document.timer.elements[3].value="0";
      
      
      document.timer.elements[4].value="0";
      document.timer.elements[5].value="0";
     
      
      document.timer.elements[6].disabled=false;
      clearInterval(timer1);
    }  
      
     
    </script>
    
    
    
    
    
    
    </html>
Thunderbird で 受信ボタンを押した時に imap フォルダ全てを受信

## 参考

* [How can I force Thunderbird to reload IMAP folder structure - Super User](http://superuser.com/questions/392320/how-can-i-force-thunderbird-to-reload-imap-folder-structure)

## 手順

* Config Editor で以下の値を true にする。

```
mail.server.default.check_all_folders_for_new = true
```

![スクリーンショット_2016-12-12_08-31-31.png](https://qiita-image-store.s3.amazonaws.com/0/25728/30bd9c88-dbd5-2929-e2a4-f597bfa9aae1.png)


![new.png](https://qiita-image-store.s3.amazonaws.com/0/25728/ecca235f-c3c2-be7b-f79e-ff44d00d5f38.png)
WebVR/A-FrameとGearVRで始めるVR開発


はじめに
===============

さて、今年はPSVR、Oculus、Vive、GearVRそしてGoogleのDaydreamがついに出そろい、VR元年とも言われています。
かくいう私もGalaxy S7を買ったのでGearVRも購入してみました。

スマホVRということで、PSVRやOculusとは格段に性能が劣るはずですが、それでも今まで経験したことの無い感じでした。

せっかくものもあるのでなんか開発してみたいと思い、いろいろ調べてみたところWebVRとA-Frameが面白そうだったので、
まずはこちらを試してみようと思います

WebVRってなに？
=================

WebVRとは名前からも予想が付く通り、Web技術でVRを作るためのAPIです。簡単に言えばブラウザでVRが出来るようになります。

特徴として以下があげられます。

- 専用のアプリケーションがいらない
- URLだけでコンテンツをシェアできる
- 専用のソフトが無くてもJSだけで開発が開始できる
- 遅い

専用のアプリケーションがいらない、というのはWebブラウザのみで実行できる、ということです。
もちろん、WebVRをサポートしている必要はありますがMozilla、Chrome、Samsung Internet(GearVR)とメジャーどころは一通り対応している状態です。
そのため、コンテンツをURLだけでシェアすることが出来ます。これはYouTubeが動画コンテンツの共有コストを劇的に下げたのと似ています。
また、そのような構造だとSecondlifeのようなメタバースも比較的作りやすいと思います。一つ一つの空間をURLで管理するのはSF感がありますね。
それを支援する要素として基本的にJSの追加APIにすぎないので、Unityなどの開発ツールを新規に導入する必要もないです。
ただし、現状だとただでさえ遅いVRがさらに遅くなるのでゲーム的なものは無理でしょうね。

A-Frameとは？
=================

[A-Frame](https://aframe.io/)はjQueryやthree.jsのようなVR向けのJSライブラリです。
Mozillaの[MozVR](https://mozvr.com/#start)というチームで開発されています。

WebVRはそれ単独ではコントローラとセンサー情報しかなく、そこから取得した値をWegGLとかで3D描画してやる必要があります。
そのため、結構複雑なのですがA-Frameはこれをタグベースで比較的容易に構築するためのツールキットです。

とりあえず、ともかく動かしてみましょう。

```html
<!doctype html>
<html>
  <head>
    <title>My first VR site</title>
    <script src="https://aframe.io/releases/0.3.2/aframe.min.js"></script>
    
  </head>
  <body>
    <a-scene>

      <a-sphere position="0 1.25 -1" radius="1.25" color="#EF2D5E"></a-sphere>
      <a-box position="-1 0.5 1" rotation="0 45 0" width="1" height="1" depth="1"  color="#4CC3D9"></a-box>
      <a-cylinder position="1 0.75 1" radius="0.5" height="1.5" color="#FFC65D"></a-cylinder>
      <a-plane rotation="-90 0 0" width="4" height="4" color="#7BC8A4"></a-plane>

      <a-sky color="#ECECEC"></a-sky>
      <a-entity position="0 0 3.8">
        <a-camera></a-camera>
      </a-entity>
    </a-scene>
  </body>
</html>
```

こんな感じでHTMLを保存します。まずは普通にPCのブラウザで開いてみましょう。下記のような3Dが描画されましたね？

次はこれをGearVRが立ち上がる場所に置きます。適当なサーバでもいいですし、私はDockerでローカルPCにHTTPサーバを立ち上げてWi-Fi経由でアクセスするようにしています。
これをSamsung Internet経由で立ち上げます。すると先ほどPCで視たのと同様のコンテンツが表示されかつヘッドトラッキングされるのが分かるかと思います。

ポイントというか注意点としてスクリプトは`https://aframe.io/releases/0.3.2/aframe.min.js`を使うということです。
0.3.2から仕様が結構変わってるらしく、GearVRではそれより前のバージョンのライブラリは正常に動作せずにレイアウトが崩れてしまいます。

MozVRや[公式で上がってるサンプル](https://aframe.io/examples/)も古いものが混じっているのでその場合はいったんソースをチェックアウトして、スクリプトのパスを変更してしまうのが良いです。

[Netflixアプリのような動画再生デモ](http://drawvr.com/living-room/)もあってこれはカスタムメイドとかMikulusみたいなバーチャルデスクトップもできるのではないかとひそかに期待。
※ スクリプトのバージョンを上げる必要あり。

開発環境
==========

基本的には何もいりません。エディタがあれば十分です。
ただ、それで３Dを作るのはやりツラいので、公式で[A-Frame Inspector](https://github.com/aframevr/aframe-inspector)というグラフィカルエディタも開発中です。
[こちらのページ](https://aframe.io/aframe-inspector/example/)からすぐに試すこともできます。

まとめ
=========

なかなか簡単に開発できるので、ちょっと色々試してみたいですね。
３Dセンスが無いのでどうなるかはわかりませんが...

それではHappy Hacking!

参考
=====

- [超お手軽VR開発フレームワーク　A-FRAME入門：第１回](http://roman-tech.hatenablog.jp/entry/2016/06/26/230823)
- [A-Frame Advent Calendar 2016](http://qiita.com/advent-calendar/2016/a-frame)
- [a-framer.com](http://www.a-framer.com/entry/introduction)
Link > Nintendo Open Source Software source code distribution page

https://www.nintendo.co.jp/support/oss/
> このページは、任天堂製品で使用されている、GNU Library General Public License 2.0、GNU Lesser General Public License 2.1、Mozilla Public License Version 1.1もしくはMini-XML License等のさまざまなオープンソースライセンス(総称して“OSSライセンス”)適用のオープンソースソフトウェア(“OSS”)のソースコード配布ページです。

ぱっとみて、取得したファイルのどこにGPLの記載があるのか不明だった。
grep検索でGPL記載を探すことになりそう。

ホームページにGPLの記載があっても配布ファイルにも記載がないといけないかは調査不足。

このような、企業がGPLライセンスコードを公開する方法は、今後自分が関係しそうで参考になる。

関連 https://www.gnu.org/licenses/old-licenses/gpl-2.0-faq.ja.html

### GPL記載例

3DSの`3DS_InternetBrowser_OpenSources_JP_US_EU_KR_TW_HK_CN_10.6.0`で確認したところ、`webkit/WebCore/platform/image-decoders/zlib`の`mozzconf.h`先頭などにGPLの記載が見つかった。

GPLの記載をした１つのファイルを用意するよりは、各ソースのヘッダに記載する方が扱い易いのかもしれない。
OpenVPNのTLSと暗号化を強くする

主に暗号化の面で。

# OpenVPN > 2.4
man→ https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage

GCMがサポートされた。ECDHもサポートされた。
ので、以下がとりあえず2.4系の最強設定。2.3系のクライアントはつなげないかも。
`cipher`のかわりに`ncp-ciphers`をつかいましょう。

```
cipher AES-256-GCM
ncp-ciphers AES-256-GCM
tls-version-min 1.2
tls-cipher TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384:TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384
reneg-sec 60

; compress lz4
compress lz4-v2
```

おまけとしてlz4対応も！`comp-lzo`はもう古い。

ログがこのようになっていれば[PFS](https://ja.wikipedia.org/wiki/Forward_secrecy)対応です。(ECDH**E**のEがついている)

```
Control Channel: TLSv1.2, cipher TLSv1/SSLv3 ECDHE-RSA-AES256-GCM-SHA384, 2048 bit RSA
```

## おまけ
- cipher や ncp-ciphers は `openvpn --show-ciphers` で出てくる中から選べます
- tls-cipher は `openvpn --show-tls` コマンドの実行結果中から選べます
- 楕円曲線の曲線の種類を選びたいなら `openvpn --show-curves` から選んで `ecdh-curve` に設定しましょう

# OpenVPN < 2.3
## TLSバージョンと暗号化アルゴリズムを強化

https://gist.github.com/pwnsdx/8fc14ee1e9f561a0a5b8#file-openvpn-conf
ここでは、以下のような設定が推奨されている。

こちらは、サーバ側に書く。

```
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384

reneg-sec 60
```

以下はクライアントとサーバーに書く。

```
cipher AES-256-CBC
auth SHA512
```

- 参考にしたURLに記載されていた以下の行は、試しても接続ができなかった。ECDHは未対応か？

```
;tls-cipher TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384
```



# 全バージョン共通
## TLS Auth (Static PSK)
https://community.openvpn.net/openvpn/wiki/Hardening
また公式ドキュメントでは、tls authを使うことが推奨されている。これは事前共有の全クライアント・サーバーの共通鍵で、DoSなどにより強くなる。
slick


## 概要

カルーセルの王道ライブラリ

具体的な使い方やデモは本家のサイトから
[slick - the last carousel you'll ever need - Ken Wheeler](http://kenwheeler.github.io/slick/)


## 準備

[npmからslick-carousel](https://www.npmjs.com/package/slick-carousel)をインストール

```javascript:javascript
import $ from 'jquery';
import 'slick-carousel';
```

```css:css
@import "node_modules/slick-carousel/slick/slick.scss";
@import "node_modules/slick-carousel/slick/slick-theme.scss";
```

このやりかたでもcssを取得できるが、不要なコードも含まれている。gifのパスとか。それがコンソールにエラーとして出てくるのが面倒くさいので、個人的には`libフォルダ`をつくって適宜必要な部分だけ読み込むようにしている。


## サンプル

以下、カスタマイズしたいときのメモ

### JS

#### スライドが切り替わる直前に、中央の両サイドのスライドを非活性化

```javascript
import $ from 'jquery';
import 'slick-carousel';

export default function initCarousel() {
    $(".js-gallery-carousel").slick({
        infinite: true,
        centerMode: true,
        arrows: true,
    })
    .on("beforeChange", (event, slick, currentSlide, nextSlide) => {
        deactivate(nextSlide);
    });
    deactivate();
}

function deactivate(nextSlide) {
    const INACTIVE_CLASS = "inactive";
    $('.slick-slide').removeClass(INACTIVE_CLASS);
    const $centerSlide = nextSlide != null
        ? $(`.slick-slide[data-slick-index="${nextSlide}"]`)
        : $(".slick-current");
    $centerSlide.prev().addClass(INACTIVE_CLASS);
    $centerSlide.next().addClass(INACTIVE_CLASS);
}
```

#### 瞬時に指定したスライドに移動

アニメーションを無効にするときの第三引数は`true`。無効にしたいから`false`を入れて時間を無駄にしたことがある。

```js
$carousel.slick('slickGoTo', slideIndex, true);
```


### CSS

#### outlineは消した方が美しい

```scss
.slick-slide{
	outline: none;
}
```

#### 矢印の色を変える

```scss
.slick-prev:before,
.slick-next:before{
    color: skyblue;
}
```

#### 矢印をオリジナルの画像にする

```scss
.slick-arrow{
	&:before{
		opacity: 0;
	}
}
.slick-next{
	background-image: url(../img/arrow_right.png);
}
.slick-prev{
	background-image: url(../img/arrow_left.png);
}
```

#### ページャの色を変える

```scss
.slick-dots li.slick-active button{
      background-color: #f00;
}
```

#### 高さが変わってしまう場合

```scss
$slick-height: 90px;
$slick-width: 280px;

.multiple-items{
    width: $slick-width;
	height: $slick-height;
    margin: 0 auto;
}
.slick-list,
.slick-track{
	width: $slick-width;
	height: $slick-height;
}
```


> 参考
[レスポンシブに強いカルーセルスライダーslickの使い方](http://gimmicklog.main.jp/jquery/549/)
[【jQuery】レスポンシヴにも対応したクオリティの高いカルーセル・スライダー［slick］の使い方。](http://on-ze.com/archives/2563)
[レスポンシブ対応のjQueryカルーセル 「slick」](https://sakic.jp/blog/web/jquery-slick)
[slick.jsの使い方まとめ](http://cly7796.net/wp/javascript/plugin-slick/)
技術英語 > The alternative of ... [unwinding] your way through a lot of logic

@ Code Complete (No. 18400 / 36077)

> The alternative of setting a return value and then **<font color=red>unwinding</font>** your way through a lot of logic can be harder to follow.

https://www.merriam-webster.com/dictionary/unwind
> a :  to cause to uncoil :  wind off :  unroll
...
> to undo (a financial arrangement or position) through the necessary legal or financial steps <unwound most of its natural gas hedges — New York Times>

http://ejje.weblio.jp/content/unwind
> 解く、巻き戻す、くつろがせる

「多くのロジックを通る道を解きほぐす」というような意味なのだろう。

winding road(曲がりくねった道）を「まっすぐな道」にするというイメージでunwindというのがありそう。

<hr>
関連して思い出したのは

rewind

Fortranでファイルの読取り位置を先頭に戻す時にrewindを使ったような。
また、DLTを読む時などにもrewindしたような気がする。

<hr>
unwinding から関連して思い出したのは

ツギハギスタッカート

リファクタリングの歌だと勝手に思っている。
Docker と Docker Compose をインストールする（Centos7.2）

Docker と Docker Compose のインストール手順

## Dockerインストール

### yumアップデート

```bash
yum -y update
```

### Dockerインストール

```bash
curl -sSL https://get.docker.com/ | sh
```

[参考サイト]https://get.docker.com/

### 自動起動設定・サービス開始

```bash
systemctl enable docker.service
systemctl start docker.service
```

### プロキシ設定

プロキシ配下の環境の場合は以下の設定を行う。

```bash
mkdir /etc/systemd/system/docker.service.d; cd $_
vi http-proxy.conf
```

http-proxy.confの内容は以下の通り。

```text
[Service]
Environment="HTTP_PROXY=http://192.168.X.X:8080"
```

```bash
systemctl daemon-reload
systemctl restart docker
systemctl show --property=Environment docker
```

以下のように表示される。

```text
Environment=HTTP_PROXY=http://192.168.X.X:8080
```

## Docker Composeインストール

```bash
curl -L "https://github.com/docker/compose/releases/download/1.9.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version
docker-compose version 1.9.0, build 2585387
```

[参考サイト]
https://docs.docker.com/compose/install/
Vim と マクロ

この記事は[株式会社ネクスト(Lifull) Advent Calendar 2016](http://qiita.com/advent-calendar/2016/lifull) の１２日目です。

## この記事の対象とゴール

**対象**
Vim を使ってるけど マクロ とかいまいち使ってない人、どう使うか迷う人。
**ゴール**
なんとなくマクロを使っていこうかなという気になる。
**注意**
なお、この記事はエディタ宗教戦争を助長するものではありません。

## わたしとVim

丸5年くらい Vim を使っています。 
そこまで長いわけじゃないけど、 Vim は好きです。
２こくらいですが、 **[プラグイン](https://github.com/simeji/winresizer)** も書いたりしてます。
最近は go で **[CLIツール](https://github.com/simeji/jid)** を書いたりしているのですが、これも Vim で書いてます。

そんなふうに プログラムを書いているときなど、 Vim のマクロはちょっとした時に便利です。
私の使い方を書こうと思います。

## マクロとは

タイプした文字をレジスタ{0-9a-zA-Z"}に記録できます。
詳しくは、

```
:h complex-repeat
```
をご覧ください。

## 効率的に利用する

マクロの開始は q{0-9a-zA-Z"} で実行できますが、押しやすいので `qq` をよく使っています。

これを、

```js
a = data['name']
b = data['age']
aa = data['weight']
bb = data['height']
```
こんな感じにしたいとします。

```js
name = data['name']
age = data['age']
weight = data['weight']
height = data['height']
```
ハッシュのキーと変数名を揃えたいみたいな感じのときですね。

正直、このケースは以下で置換すれば一発です。

```
:%s/\v^[^ ]+(.+\['(.+)'\])$/\2\1/g
```

ただ、そういう場合だけでもないと思うので、今回はマクロを作るバージョンでやってみます。
実際問題、正規表現作るよりもマクロでやってしまったほうが早いケースも多いです。

### マクロを作るときに意識していること3つ

A. 行単位の処理を意識する
B. 登録開始直後に最初に決まったポジション（だいたい先頭）に移動するコマンドを入力する
C. 登録終了時は次に処理したい行に移動してから終了する

というところです。

### 実際に作ってみる

まず、ファイルの始めに行ってからスタートするので、 `gg` ですね。

1. `qq` でマクロの登録を開始します。
2. 上記の B を意識して、 `0` で先頭に行きます。(`^`でもいいですが、この場合どちらでも構いません、場面によって使い分けて下さい)
3. `dt␣` で左辺の文字列を消します。
4. ハッシュのキーの部分に移動して内容をコピーしたいので、 `2t'` で移動、そして `yi'` でヤンクします。
5. また `0` で先頭に戻り、`P` でペーストします。
6. 最後に C を意識して `j` で下の行に移動し、`q` を押してマクロの登録を終了します。
`3@q` で完了です。

### デモ

上記の操作をしたgifがこちら。
![macro.gif](https://qiita-image-store.s3.amazonaws.com/0/30588/9c4edd7d-022a-2031-0e9e-e60b555d7731.gif)

今回はシンプルな例ですが、いろんな発展も上記の、[3つ](#マクロを作るときに意識していること3つ) を意識すれば使い勝手良く、色々と効率化できると思います。

## 最後に

ネクストは Vim が好きなエンジニアも好きじゃないエンジニアも募集しています。
明日は リモートワークの話みたいです。
SORACOM Dash Button を作った話

> この記事は、[SORACOM Advent Calendar 2016](http://qiita.com/advent-calendar/2016/soracom)の 12/11 分の記事です。

## 前書き

我が家にも Amazon Dash Button がやってきました。
すでにハックされている人が[たくさんいらっしゃる](http://qiita.com/tags/AmazonDashButton)のですが、この記事もその n 番煎じです。
また、本来用途外の使用方法を推奨するものではありません。もし試される場合には、自己責任でお願いします。

## 発端
12/11に開催された BIG Raspberry JAM Tokyo 2016 にブース出店するため Amazon Dash Button をラズパイにつなげて遊んでいたのですが、その事をFBに投稿したら、押したらSIMが届くボタンが欲しいという方がいたので、作ってみました。

![FB](https://qiita-image-store.s3.amazonaws.com/0/30051/32ffd120-38dd-1c15-cbe9-f1158f61415b.png)

## デモ動画
動作してる様子
<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr"><a href="https://twitter.com/j3tm0t0api">@j3tm0t0api</a> SORACOM Dash Button <a href="https://t.co/GJM6Q34IZN">pic.twitter.com/GJM6Q34IZN</a></p>&mdash; moto (@j3tm0t0) <a href="https://twitter.com/j3tm0t0/status/808016657671041024">2016年12月11日</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

## 構成
![SORACOM Dash Button Architecture](https://qiita-image-store.s3.amazonaws.com/0/30051/a86a6e87-2bc0-47f3-b5d0-9ba9870a17ea.png)

### フロントエンド
Raspberry Pi 上では、[Dasher](https://github.com/maddox/dasher)が動いており、ボタンが押されたことを ARP で認識すると、Beam の HTTP endpoint を叩きます。

```json:dasher/config/config.json
{"buttons":[
  {
    "name": "SORACOM Dash Button",
    "address": "xx:xx:xx:xx:xx:xx",
    "interface": "wlan0",
    "url": "http://beam.soracom.io:8888/order",
    "method": "POST",
    "json": true,
    "body": {"orderItemList":[{"productCode":"4573326590020","quantity":1}],"shippingAddressId":"xxxxxxxxxxxxxxxxxxxxxxxxxx"}
  }
]}
```

この例では "SORACOM Air SIMカード サイズ:ナノ（データ通信/SMS） 1枚" が発注されます。productCodeや、送付先のアドレスIDは、[APIドキュメントページ](https://dev.soracom.io/jp/docs/api/#!/ShippingAddress/listShippingAddresses)などで事前にしらべておきましょう。

### バックエンド
バックエンド側は Beam -> API Gateway -> Lambda の王道パターンです。デプロイなどが楽になるので、[Chalice](https://github.com/awslabs/chalice) を使っています。

```python:app.py
from chalice import Chalice
from soracom.client import *

app = Chalice(app_name='soracom-dash-button')

@app.route('/')
def index():
    return {'status':'ok'}

@app.route('/order', methods=['POST'], api_key_required=True)
def order():
    print app.current_request.json_body
    client = SoracomClient()
    client.auth()
    res = client.post("/orders", payload=app.current_request.json_body)
    order_id = res['orderId']
    return client.put("/orders/"+order_id+"/confirm")
```

重要なのは、SORACOMの認証情報の渡し方ですが、拙作の soracom client がアクセスキーにまだ対応していないので(これは近日中に対応したいなぁ...)、Lambda の環境変数に SORACOM_EMAIL / SORACOM_PASSWORD を設定しておく必要があります。また、APIキーも作成しておきましょう。

### Beam 設定
Beamの設定は、API Gateway の FQDN や APIキーを設定するくらいで完了です。
![Beam設定](https://qiita-image-store.s3.amazonaws.com/0/30051/dc61b71f-a955-db4c-a26d-0194d8617c95.png)

## おわりに
Chalice、Ruby の　Sinatra っぽい感じで簡単にバックエンドのコードが書けるので、気に入りました。SORACOM Beam の裏で使うのにちょうどいいですね。
ちなみに今回使ったボタンは、洗剤のボタンなので、在庫が切れる前に元の設定に戻す予定です。

次の記事は、[tatsuyukiさんの「SORACOMで早口言葉練習(音声認識)」](http://qiita.com/tatsuyuki/items/dc18ce48b259684a0541)です！
Carbonでの時刻比較

# Carbonとは
日付や時刻を簡単に扱うことができるPHPのAPI。

# この機能はCarbonにはないのか？
現在の時間（日付なし）を取得して、その時間は大学の授業の何限に当たるかを調べるという機能を実装したかった。
1限なら8:30~10:15の間だが、```between```メソッドを用いると引数の日付ごと比較されてしまい、時間のみの比較ができないようで、うまくいかなかった。
仕方なく次のような実装にした。

```
$dt = Carbon::now();
$nowtime = $dt->hour * 60 + $dt->minute;
$period = 0; //以下のifに引っかからなかったら授業時間外。
if (8 * 60 + 30 < $nowtime and $nowtime < 10 * 60 + 15) $period = 1;
 //1限の時間中なら$periodに1を代入。以下同様。
if (10 * 60 + 25 < $nowtime and $nowtime < 12 * 60 + 10) $period = 2;
if (13 * 60 < $nowtime and $nowtime < 14 * 60 + 45) $period = 3;
if (14 * 60 + 55 < $nowtime and $nowtime < 16 * 60 + 40) $period = 4;
if (16 * 60 + 50 < $nowtime and $nowtime < 18 * 60 + 35) $period = 5;
```

Carbonに日付は関係なく時間だけを比較するメソッドは用意されてないんですかね。
ご存知の方がいれば教えてください。

(追記)
コメントをくださった方の助言で解決しました！
ありがとうございます！
朝会、夕会を価値あるものにするための観点と方法

デイリースクラム、スタンドアップミーティング、朝会、夕会と色々呼び名はありますが、１日の進捗などを確認するものになります。


# 朝会

出勤時間のすぐにやるのが通常です。
朝に行われるため、前日やった作業の確認、課題などのシェア、今日やることの確認が行われます。
１人ずつ順番に全員が自分の話をします。

# 夕会

夕方に行われます。
今日行った作業の報告が中心となります。

# どちらがいいのか？

個人的には夕会より朝会の方が好みです。
なぜなら、自分が今からやることが整理されてから作業を開始しようと思うからです。
夕会は時間帯の関係で、いまからやる１日の作業が共有されるのではなく、今後の日程でやることのような、ふわっとしたものになりやすいです。
また、夕方だとプログラミングに集中している時間を切ってしまいやすかったり、別の打ち合わせなどがあり、参加できない人が居るなど、弊害が多いように思います。
よほどの理由がない限り朝会の方がベターなケースが多いでしょう。


# デイリースクラムの進め方

この、朝会or夕会をデイリースクラムと呼ばせてもらいます。
では、どのように進めると良いのでしょう。

一番は情報のシェアです。
進捗確認とこれからのアクション、そして問題、課題です。
基本的に長い打ち合わせになってはいけません。出来れば10分以内に終わらせるくらいが良いでしょう。
スタンドアップミーティング形式で全員立って行うことが基本とし、長くミーティングしない形で行います。

このデイリースクラムが長くなってしまうチームでは
ときに問題や課題が出てきたときに機能の開発のより細かな話をその場でしてしまうことも多いです。
そういう話題が出てきたときには、全員が聞くべき話では無いときには、「このあと話しましょう」と言って、その場では次の人の話を聞きましょう。

このデイリースクラムを行うときは、カンバンを使って各人の作業を見ながら話をスタイルが多いでしょう。
時間短縮のために、進捗状態を共有する以外のチケットはこのミーティングの前に動かしましょう。
ここでは全員の時間を使っていると言う意識をもって、事前の準備が行われるように考え方を促していく必要があります。


## 終わりに

前回のKPTとも同様なのですが、ここで上がった課題は日々の進捗に大きな影響を与えます。
あとで話し合うと言うアクションをすることが多いのですが、このアクションの中身が翌日の課題に上がらないようにしっかり対処となる行動に仕上げましょう。

また、進捗に関しては遅れた作業が見えた場合に、スケジュールを変えるべきか、リカバリするのか、別の人をアサインするのか、その判断を素早く出来る材料がこの会でシェアされるようにしましょう。
ただただ報告するだけの会であれば毎日行う必要はありません。
問題発見を最速でキャッチアップするための会だという認識で行うと、非常に有意義な会になっていくことでしょう。
Adobe XDおすすめオンライン記事

2016年3月から今まで私が見た中で特にオススメの記事・リソースをまとめました。Adobe XD自体の使い方だけの紹介です。

この記事は、[Adobe XD Advent Calendar 2016](http://www.adventar.org/calendars/1485) の穴埋め記事です

# 読んでおきたい記事

* [新UXデザインツール Adobe XD。
作業がはかどる便利ショートカット機能13個まとめ](http://photoshopvip.net/adobe-xd-shortcuts)  
初期のかなり秀逸な使い方集。オープンパスは、Opt+deleteの方をおすすめします。
* [How To Create Icons In Adobe XD](https://www.smashingmagazine.com/2016/07/how-to-create-icons-adobe-xd/)  
これを訳している人いないんですが、イラストチックなアイコンであればこれはピカイチ。画像見るだけで使い方がわかります。
* [AdobeXDを業務でバリバリ使ってる所感書く](http://qiita.com/ampersand/items/7e6115ec495f51d7fe98)  
デザイナーではない使い込んだ方のお話。というか、使い込んだ方の記事自体が少なめではある
* [Adobe XD Advent Calendar 2016](http://www.adventar.org/calendars/1485)  
幅広い内容が集まってます

# 公式

* [Adobe Experience Design製品紹介ページ](http://www.adobe.com/jp/products/experience-design.html) お役立ち度：★  
リリースごとの新機能を確認したいときくらいか。実は「Adobe XDの開発について」という英語版しかないXDの設計者・開発者さんたちが守っている製品としての原則何かが読めます
* [Adobe Experience Design（Beta）ヘルプ](https://helpx.adobe.com/jp/experience-design/topics.html)お役立ち度：★★  
読むなら最初に！
* [Adobe Experience Design（Beta）ヘルプ　ヒントとコツ](https://helpx.adobe.com/jp/experience-design/topics.html)お役立ち度：★★★  
これを読まずしてAdobe XDの快適ライフはありえません！
* [UserVoice](https://adobexd.uservoice.com/)お役立ち度：★  
「Adobe XD Feedback : Feature Requests & Bugs」…サイトタイトルをこれを書くにあたって初めて知りました。日本語でもGoogle翻訳とかで頑張って読んでくれるので**日本語OK**。圧倒的に英語のほうがレスは早いので英語の勉強にどうぞ…違う製品に絡むバグだったりすると、他のチームに要望送ったほうがいいよというアドバイスも貰えたりします。
* [Adobe Creative Station:tag Adobe XD](https://blogs.adobe.com/creativestation/tag/adobe-xd)  
更新情報からAdobe XDを使ったプロトタイピングまで

## SNS 
お役立ち度：★★

動画でのTips投稿と、マメに返事をくれるし、Liveもやってるのでソースとしてはいいですが、英語のみなのでおまけで。ただ、@AdobeXDとか　#AdobeXDと書いて投稿しているものは全世界分読んでるみたいで、時々日本語であってもアドバイスくれます。

* [Twitter](https://twitter.com/adobexd)
* [Facebook](https://www.facebook.com/AdobeExperienceDesign/?fref=ts)
UrlエンコードをするVBAマクロ

```vbnet


Option Explicit

'#-----------------------------------------
'# 文字列をURLエンコード
'#-----------------------------------------

Public Function encodeUrlUtf8(ByRef strSource As String) As String
    Dim objSC As Object
    
    Set objSC = CreateObject("ScriptControl")
    objSC.Language = "Jscript"
    encodeUrlUtf8 = objSC.CodeObject.encodeURIComponent(strSource)
    Set objSC = Nothing
    
End Function

'#-----------------------------------------
'# セルの値をURLエンコード
'#-----------------------------------------
Function encodeCellUrl(targetCell As Range) As String

    encodeCellUrl = encodeUrlUtf8(targetCell.value)
   
End Function

'#-----------------------------------------
'# URLエンコードメイン処理
'#-----------------------------------------
Sub encodeUrlMain()

    Dim targetRange As Range
    Dim targetCell As Range
    
    Set targetRange = Range("C3:C21")
    
    For Each targetCell In targetRange
        targetCell.Offset(0, 1).value = encodeCellUrl(targetCell)
    Next
    
End Sub
```
http://komet163.blog36.fc2.com/blog-entry-18.html
なんとなくやらないKPT

# KPTとは

チームメンバ全員を集めた振り返りの作業です。
１週間〜4週間に１回行います。自分のところでは変化も大きく、改善スピードをあげたいため１週間に１回行っています。

KPTはアジャイル開発の中でもいちばん重要なプラクティスだと私は考えています。
なぜなら改善活動の問題をチームメンバ全員から吸い上げるための重要な機会だからです。

- K(Keep)
    - よかったこと
    - いい出来事
- P (Problem)
    - 問題、課題
    - 障害になっていること
    - 認識を合わせたいこと
- T (Try)
    - やること、やりたいと思ってること
    - 技術的チャレンジなど

の３つをポストイットに記述して上げます。



# なんとなくにならないKPTは

Problemには何らかの対処や共通認識が絶対に必要です。
いくつもProblemが出てくると、重要だけど大変な問題を適当に決めて、そのKPTの会が終わってしまうことがあります。
これは絶対に駄目です。
Problemは上がったモノに対して全て何らかの対処があるかを議事録した方が良いと思います。


次に問題に対する対処の追い方です。

KPTにTODOを加えたKPTTやActionを加えたKPTAと呼ばれる方法もあります。

ここで重要なのはProblemに対して、Actionを起こすべきことを決めた段階で、必ず１人をアサインします。
複数をアサインしたときも必ず主担当を決めます。そうしなければ、問題が見えただけで安心してしまい、なんのアクションも起こされないからです。

次に、このActionの内容は次回のKPTで必ず進捗を確認します。もし、何も動きが見られない場合、さらに次のKPTの確認事項として残し続けます。
それが活動として動き出した段階でOKとなり、リストから消します。
逆にProblemに対する対処行動が取れないときにはActionに上げてはいけません。
絶対やることのみをActionにしてください。

Problemに対して全てをActionする必要はありません。何らかの共通認識を確認し、現在は打つ手がないということもあります。それらは意識を合わせる、課題の情報をシェアするということが重要なのです。

Actionに絶対の責任を感じるような仕組みでKPT進めるようになりましょう


# まとめ

KPTはウォーターフォールの開発であっても是非取り入れて貰いたいプラクティスです。
定例進捗を説明するだけではなく、問題点を吸い上げる重要な機会になり、開発スピードを向上し、あとにリスクを積み残さない作業になると思います！
UXのUIを考えた話

この記事は [Supership株式会社 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/supership)の11日目の記事になります。

こんばんは。@hiirokです。12月12日に投稿です(´・ω・｀)

今回はサービス開発でのUXのUIについて考えたお話を書きます。
あ、UXとかUIとか、バズワード言っちゃってるよと思います？もう流行ってないですか。。。というか略してないで日本語で言いなさいよ。。。はい、ごもっともです。良いタイトル思いついたらあとで書き直します。


言葉の定義や解釈は様々あると思いますが、本記事では以下のように扱います。

- `UX`: `User Experience`の略
- `UI`: `User Interface`の略
- `Experience`: 可視化しないと目に見えない体験
- `Interface`: 何かと何かが接する面
- `User`: `Experience`に接する人、利用する人


## サービス開発におけるUXのUIとは？
変なタイトルをつけたことで前置きが長くなりましたが、そろそろ本題へ。

サービス開発では、利用者にどんな体験をしてもらってどういった価値を提供するのかを考える必要があります。さらにプロジェクトチーム全体でその共通認識を持っていると、スムーズにサービス作りを進めることができます。


![skitched-20161212-010951.jpg](https://qiita-image-store.s3.amazonaws.com/0/55413/f0fa8c7f-ffe0-be30-7379-ae4db2af7d95.jpeg "skitched-20161212-010951.jpg")



その共通認識を作るために、現在担当している「[Poptalk-タレントとファンのチャットコミュニティ](https://poptalk.to/)」というサービス開発でおこなった取り組みをご紹介いたします。


## グラレコ風カスタマージャーニーマップ

サービス全体のユーザーゴールや体験設計が不明確な点があったため、プロジェクトメンバーが同じ方向に向かって進めるように、ジャーニーマップを作りたいねという話になりに行った取り組みです。

### 作成プロセス
本来は実地調査をベースに行うと思いますが、時間の制約と、メンバーの意識のすり合わせの目的もあったので、まずは数人でライトに妄想しながらやりました。

- メインとなるターゲットの簡易ペルソナを決める
- そのペルソナをイメージしながら、LIVEに行くときの行動を時系列で洗い出し
    - ざっくばらんにポストイットに話しながら書きながら
- 雑にグルーピングしながらホワイトボードに貼っていく
- フェーズを分ける（認知・情報収集・参加・共有・継続的接続）
- 感情曲線を書く
    - その時の感情もざっくりメモ
- ユーザーが価値と感じているところ、課題なところを洗い出し
    - この時点で、Poptalkはどうやって使われたらいいのか、どんな価値提供したいのかブレストへ
- グラレコ風に清書
- チームそばの壁に張り出して共有

こんな感じでポストイットで洗い出したものを
![Kobito.o8SbFr.png](https://qiita-image-store.s3.amazonaws.com/0/55413/63828e40-bd15-5e2a-97f3-852f2d34ca48.png "Kobito.o8SbFr.png")

こんな感じでイラストでより強調した表現に
![Kobito.XMoQaF.png](https://qiita-image-store.s3.amazonaws.com/0/55413/b6dbb414-cfac-0d6c-40c6-31d38d3ed533.png "Kobito.XMoQaF.png")


どんな役割をもったメンバーでも分かりやすく、楽しんで見てもらえるように、あえて手書きでの描き起こしを選択しました。
チームの席からも常に目にはいるところの壁に張り出し、ふとした雑談でもジャーニーマップを使って話せる環境を作れたらいいなぁと考えました。


### 良かった点
やってみて個人的に良かったことを何点か。

- ワークショップ形式でみんなと一緒に作ったことで、いろんな視点があって共通認識作れた
- まとめている時点でサービスの使うシーンやアイデアが生まれ企画に活かすことが出来た
- 嫌でも目に付くようにすることで、プロジェクト外の人にも狙いや方向性が伝わった

### 悪かった点
もちろん狙い通りにはいかず課題もいっぱいです。

- 初回の共有としては効果的だったが、なかなか議論を生み出すところまで持っていけなかった
- グラレコへのあこがれで（手段の目的化）で満足してしまい、更新していくことができない

ちゃんと共有したいという思いが強すぎたところが一番の反省点でした。日々の業務に取り込むにはもう少し余白があったり、仕掛けが必要そうなのでまた改善して行きたいなと思います。


##おわりに
サービスを作るときには、どうしても目に見えない体験など抽象的な概念を扱うため、図やイラストを用いた可視化表現は有効だと思います。
プロジェクトやサービスの成長フェーズに合わせて最適なカタチがあるので、今後もUXのUIを考えていければ良いなと思います。

12日目の [Supership株式会社 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/supership) は @yoskhdia さんです。どうぞお楽しみに！
angular2でのwebpack.config.js

webpackを使用してAngular2アプリケーションを作りたく、
いろんなサイト（ほとんど外国のサイトしかない）を参考に調べましたが、
webpack.config.jsの内容がわけわからなく困りました。

他にもそうゆう人がいると思いますので、自分の理解した知識を
自分が作ったwebpack.config.jsにコメントする形で記載していきたいと思います。

```webpack.config.js

//webpackの本体
var webpack = require('webpack');

//--- Plugins ---

//これは結構重要で分割したBundleを纏める時に使用します。
var CommonsChunkPlugin = webpack.optimize.CommonsChunkPlugin;

//index.html等の基点となるhtmlファイルにWebpackで生成したBundleを埋め込みます。
//ようは自動で<script src='bundle.js'/>を挿入してくれます。
var HtmlWebpackPlugin = require('html-webpack-plugin');

//これは名前の通り、任意のファイルを指定した場所にコピーします。画像ファイル等をそのままdistフォルダにコピーしたい時に便利です。
var CopyWebpackPlugin = require('copy-webpack-plugin');


//--- Config ----

module.exports = {

  //エントリーファイルを指定します。
  //エントリーファイルは一つでも構いませんが、巨大なファイルとなりロードにも時間がかかる為、
  //以下のように複数分けるのが、Angular2では一般的みたいです。
  entry: {
    //ブラウザの互換性を保つ為のライブラリ等を定義します。
    'polyfills': './src/polyfills.ts',
    //サードパティ製のライブラリやAngular2本体のライブラリ等を定義します。
    'vendor': './src/vendor.ts',
    //アプリケーションのルートを定義します。
    //ここから派生するロジックは全て纏められます。
    'app': './src/main.ts'
  },
  output: {
    //出力先を指定します。
    path: './dist',

    //Bundleとして纏めたファイルの名前を指定します。
    filename: '[name].[hash].js',

    //webpackでは以下のようにコードを分割し遅延してロードすることができます。
    // https://webpack.github.io/docs/code-splitting.html
    //その時の分割されたファイルの名前を指定します。
    //※間違ってるかもしれません。知っている方がいたら教えて欲しいです。
    chunkFilename: '[id].[hash].chunk.js',
  },
  module: {
    //loaderはrequireで便利にモジュールを読込めるようにする定義です。
    //便利なのがangular2-template-loaderです。
    //後は特にややこしいオプション等は書いていないので、見たまんまな感じです。
    loaders: [
      {
        test: /\.ts$/,
        loaders: [
          'awesome-typescript-loader',

          //Angular2のロジック中に記載されたtemplateパスを考慮して読込んでくれます。
          //ようは以下のような定義を考慮してくれます。
          //※これがないとtemplateUrlのパスを解釈してくれません。
          //
          //@Component({
          //  selector: 'my-app',
          //  templateUrl: './app.component.html',  ←ここ
          //  styleUrls: ['./app.component.css'],
          //})
          'angular2-template-loader'
        ]
      },
      {
        test: /\.html$/,
        loader: 'raw-loader',
        exclude: ['./src/index.html']
      },
      {
        test: /\.css$/,
        loaders: ['to-string-loader', 'css-loader']
      },
      {
        test: /\.(png|jpe?g|gif|svg|woff|woff2|ttf|eot|ico)$/,
        loader: 'file-loader'
      },
      {
        test: /\.json$/,
        loader: 'json-loader'
      },
    ]
  },
  plugins: [
    //分割したエントリーファイルを考慮してロードできるようにします。
    new CommonsChunkPlugin({
      name: ['vendor', 'polyfills']
    }),
    //生成したBundleを埋め込むhtmlファイルを指定します。
    new HtmlWebpackPlugin({
      template: './src/index.html',
      chunksSortMode: 'dependency'
    }),
    //これはそのままです。出力フォルダにファイルをコピーします。
    new CopyWebpackPlugin([
      { from: 'src/assets', to: 'assets' }
    ]),
  ],
  //requireで省略可能な拡張子を定義します。
  //例えば、'ts'を定義していますので、main.tsはrequire('main')で読込めます。
  resolve: {
    extensions: ['', '.ts', '.js', '.json', '.css', '.scss', '.html'],
  }
}

```

全てのソースは、以下にアップしています。
https://github.com/kostera/simple-angular2-webpack

たいした内容ではないですが、分からない所や、間違っている所等あれば、なんでもコメント下さい。
2Dアクションゲームでキャラと地形との当たり判定を取った後の処理についてのまとめ

【 [Tekka Advent Calendar 2016](http://www.adventar.org/calendars/1727)　2日目参加記事】

2Dアクションゲームのキャラと地形の当たり判定について語りたいと思います。
厳密には、当たり判定を取った後の処理について。


たとえばこんな感じに接触した場合に、どう復帰させればいいのか。
![00.png](https://qiita-image-store.s3.amazonaws.com/0/106059/37338653-152a-a10d-aa59-061b2abe5570.png)

多分上方向にずらしてやるのがいいですよね。こう。
![01.png](https://qiita-image-store.s3.amazonaws.com/0/106059/e49b6ece-ce0d-f19f-1faf-e7c238617d89.png)

では、これは？横がよさそうです。
![03.png](https://qiita-image-store.s3.amazonaws.com/0/106059/9ab84cf9-6e58-a7ca-ee49-8257d623bef7.png)

ではこれなら。上と横、どちらにずらすのがいいでしょうか。
![04.png](https://qiita-image-store.s3.amazonaws.com/0/106059/6a2f0443-ab55-cf58-9239-95f0ad02325e.png)


上でしょうか？しかし画面右上方向への移動により地形に重なったなら、横にずらすのがいいはず。
![05.png](https://qiita-image-store.s3.amazonaws.com/0/106059/35789002-79b4-7ae4-854e-b9c73f7512b4.png)
![06.png](https://qiita-image-store.s3.amazonaws.com/0/106059/01191490-a2b6-1738-581b-ea223e9d1caf.png)

左下方向への移動なら、上方向にずらすのがいいですよね。
![07.png](https://qiita-image-store.s3.amazonaws.com/0/106059/306bd126-d590-da20-9e15-719e33fff9e5.png)
![08.png](https://qiita-image-store.s3.amazonaws.com/0/106059/03da0ca2-b86c-9eda-2dc2-11c5cf543296.png)

ということで、筆者はこんな感じでキャラと地形の当たり判定を取っています。
![09.png](https://qiita-image-store.s3.amazonaws.com/0/106059/a6fe01b1-6000-c784-7ede-77fd4cbd5d7b.png)

現在開発中のゲームはこのアルゴリズムで動いています。

[Runners（仮題）](https://twitter.com/aini_bellwood/status/807975927955103745)

タイムアタックに特化した2D横スクロールアクションゲーム。
ステージエディタも実装予定。

TekkaSNSにて先行配布しています。
一般配布は12月末～1月予定。その後も随時アップデート予定。

斜面の当たり判定についてもいつかやりたい。
【メモ】ディスプレイへの信号をオフにする

# memorandum
ディスプレイの電源をPCから操作するのは、普通は無理だと思いますが
電源オプションで「〇分間操作がないとディスプレイを消す」みたいなことは簡単にできるよ。という備忘録

```c
PostMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 1);
PostMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2);
```

これだけ。

終わりだよ～
あれ!? position: fixed;が効かない!?

急になぜかposition: fixed;が効かない!
振る舞いとしては absolute になってしまう。
そんなことが2,3回あって、いい加減気付こうという戒めで書きます。

## 親要素に transform プロパティが与えられていないか
position: fixed; を指定している要素の親に transform プロパティを与えてしまうと、
その要素より下では position: fixed;は効かなくなってしまう様でした。

###けれども 塊でアニメーションさせた後に何かをfixedさせたい…
以下の様に、「何か変形を初期値に戻す」ということであれば

```css
#foo {
    transform: translateY( 100% );
    transition: transform .4s;
}

#foo.is-active {
   transform: translateY( 0 );
}
```

変形後の transform プロパティを none にしてあげると、
子要素以下は position: fixed;が効く様になります！

```css
#foo {
    transform: translateY( 100% );
    transition: transform .4s;
}

#foo.is-active {
   transform: none;
}
```

いやいや、変形後の状態で fixed させたいんだ！
ということであれば、親要素でまるっと動かすのは得策ではないと思いました。
Dockerのストレージドライバの変更

# 目的
Ubuntu 16.04でDockerのストレージドライバを変更する。

Ubuntu 16.04でDockerをインストールするとaufsなどが
デフォルトで選択されます。本記事ではストレージドライバの変更例を提示します。

# 変更手順

## 概要
/etc/default/dockerを変更することを書いている記事も
見られますが、Ubuntuでは原則としてsystemdを利用しているため、
設定ファイルが異なります。
具体的には、"/lib/systemd/system/docker.service"
を対象として変更を行います。

## 設定ファイルの書き換え

ここではoverlay2を利用するように設定します。
/lib/systemd/system/docker.serviceを変更します。

```text:変更前(一部抜粋)
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd://
```

ExecStartの末尾に利用したいストレージドライバを記述します。
ここではoverlay2を指定します。

```text:変更前(一部抜粋)
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd:// --storage-driver=overlay2
```

## 設定の適用
設定を反映して、dockerdを再起動します。

```Bash:dockerd再起動
sudo systemctl daemon-reload
sudo systemctl restart docker
```

## 結果の確認

docker infoコマンドを実行してストレージドライバが
任意のものになっていることを確認します。
ここでは、Storage Driverがoverlay2になっています。

```text:dockerの設定確認
Containers: 0
 Running: 0
(省略)
Storage Driver: overlay2
 Backing Filesystem: extfs
Logging Driver: json-file
Cgroup Driver: cgroupfs
(省略)
```
UnlimitedHandで手の状態をなんとなく取得

# Goal
手の状態（開く･閉じる）をそれなりの制度で取得する。

# Reference
いつもの公式
[UnlimitedHand リファレンス (Unity用)](http://reference.unlimitedhand.com/ja/unity/)

# デバイスについておさらい
そもそも、UnlimitedHandって何をしているの？というところ。
手の状態を取得するのは、シートについている8つのフォトリフレクタというセンサーです。
[HWの構造](http://dev.unlimitedhand.com/ja/hardware/InputTech.html)に説明が載っていますが、このセンサーによって筋肉の動きがわかるらしいです。


ただし、ここで取得される値が厄介で、同じ人でやっても手の状態とセンサ値がきれいに一致して取れないです。まして違う人になれば倍くらい値がずれることもありました。
そんなわけで、ただ閾値を決めて手を開いている、閉じているということはわかりません。

# 手の開閉状態を取得する
[Falconer](http://dev.unlimitedhand.com/ja/unity/falconerPrj.html)では手の開閉で鷹がつついてきます。
ここではどのように手の開閉を検知しているのか参考に、いろいろいじってみました。

```csharp
public class HandPhysicsControllerInput : MonoBehaviour{
    public UH uhand;

    [HideInInspector]
    public int[] uPRSum = new int[8]; 	//Sum of the Sensors' Values 

    [HideInInspector]
    public int count;					//Count Number to calculate the Averages of the Sensor's Values

    [HideInInspector]
    public int[] uPRAve = new int[8];	//Averages of the Sensor's Values
    public int FIRE_THRESHOLD_OPEN = 30;    //Fire Threshold which compares with "PRVARSum"
    public int FIRE_THRESHOLD_CLOSE = -30;    //Fire Threshold which compares with "PRVARSum"

    public int PRVARSum;				//Finger Movement SUM
    bool isHandOpen = true;

    void Update () {
        count++;
        for (int i = 0; i < 8; i++)
        {
            uPRSum[i] += uhand.UHPR[i];
            uPRAve[i] = uPRSum[i] / count;
        }
        if (30 < count)
        {//reset the count
            for (int i = 0; i < 8; i++)
            {
                uPRSum[i] = uPRAve[i];
            }
            count = 1;
        }

        PRVARSum = 0;
        PRVARSum += (uhand.UHPR[1] - uPRAve[1]);
        PRVARSum += (uhand.UHPR[2] - uPRAve[2]);
        PRVARSum += (uhand.UHPR[3] - uPRAve[3]);

        if (PRVARSum > FIRE_THRESHOLD_OPEN)
        {
            // 手を開く処理
        }
        else if (PRVARSum < FIRE_THRESHOLD_CLOSE)
        {
            // 手を閉じた処理
        }
     }
}
```

Falconerをもとにいじっていたので、その時のいろいろが無駄に書かれていたりする気もするのですが
フォトリフレクタの1,2,3の平均値との差分合計が閾値を超えたら手を開閉したと判断しているみたいです。
閾値に固定値を使うのがいいのかは微妙な気もしますが、自分で動かしてみると大体とれるっぽいです。

# おまけ
現在アマゾンでUnlimitedHandが値引きされているみたいです（クリスマス？）
ここにきている人はすでに持っている人ばかりだと思いますが、両手用にいかが？
大規模アジャイルの手法

スクラム開発の開発チームは8人程度までが良いとされています。
その他のメジャーなアジャイル開発手法は１０人程度までのチームを想定しているように思います。

では、限られた期間でもっと沢山の開発をしなければならない時、大規模なプロジェクトではアジャイルは実現できないのでしょうか？
そんなことはありません。日本ではまだまだ事例や実績が聞かれることは少ないかもしれませんが大規模なプロジェクトにアジャイルを適応したものがあります。



## スクラム オブ スクラム

スクラム開発の経験がある人であれば導入しやすいかもしれません。

10人程度のスクラムチームを複数作り、それらを連携して動かすための考えです。
各スクラムチームのスクラムマスタや代表が集まりデイリースタンドアップなどを行って、各チームの状況を共有し合ったり、各チームのリリース物を集めてスプリントレビューなどを行ったりします。


## Scaled Agile Framework (SAFe)

第２世代のリーンプロダクト開発手法と呼ばれているようです。

チームによるソフトウェア開発は待ち行列でモデル化できる。

- 到着感覚のばらつき
- バッチサイズとそのばらつき
- チームの稼働率

#### 要求

- ユーザーストーリーとユースケース

#### プロジェクト管理

- スクラムの良さを活かしたまま行うための複数チームの間の連携方法
- スクラムオブスクラムの考え方に似ていますね

#### アーキテクチャー

- 開発中だけではなく、常にある程度先行して考えるべき
- これは技術リーダーなどの選出が必要かもしれません

#### チームを超えた広がり

- 関心ごとの異なるステークホルダ間でどう共有するか
- これは昨日の記事でずらずら書きましたね。ちょっとまとめきれてはいませんが。

単純にSAFeを見ると複雑に見えるがスクラムの素直な拡張と思えば理解しやすいと思います。

詳しいことはこちらのサイトで紹介されています。
[SAFe GUIDE](http://www.scaledagileframework.com/)



## Disciplined Agile Delivery（DAD）

通常のスクラム開発ではスプリントで出来る範囲を各スプリントで決めていき、大きな方針はプロダクトオーナーが専任で考えて決めていました。

DADとは、プロジェクトの意思決定をフェーズわけすることで明確化します。
プロジェクトのフェーズを 「方向付け」、 「構築」、 「移行」の3フェーズに分けて考えます。

- 方向付けフェーズ：ステークホルダーの合意形成、チームの編成、企業の方針の準拠と初期計画
- 構築フェーズ：スクラムのスプリントを回しているような工程。
- 移行フェーズ：運用準備、エンドユーザー教育、利害関係者の受け入れ作業


他にも幾つかの手法があります。
詳しくはこちらのページなどに紹介されています。
[A Process Decision Framework](http://www.disciplinedagiledelivery.com/)

エンタープライズ向けであり「ウォーター・スクラム・フォール」との呼ばれる形やアジャイルに含まれていない、ルールや教育、運用、などの話もあります。



## まとめ

まずはアジャイルは自分のチームから始めるものですが、自分の会社は大きいから出来ないとは思わずに、これらのアジャイル手法をより深く勉強してみてはどうでしょうか。
Rubyの事がもっと好きになれるかもしれないサイトなどの紹介

皆さんが濃い技術の話をしていますので、この辺で箸休めとして、自分がRubyの事をもっと好きになったきっかけのサイトやメーリングリストの情報を紹介させていただきたいと思います。

# Rubyist Magazine(るびま)

http://magazine.rubyist.net/

言わずと知れた、、日本 Ruby の会の有志による Rubyist の Rubyist による、Rubyist とそうでない人のためのウェブ雑誌です。

このサイトでは、様々なRubyに関わる人たちへのインタビュー記事やRubyが採用されているサービスの裏側の話だったり、標準ライブラリの説明だったりと、Rubyに関する有益な情報から、単純に読み物として面白いコンテンツがあり、Rubyを触る人には是非是非、読んでみてほしいなと思います。

特におすすめなコンテンツは、「Rubyist Hotlinks」と「Rubyの歩き方」です。

## Rubyist Hotlinks

Rubyに関わっている人へのインタビューが書かれていまして、ユニークな方が多く、読んでいてとても楽しいです。
下に、個人的に好きな記事のリンクをいくつか貼っておきます

* [卜部昌平さんのインタビュー](http://magazine.rubyist.net/?0042-Hotlinks) - この方のはっきりものを言う感じが大好きです
* [中田伸悦さんのインタビュー](http://magazine.rubyist.net/?0009-Hotlinks) - とにかく、パッチについての話が多めです
* [須藤功平さんのインタビュー](http://magazine.rubyist.net/?0053-Hotlinks) - 会社の話とかの考え方がかっこいいです

## Rubyの歩き方

http://magazine.rubyist.net/?FirstStepRuby

初めて、Rubyを始めようという方にお勧めのページになります。
各号に絶対載せているというのは伊達ではなく、必要十分な情報が簡潔によくまとまっているので、ここを読めば始めるのに必要な情報にアクセスできること間違いなしです。
公式のRubyのページにこのページへの直リンクが存在していてもいいのではないのかな？と思うくらいです。

# メーリングリスト

https://www.ruby-lang.org/ja/community/mailing-lists/

上記ページから登録が行えますが、メーリングリストで読める出来事として、「[1.9からHashが登録順になった経緯](http://ruby.11.x6.nabble.com/ruby-list-43857-Hash-td3541167.html)」などは、とても印象的でこの出来事を読んでからよりRubyが好きになりました。


# 最後に

るびまやメーリングリストを読むと、様々な人が関わることでRubyが出来ているんだなということが実感として沸いて来て、今までよりRubyが好きになれるんじゃないかなーと思い紹介させていただきました。

また、Rubyの開発者のまつもとさんが日本人であるために、Rubyはいろんな情報が日本語でも充実して読むことが出来、とても幸せだなと思ってます。

つたない文章にお付き合いいただき、ありがとうございました。
プレーンテキストでFontAwesomeのアイコンを確認

マヤ暦セールで75%OFFのIntelliJ IDEAを引っかかって以来、プログラム系のIDEを完全に切り替えたUI屋さんの@risayです。最近はデザイン作業などが多く、たまーにTypeScriptによるJavaScript書く程度なので、かなりオーバースペック気味に使っています。

# FontAwesomeのアイコンをテキストファイルでプレビュー

さて、今回は仮置きアイコンから実際のWebサイトまで利用まで便利なFontAwesomeフォントをPlain Textで設定せず表示できるJetBrainsのIDE小ネタです。デザイン作業中に発見しました。
![image](https://qiita-image-store.s3.amazonaws.com/0/10363/a550bd96-8fcb-e8d4-446b-5a934eff79e4.png)

このフォント、もともとWebフォントとして使うことを想定されているため、普通の文字では使わない領域にアイコンが指定されています。HTMLでもなければ入力も面倒でローカルで確認することは簡単でもありません。そこでIntelliJ IDEA(※JetBrainsのIDEであればOK)です。

## 導入手順

1. Font Awesome サイトから フォントをダウンロードする
2. ダウンロードしたファイルを解答し、OTFフォントをインストールする(図はMacの場合)![image](https://qiita-image-store.s3.amazonaws.com/0/10363/371a8319-d3d0-0b07-1a99-1e5491729b88.png)

## 使い方
準備はこれだけ。IntelliJ IDEA側に設定はいりません。

IntelliJ IDEAでテキストファイルを開き、Font Awesomeの[CheatSheet](http://fontawesome.io/cheatsheet/)からコピーするのですが、用意しているファイルをダウンロードしてみてください。

[FontAwesomeのアイコンをコピペしたテキストファイル](https://www.dropbox.com/s/90qhdqalut3uo14/icons.txt?dl=0)

もちろんどんなエディタでもフォントをわざわざ指定すればローカルでもプレビューできるのですが、設定なしでこれだけ見えるのはありがたいです。
![image](https://qiita-image-store.s3.amazonaws.com/0/10363/dd71e520-cf4a-01eb-2875-fd290d089126.png)

残念ながらこの表示はちょっとだけ不安定で、フォントの方のバグなのか、IntelliJ IDEAのほうでこのフォントが出てくる過程が無茶なのか、もともと空白になってしまうアイコンもあります。

## 何に使えるの？

ニッチすぎる利用法ですが[Adobe XD](http://www.adobe.com/jp/products/experience-design.html)のUIデザインを行っているときに、こんな風につかうとアイコンを見ながらテキストファイルの変更を利用して表示を変えられるようになります。
![ezgif.com-optimize (2).gif](https://qiita-image-store.s3.amazonaws.com/0/10363/a45d3b08-2014-a437-01e1-a75af4246772.gif)

アイコンを確認可能なテキストファイルとして手元においておけるので手間が減りました。かなり素早いアクセスになります。

取り扱い注意な部分もあり一発ネタ的な側面が強いですが、IntelliJ IDEAの何故かできちゃうネタの一つとしてお楽しみくださいｗ