OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonでのデータ分析　備忘録

Pythonでのデータ分析を行う際の備忘録。
気が向いたら他の方に見て頂けるような記事にしたいと思いますがまずは自分用として。


#複数のグラフを一気に書く方法
```python
fig,ax = plt.subplots(1,3,figsize=(15,5))

1つめのグラフ
sns.countplot("Sex", data=train_df,ax=ax[0])

２つめのグラフ
sns.countplot("Sex", data=train_df, hue="Pclass",ax=ax[1])

３つめのグラフ
sns.countplot("Sex", data=train_df, hue="Survived", ax=ax[2])
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/62880/2baf7ddd-d82b-b97c-92ea-e31372ca14f4.png)

[matplotlib によるデータ可視化の方法 (1)](https://qiita.com/ynakayama/items/8d3b1f7356da5bcbe9bc)


##各種リンク（毎度検索するのがめんどくさいので）
[pythonで美しいグラフ描画 -seabornを使えばデータ分析と可視化が捗る その2](https://qiita.com/hik0107/items/7233ca334b2a5e1ca924)
[Python でデータ可視化 - "Facet"で属性別グラフを一気に描く方法が便利すぎる](https://qiita.com/hik0107/items/865b75ae486728cb0006#_reference-581e9f6d003d4a0adb74)
[seabornを使ってデータを可視化する(factorplot)](http://blog.livedoor.jp/oyajieng_memo/archives/1479255.html)
[seabornによる統計データ可視化（ポケモン種族値を例に）(2)](http://mizti.hatenablog.com/entry/seaborn2)
パソコンスリープをマウス操作で解除したくない

# 参考にしたリンク
[パソコンスリープ時に、マウス操作でスリープ解除しないようにする方法 - Windows 10 -](https://www.iyamaittane.com/entry/2015/08/19/070000)

[Windowsの「休止状態」や「スリープ」したにも関わらず勝手に起動される](https://qiita.com/murachi1208/items/27f32ced71b4d73fe112)
WSL（Windows Subsystem for Linux）を使ってみた

# はじめに
Windows10でLinuxを実行することができるWSL（Windows Subsystem for Linux）を使ってみたので、簡単にまとめます。

## WSLとは？
WSLはWindows10のOS上でLinuxの実行環境を実現するサブシステムです。単純にいうとアプリケーションとしてLinuxを実行できます。またWindows OSのAPIを使用した仕組みを提供しているので、Linux側からWindowsOSに対するファイルアクセスも可能です。本記事執筆時点では、Ubuntuの他、OpenSUSE、SLES（SUSE Linux Enterprise Server）などのディストリビューションがMicrosoft Storeからインストールできます。

(※)WSLを使用する場合は、Windows 10 バージョン1709（Windows 10 Fall Creators Update、ビルド16299）以降になります。またデフォルトでは有効になっていないため、以下の手順を実施することでWSLが使用可能になります。

## インストール手順
1. 設定画面の「アプリと機能」から「関連設定」の「プログラムと機能」をクリックする。
![WS000.JPG](https://qiita-image-store.s3.amazonaws.com/0/221759/4e7ea48d-bc82-307f-ef7e-12a598941f57.jpeg)
---

2. 「Windowsの機能の有効化または無効化」をクリックする。
![WS001.JPG](https://qiita-image-store.s3.amazonaws.com/0/221759/7f74c545-ad09-4ef7-3e75-57911508fbc2.jpeg)
---

3. 「Windows Subsystem for Linux」にチェックを入れる。
![WS002.JPG](https://qiita-image-store.s3.amazonaws.com/0/221759/b74413bb-e75b-c3e5-a94a-630bcfca1527.jpeg)
---

4. WSLのインストールが始まるので、インストール終了後「今すぐ再起動」をクリックする。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/221759/692db4b3-04b7-0b46-764c-cb09cf0255b0.png)
---

5. 再起動後、Microsoft Storeから**Linux**で検索して以下のような画面が表示されるので、**Ubuntu**をクリックする。
![WS003.JPG](https://qiita-image-store.s3.amazonaws.com/0/221759/31d69077-9fb5-77f7-16c0-362566b4f33a.jpeg)
---

6. 「入手」をクリックしてインストール後、「起動」をクリックする。
![WS004.JPG](https://qiita-image-store.s3.amazonaws.com/0/221759/cb85f537-580d-18d4-03a2-4ce9787bd57f.jpeg)
---

7. 初回起動時は少し待つと初期設定が始まるので、ユーザー名とパスワードを入力する。ユーザー名とパスワードを入力後、Linuxの実行環境して使用できる。
![WS005.JPG](https://qiita-image-store.s3.amazonaws.com/0/221759/a4c56174-f11c-fb42-a00c-bca377b9bb47.jpeg)
---

##所感
Ubuntuのアイコンをクリックすると、ログイン処理もなく使いたいときにLinuxをすぐ呼び出せるので、ちょっとしたLinuxのプログラムを実行するのに便利だと思います。またPythonを使いたいときも簡単に実行環境として使用できるのでいい感じです。

あとはLinux側からWindows10のOS側に対するファイルアクセスや、Linuxコマンドも実行可能なので、上手く使えば何かに使えそうです。。
Haskellの森を歩く

# 参考にしたもの
https://haskell.e-bigmoon.com/stack/tips/stack-upgrade.html
https://www.ishiy.xyz/posts/2016-02-28-haskell-docker.html

# stack
Haskellのビルドツール

## インストール

```
curl -sSL https://get.haskellstack.org | sh
```

パスを通す

```
 export PATH=~/.local/bin:$PATH
```

>反対に export PATH=$PATH:~/.local/bin とすると、古い stack を参照してしまうため、注意が必要です。
https://haskell.e-bigmoon.com/stack/tips/stack-upgrade.html

## GHCのインストール

```
stack setup
```

## バージョンの確認

```
stack --version
```

## アップグレード

```
stack upgrade
```

## 新しいプロジェクトの作成

```
stack new <project-name>
```
 
## 実行ファイルを作成

```
stack ghc <file-name.hs>
```

## 実行ファイルを作成して`~/.local/bin/`にインストール

```
stack install
```

## 単体テストの実行

```
stack test
```

## REPLの実行

プロジェクト内で使うと関連モジュールを自動的に読み込む

```
stack ghci
```

# Dockerで実行

```
# プロジェクトを新規作成
stack new hello-docker simple
cd hello-docker

# Dockerの設定
cat << EOF >> stack.yaml
docker
    enable: true
EOF

# イメージをプル
stack docker pull
```

※ビルドの前にSELinuxをいじる（Fedoraだけ？）

```
# SELinuxをいじる
su -c "setenforce 0"
```

## 動的リンクでビルド

```
# ビルド
stack build

# 実行
stack exec hello-docker
```


## 静的リンクでビルド

```   
# ビルド
stack build --ghc-options='-optl-static -optl-pthread'

# 実行
#stack exec hello-docker
```

### alpineで実行

```
# alpineをプル
docker pull alpine

# 静的リンクでビルドしたバイナリをコピー
cp hello-docker/.stack-work/install/x86_64-linux-dkda49f7ca9b244180d3cfb1987cbc9743/lts-10.4/8.2.2/bin/hello-docker ./

# ディレクトリ作成 
mkdir haskell-hello-docker
cd haskell-hello-docker

# Dockerfileを作成
cat << EOF > Dockerfile
FROM alpine:latest
COPY hello-docker /usr/bin
CMD sh
EOF

# ビルド
docker build -t haskell-hello-docker .    

# 実行
docker run -it --rm haskell-hello-docker hello-docker   
```

# IHaskell

https://github.com/gibiansky/IHaskell

jupyter notebookでHaskellが使えます

fedora 26 でインストール

依存するライブラリをインストール

```
# C++
sudo dnf install -y gcc-c++

# C library
sudo dnf install -y \
    libiw.so.29 \
    file-devel \
    blas-devel \
    lapack-devel \
    cairo-devel \
    pango-devel \
    zeromq-devel
