OmniAICreator/Qiita-1.07M huggingface dataset:
ComposerでAmazon マーケットプレイスWebサービス（MWS）のクライアントライブラリをインストールする

[Amazon マーケットプレイスWebサービス（MWS）](https://developer.amazonservices.jp/gp/mws/index.html)は、Amazonの出品者が、出品、受注、決済などを、既存システムと自動連携して効率的に処理するために提供されているAPIであり、PHPに向けてクライアントライブラリが提供されています。

しかし、このクライアントライブラリは圧縮されたZIPファイルで提供されており、現時点ではPackagistには公式に登録されていません。
そのため、公式に提供されているZIPファイルを使用して、このクライアントライブラリをComposerで管理するための方法をまとめました。

## composer.jsonの編集

composer.jsonに、それぞれAPIのクライアントライブラリごとに、ZIPファイルの場所と、autoloadの設定を記述します。

```json:composer.json
{
    "name": "my_project",
    "license": "proprietary",
    "type": "project",
    "repositories": [
        {
            "type": "package",
            "package": {
                "name": "mws/orders",
                "version": "2013-09-01",
                "dist": {
                    "url": "https://images-fe.ssl-images-amazon.com/images/G/01/mwsportal/clientlib/Orders/2013-09-01/MWSOrdersPHPClientLibrary-2013-09-01._V293335039_.zip",
                    "type": "zip"
                },
                "autoload": {
                    "classmap": ["src/MarketplaceWebServiceOrders/"]
                }
            }
        },
        {
            "type": "package",
            "package": {
                "name": "mws/feeds",
                "version": "2015-06-18",
                "dist": {
                    "url": "https://images-fe.ssl-images-amazon.com/images/G/01/mwsportal/clientlib/feeds/amazon-mws-v20090101-php-2015-06-18._V316922305_.zip",
                    "type": "zip"
                },
                "autoload": {
                    "classmap": ["src/MarketplaceWebService/"]
                }
            }
        }
    ]
```

## インストールの実行

あとは、repositoriesに記載したnameを使って、インストールするだけ。

```bash
$ composer require mws/orders mws/feeds
```
chrome系ブラウザで、flexboxによる上下左右中央指定がずれる

## よく知られている、flexboxを利用した上下左右のセンタリング
```slim
.border
  .chip
```

```scss
.border {
  display: flex;
  justify-content: center;
  align-items: center;
  width: 110px;
  height: 110px;
  background-color: aqua;
  margin-bottom: 50px;
}

.chip {
  width: 100px;
  height: 100px;
  background-color: red;
}
```

このように書くと、`justify-content: center;`と`align-items: center;`によって、子要素が上下左右中央になるのはよく知られたテクニックだと思います。
<img width="129" alt="スクリーンショット 2016-08-29 18.26.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/18796/5a04bf4b-183c-8212-b52f-ea866c6b7f03.png">

## 子要素(または親要素)の大きさが奇数になる時に、chrome系ブラウザで中央からずれる
こういうスタイルを適用するとどうでしょうか。上のスタイルの、`width`と`height`のみを変更したものです。

```scss
.border {
  display: flex;
  justify-content: center;
  align-items: center;
  width: 20px;
  height: 20px;
  background-color: aqua;
  margin-bottom: 50px;
}

.chip {
  width: 17px;
  height: 17px;
  background-color: red;
}
```

ちなみにcodepenに作成したのが[こちらになります。](https://codepen.io/unasuke/pen/qNZLNW)

### chrome 52.0.2743.116 (OSX 64-bit)
<img width="201" alt="スクリーンショット 2016-08-29 18.37.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/18796/785a26c9-0902-b64d-3fa2-2ad9fe4be65a.png">

### chrome 52.0.2743.116 m (Windows10 64-bit)
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/18796/6bf05225-3d1a-cd47-c23e-214f0a9ba06a.png)


### chromium 48.0.2559.0 (OSX 64-bit)
<img width="148" alt="スクリーンショット 2016-08-29 18.40.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/18796/1a2c70bb-4cb7-f24e-bea8-3269203b19a9.png">

### vivaldi 1.3.551.38 (OSX Stable channel)
<img width="147" alt="スクリーンショット 2016-08-29 18.41.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/18796/42283cab-7cf5-70d1-0d89-c17e06cfe0d5.png">

### firefox 47.0 (OSX)
<img width="144" alt="スクリーンショット 2016-08-29 18.38.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/18796/e9725bc1-bc3f-38f7-5476-5ef9ce102d0b.png">

### safari 9.1.2 (11601.7.7)
<img width="142" alt="スクリーンショット 2016-08-29 18.39.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/18796/148c465f-3246-a2cd-09cc-c31077df38f4.png">

### IE11 11.545.10586.0
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/18796/5797d98b-938e-47d8-75e1-95d6869e1e6b.png)

### Edge 25.10586.0.0
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/18796/97d8c40a-b44a-8759-48da-25bc079fddb4.png)


__センタリングされない！！！__

### 正確にはどのような問題か
様々な値を設定して確かめましたが、どうやら__「親要素の大きさが偶数(奇数)のとき、子要素の大きさが奇数(偶数)のとき、chrome系ブラウザでセンタリングされない」__ことがわかりました。親と子との奇偶が一致していないとダメなようです。[^1]

## ワークアラウンド
親と子の奇偶を揃えてやりましょう。

これは親が23px四方、子が19px四方、ブラウザはchromiumの場合です。
<img width="148" alt="スクリーンショット 2016-08-29 18.49.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/18796/da6b7965-bf45-b0dd-ce23-8df03ef872cf.png">


[^1]: 親要素、子要素共に正方形の場合しか試していません。
Hello World。はじめまして！

ITに関するのをGoogleで検索して、ついにこのページを知ってきました。
プログラミングに関する知識を記録・共有するためのサイトですね。

技術者の私は色々なことを知りたいので、いろいろ調べたい。
なお、調べたことをどこかに蓄積したいので、会員登録をしてみました。

知識をシェアして補完しあうことが役に立つと思います。
自分で情報や知識を発信したい。

##興味をもっといること
・IT知識
・プログラミングの知識
・システム設計
・開発支援のツール


##経験したプログラミングやシステム
・Pascal
・C/C++
・VB6
・Dot Net
・Java
・PHP
・Ruby
・JavaScript


##経験したフレームワーク
・Fatwire CMS
・UCM CMS
・HeartCore CMS
・SalesForece CRM
・Ruby on Rails

作文が苦手ですが、今回こそ挑戦してみても良いだろう　!!!
LISの環境を構築する

これまで自作パソコンにubuntu14.04をインストールし、CUDAやchainerを入れ、
http://qiita.com/masataka46/items/94417a5974dba810e7b8
DQNを使えるよう、もろもろのパッケージをインストールした。
http://qiita.com/masataka46/items/fddef236cb211ef3f145

今回は、ドワンゴさん提供のLIS（Life In Silico）
https://github.com/wbap/lis
を構築する。

##Ubuntu用Unityをインストールする。

```
wget http://download.unity3d.com/download_unity/linux/unity-editor-installer-5.3.4f1+20160317.sh
sudo sh unity-editor-installer-5.3.4f1+20160317.sh
```
pythonモジュールをインストールする。

```
cd project_dir
git clone https://github.com/wbap/lis.git
sudo pip install -r python-agent/requirements.txt
```

次に、curlを使うのでまずそれをインストールした後、カフェモデルをダウンロードする。

```
sudo apt-get install curl
./fetch.sh
```

いよいよ試運転する。まずpythonモジュールをサーバーとして稼働させる。

```
cd python-agent
python server.py
```
次にクライアントのUnity側を稼働させる。

```
./unity-editor-5.3.4f1/Editor/Unity
```

ここで「libpq.so.5がない」というエラーが出た。
ネットで調べると、PostgreSQLというものが必要なようだ。そこで

```
sudo apt-get -y install postgresql-9.3
```

とした後に再度

```
./unity-editor-5.3.4f1/Editor/Unity
```

とすると、今度はUnityの立ち上がりの時の画面が出た直後、応答がなくなり黒くなった。そこで、UnityのHPでしらべたところ、こちら
http://docs.unity3d.com/ja/current/Manual/TroubleShootingEditor.html
にネイティブでないドライブなどにインストールした場合、起動しないことがある、などと書かれているので、UbuntuをインストールしているSSD（ホームディレクトリ）にインストールしなおしてみる。

そうすると、今度はUnityのウインドウに続いて「resent」のウインドウが立ち上がったが、そのまま固まってしまった。

ここで改めて

```
sudo apt-get -y install postgresql-9.3
```
してから


```
./unity-editor-5.3.4f1/Editor/Unity
```

としても、やっぱりダメ。更に探していると、UnityのCommunityで同様の症状を発見した。
http://forum.unity3d.com/threads/starting-into-black-recent-screen.384332/
ここに従って、以下のものをインストールしてみる。

```
sudo apt-get install npm
```

すると、ようやく立ち上がった。
[Amazon Linux / Node] CertbotをインストールしてSSL対応する

## はじめに
Amazon LinuxへのCertbotインストールは現在非推奨ですが、
`--debug` オプションを付けることでインストールと設定が行えます。

## 証明書の作成
* 対象のインスタンスにsshログイン
* Webサーバーを立ち上げている場合は事前に止めておく
* セキュリティグループでIPアドレス制限など掛けている場合は、一時的にHTTPとHTTPSを 0.0.0.0/0 にして全て開放する
* gitからcertbotをcloneしてインストールする

```
$ git clone https://github.com/certbot/certbot.git
$ cd certbot/
$ sudo ./certbot-auto certonly --standalone -d {ドメイン名} --debug
確認ダイアログが出るので Agree を選択
```

