OmniAICreator/Qiita-1.07M huggingface dataset:
terminalでIRKitのAPIをさくっと組み立てる

自分用メモ。
[Google Home＋IFTTTで、お手軽に家電コントロール - 赤外線信号を読みとる](https://qiita.com/kazunori279/items/e3485f00fbe0ad85cce2#%E8%B5%A4%E5%A4%96%E7%B7%9A%E4%BF%A1%E5%8F%B7%E3%82%92%E8%AA%AD%E3%81%BF%E3%81%A8%E3%82%8B) 以下をシェルスクリプト化しただけ (要jq)。

```sh
#!/bin/bash

export IRKIT_DEVICE_ID="..."
export IRKIT_CLIENT_KEY="..."

echo "IRKitにリモコンの赤外線信号を送ってください"
message=$(curl -s "https://api.getirkit.com/1/messages?clientkey=${IRKIT_CLIENT_KEY}&clear=1" | jq .message -c -M)
echo "https://api.getirkit.com/1/messages?clientkey=${IRKIT_CLIENT_KEY}&deviceid=${IRKIT_DEVICE_ID}&message=${message}"
```
Bitcoin Coreのデータディレクトリ一覧

##OSごとのファイル格納ディレクトリ
Bitcoin Coreをインストールした後、設定ファイルやブロックチェーンの実態が格納されているDBなどは、OSごとにデフォルトで以下のディレクトリに格納される。

- Mac OS X： ~/Library/Application Support/Bitcoin/
- Linux: ~/.bitcoin/
- Windows: C:\Users\Username\Appdate\Roaming\Bitcoin

##ファイルの内容

| 名称 | 内容 | 
|:-----------------|:------------------|
| banlist.dat | 禁止ノードのIPアドレス、サブネットのリスト。 |
| bitcoin.conf | Bitcoin Coreの設定ファイル。接続するのがmainnetかtestnetかなどを指定することができる。自動生成されず、自分で作成する必要がある。 |
| bitcoin.pid | bitcoindをデーモンで起動した際のPIDファイル。 |
| blocks/blk000??.dat | ブロックの生データ。ウォレット内の欠落しているトランザクションを再スキャンする際や、同期中の他のノードにブロックデータを提供する際などの利用される。 |
| blocks/rev000??.dat | blocksディレクトリ内に格納されている、undoデータ。 |
| blocks/index/* | 既知のブロックのメタデータやその格納場所の情報が格納されたLevelDBのDB。 |
| chainstate | 現在未使用のトランザクションアウトプット（UTXO)とそのトランザクションのメタデータをコンパクトにしたLebelDBのDB。受信したブロックやトランザクションを検証するために利用される。 |
| database | Berkeley DBのジャーナリングファイルが格納されるディレクトリ。 |
| db.log | ウォレットデータベースのログファイル。 |
| debug.log | Bitcoinの詳細なログ。 |
| fee_estimates.dat | 手数料と優先順位を予測するための統計。プログラムのシャットダウン時に保存され、起動時に読み込まれる。 |
| mempool.dat | メモリプール内のトランザクションのダンプ。 |
| peers.dat | 再接続を容易にするためのピア情報用のストレージ。ビットコイン専用のフォーマットを使用している。 |
| wallet.dat | 鍵やトランザクション、メタデータ、オプション情報が保存されるBerkelay DBのデータベースファイル。 |
| .cookie | セッションRPC認証クッキー。クッキー認証が使用されている時に書き込まれ、シャットダウン時に削除される。 |
| onionprivatekey | キャッシュされたTor匿名通信サービスの秘密鍵。 |
| testnet3 | testnetモードでbitcoindを起動した際のデータ。 |
| regtest | regtestモードでbitcoindを起動した際のデータ。regtestディレクトリを削除してBitcoin Coreを再起動すると、新しいregtest環境になる。 |
| .lock | Berkeley DBのロックファイル。 |

##わからなかった用語一覧
- サブネット: あるネットワークを小さく分割したネットワークのこと。
- デーモン: UNIX系OSにおける常駐プログラム。
- undoデータ: 既存データになんらかの変更がある場合の、変更前のデータのこと。
- ジャーナリングファイルシステム: ディスクに障害が発生したときにすぐ復旧できるように、ファイル更新履歴のバックアップをとっておく機能を持ったファイルシステム。
- Level DB: Google謹製のkey-value型のデータストア。
- ダンプ: 手を加えずに内容をファイルに出力すること。エラー内容やデバッグ中のデータを吐き出す際に利用されることが多い。
- regtest: 独自のネットワークを構築することができる。任意のタイミングで新しいブロックを追加することができる点でtestnetと異なる（testnetとmainnetは同じ環境）。

##参考文献・サイト
- [『ブロックチェーン・プログラミング 仮想通貨入門』](https://www.amazon.co.jp/%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3-%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E4%BB%AE%E6%83%B3%E9%80%9A%E8%B2%A8%E5%85%A5%E9%96%80-%EF%BC%AB%EF%BC%B3%E6%83%85%E5%A0%B1%E7%A7%91%E5%AD%A6%E5%B0%82%E9%96%80%E6%9B%B8-%E5%B1%B1%E5%B4%8E%E9%87%8D%E4%B8%80%E9%83%8E-ebook/dp/B078G94JNT/ref=tmm_kin_swatch_0?_encoding=UTF8&qid=1515899355&sr=8-1)
- [IPアドレス - サブネットマスク](http://www.infraexpert.com/study/ip6.html)
- [デーモン (daemon)とは](http://wa3.i-3-i.info/word11000.html)
- [LevelDB入門 (基本編)](http://yosuke-furukawa.hatenablog.com/entry/2014/05/05/095207)
- [UNDOデータについて](https://docs.oracle.com/cd/E57425_01/121/ADMQS/GUID-A06E9A52-4553-49A9-AFEB-33273A063707.htm)
- [ジャーナリングファイルシステムとは - IT用語辞典](http://e-words.jp/w/%E3%82%B8%E3%83%A3%E3%83%BC%E3%83%8A%E3%83%AA%E3%83%B3%E3%82%B0%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0.html)
- [ダンプ | システム開発 | IT用語辞典 | 日立ソリューションズ](https://it-words.jp/w/E38380E383B3E38397.html)
debian でCA証明書の更新

自分のための備忘録
CA証明書の都度更新

# HTTPS 通信でエラー

```
$ git clone http://github.com/creationix/nvm.git .nvm
Cloning into '.nvm'...
error: Problem with the SSL CA cert (path? access rights?) while accessing http://github.com/creationix/nvm.git/info/refs
fatal: HTTP request failed
```

# CA証明書更新

```
$ sudo /usr/sbin/update-ca-certificates
Updating certificates in /etc/ssl/certs... 0 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d....
done.
done.
```

これでエラー解消

# man update-ca-certificates

```
       update-ca-certificates is a program that updates the directory /etc/ssl/certs to hold SSL certificates and generates
       certificates.crt, a concatenated single-file list of certificates.

       It reads the file /etc/ca-certificates.conf. Each line gives a pathname of a CA certificate under /usr/share/ca-cer‐
       tificates that should be trusted.  Lines that begin with "#" are comment lines and thus ignored.  Lines  that  begin
       with "!" are deselected, causing the deactivation of the CA certificate in question.

       Furthermore all certificates found below /usr/local/share/ca-certificates are also included as implicitly trusted.

       Before  terminating,  update-ca-certificates  invokes run-parts on /etc/ca-certificates/update.d and calls each hook
       with a list of certificates: those added are prefixed with a +, those removed are prefixed with a -.
```
Phoenixのログイン管理のためのSessionの使い方

　一般に、Authenticationを行うためにはSessionは不要ですが、ログイン管理を行う場合は便利なものです。ログイン管理という言葉が適切かどうかはわかりませんが、ログインのuser_idをブラウザ側とサーバ側で共有するための管理を意味しています。一般的にhttpはsession lessなので、Webアプリで改めて枠組みを提供する必要があります。

　Phoenixではプロジェクト作成を作成したら、嬉しいことにSessionの初期設定が行われています。今回はそれを見ていきたいと思います。


# １．Plug.Session
　PhoenixでSessionを使う場合は、Plug.Sessionを利用します。公式ドキュメントは以下にあります。
https://hexdocs.pm/plug/Plug.Session.html#content


　プロジェクトを作成すると、以下のようなendpoint.exファイルが生成され、Plug.Sessionの設定があります。ここではcoockieを使うことが明示されています。(ちなみにxxxxxはプロジェクト名です。)

```elixir:lib/xxxxx/endpoint.ex
  # The session will be stored in the cookie and signed,
  # this means its contents can be read but not tampered with.
  # Set :encryption_salt if you would also like to encrypt it.
  plug Plug.Session,
    store: :cookie,
    key: "_xxxxx_key",
    signing_salt: "mspqDd7s"
```

　sessionはPlug.Connの関数を通してアクセスできますが、最初にPlug.Conn.fetch_session で cookie と sessionを取得しておく必要があります。必要な関数は「２．Plug.Connが提供する関数」で説明します。ここではrouterのpipelineでPlug.Conn.fetch_sessionが利用されていることを確認しておきます。つまりbrowserを通したアクセスには必ずこの関数が呼ばれます。


```elixir:web/router.ex
  ---

  pipeline :browser do
    plug :accepts, ["html"]
    plug :fetch_session ### <=====これです
    plug :fetch_flash
    plug :protect_from_forgery
    plug :put_secure_browser_headers
  end

  ---
```


# ２．Plug.Connが提供する関数
　実際にsessionを利用するためには、Plug.Connの関数が必要になります。公式ドキュメントから関連のある関数をピックアップしてみました。
https://hexdocs.pm/plug/Plug.Conn.html#content


```:
・session store(cookie)からsessionを取り出します。connとoptsの引数があるので、plug関数です。
fetch_session(conn, opts \\ [])


・sessionの中のkeyに対するvalueを返します。
get_session(conn, key)

・keyに対するvalueをsessionの中に書き込みます。
put_session(conn, key, value)

・sessionの設定変更を行います。
configure_session(conn, opts)

・sessionのkeyの項目を削除します。
delete_session(conn, key)
```

　以上の関数の使われ方ですが、ログイン／ログアウトを想定して見ていきたいと思います。

　まずユーザ登録やログイン認証に成功したら、sessionにuser_idをセットします。

```elixir:
 put_session(conn, :user_id, user.id)
```

　次にログインが成功したら　session fixation attacks　でセッションが乗っ取られるのを防ぐために、クライアントブラウザに対してsessionの更新を行います。

```elixir:
configure_session(conn, renew: true)
```

　ログインしているかをチェックするためにsessionからuser_idを取り出します。user_idが取り出せればログインしていると判断し、user_idを使ってデータベースからuser情報を取り出します。

```elixir:
 user_id = get_session(conn, :user_id)
```


　ログアウト時はsessionを破棄しますが2つの選択肢があります。以下のどちらでも良いです。

　１．session全体を破棄する場合。


```elixir:
configure_session(conn, drop: true)
```

　２．sessionは残しておいて、user_idだけを破棄する場合。


```elixir:
delete_session(conn, :user_id)
```


　以上です。



**■ Elixir/Phoenixの基礎についてまとめた過去記事**
[Elixir Ecto チュートリアル - Qiita](https://qiita.com/sand/items/0861ad7a16f7ac612f41)
[Elixir Ecto のまとめ - Qiita](https://qiita.com/sand/items/71d0b35d74a4781f3564)
[Elixir Ecto Association - Qiita]
(https://qiita.com/sand/items/5581497972473e308f05)
[Phoenix1.3の基本的な仕組み - Qiita](https://qiita.com/sand/items/f42dc35c47589eab687e)
[Phoenixのログイン管理のためのSessionの使い方 - Qiita](https://qiita.com/sand/items/a88f1c39f3a6f7a01f99)
[Phoenix1.3のUserアカウントとSession - Qiita](https://qiita.com/sand/items/8e541f8a950ae6c63931)
[Phoenix1.3+Guardian1.0でJWT - Qiita](https://qiita.com/sand/items/393827194e687efafd4f)
python製CMS「mezzanine」の環境構築方法

# 前提
* この記事ではpython3を使用しています。
* OSはMacOSX Sierra 10.12.6
* プログラミング初心者が記事を書いています。


# mezzanineを始める理由
* 自分自身でブログを作成したいから
* pythonを使いたいから


# mezzanineとは
公式ページ
http://mezzanine.jupo.org/

オープンソースのCMSではPHPのWordPressがが有名ですが、pythonではmezzanineが有名だそうです。


# インストール
## ディレクトリを作成する
mezzanineをイントールするためのディレクトリを作成する

```
// ディレクトリを作成
$ mk dir mezzanine

// 任意のディレクトリに移動
$ cd mezannine

```

## mezzanineをインストールする

```
$ pip install mezzanine
```

Successfully installed ~ と表示されれば成功。

# 起動
## 自分のプロジェクトを作る
任意のプロジェクトを作成する（今回はmyprojectとする）
```
$ mezzanine-project myproject
```

## データベースを連携する?

```
$ cd myproject
$ python manage.py createdb
```
途中で管理者アカウントを作成するために、Username, Email address, passwordがを設定する作業が入ります。


## mezzanineを起動する

```
$ python manage.py runserver

（中略）

Starting development server at http://XXX.X.X.X:8000/
```
http://以下に接続すると、mezzanineが起動します。

成功すると下記の画面が表示されます。
![スクリーンショット 2018-01-14 11.20.44.png](https://qiita-image-store.s3.amazonaws.com/0/143765/6b403f14-0816-e3e9-a224-949ccb1e0304.png)

# エラー
#### **You may need to add 'localhost' to ALLOWED_HOSTS.**
ローカルホスト名が指定されておらず、正常に起動しないことがありました。
任意のディレクトリから**settings.py**を開き、下記の欄に指定されたローカルホスト名を追記すれば、正常に起動します。

```
// 追記前
ALLOWED_HOSTS = []

//　追記後
ALLOWED_HOSTS = ['1XX.X.X.X', 'localhost']
```



#### 参考元
* [django 1.5 から ALLOWED_HOSTSが追加されたぞ！DEBUG=Falseのときは気をつけろ！ - Qiita](https://qiita.com/esehara@github/items/27c0d1f76bea8ac9169e)

* [Mezzanineをはじめよう - Qiita](https://qiita.com/itkr/items/c6c26f55a292f3e39241)
【マメ知識】ラズパイに接続したロジクールC270で録音をする

ラズパイのマメ知識メモ

ロジクール社のUSBカメラC270はマイク機能も持った優れもののUSBデバイスです。
これを使って録音をする場合のメモです。
ポイントとして、録音に関してはデフォルトのものもあるので、コマンドのパラメータでデバイス番号を指定する必要があることがあります。

動作確認は
* Raspberry Pi 3 MODEL B
* RASPBIAN STRETCH WITH DESKTOP 2017-11-29
* ロジクール HD Webcam C270
の組み合わせで行っています。

####デバイスが認識されていることの確認
プラグアンドプレイに対応しているので、OS起動中にケーブルを指す形で構いません。

```
$ lsusb
Bus 001 Device 004: ID 046d:0825 Logitech, Inc. Webcam C270
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```

####デバイス番号の確認
arecordは最初からOSに入っているコマンドです。

```
$ arecord -l
**** ハードウェアデバイス CAPTURE のリスト ****
カード 1: U0x46d0x825 [USB Device 0x46d:0x825], デバイス 0: USB Audio [USB Audio]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0
```

この結果から、USBマイクは
カード番号: 1
デバイス番号: 0
であることがわかります。

####マイクのボリュームコントロール
amixerも最初からOSに入っているコマンドです。事前に調べたカード番号:1をパラメータで指定します。

```
$ amixer -c 1
Simple mixer control 'Mic',0
  Capabilities: cvolume cvolume-joined cswitch cswitch-joined
  Capture channels: Mono
  Limits: Capture 0 - 16
  Mono: Capture 12 [75%] [24.00dB] [on]
```

ボリュームの最大値が16で現在が12であることがわかります。
次のコマンドで最大の16をセットします。

```
$ amixer sset Mic 16 -c 1
Simple mixer control 'Mic',0
  Capabilities: cvolume cvolume-joined cswitch cswitch-joined
  Capture channels: Mono
  Limits: Capture 0 - 16
  Mono: Capture 16 [100%] [30.00dB] [on]
```

####録音
録音はarecordコマンドで行います。
-Dのオプションでカード番号:1 デバイス番号:0を指定します。
-dのオプションは時間間隔です。
他にもビット長、ビットレートなどいくつかオプションはありますが、最低限のパラメータとしては以下の形になります。

```
$ arecord -D plughw:1,0 -d 5 Music/test.wav
録音中 WAVE 'Music/test.wav' : Unsigned 8 bit, レート 8000 Hz, モノラル
```

###(おまけ)再生テスト
再生はaplayコマンドで行えます。一番簡単にテストするには、イヤホンをラズパイのジャックに差し込んでから次のコマンドを実行します。

```
$ aplay Music/test.wav 
再生中 WAVE 'Music/test.wav' : Unsigned 8 bit, レート 8000 Hz, モノラル
```

関連リンク [【マメ知識】ラズパイ+ロジクールC270+fswebcamで写真撮影をする場合のエラー対策
](https://qiita.com/makaishi2/items/1cdc1e36e10caad56637)
angularのテストを CI と 開発で実行の仕方を変えたい

angularのテストで、 CI と 開発時 では結構やりたいことが変わる。

- CI環境では、出来る限り早く実行したい
- 開発時は、常に実行しておいて、変更があったら勝手にテストを実行して欲しい

これを実現するために、テスト用のコマンドを２つ用意する。

```
ng test
```

は、普通に実行すると `watch` 状態になる。また、Chromeが立ち上がる。

そのため、 CI には向いていない。

そのため、 CI ようでは下記のオプションを利用する

```
--single-run
--browsers
```

`--single-run` を利用することで一度しか実行しないようにし、また `--browsers` を利用することで `Chrome` が立ち上がらない `HeadlessChrome` を立ち上げる。

HeadlessChromeを利用するには、下記のような設定を karma.conf.js に記載しよう。

```
customLaunchers: {
  HeadlessChrome: {
    base: 'Chrome',
    flags: [
      '--headless',
      '--disable-gpu',
      // Without a remote debugging port, Google Chrome exits immediately.
      '--remote-debugging-port=9222',
    ],
  }
}
```

これを `package.json` に記載して、２つを分ける

```
  "scripts": {
    ...,
    "test": "ng test",
    "test:ci": "ng test --single-run --browsers HeadlessChrome",
    ...
  }
```

#### 参考
https://github.com/angular/angular-cli/wiki/test#running-unit-tests
http://cvuorinen.net/2017/05/running-angular-tests-in-headless-chrome/
alexaに曲名を聞く

```
alexa 曲名を教えて
```
でOK.

```
alexa 今流れている曲名は？
alexa 今流れている曲の名前は？
alexa 今流れている曲の名前は何？
```
とかの `今流れている` を加えるとわかりませんと言われる…。意外と言っちゃうんですよ。
pylintのwarning解消メモ

## はじめに
pylintを何気なく入れてみたらゃwarningがたくさん出たので，内容をまとめておきます。

## pylintで設定を変更する方法

> 1. `pylintrc` in the current working directory
2. `.pylintrc` in the current working directory
3. If the current working directory is in a Python module, Pylint searches up the hierarchy of Python modules until it finds a `pylintrc` file. This allows you to specify coding standards on a module-by-module basis. Of course, a directory is judged to be a Python module if it contains an `__init__.py` file.
4. The file named by environment variable `PYLINTRC`
5. if you have a home directory which isn’t `/root`:
    1. `.pylintrc` in your home directory
    2. `.config/pylintrc` in your home directory
6. `/etc/pylintrc`

とあります。どこに書いても設定は反映されますが，今回はプロジェクトのルートに`.pylintrc`を追加しました。

pylintのテンプレの追加は以下でできます。

```bash
$ pylint --generate-rcfile > .pylintrc
```

## Warning
Warningの内容は以下でした。超基本的。

### インデントの文字数

```bash
Bad indentation. Found 2 spaces, expected 4 (bad-indentation)
Bad indentation. Found 4 spaces, expected 8 (bad-indentation)
```

インデントの文字数が設定と違うので怒られていました。
~~自分の環境ではスペース2文字分のインデントとなっているのが原因。これはpylintの設定を変更して対応しました。~~
PEP8(Pythonコードのコーディング規約)によるとこの対応はよろしくないことがわかりました。PEP8に，

> 1レベルインデントするごとに、スペースを4つ使いましょう。

とあるので，Pythonを各ときは4スペース使うようにした方がよさそうです。

### 末尾の空白

```bash
Trailing whitespace (trailing-whitespace)
```

末尾に不要な空白がないためにでてしまっているよう。

PEP8によると，

> **余計な空白文字を使うのはやめましょう**

ということのようです。
末尾や，ブラケットのはじめと終わりなどにスペース入れるのはやめたほうがよいですね。

### ファイル，クラス，メソッドの説明がない

```bash
Missing module docstring (missing-docstring)
Missing class docstring (missing-docstring)
Missing method docstring (missing-docstring)

```

モジュール（ファイル）の最初にこのモジュールの説明をコメントしておかないとでるようです。コメント書きましょう。

PEP8において，
> - すべての公開されているモジュールや関数、クラス、メソッドの docstring を書いてください。docstring は公開されていないメソッドには不要ですが、そのメソッドが何をしているのかは説明すべきです。このコメントは def の行のあとに置くべきです。
>
> - PEP 257 は良い docstring の規約です。もっとも重要なのは、複数行の docstring は """ だけからなる行で閉じることです。
> docstring が1行で終わる場合は、同じ行を """ で閉じるようにしてください。
クラスの最初とメソッドの最初にも必要になります。

とありますので，モジュール，関数，クラス，メソッドには`"""`で始まり，`"""`で終わるコメントを書くようにしましょう。


## 参考
[pylint 出力結果の警告についての備忘録](https://qiita.com/betweens/items/1b10b870538d90b07cef)
[Python のコーディング規約 PEP8 に準拠する](https://qiita.com/ynakayama/items/8616f4c0c6e372de9a42)
[pep8-ja](http://pep8-ja.readthedocs.io/ja/latest/)|
Python | Numpy > fileIO > 項目名の行付きファイルを読込む + (xxxする) + ファイルに項目名行とデータ行をともに保存する


```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
```

### 処理概要

関連: [ADDA > tool > average_Mueller_180114.py > v0.1 > average for Mueller matrix elements for various values of the ADDA parameters](https://qiita.com/7of9/items/08dd69f4752d8984e9e7)

```txt:test_file_180114.txt
pi napier Avogadro
3.1415 2.718 6.022
3.1415 2.718 6.022
3.1415 2.718 6.022
```

- 上記のようなファイルが複数ある
- データ部分だけxxxしたい
    - xxx: 例として平均
        - この記事では平均は実装しない。上記のリンクで実装済
- 処理結果をファイル保存したい
    - 問題
        - タイトル行の書出し
        - データ行の書出し
        - 両者のフォーマットが異なる (%s, %f)

### code

- 参考
    - 項目名行の保存: https://stackoverflow.com/questions/13255758/numpy-savetxt-tuple-index-out-of-range

```test_filewrite_180114.py
import numpy as np

INP_FILE = 'test_file_180114.txt'

# 1. preparation
with open(INP_FILE) as fd:
	title = fd.readline().rstrip('\n')
print('title:',title)
dat = np.genfromtxt(INP_FILE, skip_header=1)
print('dat:',dat)

# 2. main code
OUT_FILE = 'test_out_180114.txt'
title = np.array(title).reshape(1,)
with open(OUT_FILE, 'wb+') as fd:
    np.savetxt(fd, title, fmt='%s')
    np.savetxt(fd, dat, fmt='%f')

```

```txt:run
$ python3 test_filewrite_180114.py 
title: pi napier Avogadro
dat: [[ 3.1415  2.718   6.022 ]
 [ 3.1415  2.718   6.022 ]
 [ 3.1415  2.718   6.022 ]]
```

```txt:test_out_180114.txt
pi napier Avogadro
3.141500 2.718000 6.022000
3.141500 2.718000 6.022000
3.141500 2.718000 6.022000
```
Github導入メモ書き(編集予定)

2017/11/15 頃下書きしてたもの
####*Github導入してみた*
この本読んだ
[GitHubの教科書](https://www.amazon.co.jp/Web%E5%88%B6%E4%BD%9C%E8%80%85%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEGitHub%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E3%83%81%E3%83%BC%E3%83%A0%E3%81%AE%E5%8A%B9%E7%8E%87%E3%82%92%E6%9C%80%E5%A4%A7%E5%8C%96%E3%81%99%E3%82%8B%E5%85%B1%E5%90%8C%E9%96%8B%E7%99%BA%E3%83%84%E3%83%BC%E3%83%AB-Web%E5%88%B6%E4%BD%9C%E8%80%85%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E5%A1%A9%E8%B0%B7-%E5%95%93-ebook/dp/B00QPSXY1I/ref=sr_1_2?ie=UTF8&qid=1484447053&sr=8-2&keywords=Github)
ところどころ構成が変わってたが、なんかと導入できたのでここに記す。

###Gitのインストール

[sourcetree](https://ja.atlassian.com/software/sourcetree)
ここからインストール特に問題なくインストールできた。
#①リポジトリ作成
|Create a new repositoryのページ|
|----|
|![G1.jpg](https://qiita-image-store.s3.amazonaws.com/0/146040/5664b9b8-b1a6-4af2-30fa-fd0abda4e777.jpeg)|

・Repository nameにはリポジトリ名を書いたちなみにTest
・Description (optional)にはリポジトリの説明文かな？
・Public(公開)を選択
・Initialize this repository with a READMEはイマイチピンとこなかった
　README.mdが作成されるっぽい
Create repositoryをクリックしたら完成やったぜ

#②SSH Keyの作成
SSH Keyってなんぞや？って感じだったけどGoogle先生によると公開鍵の意味らしい。
SSH Keyの作成はMacとWindowsではコマンドが違う。僕はどっちも導入したが
今回はMacで。

```
ターミナル
pbcopy < ~/.ssh/id_rsa.pub
```
(これ何してんの？後日付け足し)
コマンドを叩いたら、GithubのSettingページから「SSH and GPG keys」をクリック。
SSHKeyのkeyにpbcopyでとっておいた内容をペースト、「Add key」で終わり。

|SSH keysのページ|
|----|
|![Github2.jpg](https://qiita-image-store.s3.amazonaws.com/0/146040/0ddf8c0c-edd6-8cc7-e368-dd5f4c7797c1.jpeg)|
WSLのbash上でコマンドプロンプトの環境変数を取得する

やりたかったのは、WSLのbashから、Windowsユーザのホームディレクトリ `%USERPROFILE%` を取得して、bashの環境変数に入れなおすことでした。

まずイマイチな方法。

```shell-session
$ export USERPROFILE=$(cmd.exe /c "echo %USERPROFILE%")
$ echo $USERPROFILE
C:\Users\username
```

一見、取れているのですが、この値をもとにbash上でcdしてみます。
\# パイプで渡している`tr`と`sed`は、先頭に`/mnt/`をつけたり、ドライブレターを小文字にしたり、セパレータを`/`に変えたりしてます

```shell-session
$ cd $(echo $USERPROFILE | tr '\\' '/' | sed -E "s/^(.):/\/mnt\/\l\1/")
: そのようなファイルやディレクトリはありません
```

この通り、失敗します。

原因は`%USERPROFILE%`を出力しているコマンド、`echo`でした。
`echo`は通常最後に改行コードを追加するので、それもひっくるめてbashの環境変数`$USERPROFILE`に格納されているようです。

次に成功した方法。

`echo`で改行させなければよいのですが、コマンドプロンプトの`echo`は改行コード無しのオプションがないので、代わりに`set`コマンドで`%USERPROFILE%`を出力します。

```shell-session
$ export USERPROFILE=$(cmd.exe /c "set /P<NUL=%USERPROFILE%")
$ echo $USERPROFILE
C:\Users\username
```

出力されている結果は一見同じですが、問題なくcdできます。

ちなみに、`echo`を使っても`sed`等で末尾の改行コードを削除してもいけます。

----

追記。
ビルド17063以降なら、`WSLENV`という環境変数を使えば、相互に受け渡し可能らしいです。
https://news.mynavi.jp/itsearch/article/hardware/3364
Git 自分なり Cheat sheet V1.0.0

<hgroup>
<h1>Git 自分なりCheat sheet</h1>
<h2>gitの使い方</h2>
</hgroup>
<dl>
 <dt>Gitをwindowsのコマンドプロンプトで操作できるようにする</dt>
 <dd><a href="https://git-scm.com/" target="_blank">https://git-scm.com/</a>からGitをダウンロードし、インストール</dd>
 <dd>※参照記事 <a href="https://qiita.com/taiponrock/items/632c117220e57d555099" target="_blank">"コマンドラインからGitを使う（for Windows）@taiponrock
"</a></dd>
 <dt>Githubの登録</dt>
 <dd><a href="https://github.com/" target="_blank">Githubページ</a>よりユーザー登録</dd>
<dd>"User名"、"メールアドレス"、"パスワード"をメモ</dd>
 <dt>インストール確認</dt>
 <dd>Windowsのコマンドプロンプトにて`git --version`を入力</dd>
 <dd>※'git version 〇.〇.〇.windows.〇'の様に表示されたらインストール完了</dd>
</dl>
<h2>初期設定</h2>
<dl>
 <dt>ユーザー名の登録</dt>
 <dd>'git config --global user.name "Githubのユーザー名"'</dd>
 <dt>メールアドレスの登録</dd>
 <dd>'git config --global user.email "Githubのメールアドレス"'</dd>
 <dt>設定の確認</dt>
 <dd>'git config -l'で設定の確認</dd>
</dl>
<h2>Local Repository 作成</h2>
<dl>
 <dt>ディレクトリの作成</dt>
 <dd>mkdir "ディレクトリー名"</dd>
 <dd>※'mkdir'は"Make Directory"の略</dd>
 <dt>作成したディレクトリへ移動</dt>
 <dd>cd "ディレクトリー名"</dd>
 <dd>※'cd'は"Change Directory"の略</dd>
 <dt>ローカルリポジトリの作成</dt>
 <dd>コマンドプロンプトに'git init'を入力</dd>
 <dd>'init'は"Initialize"の略</dd>
</dl>
HyperSwitchでアプリが非表示になった際の対応

Macにて複数ウィンドウを立ち上げているアプリケーションを開いている際の切り替えに便利な「HyperSwitch」ですが、長時間利用し、アプリケーションを起動停止を繰り返していくと、なぜかHyperSwitchにアプリケーションが表示されなくなってしまう、ということがあります。

その時の対応ですが、結論から言うと、HyperSwitchを再起動すれば治ります。

ただし、HyperSwitchの再起動はデフォルトではちょっとやりにくい。その場合は、HyperSwitchをMacのメニューバーに表示しておくことで、再起動しやすくなります。

やり方は、HyperSwitchのPreference -> Appearance -> Show HyperSwitch in the menu bar にチェックを入れるだけ。

これで現在開いているアプリケーションをHyperSwitchが再度認識してくれます。
【マメ知識】アプリが生成した、可読性の悪いjsonファイルの可読性をよくする方法

アプリケーションが自動生成したJSONファイルに改行が一つもなく、扱いに困ったことはありませんか？
私は結構よくあります。例えば**Watson Conversation**のダイアログファイルとか、**Node-RED**のフロー定義ファイルなど。
こうしたファイルがあると、人間がファイルを読めない、手修正ができない、githubなどで変更管理ができないなど、よくないことだらけです。
本当にマメ知識なのですが、そういう場合の対応方法のメモです。
jqというツールを使って対応します。

Macの場合、jqコマンドはbrewを使って導入可能です。

```
$ brew install jq
```

jqコマンドは使い方に多少クセがあります。使う時は以下の呼び出し方をして下さい。
original.jsonが改行のないオリジナルファイル、modified.jsonが見やすく整形されたものです。

```
$ cat original.json | jq . > modified.json
```

整形後のサンプル(Node-REDのフローファイル)の一部を以下に添付します。

```
[
  {
    "id": "4c125775.97ce28",
    "type": "tab",
    "label": "open_cv",
    "disabled": false,
    "info": ""
  },
  {
    "id": "82732063.5ec84",
    "type": "tab",
    "label": "tts",
    "disabled": false,
    "info": ""
  },
  {
    "id": "32f3d15f.0d9bbe",
    "type": "tab",
    "label": "stt",
    "disabled": false,
    "info": ""
  },
  ... (以下略)
```
Python > fileIO > ファイルの一行目(空白含む)を取得する > open() as fd | title = fd.readline().rstrip('\n')

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
```

### 処理概要

```txt:mueller(一部)
theta s11 s12 s13 s14 s21 s22 s23 s24 s31 s32 s33 s34 s41 s42 s43 s44
0.00 1.4154797779E+02 0.0000000000E+00 0.0000000000E+00 2.0774468080E-11 0.0000000000E+00 1.4154797779E+02 1.5202490767E-10 0.0000000000E+00 0.0000000000E+00 -1.5202490767E-10 1.4154797779E+02 0.0000000000E+00 2.0774468080E-11 0.0000000000E+00 0.0000000000E+00 1.4154797779E+02
1.00 1.4140075324E+02 -5.8903789321E-03 1.0170761154E-11 2.4386238017E-11 -5.8903789321E-03 1.4140075324E+02 1.4176203701E-10 -3.5948816258E-12 1.0178382783E-11 -1.4176220755E-10 1.4140075276E+02 9.9513428708E-03 2.4385372022E-11 3.6038425530E-12 -9.9513428708E-03 1.4140075276E+02
2.00 1.4095992060E+02 -2.3466973506E-02 2.0327789144E-11 2.8007664918E-11 -2.3466973506E-02 1.4095992060E+02 1.3134304986E-10 -7.1547834934E-12 2.0357543715E-11 -1.3134441652E-10 1.4095991305E+02 3.9706966470E-02 2.8000740778E-11 7.1871195463E-12 -3.9706966470E-02 1.4095991305E+02
3.00 1.4022799573E+02 -5.2447620268E-02 3.0438949100E-11 3.1616176968E-11 -5.2447620268E-02 1.4022799573E+02 1.2079755856E-10 -1.0660883463E-11 3.0504182908E-11 -1.2080217069E-10 1.4022795770E+02 8.8972728682E-02 3.1592843704E-11 1.0725708703E-11 -8.8972728682E-02 1.4022795770E+02
4.00 1.3920914771E+02 -9.2366899825E-02 4.0475376063E-11 3.5192981027E-11 -9.2366899825E-02 1.3920914771E+02 1.1015915993E-10 -1.4090607479E-11 4.0588197313E-11 -1.1017007824E-10 1.3920902824E+02 1.5726195578E-01 3.5137810177E-11 1.4191725769E-11 -1.5726195578E-01 1.3920
```

上記の１行目の「theta s11 s12 s13 s14 s21 s22 s23 s24 s31 s32 s33 s34 s41 s42 s43 s44」を取得したい。

### code v0.1

参考: [How do I read a text file into a string variable in Python](https://stackoverflow.com/questions/8369219/how-do-i-read-a-text-file-into-a-string-variable-in-python)

リンクの処理から１行目を取る方法に変更した。

```test_readTitle_180114.py
IN_FILE = 'mueller'
with open(IN_FILE, 'r') as fd:
    title = fd.read().split('\n')[0]

print(title)

```

```txt:run
$ python3 test_readTitle_180114.py 
theta s11 s12 s13 s14 s21 s22 s23 s24 s31 s32 s33 s34 s41 s42 s43 s44
```

### code v0.2

@shiracamus さんの[コメント](https://qiita.com/7of9/items/b82d19718d574e014255/#comment-b1669027e605b7e219b8)にてパフォーマンスの良いreadline()使用例を教えていただきました。

情報感謝です。

```test_readTitle_180114.py
IN_FILE = 'mueller'

with open(IN_FILE, 'r') as fd:
	title = fd.readline().rstrip('\n')
print(title)
print('---')

```

```txt:run
$ python3 test_readTitle_180114.py 
theta s11 s12 s13 s14 s21 s22 s23 s24 s31 s32 s33 s34 s41 s42 s43 s44
---
```

(Note: `---`はデバッグ用の文字列出力です)
[nodejs] bcryptのインストールでエラー

暗号化ライブラリのbcryptをインストールしようとしたらエラーになったのでメモ

- node v9.4.0
- yarn 1.3.2

原因はよくわからないけど`node-gyp`をグローバルインストールして、環境変数PYTHONにパスを設定したらうまくいきました。

```zsh
yarn global add node-gyp
PYTHON=$(which python) yarn add bcrypt
```
Dockerの基本機能と全体像のイメージを整理してみる

# 概要
初心者がDockerを勉強し始めて１か月
いろんな言葉が出てきて大混乱してきたのでDockerに関するイメージ図を作ってみた
とりあえず全体像のイメージとバラバラに投稿していた記事へのリンクを追加して整理

Dockerの基本機能は網羅したくこれからも更新予定
まだまだ粗々の内容なので随時コメント受付中

Docker環境は以下の記事で作成。環境は、

* Windows 10 Pro 64bit
* Docker for Windows

　[WindowsでDocker環境を試してみる](https://qiita.com/fkooo/items/d2fddef9091b906675ca "WindowsでDocker環境を試してみる")

## 参考

[プログラマのためのDocker教科書](https://amzn.to/2yPFeLI "プログラマのためのDocker教科書")
<a target="_blank"  href="https://www.amazon.co.jp/gp/product/4798153222/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4798153222&linkCode=as2&tag=docker_start_002-22&linkId=9441e48da75cca55809f6619933316a8"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=4798153222&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL110_&tag=docker_start_002-22" ></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=docker_start_002-22&l=am2&o=9&a=4798153222" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
わかりやすくてDockerの入門書的な良本です^^
みんな購入していて売れ行き好調なのか第2版が発売されていたのでリンク更新

## Docker 全体像イメージ図

![image.png](https://qiita-image-store.s3.amazonaws.com/0/188544/83bfdde7-54b3-230c-e265-4541b34a99e1.png)

## ① Dockerイメージのアップロード／ダウンロード

Docekr HubなどのDockerイメージが保存されているDocker RegistryからDockerイメージをダウンロードしてローカルにキャッシュする
自分でイメージを作成する
作成したイメージをDocker Hubにアップロードして共有する

### 投稿記事
　[WindowsでDocker Hubからイメージをダウンロードしたりアップロードしたりしてみる](https://qiita.com/fkooo/items/8a29e308f9eb9ce7648e "WindowsでDocker Hubからイメージをダウンロードしたりアップロードしたりしてみる")

## ② イメージからDockerコンテナ作成、コンテナ操作

イメージからDockerコンテナを作成、起動する
コンテナの起動時にCPU／メモリ／ディスク、ポートなどを自分で指定してコンテナを起動する
コンテナのエクスポート／インポート、イメージ化などDockerならではの移植性を試してみる

### 投稿記事
　[Docker for Windowsでイメージからコンテナを生成／操作してみる](https://qiita.com/fkooo/items/ad7d023b59df71cc9a60 "Docker for Windowsでイメージからコンテナを生成／操作してみる")

## ③ コンテナ起動設定をDockerfileに定義する

イメージ／コンテナ作成時の設定をDockerfileに定義してコンテナ起動してみる
Infrastructure as Codeを体験する

### 投稿記事
　[Windowsで構成情報をDockerfileに定義してイメージを作成してみる](https://qiita.com/fkooo/items/53b2ea865e8c2c7fec27 "Windowsで構成情報をDockerfileに定義してイメージを作成してみる")

## ④ 複数コンテナをDocker Composeを使って一元管理する

コンテナ同士の連携設定をdocker-compose.ymlファイルに定義し、Docker Composeを使って複数コンテナを一元管理する

### 投稿記事
　[WindowsでDocker Composeを使ってマルチコンテナ環境を作ってみる](https://qiita.com/fkooo/items/69a050da265c712763ec "WindowsでDocker Composeを使ってマルチコンテナ環境を作ってみる")

## ⑤ Docker Machineを使ってDockerエンジン（実行環境）を構築する

Docker Machineコマンドを使って、クラウド環境など別の環境でも作成したコンテナが起動できるようDockerエンジン（Dockerの実行環境）を構築する
マルチホスト環境への足掛かりにする

### 投稿記事
　[WindowsでDocker Machineを試してみる](https://qiita.com/fkooo/items/356c9954181c00818f12 "WindowsでDocker Machineを試してみる")

## 最後に

イメージ図はExcelで作成
いまいちうまく書けず時間がかかるのでもっと楽に書けるツールがないか模索中
いいツールあるよ！って方はコメントください
docker上のDBにlocalhostからアクセスする

# 何がやりたかったか

docker上のpostgres DBのER diagramを自動生成するために、ツールとdocker上のDBを繋げたい

# どうやったか

https://ja.stackoverflow.com/questions/31491/postgres%E3%81%AEdocker%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%ABpsql%E3%81%A7%E6%8E%A5%E7%B6%9A%E3%81%97%E3%81%9F%E3%81%84

portsの設定を明記しないとbindされないので、自分の場合`docker-compose.yml`に下記を加えて、dockerでpostgresを起動したらツールから接続できた。

```
   postgres:
+    ports:
+      - "5432:5432"
```

# おまけ：postgreのER図生成ツール

Valentina DBなども試したが、無料の中では[dbeaver](https://dbeaver.jkiss.org/)がおすすめ（eclipse依存）
pyenvエラー対応

# Mojave(v10.14)で下記エラーに出くわしたら

```
$pyenv install 3.6.4
...
BUILD FAILED (OS X 10.14.2 using python-build 20180424)
...
zipimport.ZipImportError: can't decompress data; zlib not available
make: *** [install] Error 1
```

[[MacOS Mojave]pyenvでpythonのインストールがzlibエラーで失敗した時の対応
](ttps://qiita.com/zreactor/items/c3fd04417e0d61af0afe)

# High Sierraにして下記エラーに出くわしたら

```bash
$pyenv install 3.6.3
Downloading Python-3.6.1.tar.xz...
-> https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tar.xz
Installing Python-3.6.1...
ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?

Please consult to the Wiki page to fix the problem.
https://github.com/pyenv/pyenv/wiki/Common-build-problems


BUILD FAILED (OS X 10.13.1 using python-build 20160602)
```

対処法は、[上記エラー内のリンク](https://github.com/pyenv/pyenv/wiki/Common-build-problems#error-the-python-ssl-extension-was-not-compiled-missing-the-openssl-lib)か、https://github.com/pyenv/pyenv/issues/993 を参照

```bash
$CFLAGS="-I$(brew --prefix openssl)/include" LDFLAGS="-L$(brew --prefix openssl)/lib" pyenv install 3.6.3
```

# opensslのversion up

上記でダメなら、opensslのversionが古い可能性がある。
ex, MBP 2016モデルのOSXのデフォルトは0.9.8で古い

```bash
# 事前確認
$openssl version
OpenSSL 0.9.8zh 14 Jan 2016
$which openssl
/usr/bin/openssl
$echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/bin
# アップデート
$brew install openssl
$brew list openssl
/usr/local/Cellar/openssl/1.0.2n/.bottle/etc/ (8 files)
/usr/local/Cellar/openssl/1.0.2n/bin/c_rehash
/usr/local/Cellar/openssl/1.0.2n/bin/openssl
/usr/local/Cellar/openssl/1.0.2n/include/openssl/ (75 files)
/usr/local/Cellar/openssl/1.0.2n/lib/libcrypto.1.0.0.dylib
/usr/local/Cellar/openssl/1.0.2n/lib/libssl.1.0.0.dylib
/usr/local/Cellar/openssl/1.0.2n/lib/engines/ (12 files)
/usr/local/Cellar/openssl/1.0.2n/lib/pkgconfig/ (3 files)
/usr/local/Cellar/openssl/1.0.2n/lib/ (4 other files)
/usr/local/Cellar/openssl/1.0.2n/share/man/ (1680 files)
$ln -s /usr/local/Cellar/openssl/1.0.2n/bin/openssl /usr/local/bin/openssl
# コンソールを再起動または`$source ~/.bash_profile`を行い、更新を確認
$openssl version
OpenSSL 1.0.2n  7 Dec 2017
```

シンボリックリンクは`$ln -s (brew --prefix openssl)/bin/openssl /usr/local/bin/openssl`でもいいと思う。
Swaggerを中規模プロジェクトに導入した話

# Swaggerとは

- 公式サイト
    - https://swagger.io/
- 概要
    - [Swaggerの概要をまとめてみた。](https://qiita.com/gcyata/items/342073fa7607fd4082bd)
    

# プロジェクト概要

ウェブサービスを利用。
フロントエンドとバックエンドでプロジェクトを分離している。

バックエンドは[こんな構成](https://qiita.com/tomoyamachi/items/6862cd8ffe220689f6c0)。
フロントエンドはReact-Redux。
開発メンバーは3~5人程度で、全員バックエンドもフロントエンドも触る。

# プロジェクト構成

![swagger_qiita.jpg](https://qiita-image-store.s3.amazonaws.com/0/14275/422ffae5-2586-1035-7ec8-2709926958b2.jpeg)

以下の4つのプロジェクトとして構成した。

- バックエンド
- フロントエンド
- SwaggerSpecのGenerator + SwaggerUI起動
- SwaggerCodeGenのカスタマイズ

# 利用した外部プロジェクト

## [Jsonnet](http://jsonnet.org/)
Googleが開発元のJSONを操作するDSL。
k8sの多環境設定などにも用いる。
よい紹介記事があるので、詳しくはそこで。
[Jsonnetの薦め](https://qiita.com/yugui/items/f4a5e0e9dbd8ddffa48e)

使い方としては、以下のように利用している。

- 各エンドポイントごとにファイルを分ける
- Request/Responseなど共通定義できるものはテンプレートファイルを作り、利用する
- すべてのファイルを集めて定義するファイルを作る

### メリット
- リソースごとに分けて定義できるので、可読性が高い
- テンプレートの関数をつくることができるので変更に強い
- 複数人での運用に向いている

### デメリット
- 個々のファイルに分けるのでSwagger Editorは使えない
- DSLに慣れるまでの時間
  - JSer,Rubyistであれば感覚で行けるレベル

## [swagger-js-codegen](https://github.com/wcandillon/swagger-js-codegen)
個人が開発しているJSでのswagger codegen。
もともとSwaggerがJavaでできているのでコンパイルが必要などの手間がかかる。
これであればnodejsだけで済むので、環境構築が容易。またJSで記述できるので、フロントエンドメインの人でも変更できる。

### メリット
- 環境構築が容易
- 出力ファイルの設定は本家と同じくmustacheなので必要となれば移植できる

### デメリット
- 公式ではない

## Swagger-Codegenで生成するファイル

### フロントエンド

- Request定義用ファイル
    - endpoint/HTTP Methodごとに関数を定義
    - APIへデータを送る前に関数を呼び出しチェックを行う
    - 必須項目/型/文字数/ファイルサイズなどをチェック
- validation用ファイル
    - GET以外の際に関数を定義
    - フォーム入力時に利用する
    - Redux-Formのvalidate時に呼び出す
- Response確認用ファイル
    - Responseに対し必須項目/型/文字数をチェック
    - バックエンド側でもチェックするので重要度は低い

### バックエンド
バックエンドはSwaggerを導入する前に作りきってしまったので、構造を変更する必要があり、実際の導入には至っていない。。

- Requestチェックファイル
    - endpoint/HTTP Methodごとに関数を定義
- Response定義ファイル
    - Responseの型などをチェック

## その他、自分の環境を汚したくない場合のコマンド

### JsonnetをDocker経由で実行

```
$ docker pull sparkprime/jsonnet
$ docker run -it -v /path/to/project:/app \
  --rm sparkprime/jsonnet \
  /app/aggregate.jsonnet \
  -o /path/to/output.json
```

### swagger-uiサーバをDocker経由で立てる

```
$ docker pull swaggerapi/swagger-ui
$ docker run -p 8080:8080 \
  -e SWAGGER_JSON=/app/output.json \
  -v /path/to/output.json:/app/output.json \
  swaggerapi/swagger-ui
```

http://localhost:8080 でアクセス。

# まとめ
当然だが出力するファイルは冪等性を保つ必要があり、出力ファイルを直接編集してはいけない。
その前提でフロント/バックエンドとも設計していれば、開発において非常に有効。

ここで用いている言語/技術は学習曲線が低く、どれも導入しやすいものなので、試してみる価値はある。

知見が欲しい人はご連絡ください。
JSerがGolang始めてみた 〜 3. オブジェクト指向的な書き方を学ぶ

[前回](https://qiita.com/k_tada/items/172a89c12bc2d8d186d2)はDockerを使ってGolangを動かすところまでできました。

今回はWebAppは一旦置いておいて、Golangでのオブジェクト指向的な書き方を勉強します。
サンプルコードを読んでて頻繁に「なんだこれは！？」ってなったので・・・('A`)

# クラス
まずはクラスから。といってもGolangにクラスはありません。あるのはC言語とかで馴染み深い構造体です。

```go:構造体
type Person struct {
	name string
	age int
}
```

Golangでは、この構造体にメソッドを定義することでクラスっぽく利用することが出来ます。

```go:構造体にメソッドを定義
type Person struct {
	name string
	age int
}

// Person構造体にSayHelloメソッドを追加
func (p *Person) SayHello() {
	fmt.Println("[" + p.name + "]< こんにちは！")
}

func main() {
	taro := &Person{"たろう", 20}
	taro.SayHello() // [たろう]< こんにちは!
}
```
> ※ ここで`(p *Person)`の部分を`(p Person)`としても動作します。値渡しか参照渡しかの違いです。説明は割愛

ES5時代の`prototype`によるメソッド定義に似てますね。

# クラスの継承
Golangにはクラスが無いので、もちろん継承という機能はありません。
上述の構造体を用いて継承のような機能を実現するためには、構造体をネストさせます。

```go:クラスの継承
type Monster struct {
	name string
}

func (m *Monster) Attack() {
	fmt.Println(m.name + "の こうげき")
}

// Monsterを継承したSlimeを定義
type Slime struct {
	Monster
}

func (s *Slime) Call() {
	fmt.Println(s.name + "は なかまをよんだ")
}

// Slimeを継承したHealSlimeを定義
type HealSlime struct {
	Slime
}

func (h *HealSlime) Heal() {
	fmt.Println(h.name + "は たいりょくをかいふくした")
}

func main() {
	h := HealSlime{Slime{Monster{"ホイミン"}}}
	h.Attack() // ホイミンの こうげき
	h.Call()   // ホイミンは なかまをよんだ
	h.Heal()   // ホイミンは たいりょくをかいふくした
}
```

ちゃんと継承元のメソッドも呼べてますね。

# カプセル化
Golangでは、公開範囲は**名前の先頭が大文字か小文字か**で決まります。
大文字ならpublic、小文字ならprivateです。

```go:カプセル化
type Person struct {
	Name string
	age int // 年齢は非公開
}

// GetAgeメソッドは公開
func (p *Person) GetAge() int {
	return age - 5
}

// getRealAgeメソッドは非公開
func (p *Person) getRealAge() int {
	return age
}
```

おわり

次回こそ、WebAppの開発に着手します。

続く
動画をGifに変換する（CUI編）

QiitaとかGithubで記事を公開する時にGifを作成したいときがあります．
ぼくは動画でキャプチャ（Quicktime）してからGifに変換してます．

そのやり方をメモっておきます．

#結論

楽勝だぜ！

```shell
ffmpeg -i input.mp4 -an -r 5  -pix_fmt rgb24 -f gif out.gif
```

# 上記のコマンドの読み方

|`ffmpeg`    |[convertコマンド](https://www.ffmpeg.org/)                  |
|----------|--------------------------|
|***-i***        |入力ファイルパス（今回は`input.mp4`）      |
|***-an***|音声なしで出力||
|***-r***        |フレームレート（今回は5）        |
|***-pix_fmt***        |ピクセルフォーマット（今回はrgb24）        |
|***-f***|出力フォーマット（今回は`gif`）||

### 参考
[最新ffmpegのオプションまとめ](http://mobilehackerz.jp/archive/wiki/index.php?%BA%C7%BF%B7ffmpeg%A4%CE%A5%AA%A5%D7%A5%B7%A5%E7%A5%F3%A4%DE%A4%C8%A4%E1)
本当にEmacsにフォーカス当たってる？

ちょっとしたTipsです．
Emacsにフォーカスが当たっているかを直感的に確認できます．

# フォーカスが当たってないとダメなの？

フォーカス当たってない状態でEmacsのコマンドを打つと，予期しない結果になってイラッとしますよね．
例えば，fileをsaveしようとして`Cmd + s`を打ったら....

<img width="400" alt="Screen Shot 2018-01-09 at 15.52.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/144707/c7ed6053-9667-b060-580a-0354f8e4c4c4.png">

**あるある！！**
ウェブページを保存しようとしちゃいました．

# フォーカスが当たってるか直感的に確認する

フォーカスが外れてるときのMode Lineの色を変更します！

![out.gif](https://qiita-image-store.s3.amazonaws.com/0/144707/252ea3e9-349c-b715-d821-93e8a00b9d9d.gif)

こうなります．
やり方はこちら！

```el
;; EmacsにFocusが外れている際のFace
(defun my-out-focused-mode-line()
  (set-face-background 'mode-line "purple3")) ;; 紫に変更

;; EmacsにFocusが当たっている際のFace
(defun my-in-focused-mode-line()
  (set-face-background 'mode-line "black")) ;; 元の色に変更

;; Hookする
(add-hook 'focus-out-hook 'my-out-focused-mode-line)
(add-hook 'focus-in-hook 'my-in-focused-mode-line)

```

# おわりに

Mode Lineをいじるのは楽しい & 便利
（cf. [EmacsのMode Lineを強化する](https://qiita.com/blue0513/items/99476f4ae51f17600636)）
line botのメモ

# コマンド
- yum update
- yum -y install vim-enhanced
- yum install nodejs
- sudo yum install npm
- node --version
- npm --version
- yum update openssl
- npm install -g now
- cd /
- mkdir myapp
- cd myapp/
- npm -y init
- npm install @line/bot-sdk express body-parser
- now
1つのvimrcをWindows/Linux/Macで使えるようにしよう!

全国1億2千万人のVimファンのみなさま、こんにちは。
今回は1つのvimrcをOSやvimのバージョンが違う場合にも、
エラーが発生しないで起動できるようにする設定方法をご紹介します。
# OS別の設定記載方法
```vim
if has("mac")
	" mac用の設定
elseif has("unix")
	" unix固有の設定
elseif has("win64")
	" 64bit_windows固有の設定
elseif has("win32unix")
	" Cygwin固有の設定
elseif has("win32")
	" 32bit_windows固有の設定
endif
```

こちらは鉄板ですが、OS別設定の記載方法です。
vimrcでは、```if has("OS名") ```を使用することで、指定したOSのみに適応する設定を記載することができます。
# 環境別の設定記載方法

```vim
if ( has ('python') || has('python3') )
	" python が必要な設定をここに書く
else
	" python がないときの設定
endif
```

```vim
if has('lua')
	" lua が必要な設定
else
	" lua がないときの必要な設定
endif
```

こちらは、上記のOS別設定の応用版です。
```if has("依存関係名") ```を使用することで、
Vimインストール時に、有効化されているオプションの依存関係別に設定することが可能です。
現在自分がインストールされているVimの有効化されているオプションが知りたい場合は、
```vim --version ```で。

# Vimバージョン別の設定記載方法
Vimのバージョンによっては、未実装の機能があったりします。
例えば、バージョン8.0以下のVimのvimrcに```set breakindent```があった場合、
起動時にエラーが表示されます。
これでは、非常に使いづらいので、
「バージョン8.0のVimのみbreakindentを有効化する」という書き方にします。

```vim
if v:version >= 800|set breakindent|endif
```

上記の書き方で、実現することが可能です。

他にも、vimには```cryptmethod```というファイル暗号化機能があり、
既定値は一番古い暗号化方式である```zip```なんですが、
vimバージョン7.4からは、暗号化方式に```blowfish2```が追加されています。

```vim
if v:version >= 704 | set cm=blowfish2 | elseif | set cm=zip | endif
```
上記をvimrcに記載することで、
「Vimのバージョンが7.4以上の場合は暗号化方式に```blowfish2```を使い、7.4以下の場合は暗号化方式に```zip```を使う」
なんて設定もできてしまいます。

# 外部コマンドが存在する時のみの設定記載方法
外部コマンド(例えば、'git'とか。)の存在有無によって設定する、しないを分岐させることも可能です。

```vim
if executable('git')
    call dein#add("airblade/vim-gitgutter")
    call dein#add("tpope/vim-fugitive")
endif
```
上記では、プラグイン管理プラグイン「dein」でgit関連のプラグインをインストールする時の記載方法です。
これにより、gitコマンドがインストールされていない場合は、vim-gitgutterとvim-fugitiveをインストールしない、という風に記載することが可能です。
(そもそもdeinを入れている時点でgitコマンドは使える状態になっていますが、、)
## おわりに
上記3種の設定を行うことで、Vim起動時のOS違い、依存関係、バージョン違いのエラー表示を防ぐことができます。
せっかくマルチプラットフォームで使えるエディタを使っているんだし、OS毎にvimrcを用意するのではなく、1つのvimrcで完結したいですよね。
ER図作成のためのツール メモ

# ER図作成のためのツールのメモ

ER図を作成する無料ツールについて検討してみた
検討したのは、以下

* A5
* ERMaster
* ERMaster b
* ERMaster flute
* Amateras ERD

## 検討

検討は、自分が使いやすいかどうかなので、単なる主観です。
今回は、MySQLに接続する目的だけで検討

* A5
    * odbcやjdbcなどを経由しなくて良いので楽ちん
    * ER図: ... きたない... これじゃ、客先には出せないでしょ
    * テーブル定義書: 綺麗に出る
        * でも外部キーを一覧でも確認出来るようにして欲しい
        * 自分で論理名にFKとか付けて対応したけど、それは手間
    * 総評: Windowsだとこれが最初は楽かな？  
        * ER図がきたないので、ER図だけは別に書かないといけなくなるのが辛い
* ERMaster
    * jdbc経由で繋ぐためにドライバ落として来たりというのが手間
    * ER図:綺麗に描けるが、テーブル数が増えると遅くなる...らしい(今回はテーブル数少なかった)
    * テーブル定義書: 綺麗に出る
    * 総評： ER図は綺麗に描けるけど、接続に手間がかかるのとDBからの情報取得が遅い
        * テーブル数が多くなることを考えるとERMaster bを使っておくのが良いのか？
* ERMaster b
    * ERMasterからの拡張がいくつか行われている
    * 総評：まだ使い込んでいないので、評価出来ないが、ERMasterと同じ使い勝手なら、こちらに移行するかな？
* ERMaster flute
    * いろいろと機能拡張と機能削除が行われている
    * 総評：テーブル定義書を出すのが、この手のツールを使うメインの目的なので、今の状態では使えない
        * 将来使えるようになるといいが...
* Amateras ERD
    * Eclipseにはじめから入っているのは手軽で良い
    * 総評：手軽なだけで、今の所、仕事で使えるレベルにはない

## まとめ

ということで、WindowsならA5、それ以外ならERMasterで良いかという結論
ERMaster bが使いやすいようなら、そちらに移行したいが、ファイルの互換性が無いという噂が不安

今の所、メモ程度しか調べていないので、これから追記するかも？
VMware 上の Linux のディスク容量を拡張する

VMware 上の Linux の仮想ディスクの容量を増やし、パーティションの拡張を行う方法です。

# 環境
環境は以下の通りですが、OS に関してはゲスト OS が Linux であれば本記事で紹介する方法で設定可能かと思います。

* ホスト OS - Windows 10
* ゲスト OS - OpenSUSE Leap 42.2
* VMware - VMware Workstation 12 Player
* Image Format - VMDK

# 手順
手順は至って単純で2ステップに分解できます。

1. 仮想ディスクの容量を増やす
2. パーティションの拡張を行う

## 1. 仮想ディスクの容量を増やす
VMDK 形式のディスクは VMware から簡単にサイズ変更が可能なようです。

1. Virtual Machine Settings を開く
2. Hardware タブを選択
3. Hard Disk を選択
4. Disk utilities から Expand disk capacity を実行
5. Maximum disk size を変更

今回は元々 20GB だったところに 10GB 追加し、30GB に変更しました。

## 2. パーティションの拡張を行う
今回はルートとしてマウントされているパーティションの拡張を行う必要があったため、
[Gparted](https://gparted.org/) というパーティショニングを行えるツールを利用しました。

### GParted の準備
パーティショニングツールである GParted を VMware で使う準備をします。

1. [GParted Live CD](https://gparted.org/livecd.php) の ISO イメージをダウンロード
2. Virtual Machine Settings を開く
3. CD/DVD タブを選択
4. Device status の Connect at power on をチェック
    * こうしておかないと VMware の BIOS がこのデバイスを認識しないため、ディスクブートに失敗します
5. Connection から Use ISO Image を選択
6. Browse... から GParted LiveCD の ISO イメージを選択

### VMware から GParted の起動
BIOS から GParted Live CD を起動し設定をパーティションを拡張します。

VMware でディスクブートを行うには BIOS 画面で ESC キーを押して　Boot Menu を開けば良いのですが、
デフォルト設定だと画面が一瞬しか表示されずタイミングが非常にシビアです。
また、ESC を連打してしまうと、開いた Boot Menu が ESC で閉じてしまうという罠もあります。

そこで、VMX ファイルに bios.bootDelay = "2000" という設定を追加しておき、BIOS が表示される時間を長くしておきます。
VMX ファイルは Windows のデフォルト設定では C:\Users\ユーザー名\Virtual Machines\VM 名\VM 名.vmx に配置されています。


1. VMX ファイルに bios.bootDelay = "2000" を追記
2. 仮想マシンを起動
3. VMware の BIOS 画面で ESC を押し Boot Menu に入る
4. Boot Menu から CD-ROM Drive を選択する
5. GParted を起動しパーティショニングを行う

以上です！

# 参考
* [ディスク パーティションのサイズを増やす (2078586)](https://kb.vmware.com/s/article/2078586)
* [Workstation - Power On > Select Boot Device |VMware Communities](https://communities.vmware.com/thread/449235)
読書メモ（2018年）

プログラミング記事に関することではないから、Qiitaに書くか悩んだけれども。

- Qiita書いてみたい。
- 後々何読んだか思い返したい。
- これ読んだ人が何かしらの影響受けて読書はまってくれれば。

という思いが勝ったので、人生初Qiitaへの投稿をしてみる。

- タイトル2018年にしているけれども、読んだ本増えて来たら、月ごとに分けていく予定。
- 随時更新していく予定。

#読んだ本
2018年に読んだ本は以下の通り。

- [スクラム実践入門 - 技術評論社](http://gihyo.jp/book/2015/978-4-7741-7236-1)
 - [スクラムガイド](http://www.scrumguides.org/docs/scrumguide/v2017/2017-Scrum-Guide-Japanese.pdf)だと抽象的すぎて「実際どう運用するん？」と思う様なケースについても的確に書いてくれているイメージ。個人的にはこっちの方がガイドとして優秀だと思う。
- [頭の回転が速くなるすごい!法 - 三笠書房](http://www.mikasashobo.co.jp/c/books/?id=100796400)
 - 速読関連の本でも有名な佐々木先生の本。一朝一夕では身につかないけど、日々この本に書かれているトレーニングを実践する中で変化できそうな感覚が確かにある。これからも続けていこうと思う。

#Qiitaで初めて書いてみて
- ブログよりは簡単に書けるから続けやすそう
- ただ、ブログとして書くのは違う気もする（今回はごめんなさい）
- Markdown記法覚えるのは少しコスト掛かるけど、これで知識残せるなら安いもの

結論としては、今後も気が向くタイミングで続けていこうと思う。
多段プロキシーでMySQLに接続するメモ

# 多段プロキシーでMySQLに接続するメモ

はじめてQiitaに書いてみる。
とりあえず多段プロキシーでMySQLに繋がないといけなかったので、設定のメモだけ

最近多段プロキシーでMySQLにアクセスしないといけなくなったので、忘れないように設定等をメモしてみる

※Qiitaってmermaid.js使えないのか...

## 用語・略語

* A5: SQL開発ツール(Windows用)
* VB: VirtualBox
* AP: アプリケーション

## 概要

### 環境

* クライアント側
    * A5でMySQLに接続する
    * クライアントOSはWindows10
    * VirtualBoX上でCentOS7を起動
* サーバー側
    * 踏み台サーバー経由でAPサーバーへ接続
    * APサーバーからしかMySQLに接続出来ない

#### IPアドレス(説明のために適当に記載)

* Windowsクライアント: 192.168.0.10
* CentOS(VB): 192.168.56.200
    * ホストオンリーアダプターにWindows側から接続
* 踏み台サーバー: 192.168.0.100
* APサーバー: 192.168.0.101
* MySQLサーバー: 192.168.0.102

### 接続方法

* まずCentOSからMySQLに直接接続するためのSSHトンネルを作成する
    * CentOS7のポート10000がMySQLのポート3306に接続される
* クライアントからは、SSHトンネル経由でCentOSに接続
    * CentOS7のポート10000に接続

### 概要図

※Qiitaでは、mermaid.js使えないのは辛い。他で作って図だけ挿入
<img width="828" alt="スクリーンショット 2018-01-14 3.09.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/230987/928865db-224b-851d-6db2-58881853155a.png">


## CentOS .ssh以下の設定

### configの設定

踏み台サーバーへのログインは公開鍵でログインする

```text:.ssh/config
Host fumidai
  Hostname 192.168.0.100
  User user100
  IdentityFile=~/.ssh/id_rsa_fumidai

Host ap_server
  Hostname 192.168.0.101
  User user101
  ProxyCommand ssh fumidai nc %h %p
```

### トンネル(2)の作成

`ssh -f -N -C -L 10000:MySQLサーバー:3306 APサーバー`

実際にはIPアドレスで以下のように指定

`ssh -f -N -C -L 10000:192.168.0.102:3306 192.168.0.101`

### トンネル(1)経由でA5からMySQLサーバーへ接続

A5にはトンネル経由の接続が設定可能なので、A5のSSHトンネルの設定は以下

* SSH2ホスト名：192.168.56.200
* ユーザーID: User10
    * CentOS7のユーザーID
* パスワード: CentOS7のパスワード
* パスワード認証で接続

## まとめ

* とりあえず上記設定で、A5から直接MySQLサーバーに接続出来た
* ERMaster等で接続する場合は、WindowsマシンからCentOS7に対してSSHトンネルを先に作成する必用がある
  * putty等でトンネリング設定をして接続しておけば良いはず
* Macの場合は、CentOSで設定したsshトンネリングを直接記載すれば良いだけなので、より簡単に接続出来る
    * ※もう開発にWindowsマシン使うのやめたい！(切実な思い)
Excel 列番号を数字で表示するのを簡単に

Excelで、列番号はA、B、C、・・・とアルファベットで表示されるが、これをたまには数字で表示したいというのは普通に考えることだろう。
![R1C1.png](https://qiita-image-store.s3.amazonaws.com/0/229452/53271eee-7b6e-e335-f4da-2700f696f313.png)

しかしこれ、Excelのオプションから「数式」→「R1C1参照形式を使用する」という訳わからん項目にチェックを入れるという面倒なことをしなければならず、このオプション設定をリボンやツールバーに追加することもできない。・・・なぜだ。需要はあるはずなのに。表示が変わると混乱するからかな？VBAまでやってる人でないと、このオプション設定に気付くこともほぼないだろう。
そこでこの表示切り替えについては、下記のマクロをPersonal.xlsに入れて、リボンやツールバーに追加すると良いだろう。これを実行するたびに、列番号の表示方法が切り替わる。

```vbnet
Sub changeReferenceStyle()
    With Application
        If .ReferenceStyle = xlA1 Then
            .ReferenceStyle = xlR1C1 '列番号を数字で表示
        Else
            .ReferenceStyle = xlA1 '列番号をアルファベットで表示
        End If
    End With
End Sub
```

列番号の表示のほか、数式の置換がやりやすかったりとメリットはあるけど、まあそれは使っていって実感すれば良いでしょう。
JavaScriptを書く時に参考にすると良いスタイルガイド

# Google JavaScript Style Guide
* 英語：https://google.github.io/styleguide/jsguide.html
* 和訳：https://www38.atwiki.jp/aias-jsstyleguide2/

# JavaScript style guide - Mozilla - MDN
* 英語：https://developer.mozilla.org/en-US/docs/Mozilla/JavaScript_Tips
* 和訳：https://developer.mozilla.org/ja/docs/Mozilla/JavaScript_style_guide

# jQuery JavaScript Style Guide
* 英語：https://contribute.jquery.org/style-guide/js/

# Airbnb JavaScript Style Guide
* 英語：https://github.com/airbnb/javascript
* 和訳：https://mitsuruog.github.io/javascript-style-guide/
セミコロンに関する ESLint ルール

# まえがき

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">ESLint seems like the light saber of the ASI Wars these days.</p>&mdash; Nicholas C. Zakas (@slicknet) <a href="https://twitter.com/slicknet/status/951853888600068096?ref_src=twsrc%5Etfw">2018年1月12日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

[JavaScript の言語仕様に ASI 利用に関する警告を追加しようという動き](https://github.com/tc39/ecma262/pull/1062)があって、セミコロン スタイルに関する議論が再燃しているようです。その中で「スタイルに関わらず避けられない落とし穴はあるので Linter ツールを利用すべき」というお話もあったので、セミコロンに関する ESLint ルールをまとめました。

> ASI とは Automatic Semicolon Insertion (自動セミコロン挿入) の略。改行のある場所で構文エラーが検出されたときに自動的にセミコロンを挿入して再解釈する JavaScript の言語機能のこと。

# セミコロン関連ルール

- 書式に関するもの
  - [semi](https://eslint.org/docs/rules/semi) ... 文 (Statement) の末尾にセミコロンを書くか書かないかを一貫させるルールです。
  - [semi-spacing](https://eslint.org/docs/rules/semi-spacing) ... セミコロン前後の空白を一貫させるルールです。
  - [semi-style](https://eslint.org/docs/rules/semi-style) ... セミコロンを行末に書くか、次の文 (Statement) の行頭に書くかを一貫させるルールです。
  - [no-extra-semi](https://eslint.org/docs/rules/no-extra-semi) ... 余分なセミコロンを禁止するルールです。余分なセミコロンには、空文 (EmptyStatement) と空クラスメンバ (Empty ClassElement) があります。
- バグを防ぐもの
  - [no-unexpected-multiline](https://eslint.org/docs/rules/no-unexpected-multiline) ... 意図に反して2つの文が接続された箇所を警告するルールです。セミコロンを書かないスタイルでの ASI による落とし穴を警告できます。
  - [no-unreachable](https://eslint.org/docs/rules/no-unreachable) ... 到達できない文を警告するルールです。セミコロンを常に書くスタイルでの ASI による落とし穴を警告できます。

## セミコロンを常に書くスタイル

```json:.eslintrc.json
{
    "rules": {
        "semi": ["error", "always"],
        "semi-spacing": ["error", {"after": true, "before": false}],
        "semi-style": ["error", "last"],
        "no-extra-semi": "error",
        "no-unexpected-multiline": "error",
        "no-unreachable": "error"
    }
}
```

こちらのスタイルで注意すべきは、`return` 文などの一部の文が改行を許容しないことです。例えば

```js:例
function f() {
    return
        42;
}
console.log(f()); //→ undefined
```

の場合、`return` と `42` の間にセミコロンが自動挿入され、`f()` の戻り値は `undefined` になります。このとき `42;` は到達できない文になるため、`no-unreachable` ルールによって警告されて気がつくことができるでしょう。

> ちなみに仕様書では、このような改行が許可されない場所に `[no LineTerminator here]` というマークが付けられています。
> https://www.ecma-international.org/ecma-262/8.0/#prod-ReturnStatement

## セミコロンを省略するスタイル

```json:.eslintrc.json
{
    "rules": {
        "semi": ["error", "never", {"beforeStatementContinuationChars": "never"}],
        "semi-spacing": ["error", {"after": true, "before": false}],
        "semi-style": ["error", "first"],
        "no-extra-semi": "error",
        "no-unexpected-multiline": "error",
        "no-unreachable": "error"
    }
}
```

このスタイルで注意すべきは、文頭が特定の文字 (`(`や`[`など) の場合に前の文とつながってしまうことです。例えば

```js:例
const a = 42
["a", "b"].forEach(x => console.log(x))
```

の場合、`42["a", "b"]` というプロパティアクセスになってしまい、`42["a", "b"].forEach` つまり `new Number(42).b.forEach` は未定義なので `TypeError` (いわゆるヌルポ) になります。このとき `no-unexpected-multiline` ルールによって警告されるため気づくことができるでしょう。

# あとがき

セミコロンを常に書くスタイルでも、省略するスタイルでも、ASI は意図しない動作の原因になります。しかし幸運にも ESLint を利用することで意図しない動作は完全に検出できます。活用しましょう!

また、スタイルを切り替えるのも上記の設定を行って `eslint --fix` コマンドを利用するだけと簡単です。自分のスタイルに悩んでいる場合、`eslint --fix` で自分のコードベースに適用するとどうなるのかを見てみるのも良いかもしれませんね。

以上