```

```
curl -sSL https://get.haskellstack.org/ | sh
git clone https://github.com/gibiansky/IHaskell
cd IHaskell
pip3 install -r requirements.txt
stack install gtk2hs-buildtools
stack install --fast
ihaskell install --stack
```

実行

```
stack exec jupyter -- notebook
```
AWS VPCでRoute53のプライベートホストゾーンを使う

# はじめに

VPCでのプライベートホストゾーンについて説明します。
これは```route53.test```のような実在しないドメインをRoute53に登録&設定すれば、設定したVPC限定でそのドメインが使えるというものです。

これを使って例えば次のようなことができます。

インスタンスAに```web.route53.test```というレコードセットをRoute53に登録
↓
設定したVPCのインスタンスからはwebという名前でインスタンスAにアクセスできる（どちらかと言うとリゾルバの機能ですが）

踏み台からのSSHやリレー、プロキシ先の指定などに便利ですよね。

# 料金について

[こちら](https://aws.amazon.com/jp/route53/pricing/)をご覧ください。月0.5ドルかかります。日割り計算はありません。

ただし作成から12時間は料金は発生しないようなので、テスト目的ならば12時間以内に削除しましょう。

# 設定

ドキュメントにいろいろ書かれていますが、大抵の場合次の手順でいけるはずです。

1. Route53でプライベートホストゾーンを登録
2. VPCのDNS, DHCP設定を変更

VPCのDHCPの設定を変更すれば```/etc/resolv.conf```の設定は自動で行われます。便利ですね。

## 1. Route53でプライベートホストゾーンを登録

Route53のページに行ってホストゾーンを作成します。
特に迷うことはないと思いますがこんな感じで
![スクリーンショット 2018-01-25 19.37.07.png](https://qiita-image-store.s3.amazonaws.com/0/27674/d526f169-cd95-f13c-5f7c-e7fed6aeaa03.png)

次にレコードを登録しましょう。
登録するIPはもちろんプライベートIPアドレスで。
![スクリーンショット 2018-01-25 19.41.35.png](https://qiita-image-store.s3.amazonaws.com/0/27674/864e0103-16d9-a71a-8c1c-4a400873f668.png)

Route53での作業は以上です。

## 2. VPCのDHCP設定を変更

VPC一覧のページに移動し、DNSホスト名を```はい```に設定します。
![スクリーンショット 2018-01-25 19.48.19.png](https://qiita-image-store.s3.amazonaws.com/0/27674/6a5e5439-d828-e7a6-d4f1-e75876bae6fe.png)


次にVPCの```DHCP オプションセット```というページに移動します。

ここで予めオプションの値をメモしておいてください。
※多分こんな感じで設定がされていると思います。
```domain-name = ap-northeast-1.compute.internal;domain-name-servers = AmazonProvidedDNS;```

ドメイン名にメモした```domain-name```で指定されている値と**スペースを開けて**今回設定するプライベートホストゾーンの値を入力します。
ドメインネームサーバーには```AmazonProvidedDNS```と入力してください。

![スクリーンショット 2018-01-25 19.54.18.png](https://qiita-image-store.s3.amazonaws.com/0/27674/1b52455d-3158-102d-2148-76188b64e30c.png)


最後にVCPの一覧画面に移動し、DHCPオプションセットの編集から、先ほど作成したオプションセットを指定します。
![スクリーンショット 2018-01-25 19.57.55.png](https://qiita-image-store.s3.amazonaws.com/0/27674/8a5ed540-7af9-6508-6850-7254bd5111ab.png)

5分程度待つと、設定したVPC内のインスタンスの```/etc/resolv.conf```が自動で変更され、instance01とinstance02でIPが引けるようになります。

![スクリーンショット 2018-01-25 20.07.03.png](https://qiita-image-store.s3.amazonaws.com/0/27674/e95ae1cf-92d2-a7df-65d5-8e951e77163b.png)

※テストで作った場合は忘れずにホストゾーンを削除しましょう！

# 注意点

自分は試していないのですが、[ドキュメント](https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/hosted-zones-private.html)に記載がある通り、名前空間が重複するパブリックゾーンとプライベートホストゾーンだと注意が必要です。

たとえばdevドメインのような実在するパブリックなドメインをプライベートホストゾーンに登録してしまうと、パブリックな方のDNSサーバには問い合わせてくれないということです。
気をつけましょう。
Movidius Neural Compute StickはVirtualBoxでは動かない！

#結論
結論から言うとVirtualBoxでは動きませんでした。Webには動かせるっぽい記事ばっかりだったので、ポストしておきます。
※ホストがWindows10だと動くとのコメントいただきました！mac+VirtualBoxがだめっぽいです。。。

#Movidius Neural Compute Stick
日本発売当初に某ショップで注文したんですが、システム障害とやらで勝手にキャンセルされて、再注文しようとしたら在庫切れだったのですっかり萎えてた「Movidius Neural Compute Stick」
信頼と実績のスイッチサイエンスさんは即発送とのことだったので今更ながら買いました。

手持ちのMacで動かしたい！と思って、Webを参考にチャレンジしましたが、結論から言うとVirtualBoxでは動きませんでした。

#実行環境
##Mac
- MacBook Pro (Retina, 13-inch, Late 2013)
- プロセッサ：2.4 GHz Intel Core i5
- メモリ：16 GB 1600 MHz DDR3
- macOS Sierra 10.12.6

##VirtualBox
- バージョン 5.2.6 r120293 (Qt5.6.3)

#概要
NCSDKのダウンロード、インストールまでは正常に完了するのですが、いざ動かそうとするとNCSが切断されて動きません。
仮想USBドライバ周りでうまくいかないっぽい感じでした。
まあ、「The SDK and NCS was designed to be used with a machine running Ubuntu 16.04 natively」って言ってるので、サポートもないしそうなんでしょう。

その後、[めげずにVMWare Fusionで動作させました！](https://qiita.com/akitooo/items/40bdafbb98b35125755d)
fileURLからUTI（Uniform type identifier）を取得する


すごく遅い。

```swift
func uti(url: URL) -> String? {
    
    return try? NSWorkspace.shared.type(ofFile: url.path)
}
```

少し早い。

```swift
func uti(url: URL) -> String? {
    
    guard let r = try? url.resourceValues(forKeys: [.typeIdentifierKey]) else {
        return nil
    }
    return r.typeIdentifier
}
```
CSS アスペクト比を維持する

# はじめに
アスペクト比を維持したまま画像を表示させたい、動画を画面いっぱいに表示させたいと思い調べました。

## object-fit
CSSの```object-fit```プロパティを使うとアスペクト比を維持させることができます。

| 値 | 説明 |
|:-----------|:------------|
| fill | 要素のコンテンツボックス全体を埋めるサイズになる |
| contain | 要素のコンテンツボックス内に合うサイズになり、アスペクト比を維持する |
| cover | 要素のコンテンツボックス全体を埋めるサイズになり、アスペクト比を維持する |
| none | リサイズせずに表示する |
| scale-down | noneまたはcontainを指定したかのようになり、表示したいコンテンツがその要素よりも小さければnoneが適用される |

初期値は```fill```です。しかし、動画の場合初期値は```contain```になります。

## 余談
今回は```object-fit```プロパティについて書きましたが、調べている時に```object-position```プロパティを知りました。こちらもなかなか面白そうなので触ってみたいです。

## 追記
コメントでご指摘いただいたので少し書かせてもらいます。

`object-fit`プロパティはIEとver15以下のEdgeで未対応です。対応するためのプラグイン[object-fit-images](https://github.com/bfred-it/object-fit-images)を使用すると対応できるそうです。[こちらの記事](https://dainashiyesterday.com/post-5206/)が分かりやすかったので是非参考にしてみてください。

***

参考サイト
[object-fit - CSS - MDN - Mozilla](https://developer.mozilla.org/ja/docs/Web/CSS/object-fit)
[一歩先行くCSS 第1回 object-fitとobject-position](https://app.codegrid.net/entry/css-object)
[object-fitとobject-positionで画像をトリミングする方法(IE・Edge対応)](https://dainashiyesterday.com/post-5206/)
WEBアプリ開発でframeタグを使うべきではない理由

皆さんご存知の通り、frameタグはHTML4では非推奨とされ、さらにHTML5では廃止されています。
しかし、frameタグを使っているWEBアプリの開発に携わることになったため、
プログラマー目線で使わないほうがいいと思った理由を書きます。
フロントエンドが苦手なプログラマーはこれを機に今後frameタグを使わないようにしてください。

# 大きな理由は以下２つ

## CSRF対策のワンタイムトークンが(たぶん)使えない
※「たぶん」と書いたのは、試したことがないためです。

FWによってはリクエスト毎にワンタイムトークンが発行され、
意図した遷移元からちゃんと遷移しているかをチェックできるものがあるが、
フレームで２つにぶった切ったら１つのワンタイムトークンが
同じタイミングで２回使われることになり、結局使えない。

## フレームで別れている各ページの実行順は毎度同じではないため、バグの元になりやすい
ローカル等の開発環境の場合、ネットワークが速いため、
うまいことframesetタグで記述した順序で実行されることが多いんですが、
本番環境では、実行順序がバラバラになったりして、
開発環境では見つからなかったバグが見つかったりします。

フレームの各Actionクラスで共有しているセッションがある場合にバグになったりします。

# 他、小さな理由

* [Visual Event](http://www.sprymedia.co.uk/article/Visual+Event+2)が使えない。
* Javascriptで他フレームと連携するときにちょっと面倒
* 見た目がダサい…
Redis Replication検証

# はじめに
他のRedis構築に関するページは以下をご参考ください。
[Redis構築のまとめ](https://qiita.com/ono-soic/items/d63ac849ebccee68b5bc)

参考)http://memocra.blogspot.jp/2013/01/redis.html

レプリケーションとは、マスタに書き込んだデータをスレーブにコピーすることで、
書き込みはマスタ、読み取りはスレーブと担当を分けることで負荷を分散させる。
読み取りにはマスタも参加することもある。

# 環境
CentOS 6.8
Redis 3.2.5(当時の安定バージョン)

# 検証方法
クラスタ構成では各サーバの設定が必要なので、2台のマスター/スレーブ構成で検証する

# 構成
| IPアドレス | 役割 | ポート番号 |
|:--|:--|:--|
| 192.168.56.111 | master | 6379 |
| 192.168.56.112 | slave | 6379 |
 

# 検証結果
・マスターが落ちると機能しなくなる
・スレーブはマスターに昇格しない
・マスターは書き込み専用・スレーブは読み込み専用で使用する

## クラスタ構成と比べて
・クラスタはマスターが1台落ちるとそこでsetした値はgetできなくなる
→Redisからのデータ参照時に不整合が起きる可能性がある
・レプリケーションの場合はマスターが落ちたとしても、マスターでsetした値はスレーブから参照することができる
・データ不整合を考慮しなければクラスタ構成の方が負荷分散・可用性が高い

## 検証内容詳細
### Redisの設定ファイルを修正する
設定するのはslave側の「192.168.56.112」

```
$ vim /etc/redis/6379.conf
slaveof 192.168.56.111 6379
```
※この時、cluster-enableはnoにしておくこと

 

### マスターで値をsetする
マスター/スレーブを起動してマスターで値をsetする

```
$ service redis start
 
