OmniAICreator/Qiita-1.07M huggingface dataset:
Michael Nielsen著のオンライン書籍「ニューラルネットワークと深層学習」の翻訳に参加しました

日本語訳に参加させていただいた書籍は下記のリンクから読めます！
オリジナル書籍：[Neural Networks and Deep Learning](http://neuralnetworksanddeeplearning.com/index.html)
日本語版書籍：[ニューラルネットワークと深層学習](https://nnadl-ja.github.io/nnadl_site_ja/index.html)

量子コンピューティング分野の物理学者Michael Nielsenという方の執筆したオンライン書籍です。
この書籍の内容はニューラルネットの入門者向けとなっています。
「なぜ？」の部分について詳しく、そしてとても分かりやすく記述されていておすすめです。
本書を読むと、例えば以下の疑問について説明できるようになります。

* なぜ2層ニューラルネットは任意の関数を近似できるのか
* なぜ勾配消失や勾配爆発などの問題が起きるのか
* なぜ正規化項にバイアスは含まれないのか

個人的には、深層学習を学び始めた人が、
[ゼロから作るディープラーニング](https://www.oreilly.co.jp/books/9784873117584/)の次に読むべき書籍は本書だと思っています。

# 翻訳参加のきっかけ

2017年1月から、機械学習を入門し始めました。
その中でも特に流行りのニューラルネットにキャッチアップしようと、
「[ゼロから作るディープラーニング](https://www.oreilly.co.jp/books/9784873117584/)」とかStanfordの教材[CS231n](http://cs231n.stanford.edu/)とか一通りさらいました。
誤差逆伝播法や畳込みを理解して、どんどん楽しくなっていったのを覚えています。

その直後、そろそろ論文読める頃かなとmaxoutの論文を読み始めたら、
「universal approximator theorem」という言葉が出てきて、
調べてたどり着いたのがこのオンライン書籍。  

ニューラルネットの本質を初心者でも分かるように、丁寧に説明してくれています。
「なぜ？」に答える内容により知的好奇心を刺激されて、勉強の楽しさを再確認でき、
単純に読んで良かったと思えた本でした。  

しかし日本語版は1~4章までしか出ておらず、5,6章はまだ翻訳されていない模様。
というのもそもそもオリジナル（英語版）の6章が書かれたのが最近でした。
英語が大好きな（≠得意な）私としては、これは翻訳作業を楽しめてさらにOSS貢献までできるチャンス！と思い、
翻訳プロジェクト参加を申し出たのでした...

# 翻訳作業履歴

## 担当

私が翻訳を担当したのは、以下の2章です。

* 5章:[ニューラルネットワークを訓練するのはなぜ難しいのか](https://nnadl-ja.github.io/nnadl_site_ja/chap5.html)
* 6章:[ディープラーニング](https://nnadl-ja.github.io/nnadl_site_ja/chap6.html)

## 実施スケジュール

|スケジュール|進捗|
|:----------|:--|
|1/26|翻訳しようと決心|
|1/26-1/30|5章翻訳|
|1/31-2/2|5章翻訳の校正(1回目)|
|2/3-2/4|5章翻訳の校正(2回目)|
|2/4|5章をpush|
|2/5-2/13|6章翻訳|
|2/14-2/16|6章翻訳の校正(1回目)|
|2/17|6章翻訳の校正(2回目)|
|2/17|6章翻訳をpull request|

# 技術翻訳の感想

## 迷ったら行動すべき

「機械学習に対して、にわか知識しかない私なんかが翻訳なんてやっていいのかな」と思っていましたが、
参加表明してみると温かく迎えていただけて、
また何か質問すると、優しく教えて貰えました。

下に記述したように自身の勉強になりますし、
そもそも訳していく作業自体が本当に楽しかったので、
参加してよかったなと思っています。

## 勉強になる

正しく翻訳しようとすると、内容を深く理解する必要があります。
そのため、少しでも不明な点があると、調べて自分の中で解釈を確定させてから日本語化する、ということを行っていました。
おかげで、単に英語を読むだけのときの30倍くらい時間かかりました（体感）
普段ちゃんと理解していないのかな、と思いました。

私の訳した部分の中では特に、勾配爆発や勾配消失の起きる要因について、
完全に頭の中で整理できたことが一番の収穫でした。

## 原点のニュアンス vs 日本語としての読みやすさ

原典のニュアンスを残しつつ、日本語として読みやすくするのは難しかったです。
どちらかを妥協する必要があります。

* 原典を妥協すると、別のオリジナル文書になってしまいます
* 日本語の読みやすさを妥協すると、読みにくくなるため、そもそも読まれず、翻訳自体の価値が減っていきます。

今回は、原典が入門者用の読み物であり平易にわかりやすく書かれていたため、
日本語訳もわかりやすさ重視で意訳気味に行いました。

# 最後に

温かく迎えてくださった翻訳プロジェクトの方に心から感謝しています。
（後から気づいたのですが、翻訳メンバが豪華でした...）
翻訳作業、大変楽しめました！
もし誤訳等ございましたらお知らせください（もしくは修正ください）

# 参考

オリジナル書籍：[Neural Networks and Deep Learning](http://neuralnetworksanddeeplearning.com/index.html)
日本語版書籍：[ニューラルネットワークと深層学習](https://nnadl-ja.github.io/nnadl_site_ja/index.html)
[プロジェクトを管理されている方によるプロジェクト概略](http://qiita.com/nushio/items/7bc4a32d8e27e8b5b751)
ローカルのブランチを素敵に掃除できるツールbranchd


ガツガツ仕事してるとバンバン残っていくのがそう、ごみブランチ。
そいつらをキレイにするための以前から愛用しているツールの紹介をします。

# その名も[branchd](https://www.npmjs.com/package/branchd)！

READMEが日本語なのであえて説明するほどでもないですが一応。

導入方法は至って簡単

```
$npm install -g branchd
```

対象のリポジトリへ移動し、コマンド実行

```
$branchd
```

ちなみにブランチ一覧
![Kobito.K2JGpq.png](https://qiita-image-store.s3.amazonaws.com/0/127115/03d9c928-7eee-2086-24bd-7f808ab92b02.png "Kobito.K2JGpq.png")

すると1件ずつ(y/n)を確認してくれます。
間違い防止のためかブランチ名が強調されます。優しい。

![Kobito.CEsZ4y.png](https://qiita-image-store.s3.amazonaws.com/0/127115/17f4d4f8-9d88-c9e1-4f0f-d8dadc952715.png "Kobito.CEsZ4y.png")

`y+Enter` or `Enter`で`gomi1`が削除され次のブランチを削除するか確認してくれます。優しい。

![Kobito.IIpT0c.png](https://qiita-image-store.s3.amazonaws.com/0/127115/a5c8aaf1-b572-8e2c-ab07-c49d039ae2c4.png "Kobito.IIpT0c.png")

`gomijanai`ブランチ以外は全て削除しました。
![Kobito.y1PbJO.png](https://qiita-image-store.s3.amazonaws.com/0/127115/d26f7b2e-e0f8-b5ab-cc94-910757dc8894.png "Kobito.y1PbJO.png")

残ったブランチを確認

```
$git branch
```
いいね！そういえば`master`と`develop`は除外されてました。優しい。
![Kobito.Y69YDp.png](https://qiita-image-store.s3.amazonaws.com/0/127115/0a75063a-ee55-2923-86fc-c50fbf9313a1.png "Kobito.Y69YDp.png")
転職する気はないけど職務経歴書をまとめてみた

# きっかけ
ちょっと前に人材派紹介社からヘッドハンティングの連絡を受けたのがきっかけです。
ヘッドハンティングと言っても、うちの会社に来てくれ！みたいな話ではなく、ざっくり言うと転職興味ありませんか？いくつか企業紹介しますよ？みたいな話です。
正直今まで転職はあまり考えた事はなかったですが自分に連絡が来た理由がQiitaやGitHubなどを見て連絡をくれたようで、普段のアウトプットの結果が認められたような気分になりちょっと嬉しかったと言うのもあり(笑)、実際に会って話だけ聞いてみる事にしました。
その後とりあえず職務履歴書を書くだけ書いて欲しいと言われたのでとりあえず書いてみました。

# とりあえず職務履歴書を書いた
以前こうゆう記事を読んだのを思い出したので自分も少し真似してみました。
[職務経歴書OSS化](http://qiita.com/okoysm/items/abcad0b4aefa585bc50b)

# 転職する気は無いけど職務履歴書書くのも良いと思う
人材紹介会社の方と話した時もそうですが、自分は現状特に転職する気はありません。ただ今回みたいに職務履歴書を書いてみると改めて自分が今まで何やって来たかを客観的に見れるので案外悪い事でも無いなと思いました。**自分のスキルの棚卸しとキャリアの見直し**にもなりました。
また転職する気は無いけど転職活動するというのもありなんだと思います。転職活動の目的は他の会社に移る事だと思っていたのですが、そんなことはなくて他の会社がどうゆう人材を求めているのかを知ったり、自分の市場価値を把握したり、他の会社の環境を知る事で**考えの幅が広がるというのが重要**なんだと思いました。なのでその結果**今働いてる会社良い会社じゃん、と再認識**して転職せずに働き続けるというのも選択肢の1つだと思います。自分もそうですが新卒で転職した事無い人は基本的に1社しか働いた事がないと思うので自分の会社の事しか分からないと思います。例えば今の会社で働くにしても自分の会社の事しか知らずに働くのと、他の会社の事も知っていて働くのとでは考え方の幅が違うと思うのでそうゆう意味では転職活動をすることは転職意欲がなくてもやるのはありなのかなと思ったりします。
Yarnメモ

# Yarnメモ

npmと互換のNode用パッケージマネージャ。
`yarn.lock`ファイルで依存パッケージのバージョン固定ができる、異なるバージョンのパッケージを参照した場合に`yarn install --flat`でバージョン選択できる、`yarn install`が`npm install`より速い、あたりが利点か。

- 参考
  - https://yarnpkg.com/
  - [npm互換のJavaScriptパッケージマネージャーYarn入門npm互換のJavaScriptパッケージマネージャーYarn入門](https://ics.media/entry/13838)
  - [yarnがnpmと何が違うのか試してみた](http://qiita.com/0829/items/ec5271c06f8ff0633dd3)
  - [Yarnファーストインプレッション](http://qiita.com/mizchi/items/1002fde0de10e7c54fb2)

## プロジェクト作成

```shell-session
$ yarn init
```

## 依存パッケージの追加

```shell-session
$ yarn add [package]
$ yarn add [package]@[version]
$ yarn add [package]@[tag]
```

## 依存パッケージのアップグレード

```shell-session
$ yarn upgrade [package]
$ yarn upgrade [package]@[version]
$ yarn upgrade [package]@[tag]
```

## 依存パッケージの削除

```shell-session
$ yarn remove [package]
```

## `package.json`に記載された依存パッケージのインストール

```shell-session
$ yarn install
```

## `package.json`に記載された`scripts`の実行

```shell-session
$ yarn run [script] [-- <args>]
```


# npmコマンド <-> yarnコマンド

- https://yarnpkg.com/lang/en/docs/migrating-from-npm/

| Yarn                          | npm                                |
|-------------------------------|------------------------------------|
| yarn add [package]            | npm install --save [package]       |
| yarn add [package] [--dev/-D] | npm install --save-dev [package]   |
| -                             | npm install [package]              |
| yarn cache clean              | npm cache clean                    |
| yarn global add [package]     | npm install --global [package]     |
| yarn install                  | npm install                        |
| yarn install --flat           | -                                  |
| yarn install --force          | npm rebuild                        |
| yarn remove [package]         | npm uninstall --save [package]     |
| yarn remove [package]         | npm uninstall --save-dev [package] |
| -                             | npm uninstall [package]            |
| yarn upgrade                  | rm -rf node_modules && npm install |
データ分析の前に散布図を見よう

データ分析をはじめるとき、データの平均や分散などの[要約統計量](https://ja.wikipedia.org/wiki/%E8%A6%81%E7%B4%84%E7%B5%B1%E8%A8%88%E9%87%8F)を確認するかと思います。
しかし、要約統計量を確認するだけでは不十分な場合があります。

たとえば、[このようなデータ](https://gist.github.com/xkumiyu/a6040039fc644eb604fcbc4489b8fe05)[^1]の場合、


``` py
import pandas as pd
import seaborn as sns

# データの読み込み
df = pd.read_csv('https://git.io/vD7ui')

# 散布図
sns.lmplot(x='x', y='y', col='data', hue='data', col_wrap=2, fit_reg=False, data=df)
```

![散布図](https://qiita-image-store.s3.amazonaws.com/0/35980/be3597a1-0b14-0643-fdd2-07ace57334fa.png)

と、散布図を見ると、異なったデータであることが分かりますが、平均と標準偏差は同じ値をとります。

``` py
# 平均
df.groupby('data').mean()
```

|data|x|y|		
|:--|:--|:--|
|0|9|7.500909|
|1|9|7.500909|
|2|9|7.500000|
|3|9|7.500909|

``` py
# 標準偏差
df.groupby('data').std()
```

|data|x|y|		
|:--|:--|:--|
|0|3.316625|2.031568|
|1|3.316625|2.031657|
|2|3.316625|2.030424|
|3|3.316625|2.030579|


細かい値は異なりますが、ほとんど同じ値であることが分かります。

また、回帰直線も全く同じ直線になります。

``` py
# 散布図 + 回帰直線
sns.lmplot(x='x', y='y', col='data', hue='data', col_wrap=2, fit_reg=True, data=df)
```

![散布図 + 回帰直線](https://qiita-image-store.s3.amazonaws.com/0/35980/dbdebd18-3bf4-7d75-1c0e-b44a4ce3d323.png)

pandasでは、`describe`メソッドでまとめて要約統計量を表示することができます。

``` py
# 要約統計量
df.groupby('data').describe()
```

```
x	y
data			
0	count	11.000000	11.000000
mean	9.000000	7.500909
std	3.316625	2.031568
min	4.000000	4.260000
25%	6.500000	6.315000
50%	9.000000	7.580000
75%	11.500000	8.570000
max	14.000000	10.840000
1	count	11.000000	11.000000
mean	9.000000	7.500909
std	3.316625	2.031657
min	4.000000	3.100000
25%	6.500000	6.695000
50%	9.000000	8.140000
75%	11.500000	8.950000
max	14.000000	9.260000
2	count	11.000000	11.000000
mean	9.000000	7.500000
std	3.316625	2.030424
min	4.000000	5.390000
25%	6.500000	6.250000
50%	9.000000	7.110000
75%	11.500000	7.980000
max	14.000000	12.740000
3	count	11.000000	11.000000
mean	9.000000	7.500909
std	3.316625	2.030579
min	8.000000	5.250000
25%	8.000000	6.170000
50%	8.000000	7.040000
75%	8.000000	8.190000
max	19.000000	12.500000
```

平均と標準偏差はさきほど、見たとおりですが、四分位点は若干異なることがわかります。特にdata3は大きく異なります。

このように、散布図は異なるが、統計量や回帰直線が同じになるデータを[アンスコムの例](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%B3%E3%82%B9%E3%82%B3%E3%83%A0%E3%81%AE%E4%BE%8B)といいます。なので、統計量だけでなく、散布図を描くことが重要になってきます。

ただ、現実のデータにおいて、二次元であることは少ないかと思います。その場合、[主成分分析(PCA)](https://ja.wikipedia.org/wiki/%E4%B8%BB%E6%88%90%E5%88%86%E5%88%86%E6%9E%90)を用いて次元を2次元まで落として可視化するなど工夫が必要です。

[^1]: data列が同じ値の行が同じデータを表します
MySQLで外部キー付きテーブルをSET FOREIGN_KEY_CHECKS=0;でリストアしているのに外部キー制約違反が出るとき

タイトルが長くてすみません。
かなりレアケースな話のため、タイトルをピンポイントにしないと…ということで。

MySQL（InnoDB）で、mysqldumpでダンプしたデータに外部キー制約付きテーブルが含まれる場合、**「SET FOREIGN_KEY_CHECKS=0;」**をしてからリストアする必要があります。

例えば、MySQLクライアントを起動し、

```mysql:
mysql> SET FOREIGN_KEY_CHECKS=0;
Query OK, 0 rows affected (0.00 sec)

mysql> SOURCE 【ダンプファイル名】;
```

でリストアしたりしますが、このようにしたとしても、**場合により外部キー制約違反（例：エラーコード1005とメッセージ中のエラー150の組み合わせ）が出ることがあります。**

**[14.19.5 InnoDB のエラーコード](https://dev.mysql.com/doc/refman/5.6/ja/innodb-error-codes.html)**（MySQL 5.6 リファレンスマニュアル）

**「SET FOREIGN_KEY_CHECKS=0;」しているのになぜ？**と思ってしまいますが、よく見ると、他にも**「MySQL server has gone away」**（または**「MySQL サーバーが存在しなくなりました」**）というエラーメッセージが表示されていることがあります。

# 原因

・**パケットが大きすぎるクエリ**がクライアントからサーバに投げられる
　　　　　　↓
・サーバがクライアントとの**接続（セッション）を切断**する
　　　　　　↓
・クライアントがサーバに再接続する
　　　　　　↓
・**「SET FOREIGN_KEY_CHECKS=1;」の状態**に戻る
　　　　　　↓
・この状態で外部キー制約に関わるクエリが投げられ、外部キー制約違反が検出されると、エラーが出る

という流れでエラーが出ている可能性があります。
※すべてがこのケースにあてはまるわけではありません。**あくまでも一例です。**なお、ここでいう「パケット」は「TCPのパケット」のことではなくて「MySQLのパケット」ですので、TCPのパケット長は関係ありません。

**[MySQL サーバーが存在しなくなりました](https://dev.mysql.com/doc/refman/5.6/ja/gone-away.html)**（MySQL 5.6 リファレンスマニュアル）

# 対処

**「max_allowed_packet」を十分大きな値に設定してから**リストアします。

ダンプをリストアする場合、**アプリケーションで通常投げられるよりも長いクエリ**がサーバに投げられることがあります。
そのため、**アプリケーションで投げられるクエリだけを想定して「max_allowed_packet」を設定した場合、ダンプからリストアする際のクエリが受け付けられない可能性があります。**
※例えば、複数のTEXT/BLOBカラムを持つテーブルがあって、レコードをINSERT/UPDATEする際にそれらのカラムを同時にINSERT/UPDATEすることがない（必ず個別にINSERT/UPDATEする）場合に、それに合わせて max_allowed_packet を設定しているケース。
ただ、どちらかというと**新しく立てたサーバに「max_allowed_packetを設定し忘れた」とか「0を1個入れ忘れた」**というケースのほうが多そうですが。

「パケットが大きすぎます」というエラーメッセージが出てくれれば原因に気づきやすいのですが、先に示したリファレンスマニュアルに記されている通り、「MySQL サーバーが存在しなくなりました」（英語表記では「MySQL server has gone away」）というエラーメッセージが出て接続（セッション）が切れてしまうことがあるので非常にわかりづらいです。

さらに、外部キー制約付きテーブルをリストアしている場合は、「SET FOREIGN_KEY_CHECKS=0;」を付けているにもかかわらず外部キー制約違反のエラーが出るため、ますます原因に辿り着きにくくなります。
※「MySQL server has gone away」が先に出てくれればまだわかりやすいのですが、**場合によっては外部キー制約違反のエラーが先に出てから「MySQL server has gone away」が出る**ことがあります。こうなると、「外部キー制約違反が原因でサーバへの接続が切れた」と誤解してしまいます。

# まとめ（？）

**「外部キー制約付きテーブルをリストアするときは SET FOREIGN_KEY_CHECKS=0; で」**
と、
**「MySQL server has gone away が出る原因の1つに max_allowed_packet が小さいことが挙げられる」**
は、それぞれ良く知られたことですが、組み合わさってトラブルが発生すると（エラーの出方が若干トリッキーなこともあって）原因の特定に手間取る…という話でした。

なお、厳密にはMySQLの話ではないですが…。
Amazon（AWS）のAuroraの設定に関して、「初期設定のままで使うのが良い」と言われることがよくありますが、これは設定全般のことを指して言っているのではないので、注意が必要です（あくまでも性能を出すために必要なグローバル／スレッドバッファサイズなどの適正値の話）。
例えば、以下のような設定は、使う環境に合わせて設定する必要があります。

 - innodb_file_per_table
 - innodb_file_format
 - innodb_large_prefix

max_allowed_packet も同じです。
Python 2/3系共存について困ったことのメモ

Python 2.x --> Python 3.x 移行および互換コードを書くのに困ったことをほぼ自分のメモとして時々追加します。

# Python 2.7には標準open関数の引数にencodingが存在しない
Python 3系ではopen関数の引数のencodingが使えますが、Python 2系には無い。

```python:
# OK on Python 3.x, NG on Python 2.7
with open("some_file_with_multibyte_char", "r", encoding="utf-8") as f:
    print(f.read())
```

Python 2系で同じことをするには、ファイルをバイナリモードで開いて、内容をデコードするか、

```python:
# OK on Python 2.7 and OK on Python 3.x
with open("some_file_with_multibyte_char", "rb") as f:
    print(f.read().decode(encoding="utf-8"))
```

ioモジュールのopenを使うか。

```python:
from io import open
# OK on both Python 3.x and Python 2.7
with open("some_file_with_multibyte_char", "r", encoding="utf-8") as f:
    print(f.read())
```

Python3.xではio.openはbuilt-inのopenへのエイリアスになっているので、Python 2系ではio.openを使うのがよさそう。

追記：
```codecs.open```もPython 2/3互換であるとのコメントを頂きました。ありがとうございます。

```python:
import codecs
# OK on both Python 3.x and Python 2.7
with codecs.open('some_file_with_multibyte_char', 'r', 'utf-8') as f:
    print(f.read())
```
暗号化された通信かどうか、ニューラルネットワークで識別してみる

# はじめに
暗号化された通信か、暗号化されてない通信か、ポート番号などの情報を使わずに通信の特徴量だけを使って、ニューラルネットワークで識別できるか試してみました。結果としては99%以上の精度で識別できました。

# 試してみた条件
ニューラルネットワーク：全結合の2層
フレームワーク：keras (tensorflow backend)
データセット：DARPA 1999 Week3 data set ( https://projects.cs.dal.ca/projectx/Download.html ) を一部変更して利用

# コードとデータセット
githubに置きました。
https://github.com/kznx/traffic_classification/tree/master/ssh_or_not

# 説明

## データセットの読み込み
データセットが arff というフォーマットなので、下記のように読み込み、numpyのarrayにします。
http://qiita.com/kznx/items/59c4b50f944c0d6079c1

## 正規化
kerasでは、データを正規化する必要があるようなので、scikit-learnのMinMaxScalerを使い、正規化します。

```
mms = MinMaxScaler()
x_norm = mms.fit_transform(train)
```

## データの分離
訓練用データとテスト用データに分離します。scikit-learnのcross_validationを使います。

```
train_x, test_x, train_y, test_y = cross_validation.train_test_split(
    x_norm, target, test_size=0.2
)
```

## 正解データのフォーマットを変更します

```
y_train = np_utils.to_categorical(train_y, 2)
y_test = np_utils.to_categorical(test_y, 2)
```

## モデル定義、学習、評価
こちらの投稿を参考にモデル定義してみました。
http://qiita.com/rindai87/items/546991f5ecae0ef7cde3

```
# モデルの定義
model = Sequential()

# ネットワークの定義
model.add(Dense(input_dim=21, output_dim=20))
model.add(Activation('relu'))
model.add(Dropout(0.2))

model.add(Dense(input_dim=20, output_dim=20))
model.add(Activation('relu'))
model.add(Dropout(0.2))

model.add(Dense(input_dim=20, output_dim=10))
model.add(Activation('relu'))
model.add(Dropout(0.2))

## OUTPUT  SSH or NOTSSH
model.add(Dense(output_dim=2))
model.add(Activation('softmax'))

# ネットワークのコンパイル
model.compile(loss = 'categorical_crossentropy',
              optimizer = 'sgd',
              metrics = ['accuracy'])

# 学習処理
hist = model.fit(train_x, y_train, nb_epoch = 10, batch_size = 100, verbose=1)

# 学習結果の評価
score = model.evaluate(test_x, y_test)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
```

# 結果
99.7%という予想以上にいい精度でした。

```
Epoch 1/10
50606/50606 [==============================] - 1s - loss: 0.2669 - acc: 0.9484     
Epoch 2/10
50606/50606 [==============================] - 1s - loss: 0.1090 - acc: 0.9832     
Epoch 3/10
50606/50606 [==============================] - 1s - loss: 0.0733 - acc: 0.9869     
Epoch 4/10
50606/50606 [==============================] - 1s - loss: 0.0597 - acc: 0.9892     
Epoch 5/10
50606/50606 [==============================] - 1s - loss: 0.0495 - acc: 0.9913     
Epoch 6/10
50606/50606 [==============================] - 1s - loss: 0.0458 - acc: 0.9923     
Epoch 7/10
50606/50606 [==============================] - 1s - loss: 0.0427 - acc: 0.9925     
Epoch 8/10
50606/50606 [==============================] - 1s - loss: 0.0400 - acc: 0.9935     
Epoch 9/10
50606/50606 [==============================] - 1s - loss: 0.0374 - acc: 0.9938     
Epoch 10/10
50606/50606 [==============================] - 1s - loss: 0.0357 - acc: 0.9942     
12096/12652 [===========================>..] - ETA: 0sTest loss: 0.0282513894941
Test accuracy: 0.997707872273
```
pandas + XlsxWriter でグラフを書く


[こっち](http://qiita.com/bunzaemon/items/527f3823b2d27886990e)と[こっち](http://qiita.com/bunzaemon/items/d47c6f44840ed797921c)の続き。

>sin とか cos とか、どーでもいいから、取り敢えず単純に外部データをプロットさせたいんだよ!

ついでに。

エクセルでしか提出書類は受け付けん!
グラフはエクセルで書け!!

使うのは三度目の、`rand.txt`。

```shell-session:
$ perl -le 'print rand (10) for 0 .. 99' > rand.txt
```


```python:GRAPH.py
import pandas as pd
import matplotlib
matplotlib.use('Agg')
import sys
import matplotlib.pyplot as plt
data = pd.read_csv(sys.argv[1], header=None)
with pd.ExcelWriter(sys.argv[2], engine='xlsxwriter') as writer:
    data.to_excel(writer, 'Sheet1')
    wb = writer.book
    chart = wb.add_chart({'type': 'line'})
    en = str(data.shape[0] + 1)
    chart.add_series({'categories':'=Sheet1!$A$2:$A$' + en, 'values': '=Sheet1!$B$2:$B$' + en })
    writer.sheets['Sheet1'].insert_chart('C1', chart)
```

```shell-session:
$ python GRAPH.py rand.txt graph.xlsx
```

![xlsx.png](https://qiita-image-store.s3.amazonaws.com/0/64084/43d76c45-50e9-e8c1-d8f1-af6064290497.png "xlsx.png")

- `XlsxWriter` は、`Anaconda` を入れてるなら自動的に入るが、手動で `pandas` を入れた環境では別途インストールが必要[^1]。

[^1]: 軽くコレで嵌りかけた。
python2.6 への pandas のインストール


訳あってシステムレベルの古い Python へ、 pandas をインストールする事に。pip すら入ってなかったよ、、、

```
$ su
# yum install python-pip
# pip install --upgrade pip
# wget https://bootstrap.pypa.io/ez_setup.py -O - | python  # setuptools のバージョンアップ
# pip install importlib
# pip install numpy==1.7.0
# pip install matplotlib==1.0.1
# pip install pandas==0.16.2
# pip install xlsxwriter
```

- setuptools のバージョンアップしないと、まともに pip してくれなかった様な気が、、、
- バージョン指定してインストールしたものの、もっと上のバージョンでも入る気がする。特に matplotlib は諸事情から古いものを入れた。
	- => 結局、2.6 系対応最終バージョンの 1.4.3 を入れなおす[^1]。
- `xlsxwriter` は、 `pandas` でエクセル出力する気が無いなら入れる必要は無い。

[^1]: 説明は[ここ](http://matplotlib.org/1.5.1/users/whats_new.html)
よく使う便利なショートカット


## Windows

[Windows]+[L] ⇒ ロック
[Windows]+[+] ⇒ 拡大鏡（拡大）
[Windows]+[-] ⇒ 拡大鏡（縮小）
[Windows]+[Esc] ⇒ 拡大鏡の解除
[Ctrl]+[Shift]+[Esc] ⇒ タスクマネージャー
[Ctrl]+[F4] ⇒ 選択中のウィンドウを閉じる（例：IEだと選択中のタブ閉じる）
[Alt]+[F4] ⇒ 選択中のシステムを閉じる（例：IEだとIEを閉じる）


## エクセル

[Ctrl]+[1] ⇒ セルの書式設定
[Ctrl]+[+] ⇒ 日付
[Ctrl]+[*] ⇒ 現在時刻
[Ctrl]+[D] ⇒ 上のセルコピー   
[Ctrl]+[R] ⇒ 左のセルコピー 
[Ctrl]+[Alt]+[V] ⇒ 貼り付け時に『形式を選択して貼り付け』ダイアログ表示
Visual Studio CodeでDjangoのインテリセンスを有効にする。

#はじめに
VS Codeを使ってDjangoの開発を試していたのですが
インテリセンスが効かなくてもやもやしていました。
インテリセンス有効にできないかなと思って調べていたら出来たっぽい。

#前提
Windows 10環境です。
Djangoの環境がすでに整っていて、基本的な作法を理解している人向けです。


#使用するプラグイン
VS Codeの「Python」プラグイン(下記)を使います。
![plugin.png](https://qiita-image-store.s3.amazonaws.com/0/57524/860027d6-0b96-1ab0-faca-3c1a24f648ae.png)



#インテリセンスを有効にする。
コマンドプロンプトを開いて
virtualenv環境をactivateしてから、VS Codeを起動する。
それだけです。

```shell-session:cmd
D:\Sandbox\practice>virtualenv\Scripts\activate
(virtualenv) D:\Sandbox\practice\code .
```

D:\Sandbox\practiceは各自の環境に置き換えて考えてください。
上記の方法でVS Codeを起動したらインテリセンスが効きました。

![inteli02.png](https://qiita-image-store.s3.amazonaws.com/0/57524/9e082852-d887-c7fc-b26d-af7c8f0f66ec.png)

![inteli01.png](https://qiita-image-store.s3.amazonaws.com/0/57524/e479e591-c4cd-704d-a02a-eb25030416d5.png)

![inteli03.png](https://qiita-image-store.s3.amazonaws.com/0/57524/80818ebf-b584-823b-51e3-c51e02a2bca3.png)


#参考
http://thinkami.hatenablog.com/entry/2016/07/05/224416
RustからValgrindのClient Requestを使う

Rustを使っているとそれほどメモリリークを気にすることはないですが、それでも必要になるときがちょこちょこあります。Cと連携したりとかunsafeなコードをガンガン使ったりとか。

そんなときはもちろん(？)valgrindを使っていくわけですが、プログラム内でvalgrindにアクセスしたいなんてときもあるわけです。(ほんとか？)

そこでvalgrindは[Client Request](http://valgrind.org/docs/manual/manual-core-adv.html)という仕組みでvalgrind内部でもってる統計情報とかにvalgrind上で実行しているプログラムからアクセスするためのAPIを提供しています。

このAPIはCから使う前提でAPIが書かれており、マクロを使いマクロ！wというコードなので一見それ以外の言語から触ることができないように見えるのですが、コアはvalgrindに対する特殊なhypercall呼び出しを実行してるだけなのでインラインアセンブラを書けばどの言語からも呼び出すことができます。

Rustには2つの実装があります。

- [kmcallister/vgrs](https://github.com/kmcallister/vgrs)
- [nathan7/libvalgrind_request](https://github.com/nathan7/libvalgrind_request)

実装してるAPIが多いのはvgrs、対応しているアーキテクチャが多いのはlibvalgrind_requestといったかんじです。

ちょっとvgrsのほうを試してみましょう。ちなみにvgrsは本家のレポジトリが更新されておらず[fork先のブランチ](https://github.com/lummax/vgrs/commit/5252a84bcdc266132181df908f069b1256f7d815)でなければコンパイルできないのでそちらを使います。

Cargo.tomlをこのようにして、

```toml
[package]
name = "vgrs"
version = "0.1.0"
authors = ["Hiroki Noda <kubo39[at]gmail.com>"]

[dependencies]
vgrs = { git = "https://github.com/lummax/vgrs.git", rev = "5252a84bcdc266132181df908f06" }
```

例にあるコードを少し修正して実行させてみます。

```rust
#![feature(core_intrinsics)]

extern crate vgrs;

use vgrs::valgrind;

fn main() {
    unsafe {
        assert!(valgrind::count_errors() == 0);
        let x: u8 = std::intrinsics::uninit();
        println!("{:?}", x);
        assert!(valgrind::count_errors() > 0);
    }
}
```

まずvalgrindを使わないで実行させてみます。

```console
$ ./target/debug/vgrs
0
thread 'main' panicked at 'assertion failed: valgrind::count_errors() > 0', src/main.rs:12
note: Run with `RUST_BACKTRACE=1` for a backtrace.
```

2回目のassert!で失敗してpanicしました。

次にvalgrind上でプログラムを実行させてみます。

```console
$ valgrind --leak-check=full ./target/debug/vgrs
$ valgrind --leak-check=full ./target/debug/vgrs            [kubo39:vgrs][git:master]
==5400== Memcheck, a memory error detector
==5400== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==5400== Using Valgrind-3.12.0.SVN and LibVEX; rerun with -h for copyright info
==5400== Command: ./target/debug/vgrs
==5400== 
==5400== Conditional jump or move depends on uninitialised value(s)
==5400==    at 0x13ED82: fmt (num.rs:234)
...
==5400==  Address 0x6220000 is in a rw- anonymous segment
==5400== 
0
==5400== 
==5400== HEAP SUMMARY:
==5400==     in use at exit: 0 bytes in 0 blocks
==5400==   total heap usage: 7 allocs, 7 frees, 2,032 bytes allocated
==5400== 
==5400== All heap blocks were freed -- no leaks are possible
==5400== 
==5400== For counts of detected and suppressed errors, rerun with: -v
==5400== Use --track-origins=yes to see where uninitialised values come from
==5400== ERROR SUMMARY: 4 errors from 4 contexts (suppressed: 0 from 0)
```

メモリの未初期化まわりでエラーが4つでたので、2つめのassertの条件を通るようになりpanicしなくなりました。
Raspberry PiのSSH有効化方法

# はじめに
Raspberry PiのSSHを有効化しようと思ったらRaspbianのバージョンの違いにより方法が異なっていたので紹介します。

Advanced OptionsにSSHがない…と困っているひと必見です。
# 環境 
- モデル：Raspberry Pi 3 Model B
- raspbian：8.0

# SSHの有効化方法

1.　ターミナルで下記のコマンドを実行

```
$sudo raspi-config
```

2.　"5 Interfacing Options"を選択

![SSH有効化.png](https://qiita-image-store.s3.amazonaws.com/0/79218/09cb4c66-0b97-09b9-27c4-590b608c90bf.png)


3.　"P2 SSH"を選択

# 参考
[Raspberry Piのセットアップ（ssh接続まで）](http://qiita.com/aryoa/items/86ddae2212c789ddece0)
vagrantを使ってCentOS7環境構築メモ

個人的なメモです

#環境
ホストOS：windows10
###VirtualBoxダウンロード
https://www.virtualbox.org/wiki/Download_Old_Builds_5_0
「Windows hosts  x86/AMD64」をクリック
※バージョン5.0 最新バージョンではない
###VirtualBoxインストール
ダウンロードしたファイルを実行、再起動
###Vagrantダウンロード
https://releases.hashicorp.com/vagrant/1.8.4/
「vagrant_1.8.4.msi」をクリック
※バージョン1.8.4 最新バージョンではない
###Vagrantインストール
ダウンロードしたファイルを実行、再起動
###利用したいVagrantBoxを探す
https://atlas.hashicorp.com/boxes/search
https://atlas.hashicorp.com/bento/boxes/centos-7.1
###Vagrant初期化(Vagrantfileの作成)
```console:コマンドプロンプト
vagrant init bento/centos-7.1
```
###Vargrantfile設定変更
下記の設定の#を外す
```
 config.vm.network "private_network", ip: "192.168.33.10"
```
###Vagrant起動
```console:コマンドプロンプト
vagrant up --provider virtualbox
```
WIP@Serverless Frameworkを触ってみる

## [serverless/serverless](https://github.com/serverless/serverless)

プラグインやサンプル情報があるので目を通したい。
[公式サイトのドキュメント](https://serverless.com/framework/docs/)にも目を通したいがgithubよりは情報が少ない。

### [serverless-crypt](https://github.com/marcy-terui/serverless-crypt)

AWS KMSを使った秘密鍵の保持するプラグイン

### [horike37/serverless-step-functions](https://github.com/horike37/serverless-step-functions)

AWS Step Functionsを使えるプラグイン

> AWS Step Functionsとはビジュアライズなワークフローを使用して、分散アプリケーションとMicroservicesのコンポーネントを簡単にコーディネートできるサービスです。つまりLambdaなどを上手く連携させてステートマシンとして定義し実行させるサービスの様です。
> 
> [【速報】新しいワークフローサービス AWS Step Functionsが発表 #reinvent](http://dev.classmethod.jp/cloud/aws/aws-step-functions/)

## [serverless/dashboard](https://github.com/serverless/dashboard)

ダッシュボードアプリ

## [serverless/serverless-client-s3](https://github.com/serverless/serverless-client-s3)

[Uploading Static Content Related to a Project #461
](https://github.com/serverless/serverless/issues/461)に関連した、静的ファイルを置くためのソリューション

※ 古くて動いていない？

## [serverless/aws-event-mocks](https://github.com/serverless/aws-event-mocks)

現時点では、よく分からなかった

## [serverless/serverless-raffle](https://github.com/serverless/serverless-raffle)

Reactのサンプル？

## [serverless/serverless-starter](https://github.com/serverless/serverless-starter)

何らかのサンプル？

## [serverless/serverless-graphql-relay](https://github.com/serverless/serverless-graphql-relay)

graphql-relayを使用するためのテンプレートのようです。

## [serverless/serverless-graphql-blog](https://github.com/serverless/serverless-graphql-blog)

graphqlのサンプルっぽいですね。

## [serverless/serverless-graphql-apollo](https://github.com/serverless/serverless-graphql-apollo)

graphql関係みたいだけどapolloは何だろう。

> GraphQLのReact用クライアントとしてはRelayというfacebookが開発しているクライアントライブラリもあるのですが、RelayはQueryの形式が標準的なGraphQLのそれと異なっているので、こちらをApolloを使うことにしました。
> [ReactとApolloを使ってGithub GraphQL APIを試してみる
](http://qiita.com/bananaumai/items/2cd6d48df20b378a44f5)

[SwiftでGraphQL入門 & Apolloを試す](http://qiita.com/shingt/items/ed65c654eb5532eeeda8) も気になりました。

## [serverless/scope](https://github.com/serverless/scope)

https://serverless.com/framework/status/ のやつ。

## [JustServerless/awesome-serverless](https://github.com/JustServerless/awesome-serverless)

いつものやつです。

# Qiita

- [Serverless 使って Lambda から RDS を使用する](http://qiita.com/pm11op/items/c6c25a74fb22cb7b0a9d)
- [最近のAWS Lambda開発環境](http://qiita.com/Peranikov/items/7f68186294dfe248204b)
数式のギリシャ文字はそのまま変数名にしたほうがいいと考える理由

以前、Jupyter Notebookでギリシャ文字を入力する方法を紹介しました。
[Jupyter Notebookでギリシャ文字を簡単に入力するには - Qiita](http://qiita.com/alchemist/items/0ce850770d8cc3df0ab4)

その時はたまたま発見して変わった機能があるなと思ってとりあえず記事にしたのですが、数式をプログラムに書くことが多いので案外便利だということに気がつきました。
むしろ、小さなプログラムでは積極的に使っていくべきだと思うようになりました。

## ギリシャ文字を使うことのメリット
### 1. 数式と見た目が同じになる。
プログラムがほぼ数式の通りになるので、数式との対応関係を把握しやすくなります。
対応する数式や参照先の資料をコメントとして明記している必要はあると思います。
### 2. 変数名が短くなる。
`alpha`も`α`もそれ自体では変数の意味がわかりません。
どうせわからないなら短い方がソースコードを読みやすくなります。
### 3. LaTeXの入力を覚えることにつながる。
下にあげた開発環境では入力方法はLaTeX合わせてあります。Jupyter NotebookでもQiitaでもLaTeXが使えるので覚えておいて損はないでしょう。
[Qiitaの数式チートシート - Qiita](http://qiita.com/PlanetMeron/items/63ac58898541cbe81ada)

## ギリシャ文字を使うことのデメリット
### 1. 文字コードが原因の問題が起こる可能性がある
どんな問題が起こる可能性があるのかはわかりません。
プログラミング言語がUnicodeに対応していればプログラム自体に問題が発生することはないと思いますが、ライブラリや周辺ツールで問題が起こる可能性は考えられます。
それと、Windowsはデフォルトの文字コードがShift-JISなので要注意です。よくわからないならWindowsではギリシャ文字を使わないほうが無難です。
### 2. 打ち込むキーが増える
アルファベットを打つよりわずかにキー入力が増えます。
アルファベットに加えてバックスラッシュとTabキーが必要です。
補完が効くので逆にキー入力が減る場合もあります。

### 3. 編集に困る可能性がある
自分以外の人が編集する場合に文字の入力方法がわからずに困る可能性は考えられます。

## ギリシャ文字が使える開発環境
- プログラミング言語:
    - Python 3
    - Julia
- REPL:
    - Python: Jupyter Notebook、Jupyter QtConsole、IPython
    - Julia: Julia標準のREPL、IJulia
- テキストエディタ:
    - Sublime Text + [UnicodeMath](https://packagecontrol.io/packages/UnicodeMath)

入力方法はどれも以前の記事に書いた方法と同じです。バックスラッシュに続けてアルファベットを入力してTabキーです。
例：`\alpha` + Tab　→　`α`

## ギリシャ文字を使うための前提条件
### 1. プログラミング言語がUnicodeに対応している。
当然ながらプログラミング言語がUnicodeに対応していないと話になりません。
Unicodeに対応していないなら諦めましょう。
### 2. ギリシャ文字を素早く入力できる方法がある。
いちいち日本語入力にして変換していたんではさすがに面倒です。
入力を支援する機能がある開発環境を使いましょう。
### 3. プログラムが小さい。
予想外の不具合を避けるため、使い捨てのプログラムや規模の小さいプログラムから徐々に使っていくべきでしょう。
Angular2 + Socket.ioで遊んでみる

最近遊んでいるAngular2でnode.js側にパラメータを投げてonやemitする値を動的に変えてconnectするものを作ってみようと思って遊んでみたのでメモ
（component単位でconnectするとかあるかのかなぁと妄想して）

# node.js側

```bash
$ mkdir web-socket
$ cd web-socket
$ npm init
$ npm install socket.io --save
$ npm install express --save
$ touch web-socket.js
```

`web-socket.js`

```js

let app           = require(　'express'　)();
let http          = require(　'http'　).Server(　app　);
let socket_io     = require(　'socket.io'　)(　http　);

socket_io.on( 'connection', ( socket ) => {
  let query       = socket.handshake.query;
  let hoge        = query.hoge;

  socket.on( 'disconnect', function(){} );

  socket.on( 'on_name', ( data ) => {
    socket_io.emit( 'emit_name', { data: data } );
  } );

} );

http.listen( 5000, () => { } );

```

# Angular側

```
$ npm install socket.io-client --save
$ npm install @types/socket.io-client --save-dev
```

## Service

```js

import { Injectable } from '@angular/core';

import * as io from 'socket.io-client';

import { Observable } from 'rxjs/Observable';

@Injectable()
export class WebSocketService {

  constructor(){}

  private url     = 'http://localhost:5000';
  private socket;

  connect( queryString: string ){
    this.socket   = io( this.url, { query: queryString } );
  }

  emit( emitName: string, data? ){
    this.socket.emit( emitName, data );
  }

  on( onName: string ){
    let observable = new Observable( observer => {
      this.socket.on( onName, ( data ) => {
        observer.next( data );
      });

      return () => { this.socket.disconnect(); };
    } );
    return observable;
  }

}
```

## Component

```js
import { Component, OnInit, OnDestroy } from '@angular/core';
import { WebSocketService }       from './web-socket.service';

@Component({
  providers: [WebSocketService],
  selector: 'app-web-socket',
  templateUrl: './web-socket.component.html',
  styleUrls: ['./web-socket.component.scss'],
})
export class WebSocketComponent implements OnInit, OnDestroy {

  connection;
  data;

  constructor( private webSocketService: WebSocketService ){}

  onClick(){
    this.webSocketService.emit( 'on_name', this.data );
    this.data = '';
  }

  ngOnInit() {
    this.webSocketService.connect( 'hoge=hoge' )
    this.connection = this.webSocketService.on( 'emit_name' ).subscribe( data => {
      this.data = data;
    } )
  }

  ngOnDestroy() {
    this.connection.unsubscribe();
  }

}
```

あとは
web-socket.component.htmlに `onClick`のボタンを置いて　`ng serve` と `node web-socket.js`をして別々に起動

## 補足
下記の部分でクエリを受け取っているので、ここで条件分岐等でonやemitの値を動的にセットしてあげれば目的達成

```js
  let query       = socket.handshake.query;
  let hoge        = query.hoge;
```
リクエストを別プロセスで捌く

はじめに
--------------------

またまた自分用メモ。

↓みたいので受信待機するときに、リクエスト元とかメッセージの種類ごとにプロセスを分けたくて書いた。

- [socketIO-client](https://pypi.python.org/pypi/socketIO-client)
- [rosbridge_suite](http://wiki.ros.org/rosbridge_suite)

ソースコード
--------------------

```py:main.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import procs


workers = {}
source = procs.Source()

try:
    while True:

        # Sourceからpoll
        data = source.poll()
        key = data['key']

        # keyに対応するWorkerが無ければ生成
        if key not in workers:
            workers[key] = procs.Worker()

        # workerに処理を委譲
        workers[key].delegate(data)

finally:
    # KeyboardInterrupt等で終了したらWorkerをterminate
    source.terminate()
    [ w.terminate() for _,w in workers ]
```

```py:procs.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import abc
import multiprocessing


class Proc(metaclass=abc.ABCMeta):
    
    def __init__(self):
        self._stop    = multiprocessing.Event()
        self._queue   = multiprocessing.SimpleQueue()
        self._process = multiprocessing.Process(target=self._run)
        self._process.start()

    def terminate(self):
        self._stop.set()
        self._process.join()
        self._process.terminate()

    def _run(self):
        while not self._stop.is_set():
            self._do()

    @abc.abstractmethod
    def _do(self, **kwargs):
        pass


class Source(Proc):
    
    def _do(self, **kwargs):
        # メッセージの受信とか
        data = { 'key' : 'some-data' }
        self._queue.put(data)

    def poll(self):
        return self._queue.get()

        
class Worker(Proc):

    def _do(self, **kwargs):
        data = self._queue.get()
        # 受け取ったデータを処理

    def delegate(self, data):
        return self._queue.put(data)
```
rex0220  一覧絞り込みプラグイン

kintone の一覧表示画面で、簡単に表示データを絞り込めます。
一覧画面毎に、絞り込みに使用する１項目を設定できます。

- 対象一覧画面

表形式、カレンダー形式、カスタマイズ

※カスタマイズ画面の場合は、標準フィルター機能を使用している場合のみ。


- 対象項目

ドロップダウン、ラジオボタン、複数選択、チェックボックス
文字列、リンク、数字、計算項目、レコード番号
ユーザ選択、作成者、更新者、日付

[rex0220 stores](https://rex0220.stores.jp)で、販売中です。

# 直近の変更点

※ Ver.9
・プラグイン設定画面のデザイン変更対応
・プラグイン設定に、「説明」設定機能を追加


# プラグイン画面表示例

一覧画面メニューエリアに、選択ボックスが表示されます。

- チェックボックス項目による指定例

![2017-02-18_20h18_30.png](https://qiita-image-store.s3.amazonaws.com/0/100572/51f170b4-4cf0-7b1d-f8c2-ba09fcf65c47.png)

- レコード番号による指定例

![2017-02-18_21h18_38.png](https://qiita-image-store.s3.amazonaws.com/0/100572/389cb322-7c60-f562-50d4-a83a16fd81fc.png)


# 画面操作例

各項目種類の表示例です。

![2017-02-18_20h33_11.gif](https://qiita-image-store.s3.amazonaws.com/0/100572/eab02930-ede8-fbc6-0a5d-23bb832b8bdc.gif)



# 標準フィルター設定との連携

一覧画面のフィルター条件に、一覧絞り込みプラグインで指定した条件が追加されます。

![2017-02-18_20h46_36.gif](https://qiita-image-store.s3.amazonaws.com/0/100572/e320c7b0-e65c-9872-5867-d3dc6282e0c5.gif)


# ユーザ選択

ユーザ選択、作成者、更新者の項目において、下記機能があります。

- オートコンプリート機能

クリックすると、対象候補がリスト表示されます。
文字の一部を入力すると対象者がリスト表示されます。

- 有効・無効・すべての選択

対象ユーザの有効・無効を指定できます。
無効ユーザは、表示名の先頭に「*」を表示されます。


![2017-02-18_20h54_13.png](https://qiita-image-store.s3.amazonaws.com/0/100572/d7b806b2-ffec-efa6-012f-96063df8c406.png)

※ユーザ情報は、セッションの１時間毎に最新の情報を取得します。


# プラグイン設定画面

各項目を指定して、「保存する」をクリックします。

- プラグインの有効／無効
- 一覧画面ごとの有効／無効
- 対象項目の指定

![2017-02-18_21h01_53.png](https://qiita-image-store.s3.amazonaws.com/0/100572/1f57643a-c310-dba8-47c7-7ae160f9d34b.png)


# 注意事項

- 既に、JavaScript によるカスタマイズを行っているアプリの場合、処理が競合して、エラーになる場合があります。その場合は、該当するアプリでプラグインの使用を中止してください。
- アプリ設定を変更した場合は、プラグインを再設定してください。
【JS】Object.definePropertyを使用して安全にArray.prototype.findIndexを追加する

ECMAScript 2015(ES6)には`Array.prototype.findIndex`関数が追加されています。すでにChrome等新しいブラウザでは使用できるようになっていますが、一部の古いブラウザやGoogle Apps Scriptでは未実装となっています。結構使用頻度が多いので、`Array.prototype`に追加してみます。

コードは、ほとんど[このページ](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex)のものなんですが、直接`Array.prototype.findIndex = function...`とか書いちゃうとプロトタイプ汚染させてしまうので、`Object.defineProperty`を使用しています。
（なお、[プロトタイプ汚染についてはこのページ](http://uupaa.hatenablog.com/entry/2012/11/07/143947)が詳しいです。）

```js
if (!Array.prototype.findIndex) {
  var findIndex = function(predicate) {
    if (this === null) {
      throw new TypeError('Array.prototype.findIndex called on null or undefined');
    }
    if (typeof predicate !== 'function') {
      throw new TypeError('predicate must be a function');
    }
    var list = Object(this);
    var length = list.length >>> 0;
    var thisArg = arguments[1];
    var value;

    for (var i = 0; i < length; i++) {
      value = list[i];
      if (predicate.call(thisArg, value, i, list)) {
        return i;
      }
    }
    return -1;
  };
  
  Object.defineProperty(Array.prototype, 'findIndex', {
    enumerable: false,
    configurable: false,
    writable: false,
    value: findIndex,
  });
}
```

Javascriptは手軽に既存のオブジェクトを拡張できるのがいいですね〜。

# 参考
*  [MDN - Array.prototype.findIndex()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex)
*  [MDN - Object.defineProperty()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty)
*  [プロトタイプ汚染とループ](http://uupaa.hatenablog.com/entry/2012/11/07/143947)
Windows7にhubotをインストールした時のメモ

- せっかくなのでメモを残しておこう
- 環境はWindows7 Pro SP1
- 始めるにあたって、参考にした記事は[これ][link-1]
[link-1]:http://qiita.com/hiconyan/items/9805657866720dac7acc

# この順番にやりゃいい
やったことを詳しく知りたかったら次項以降にやったこと書いてます
1. node.jsをインストール
2. 以降、管理者権限で実行したコマンドプロンプトでコマンドを打ち込む
3. `npm install -g hubot coffee-script yo generator-hubot`
4. `mkdir c:\node\mybot`
 - 注意！！フォルダ名をhubotにするとインストールに失敗します
5. `cd c:\node\mybot`
6. `yo hubot` hubotからの質問は全部Enter
7. `bin\hubot.cmd`
8. 起動後の動作確認は`scripts/example.coffee`に適当に書いて下さい
9. おわり

# 最初にnode.jsをインストール
記事ではnodistを使っていたが、せっかくなので公式からインストールする。
https://nodejs.org/ja/

[この記事](http://qiita.com/taipon_rock/items/9001ae194571feb63a5e)を参考にしました。


# hubotをインストール
最初に参考にしてた[この記事][link-1]をまた見直してhubotをインストールする。
ただし、nodistではなく公式のnode.jsを使ったのでフォルダ名を変える。
今回は`C:\node\hubot`というフォルダを作った。
*しかし、このフォルダ名を変える悪手によりすぐ後ではまってしまう・・・*

## hubotのインストールに失敗
インストール中に下記のエラーが出てしまった。

```
255 error argv "C:\\Program Files\\nodejs\\node.exe" "C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js" "install" "hubot" "hubot-scripts" "hubot-diagnostics" "hubot-help" "hubot-heroku-keepalive" "hubot-google-images" "hubot-google-translate" "hubot-pugme" "hubot-maps" "hubot-redis-brain" "hubot-rules" "hubot-shipit" "--save"
256 error node v6.9.5
257 error npm  v3.10.10
258 error code ENOSELF
259 error Refusing to install hubot as a dependency of itself
260 error If you need help, you may report this error at:
260 error     <https://github.com/npm/npm/issues>
261 verbose exit [ 1, true ]
```

適当にググってみたら[公式のGitHubにissue](https://github.com/TooTallNate/ref/issues/60)があったので参考にして`npm install -g node-gyp`を叩いてnode-gypをインストールしてみたが変わらず。

もうちょっと真面目にググってみて、[別の方法を発見](http://kusamakura.hatenablog.com/entry/2015/02/04/180355)
しかし、管理者権限で実行しても無駄。
プロキシなんて元々設定してないから触らないで良い。
で、八方塞がりになってしまった。

さらにググって、[このサイト](http://qiita.com/kaznmb/items/047c1560edda683a63f4)に助けられた。
どうやら[可能性２](http://qiita.com/kaznmb/items/047c1560edda683a63f4)に該当してたっぽい。
フォルダ名がプロジェクト名やらパッケージ名に当てはまるのかよく分からないけど、もしかしてと思ってフォルダ名を変えたらやっとインストール出来た。

# hubotの実行に失敗
`c:\node\mybot\bin`に移動後、`hubot.cmd`と叩いた所、`指定されたパスが見付かりません`とのエラーが出てしまった。
そろそろ心折れそう。
環境変数が問題なのかなーと思い、PCを再起動させてみた。
変わらず。。。

ググってもよく分からないので、`hubot.cmd`の中身を見てみた。

``` hubot.cmd
@echo off

call npm install
SETLOCAL
SET PATH=node_modules\.bin;node_modules\hubot\node_modules\.bin;%PATH%

node_modules\.bin\hubot.cmd --name "mybot" %* 
```
ん？相対パスで書いてる。
どうやら`c:\node\mybot\bin`フォルダまで移動して実行していたことが原因だったらしい。
一つ上のフォルダに戻って`bin\hubot.cmd`を実行したら無事に動作しました。

# 動作確認
`hubot ping`と打っても`PONG`と返してくれない。なぜ！！！
どうやら、`scripts/example.coffee`が空だから何も動かないっぽい。
なんでだろ。デフォルトで応答用のスクリプトくらい用意しておいてほしいんだけど・・・
というわけで、確認したいのでサンプルを参考にしてスクリプトに手を加えてみた。
*保存時はUTF-8で保存するのを忘れずに*

``` example.coffee(13行目あたり)
 robot.hear /unko/i, (res) ->
  res.send "うんこ!!!"
```
清々しい内容。
一度hubotを`exit`コマンドで落として再度`bin\hubot.cmd`で起動。
その後でmybotちゃんに`unko`と言うと、ちゃんと`うんこ!!!`と返してくれて童心に戻れた。

疲れた。Slackで使いたいとかはまた後日やろ。
hubotのインストールに3時間くらいかかったけど、少しは賢くなった気がするからまぁいっか。
#ranchermeetup tokyo #4 に行ってきたので雑にまとめる


やったのが水曜なんで、かなり遅めですが、記憶の隅をつついて思い出したことを書き連ねていく。

* イベントページ : [connpass](https://rancherjp.connpass.com/event/47273/)
* togetter : [togetter](https://togetter.com/li/1081482)
    * こっそりまとめようと思ったのに、某○川さんがなんか言うから…

## 忙しい人向けのまとめ
---

* 基本的にrancher を今バリバリ触っている人向けではない事は確実な内容
    * rancher の 軽い概要
    * rancher を運用するためにHA構成はこう取るべき
    * 実際に構築してみたとか
* 取りあえず rancher 知りたい・触ってみたいんだけど、どうすればいいの？という人向けの資料や発表がちりばめられている感じでした

## rancher とは
---

* 公式サイト : http://rancher.com/
* github : https://github.com/rancher/rancher

* コンテナやコンテナのオーケストレーションツールの **運用を助ける** ソフト。
    * github_repo 見てると 「Platform for operating Docker in production」とか言っているし…そうね…という感じ。

* dockerとかrktとかでもなく、k8sとかdocker composeとかECS,GCEのレイヤーよりも一段上の「Operation」に特化している
* 開発は活発(と、Rancher JP の方が仰ってました)

## 各セッション概要
---

### Rancher概要、海外事例
---
* 発表 : @shindoy
* 資料 : https://www.slideshare.net/YosukeShindo/rancher-meetup-tokyo-4-intro-72290529
* 4～6ページのスライドが、割とコンテナ界隈やrancherについてのスライド以外はオープニング用スライドでした。
    * 逆にそのページに軽くまとめてあるコンテナ界隈のツール群や、rancherの守備範囲はここ！は割と知りたい感じではありました。


### GUI&基本操作、CLI編
---
* 発表 : @go_chiba
* 資料 : https://www.slideshare.net/gchiba/guicli
* rancherを知るために基本的な要素についての解説をまとめた感じの資料。
* 「rancherって何よ？」「どんな要素があるの？」が分かったら見る感じでした。


### プライベートカタログとcompose
---

* 発表 : @m-daichang
* 資料 : https://www.slideshare.net/m-daichang/rancher-compose

* 最初はrancherの重要な要素である stackとcatalogについて
* その中のcatalog(設計書？)については、公式で用意されているものもあるけど **自分で** 作れますよ、というお話。
* private catalog は デプロイ元の git_repo に一式を作ってrancherサーバに紐づければ行けるらしい
* 後半は private catalogの構成について。
    * うーん…「複数バージョンのカタログをダウンロード可能にするため」なのはわかるが、やっぱ「バージョン毎のディレクトリを切る」は頂けない気がする…
    * だったらrancherサーバ側でバージョニング機能を持ってくれてもいいじゃないか感はある。repo側に持たさずに。

### Vagrant で Rancher HA構成
---
* 発表 : @tetsrow.yanno
* 資料 : https://www.slideshare.net/ttyno/rancher-meetuptokyo-4-vagrant-rancher-ha
* HA構成をvagrantで「作ろうと頑張っている」というお話。
* 前半はrancher のマネージャー側が取れる構成についてのvagrantにどこまで反映しているか。
* 後半はrancherのもくもく会を通じて感じたことなど。
    * まだまだrancherの凄さが伝わっていないので頑張ろう！的な。

* ちなみにvagrantは「開発環境構築ツール」であり「Virtualbox」以外の選択肢もありますよ…他の利便性が **壊滅的に** 辛いだけで、virtualbox が実質パートナー感が出てるだけ、と思いたい。


### Rancher JPが仲間になりたそうにこちらを見ている
---
* 発表 : @tsukaman
* 資料 : https://www.slideshare.net/tsukaman/rancher-jp

* 完全にLTっぽかったですね、これは。
* Rancher JP を運営してみての苦労話とか、一緒にやりませんか！とか。
* 個人的には「月(または2月)に一度のmeetupやもくもく会」やるの、十分活発なペースだと思います。ネタがなくなったら息切れしないか心配…

### Rancher使ってみたよ(仮)
---

* 発表 : 住谷 (NHN テコラス) 
* 資料 : https://www.slideshare.net/ShunSumiya/rancher-meetuptokyo-4-rancher-72255425
* 「rancherのmeetup を弊社でやるので、触ってみようかな→触ってみた」的な資料。
* rancherでwordpressサイトを立てるまでの経緯や苦労話など。
* 取りあえずrancher使って何かデプロイして体験したい！って人はこのスライドを参考にするとよいかと。

## 参加した後の所感
---

* いざ纏めてみると、「rancher について知りたいなぁ」→「meetupで！」としてきた人にはそこそこ良かったのではないでしょうか。
    * rancherはどこを担当するの？について、もっと知りたさはありました。(他人に勧めるときにここに使うんだyo！と言いたい為)


* あと、rancherとは関係ないんですが **発表した資料が全部connpassで上がって一覧で見れるの** と、**rancher って何よ部分** や **構築してみたセッション** 入れたの、good pointだったと思います。他のmeetupにもこの要素は順守してもらえると嬉しいですね。
    * 濃い話をしたいのであれば deep diveとか ○○'s talkとして、別の所でやってもいいと思います。rancherはもくもく会をその場にしたみたいですが。

* 取りあえずはrancherを触ってみたい！(ローカルで)となった場合は取りあえずrancher serverとclientをローカルに立てて kusanagi for dockerでも呼んで、wordpress立てればいいかなぁ、という妄想はしました。
特定のブランチをgit clone || そのブランチがなければgit checkout



git clone時に`--branch ブランチ名 --single-branch`を使うと、特定のブランチだけをcloneできるので高速。

しかし、特定のブランチがそのリポジトリにない場合は、git cloneがコケてしまう。

そのため、`git clone`がコケたら、普通にcloneして`git checkout`するというものを書いた。

```shell
branchName="test-branch"
tmpDir="/tmp/project"
git clone --depth 1 --branch "${branchName}" --single-branch https://github.com/jser/jser.github.io.git "${tmpDir}"
if [ $? -ne 0 ]; then
    echo "Not found ${branchName} branch and git clone"
    git clone --depth 1 https://github.com/jser/jser.github.io.git "${tmpDir}"
fi
cd "${tmpDir}"
git checkout "${branchName}"

```


Travis CIなどから日付のブランチにコミットしたいみたいな用途で必要になった。
API Gateway カスタム認証のエラーレスポンスをカスタマイズする

# 普通に使うとエラーレスポンスが固定になる

API Gateway カスタム認証 (Custom Authorizers) において、トークンが不正な場合は  `context.fail("Unauthorized")` のようにエラーを返すのが一般的だろう。[公式ドキュメントの例](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/use-custom-authorizer.html#api-gateway-custom-authorizer-lambda-function-create)でもそうなっている。

しかし、その方法だとエラーレスポンスが「401 Unauthorized」に固定化されてしまう。提供したいAPIの要件によっては、任意のステータスコードやレスポンスボディを使いたいことがある。

この問題はAWSのフォーラムでも話題になっている。下記は一例。

- [AWS Developer Forums: Custom Authorizer, how to return 401 ...](https://forums.aws.amazon.com/thread.jspa?messageID=767222)

このやりとりを見ると将来的には改善されそうだが、時期はわからない。

# カスタマイズする方法

ただし現状でも、下記のように実装すればカスタマイズ可能である。

1. Custom Authorizer のレスポンスは常に認証OKとする。かわりに実際の認証結果をレスポンスの context に含める（参考：[Amazon API Gateway カスタム認証からの出力](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/use-custom-authorizer.html#api-gateway-custom-authorizer-output)）。ここでは例として context.validToken に含めることにする
2. 統合リクエストで $context.authorizer.validToken の値をマッピングする（参考：[$context 変数へのアクセス](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html#context-variable-reference)）
3. バックエンドはマッピングされた値を参照し、認証結果に応じたレスポンスを返す
4. 統合レスポンスで、3の内容に応じた任意のステータスコードやレスポンスボディをマッピングする

この方法を採用すべきかどうかは状況による。ただ、選択肢のひとつとして知っておいて損はない。
flow-runtime でテスト時にランタイムの型エラーでテストを落とす

`yarn add babel-preset-env babel-plugin-flow-runtime flow-runtime -D`しておく。 

babel-preset-env でこんな設定を書いた

```json:.babelrc
{
  "presets": [
    ["env", { "targets": {
      "Chrome": 56
    }}]
  ],
  "plugins": [
    "flow-runtime"
  ],
  "env": {
    "test": {
      "presets": [
        ["env", { "targets": {
          "node": 6
        }}]
      ],
      "plugins": [
        ["flow-runtime", {"assert": true}],
        "transform-async-to-generator"
      ],
    },
    "production": {
      "presets": [
        "flow",
        ["env", { "targets": {
          "browsers": ["last 2 versions", "IE 11"]
        }}]
      ]
    }
  }
}
```

本筋関係ないが、開発時は Chrome ターゲットだけで頑張る設定。

```
$ NODE_ENV=test ava
```

```js:foo.js
/* @flow */
export default function foo (): number {
  return ''
}
```

```js:foo.test.js
/* @flow */
import foo from './foo'
import test from 'ava'

test(async t => {
  t.is(foo(), 1)
})
```


![](https://i.gyazo.com/6d8692a534e5e7a946acd834e0ec26d2.png)
angular-cliでのエラー「Cannot read property 'AssetUrl' of undefined」

```ruby:ターミナルコマンド
npm uninstall -g angular-cli @angular/cli
npm cache clean
npm install -g @angular/cli@latest
```

このように、一度アンインストールしてキャッシュをクリアしインストールし直してください。
もし、これでもダメな場合は、node.jsのバージョンを新しくしてください。
もしくは、pakeage.jsonの編集が必要なようです。
http://stackoverflow.com/questions/40282288/angular-2-cannot-read-property-asseturl-of-undefined
【Realm】オブジェクトファイルを更新したらMigrationとスキーマファイルのバージョン設定が必要

Realmファイルをつくったけど、やっぱりもう一回オブジェクトファイルの内容を更新！
![image](https://qiita-image-store.s3.amazonaws.com/0/44105/854d90eb-fc30-f10f-52e7-3f7f66e9b2d3.png)
っと、ちょっと待ってください！！

このままでは、Realmをしようとしたときにエラーが出てしまいます。
![image](https://qiita-image-store.s3.amazonaws.com/0/44105/ac665bef-e5c0-bfba-24d6-8c8e4b0adaac.png)

どうやら、マイグレーションが必要であるのと、スキーマファイルのバージョン設定が必要のようです。

Objectファイルを変更したら、とりあえず以下のコードをAppDelegateに追加しましょう。

```swift:AppDelegate.swift

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        // ここから追加
        let config = Realm.Configuration(
            schemaVersion: 1,
            migrationBlock: { migration, oldSchemaVersion in
                if (oldSchemaVersion < 1) {}
        })
        Realm.Configuration.defaultConfiguration = config
        // ここまで

        return true
    }

```
Gitgraphのエディタ作った

Git のコミットグラフを簡単に作成できる [Gitgraph.js](https://github.com/nicoespeon/gitgraph.js) を使っていて、「もっと楽に色とか調整できたらいいのになぁ」と思ったので作ってみた。

![introduction](https://github.com/opengl-8080/GitgraphEditor/blob/master/docs/image/introduction.gif?raw=true)

[こちら](https://opengl-8080.github.io/GitgraphEditor/) を開けばすぐに使えます。

データはローカルストレージに保存されます（キー：`gitgraph.storage`）。

一応 Chrome, Firefox, Edge では動いているみたいです（IE は動かないです）。

[ソースや細かい使い方はこちら](https://github.com/opengl-8080/GitgraphEditor)（日本語は後半）
UE4BP Make Literal 型ノード

# Make Literal 型ノード
## Make Literal Float
https://docs.unrealengine.com/latest/INT/BlueprintAPI/Math/Float/MakeLiteralFloat/index.html

変数を作らないで一時的に値を設定して使うことが出来るノード
下の画像は同じ意味になる
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/cddf3539-b589-aace-80fc-a92263d2c769.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/111261/d8489c28-9469-7b03-7d9e-594281c4a14b.png)

急いでいる時はしかたがないが、何の用途として使用している値か分からないので、ちゃんと変数を作ってマジックナンバーを消したほうがいい。

## 他の型にも対応している

### Make Literalで検索する

型名が色々と表示される　
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/d9032a3f-d2ab-9b4e-885a-c0f42d5a0b20.png)

### Makeで検索する
様々な構造体が表示される
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/70409164-6046-d798-7ccd-9834cc8e5213.png)
vim の80文字問題 on tmux

## 1行でやるなら

```vim:.vimrc
set colorcolumn=80
```

80文字の箇所に赤いラインが表示されます。
ちょっとダサい。

## もっとかっこよくやるなら

```vim:.vimrc
 let &colorcolumn=join(range(81,999),",")                                                                                                                                                                                         
 hi ColorColumn ctermbg=235 guibg=#2c2d27 
```


## tmux 上で

`colorcolumn` の設定はそのままでは `tmux` 上で vim を起動した場合にうまく動きません。

```conf:.tmux.conf
set -g default-terminal "screen-256color" 
```

```vim:.vimrc
set term=screen-256color 
```
Webソフトウェア開発に有益なWebブック

Web上で配布されているタイプのドキュメントの中にもかなり役立つものが結構ある。
僕が読んだものも読んでいないものもありますが、ひとまず自分の知っている限りでまとめてみようと思います。
（ブログ記事程度の小さな単位のものは外しています。）

## 12 factor app

> The Twelve-Factor App （日本語訳）
> https://12factor.net/ja/

日本語版あり。
epub版もダウンロード可能

## Gettin Real

> Getting Real by 37signals
> http://gettingreal.37signals.com/GR_jpn.php

37signalsは「小さなチーム、大きな仕事」などの書籍も出している会社。
日本語版あり。PDF版やペーパーバック版の購入もある

## php the right way 

<a href="http://www.phptherightway.com">
    <img src="http://www.phptherightway.com/images/banners/lg-rect-386x280.png" alt="PHP: The Right Way"/>
</a>

> PHP: The Right Way
> http://www.phptherightway.com/

PHPerなら誰でも読んでおくべきといえる有名なドキュメント。
日本語版は[こちら](http://ja.phptherightway.com)。

ご丁寧にバナー画像まで用意されている。
pdfやepub版がダウンロードできるリンクも有り

## Web api design

これも個人的に

> Web API Design | Apigee
> https://apigee.com/about/resources/ebooks/web-api-design

Apigeeの公開している、Web APIの設計に関するドキュメント。
これは英語版のみ。

Apigeeは他にも多数ドキュメントを公開しているがこれしか読んだことがない。
https://apigee.com/about/resources/ebooks/

## 安全なウェブサイトの作り方

> 安全なウェブサイトの作り方：IPA 独立行政法人 情報処理推進機構
> https://www.ipa.go.jp/security/vuln/websecurity.html

IPAが出しているセキュリティに関するドキュメント。
別冊に「安全なSQLの呼び出し方」と「ウェブ健康診断仕様」がある。
日本語版しかない。

## SQLパフォーマンス詳解

> SQLパフォーマンス詳解
> http://sql-performance-explained.jp/

こちらは有料。PDF版は1000円程度で購入可能。
日本語版あり。

## 終わりに

このリストは絶賛未完です。
「なんでこれがないの？」等あればコメントで教えていただけると幸いです。
（自分も思い出したら嗅いていきます）