## 証明書の自動更新設定
* crontabを編集して、毎月の初日にSSL証明書が更新されるように設定

`$ crontab -e`

* 以下の記述を追加して保存

```
# SSL証明書の期限を月1回更新
00 00 01 * * sudo /home/ec2-user/certbot/certbot-auto renew --standalone --debug --pre-hook "サーバー停止コマンド" --post-hook "サーバー開始コマンド"
```


## 証明書をnode.jsで読み込む
* 以下のようにして作成した証明書へのパスを通す

```
// 本番環境の場合、certbotの証明書を読み込む
if (process.env.NODE_ENV === 'production') {
  options = {
    key: fs.readFileSync('/etc/letsencrypt/live/{domainName}/privkey.pem'),
    cert: fs.readFileSync('/etc/letsencrypt/live/{domainName}/cert.pem')
  };
}
```

## サーバー起動して動作確認
* `https://{domainName}` に接続して、証明書情報を確認
スマホでWebフォント（英語）＆アイコンフォント

たまたま時間が空いたので、改めて調べなおしてみた＠自分用まとめ。

肝心の「日本語Webフォント」についてはまだ検証できてないのですが...
「英語とアイコンフォントなら全然問題なかったよー」という記事です。

### ■ 以前作成した某サイト内で使用したフォント
- 日本語（明朝体）：Hiragino Mincho ProN、ヒラギノ明朝 Pro W3、HG明朝b、serif 　※Mac＆Windowsに標準搭載のフォントから選択
- 英語（セリフ）：Old Standard TT（googleFonts）
- 英語（スクリプト）：Great Vibes（googleFonts）
- アイコンフォント：FontAwesome

※アクセス解析結果から、ほぼPCでのみ閲覧されているので、スマホはおまけ対応。

### ■ 検証したスマホ・タブレットとその結果
|機種名/OS|日本語（明朝体）|英語（セリフ）|英語（スクリプト）|アイコンフォント|
|:--|:--|:--:|:--:|:--:|
|iOS系|明朝体| ○ | ○ | ○ |
|Galaxy SC-02C（Android 2.3.4）|角ゴシック| ○ | ○ | ○ |
|Galaxy SC-04E（Android 4.2.2）|角ゴシック| ○ | ○ | ○ |
|DIGNO（Android 4.2.2）|角ゴシック| ○ | ○ | ○ |
|Nexus7（Android 4.4.2）|丸ゴシック| ○ | ○ | ○ |
|Xperia（Android 4.4.2）|丸ゴシック| ○ | ○ | ○ |
|AQUOS PHONE（Android 4.4.2）|丸ゴシック| ○ | ○ | ○ |
|Galaxy SC-04F（Android 5.0）|丸ゴシック| ○ | ○ | ○ |
|Nexus5（Android 5.1.1）|丸ゴシック| ○ | ○ | ○ |

おまけ：Windows7 の IE9（IETester） も iOS系と同じ結果でした。

### ■ まとめ
- 英語・記号の Webフォントは、少なくとも Android 2.3.4 以降で問題なく使用できる。（まだがんばって使ってる人がいるかもしれないので、表示されて安心。）
- Android系スマホには、CSSで設定した**「serif」系のフォントが搭載されていない**ため、明朝体ではなく、角ゴシックまたは丸ゴシック（標準フォント）で表示される。
- Android 5.1.x 以上は実機がないので検証できていません。

### ■ 課題
- 「日本語（明朝体）のWebフォント」を使ってみる。
- 日本語は英語と違い文字数が多く、そのままだととても重い。軽量化の方法は？
- ゴシック系・明朝系で、どんなフォントを設定すればよいのか？
UnityのWebGLで日本語を表示する

#問題

UnityでWebGL向けにアプリを出力した場合、アプリの文字が表示されない事があります。