$ redis-cli -h 192.168.56.111
192.168.56.111:6379>set num1 1
OK
```

その後スレーブで値をgetしてみる

```
$ redis-cli -h 192.168.56.112
192.168.56.112:6379>get num1
"1"
```
マスターでsetした値がスレーブにも反映されている

### マスターを落とす
マスターを落としてみる。
落とす方法はserviceコマンドでredisを停止したり、サーバ毎落としても可

```
192.168.56.112:6379> get num2
"2"
192.168.56.112:6379> set num3
(error) ERR wrong number of arguments for 'set' command
```
マスターが落ちてもスレーブでgetはできる。ただしsetは読み取り専用のためできない
→クラスタのようにマスターに昇格はされない
マスターが復活すると問題なくマスター/スレーブの関係に戻る
 
### スレーブを落とす
スレーブを落としてからマスターでsetを行う

```
192.168.56.111:6379> set num3 3
OK
```
その後スレーブを復活させてgetする

```
192.168.56.112:6379> get num3
"3"
```
問題なくgetすることができた。

※なお、スレーブが落ちる→マスターでnum5をset→マスターが落ちる→スレーブ復活→スレーブでnum5をgetしてもマスターでsetした値は取り出せない(マスターが復活すればnum5をgetできるようになる)
2文字濁音(NFD)で発狂せずに1文字濁音(NFC)へ変換しCSVで出力する方法

Windowsユーザーから送られてきたファイルなどをmacで確認すると、濁音が2文字濁音として表示されて…困った経験はないですか？

僕はあります！笑

指定したフォルダのサブフォルダとファイル名を取得し二文字濁音を一文字濁音へ変換してcsvで出力する方法を紹介します！

# まずはnkfをインストールしよう！

ターミナルで以下のコマンドを入力します。

```
$ brew install nkf
```
homebrewのインストールがまだな人は以下よりインストールしてください！
[Homebrew](https://brew.sh/index_ja.html)

# ここからはShellScript
```shell:toNfcCsv.sh
#!/bin/bash

make_csv()
{
dir="$1"

find ${dir} | nkf -wLu --ic=UTF8-MAC | nkf -s > ${dir}.csv
}

for i in "$@"
do
  make_csv "$i"
done

```

## 解説

```
make_csv()
{
dir="$1"

find ${dir} | nkf -wLu --ic=UTF8-MAC | nkf -s > ${dir}.csv
}
```
## findコマンド
findコマンドで指定したフォルダのサブフォルダ、ファイルを取得し`|`で標準入力として`nkf -wLu --ic=UTF8-MAC`へ渡します。
## NFD→NFCへの変換
`nkf -wLu --ic=UTF8-MAC`では、`--ic=UTF8-MAC`で入力文字コードをNFD(UTF8-MAC)として受け取り、`-w`でUTF8コード(NFC)として出力します。`-Lu`改行コードを「LF」として出力するオプションです。　
UTF8-MACについては以下を参考にしました！

> UTF-8-MAC とは、Mac OS X に付属する iconv にて利用できる文字エンコードの一つで、 Normalization Form D (NFD) で符号化した UTF-8 のことを指します。 一般に UTF-8 とだけいった場合には、Normalization Form C (NFC) でエンコードされたものを意味します。
引用：[UTF-8-MAC](http://macwiki.osdn.jp/wiki/index.php/UTF-8-MAC)

つまり、`-w`オプションはNormalization Form C (NFC)として出力することになります
ここでは、UTF-8(UTF-8-MAC(NFD))をUTF-8(NFC)へ変換したことになります。

## csvファイルの作成
`nkf -s > ${dir}.csv` では、Shift JISで出力した値を新たにcsvファイルで書き出すようにしています。Shift JISで書き出す意味あるの？　と思うそこのあたな！　`nkf -wLu --ic=UTF8-MAC`の標準出力をcsvへ書き出してみて下さい……。:eyes:

## 一応解説
```
for i in "$@"
do
  make_csv "$i"
done
```
複数フォルダを指定した場合にも対応できるようにしています。
↓こんな感じ！

```
$ ./toNfcCsv.sh フォルダ1 フォルダ2
```
### 最後に
単純にテキストファイルとして出力したい場合は以下でokです:relaxed:

```
nkf -wLu --ic=UTF8-MAC > ${dir}.txt
```
Githubでコードアップしたので良かったら使ってみてください！
https://github.com/masanorifunaki/bash-toNfcCsv

### 参考
[UTF-8-MAC](http://macwiki.osdn.jp/wiki/index.php/UTF-8-MAC)
[IT専科 UNIX/Linuxコマンド nkf](http://www.itsenka.com/contents/development/unix-linux/nkf.html)
NumPy(ナムパイまたはナンパイ)基本

# Numpy
C/C++ and Fortranで実装されているので速い
http://www.numpy.org/

# NumpyのImport

```python
import numpy as np
```
numpyというライブラリをnpという名前で使えるようにする

# numpyの一次配列を作る
```python
arr = np.asarray([1,2,3], dtype=np.int32)
print (arr)
[1 2 3]
```
np.int32とは32 ビット符号付き整数のこと。

# numpyのデータ型を変更する
```python
In [16]:arr.astype(np.float32)
Out[16]:array([ 1.,  2.,  3.], dtype=float32)
In [17]:arr
Out[17]:array([1, 2, 3], dtype=int32)
```

# numpyの多次元配列を作る
```python
In [28]:arr=np.asarray([["a","b","c"],["d","e","f"]])
In [29]:arr
Out[29]:array([['a', 'b', 'c'],
       ['d', 'e', 'f']],
      dtype='<U1')
In [30]:print (arr)
[['a' 'b' 'c']
 ['d' 'e' 'f']]
```

# numpyの全ての配列をスカラー倍する
```python
In [32]:arr=np.asarray([[1,2,3],[4,5,6]])
In [33]:3*arr
Out[33]:array([[ 3,  6,  9],
       [12, 15, 18]])
```

# numpyの関数呼び出し
```python
In [36]:np.sqrt(arr)
Out[36]:array([[ 1.        ,  1.41421356,  1.73205081],
       [ 2.        ,  2.23606798,  2.44948974]])
```
Redis Cluster構築時のエラーまとめ

# はじめに
他のRedis構築に関するページは以下をご参考ください。
[Redis構築のまとめ](https://qiita.com/ono-soic/items/d63ac849ebccee68b5bc)

自分がRedis Cluster構築時に出たエラーをまとめました。

## 環境
CentOS 6.8
Redis 3.2.5
Ruby 2.3.2

# エラー一覧
## cannot load such file
```
redis-trib.rb: cannot load such file -- redis (LoadError)
$ gem install redis
```
で解決する

## Redis::Timeoutのエラーが出た場合
gemでインストールしたredisのバージョンに不備がある可能性があるので

```
$ gem install redis -v 3.2 # 3.2はredisのバージョンに合わせる
```
でバージョンを合わせる

## ERR Slot 16011 is already busy (Redis::CommandError)

```
[ERR] Node 192.168.56.112:6379 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
```
CLUSTERを構築するためにslotは確保されている状態になっているので、新しくCLUSTER構築ができなくなっている

主にCLUSTER構築中に中断して再度CLUSTER構築しようとした時に起きる

◯解決方法

```
redis-cli -h xxx.xxx.xx.xxx -c CLUSTER RESET
```
を全サーバに対して行う

◯それでも解決しない場合

redis内のdbを空にしてから実行する

```
$ redis-cli -h 192.168.56.111 -c
192.168.56.111:6379> select 0
OK
192.168.56.111:6379> flushdb
OK
192.168.56.111:6379> flushall
OK
 
192.168.56.111:6379> exit
$ redis-cli -h xxx.xxx.xx.xxx -c CLUSTER RESET
```

それでもできない場合はredisのプロセス毎killしてみる

## ./redis-trib実行しても「・・・」が続いて終わらない
にWaiting for the cluster to join..........................................ってなって終わらない

```
$ iptables -I INPUT -p tcp -m tcp --dport 16379 --syn -j ACCEPT
$ service iptables save
$ service iptables restart
```

redisサーバで指定しているポート番号+10000を全サーバで許可しないといけなかった。 

○それでも解決しない場合
「/etc/redis/${REDISPORT}.conf」のbindの設定で止まっている可能性がある

```
$ vim /etc/redis/6379.conf
# bind 127.0.0.1 192.168.56.xxx
```

bind 192.168.56.xxx 127.0.0.1 #IPアドレスを192.168.56.xxxが先に来るように入れ替えた
 
○それでも解決しない場合
/etc/redis/6379.conf編集前のプロセスが残っていて設定が反映されていない可能性がある

```
$ ps aux | grep redis
root      1361  0.0  0.7  40784  7712 ?        Ssl  13:05   0:00 /usr/local/bin/redis-server 192.168.56.112:6379 [cluster]
root      1405  0.0  0.0 103324   904 pts/0    S+   13:12   0:00 grep redis
$ kill 1361
```
killして再度クラスタ構築すると起動することができた。
就活生が就活せずにやってしまったProcessing2ヶ月間の軌跡

後悔はしていない。

# やったこと
* それっぽい本を購入して模倣してみる
* ベクトル、三角関数などの数学の勉強
* 自分で作ってみる
* またそれっぽい本を購入して模倣してみる
* またまた自分で作ってみる

です。
## それっぽい本を購入して模倣してみる
初めはなにもわからなかったので、youtubeでprocessingを検索したり、webで作品みてまわったりしていました。そこで見つけた方が[Nature of Code](https://www.amazon.co.jp/Nature-Code-Processing%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E8%87%AA%E7%84%B6%E7%8F%BE%E8%B1%A1%E3%81%AE%E3%82%B7%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3-%E3%83%80%E3%83%8B%E3%82%A8%E3%83%AB%E3%83%BB%E3%82%B7%E3%83%95%E3%83%9E%E3%83%B3/dp/4862462456)という本を勧めていたので、真似てみることにしました。
この時点で作ったものの一部がこちら
![bound.gif](https://qiita-image-store.s3.amazonaws.com/0/146807/0fb0e56b-0ffa-fc29-ebb0-74f84f0a2f09.gif)
![sin_cos.gif](https://qiita-image-store.s3.amazonaws.com/0/146807/3a31cdf3-8d1c-52ed-18e0-b1295df4b341.gif)
![ki.gif](https://qiita-image-store.s3.amazonaws.com/0/146807/e33e8c66-b3c9-77e5-f0d3-7c22ef042429.gif)

ほぼ、というか完璧に模倣して、なんとなく物体の動かし方だったり、三角関数やベクトルの使い方だったりがわかったのかなーという感じ。

## 数学の勉強
Processingをやるのにある程度必要であることは知っていたので以下のように学習しました。(時期的には先ほどの話のちょっと前と最中だったかと思います。)

### ベクトル 
 いろんなWebサイトをみて回ったのと Nature of Code。
### 三角関数
 こちらもWebサイトをみて回ったのと[数学ガールの秘密ノート 丸い三角関数](https://www.amazon.co.jp/%E6%95%B0%E5%AD%A6%E3%82%AC%E3%83%BC%E3%83%AB%E3%81%AE%E7%A7%98%E5%AF%86%E3%83%8E%E3%83%BC%E3%83%88-%E4%B8%B8%E3%81%84%E4%B8%89%E8%A7%92%E9%96%A2%E6%95%B0-%E7%B5%90%E5%9F%8E-%E6%B5%A9/dp/479737568X)という本を持っていたのでそれで勉強しました。
この本は非常にわかりやすくProcessingを勉強する上で非常に助けになりました。

## 自分でつくってみた
![l-system.png](https://qiita-image-store.s3.amazonaws.com/0/146807/f35fe90e-4af1-61b5-6e5d-6d7074d2d3e7.png)

![triangle.gif](https://qiita-image-store.s3.amazonaws.com/0/146807/ccd4b710-b151-e56f-6788-ec72c8b88018.gif)
![sphere.gif](https://qiita-image-store.s3.amazonaws.com/0/146807/29bc5ea0-f532-1a7f-e4a0-f0d885e29b34.gif)

本や、いろんな人の解説を参考につくってみました。この時点ではだいぶそれっぽくなってきた満足感がありましたが、まだまだアート感が足りない気持ちの方が強かったので、もう少しアート方向に踏み込んでみることに。

## またまたそれっぽい本を購入して模倣してみた

[ジェネラティブアート Processingによる実践ガイド] (https://www.amazon.co.jp/%E6%99%AE%E5%8F%8A%E7%89%88-%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%A9%E3%83%86%E3%82%A3%E3%83%96%E3%83%BB%E3%82%A2%E3%83%BC%E3%83%88%E2%80%95Processing%E3%81%AB%E3%82%88%E3%82%8B%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-%E3%83%9E%E3%83%83%E3%83%88%E3%83%BB%E3%83%94%E3%82%A2%E3%82%BD%E3%83%B3/dp/4861009634)
アート色が強めのものをと思って、こちらを購入。
最初の方は、よくある入門書の構文解説という具合で飛ばしてしまいましたが、途中からは楽しかったです。随所にある作品の写真が本を読むモチベーションにつながりましたし、私が求めていたアートっぽい綺麗なものにだいぶ近い感じがありました。
![noise.gif](https://qiita-image-store.s3.amazonaws.com/0/146807/322fa7c0-8cbb-e33e-fb90-13c3c9af6053.gif)

![polygon.gif](https://qiita-image-store.s3.amazonaws.com/0/146807/8e2aee97-9116-201b-8e03-5501071e02a2.gif)

## またまた自分でやってみる
![noise-circle.gif](https://qiita-image-store.s3.amazonaws.com/0/146807/e0c5ce99-e569-58e1-dc49-66836eab6fdf.gif)


よくわからない何かが生まれてしまった。

## まとめ
なんだか楽しくなってしまって、気づいたら２ヶ月たってしまいました。
今したいのはThree.jsで3D作品を勉強することと、いろんな作品をみることと、その作り方をみることなのですが、それよりもまず就活をしなさいと自分に言って聞かせることを始めようと思います。
【MySQL】トランザクションを要するストアドプロシージャのテンプレート

MySQLにおいて、トランザクションが必要なストアドプロシージャを書く必要があったので、その雛形を書き留めておきます。ちょっと苦労したのは、`DECLARE EXIT HANDLER`して明示的に`ROLLBACK`しておかないと、途中でエラーがあっても`COMMIT`までズンズン進んでしまうということでした。

- MySQL 5.6.4以降

```sql
DELIMITER //
CREATE PROCEDURE プロシージャ名()
BEGIN
  -- DECLARE 変数

  -- DECLARE CURSOR

  DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING
  BEGIN
    GET DIAGNOSTICS CONDITION 1 @sqlstate = RETURNED_SQLSTATE, @errno = MYSQL_ERRNO, @text = MESSAGE_TEXT;
    SELECT @sqlstate, @errno, @text;
    ROLLBACK;
  END;
  -- DECLARE 追加のHANDLER

  START TRANSACTION;
  
  -- ここに処理を書く
      
  COMMIT;
  SELECT 'Success!' AS result FROM DUAL;
END//
DELIMITER ;

CALL プロシージャ名();
```

エラーがあった場合は`GET DIAGNOSTICS CONDITION 1`により、エラー内容をSELECT文で表示するようにしています。これがないとROLLBACKして正常終了するだけで、どんなエラーが発生したのか分からないので。

またDECLAREの順序には決まりがあるみたいで、変数→カーソル→ハンドラーの順に並んでいないとエラーになります。

# 参考

- [Improve your Stored Procedure Error Handling with GET DIAGNOSTICS](https://www.chriscalender.com/tag/declare-exit-handler-for-sqlexception/)
- [GET DIAGNOSTICS 構文](https://dev.mysql.com/doc/refman/5.6/ja/get-diagnostics.html)
sentinel.confの設定内容

# はじめに
他のRedis構築に関するページは以下をご参考ください。
[Redis構築のまとめ](https://qiita.com/ono-soic/items/d63ac849ebccee68b5bc)

sentinel.conf内の設定がわからなくなることがあったのでまとめました。
編集・設定した項目だけ記載しております。他の項目まとめているところがあれば教えてください。

# 環境
CentOS 6.8
Redis 3.2.5(当時の安定バージョン)

# 設定
※今回の設定では${REDISPORT}は26379
sentinel形式の時のみ使用
元ファイルはredis-3.2.5/sentinel.conf
構築については[Redis Sentinel構築](https://qiita.com/ono-soic/items/b1437b30f0e3659dc169)を参照

| 項目 | 設定例 | 内容 | 備考 |
|:--|:--|:--|--:|
| bind |   | bindするネットワークのインターフェースを限定できる | コメントアウト |
| protected-mode | no | yesで他端末からの接続を制限する<br>設定しないとデフォルトで有効になる<br>自動フェールオーバーしたい場合、noを設定 |  |
| daemonize | yes | デーモン化するときはyes  |   |
| port | 26379 | クライアント向けの開放ポート<br>redis-sentinelのデフォルトポード番号 |
| pidfile | sentinel_26379.pid | デーモン化した時のPID |   |
| dir | /var/run/redis | dbfilenameのファイルや、redisが使う一時ファイルなどを保存する領域 | ファイル名でなくディレクトリ名 |
| logfile | /var/log/redis/26379.log | ログファイル名 |   |
| sentinel monitor | mymaster 192.168.56.111 6379 2 | [mastername] [IPアドレス] [ポート番号] [sentinel定足数]<br>を表す。masternameは適当でOK(他の設定でも統一すること)<br>IPアドレスはフェールオーバーする度に書き換えられる<br>sentinel定足数は何台がマスターのダウンを検知したらフェールオーバーするかを設定している<br>(左だと2台検知したらフェールオーバーを行う) |
| sentinel down-after-milliseconds | mymaster 5000 | [mastername] [時間(ms)]<br>Master/Slaveのダウン検知後、状態がSDOWN(subjectively down)に移行するまでの時間 | 短すぎるとうまく検知できない<br>可能性がある |
| sentinel failover-timeout | mymaster 900000 | フェールオーバー処理のタイムアウト(ms) |  |
| sentinel parallel-syncs | mymaster 1 | SlaveをMasterに昇格させた後、いくつのSlaveと同期させるか |

| sentinel側で自動設定してくれる項目 |
|:--|:--|:--|--:|
| sentinel myid |
| sentinel leader-epoch |   |   |   |
| sentinel known-slave |   |   |   |
| sentinel known-sentinel |   |   |   |
| sentinel current-epoch |   |   |   |
| sentinel config-epoch |   |   |   |
Luaでも a==1 and a==2 and a==3 をtrueにしてみたい

なんか流行ってますね……。

  * 元ネタ： [Can (a ==1 && a== 2 && a==3) ever evaluate to true?](https://stackoverflow.com/questions/48270127/can-a-1-a-2-a-3-ever-evaluate-to-true)
  * まとめ： [(a==1&&a==2&&a==3)を常にtrueにするStackOverflowの問題を解いたQiita記事まとめ](https://qiita.com/aimof/items/bb786c112f7dcc3be6c9)

ん？

  * [Luaでは \`a == 1 && a == 2 && a ==3\` を trueにできない](https://qiita.com/Nymphium/items/54bdf5f67f032726dfe1)

いや……

**できますよ！**

## コード

```lua
aa = 0
setmetatable(_G, {
  __index = function(t, n)
    if n == 'a' then
      aa = (aa == 3) and 1 or (aa + 1)
      return aa
    end
  end
})