例えば下のようにUnityのUIに日本語の表記を設定します。特に**何も設定せず**uGUIのTextコンポーネントでUIを表示しています。
![Screen Shot 2016-08-29 at 17.36.50.png](https://qiita-image-store.s3.amazonaws.com/0/12772/60be8cda-3e53-1a5a-1e57-68c36107dbc4.png)

これをWebGL向けに出力すると、下のように**日本語が表示されません**。
![Screen Shot 2016-08-29 at 17.39.51.png](https://qiita-image-store.s3.amazonaws.com/0/12772/9fba5f8f-c5fe-ee1c-d85c-80c5b83f775e.png)

##フォントのフォールバックはWebGLでは動作しない

問題は、Unityのフォントの初期設定がArialである事、
そしてUnityのTextを使用した際に標準設定で設定される**Arialフォントに日本語が含まれていない事**です。

![demo_unity_-_Unity_WebGL_Japanese_Font_-_WebGL__OpenGL_4_1_.jpg](https://qiita-image-store.s3.amazonaws.com/0/12772/57bd5c1d-143f-4457-e24a-e42d8d75b024.jpeg)


通常Unityは指定されたフォント（今回の場合Arial）に含まれない文字を使用する場合、他のフォントから文字を抽出します。しかしWebGLはこのフォールバックするようなフォントを内包していないため、**日本語の文字を取得出来ず空白として表示**している訳です。

#解決方法

この解決方法は、**日本語を含むフォントを設定**する事です。
実際に、日本語が含れているフォントの、Notoを使用してみます。

1.  [google noto](https://www.google.com/get/noto/#sans-jpan)のサイトより**Noto Sans CJK JP**をダウンロードし解凍します。
2.  NotoSansCJKjp-LightをProjectブラウザへドラッグ＆ドロップします。  
（Noto Sans CJK JPには日本語が含まれているので、NotoSansCJKjp-Light以外のフォントでもOKです）
3.  インポートしたフォントをTextのFontへドラッグ＆ドロップします。
4.  これでWebGLへ出力した際にも、日本語が表示されます。

![Screen_Shot_2016-08-29_at_17_42_05.jpg](https://qiita-image-store.s3.amazonaws.com/0/12772/b76dfce6-187e-4610-6a9d-55dcd95ce18b.jpeg)

![NotoSansCJKjp-hinted_and_demo_unity_-_Unity_WebGL_Japanese_Font_-_WebGL__OpenGL_4_1_.jpg](https://qiita-image-store.s3.amazonaws.com/0/12772/f31d236f-1072-ba07-2923-dc0f5bec59fe.jpeg)

![demo_unity_-_Unity_WebGL_Japanese_Font_-_WebGL__OpenGL_4_1__and_NotoSansCJKjp-hinted.jpg](https://qiita-image-store.s3.amazonaws.com/0/12772/e782b77d-b175-e3b4-9d2c-5812c55f8236.jpeg)

![Screen Shot 2016-08-29 at 17.59.24.png](https://qiita-image-store.s3.amazonaws.com/0/12772/1a46b993-9a82-ecf4-6692-2ad74735e724.png)
※フォントが違うので、表示する文字も変化しています

TextMesh（3DText）の場合も同様に、Fontを設定することで日本語表示が可能になります。

![demo_unity_-_Unity_WebGL_Japanese_Font_-_WebGL__OpenGL_4_1_.jpg](https://qiita-image-store.s3.amazonaws.com/0/12772/79dfddb0-a679-8af5-f2ed-e6a3c7cb1f68.jpeg)


#フォントのライセンスに注意

Fontにフォントを設定する方法を使用すると、日本語フォントを使用できるようになります。しかし、ゲームにフォントが含まれます。つまり**フォントの再配布**扱いとなります。

日本語向けのフォントは、ダウンロードして個人的に使用するのは認めていても、ゲームに同梱して使用すること（再配布）は認めていない事が多いです。

実際にフォントを利用する際には、よく**ライセンスを確認して下さい**。
（Notoは再配布可能なフォントの一つです。但し再配布するにはLICENSE_OFLを同梱する必要があります）

#参考
[Unity5.3のWebGLで日本語が表示されない！？-フェレット倶楽部の備忘録](http://ferret.gjgd.net/unity/unity5.3%E3%81%AEwebgl%E3%81%A7%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%81%8C%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84%EF%BC%81%EF%BC%9F)
[Unityで日本語フォントを使う-Unityゲーム開発所](http://unityleaning.blog.fc2.com/blog-entry-3.html)
messages.properties内のメッセージをIntelliJ IDEAに分かってもらう

IntelliJ IDEAはとても賢いので特に何もしなくても

1. メッセージコードを使っている文字列リテラル -> springのmessages.propertiesの定義箇所へジャンプ
2. messages.properties -> メッセージの使用箇所を一覧（find usage : Option + F7）
3. メッセージへの参照がある場合は色分け

をしてくれます。

![idea_1.png](https://qiita-image-store.s3.amazonaws.com/0/28162/10bf090d-5c0a-781c-3af0-7f4c723371f9.png)
メッセージ定義にジャンプできる（プレビューも）

![idea_2.png](https://qiita-image-store.s3.amazonaws.com/0/28162/0b85915c-f1c4-5d89-1276-a8e4456dc5d4.png)
メッセージへの参照がある場合はでオレンジ色になる

が、Bean Validationのエラーメッセージみたいにメッセージコードを`{`, `}`で囲んでいると

![idea_4.png](https://qiita-image-store.s3.amazonaws.com/0/28162/327d1765-d51b-6559-eb3d-94b80fd28ebc.png)

Cmd + カーソルを合わせてもプレビューできなかったり

![idea_5.png](https://qiita-image-store.s3.amazonaws.com/0/28162/7a3ab781-15cb-63c4-3ed2-2c85b21975e2.png)

参照されていない扱いになったりして、

- メッセージ内容を知るまでの操作手順が増える
- （未参照扱いになるので）うっかりメッセージ定義を削除してしまう可能性が高まる
- メッセージ定義を整理する際の障害になる

などのデメリットが増えます。

![idea_6.png](https://qiita-image-store.s3.amazonaws.com/0/28162/d8ff2425-c2b5-9ada-6d33-b8b89febbe65.png)

ですが、こうすることによりメッセージがプレビューできたり

![idea_6.png](https://qiita-image-store.s3.amazonaws.com/0/28162/e3f66ec9-1d30-5680-98b0-7f0b584daf65.png)

参照扱いにできて、find usageでも検索できるようになって少し便利になります。

### おまけ

2016/08 時点で解決できないタイプのメッセージ

```html:thymeleafのテンプレート
<script type="text/javascript" th:inline="javascript">
  var message = /*[[ #{my_message} ]]*/ 'ダミーのメッセージ';
</script>
```
javascriptで使うメッセージ

```properties:messages.properties
typeMismatch.com.example.MyType=独自の型を変換できなかった時のメッセージ
```
typeMismatch.* なメッセージ
Command line でサクッと計算をキメるなら bc & bc で時間計算もしちゃうぞ

こんにちは。 `bc` 使っていますか？ 電卓でやるような簡単な計算をすぐやるには便利ですね。たぶんスマホの電卓アプリを立ち上げるより速いです。


使い方は

```
$ bc
```

で起動して、計算式を書いて enter を押せば答が出ます。

```
3 + 2 [enter]
6
```

みたいな。

標準入力で計算式を食わせることもできます。

```
echo '3 + 2' | bc
```

みたいに。これは良いですね。 `bc` に食わせる前にいろいろな処理を挟むことができます。うまく使えば `bc` の機能を拡張することができます。 UNIX 哲学、ですね。

そこで、 `bc` で時間計算もしてみちゃいましょう。 9:30 から 13:15 までは何時間なのかを計算してみます。

`bc` に食わせる前に

- 9:30 -> 9.5
- 13:15 -> 13.25

みたいな変換をすれば、目的を達成できます。これをするのが次の script です:

```timereplace.rb
line = STDIN.gets.strip

ar = line.split(' ')

ar.each do |str|
	if str.include?(':') then
		time_ar = str.split(':')
		hour = time_ar[0].to_i
		min = time_ar[1].to_i

		hours = hour + min / 60.0
		print hours
	else
		print str
	end
	print ' '
end

puts
```

使い方は

```
echo '13:15 - 9:30' | ruby timereplace.rb
```

というふうに標準入力で計算式を食わせてやれば、

```
13.25 - 9.5
```

と、 `bc` で扱える計算式を吐きます。あとはこれを `bc` に食わせてやれば任務完了です。

```
echo '13:15 - 9:30' | ruby timereplace.rb | bc
```

で、 `3.75` という答が出てきます。

なお、演算子の前後に space を入れないと正常に動かないので、そこだけ注意してください。
$scopeを使わずにFormControllerを取得する


# 概要
AngularJSでJavaScriptから`$setDirty`や`$setPristine`を使う方法です。
たまに忘れてしまうので、メモとして残しておきます。


## HTML側

```html
<div ng-controller="SampleController as ctrl">
  <form name="ctrl.form">
    <!-- ここからフォーム
    <input type="text" ng-model="ctrl.text">
    <button type="button" ng-click="ctrl.save()" ng-disabled="ctrl.form.$pristine">Save</button>
    -->
  </form>
</div>
```

ControllerAsで指定したコントローラ名をフォームの名前の前に付けましょう。
この例では「ctrl.form」でアクセスしています。

## JavaScript側

```js
// ↓コントローラの書き方
// https://github.com/johnpapa/angular-styleguide/blob/master/a1/i18n/ja-JP.md
(function(){
	'use strict'

	// コントローラを登録
	angular
		.module('app')
		.controller('SampleController', Controller);

	// DI
	SettingController.$inject = ['$log'];

	// コントローラ
	function Controller($log) {
		// ビューモデル
		var vm = this;
		vm.save = save;

		// 保存
		function save() {
			$log.debug('保存');
			vm.form.$setPristine(); // 未入力状態に戻す
		}
	}
})();
```
this（を代入した変数名）とHTML側で設定したフォーム名を使います。
この例では「vm.form」でアクセスしています。
OS X　へ　CocoaPods　のインストール　簡単なようで簡単じゃなかった


1.ruby gemを最新にする

```
$ sudo gem update --system
```

2.インストール

```
$ sudo gem install cocoapods
```

以下のようなエラーが出ました

```
$ sudo gem install cocoapods
ERROR:  While executing gem ... (Errno::EPERM)
    Operation not permitted - /usr/bin/pod
```
    
この原因
「El Capitanからrootlessという概念が採用されたため」
これは、root権限を持つユーザでも
・/usr
・/sbin
・/System
へのアクセスに制限がかかり、Operaiton not permitted
が出る。
今度は　/usr/bin にインストールしようとしてエラーになる
フォルダ指定でインストールしてみる。
今回は/usr/local/bin 指定です。

3.フォルダ指定でインストール

```
$ sudo gem install -n /usr/local/bin cocoapods
Successfully installed cocoapods-1.0.1
Parsing documentation for cocoapods-1.0.1
1 gem installed
```

これで🆗
iPhoneで-webkit-overflow-scrollingを設定した要素が消える

##-webkit-overflow-scrolling

モバイル端末でoverfllow: scroll等の擬似フレームでのスクロールを通常のように慣性スクロールへ変更するときに指定する。
※Android4.4未満やiosなど
Android4.4以降のものは指定せずに慣性スクロールになっている

```css:css
div {
  -webkit-overflow-scrolling:touch;
}
```

##-webkit-overflow-scrollingを指定した要素をtouchすると消えてしまう。
モーダル等display: none;になっているものの中の要素へ指定するとtouchした瞬間に消えてしまう？

**解決法**
cssで-webkit-overflow-scrolling:touch;を指定するclassを作りfadeIn等のコールバックでクラスを追加する。
fadeOut時のコールバックではクラスを削除。

```css:css
.scrolling-touch {
  -webkit-overflow-scrolling:touch;
}
```

```javascript:javascript
$(function(){
  $('.target').fadeIn(1000, function(){
    $('.scroll').addClass('.scrolling-touch');
  });
  $('.target').fadeOut(1000, function(){
    $('.scroll').removeClass('.scrolling-touch');
  });
});
```
広告フィード出力時にInput is not proper UTF-8

## 現象
広告フィードファイルを出力したら、chromeとfirefoxなどで読み込みすると、エラーになります。

```
This page contains the following errors:
error on line 752 at column 910:Input is not proper UTF-8,indicate encoding!
Bytes: 0xE7 0x9C 0x8B 0xE8
```

## 原因
書いてる通り、UTF-8として不正な(変化できない)バイトが存在してるため

## 解決
不正なバイトを無くせば良いので、こちらを参考にしました。
http://stackoverflow.com/questions/8635578/how-to-check-whether-the-character-is-utf-8

scrubメソッドで一発でできる
以下はファイルパスを渡して、不正なバイトをなくして、ファイルへ書き直すこと

```rb
def delete_invalid_char(file_path)
  valid_string = File.read(file_path, :encoding => Encoding::UTF_8).scrub('')
  File.write(file_path, valid_string)
end
```


## 検証

* 不正なエンコードされていないか

    ```rb
    File.read('feed.xml').valid_encoding?
    ```

* フィード形式などが正しいかどうかを検証
https://github.com/alexdunae/w3c_validators

    ```rb
    require 'w3c_validators'

    include W3CValidators

    @validator = FeedValidator.new

    results = @validator.validate_file('feed.xml')
    ```
Flask + uWSGI + Redis + Docker + Nginx で開発環境からデプロイまで


今まで使ってこなかった Docker との距離感を探りながら使ってみてしっくりいった構成です。
とにかく使うことを目的としつつ、下記を目指しました。

- 開発環境をさくっと提供したい
- どうせだったら Docker のまま公開したい
- システムダウンなしで公開環境のコンテナをまるっと入れ替えたい



## 構成

構成はこちらの記事を参考にさせてもらいました。
1年前の記事ですけど、理解できたので。
http://techlife.cookpad.com/entry/2015/04/20/134758

### ソースコード
https://github.com/pm11op/dockersample


### 開発環境

![str_dev.png](https://qiita-image-store.s3.amazonaws.com/0/10160/d1b1cb45-93b7-4a27-d241-b6136f991481.png "str_dev.png")

スムーズな開発を行うために、サーバは Flask 組み込みのものを使っています。静的ファイルも Flask が処理します。
Redis も常に一括で立ち上がるように同一 Compose 内で管理します。

#### 開発環境の準備
下記手順でさくっと開発環境が準備できます

1. 最新のソースを git clone
2. ```$ docker-compose -f docker-compose.dev.yml build```
3. ```$ docker-compose -f docker-compose.dev.yml up -d```
4. ブラウザから localhost:3334 ひらく


### 公開環境

![str_prod.png](https://qiita-image-store.s3.amazonaws.com/0/10160/3c03b028-580b-a00d-4f49-e8a7090a3a51.png "str_prod.png")


アプリケーション用コンテナからマウントしたディレクトリに uWSGI の UNIX ドメインソケットを作成し、バックエンドへの通信は Nginx から uWSGI を介して行います。静的ファイルは Nginx が処理します。
その方が扱いやすかったので Nginx はコンテナ化していません。
Redis の更新は基本的に必要ないので、アプリケーションだけ更新できるように、Redis は別 Compose で管理しています。



### ステージング環境
公開環境と同構成です。


## デプロイ
デプロイは下記の手順で行います。
下記は公開環境のデプロイ手順です。

1. 公開サーバ上で最新のソースを git clone
2. (初回) ```$ docker network create sample_prod```
3. ```$ docker-compose -f docker-compose.prod.yml build```
4. ```$ docker-compose -f docker-compose.prod.yml up -d```
5. Nginx からの通信先を新しいコンテナに変更
6. Nginx リロード
7. 古いコンテナ stop & rm

![deploy.png](https://qiita-image-store.s3.amazonaws.com/0/10160/265acac2-4fd4-7231-6e59-daca75937f6c.png "deploy.png")


ここでミスったら意味ないので自動化した方がよいでしょう。
下記がすごく参考になりそうです。
Nginx 設定ファイルを自動生成してるあたりがおしゃれ
[Dockerを使ってWebアプリケーションをデプロイする](http://qiita.com/ka2n/items/9659cb2b083ab7dcd844)


プライベートリポジトリたててたら毎回 build してるとこを docker pull に置き換えられてよりそれっぽくなりそうですが、テキストオンリーな軽微な修正の場合 git pull だけで更新したいし...



## Docker 使ってみてミスったこと、困ったこと
まあ当たり前のことがほとんどなんですけどね...

- Redis イメージそのまま使ってたらリロードする度データ消える
	- → データディレクトリマウントで永続化
- 別 Compose で管理してるコンテナへの接続がめんどくさい
	- external_links でできたらいいのに
	- 下記参考になりました
		- [2つのdocker-compose間で疎通させる](http://qiita.com/takyam/items/1d4abedacaf9f6a86f9f)
		- [Compose File Reference](https://docs.docker.com/compose/compose-file/#/external-1)
- アプリケーションコンテナ作り直すたびにログが消える
	- → だからログディレクトリマウントしろと
- わかってないからだろうけど Dockerfile 内で相対パス使うとぐっちゃぐちゃなるから環境別 Dockerfile で散らかる
- CentOS7 でたまに「Driver devicemapper failed to remove root filesystem」っていうエラーが出て不要コンテナ消せなくなる
	- [こちらの記事](https://www.agilegroup.co.jp/technote/docker-devicemapper-unmount.html) を参考に umount しようとしたけどマウント自体はすでに解除されていた
	- Nginx stop すると消せる
	- まだ困ってる & 調査中
EXCEL > 関数 > STDEV > 不偏分散

```txt:動作確認
EXCEL 2013 on Windows 8.1 pro(64bit)
```

STDEV()とSTDEV.P()などある。

STDEV()には以下の記載がある。

https://support.office.com/ja-jp/article/STDEV-%E9%96%A2%E6%95%B0-51fecaaa-231e-4bbb-9230-33650a72c9b0
> 標準偏差は、n-1 法を使って計算されます。

http://oshiete.goo.ne.jp/qa/2503346.html
> 公式の違いは分母がn-1（STDEV）かn（STDEVP）かの違いしかありません。

不偏分散は結果に関して以下の記事が分かりやすい。
http://d.hatena.ne.jp/Rion778/20110217/1297935974

以下は式変形が分かりやすい。
http://www.sist.ac.jp/~kanakubo/research/statistic/fuhenbunsan.html
Mysql2::Error: Index column size too large. The maximum column size is 767 bytes.: CREATE  INDEX `index_xxx_yyy_id`

# utf8mb4対応

MySQLのデータベース設定がutf8mb4でこのエラーが発生したら

  - ROW_FORMATnのデフォルトをDYNAMIC
  
``` config/initializers/ar_innodb_row_format.rb
ActiveSupport.on_load :active_record do
  module ActiveRecord::ConnectionAdapters
    class AbstractMysqlAdapter
      def create_table_with_innodb_row_format(table_name, options = {})
        table_options = options.merge(options: 'ENGINE=InnoDB ROW_FORMAT=DYNAMIC')
        create_table_without_innodb_row_format(table_name, table_options) do |td|
          yield td if block_given?
        end
      end
      alias_method_chain :create_table, :innodb_row_format
    end
  end
end
```

  - my.cnf
    - innodb_file_format = Barracuda
    - innodb_file_per_table = 1
    - innodb_large_prefix
EXCEL > 関数 > SUMPRODUCT() > 内積?

```txt:動作確認
EXCEL 2013 on Windows 8.1 pro(64bit)
```

SUMPRODUCT()という関数

https://support.office.com/ja-JP/article/SUMPRODUCT-%E9%96%A2%E6%95%B0-16753e75-9f68-4874-94ac-4d2145a2fd2e
> 引数として指定した配列の対応する要素間の積をまず計算し、さらにその和を返します。
...
> 3*2 + 4*7 + 8*6 + 6*7 + 1*5 + 9*3 のように、2 つの配列の対応する要素の積を求め、それらの和を計算します (156)

「内積」のことのように思われる。

参考 http://d.hatena.ne.jp/Zellij/20130216/p1

関連 http://docs.scipy.org/doc/numpy/reference/generated/numpy.inner.html
EXCEL > 関数 > STDEVP()とSTDEV.P() > 新しい関数の詳細については、「STDEV.P 関数」を参照してください。

```txt:動作環境
EXCEL 2013 on Windows 8.1 pro(64bit)
```

EXCELファイルを解析中、STDEV.P()という関数が使用されていた。

STDEV.P()で検索するとSTDEVP()もあるようだ。

https://support.office.com/ja-jp/article/STDEVP-%E9%96%A2%E6%95%B0-1f7c1c88-1bec-4422-8242-e9f7dc8bb195
> 新しい関数の詳細については、「STDEV.P 関数」を参照してください。

> 重要: この関数は、より精度が高く、その使い方をより適切に表す名前を持つ、新しい 1 つ以上の関数で置き換えられました。

STDEV.P()の方を使うのがよいようだ。
Rubyでネストされたハッシュに安全にアクセスする

```rb
h = {key1: {key2: 'value'}}
p h.fetch(:key1, {}).fetch(:key2, {}) # => "value"

p h.fetch(:nothing, {}).fetch(:key2, {}) # => {}
```

もっと良い書き方がありそうな気がする…。
DQNの環境を整えるまでの流れ

前回ubuntu14.04でchainerをインストールした
http://qiita.com/masataka46/items/94417a5974dba810e7b8
後に、dqn環境を整えるまでの流れ。

今回はugo_nama氏のdqnコード
https://github.com/ugo-nama-kun/DQN-chainer
を走らせることを目標にする。

まず必要なパッケージをインストールする。


```
pip install --upgrade pip
sudo pip install scipy
```

以下、このへんのサイト
http://hirotaka-hachiya.hatenablog.com/entry/2016/06/05/215014
を参考に進める。
##RL-glue Coreをインストール
ここから
https://sites.google.com/a/rl-community.org/rl-glue/Home/rl-glue
debファイルをダウンロードしてきて、インストールする。

```
sudo dpkg -i rl-glue_3.04-1_amd64.deb
```

次にここから
https://sites.google.com/a/rl-community.org/rl-glue/Home/Extensions/c-c-codec
c codecのdebファイルをダウンロードし、インストールする。

```
sudo dpkg -i rl-glue-c-codec_2.0-1_amd64.deb
```
viで/etc/profileなどを開いて、インストール先の/usr/libをLD_LIBRARY_PATHに設定する。

```
export LD_LIBRARY_PATH=/usr/lib:$LD_LIBRARY_PATH
```

##RL-glue python codecをインストール
こちらから
https://sites.google.com/a/rl-community.org/rl-glue/Home/Extensions/python-codec
pythonのcodecをダウンロードし、インストールする。

```
tar -xvzf python-codec-2.02.tar.gz
cd python-codec/src
sudo python setup.py install
```
viで/etc/profileなどを開いてPYTHONPATHを設定する。

```
export PYTHONPATH=~/python-codec/src:$PYTHONPATH
```

##ALEをインストールする
ここから
http://www.arcadelearningenvironment.org/downloads/
ALEのパッケージをダウンロードし、インストールする。途中、cmakeを使うので、それも一緒にインストールする。

```
unzip Arcade-Learning-Environment-0.5.1.zip
cd Arcade-Learning-Environment-0.5.1
sudo apt-get install cmake
cmake -DUSE_SDL=ON -DUSE_RLGLUE=ON -DBUILD_EXAMPLES=ON .
```

途中

```
-- Could NOT find SDL (missing:  SDL_LIBRARY SDL_INCLUDE_DIR) 
CMake Error at CMakeLists.txt:21 (if):
  if given arguments:
    "SDL_FOUND" "AND" "VERSION_LESS" "2"
  Unknown arguments specified
-- Configuring incomplete, errors occurred!
```

などと表示された。どうやらSDL（Simple DirectMedia Layer）というものが必要らしい。

```
sudo apt-get install libsdl1.2-dev
```

としてから


```
cmake -DUSE_SDL=ON -DUSE_RLGLUE=ON -DBUILD_EXAMPLES=ON .
```

としたらうまくいった。

```
make -j 4
```

でALEのインストールは終了。

##ROMファイルの入手
ここから
http://www.atarimania.com/rom_collection_archive_atari_2600_roms.html
ROMファイルをダウンロードし、解凍する。

```
unzip ROMS.zip
unzip 'HARMONY CART ROMS.zip'
```

##DQNコードの入手
まずgitをインストールして、git cloneでugo_nama氏のDQNコードをクローンする。

```
sudo apt-get install git
git clone https://github.com/ugo-nama-kun/DQN-chainer.git
```
クイズ

##問題

![0829.png](https://qiita-image-store.s3.amazonaws.com/0/114190/8dac08c1-e5c9-2f6c-7d1c-3203e1e3aa60.png)

##回答
1個塗るとき、白マス8個の前後と間計9か所に、黒マスを1個入れればよい。
$$\binom{9}{1}\=9$$
2個塗るとき、白マス7個の前後と間計8か所に、黒マスを2個入れればよい。
$$\binom{8}{2}\=28$$
k個塗るとき、白マス9-k個の前後と間計9-k+1か所に、黒マスをk個入れればよい。
$$\binom{10-k}{k}$$

|黒マス|白マス|通り数|
|:-:|:-:|:-:|
|1|8|9|
|2|7|28|
|3|6|35|
|4|5|15|
|5|4|1|
||Total|88|

##Rで検証してみよう

```
> event.all <- expand.grid( c(0,1), c(0,1), c(0,1), c(0,1), c(0,1), c(0,1), c(0,1), c(0,1), c(0,1) )
> # 白か黒か、白は0　黒は1
> exam <- matrix( 0, nrow(event.all), ncol(event.all)-1 )
> for ( i in 1:(ncol(event.all)-1) ) {
+   exam[,i] <- event.all[,i] * event.all[,i+1]
+ }
> # 隣の列と掛け算をする。黒マスが連続出る場合、積が1となる。連続でない場合、積が0となる。

> sum( apply(exam, 1, sum) == 0 ) - 1
[1] 88
> # 積の和が0であれば、連続に塗られていない。値が0である数kは全通りの数である。少なくとも1つの黒マスを塗るので、k-1は答えとなる。
```

##コード

```code.r
event.all <- expand.grid( c(0,1), c(0,1), c(0,1), c(0,1), c(0,1), c(0,1), c(0,1), c(0,1), c(0,1) )
# 白か黒か、白は0　黒は1

exam <- matrix( 0, nrow(event.all), ncol(event.all)-1 )

for ( i in 1:(ncol(event.all)-1) ) {
  exam[,i] <- event.all[,i] * event.all[,i+1]
}
# 隣の列と掛け算をする。黒マスが連続出る場合、積が1となる。連続でない場合、積が0となる。

sum( apply(exam, 1, sum) == 0 ) - 1
# 積の和が0であれば、連続に塗られていない。値が0である数kは全通りの数である。少なくとも1つの黒マスを塗るので、k-1は答えとなる。
```
英語のKはインデックスで何番目か > 表

K=11, Q=17, H=8などの番号対応を素早く識別する。

https://en.wikipedia.org/wiki/English_alphabet

自分で表を作ってもいいが、Qiita記事からたどるのが早い。


### 表がなくなった?
(2019-02-25)

英語版の記事において、表が見つからない。

一方で、日本語版の方には表があるようだ。
https://ja.wikipedia.org/wiki/%E8%8B%B1%E8%AA%9E%E3%82%A2%E3%83%AB%E3%83%95%E3%82%A1%E3%83%99%E3%83%83%E3%83%88
ランサムウェアzeptoにやられたPCからデータ復旧

最新のランサムウェアZEPTOにやられてたノートPCが担ぎ込まれました。
Lenovo SL510
Windows7 Pro 32bit

デスクトップの背景画像が脅迫文になってしまってます。
![2016-08-29 14.24.18.jpg](https://qiita-image-store.s3.amazonaws.com/0/82956/6672a9ad-7c5f-1aba-a0f3-000eb99e1345.jpeg)

そしてほとんどのファイルが暗号化され、拡張子が.zeptoにされていました。
![2016-08-29 14.32.26.jpg](https://qiita-image-store.s3.amazonaws.com/0/82956/04e39fd8-e9c4-e8fc-0a5f-8b128acb8690.jpeg)

##暗号化されたファイルを復号化するツール
セキュリティソフト会社からいくつか復号ツールが出ているが今回のZeptoは最新種らしく、各社の復号ツールでは対応していなかった。
[Trend Micro Ransomware File Decryptor](https://success.trendmicro.com/solution/1114221)
[Kaspersky RannohDecryptor](https://support.kaspersky.com/viruses/disinfection/8547?&_ga=1.82970654.944215944.1472450820#block1)

##シャドーボリュームコピーから暗号化される前に復元する
下記URLページで紹介されているようにシャドーボリュームコピーから暗号化される前に復元する方法もあるが、今回のノートPCではバックアップを取っておらず出来なかった。
[http://sakujosuru.jp/guides/zepto-file-virus](http://sakujosuru.jp/guides/zepto-file-virus)

##サルベージソフトで復元する
いろいろランサムウェアについて調べていると、ウイルスに感染したあと人質とされるファイルをリストアップするようで、その際に候補にあるのが予めプログラムで定められた拡張子だけのようで、拡張子.jww(CADフリーソフト)などは暗号化されていなかった。
人質リストにピックアップされたファイル達は、その後コピーされ、そのコピーを暗号化するそうです。そして暗号化が完了したあとオリジナルを削除するフローになっているらしい(なんの確証もないっす)
なのでダメもとでFile Scavengerでサルベージをやってみた。

***復元できた！！***

全ファイルではないがクライアントがどうしても助けてほしいデジカメ写真のJPG達はかなりの数が救えた。
Javaの問題をTypeScriptにしてみる8-1

8-1.次のプログラムを実行した結果を選びなさい。

```java:java8-1.java
public class Main{
 public static void main(String[] args){
  try{
   int[] array={};
   array[0] = 10;
   System.out.println("finish");
  }catch(ArrayIndexOutOfBoundsException e){
   System.out.print("error");
  }
 }
}
```

```ts:ts8-1.ts
 try{
  var array:number[] = [];
  array[0] = 10;
  console.log("finish");
 }catch(e){
  console.log('error');
 }
```

A.finishと表示
B.errorと表示
C.error finishと表示
D.finish errorと表示
E.コンパイルエラーが発生
F.実行時に例外がスローされる

Javaの答えはBで要素数が０個の配列の0番目に値を代入しようとしているため、要素外の代入となり「ArrayIndexOutOfBoundsException」が発生します。発生した後スローはキャッチされるため、例外スローは発生せず「error」が表示されます。

一方TypeScriptの方では、Aのfinishが表示されるのが正解です。
javaScriptの配列はJavaでいうArrayListのような振る舞いをするため、可変的にサイズを増やすことができます、よってTypeScriptでもエラーや例外にはなりません。
~が早いか

**意味**　Aするとすぐ～
**接続**
```
　　　　　A【V辞書形】が早いか～
　　　　　A【Vた】が早いか～
     　　→　全部普通形です。
```     

:anchor: **POINT**　Aと～はほとんど同時で、少しだけAの方が早い

                A và B hầu như cùng lúc, A chỉ nhanh hơn B 1 chút.

1. Aは**瞬間的**なことを表す動詞が多い。
    :accept: 置く、鳴る、着く、言う、目が合う、、。
    :no_entry_sign: いる、ある、話し込む、寝る、、、。

2. 同時という感覚が強く、後文には**スピード**感がある。

3. ～には話者の希望･意向・推量（～たい・～つもり・～だろう・～しよう・・等）を表す文や動きかけの文は来ない。　
:accept: ベルが鳴るが早いか、教室を飛び出した
:no_entry_sign: ベルが鳴るが早いか、教室を飛び出そう！

4. ～には話者の希望･意向・推量（～たい・～つもり・～だろう・～しよう・・等）を表す文や動きかけの文は**来ない**。　
:accept: ベルが鳴るが早いか、教室を飛び出そう！
:no_entry_sign: ベルが鳴るが早いか、教室を飛び出した
Zopimに自社DBで持ってる情報を渡してみた


RailsでSlim使ってます。

```rb:zopim.slim
- if user_signed_in?
  javascript:
    $zopim(function(){
      $zopim.livechat.setName("#{current_user.name}");
      $zopim.livechat.setEmail("#{current_user.email}");
    });
- else
  javascript:
    $zopim(function(){});
```

`$zopim.livechat`でzopimの窓にパラメータを渡せる。
`setName`で名前
`setEmail`でメールアドレス
`setPhone`で電話番号
など。

`set`でパラメータを渡す方法もあり。

```js
  $zopim(function(){
    $zopim.livechat.set({
      name: "#{current_user.name}",
      email: "#{current_user.email}"
    });
  });
```
FactoryGirlでクラス名と違う名前で定義

FactoryGirlでマヌケなハマり方してたのでメモ

```rb:spec/factories/users.rb
FactoryGirl.define do
  factory :user do
    email 'hoge@fuga.jp'
    name 'Taro Yamada'
    age 32
  end
  
  factory :user_email_only, class: User do
    email 'hoge@fuga.jp'
  end
end
```

クラス名と同じときは省略できる

```rb
factory :user do
```

クラス名と違うときはクラス名を記述

```rb:
factory :user_email_only, class: User do
```

はじめはクラス名を指定しておらず、定義したはずのfactoryが呼べなくてしばらく悩んだ。

```rb
factory :user_email_only do
  email 'hoge@fuga.jp'
end
```

```rb
it 'only email' do
  post :create user: attributes_for(:user_email_only)
  expect(response).to redirect_to(edit_user_path)
end
```

```
Failure/Error: user_attributes = attributes_for(:user_email_only)
NameError:
  uninitialized constant UserEmailOnly
```

単にクラス名指定してなかっただけ。
pythonでunzipする

pythonの[zip関数](https://docs.python.org/3/library/functions.html#zip)の逆のものがないかなと思ってググったら出てきました

[python - How to unzip a list of tuples into individual lists? - Stack Overflow](http://stackoverflow.com/questions/12974474/how-to-unzip-a-list-of-tuples-into-individual-lists)

`in Python 2.x`みたいな話題も出てましたが、手元のpython3.5.2rcでも動きました

```python
>>> li = [('a', 12), ('b', 23), ('c', 34)]
>>> for e in zip(*li): e
...
('a', 'b', 'c')
(12, 23, 34)
```

関数にするとこんな感じですかね

```python
def unzip(li):
    return map(list, zip(*li))
```
tigでブランチの一覧を見るのは `r`

ヘルプ見ても載ってないなーと思ったんだけど、どうも "view-refs" というのがそれに相当するみたい。

```
r view-refs         Show refs view
```

一覧にはローカルブランチとリモートブランチの両方に加え、タグも一緒に色違いで出てくる。たしかに `git show-ref` のやつだ。

昔は `H` で出てきたらしい。 "brancH" だったのかな？　どのバージョンから変わったのか、は知らない。

このコメントで知りました:

- http://qiita.com/suino/items/b0dae7e00bd7165f79ea#comment-7c8090170699d9ae5478

※ちなみに一覧から選択して `C` でチェックアウト。
nanopi NEOを手に入れたぞ

はてぶろにも書いたけど、こっちのほうが慣れてるので今後はこちらを使っていこう。

![IMG_20160825_235051.jpg](https://qiita-image-store.s3.amazonaws.com/0/136777/956469a6-7670-085f-1ea4-162950bc7c3b.jpeg)

# nanopi NEO とは

ラズパイのちっこいやつ。オプション無しで、$7.99とお安い。(中国製)
今回は5個かいました。特に使用用途もナシです。

- micro USB で電源供給
- USBポート1コ (オプションでナシもできる。)
- NIC1コ (オプションでナシもできる。)
- microSDスロットがストレージ(8Gあれば足りる)
- hdmiとかの出力はないよ。

http://www.friendlyarm.com/index.php?route=product/product&product_id=132

# 初期設定

参考) http://wiki.friendlyarm.com/wiki/index.php/NanoPi_NEO

自分のPCはlinuxなので、ddコマンドでmicroSDにデータを流す。


1. wikiのDownloadリンクから、 nanopi-neo-linux-rootfs-core-qte-sd4g-20160804.img を拾ってきた。(zipかなんかで固まってるので解凍してね。)
2. micro sdカードをPCに挿して、こんな感じでddでイメージを入れる。 `# dd if=nanopi-neo-linux-rootfs-core-qte-sd4g-20160804.img of=/dev/sdX bs=16M` ※sdX部分は各自マウント先を。
3. micro sdカードをnanopiに挿して、LANケーブル挿してmicroUSBを接続して起動。(ココで青いランプがつかないとうまくいってない。)
4. 3分もかからないぐらいで初回起動が終わっている。
5. dhcpでIPアドレスを取得しているはずなので、PCからfping等を使ってIPアドレスを調べる。(参考macaddr ベンダーは d6:f5:b3 だった)
6. ssh で root@xxx.xxx.xxx.xxx でパスワードが `fa` でログイン
7. apt-get update と apt-get upgrade しておく。
8. このままではsdcardのパーティションがすべて使われていないので、 `# fs_resize` してパーティションを拡張する。
9. QtE-demoとかっていうQtのプロセスがいるので、/etc/rc.local で適当にコメントアウトして `# reboot`
10. timezoneを日本にする。 `# cp /usr/share/zoneinfo/Japan /etc/localtime`
11. rootのパスワードが初期状態なので、外から入れるような環境に置く場合には 鍵ファイルでssh接続できるようにして、`/etc/ssh/sshd_config` の `PasswordAuthentication` を no にする。

これで準備が1台分セットアップ完了。

# diskイメージコピー

5台もあると５回初期設定をするのがしんどいのでsdcardのimgを取ってコピーしちゃう。

1. 初期設定で出来上がったイメージをPCで吸い取る。 `# dd if=/dev/sdb of=~/Downloads/nanopi-base.img`
2. 空のsdcardをPCに突っ込んで吸ったものを焼く。 `# dd if=~/Downloads/nanopi-base.img of=/dev/sdX bs=16M`

残り4台分繰り返せばおっｋ。


# つなげてみた。

使いみちを決めてないけど、どやっ！熱暴走するらしいのでヒートシンクをつけないとあかんかも。。。

![IMG_20160829_132718.jpg](https://qiita-image-store.s3.amazonaws.com/0/136777/65170c49-742f-6adf-b07e-18462127cd71.jpeg)


# 足が一本干渉して斜めになってしまうので、1本外した。

![CrAP78AWAAABq3S.jpg](https://qiita-image-store.s3.amazonaws.com/0/136777/a57a9065-bfee-e039-7f74-60edad715518.jpeg)
EXCEL > 色々数式が入っているEXCELシートの数式概要を知りたい > FORMULATEXT()使用

```txt:動作確認
EXCEL 2013 on Windows 8.1 pro(64bit)
```

## 手法1 > 手法2の方がいい

- N行 920列のEXCELシートがあるとする
- １行に対して、異なる列に異なる数式が入っているとする

以下の手順で概要を捉える

- 余分な行を削除
  - 例: 4行目以降を消す
- Ctrl + Shift + @で数式表示
  - http://qiita.com/7of9/items/958d0cb918f0b424ee54
- 概要を知りたい行を選択
  - 例として、2行の選択
  - 1行目: 項目名表記
  - 2行目: 数式
- Ctrl+Cでコピー
- 行と列を入れ替えて4行目以降に貼る
  - http://qiita.com/7of9/items/2488c732be24996fd8e6
- 印刷
  - 920行を50%印刷で8ページに収まった
  - 字もそこそこ読める

以上により、各列の計算の概要を抑えることができそうだ。

<font color=red>ただし、行と列が入れ替わっているので、それに合わせて数式のセル指定も変わっていそう。この点は適宜読み替えること</font>。

`=B11`はもとは`=G2`である。11=G, B=2。

[英語のKはインデックスで何番目か > 表](http://qiita.com/7of9/items/c01adc6483943c5cd01e)

## 手法2 > FORMULATEXT 使用

FORMULATEXT 関数を使い「値」として貼り付けすれば、行列変換時にも元の数式情報が残るようだ。

- 余分な行を削除
  - 1行目: 項目表記
  - 2行目以降: 数式
  - 例: 3行目以降を消す
- セルA3に以下の式を入れる
  - `=FORMULATEXT(A2)`
  - この式を列すべてに適用する
- 3行を選択し、Ctrl+Cでコピー
  - 1行目: 項目表記
  - 2行目: 数式
  - 3行目: FORMULATEXT
- 行と列を入れ替えて5行目以降に貼る
  - http://qiita.com/7of9/items/2488c732be24996fd8e6
  - 「値」とする
  - 「行列を入れ替える」
- 余分なデータであるB列を削除
- 数式の入った列の幅を拡張する
- 印刷する
  - 920行を50%印刷で8ページに収まった
  - 字もそこそこ読める


以上で、もともとの数式そのものを印刷できる。
EXCEL > 数式と結果の表示切替 > Ctrl + Shift + @ > 数式と計算結果を並べてみる手順

```txt:動作確認
EXCEL 2013 on Windows 8.1 pro(64bit)
```

各セルには通常は計算結果が見えている。
数式に表示する方法が見つかった。

http://likep.blog63.fc2.com/blog-entry-63.html

> 便利なショートカットキー で紹介した、[Ctrl+Shift+@(アットマーク)キー]です。

### 値を並べて表示
(2019-02-06追記)

下記をすることで、数式と結果を並べて見ることができる

1. 計算式のセルを選択
2. Ctrl + C
3. 別のセルで「値として貼付け」

計算の元となるセルを変更するたびに上記を行う必要はある。
EXCEL > 参照先に飛ぶ

```txt:動作環境
EXCEL 2013 on Windows 8.1 pro(64bit)
```

数式の参照先、参照元のリンク表示方法は以下で教えていただいた。
http://qiita.com/7of9/items/278252b10ef48fed1d7c

参照先に飛ぶ方法は以下のようだ。例として、GX2というセルが使われているセル。

1. Ctrl+G
2. セル選択
3. 参照先
  - 1レベルのみ

1つだけの場合、そのセルに飛ぶ。

飛んだ後に「参照元」に飛びなおすと、元のセルに戻れる場合もある（複数の時は戻れないかも)。
PHP忘れがちな初歩メモ

（ドットインストール見ながらメモ）

## 記号の意味

### 「`""`」と「`''`」の違い

特殊文字（改行など）や変数が使用できるか否か

## 変数

### 変数の書き方

>\$name、{\$name}、${name}

`echo "My name is {$name}.";`のように`"`で括った文字列中に書く場合のみ、この三種類の意味は同じ。

###var_dumpとは


```php
$s1="hello";

var_dump($s1); 
```

表示結果： `string(5)"hello"`

## 真偽値

### 三項演算子

```php
$max = ($a > $b) ? $a : $b;
```

`$a > $b`が真であれば「`$a : $b`」の左側を、偽であれば右側を`$max`に代入する

##ループ文

### `do while`文と`while`文の違い

判定位置が違う。　`do while`文は後判定、`while`文は前判定。用途によって使い分ける。

```php
$i = 0;
do ｛
    echo　$i;

    $i++;

} while ($i > 10)
```

### `for`文を理解する

`for(初期値; ループが終わる条件; ループが終わるごとに行うこと) {}`

```php
for ($i = 0; $i > 10, $i++){
    echo $i;
}
```

`while`文で書くよりもスッキリ書くことができる。

### `break`と`continue`

`for`と`while`文で使える。

 * `break`： ループを抜ける
 * `continue`： それ以降の処理を実行せずに次のループに移る

###コロン構文

`foreach`、`if while for`で使える。

```php
<ul>
    <?php foreach(\$colors as \$value): ?>
    <li><?php echo "$value"; ?>\</li>
    <?php endforeach; ?>
</ul>
```

　→HTMLなどに埋め込む場合、対応が分かり、スッキリ見やすくなる。
EXCEL > AIJ列は何列目か > =COLUMN() - COLUMN($A$1)

```txt:動作環境
EXCEL 2013 on Windows 8.1 pro(64bit)
```

EXCELで計算の内容を確認するとして、AIJ列というのは何列目か気になった。

参考 https://dekiru.net/article/4452/

```
=COLUMN() - COLUMN($A$1)
```

921列目となった。

1430行 921列のシートを参考にする、と。。。
diskpart によるディスク全体の消去

# diskpart.exe コマンドについて
* ディスクを管理するための CUI ツール
* OS が起動したドライブは消去対象にはできない
* ターゲットとなるドライブを接続してから作業する
* USB 接続のドライブやリムーバブル・ストレージデバイスでも作業は可能

# 実行環境
Windows 8.1 Enterprise (64bit)

# 方法1 ディスクの管理情報だけを消去する

## (1) diskpart の起動

```bat
C:\>diskpart

Microsoft DiskPart パージョン 6.3.9600

Copyright (C) 1999-2013 Microsoft Corporation.
コンピュータ: <ComputerName>
```
> 『ユーザーアカウント制御』のポップアップが表示された場合、『はい』ボタンを押下すると起動する。
> 別コンソールが開く。

## (2) ディスク一覧の表示

```bat
DISKPART> list disk

  ディスク      状態           サイズ    空き   ダイナ  GPT
  ###                                         ミック
  -----------  -------------  -------  -------  ---  ---
  ディスク 0    オンライン        XXX GB      X B
  ディスク 1    オンライン         XX GB   XXX MB
```

## (3) 消去対象ディスクの選択

ディスク名は (2) の結果『ディスク ###』のナンバーに合わせること。
ただし、『ディスク』は『Disk』で記述する。

```bat
DISKPART> select disk 1

ディスク 1 が選択されました。
```
> 『select ディスク 1』だと選択できなかったので。

## (4) 選択したディスクの確認

先頭に * が付いていることを必ず確認する。

```bat
DISKPART> list disk

  ディスク      状態           サイズ    空き   ダイナ  GPT
  ###                                         ミック
  -----------  -------------  -------  -------  ---  ---
  ディスク 0    オンライン        XXX GB      X B
* ディスク 1    オンライン         XX GB   XXX MB
```

## (5) 選択したディスクのパーティション情報の確認

パーティションも削除されるので、選択ディスクのパーティション情報も確認しておく。

```bat
DISKPART> list partition

  Partition ###  Type                Size     Offset
  -------------  ------------------  -------  -------
  Partition 1    プライマリ             XXXX MB    XX KB
```

## (6) 削除コマンドの実行

確認なしに、すぐ実行されるので注意。

```bat
DISKPART> clean

DiskPart はディスクを正常にクリーンな状態にしました。
```
> すぐに完了する

## (7) ディスク内容の確認

```bat
DISKPART> list partition

このディスクには表示するパーティションがありません。
```
> パーティション情報が消えている

## (8) diskpart の終了

```bat
DISKPART> exit
```


# 方法2 ディスクの全内容を消去する
方法1において、「clean all」というコマンドを実行すると、ディスクの内容がすべて消去される。
かつ、全セクタに対して0データが書き込まれる。

## (1) コマンドの起動

```bat
C:\>diskpart

Microsoft DiskPart パージョン 6.3.9600

Copyright (C) 1999-2013 Microsoft Corporation.
コンピュータ: <ComputerName>
```

## (2) ディスク一覧の表示

```bat
DISKPART> list disk

  ディスク      状態           サイズ    空き   ダイナ  GPT
  ###                                         ミック
  -----------  -------------  -------  -------  ---  ---
  ディスク 0    オンライン        XXX GB      X B
  ディスク 1    オンライン         XX GB   XXX MB
```

## (3) 消去対象ディスクの選択

```bat
DISKPART> select disk 1

ディスク 1 が選択されました。
```

## (4) 選択したディスクの確認

```bat
DISKPART> list disk

  ディスク      状態           サイズ    空き   ダイナ  GPT
  ###                                         ミック
  -----------  -------------  -------  -------  ---  ---
  ディスク 0    オンライン        XXX GB      X B
* ディスク 1    オンライン         XX GB   XXX MB
```

## (6) 削除コマンドの実行 
確認なしにすぐ実行されるので注意。
また、ディスク全体に書き込むのでかなり時間がかかる。

```bat
DISKPART> clean all

DiskPart はディスクを正常にクリーンな状態にしました。
```

## (8) diskpart の終了

```bat
DISKPART> exit
```



# 参考サイト
[Windowsで、diskpartのcleanコマンドを使ってディスクの内容を消去する - @IT](http://www.atmarkit.co.jp/ait/articles/0303/01/news003.html)
【高速化】外部CSS、外部JSをインライン化する

#外部読み込みファイルをインライン化する
Googleさんに怒られたので思い切ってやってみたら
PageSpeed褒められた（やっつけ）
https://developers.google.com/speed/pagespeed/insights/

GTmetrixでもPage Load Timeが1.6秒→1.0秒に
https://gtmetrix.com

ついでにHTMLは圧縮しておきました。

余談ですが、HTMLの転送量は圧縮で
1,373KB →340KB
と約4分の1(画像込み)になりました！


## CSS

```index.php
    <?php
    // CSSインライン化
    echo '<style>';
    echo file_get_contents("/var/www/html/app/webroot/css/bootstrap.3.3.7.min.css") ."\n";
    echo file_get_contents("http://netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.min.css")."\n";
    echo file_get_contents("/var/www/html/app/webroot/css/front_custom.css")."\n";
    echo '</style>';
    ?>
```

## JS

```index.php
<?php
  // JSのインライン化
  echo '<script>';
  echo file_get_contents("/var/www/html/app/webroot/js/jquery-1.11.2.min.js") ."\n";
  echo file_get_contents("/var/www/html/app/webroot/js/bootstrap-3.3.4.min.js") ."\n";
  echo file_get_contents("/var/www/html/app/webroot/js/jquery.lazyload.min.js")."\n";
  echo '</script>';
?>
</body>
</html>
```

##※HTML圧縮
.htacces、もしくはhttpd.confに下記を追加

```httpd.conf
 <ifmodule mod_deflate.c>
 AddOutputFilterByType DEFLATE text/text text/html text/plain text/xml text/css application/x-javascript application/javascript
 </ifmodule>
```
Oracle でLocal Listener設定時にエラー

以下のようなエラーが出た

```
SQL> alter system set local_listener='LISTENER';
alter system set local_listener='LISTENER'
*
行1でエラーが発生しました。:
ORA-02097: 指定した値が無効なので、パラメータを変更できません。
ORA-00119: システム・パラメータLOCAL_LISTENERの指定が無効です
ORA-00132: 構文エラーまたは未解決のネットワーク名'LISTENER'
```

tnsnames.oraにパラメータを指定していたはず。だが、以下のように記載した時、最初の列の前に空白を入れないとエラーになる。

```
LISTENER =
 (DESCRIPTION =
  (ADDRESS_LIST =
   (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.100)(PORT = 1521))
  )
 )
```
タイムゾーンの変換 (MySQLとPHPによる方法)

とあるタイムゾーンの時間を他のタイムゾーンの時間に変換する。
Daylight Saving Time(サマータイム) とかも考慮する。

といった時に使える方法。

## MySQLのを使った方法

```sql
SELECT CONVERT_TZ('2016-08-29 00:00:00', 'America/Los_Angeles', 'UTC') AS time; // PDT
SELECT CONVERT_TZ('2016-01-29 00:00:00', 'America/Los_Angeles', 'UTC') AS time; // PST
```

結果

```
+---------------------+
| time                |
+---------------------+
| 2016-08-29 07:00:00 |
+---------------------+

+---------------------+
| time                |
+---------------------+
| 2016-01-29 08:00:00 |
+---------------------+
```

CONVERT_TZ が NULLを返す場合は zoneinfo から mysql.time_zone にデータを入れる必要がある
参考:

- http://d.hatena.ne.jp/Craftworks/20110507/1304762654
- http://dev.mysql.com/doc/refman/5.6/ja/mysql-tzinfo-to-sql.html



## PHPを使った方法

```php
function convert_tz($time, $from_tz, $to_tz)
{
    $date = new DateTime($time, new DateTimeZone($from_tz));
    $date->setTimezone(new DateTimeZone($to_tz));
    return $date->format('Y-m-d H:i:s');
}

echo convert_tz("2016-08-29 00:00:00", "America/Los_Angeles", "UTC")."\n";
echo convert_tz("2016-01-29 00:00:00", "America/Los_Angeles", "UTC")."\n";

```

結果

```
2016-08-29 07:00:00
2016-01-29 08:00:00
```

参考:

- http://stackoverflow.com/questions/2505681/timezone-conversion-in-php
ES2015 で Hubot のスクリプトを書くと `using deprecated documentation syntax` って怒られる件について


_追記あり_

# 前置き

最近、 Hubot 使って ChatOps なコトをしようと思っており、色々ググりながら環境作ったりしてました。

んで、概ね巧く動くところまでは出来たんだけど、いざ Hubot 起動すると以下のように怒られる。

```
$ bin/hubot
hubot_project> [Mon Aug 29 2016 12:30:53 GMT+0900 (JST)] INFO /path/to/hubot_project/scripts/test.js is using deprecated documentation syntax
[Mon Aug 29 2016 12:30:53 GMT+0900 (JST)] INFO hubot-redis-brain: Using default redis on localhost:6379
[Mon Aug 29 2016 12:30:53 GMT+0900 (JST)] INFO hubot-redis-brain: Data for hubot brain retrieved from Redis
```

下の2行は Redis についての単なる情報だと思うので無視するとして、問題は1行目。

警告的なメッセージが出るのは気持ち悪いので、色々調べてみた。

んで、一応、解決出来た (？) ので綴ってみる。

# Documentation

先ず、Hubot Script に関する説明がないコトが根本的な原因だったので、[公式のドキュメント](https://github.com/github/hubot/blob/master/docs/scripting.md#documenting-scripts)に従い、 `Commands:` を追加してやった。

```js:test.js
// Commands:
//  ぬるぽ - ガッ！
//
module.exports = (robot) => {
  robot.hear(
    /^ぬるぽ$/,
    (message) => {
      message.send("ガッ！");
    }
  );
};
```

あ、勿論 `.babelrc` に `"comments": true` の追記を忘れずに。
これが無いと、トランスパイル時にコメント落とされちゃうので。

```json:.babelrc
{
  "presets": ["es2015"],
  "comments": true
}
```

さぁ、どうかな！？

```
$ bin/hubot
hubot_project> [Mon Aug 29 2016 12:30:53 GMT+0900 (JST)] INFO /path/to/hubot_project/scripts/test.js is using deprecated documentation syntax
[Mon Aug 29 2016 12:30:53 GMT+0900 (JST)] INFO hubot-redis-brain: Using default redis on localhost:6379
[Mon Aug 29 2016 12:30:53 GMT+0900 (JST)] INFO hubot-redis-brain: Data for hubot brain retrieved from Redis
```

………でも、相変わらず怒られ続ける。

# 'use strict';

なんでかなー？と思ってトランスパイル後の JS ファイルを見てみたところ、こんな感じになってた。

```js:test.js(transpiled)
'use strict';

// Commands:
//  ぬるぽ - ガッ！
//
module.exports = function (robot) {
  robot.hear(/^ぬるぽ$/, function (message) {
    message.send("ガッ！");
  });
};
```

`babel-presets-es2015` を使う場合、1行目に `'use strict';` が出力されるので、 Hubot 的な規約としての

> Hubot scripts can be documented with comments at the **top of their file**

ってのとぶつかってしまうコトが原因。

# 解決策

じゃあ、どうするか？

Hubot 側にプルリク送るというのも手だけど、ちょっと今そんな時間ないよ！っていう人はトランスパイラ側を変更しちゃえば良いんじゃないかと。

具体的には、 `babel-presets-es2015` ではなく `babel-presets-es2015-without-strict` という、[そのものズバリなパッケージ](https://www.npmjs.com/package/babel-preset-es2015-without-strict)がありました。

```
$ npm i -D babel-presets-es2015-without-strict
```

```json:.babelrc
{
  "presets": ["es2015-without-strict"],
  "comments": true
}
```

いざ！

```
$ bin/hubot
hubot_project> [Mon Aug 29 2016 12:30:53 GMT+0900 (JST)] INFO hubot-redis-brain: Using default redis on localhost:6379
[Mon Aug 29 2016 12:30:53 GMT+0900 (JST)] INFO hubot-redis-brain: Data for hubot brain retrieved from Redis
```

てってれー！

これで、怒られることがなくなりました！

勿論、 `strict` ではなくなるので、100点満点の解決策ではないですが、まぁ、及第点…かな？

# 追記: 2016/08/29 20:40

@mohayonao さんからコメントを頂戴しました。

```js:test.js
// Commands:
//  ぬるぽ - ガッ！
//

"use strict";

module.exports = (robot) => {
  robot.hear(
    /^ぬるぽ$/,
    (message) => {
      message.send("ガッ！");
    }
  );
};
```

と言った感じに、 ES2015 な JS 側に自分で `use strict` を書いてあげれば `babel-presets-es2015` 側で自動追記されることがなくなるので、この方がスマートですね！

「毎回書くのが…」みたいなケースも、IDE のコードテンプレートとか使えば、さほど不便はないし。

@mohayonao さん、コメントありがとうございました！
Androidで特定の言語コードがISO639-1のコードと違う問題に対する対処方法

タイトルのとおりですが、Androidではインドネシア語、ヘブライ語、イディッシュ語の言語コードが[ISO639-1](https://ja.wikipedia.org/wiki/ISO_639-1%E3%82%B3%E3%83%BC%E3%83%89%E4%B8%80%E8%A6%A7)のコードと違います。

例えばインドネシア語のstrings.xmlを作ろうとした時 `values-id` ではなく `values-in` ディレクトリを作らなければなりません。Railsなんかでi18n対応した場合は `id` を使うので混乱しやすく、注意が必要です。

また、コード上で言語を切り替える時は変換が必要になります。以下のように愚直にやるしかなさそうです。

```java
private String convertOldISOCodes(@NonNull String language) {
  language = language.toLowerCase.intern();
  switch (language) {
    case "he": // ヘブライ語
      return "iw";
    case "yi": // イディッシュ語
      return "ji";
    case "id": // インドネシア語
      return "in";
    default:
      return language;
  }
}
```
Visual Studio 2015 で C++ プロジェクト作成後に行うプリコンパイル済みヘッダー関連の設定最短手順

手順は以下のとおり。

* Shift + Ctrl + A（プロジェクト → 新しい項目の追加）：「stdafx.h」
* Shift + Ctrl + A（プロジェクト → 新しい項目の追加）：「stdafx.cpp」
* プロジェクト → プロパティ
    * 構成：「すべての構成」を選択
    * プラットフォーム：「すべてのプラットフォーム」を選択
    * C/C++ → プリコンパイル済みヘッダー → プリコンパイル済みヘッダー：「使用 (/Yu)」
    * C/C++ → 詳細設定 → 必ず使用されるインクルード ファイル：「stdafx.h」
* stdafx.cpp → プロパティ
    * C/C++ → プリコンパイル済みヘッダー → プリコンパイル済みヘッダー：「作成 (/Yc)」

Visual Studio 2015 Community Update 3 を使っています。
インタフェースは型名を公開しなくても実装できる #golang


## インタフェースの実装

Goのインタフェースは、明示的に実装する必要がありません。
インタフェースが定義しているメソッドリストとその型が持つメソッドのリストが一致すれば実装していることになります。
インタフェースについて詳しく知りたい方は、以下の記事にまとめていますので参考にしてください。

* [インタフェースの実装パターン](http://qiita.com/tenntenn/items/eac962a49c56b2b15ee8)

## 同じメソッドリストをもつインタフェース

上記のような特徴からインタフェースは、`type`で付けられた型名はさほど重要ではなく、どのメソッドを持っているかが重要になってきます。
以下のコードを見ると、`Str`型が3種類のインタフェースを実装していることがわかります。
それぞれ、外部のパッケージで定義された型、関数内で定義された型、型リテラルです。
名前は違いますが、どれも同じメソッドリストを持つインタフェースです。

関数内で`type`を使って型定義を行っていることに驚く方がいるかもしれませんが、関数内だけで有効な型を作りたい場合はこの方法が使えます。
また、型リテラルは型そのものを記述したもので、`[]int`などもそれにあたります。
`type`は型リテラルや名前の付いている既存の型に新たに名前をつけているだけだということに気づくと思います。

なお、あるインタフェース型の変数として`_`に代入する方法は、ある型が特定のインタフェースを実装しているかコンパイル時にチェックする方法としてイディオムになっています。
詳しくは、[Effective Go](https://golang.org/doc/effective_go.html#blank_implements)を見ると良いと思います。

[Go Playgroundで動かす](https://play.golang.org/p/hEgXeM_DSj)

```
package main

import (
	"fmt"
)

type Str string

func (s Str) String() string {
	return string(s)
}

func main() {
	var s Str = "hoge"

	var _ fmt.Stringer = s

	type MyStringer interface {
		String() string
	}
	var _ MyStringer = s

	var _ interface {
		String() string
	} = s
}
```

## インタフェースの型名を公開せずに利用する

[pkg/errors](https://github.com/pkg/errors)の実装を見ると、一見、見慣れないコードを見つけることができます。
`Cause`関数内で定義されている`causer`型は、メソッド内で定義された型であるため、関数外（もちろん、外部パッケージも含む）から型名を知ることができません。
しかし、上述の通りインタフェースは、定義しているメソッドリストが重要なので型名を公開しなくても、そのインタフェースを実装しているかのチェックには使えます。
インタフェース型を引数に受け取ったり、戻り値として返す場合は、名前を付けて公開した方が便利なので、大文字で始まる名前をつけて関数外で定義するべきでしょう。
しかし、pkg/errorsパッケージでは、関数内で`Cause`メソッドを実装しているエラーかどうかを知りたいだけなので、インタフェース型リテラルに名前をつけて公開する必要がありません。

[pkg/errorsから引用](https://github.com/pkg/errors/blob/master/errors.go#L226-L228)

```
func Cause(err error) error {
	type causer interface {
		Cause() error
	}

	for err != nil {
		cause, ok := err.(causer)
		if !ok {
			break
		}
		err = cause.Cause()
	}
	return err
}
```

なお、上記のコードは以下のようにも書けます。

```
func Cause(err error) error {
	for err != nil {
		cause, ok := err.(interface { Cause() error })
		if !ok {
			break
		}
		err = cause.Cause()
	}
	return err
}
```

## まとめ

一見、pkg/errorsパッケージのコードは不思議ですが、よくよく考えると理にかなっています。
構造体や他の型の型だと外部パッケージに公開するには、大文字で始まる型名をつけて定義する必要がありますが、インタフェースはその制約はありません。
こういう使い方ができるGoのインタフェースは面白いですね。