if a == 1 and a == 2 and a == 3 then
  print "True!"
end
```

※Lua5.1／5.2／5.3で動作確認。

## 解説

要するに、次のJavaScriptのコード[^so]と同じ原理。

[^so]: 元ネタのStack Overflowの回答の一つにあるコードを改変したもの。

```javascript
let aa = 0;
// 'global'はグローバルオブジェクト
Object.defineProperty(global, 'a', {
  get: function() {
    aa = (aa == 3) ? 1 : (aa + 1);
    return aa;
  }
});

if (a == 1 && a == 2 && a == 3) {
  console.log("True!");
}
```

Luaは次のような「JavaScriptと似た性質」を持っています。

  * Luaでは、グローバル変数とは「グローバルテーブルのキー」のことである。
  * テーブルのインデクス操作（キーに対する値を返す）はカスタマイズ可能。

これを利用して、「読み出す度に値が異なるグローバル変数`a`」を実現しました。

おしまい。
TyranoScriptのパッケージングツールを自作する

# はじめに
なぜティラノ公式ツール[TyranoRider](https://tyrano.jp/dl/rider)があるのに自作する必要があったのか。
**TyranoRiderによるパッケージングを行うと、ゲームのウィンドウサイズ変更が行えないから**です。

## ウィンドウサイズを変更できない理由
TyranoRiderのパッケージングでは、プロジェクトフォルダ内のpackage.jsonを読み込んでいるのではなく、Rider独自でpackage.jsonを生成してパッケージに組み込んでいるっぽいです。生成されるpackage.jsonの内容は次のとおりです。

```json:package.json
{
  "name": "tyranoscript",
  "main": "app://./index.html",
  "window": {
    "title": "tyrano system loading",
    "icon": "link.png",
    "toolbar": false,
    "frame": true,
    "width": 1920,
    "height": 1080,
    "position": "mouse",
    "min_width": 1920,
    "min_height": 1080
  },
  "webkit": {
    "plugin": true
  }
}
```

ウィンドウサイズが変更できないのは、**min_width**および**min_height**プロパティがwidth、heightと同値に設定されているためだと判明しました。
また1920*1080という値はConfig.tjsの**scWidth**および**scHeight**に依存しているようです。つまりTyranoRiderでパッケージ化したゲームは、Config.tjsで指定したウィンドウサイズに固定されるということでしょう。

※2018/01/28追記
Rider出力にて「プレイヤーにウィンドウのリサイズを許可」オプションをつけると、```min_width: 10, min_height: 10```、```resizable: true```となり、ウィンドウ端ドラッグによるリサイズは可能となります。

## その他の気になったこと
* 自動でpackage.jsonが生成されているので、ウィンドウサイズに限らず設定項目を自由に変えることが出来ない
* パッケージ化する時にプロジェクトフォルダを全て取り込んでいるようなので、ゲームには不要なフォルダ（例えばGitを使っている場合.gitフォルダが入っているかも）までパッケージ化してしまう

ということで、パッケージングツールを自作しました。

# 作り方

## パッケージングについて
TyranoScriptはNW.jsで動作しているということで、[nwjs(node-webkit)で作ったアプリを実行ファイルで配布するには(Windows/Mac)](http://lealog.hateblo.jp/entry/2015/03/02/234536)などを参考にしました。

以下、パッケージングの流れです。

1. TyranoScriptプロジェクトフォルダ内の、「data」「tyrano」フォルダおよび「index.html」「package.json」を選択し、zip化
2. 作成したzipファイルの名称を「app.nw」に変更
3. [TyranoRider](https://tyrano.jp/dl/rider)をダウンロードし、その中のbinwinフォルダを丸ごとコピーしてくる（どこか適当な場所に貼り付けて下さい）
4. コピーしてきたbinwinフォルダの中に、先程の「app.nw」を移動
5. binwinフォルダ上でコマンドプロンプトを開き、以下を実行（コマンドプロンプトの開き方がわからない場合は検索してみて下さい）

```
copy /b nw.exe+app.nw app.exe 
```

こうして生成された「app.exe」がゲームの実行ファイルとなります。
「app.nw」と「nw.exe」は削除して大丈夫です。

## C#のフォームアプリケーションで自動化

詳しいことは省きます。作りました。

![TyranoScriptPackagerスクリーンショット](https://raw.githubusercontent.com/tigrig29/TyranoScriptPackager/readme-images/screenshot.png)

とりあえず、ウィンドウサイズ変更可能なゲームを出力できるようになりました。
もう少し設定項目を増やしても良いかなぁという感じです。気が向けば随時追加していきたいですね。

# 作ったアプリケーションについて
せっかくなので公開しました。
[TyranoScriptPackager](https://github.com/tigrig29/TyranoScriptPackager)

要望やバグ報告などあればお伝え下さい。
改変などはご自由にしてくださって構いません。

ただ、特に理由がない場合はTyranoRiderの使用をおすすめします。やっぱり公式が一番！

# 参考
[TyranoRider](https://tyrano.jp/dl/rider)
[node-webkitのパッケージングで注意することメモ](https://qiita.com/Pekotaro/items/7f3c510013e8139f671b)
[nwjs(node-webkit)で作ったアプリを実行ファイルで配布するには(Windows/Mac)](http://lealog.hateblo.jp/entry/2015/03/02/234536)
[How to package and distribute your apps](https://github.com/nwjs/nw.js/wiki/how-to-package-and-distribute-your-apps)
Numpyで行列の平均，和，標準偏差などを求める。+ 行列の要素の操作

Numpyの行列形式でデータをもらって誤差等の解析をすることを考える。

# 関連する関数
それぞれ，和，平均，標準偏差を計算可能。
`sum()，average()，std()`

このままだと全要素に対して適用してしまうので，
引数に`axis=0`と指定することで行方向，`axis=1`とすれば列方向ごとに使われる。

以下のコードを順番に実行すればわかる。

```python3
import numpy as np
R = np.random.rand(5,2)
np.average(R) #0.45752755837863368
np.average(R,axis=1) #array([ 0.48461893,  0.649105  ,  0.47275633,  0.60002684,  0.08113069])
np.average(R,axis=0) #array([ 0.53748554,  0.37756958])
```

### 地味な注意点
不偏分散を求めたい時はstd関数にddof=1という引数を追加すること。
今回みたいな例ではデータの観測誤差について議論するので不偏分散は用いないが参考までに。
http://imaimamu.com/archives/1571

# 要素の置換など
要素の置換はmatlabとほぼ同じ。
https://qiita.com/supersaiakujin/items/d63c73bb7b5aac43898a

条件はTrue，Falseで帰ってくるのでこれを0,1に変換するにはastypeでintを指定する。
が，どうやらTrue,Falseもちゃんと0,1の値として掛け算が出来そう。

特定の行を0にする場合はこちら。

```python3
r=np.random.rand(5,1)
R*[r>0.5] #rが0.5より小さい行は全て0になる
```

特定の条件の行を抜き出すのは一手間かかるがこっち。

```python3
r=np.random.rand(5,1)
i,j= np.where(r>0.5) #rが0.5より大きい行がiに入りjには0が入る。
R[i,:] # r>0.5を満たす行だけ抜き出せる。
```
PythonでER図をリバースエンジニアリングで作成してみる

ER図の作成は今まではEclipseのプラグインやA5に頼っていたのですが、ERAlchemyというpipライブラリを使うとコマンドラインで完結できるようです。
https://pypi.python.org/pypi/ERAlchemy

結論から言うと生成されるER図は完璧なものではなさそうなので、何となく雰囲気を見たいというようなレベルの時に利用するのがいいかなと思います。

# 環境

- Ubuntu: 16.04
- Python: 3.6.2
- pip: 9.0.1
- PostgreSQL: 9.6.5

# インストール

※ psycopg2等は開発段階で使っているため前提になってしまっています

まずは必要と書かれているGraphViz周りをインストールします。

```bash
$ sudo apt-get install graphviz libgraphviz-dev
```

Ubuntuではeralchemy実行時にエラーになってしまったので、適切にパスを通しておく必要があるみたいです。
（ https://github.com/pygraphviz/pygraphviz/issues/71#issuecomment-138999823 を参考）

```bash
$ pip install pygraphviz --install-option="--include-path=/usr/include/graphviz" --install-option="--library-path=/usr/lib/graphviz/"
```

ちなみに発生したエラーは以下のような感じです。
発生してしまってからは一旦uninstallして上記のinstallコマンドを流しました。

```
ImportError: .../site-packages/pygraphviz/_graphviz.cpython-36m-x86_64-linux-gnu.so: undefined symbol: Agundirected
```

そしてERAlchemyをインストールします。

```bash
$ pip install eralchemy
```

現時点では1.1.0がインストールされました。

# ER図の作成

以下のコマンドでER図がPDFで出力されます。

```bash
$ eralchemy -i 'postgresql+psycopg2://username:password@hostname:5432/databasename' -o out.pdf
```

拡張子のところをpngに変えれば画像で出力されますし、erにするとMarkdown形式のテキストで出力されます。

出力されたER図を見ると「0..N」の場所とか合ってるんだろうかという感じがしますが、ER図にそこまで詳しいわけではないので実は正しいのかよくわかりません。
とりあえずオプションも気にせず動かしてみたという状態なので、今後必要に応じてオプションとか調査していきたいなと思います。

できたものを他のER図のツールにインポートしていじくりまわせると便利なんですけどねぇ。
プロキシ環境下でRHELのサブスクリプション登録方法

# はじめに
RHELではサブスクリプション登録というのをやらないとインターネットからyum installできない。
いつもCentOSとか無償版しか使ってないとここらへん分からなかったりするので、メモで残しておく。
ちなみに、二ヶ月間無料お試しとかある。

# アカウント作成
RedHatのアカウントを作成します。
まずはこれをしないと何も始まらない。

# RHEL（OS）のインストール
サーバにRHELをインストールします。

# プロキシ環境下の場合
プロキシの設定をする。

```
vi /etc/rhsm/rhsm.conf
# an http proxy server to use
proxy_hostname = <proxy_ip>

# port for http proxy server
proxy_port = <proxy_port>
```

# サブスクリプション登録

```
# subscription-manager register
登録中: subscription.rhn.redhat.com:443/subscription
ユーザー名: XXXX
パスワード: XXXX
このシステムは次の ID で登録されました: XXXX
# subscription-manager list --available
```

# 「最初に Red Hat の諸条件に同意する必要があります。」と表示されてサブスクリプション登録に失敗する場合
http://www.redhat.com/wapps/tnc/termsack?event[]=subscriptionActivation
で規約に同意する。
keyestudio Multi-purpose Shield V1



[keyestudio Multi\-purpose Shield V1](http://www.keyestudio.com/shop/keyestudio-multi-purpose-shield-v1.html#)


![Kobito.5ps5vm.png](https://qiita-image-store.s3.amazonaws.com/0/49910/54da2930-ea21-0cc2-f20a-bc8af584651d.png "Kobito.5ps5vm.png")![Kobito.ufe4GY.png](https://qiita-image-store.s3.amazonaws.com/0/49910/248ed225-f4c3-7cda-c4e4-bc7b52d6024b.png "Kobito.ufe4GY.png")


## Features

1. Compatible with main controller on the market,such as UNO R3 and MEGA2560 
2. Using two-channel LED indicator to show the working condition of program for modulating program conveniently 
3. Completing external interrupt experiment by two-channel keyswitch
4. One reset button
5. Measuring temperature and humidity with DHT11 temperature and humidity sensor module
6. Using revolving potentiometer to do analog input
7. Alarming and making sound by passive buzzer module
8. Full-color LED
9. Utilizing photovaristor to detect the brightness of light
10. Do temperature measuring experiment with LM35D temperature sensor
11. Detecting infrared receiving by infrared receiver
12. 2-channel digital port（D7、D8）
13. 1-channel analog port（A3）
14. One IIC interface
15. One TTL serial port



## suport page

[Ks0183 keyestudio Multi\-purpose Shield V1 \- Keyestudio Wiki](http://wiki.keyestudio.com/index.php/Ks0183_keyestudio_Multi-purpose_Shield_V1)


## ライブラリ

は消滅しているのでダウンロードしてはいけない。ウィルスが入っている。
GoogleHome拡張 GHKitでヤフオク出品商品が落札されたら「おめでとうございます」と音声で通知してくれるようにしてみました

GHKitが届いたので何か便利なことができないかと思い試してみた一発目

ヤフーオークションで欲しい商品が落札できた場合であれば「myThings」アプリ標準の機能で通知設定可能なのですが**出品している商品が落札されたときの通知トリガーが現状ありません。**

携帯を持っていない場合でも音声で通知をしてもらえれば落札者の人に早めに連絡が行えるので便利かなということで実装を行ってみました。

# 使用した環境

・GoogleHome
・GHKit(初期セットアップにAndroid5系のデバイスが必要)
・Gmail

2018/1/25時点では初期セットアップ用のiOSアプリがリリースされていない状態です
私自身Android5系の端末を所有していなかったのでRemix OS for PCを使用して初期セットアップを完了させました。


# 1. GHkitの初期化を済ませます。

[ [GHkit公式ページの内容に沿って初期化](http://ghkit.jp/) ]
Android端末に初期セットアップ用のアプリをインストールしメールで送られてきている「GHKit ID」を入力してGoogleHomeと連携行います。

初期セットアップ用のアプリから任意をメッセージを送信することができるので**指定したメッセージをGoogleHomeが喋ったら初期セットアップは完了です。**

※無線Lan(Wi-fi)の設定も行っておいたほうが配線はスッキリします。

# 2. GHKitとmyThingsの連携を行います。
[ [GHKitとmyThingsの連携手順](https://qiita.com/tetotetote/items/94d0bac371c05d5d7fe6) ]
Qiitaに手順を投稿しているようですのでこちらの手順にそって設定を行います。

# 3. myThingsの設定を行う

ヤフオクで出品商品が落札されると「ヤフオク! - 即決価格での落札・・・・」といった件名のメールが届きます。
このメールを**Gmailで受け取るようにし「myThings」の設定でGmailの件名に「落札」という文字があった場合に通知**を設定するようにしてみました。

![qiita.jpg](https://qiita-image-store.s3.amazonaws.com/0/223901/c96a7d49-2ff9-270d-15ca-cce9090a657b.jpeg)


# まとめ

携帯を持っている場合はPush通知でわかるのですが持っていない時に音声で通知をしてくれるというのは意外と便利だなということがわかりました。

GoogleHomeが通知をしてくれる条件に**メールの件名を使用できる**という感じなのですが、他にもいろいろな通知設定ができそうなのでこれから試していきたいと思っています。

GHKitについてはGHKit側のサーバーを使用して振り分けをしている関係もあり今後ずっとサービスを利用することはできないかもしれません。それでも自前で環境を構築しなければこの手の連携機能が使えない状態だったので**GHKitを使えばシステム系以外のひとでも手軽にアイデア次第で生活を便利にすることができる**かもしれません
digdagの変数はoverrideできる

digdagで変数を`_export`で定義した時、局所的に変数を上書きしたい場合があると思います。
上書きするときの変数のスコープについて軽く調べたので共有します。

# 変数を上書きするdigdagの例

```yaml:variable_override_test.dig
timezone: Asia/Tokyo

_export:
  var1: hoge

+setup:
  echo>: start ${session_time}

+test1:
  echo>: var is ${var1}

+test2:
  _export:
    var1: fuga
  echo>: overrided var is ${var1}

+test3:
  echo>: var is ${var1}

+test4:
  _export:
    var1: fuga
  +sub4:
    echo>: overrided var(in subtask) is ${var1}

+teardown:
  echo>: finish ${session_time}
```

# 実行結果は以下の通り

```
$ digdag run variable_override_test.dig
2018-01-25 19:26:51 +0900: Digdag v0.9.20
2018-01-25 19:26:52 +0900 [WARN] (main): Using a new session time 2018-01-25T00:00:00+09:00.
2018-01-25 19:26:52 +0900 [INFO] (main): Using session /Users/200291/playground/digdag_test/variable_override_test/.digdag/status/20180125T000000+0900.
2018-01-25 19:26:52 +0900 [INFO] (main): Starting a new session project id=1 workflow name=variable_override_test session_time=2018-01-25T00:00:00+09:00
2018-01-25 19:26:53 +0900 [INFO] (0018@[0:default]+variable_override_test+setup): echo>: start 2018-01-25T00:00:00+09:00
start 2018-01-25T00:00:00+09:00
2018-01-25 19:26:53 +0900 [INFO] (0018@[0:default]+variable_override_test+test1): echo>: var is hoge
var is hoge
2018-01-25 19:26:54 +0900 [INFO] (0018@[0:default]+variable_override_test+test2): echo>: overrided var is fuga
overrided var is fuga
2018-01-25 19:26:54 +0900 [INFO] (0018@[0:default]+variable_override_test+test3): echo>: var is hoge
var is hoge
2018-01-25 19:26:54 +0900 [INFO] (0018@[0:default]+variable_override_test+test4+sub4): echo>: overrided var(in subtask) is fuga
overrided var(in subtask) is fuga
2018-01-25 19:26:54 +0900 [INFO] (0018@[0:default]+variable_override_test+teardown): echo>: finish 2018-01-25T00:00:00+09:00
finish 2018-01-25T00:00:00+09:00
Success. Task state is saved at /Users/200291/playground/digdag_test/variable_override_test/.digdag/status/20180125T000000+0900 directory.
  * Use --session <daily | hourly | "yyyy-MM-dd[ HH:mm:ss]"> to not reuse the last session time.
  * Use --rerun, --start +NAME, or --goal +NAME argument to rerun skipped tasks.
```

# まとめ

上記実行結果を表にまとめました

| test名 | テストしたいこと | 結果 |
|:------:|:-------------|:----|
| test1  | グローバルに定義した`var1`の確認                    | `hoge` (そのまま) |
| test2  | タスク内で定義しなおした`var1`の確認                 | `fuga` (overrideされている) |
| test3  | `var1`をoverrideしたタスクの後の別タスクでの確認      | ***`hoge` (そのまま)*** |
| test4  | タスクで`var1`を定義し直した時、そのサブタスク内での確認 | ***`fuga` (overrideされている)*** |

- `digdag` では変数をoverrideできる
- また、スコープは当該タスクとそのサブタスク内

細かいことですがスコープを理解していることでワークフローをより簡潔にかくことができそうです。
Rustでtupleの中身をイテレートしたい

C++のboost::fusionみたいに、タプルの中身をイテレートしたいと思ったのでいろいろ試してみたところ、下記の方法で、ちょっと特別な形のタプルを使えば出来ました。

他にアイデアあったら教えてください！

```Rust

// タプルの各要素に対して実装するトレイト　これが順番に呼ばれる
trait Hoge {
    fn hoge(&self);
}
impl<T> Hoge for T where T:std::fmt::Display {
    fn hoge(&self) {
        println!("{}", *self);
    }
}

// タプルの中身に対して順番にhoge()を呼ぶためのトレイト
trait Next {
    fn next(&self);
}
impl Next for (()) {
    fn next(&self) {
    }
}
impl<T,U> Next for (T,U) where T:Hoge, U:Next {
    fn next(&self) {
        self.0.hoge();
        self.1.next();
    }
}

fn main() {
    //タプルは、こんな形にしないとダメ（マクロで作れるようにすると良いかも）
    let v = (1, (2.3, ("abc".to_string(), ())));
    v.next();
}
```

https://repl.it/@mas_yo/recursive-tuple
Parse error: syntax error, unexpected '?'はPHPのバージョンを直して解決

# 環境

- Laravel5.5
- Ubuntu 16.04

Ubuntuの場合、PHPのバージョンによって、エラーが起こるらしい。

# PHPのバージョンが低いのが問題

PHPをローカル環境で開発していた(動いていた当時)のものに変更する。
僕の場合はPHP7.1に変更必要があった。

## PHP version確認

```
php -v
```
あれ、7.1だ...

## 表示されるものと、Laravelの駆動に使われるPHPのバージョンが違う

welcome.blade.phpなどに、phpinfo()を表示してみよう。

welcome.blade.phpの<body>の真下辺りにphpinfo()を出力させる

```welcome.blade.php
...
<body>
 <?php phpinfo(); ?>
...
</html>
```

これで、表示を見る。

## 実際のPHPのバージョンを確認

僕の場合は、7.0でした。惜しい！
php.iniの場所などがかいてあるので、そのディレクトリから判断しましょう。

# 不要なバージョンは消そう。

```
sudo a2dismod php7.0
sudo a2enmod php7.1
sudo service apache2 restart
```

お使いの環境に合わせてどうぞ。
js。配列かプレインテキストで来たstringの文字数の合計を算出する

# 文字数を計算しよう

```count.js

function countTexts(data){
 var sum = 0;
 if(Array.isArray(data)){
   data.forEach(function(value){
     sum += value.length;
   });
 }else{
   sum += data.length;
 }
 return sum;
}



var text = 'text';
console.log(countTexts(text)); // 4

var textArray = ['text','text2'];
console.log(countTexts(textArray)); // 9

```

Array.isArray()で条件分岐しただけ。
言語処理100本ノック04

#はじめに
ここ最近質量スペクトル(mass spectrum)のフィッティングをpythonで書き続けていて、言語処理100本ノックをできていなかったので久しぶりの投稿です。出来は、ひどいですが、まあ動くので...

誰かが、コードの質は気にするな！早くかければいいんだ！みたいなことを言っていたような気がするので...

参考になるコメントいただけると助かります:relaxed:

内包表記やmapなどまだまだ自分のものになっていません...

#04. 元素記号
>"Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."という文を単語に分解し，1, 5, 6, 7, 8, 9, 15, 16, 19番目の単語は先頭の1文字，それ以外の単語は先頭に2文字を取り出し，取り出した文字列から単語の位置（先頭から何番目の単語か）への連想配列（辞書型もしくはマップ型）を作成せよ．

出力結果

```
0 H
1 He
2 Li
3 Be
4 B
5 C
6 N
7 O
8 F
9 Ne
10 Na
11 Mi
12 Al
13 Si
14 P
15 S
16 Cl
17 Ar
18 K
19 Ca
```

```python3:04knock.py
st0="Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."

words=st0.split()

i=0


for (i,x) in enumerate(words):
 if i==0 or i==4 or i==5 or i==6 or i==7 or i==8 or i==14 or i==15 or i==18:
  print(i,x[0:1])
 else:
  print(i,x[0:2])
```

これで、うまくいきました。問題文の意味が分からなくて少し戸惑いましたが、@segavvyさんのサイトを参考にしたらenumerateというものを知りました。
https://qiita.com/segavvy/items/4e592dea2f828e5385ff

enumerateの意味は「数え上げる」、「列挙する」という意味。インデックスとともにリストを簡単に作れちゃいます。

もっと早く知りたかった...

---
コメントで指摘していただき、連想配列というものを理解していなかったこと、上のコードは配列すら作っていなかったことに気づいて書き直しました。
出力結果

```
{1: 'H', 2: 'He', 3: 'Li', 4: 'Be', 5: 'B', 6: 'C', 7: 'N', 8: 'O', 9: 'F', 10: 'Ne', 11: 'Na', 12: 'Mi', 13: 'Al', 14: 'Si', 15: 'P', 16: 'S', 17: 'Cl', 18: 'Ar', 19: 'K', 20: 'Ca'}
```

```python3:04knock.py
st0="Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."

words=st0.split()

i=0
dic={}


for (i,x) in enumerate(words):
 if i==0 or i==4 or i==5 or i==6 or i==7 or i==8 or i==14 or i==15 or i==18:
  dic[i+1]=x[0:1]
 else:
  dic[i+1]=x[0:2]

print(dic)
```

これが正しいのかはわかってないのですが、リストと違ってインデックス指定で代入する形で書いています。

リストと連想配列の違いはおそらく、連想配列がvalueを要素として持ち、連想配列はkeyとvalueの両方を要素に持つということだと思います

再度訂正
この投稿にリンクさせていただいてる方からコメントで指摘していただき、問題の意図とずれていたため再度訂正です。

出力結果

```
{'H': 1, 'He': 2, 'Li': 3, 'Be': 4, 'B': 5, 'C': 6, 'N': 7, 'O': 8, 'F': 9, 'Ne': 10, 'Na': 11, 'Mi': 12, 'Al': 13, 'Si': 14, 'P': 15, 'S': 16, 'Cl': 17, 'Ar': 18, 'K': 19, 'Ca': 20}
```

```python3:04knock.py
st0="Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."

words=st0.split()

i=0
dic={}


for (i,x) in enumerate(words):
 if i==0 or i==4 or i==5 or i==6 or i==7 or i==8 or i==14 or i==15 or i==18:
  dic[x[0:1]]=i+1
 else:
  dic[x[0:2]]=i+1
  
print(dic)
```

変更箇所はif文の連想配列の指定する方に文字を、代入する方に数字を入れ替えました。　これは、かなり新鮮です。初めてこんなことをしました。
連想配列、使い道はまだ考え付きませんが今後、使えるときに使っていきたいです。

今回の投稿は出来が良くなかったです、次からは自分のコードをよく見てから投稿していきたいです。
【Xcode】意外に簡単なストーリーボードの分割でGitのコンフリクトとさようなら

## ストーリーボードのいいところとこまったところ

iOSアプリ開発では、ストーリーボードをつかって画面をレイアウトします。
ストーリーボードは名前のとおり、アプリのストーリー（画面遷移）も管理できてとても便利です。

しかし、いくつか不便な点もあります。
そのひとつが、コンフリクト（競合）です。

ストーリーボードの実態はひとつのおおきなXMLファイルなので、複数人で編集するとあっというまにコンフリクトをおこします。
また、Gitで複数のブランチを作成し、それぞれのブランチでストーリーボードを編集してからマージすると、またまたコンフリクトです。

しかも、このコンフリクトはとてもなおしにくいです。
もし発生したら、片方のブランチの編集内容を放棄して、もういちどストーリーボードを編集するくらいのガッツが必要です。

## ストーリーボードを分割しよう

そんな悩みを解決してくれるのが、ストーリーボードの分割です。

Xcodeでは、ストーリーボードを複数作成できるので、コンフリクトをおこさないような単位でストーリーボードを分けてしまいます。そうすれば、コンフリクトの悩みから解放されます。

今回の例では、`Main` と `Sub` のふたつのストーリーボードを作成しています。

<img width="1512" alt="storyboard01.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/2494e0eb-1f8d-cd69-424e-679d0f6a835f.png">


それでは、 `Main` から `Sub` の画面（ViewController）を呼び出してみましょう。

まず、呼び出されるストーリーボード（ `Sub` ）の設定をします。

<img width="1512" alt="storyboard02.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/e8234d03-6340-f287-f888-164f242373fd.png">


最初に表示するViewControllerを `is Initial View Controller` に設定します（画面右ユーティリティーエリアの `is Initial View Controller` にチェックを入れると、ViewControllerの横に矢印がつきます）。
つぎに、先ほど `Initial` に設定したViewController（ `SubViewController` ）に、自分自身のインスタンス化処理を書きます。

```swift
    static func instantiateSubViewController() -> UIViewController? {
        let storyboard = UIStoryboard(name: "Sub", bundle: nil)
        let initialViewController = storyboard.instantiateInitialViewController()
        
        return initialViewController
    }
```

`name: "Sub"` には、ストーリーボードの名前を書きます。
（この処理を呼び出される側に書いたのは、ストーリーボード名を隠蔽するためです）

あとは、呼び出す側（今回の例では `Main` ストーリーボードの画面）で、次のプログラムを実行すると、 `Sub` ストーリーボードの  `Initial` に設定したViewController（ `SubViewController` ）が表示されます。

```swift
        if let subViewController = SubViewController.instantiateSubViewController() {
            present(subViewController, animated: true, completion: nil)
        }
```

画面遷移するときにデータを渡したい場合は、 `present` の前でプロパティをセットするなり、値をセットするメソッドを呼び出すなりします（`prepare` メソッドが必要ないので、こちらの方が見通しはいいですね。）。

戻るときは通常の画面遷移とおなじで、 `dismiss` をつかいます。

```swift
dismiss(animated: true, completion: nil)
```

コンフリクトにお悩みのあなたは、意外に簡単便利なストーリーボードの分割をおためしください。

## 参考

iOS9以降ではノンコーディングでストーリーボードを分割できます。詳しくは、[[iOS 9] ノンコーディングで Storyboard を分割できる Storyboard Reference](https://dev.classmethod.jp/smartphone/iphone/storyboardreference/ "[iOS 9] ノンコーディングで Storyboard を分割できる Storyboard Reference") をご覧ください。
dockerを使ってフロントエンドをwebpackビルド

1. [dockerのインストール](https://docs.docker.com/engine/installation/)
2. docker コンテナ内で `npm run build:prod`

```
$ docker run -v `pwd`:/src --rm -w=/src node:8.9.4 npm install --silent && npm run build:prod
```

これで環境に依存せずに`webpack build`が出来るようになる。

おしまい
PHPの変数のフリーダムさ

PHPの変数名の規則があまりにフリーダムなのが話題になったので、思わずやってみた。
ちなみに正規表現的には`'[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'`らしい。ずいぶん広い。

```php
class 👨 {
	public function voice() {
		echo "お父さん";
	}
}

class 👩 {
	public function voice() {
		echo "お母さん";
	}
}


$👨 = new 👨();
$👩 = new 👩();

$👨->voice(); //お父さん
$👩->voice(); //お母さん
```
オンプレのmysqlのswapがでるんすけどって言われた調査メモ

オンプレのmysqlのswapがでるんすけど
と対策を聞かれたので検索したのと記憶してたことを検索しなおして返事した備忘録です。

#### vm.swappiness=1とinnodb_flush_method=O_DIRECT
http://t-suzuki.hatenablog.jp/entry/2017/07/27/131810
これみるとsysctlでvm.swappinessを1にとinnodb_flush_method=O_DIRECTにしろと書いてますね。
（O_DIRECTは全部InnoDBかつRaidコントローラのWriteBackキャッシュ必須なやつ）
RHEL6.4(kernel 2.6.32-303)以降、vm.swappiness=0 にすると OOM Killer が発動しやすくなるので、1 がいいとのこと。
http://d.hatena.ne.jp/yohei-a/20151115/1447594914

#### NUMAによるswapインサニティー対策
これも（NumaとOOM_killer対策もやろうぜ的な）
https://yakst.com/ja/posts/3983

思い出した。スワップインサニティーでした（Numaのせい）
http://d.hatena.ne.jp/fat47/20121121/1353495937
https://enterprisezine.jp/dbonline/detail/3829?p=3

numaのパラメータは5.7.9からぽいです（5.6だそうなのでないみたい）
https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_numa_interleave

innodb_numa_interleave=1

numaによるswap対策のpatchはここらへんに転がってる模様です（ビルドと不穏なことがかいてた）
https://bugs.mysql.com/bug.php?id=72811
日本語訳されてる愚痴記事（最後マージされてうれしそうでよかった）
https://yakst.com/ja/posts/2650

ここにnuma対策のパッチ紹介してるキータ記事が。
（こっちのはmysqld_safeへのパッチなのでまあそんなにビビらなくても大丈夫そう（再起動は要りますが））
https://qiita.com/tktk2354/items/917b66ddd128f36b80e4

#### 5.7のinnodb_bufferpoolのバグ対策

innodb_buffer_pool_size パラメータの値を innodb_buffer_pool_instances および innodb_buffer_pool_chunk_size パラメータの積の 8 倍に設定

https://bugs.mysql.com/bug.php?id=79379
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/MySQL.KnownIssuesAndLimitations.html

以上
String#squish で長い SQL 文字列を 1 行にする

# 問題

次のように where メソッドの引数に SQL 文字列を渡しているコードがあるとします。

```rb
[1] pry(main)> Character.where('EXISTS (SELECT 1 FROM anime_characters WHERE anime_characters.anime_id = characters.id)').to_a
  Character Load (70.1ms)  SELECT "characters".* FROM "characters" WHERE (EXISTS (SELECT 1 FROM anime_characters WHERE anime_characters.anime_id = characters.id))
```

SQL 文字列が長い (せいで Rubocop :cop_tone2: に怒られかねない) のでヒアドキュメントを使って見やすくします。

```rb
[2] pry(main)> Character.where(<<~SQL)
[2] pry(main)*   EXISTS (
[2] pry(main)*     SELECT
[2] pry(main)*       1
[2] pry(main)*     FROM
[2] pry(main)*       anime_characters
[2] pry(main)*     WHERE
[2] pry(main)*       anime_characters.character_id = characters.id
[2] pry(main)*   )
[2] pry(main)* SQL
  Character Load (1.7ms)  SELECT "characters".* FROM "characters" WHERE (EXISTS (
  SELECT
    1
  FROM
    anime_characters
  WHERE
    anime_characters.character_id = characters.id
)
)
```

コード上は美しくなりましたが、残念なことにログ上でもこの SQL 文字列の部分だけ美しく改行されていて違和感があります…。


# 解決策

Active Support コア拡張機能の [String#squish](https://railsguides.jp/active_support_core_extensions.html#squish) を使って複数行の SQL 文字列を 1 行にすることで、コード上の見た目を維持しつつ、ログ上では 1 行で表示されるようになりました :+1:

```rb
[3] pry(main)> Character.where(<<~SQL.squish)
[3] pry(main)*   EXISTS (
[3] pry(main)*     SELECT
[3] pry(main)*       1
[3] pry(main)*     FROM
[3] pry(main)*       anime_characters
[3] pry(main)*     WHERE
[3] pry(main)*       anime_characters.character_id = characters.id
[3] pry(main)*   )
[3] pry(main)* SQL
  Character Load (1.0ms)  SELECT "characters".* FROM "characters" WHERE (EXISTS ( SELECT 1 FROM anime_characters WHERE anime_characters.character_id = characters.id ))
```
SSHでUnable to negotiate with ...とでて、接続できないときの対処法

## エラーの状態

以下のようなエラーが発生したときの対処法です

```txt
$ ssh hogehoge
Unable to negotiate with X.X.X.X port 22: no matching cipher found. Their offer: crypticore128@ssh.com,aes128-cbc,aes192-cbc,aes256-cbc,seed-cbc@ssh.com,3des-cbc
```

## 対処法

`~/.ssh/config`に以下を追記すれば、エラーは消えて接続できました。

```:~/.ssh/config
Host *
  SendEnv LANG LC_*
  Ciphers +aes256-cbc
```

## 原因

おそらくHigh Sierraにアップデートしたことで起こるようになったようです。

## 参考

* [SSH issues with Mac OS X High Sierra](http://www.rubycoloredglasses.com/2017/12/high-sierra-ssh-issue/)
(未解決) pySerial 2.5 + Ubuntu 16.04.3 (Python 3.5.2) > 送信できない | ときどき送信できる

```txt:動作環境
Ubuntu 16.04.3 LTS desktop amd64
pySerial 2.5
Python 3.5.2
```

### 関連

- [pySerial 2.7 + CentOS 6.8 (+Python 2.6.6) > 送信できなくなる | OS再起動での対処 | Link: pySerial v2.5での対処](https://qiita.com/7of9/items/ba6aca57536183224f1d)


### 対処

CentOS 6.8でpySerial 2.7使用時に送信ができなくなる。
pySerial 2.5だと問題がないような記事を上記のリンク先のリンク先にて見つけた。
CentOS 6.8でpySerial 2.5をインストールするよりは、Ubuntu 16.04でpip3にてインストールが早いため、そちらで試した。

送信Pythonスクリプトを実行したところ、.write()の処理は実行されるが、RS-232Cの相手側に文字は到達しない。

dmesgで以下のようなエラー表示が発生する。

```
[ 8736.121755] usb 2-2.1: Product: USB 2.0 To COM Device
[ 8736.121759] usb 2-2.1: Manufacturer: Prolific Technology Inc.
[ 8736.127484] pl2303 2-2.1:1.0: pl2303 converter detected
[ 8736.147552] usb 2-2.1: pl2303 converter now attached to ttyUSB0
[ 8741.014036] pl2303 2-2.1:1.0: pl2303_vendor_write - failed to write [0008]: -110
[ 8741.355430] pl2303 2-2.1:1.0: pl2303_vendor_write - failed to write [0009]: -110
[ 8742.015031] pl2303 ttyUSB0: pl2303_get_line_request - failed: -110
[ 8742.355664] pl2303 ttyUSB0: pl2303_set_line_request - failed: -110
[ 8743.016114] pl2303 2-2.1:1.0: pl2303_vendor_write - failed to write [0000]: -110
[ 8743.355428] pl2303 ttyUSB0: pl2303_set_control_lines - failed: -110
```

### ときどき送信できる

USBシリアルアダプタを抜き差ししていると送信できるようになった。

pySerialの問題なのか、動作が安定しない。

### リンク

上記のエラー関連では下記を見つけた。

http://e2e.ti.com/support/arm/sitara_arm/f/791/p/446957/1625366

> [  160.102015] pl2303 1-1.2:1.0: pl2303_vendor_write - failed to write [0008]: -110

具体的な解決策は読み切れていない。
AWS：NLB からの health check のアクセスが秒間数回来るんだが・・・仕様らしい

AWS で NLB + EC2 の構成で、 WEBサービスを構築しました。
NLB → EC2 の health check (HTTP) のアクセスが秒間数回来てしまいました。

ドキュメントによると health check の間隔を設定できます。
https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/network/target-group-health-checks.html
私はデフォルトの 30秒にしていました。

これはおかしいと思いサポートに問い合わせたところ・・・

「仕様」という回答でした。
NLB では分散型の health check を行なっているから、とのこと。

まあそうかと納得しないでもないのですが、ドキュメントに明記して貰えると助かりますね。