OmniAICreator/Qiita-1.07M huggingface dataset:
[解決済み]Ubuntu の Virtualboxでminikubeを動かそうとしたらエラーが出た件

# Ubuntu の Virtualbox でminikubeを動かそうとしたらエラーが出て直した件


## 1. 各種 Requierments
OS: Ubuntu 16.04 LTS
Virtualbox: 5.1.14(Ubuntuデフォルト) ---> 5.2.14

## 2. minikube 、 kubectl
各所に書いてあるので記載しません。

## 3. 症状

```file:
RTR3InitEx failed with rc=-1912 (rc=-1912)

The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing

'/sbin/vboxconfig'

may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.

where: supR3HardenedMainInitRuntime what: 4 VERR_VM_DRIVER_VERSION_MISMATCH (-1912) - The installed support driver doesn't match the version of the user.
```

ブートできません

## 4. 対応

16.04 - VirtualBox - RTR3InitEx failed with rc=-1912 (rc=-1912) - Ask Ubuntu  
https://askubuntu.com/questions/900794/virtualbox-rtr3initex-failed-with-rc-1912-rc-1912

### 4.1 動かしていた minikube を止めましょう

```
minikube delete
```

### 4.2 古いVirtualboxをガッツリ削除

```
sudo apt autoremove --purge virtualbox*
```

### 4.3 なくなったのを確認

```
dpkg -l virtualbox* | grep ^i
```

### 4.4 再インストール

https://www.virtualbox.org/wiki/Linux_Downloads
に沿って再度インストール

```
sudo apt-get update
sudo apt-get install virtualbox-5.2
```

### 4.5 Kernelモジュールを作り直し

```
sudo /sbin/vboxconfig
```

### 4.6 minikube を起動

```
minikube start --kubernetes-version v1.10
$ minikube start
Starting local Kubernetes v1.10.0 cluster...
Starting VM...
Getting VM IP address...
Moving files into cluster...
Downloading kubeadm v1.10.0
Downloading kubelet v1.10.0

Finished Downloading kubelet v1.10.0
Finished Downloading kubeadm v1.10.0
Setting up certs...
Connecting to cluster...
Setting up kubeconfig...
Starting cluster components...
Kubectl is now configured to use the cluster.
Loading cached images from config file.
$ kubectl get nodes
NAME       STATUS    ROLES     AGE       VERSION
minikube   Ready     master    2m        v1.10.0
```

## 5. お疲れ様でした。

Happy Kubernetes!
Wio LTEで遊んでみる（その３：ボタン＋ブザー）

[Grove IoT スターターキット for SORACOM](https://soracom.jp/press/2017102501/)で遊んでみるの続き。

- [初回：環境構築＋Lチカ](https://qiita.com/ryo_naka/items/45fcb686f264f537a493)
- [二回目：温湿度センサー](https://qiita.com/ryo_naka/items/57e34c3fadb3414fc6c6)

今度はボタンでの入力とそれ契機でブザーでも鳴らしてみようかと思う。

##〇センサー
[ボタン](http://wiki.seeedstudio.com/Grove-Button/)
[ブザー](http://wiki.seeedstudio.com/Grove-Buzzer/)


ボタン、ブザーの各スケッチ例を見てみると、どっちもWIOLTE_D38を使うように書いてる。
これを共存したい場合にどこに刺したらいいんだ？

####〇ブザー
とりあえずブザーをD20に刺して試してみる
`#define BUZZER_PIN      (WIOLTE_D20)`

DFUモードだとうるさいのだが、通常モードにすると鳴らない。
ログを入れてみるとloopはしている

とりあえずブザーをD38に刺してみる
DFUモードでも鳴らない。
うるさかったのはD20端子がHIGHになってるってことだったのかな。

D38を使った場合だと、ちゃんと想定通りに鳴る。
にしても、音量がうるさいな。


調べてみるとsetupで
`Wio.PowerSupplyGrove(true);`
を実行しないといけないらしい。

	#define BUZZER_PIN      (WIOLTE_D20)
	void setup()
	{
	  SerialUSB.println("setup Start");
	  Wio.Init();
	  Wio.PowerSupplyGrove(true);
	  
	  pinMode(BUZZER_PIN, OUTPUT);
	  delay(500);
	  SerialUSB.println("setup OK");
	}

※loopはスケッチのまま
これで実行してみたら想定通りの動きに。

####〇ボタン＋ブザー
ブザーが上手くいったのでボタンも試す。
足し方としては、ボタンのスケッチ例にブザー出力処理を追加。

	void change_state()
	{
	  State = !State;
	  StateChanged = true;
	}
	void setup()
	{
	  Wio.Init();
	  Wio.PowerSupplyGrove(true);
	
	  pinMode(BUTTON_PIN, INPUT);
	  attachInterrupt(BUTTON_PIN, change_state, RISING);
	
	  pinMode(BUZZER_PIN, OUTPUT);
	}

[attachInterrupt](http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=3069)
`外部割り込みが発生したときに実行する関数を指定します。すでに指定されていた関数は置き換えられます。呼び出せる関数は引数と戻り値が不要なものだけです。`

これでボタン操作による状態変化を割り込ませるって感じみたい。

これについては特に難しいことはなく、あっさりと実現。

	#include <WioLTEforArduino.h>
	
	// You can use WIOLTE_(D20|A4|A6) with `Wio.PowerSupplyGrove(true);`
	#define BUTTON_PIN  (WIOLTE_D38)
	#define BUZZER_PIN      (WIOLTE_D20)
	#define BUZZER_ON_TIME  (100)
	#define BUZZER_OFF_TIME (3000)
	
	
	#define COLOR_ON	127, 127, 127
	#define COLOR_OFF	  0,   0,   0
	
	WioLTE Wio;
	
	volatile bool StateChanged = false;
	volatile bool State = false;
	
	void change_state()
	{
	  State = !State;
	  StateChanged = true;
	}
	
	void setup()
	{
	  SerialUSB.println("setup Start");
	  Wio.Init();
	  Wio.PowerSupplyGrove(true);
	
	  pinMode(BUTTON_PIN, INPUT);
	  attachInterrupt(BUTTON_PIN, change_state, RISING);
	
	  pinMode(BUZZER_PIN, OUTPUT);
	
	  SerialUSB.println("setup OK");
	}
	
	void loop()
	{
	  if (StateChanged) {
	    SerialUSB.print(State ? '*' : '.');
	
	    if (State) {
	      Wio.LedSetRGB(COLOR_ON);
	      Buzzer_ON();
	    }
	    else {
	      Wio.LedSetRGB(COLOR_OFF);
	    }
	
		StateChanged = false;
	  }
	}
	void Buzzer_ON()
	{
	  SerialUSB.println("Buzzer_ON start");
	  digitalWrite(BUZZER_PIN, HIGH);
	  delay(BUZZER_ON_TIME);
	
	  digitalWrite(BUZZER_PIN, LOW);
	  SerialUSB.println("Buzzer_ON end");
	}

##所感
・通常時は特に問題ないのだが、DFUモードだとD20に刺したブザーがずっとうるさい。
・ブザーのボリュームを変更したい。今のところHIGH/LOWしかないのでON/OFFにしかならない？
・全体的にはやはり簡単。
【初心者向け】Homebrewのインストール方法

# 前提
## 環境
- macOS High Sierra
- バージョン 10.13.5
- ターミナルを立ち上げておくこと

## Mac本体にインストールされているpythonのバージョンを確認する
- 現状を確認するために下記コマンドを実行

```
$ python -V
Python 2.7.10
```
# 【本題】homebrewをインストールする
## インストール先URL
- [macOS 用パッケージマネージャー — macOS 用パッケージマネージャー](https://brew.sh/index_ja)

<img width="980" alt="homebrew.png" src="https://qiita-image-store.s3.amazonaws.com/0/143765/fd841edb-ef21-0fd7-6d7a-081923772389.png">

## 前準備
```
 h_******$ pwd
/Users/h_******
```
- pwdコマンドを実行し、実行する場所を確認する
- 自分がログインしているユーザー名の直下にいれば問題ない
- もし、ユーザー名の直下にいない場合は、cdコマンドを実行する
- その後、もう一度pwdコマンドを実行する

```
# 例えば、Desktopにいた場合
:Desktop h_******$ cd
:~ h_******$ pwd
/Users/h_******
```

## homebrewをインストールする
- 前述のサイトに記載されているスクリプトをコピーする

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
- コピーしたスクリプトをターミナルに貼り付けて、実行する

```
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
==> This script will install:
/usr/local/bin/brew
/usr/local/share/doc/homebrew
/usr/local/share/man/man1/brew.1
/usr/local/share/zsh/site-functions/_brew
/usr/local/etc/bash_completion.d/brew
/usr/local/Homebrew

Press RETURN to continue or any other key to abort
```
- そのまま、enterキーを押す

```
==> /usr/bin/sudo /bin/mkdir -p /Library/Caches/Homebrew
Password:
```
- パスワードの入力が求められるので、パスワードを入力する

```
==> /usr/bin/sudo /bin/chmod g+rwx /Library/Caches/Homebrew
==> /usr/bin/sudo /usr/sbin/chown h_****** /Library/Caches/Homebrew
==> Downloading and installing Homebrew...
HEAD is now at b7e849799 Merge pull request #4469 from reitermarkus/systemcommand-path
==> Cleaning up /Library/Caches/Homebrew...
==> Migrating /Library/Caches/Homebrew to /Users/h_fukano/Library/Caches/Homebrew...
==> Deleting /Library/Caches/Homebrew...
Already up-to-date.
==> Installation successful!

==> Homebrew has enabled anonymous aggregate user behaviour analytics.
Read the analytics documentation (and how to opt-out) here:
  https://docs.brew.sh/Analytics.html

==> Next steps:
- Run `brew help` to get started
- Further documentation: 
    https://docs.brew.sh

```
- **Installation successful!**と表示されていれば、正しくインストールされている
- これで、ターミナル上で「brew」から始まるコマンドを実行できるようになった
Rubygemsについて

#Rubygemsとは
Rubygemsとは、ファイル形式であり、それらのファイルはrailsアプリの機能（ログインや管理画面）を簡単に実装するためのものです。
gemをRailsにインストールする事で、自分自身でコーディングして実装するには難しい機能を簡単に実装することが実現するのです。

#gemの種類
gemは誰でも自由に作成し公開することが可能です。
その為、多くのgemがウェブ上に存在します。railsアプリに実装したい機能を検索サイト（https://rubygems.org/） から探してインストールを試してみて下さい。

#代表的なgem
[Bundler](https://rubygems.org/gems/bundler "Bundler")

#gemコマンド一覧
Rubygemsを調べたり確認するためのコマンドです。
gem自体のインストールやアップデートなどの操作はそれぞれのgemsから調べて行う必要があります。
##gem search
###コマンド
```
gem search [REGEXP] [options]
```
###説明
 [REGEXP] に一致するgem全てのgemから探してくれます。
[options]を指定すると自身のアプリ内にインストールしたgemの表示も可能です。
##gem list
###コマンド
```
gem list [REGEXP ...] [options]
```
###説明
Rubyアプリ内の[REGEXP ...]に一致するgemを探してくれるコマンドです。

#参考文献
https://tech-camp.in/note/technology/14322/
https://qiita.com/oshou/items/6283c2315dc7dd244aef

※記事内の表現方法など不適切なことなどあればコメントにてご指摘ください。
　勉強させて頂き修正させていただきます。
作図の画質向上にチャレンジする（仮）【R, Python】

#目次
（作成中）

#結論
【大枠の結論】
画像サイズを大きくすればそれなりの画質にはなる
【課題】
Rだと一定以上きれいに描画する方法が見つからない（助けてください…）
【現状の最適解】
一方Pythonだとmatplotlibを使うと下図のようにそれなりに綺麗なプロットができる。
![matplot.png](https://qiita-image-store.s3.amazonaws.com/0/193657/b7226cc1-6d62-8a67-8e92-d9745717fae2.png)


#はじめに
「綺麗なプロットを作成したい！」
RやPythonを用いて解析するヒトたちに共通する望みかと思います。

![plane.png](https://qiita-image-store.s3.amazonaws.com/0/193657/7cda0a60-183a-aa21-bef5-e813c54ba95e.png)

そう、この図のように曲線を描いた時でも、どこかギザギザしたものになってしまう。
今回はこのギザギザをどうしたら改善できるかに挑戦したいと思います。
用いる言語はRとPythonになります。

#画像サイズの定義
上図はRでデフォルトサイズのままpngデータで出力したものになります。
単純に画像サイズを大きくすれば質の向上が望めるかと思います。そこで以下からは画像サイズを1280*720として描画していきます。

#plotting in R
Rに関しては描画デバイスという考えが存在します。
私は絵を描くためのキャンバスを自身で定義できるという風に捉えております。
今回はwindows・macのデフォルトデバイスに加え、画質向上を図ったCairoパッケージと綺麗な図がかけると最近流行りのggplot2を用いました。

```R
library(Cairo)
library(ggplot2)

#低画像サイズ
png("out2/plane.png")
plot(sin, -pi, 2*pi)
dev.off()


#高画像サイズ
png("out/plane.png", width = 1280, height = 720)
plot(sin, -pi, 2*pi)
dev.off()

#Cairoパッケージ
Cairo(file = "out/cairoR.png", width = 1280, height = 720, type = "png", dpi = "auto")
plot(sin, -pi, 2*pi)
dev.off()
help(CairoPNG)

#ggplot2
png("out/ggplot.png", width = 1280, height = 720)
x <- seq(-pi, 2*pi, 0.01)
y <- sin(x)
dat <- data.frame(x, y)
ggplot(dat, aes(x, y)) +
  stat_function(fun = sin, color = "blue")
dev.off()

```

##デフォルト描画 〈windows〉
（まだです）

##デフォルト描画 〈mac〉

![plane.png](https://qiita-image-store.s3.amazonaws.com/0/193657/c64a6c7e-49fe-29ef-5513-bf3c72d9d0c3.png)

windownsよりも綺麗にかけると言われているmacで描画。
やはり綺麗になりますね。
でもどことなくギザギザ感があってまだ少し物足りない…。

##Cairoデバイス

![cairoR.png](https://qiita-image-store.s3.amazonaws.com/0/193657/ca5e3a6c-3d7d-695b-ec02-e90393013a95.png)

mac版と同程度のものができました。
ぱっと見こちらの方が綺麗かな？くらい
元々windows版のデバイスのクオリティが低いということで開発されたパッケージとのことで、macレベルの描画クオリティにはなるんですね。

##ggplot2

![ggplot.png](https://qiita-image-store.s3.amazonaws.com/0/193657/8adfb7c5-b24b-dc41-3f3f-8ff8d20f9c10.png)

うーん、確かに見た目は綺麗なのですが、今回の目的であるより滑らかな線を描画するという点では向上が見えないです…。
おそらくこれは、ggplot2はあくまで書式などを美しくするためのもので、デバイスはデフォルトのものに依存する（特に指定がなければ）ためと考えられます。

#plotting in Python

```Python
import matplotlib.pyplot as plt
import numpy as np


plt.figure(figsize = (12.8, 7.2), dpi = 100)
x = np.arange(-np.pi, 2*np.pi, 0.1)
y = np.sin(x)
plt.plot(x, y)
#plt.plot(x, y, antialiased = False)

plt.savefig("out/matplot.png")
```

##matplotlib 
![matplot.png](https://qiita-image-store.s3.amazonaws.com/0/193657/b7226cc1-6d62-8a67-8e92-d9745717fae2.png)

きれいだ…。

##アンチエイリアスを無くしてみる
![matplot_plane.png](https://qiita-image-store.s3.amazonaws.com/0/193657/47f95b82-598d-5c54-2e47-01a8d0d90371.png)

matplotlib.pyplot.plotの引数ではデフォルトで"antialiased = True"となっているんですね。
上図はそれを"antialiased = False"に変更したものになります。やはりギザギザカクカクしますね。


#終わりに
とりあえず画像サイズは大きめに設定するのが吉。
そもそも画像サイズにとらわれないsvg形式で出力する方針での検証も行ってみようかと思います。

とりあえず現状はPythonでmatplotlibを使うのが一番良さそうです。
Rでアンチエイリアス処理をかけられる方法があれば教えて欲しいです…。
Python 始めたいめんどくさがり向けメモ

「**Pythonやりたいんだけど、軽くて導入が楽でタダな環境なんかない？**」
と言われたので、とりあえずVSCodeでなんとかならんかと思ったら予想外に楽だったメモ。

# やること

0. Python と VSCode をダウンロードします。めんどくさがり向けなのでリンクも付けとくよ。
https://www.python.org/
https://code.visualstudio.com/

1. Python をインストールします。パスも通しておきましょう。というかインストーラがやってくれるから。チェックするだけでいいから。これ以外はだいたいなんとなくポチポチでいいよ。
![pyinstall.png](https://qiita-image-store.s3.amazonaws.com/0/105453/194ba720-6651-39fe-2cad-9368c8c35a4f.png)

2. VSCode をインストールします。こっちは特に特別なことやらなくても大丈夫。
3. 拡張機能「Python」をインストールします。左側のなんかブロックみたいなアイコン。
![pyinstall2.png](https://qiita-image-store.s3.amazonaws.com/0/105453/c63494eb-21c6-ec9a-54f6-219c9862a346.png)
4. 一応 PC を再起動しておきましょう。

**以上**。

VSCode 側の機能に必要なもの (リファクタリングに rope とか) は使う時にダイアログ出して勝手に突っ込んでくれます。

# 利点

**適当にツールとして使う分にはこれで十分すぎるぐらい**。

* 統合ターミナル。
* デバッグも実行も「構成の追加」で自動生成される「Python: Current File」でだいたいおっけー。
* **Type Hint さえきっちりしておけば** しっかり仕事してくれる Intellisense 。

# 欠点
世の中流行りの機械学習とかはだいたい Jupyter とか使ってる (偏見) んで、ウォークスルー系のやつとは相性が良くないかも。
ネイティブサポートってわけではないので、たまーに微妙な挙動をすることもあるけど、困ったことはないなあ……

# FAQ
Q. Jupyter とか入れときゃいいんじゃねえの？
A. アレは意外と手間が多い。便利ではあるんだけど。

Q. わあ英語だらけだ！なあこれ日本語になんねえの？
A. 右下に「日本語にしたけりゃこれ入れろ」みたいなのが出てきてないかい？それだ。

Q. VSCode の Python サポート、使い物になるの？
A. 職場で使ったけど十分使える。ただし上述の通り Type Hint がないとめんどくさいのはしょうがない。慣れておこう。

Q. ディープラーニングは？
A. サポートあるみたい。使ったことないから使用感は不明。とりあえず TensorFlow とか使えるみたいなことが書いてあったよ。でもまずはある程度素の Python で遊んでからのほうがいいと思う。
https://marketplace.visualstudio.com/items?itemName=ms-toolsai.vscode-ai

Q. ところで「Oracle から逃げて MS に捕まるのはどうなの」とか言ってたのは？
A. **そういうのは日本から Windows 追い出してから言ってみろ (暴論)** 。
あとアレは「そういう次元の馬鹿げた心配事ではないか」という皮肉でもあるからね？

*Python をとりあえずさっくり試してみたい人、おすすめですよ！ VSCode！*
ディレクトリ&ファイル操作@python

#ファイルの存在確認
```py

#python3
import os                                #osを読み込む
cwd = os.getcwd()                        #現在のワーキングディレクトリを取得
cwd_f = cwd + "/"+filename               #ファイル名を含めたディレクトリを作成 
if os.path.isfile(cwd_f) == True         #そのファイルが存在するか確認
   ...   
```

#ファイルを開き，編集する
```py

f = open(filename,'w')    #ファイルを開くが，中身を切り詰める
#f = open(filename,'a')   #ファイルの末尾にデータを追記(addition)するモード
f.write(INPUT)            #書き込みたいINPUTを書き込む(‘w’,’a’の時に操作可)
f.close                   #これが必要．
```
ちなみにファイルの読み取りだけだと...

```py

f = open(filename,'r')    #読取用にファイルを開く
T = f.read()              #全ファイル読取[2]    
f.close

with open(filename,’r’) as fr:
     fr.read()            #この形式だとf.close不要[1]


#繰り返しの読み込み[1]
with open('mydata.txt') as file:           #fileというクラスで読み込む
    for line in iter(file.readline, ''):   #""(空文字列)が来るまでforループを回す
    T = file.readline()                    #行ずつに読む
```


#ディレクトリを変える
```py

#python 3
import os

os.chdir('Sample')  
　　#相対パスを用いたディレクトリ移動
　　#現在のディレクトリにあるSampleというフォルダに移動
os.chdir('../')　
　　#相対パス．一つ上の階層のディレクトリへ移動
os.chdir('../../')
　　#相対パス．二つ上の階層へ移動．
```

**参考**
[1] [Python3.6ドキュメント: 組み込み関数](https://docs.python.jp/3/library/functions.html)
[2] [Python3.6ドキュメント: ストリームを扱うコアコンテンツ](https://docs.python.jp/3/library/io.html#text-i-o)
UE4でのandroid開発のためにNsight Tegraを入れようとしたら怒られた件

# この内容は
表題通りの件です。はい。

# 現環境
 - Win10 Pro
 - UE4 4.19
 - VS 2017 
 - unity側でのandroid開発環境は構築済み

# インストールの経緯
GEAR VRの開発を調べようとして、前提条件を調べていたらandroid開発環境を求められていたため、
いい機会だから環境セッティングしとこうと思って環境構築していたら事件発生。

![image1.jpg](https://qiita-image-store.s3.amazonaws.com/0/245782/10fd43f5-45d9-1937-85f0-1318ce53e826.jpeg)
(VisualStudioあたりで怒られている図)

このまま無理やりインストールしようとすると、
![image2.jpg](https://qiita-image-store.s3.amazonaws.com/0/245782/977284e9-ee84-2251-445b-1fa50c377b8a.jpeg)
(対応しているVisualStudioが入ってないぜと怒られている図)

そんなわけで、入らないのでいろいろ試行錯誤したわけです。

# 試行錯誤その1
## VisualStudioの設定の見直し
Visual Studio Installerを開いて、デスクトップ開発あたりでそれっぽい箇所のインストールがされていなかったらインストールする。
![image3.jpg](https://qiita-image-store.s3.amazonaws.com/0/245782/dc83f3a4-ec07-fe6b-04ca-bfbea74c4f09.jpeg)
(見直したらUEのandroidに関連しそうな部分がインストールされていなかった図)
もしかしてこれかな？と思ったので、これをインストール。
再度CodeWorksを使ってNsight Tegraをインストールしようとしたら、まだVisualStudioのバージョンによりインストールできず。

## VisualStudioの設定の見直しその2
さっきのはデスクトップ開発だったからかと思い、今度はモバイル環境の機能がインストールされていないからだと思い、インストールする。
![image4.jpg](https://qiita-image-store.s3.amazonaws.com/0/245782/a0d6798b-91f5-a3d9-a348-1af60ebfd776.jpeg)
(追加インストールの図)
インストールした後に、再度CodeWorksでNsight Tegraをインストールしようとしても、まだVisualStudioのバージョンによりインストールできず。

## おとなしく単体でインストールする
こういうのはたぶん単体インストーラーがあるだろうと考えたのとフォーラムでも単体でインストールしてくださいという記載があったので、NVIDIAさんのところの開発ツール系のダウンロードページで、Nsight Tegraのインストーラーをダウンロード(要デベロッパー登録)
https://developer.nvidia.com/gameworksdownload
CodeWorksのものよりインストールされるバージョンが違うが、たぶん新しいバージョンのほうがインストール条件更新されていそうでしたので、このままインストール
（インストール時の画像がないです……）

無事にインストールできたので、CodeWorksでバージョンの確認。
![image5.jpg](https://qiita-image-store.s3.amazonaws.com/0/245782/75ae1794-6b76-b042-9ce4-8b73b482c669.jpeg)

インストールされましたやったぜ
これでGEAR VRで遊べるね！！！

# 思ったこと
そろそろ2017対応しているやつにもCodeWorks側でデフォルトで対応してほしいですね……
UE4.20あたりで更新とかこないかな。

# 参考資料
[1. Android 向けゲーム開発に必要な設定](http://api.unrealengine.com/JPN/Platforms/Android/GettingStarted/1/index.html)
[Visual Studio 2017 support](https://devtalk.nvidia.com/default/topic/1030169/nsight-tegra-visual-studio-edition/visual-studio-2017-support/3)
jsでMapとSetを使う。


![alt](https://user-images.githubusercontent.com/26253721/39765058-e8d0eae4-531b-11e8-9305-4c852f269517.png)Mapオブジェクトの基本についてまとめてみた。
いわゆるkey, valueでデータを保存するためのオブジェクトである。
Objectオブジェクトより、厳格なkey, valueを設定することが出来、便利なメソッドがある。

例えばobjectオブジェクトとmapオブジェクトの違う点は
1. mapオブジェクトには、データを収集するための様々なメソッドが用意されている。
2. Objectオブジェクトではキーは文字列のみだが、mapオブジェクトではキーとして任意のデータ型の値を扱える。
3. mapオブジェクトでは、内部でハッシュテーブルを使ったデータ検索の高速化を行っており、該当するデータを瞬時に検索できる。
4. mapオブジェクトは反復可能であり、for/ofの各ループで[キー、値]の配列を返す
5. Mapオブジェクトではデータ数をsizeプロパティで取得できる。一方objectオブジェクトは手動でサイズを記録巣売る必要がある。

## Mapの基礎的な使い方

### データを追加する
const zip = new Map()
zip.set("Tom", "131-8634")
console.log(zip) // Map{"Tom" => "131-8634", "Huck" => "556-0092"}

### 値を取得する
指定したキーに対するMapオブジェクトのデータの値を取得するには、get(key)メソッドを用います。keyは以下のデータです。
console.log(zip.get("Tom"))
指定したキーが存在しない場合はundefinedが返されます。

### データの存在確認
Mapオブジェクトに、指定したキーを持つデータが存在するかどうかを知るには、has(key)メソッドを用います。keyはデータのキーです。
console.log(zip.has("Tom")) // true
console.log(zip.has("Buckey")) //false

Mapオブジェクトのデータを全て削除するには、clearメソッドを使います。

## 全キーの列挙
keysメソッドはMapオブジェクトのデータのキーを値に持つ反復可能なイテレータを返します。
const iter = zip.keys()
for(var v of iter)console.log(v) // Tom Huckと順に出力

### データの削除
指定したキーに対するMapオブジェエクトのデータを削除するには、delete(key)メソッドを使います。
zip.delete("Huck")

Mapオブジェクトのデータを全て削除するには、clearメソッドを使います。

### 全データを関数で処理する
forEachメソッドを使えば、因数のマンスうをMapオブジェクト内の全データに対して適用できます。
forEachメソッドの引数の関数は、次の引数を持ちます。
value...現在処理されているデータの値
key...現在処理されているデータのキー
map...処理対象となっているmapオブジェクト
Speaker Deck の長すぎる URL をなんとかする

## おなじみ Speaker Deck のURL長すぎ問題

Speaker Deck の URL は スライドタイトルから自動生成され、たとえばこんな感じになります

###### タイトル
> 俺とTrelloと終わらんタスク (DevLOVE関西 "個人のタスク マネジメント"のコツや悩みを話す場 資料) #devkan

###### 自動生成URL
> https://speakerdeck.com/matsuoshi/an-totrellotozhong-warantasuku-devloveguan-xi-ge-ren-falsetasukumanezimento-falsekotuyanao-miwohua-suchang-zi-liao-number-devkan

なが……

## スラッシュを使う

なんか、スライドタイトルにスラッシュが含まれていると、スラッシュの後ろの部分だけが URL生成に使われるっぽいです。

こんなかんじ

###### タイトル:
> モブプログラミングやってみた (PHPカンファレンス 関西2018懇親会LT) #phpkansai / mobmob

最後に `/ mobmob` をつけると……

###### 自動生成URL
> https://speakerdeck.com/matsuoshi/mobmob

お〜

## サンプルスライドつくりました

[![Speaker Deck の URL をなんとかする](https://speakerd.s3.amazonaws.com/presentations/ec2c223d2b93404bb6c656ec15884c36/slide_0.jpg)](https://speakerdeck.com/matsuoshi/speakerdecks-url)

<https://speakerdeck.com/matsuoshi/speakerdecks-url>
[Unity][Vuforia] マーカーを認識した時、トラッキングが外れた時に特定のアクションを起こさせたい

[Vuforia](https://www.vuforia.com/)を使ってARコンテンツを作っている時、
・マーカー認識した時のアクション
・トラッキングが外れた時のアクション
を設定したい時がよくある。

基本的な機能のようだが、意外と上記の設定を行える機能がデフォルトで存在しない(2018/7)ようなので、設定できるように自作した。

#準備
※以下の作業は最新のVuforia7系ではすでに対応されているので、
　Vuforia 7系を使用する場合は以下の対応は必要ありません

Vuforiaで存在する既存のDefaultTrackableEventHandler.csを継承して作りたい。
そのため、該当する関数をオーバーライドできるように少し修正を行う。
・マーカー認識した時の処理は OnTrackingFound()
・トラッキングが外れた時の処理は OnTrackingLost()
が該当するため、それぞれアクセス修飾子をprotected virtualにする。

```C#:DefaultTrackableEventHandler.cs
protected virtual void OnTrackingFound()
        {
            Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(true);
            Collider[] colliderComponents = GetComponentsInChildren<Collider>(true);

         ...
        }


protected virtual void OnTrackingLost()
        {
            Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(true);
            Collider[] colliderComponents = GetComponentsInChildren<Collider>(true);

            ...
        }
```



#スクリプト
スクリプトはほぼ下記の通り。

```C#:CustomDefaultTrackableEventHandler.cs
using UnityEngine;
using UnityEngine.Events;
using Vuforia;

public class CustomDefaultTrackableEventHandler : DefaultTrackableEventHandler {

	public UnityEvent OnTrackingAction;
	public UnityEvent OffTrackingAction;

	protected override void OnTrackingFound ()
	{
		base.OnTrackingFound ();
		OnTrackingAction.Invoke ();
	}
		
	protected override void OnTrackingLost()
	{
		base.OnTrackingLost ();
		OffTrackingAction.Invoke ();
	}
}
```

スクリプトはこちらをアップしているので、こちらを使用していただいて構いません。
https://gist.github.com/kiyossy/f2e42b5a13f0bd789a93336253e16757

#設定の仕方
それぞれのTargetオブジェクトにアタッチされている
DefaultTrackableEventHandler.cs をRemove Component して、
上記で作成したCustomDefaultTrackableEventHandler.csをアタッチする。

Unity Actionで設定できるようにしているので、UGUIのEventアクションと同じように設定できる。

<img width="339" alt="スクリーンショット 2018-07-15 12.05.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/252231/fc301213-425c-2558-7a97-175a4a5247da.png">
Excelで筆算的プログラミング(2)

[前の記事](https://qiita.com/matumoto_onga/items/48106f10499833a41613)の関数を少し拡張します。

# 拡張１
今のままでは、入力が数値配列だけなので、Rangeを利用できるように、構文を拡張します。

```vba
(B1:C4)                    [[1 1][3 2][4 3][5 4]]
(A2) =P("R_B1:C4","合計")  [23]
```
テーブルの場合は、テーブル名で指定できます。

```vba
(T2_)                    [[1 1][3 2][4 3][5 4]]
(A3) =P("R_T2_","合計")  [23]
```



# 拡張２
計算の途中経過を参照できるように、関数の引数に指定できるようにします。

```vba
(A3) =P("R_B1:C4","合計_0")  [23]
```

# 実装

```vba
Function P(ParamArray F())
    On Error Resume Next
    Dim M: M = UBound(F)
    Dim A: ReDim A(M)
    Dim I: For I = 0 To M
        Dim S: S = ""
        Select Case TypeName(F(I))
            Case "String"
                Dim D: D = Trim(F(I))
                Select Case True
                    Case D Like "V_*": S = V_(D)
                    Case D Like "R_*": S = R_(D)
                    Case Else
                        If D Like "*_#*" Then
                            Dim J: J = V_(Right(D, Len(D) - InStr(D, "_")), ",")
                            D = Left(D, InStr(D, "_") - 1)
                            Select Case UBound(J)
                                Case 0: S = E(Application.Run(D, A(J(0))))
                                Case 1: S = E(Application.Run(D, A(J(0)), A(J(1))))
                                Case 2: S = E(Application.Run(D, A(J(0)), A(J(1)), A(J(2))))
                                Case Else: S = ""
                            End Select
                        Else
                            S = E(Application.Run(D, IFC(I > 0, A(I - 1))))
                        End If
                End Select
            Case "Range"
                S = F(I)
            
            Case Else
                ' 未実装
                
        End Select
        A(I) = S
    Next I
    P = S
End Function

Function R_(D, Optional S = "")
    If D Like "R_*" Then D = Right(D, Len(D) - 2)
    R_ = Range(D)
End Function

```
CircleCI Linux planでSwiftLintを動かす

Makeをするのです！！！！

mac plan高いのでubuntuでやった
unit testはまだ実装してないので、しばらくは　`swiftlint` のみで十分かなぁ

```yaml
version: 2
jobs:
  build:
    docker:
      - image: norionomura/docker-swift-updater
    working_directory: ~/repo
    steps:
      - checkout
      - run:
          name: swift lint
          command: |
            cd ~
            git clone https://github.com/realm/SwiftLint
            cd SwiftLint
            make
            cd ~/repo
            ~/SwiftLint/.build/x86_64-unknown-linux/release/swiftlint --config ./.swiftlint/swiftlint.yml
```
【jQuery】配列をCSVファイルにして、ダウンロードする方法

# 解説
流れとしては、カンマ区切りにした配列をAjaxを利用して、CSVを生成するPHPファイルを呼び出します。
返ってきた値をブラウザでダウンロードすることになります。

送信するデータ（例）

```
Array 
( 
  [0] => ID,title,date 
  [1] => 1,test_01,2018-07-14
  [2] => 2,test_01,2018-07-15
  [3] => 3,test_01,2018-07-16
)
```

まずはjavascriptの実装です。

```javascript:jQuery
<script>
  function csv_download(data){
    jQuery.ajax({
      url:"/request.php",//CSVファイルを出力するPHPファイル
      dataType: "json",
      contentType: "application/json",
      type:"POST",
      data: JSON.stringify(data),
      beforeSend: function(xhr){
        xhr.overrideMimeType("text/plain; charset=shift_jis");//文字化けしないようにMIMEタイプをオーバーライドする
      },
      success: function(data) {
        if(data!=""){
          var downloadData = new Blob([data], {type: "text/csv"});
          var filename ="download.csv";
          //ファイルのダウンロードにはブラウザ毎に処理を分けます
          if(window.navigator.msSaveBlob){ // for IE
            window.navigator.msSaveBlob(downloadData, filename);
          }else{
            var downloadUrl  = (window.URL || window.webkitURL).createObjectURL(downloadData);
            var link = document.createElement("a");
            link.href = downloadUrl;
            link.download = filename;
            link.click();
            (window.URL || window.webkitURL).revokeObjectURL(downloadUrl);
          }
        }
      },
      error: function(xhr, textStatus, errorThrown){
        alert("CSVファイルのダウンロードに失敗しました。")
      }
    })
  }
</script>

```

次にCSVファイルを出力するためのPHPの実装です。

```php:request.php
$json = file_get_contents("php://input");
$data = json_decode($json);

$csv="";
foreach ($data as $value){
  $csv.=$value;
  $csv.="\n";
}

header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=test.csv");

echo(json_encode($csv));

```
Ansible 「で」 python 「を」 リモートーサーバーにインストールする方法

リモートサーバーにpythonが必要なのに、python自体をどうやってインストールするのか。

# 答え

raw モジュール / script モジュールはリモートサーバーに python を必要としない。これを利用するのが良さそう。

>Ansible’s “raw” module (for executing commands in a quick and dirty way) and the script module don’t even need Python installed. 
> ...
>`ansible myhost --sudo -m raw -a "yum install -y python2"`

[Installation Guide — Ansible Documentation](https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html#managed-node-requirements)


# モジュールが利用できる確認

ここでは単に `ls` が叩けることを確認。

shell モジュールを実行しようとして怒られる例。

```
$ ansible -i inventory.txt example_group -m 'command' -a 'ls -la'

localhost | FAILED! => {
    "changed": false,
    "module_stderr": "Shared connection to ******* closed.\r\n",
    "module_stdout": "/bin/sh: 1: /usr/bin/python: not found\r\n",
    "msg": "MODULE FAILURE",
    "rc": 127
}
```

raw モジュールでは怒られない。

```
$ ansible -i inventory.txt example_group -m 'raw' -a 'ls -la /'

localhost | SUCCESS | rc=0 >>
total 24
drwx------ 1 root root 4096 Jul 15 01:19 .
drwxr-xr-x 1 root root 4096 Jul 15 01:19 ..
drwx------ 3 root root 4096 Jul 15 01:19 .ansible
-rw-r--r-- 1 root root 3106 Oct 22  2015 .bashrc
drwx------ 2 root root 4096 Jul 15 01:19 .cache
-rw-r--r-- 1 root root  148 Aug 17  2015 .profile
Shared connection to localhost closed.
```

# 環境

- ansible 2.6.1









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
LoRaWAN技術セミナーに参加してきた

Senseway社主催　「たった1日でLPWAのLoRaWANがマスターできる技術セミナー」　５万円の有料セミナーでしたが、自腹で参加してきました。その価値はあったのか？と考えますと、その分の価値はあったと思います。内容盛りだくさんでした。自分で勉強したらとてもじゃないですが時間がかかって仕方ありません。

ビッグデータやWeb系のエンジニアが事前準備ゼロで臨むと手痛い目にあうと思います。あくまでもデータ分析基盤に放り込む前までの話なので、聞きに行ってネットワーク側の限界について知っておかないと、商品レベルの開発はできないでしょう。カバー範囲は幅広いため、難度は全体的に高めだと思います。しっかり予習していきましょう。

https://www.senseway.net/event-category/seminar/

※もしあなたが無線通信とIoT全方面的に熟練レベルでばければ、事前に勉強しておいたほうがいいもの。事前知識がぬけているとしんどいです。
- Arduinoで電子工作　https://deviceplus.jp/hobby/arduino-listicle-01/
- Node-REDについて
- IPSecなどの暗号通信の仕組みについて(事前共有鍵方式）
- スペクトラム拡散通信について


# 内容

![IMG_0903.jpg](https://qiita-image-store.s3.amazonaws.com/0/96615/64912483-ee17-90c7-4410-5f0f0c3da65b.jpeg)!


## 午前
- LPWAとは
- ARIB STD-T108について
- LoRa変調について（無線の変調・復調のお話）
- LoRaWANとは（プロトコルのお話）
- 暗号について

## 午後
- Arduinoハンズオン
- KashiwaGeeksライブラリ
- フレームワーク確認　Task　割り込み　スリープ
- LoRaWAN通信
- センサー接続
- データのハンドリング方法


# 午前　座学


<img width="1218" alt="IMG_0904_m4v_3.png" src="https://qiita-image-store.s3.amazonaws.com/0/96615/cfa79bba-d31b-6073-0a4a-e59e7e4dab8a.png">




無線通信の基礎的な部分から、プロトコルの詳細および暗号化について学び、最後にネットワーク容量を効率的に使うノウハウを得ることができます。ふつうにWeb関連の仕事をしていると、ビット単位で容量を削っていくなんて努力に見合わないので今どき流行らないのですが、LPWAを使う上では昔ながらの組み込みプログラマーのごとくデータ量をへらす努力が必要です。メッセージサイズを使い切らない程度にJSONで送ろうなんていう考えは甘かったです。16進数はtextで送ると一文字1byteだけど、16までの数字は4bitで送れるからデータは可能な限り0x0-0xFまでの文字で表現して4bitに圧縮するんだ、的な話になります。Yahooみたいな大規模なところはここまでログのチューニングを行いますが、自分たちがやるとして、どこまで可読性を犠牲にするかは悩みどころです。これは午後にもハンズオンのデータで実際に触ることになります。

また、無線は共有型なので一基地局でハンドリングできる端末数は決まってきます。単純に遠くまで届くというのではなく、輻輳がおきないように基地局の設計をすることと、端末の数とメッセージ数の調整が必要になります。早くつないで早く切る、ということをして流れを止めないことが大切です。

また、時間をかけていたのは暗号部分でした。ペイロードに関してはAES128ブロック暗号化がされています。ハンドシェイクとseedについて話していましたが、なにしろ毛色が違う難しい話なので講師の方が苦労していました。ネットワークエンジニアでIPSecが話せる（嘘）人なら問題ないと思います。


# 午後　ハンズオン

眠くなる時間なのですが、ハンズオンです。まずはArduinoの使い方を学習します。講師の話すとおりにすすめていけば、だいたいできるのですが、ど初心者だとついていくだけで必死になってしまうので、先にしっかりと予習して初級者レベルになっていないと大変だと思います。

LoRaWANの通信を扱うのにATコマンド的なコマンドを扱わなくてはいけないのですが、Arduinoから使えるライブラリとして講師の方が開発したKashiwaGeeksというライブラリを通してデータ通信を行います。このライブラリは、省電力機能もふくまれていて、全力でloopする普通のArduinoのプログラムではなく、1分からそれ以上の間隔での定期実行に適した作りになっています。利用料金も考えて１日数回送るくらいにしたいので、分速１回チェックだったら電源の無駄もなくなります。

データはMQTTに送られます。自分は勘違いしていたのですが、センスウェイのMQTTはデバイスごとの最後のメッセージをひとつだけしか保持しない仕組みになっているようなので、読み出しに失敗すると上書きされてしまうようです。大規模実運用する場合は、はやめに読み出しして、永続化しているDBにどんどんかいてあげるか、kafkaなりのキューイングができるPub/Subの仕組みに入れてあげる必要があります。MQTT自体はPub/Subの仕組みの一つなのですが、MQはMessage Queueではないようです。

ハンズオンは、デバイスの登録、KashiwaGeeksの使い方、Uplinkデータの扱い方、Port（Topic的なもの）の扱い、JSONオブジェクトのパースからDownlinkデータ（デバイス側へ送信）を学んでいきます。Arduinoに接続した温度計データをPC上のNode-Redで可視化していきます。

# まとめ
非常に良くできたセミナーでした。最後のデータ収集部分はクラウドに送るところが未解決だったので、そこだけ改善の余地ありとお伝えしたので、次回のセミナーでは改善されていると思います。

セミナーは満席で、遠くは九州や四国からも参加者がありました。IoTの盛り上がりを感じるとともに、経営的に見て人的リソースを貼り付けられてない現状を雑談の中で感じました。どうやって盛り上げていくかが、ビッグデータ業界の課題だと思います。
俺言語 その27

#概要

俺言語をやってみた。
wemos d1に、入れてみた。

#写真

![image](https://qiita-image-store.s3.amazonaws.com/0/18104/3437b97d-f564-dc00-8e3f-e16268a97f21.png)

#サンプルコード
fizzbuzz

```
10 a=0
20 a=a+1
30 b=a/15
40 #=%=0*120
50 b=a/5
60 #=%=0*140
70 b=a/3
80 #=%=0*160
90 ?=a
100 #=a<100*20
110 #=200
120 ?="fizzbuzz "
130 #=100
140 ?="buzz "
150 #=100
160 ?="fizz "
170 #=100
```

#言語仕様。

対話形式で、一行ずつ解釈するインタープリター。
行番号を持ち、分岐できる。
文は、代入文のみ。
行は、行番号、スペース、代入文。
行番号は、1から255まで。
変数は、aからz。
数値は、0から255まで。
+ - * / で加減乗除。
%は、剰余。
$は、乱数。０から９。<-無し。
0は、ソースリスト表示。
ソース数は、256バイト。
= < > で論理式、値は0と1を取る。
文は、左から順に評価される。2+5*6は、42となる。
 #は、プログラムカウンター
if文は、#=a<100*20でaが100より小さいなら、行20に飛ぶ
?は、プリント文。
行番号無しなら、ダイレクト実行。
100 a=0で、挿入。
100で、削除。
100 a=100で、置き換え。

以上。
日本語文字列を小さく保存するユニコード対応12bits文字コードJacを試作した(utf8の51~2%くらい)

UTF-8…無駄に大きなファイルになりますよね…。ASCII互換を保って作られているので当たり前といえば当たり前です。

日本語文字列の保存に不便なので小さなファイルサイズで保存できる文字コードを試作しました。（Shift-JISみたいなユニコード互換がない文字コードはNG）

名前はJacです。文字コードの詳細な定義は調べてないので、文字コードとして不完全なところが多いかと思います。

[github.com/aimof/jac](https://github.com/aimof/jac)。実装はGoです。

## ファイルサイズ

青空文庫のこころで試したところ、

|規格|容量|
|:--|:--|
|utf8|547KB|
|shift-JIS|366KB|
|Jac|279KB|

## どうやって小さくしたのか

タイトルに書いたように文字を表す単位を12bitsにしました。utf8だと日本語は3Bytes、shift-Jisでも2Bytesなので、12bitsまで持ち込めばかなり容量が小さくなるだろうという目論見です。

常用漢字2000字強、ひらがな100字、記号ちょこっと、あたりが日本語で主に扱う文字なので、12bitsあればほぼほぼ足ります。上の表を見ると、おおよそ、`Jac : shift-JIS : utf8 == 3 : 4 : 6`になっています。

## 簡単な仕様

ひらがな、カタカナ、記号、常用漢字、ASCII文字は、12bits内で表せるようになってます（ハードコーディングされてます）。それ以外のUnicode文字は3Bytesを使ってのんびり記述しています。

読み書きは、3Bytes(二文字)単位で行います。

### 利点

* 容量が小さい。

### 欠点

* 最初から厳密に3Bytes単位で読まないとデコードできない。
* 12bits一単位というのが、様々な他の規格と相性が悪い。
* 文字検索機能が実装しづらい
* 圧縮対象でない文字列を使うと容量が大きくなる。
* ASCII互換がなく、ASCII文字が1.5Bytesに大きくなる。
* bzip2, zstdなどの圧縮ツールと相性が悪い。

## 作ってみて

* 文字コードとbit演算のいい勉強になりました。
    * 特にbit演算は12bit規格である都合上多用するので、習熟度が上がりました。
    * utf8が無駄が多い規格なのもなんとなく学べました。
* 圧縮ツールの偉大さがわかりました。
    * 生の文字コードだと半分近いのに、bzip2で圧縮かけるとjacの方が容量が大きくなる…

## まとめ

普段使っているものを自作するのはとても面白いし、学ぶことが多いですね。コメントいただければ質問には返答します。
シェルで余計なプロンプト表示を消す方法  ( 先頭のドルマークやバージョン表示など )

# bash の場合

```
$ unset PS1
```

# zsh の場合

```
$ unset PROMPT RPROMPT
```


# zshでの実行例

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/c440cfcd-2688-c7cd-0191-8657b0061c44.png)

余計なものがなくなり、闇の中でコマンド実行しているような気分になれる。

# 元に戻す場合

シェルを再起動するなりする。

```
exec $SHELL
```

# いつ使う？

シェルの標準出力を直接、OS側でコピペしたい場合などに。

( `RPROMPT` に色々表示してたりすると、大量のスペースもコピペされてしまうので、いちいち消すのが面倒 )

# 環境

- bash 3.2
- zsh 5.3 (x86_64-apple-darwin17.0)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
PlayonLinuxのぐるぐるが表示されっぱなしにならない方法

#バグの内容
PlayonLinuxの最新版でインストールするソフトウェアを選択する際、読み込み中のマークが表示されっぱなしになってしまう問題です。

#原因
~~PlayonLinux側で正常に日本語の処理ができてないためと思われます。~~
翻訳ミスでした。

#環境
~~Ubuntu16.04LTSでバグを確認していますが、おそらく他のUbuntuバージョンや他のディストリビューションでも発生すると思われます。~~
PlayonLinux 4系全てで発生します。
~~対処方法にディストリビューション依存は無いので大丈夫だと思います。~~

#対処方法
ターミナル上で変数で英語を指定してあげることで解決します。
当然UIは英語になってしまうのですが仕方ありません。

```bash
LC_ALL=C playonlinux
```
アコーディオンメニューを例にUITableViewRowAnimationの動きを見る

意外とUITableViewRowAnimationの動きをすぐ見られる記事がなかったので、アコーディオンメニューに各アニメーションを割り当てた時の動きを紹介します。

参考までに、コードはここに置いています。
https://github.com/akatsuki174/AccordionMenuSample

セクションヘッダー（1, 2とかの部分）をタップした時に次のようなコードを実行することでアニメーションを発生させています。

```swift
tableView.beginUpdates()
tableView.reloadSections([section], with: .fade)
tableView.endUpdates()
```

# .fade

<img src="https://qiita-image-store.s3.amazonaws.com/0/100736/ecc55e1a-4232-d87b-bc60-567769cb787c.gif" width="320px">

# .right

<img src="https://qiita-image-store.s3.amazonaws.com/0/100736/518ff24b-37c0-146c-7d13-d9d9c99fadf0.gif" width="320px">

# .left

<img src="https://qiita-image-store.s3.amazonaws.com/0/100736/0f9c83c3-d926-98e3-85d6-52322eb86cd9.gif" width="320px">

# .top

<img src="https://qiita-image-store.s3.amazonaws.com/0/100736/1fc227c5-ea4c-cea4-d093-6a1bacb85e72.gif" width="320px">

# .bottom

<img src="https://qiita-image-store.s3.amazonaws.com/0/100736/52361f91-cd56-5196-e445-cd5ca76778ae.gif" width="320px">

# .none

アニメーションなしという意味ではなく、デフォルトのアニメーションが走ります。

<img src="https://qiita-image-store.s3.amazonaws.com/0/100736/4a5df947-faca-281e-ddd9-ede3f7cd9e48.gif" width="320px">

# .middle

<img src="https://qiita-image-store.s3.amazonaws.com/0/100736/417e645f-2efe-40bd-424a-038153638124.gif" width="320px">

# .automatic

<img src="https://qiita-image-store.s3.amazonaws.com/0/100736/001c9c9a-bb9c-33db-acb6-f12a5778c46f.gif" width="320px">
Domemo実装によるプログラミング言語比較　その２

#趣旨
[Domemo実装によるプログラミング言語比較　その１](https://qiita.com/aoi_erimiya/items/0504a04a02aaea18a8bd)の続きです。

##成果物
ソースコードはBitBucketに入れてますので、MITライセンスの元でお好きにしてください!
※公開リポジトリだけど、みんな好き勝手に触れるのかよくわかってない...
git clone https://aoi_erimiya@bitbucket.org/aoi_erimiya/domemo.git

#各言語の感想

##Go-独特

とことんコーディングの省力化がされた独自の文法。
極めればめっちゃ早くコーディングできるんだろうなって思う。
※VSCodeの補完もすらすら！

###いいところ
- 変数宣言が楽(varとか型指定とかいらない)

```go:domemo.go
round := 1
```

- ポインタ使える！

###つまったところ
- リスト宣言の文法がめっちゃ特殊

```go:domemo.go
cards := [5]int{1,2,3,4,5}
```
- foreachがない
- オブジェクトも配列も全部値渡し→泣く泣くポインタ使う事に

```go:domemo.go
// Player型が詰められたリストがあるとして、プロパティを編集したい
players := []Player{}
players = append(players, Player{name, playerCards})
...

// foreachがないので、まず普通にfor
for idx := 0; idx < 4; idx++ {
	// わかりやすくするために変数に代入
	player := players[idx]
	// 値渡しされてるので、実体を編集できてない
	player.cards = [0,1,2]
}
```

##Swift-洗練

pythonのようだけど洗練されていて、わかりやすい文法。

###いいところ
- 配列の宣言がわかりやすい

```swift:domemo.swift
let cards: [Int] = [1,2,3,4,5]
```

- 文字列への変数埋め込みがわかりやすい

```swift:domemo.swift
var round = 1
print("*round\(round)")
```

###つまったところ
- Random周りの関数が3.0->4.0->4.2で仕様激変してたり、やっぱりCocoaあるのが前提？
- Mac持ってないのでRandom系がどうしても通らず、動作確認できてない(たぶん動くはず...)

```swift:domemo.swift
let cards:[Int] = [1,2,2,3,3,3,4,4,4,4,5,5,5,5,5,6,6,6,6,6,6,7,7,7,7,7,7,7]
for idx in cards.indices{
    let swp = cards[idx]
    let targetIdx = Int.random(in: 0 ..< 28)
    cards[idx] = cards[targetIdx]
    cards[targetIdx] = swp
}
```
- 何をimportしないといけないかがよくわからない

##Python-原点

モダンじゃないけどとても書きやすい。self祭りは勘弁だけど...:sweat_smile:
※個人的にTwitterのBot組んでるので慣れもある

###いいところ
- インデントで見やすい
- 文字列や配列の掛け算ができる

```python:domemo.py
def show_mask(self):
	cards = "X" * len(self.cards)
	print(self.name + "->" + cards)

cards = [1] + [2]*2 + [3]*3 + [4]*4 + [5]*5 + [6]*6 + [7]*7
```

###つまったところ
- リストのremoveで例外が起きる
- \_\_init\_\_(self,...)の記法が特殊

```python:domemo.py
class Player:
    def __init__(self, name, cards):
        self.name = name
        self.cards = cards
```


##Ruby-自由

明示的な文法によるわかりやすさと気が利いた標準ライブラリの関数たち。
ドキュメントの豊富さと、便利関数が多いからか
自分が実装してきた中で、一番ゲームとしての実装が進んでたり:stuck_out_tongue_closed_eyes:

###いいところ
- Pythonでできる事はたいていできる(文字列の掛け算とか)
- スコープの明示(@とか)
- getter,setterの実装も楽

```ruby:domemo.rb
class Player
    attr_reader :name, :cards

    def initialize(name, cards)
        @name = name
        @cards = cards
    end
```

###つまったところ
- 命名規約が最初わからなかった(camel?snake?)　※答えはどっちも<br>
[Rubyスタイルガイドを読む: 命名](https://techracho.bpsinc.jp/hachi8833/2017_02_13/35364#3)

##やってみて
同じテーマで色んな言語で書いてみると、それぞれの良さがわかって楽しい:relaxed:
後半に行けば行くほど、こういう実装もできるって気づいたりも。
実装簡略化してるものもあったり、例外処理は度外視しているので
そこもリファクタリングしていきたいですね。

最近のモダンな言語はひとまずおさえたつもりだけど今後も他の言語で実装やってみます！
次はAdaとか、TypeScriptあたりかな。

##ご意見など
各言語の専門家の方、もっと綺麗に書けるよとかご意見ありましたら
スキル磨きたいのでぜひ教えてください！！:blush:
tkinterでthread その２

#概要
tkinterでthreadやってみた。
threadから、ライン引いてみた。

#写真

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/7ac47106-5787-a789-8256-d4f87ef6602d.png)

#サンプルコード

```
import Tkinter
import random
import threading
import time

a = 0
class Emu(threading.Thread):
   def __init__(self):
      threading.Thread.__init__(self)
   def run(self):
      a = 0
      while a < 400:
         a += 1
         canvas.create_line(a % 400 + random.randrange(a), 
				a % 400 + random.randrange(a), 
				a % 400 + random.randrange(a), 
				a % 400 + random.randrange(a), fill = "red")

root = Tkinter.Tk();
root.minsize(420, 420)
canvas = Tkinter.Canvas(root, width = 400, height = 400)
canvas.place(x = 10, y = 10)
Emu().start()
root.mainloop()

```

以上。
CodeCommitの初期化メモ

すでにあるレポジトリを手っ取り早くCodeCommitに持ってく方法（なんか癖がある）
add origin して push すればいいかというと、CodeCommit側が変な状態で初期化されてるらしく、うまくいかない。

- CodeCommit側でリポジトリ作成
- 適当な場所へclone
- ダミーファイルをコミット
- 作業中のリポジトリにリモート設定後、 git merge --allow-unrelated-histories
    - https://qiita.com/takanatsu/items/fc89de9bd11148da1438

と経て、正常に扱えるように。うーんこの...

あと、バージョンにもよるが、git lfsを無効にしないとダメ
https://stackoverflow.com/questions/48699293/how-to-i-disable-git-lfs
GPSカー　シュミレータ その9

#概要
GPSで自動走行する、コンテストがある。[GPS・QZSSロボットカーコンテスト2018](https://robot-car.jimdo.com/)
実機を借りて、アプリから操作する部門がある。
実機は無いので、シュミレータを作ってみた。
raspberry piで、作って見た。

#写真

![2018-07-15-083738_1024x768_scrot.png](https://qiita-image-store.s3.amazonaws.com/0/18104/4dfc0fdd-1dde-768d-469f-9a81849a04d7.png)

#環境
android nexus7
raspberry pi 1 b
raspbian jessie 8.0
bluetooth dongle cambridge silicon radio

以上。
SElinuxの無効化に失敗してOSが起動しなくなった話

# 前置き
SElinuxの無効化時を失敗してOSが起動しなくなった時のお話です。
OSが起動できない場合の障害対応の一例として参考にして頂けると幸いです。

実施環境はESXi6.5のネステッド環境に、
ゲストOSとしてCentOS7.4をインストールしています。


# やってしまったこと
SElinuxの無効化を行うために、コンフィグファイル(`/etc/selinux/config`)を修正。
本来は「SELINUX=disabled」とすべき所を、
誤って「**SELINUXTYPE**=disabled」としてしまった。

この状態でOSを再起動したところ、
SElinuxが正常に起動できなくなり、OSがフリーズしてしまった。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/269326/47f336e4-7444-060b-36b1-e813e4c295f3.png)


# 対応
通常のブートでOSが起動しないため、ISOイメージファイルからOS起動後、
システムディスクをマウントし、設定ファイルを修正しようと考えました。

## 対応内容
起動時にBIOSメニューに入る設定を行った上でOSの起動を行う。
※ESXiの場合は以下の設定で次回起動時にBIOS画面に入れます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269326/09824f6c-722a-0ca6-0bac-35f35e893239.png)

BootメニューからCDROM起動を選択し、ISOイメージからOS起動する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269326/29668f58-cf15-dc0b-822f-06df733965e1.png)

Troubleshootingを選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269326/d564d7aa-9a85-e946-d4b5-f56cd09b21bf.png)

Rescue a CentOS systemを選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269326/ba1e6079-4d00-a9cd-aeb9-d559cbe6df1e.png)

1を選択。これでISOイメージからブートされたOSにシステムディスクがマウントされます。このあとエンターキーを何度か叩くとコマンドを打てる状態になります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269326/c5ee267c-bc66-51af-bf4b-41929a158c5d.png)

`lsblk`でデバイスのマウント状態を確認。
図のようにシステムディスク(sysimage)が/mnt配下にマウントされています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269326/7383a965-b96a-f860-0b8a-b742fd207845.png)

selinuxの設定ファイルは以下のディレクトリにあります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269326/ba6d689f-d049-3e2f-3232-4031f0989571.png)

設定ファイルのSELINUXTYPEを`targeted`に戻します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269326/d52b3f76-ac93-9683-036e-7342a211ad73.png)

再起動し、無事OSが起動！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269326/548115bb-e9e4-984d-5f6d-6855b414a868.png)

あとはSElinuxのコンフィグファイルを正しく設定(無効化)し、対応完了です。
おつかれさまでした。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269326/232d41a4-3799-fb69-3a47-97a0d69fde77.png)

# あとがき
OSが起動しない場合のトラブルシューティングはいくつかパターンがあるので、個人の環境で色々と試しておくと、いざという時に慌てずに対応できそうです。
機会があったらまた別のパターンについても記事にしたいと思います。

追記：OSが起動しない場合の対応方法の一つとして、[「GRUBが破損してOSが起動しなくなった場合の対応方法」](https://qiita.com/daisuke0115/items/dd15552a3e34decbee89)を記事にしました。こちらも宜しければ読んでみてください。

以上
zsh, oh-my-zsh, peco, iTerm2 ターミナル周りの設定メモ

## ターミナル周りの設定をメモっておきます。
最近ようやく、会社のPCと自宅のマイPCのターミナル環境が揃い、
以前より快適に作業を行えております。
環境を作っていく中で、設定のメモを残しておきたいと思いパソコンを立ち上げました。


### (1) zshインストール
いろんな方がzshのインストール方法書いているので、そちらを参考にしてください。
brewが手取り早いですかね。

参考にいくつかピックアップさせていただきます。
- [初心者向け：Zshの導入](https://qiita.com/iwaseasahi/items/a2b00b65ebd06785b443)
- [Macの環境設定(3) zshを入れる](https://qiita.com/nenokido2000/items/763a4af5c161ff5ede68)


### (2) oh-my-zshのインストール
oh-my-zshのインストールを行います

```
$ curl -L https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh | sh
```
zsh同様に、インストールに関する記事が多いのでいくつかピックアップしておきます。
- [oh my zsh 導入手順メモ (Mac)](https://qiita.com/NaokiIshimura/items/249bb1a101b626a59387)
- [Mac OS X で zsh ＋ oh-my-zsh の環境を作って一通り設定するまで](https://qiita.com/udzura/items/0d08d71d809bfd8c5981)

<br>

### (3) oh-my-zshのThemeは以下から
[oh-my-zshのテーマ](https://github.com/robbyrussell/oh-my-zsh/wiki/themes)
私は、af-magicに設定しています。
特別な思いはありませんが、初めて導入した際にaf-magicを設定した事がきっかけで今でも採用しています。
↓こんな画面です。(公式サイトより)
<img width="707" alt="スクリーンショット 2018-07-15 8.24.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/182399/73d3249b-72e1-f412-d7f9-6a3889cda06f.png">
<br>
### (4) plugins
oh-my-zshにはプラグインが用意されています。
デフォだとgitのみ適用されており、gitのaliasが使えます。
plugins は以下のリンクから探せます。
[oh-my-zsh/plugins](https://github.com/robbyrussell/oh-my-zsh/tree/master/plugins)

~/.zshrcの以下の記述箇所に追加していくと良いです。

```
plugins=(git)
```
gitのpluginを設定しているとgit操作の時に以下のaliasを使えます。
便利です。[Plugin:git](https://github.com/robbyrussell/oh-my-zsh/wiki/Plugin:git)
例として。こんな感じのaliasが設定されています。(上記リンク先より。)
<img width="726" alt="Plugin_git_·_robbyrussell_oh-my-zsh_Wiki.png" src="https://qiita-image-store.s3.amazonaws.com/0/182399/5ece7463-600a-2fff-9bad-304e7d5f256e.png">
<br>
### (5) pecoる
hisoty検索が楽になる。
試験的に使ってみたら便利だったのでついでにインストールします。
お好みで使ってみてください。

[ここ](https://github.com/peco/peco)のREADME.mdから、pecoのdemo動作が見れます。
ctrl + r で、検索窓に飛びますので、そこから検索できます。

pecoの設定は[ここ](http://vdeep.net/mac-peco)の記事を参考にしました。
brewでインストールしてから

```
$ brew install peco
```

~/.zshrcに以下を追加記述。

```
function peco-select-history() {
    local tac
    if which tac > /dev/null; then
        tac="tac"
    else
        tac="tail -r"
    fi
    BUFFER=$(\history -n 1 | \
        eval $tac | \
        peco --query "$LBUFFER")
    CURSOR=$#BUFFER
    zle clear-screen
}
zle -N peco-select-history
bindkey '^r' peco-select-history
```


<br>
### (6) iTerm2インストール

[初心者向け iTerm2のインストール方法](https://qiita.com/iwaseasahi/items/301e1f3b18aa49990763)
一応リンク貼っておきます。
普通にダウンロードするだけです。

私の使い道は
- ホットキーでいつでも呼び出し
- 半透明にしてウインドウの邪魔をさせない

基本的にこの二つです。
細かいところでいれば、文字の大きさを変更したり、画面分割したり、タブ移動を楽にしたり、色々できます。
<br>
### (7) ホットキー設定
ホットキーの設定は[ここ](https://qiita.com/okamu_/items/a5086d2d5ba405f35acb)が嬉しいです。
controlキーを2回、ぽんっぽんっと押せば、どんな時もターミナルが舞い降りてくる設定にしております。
ターミナルの切り替えを頻繁に行うタイプなので、かなり重宝しております。
<br>
### (8) おわり
以上で終了です。
ターミナルは基本的に使いやすくカスタマイズしていく事が正だと思うので、暇を見つけては更新していきます。
Lazurite Basic　ピン配置

#概要
Lazurite Basic　のピン配置、調べてみた。

#写真
![](http://www.lapis-semi.com/lazurite-jp/lapis_admin/wp-content/uploads/ph_item_detail_sample.jpg)

#ピン配置

|uno	|Lazurite Basic|
|:--|:--|
|SCL|P35/AIN1	|
|SDA　|P34/AIN0	|
|GND	|GND|	
|D13　	|P36/SCK|
|D12　	|P45/MISO|
|D11　	|P44/MOSI|
|D10　	|P37/SS|
|D9　　	|P52|
|D8　　	|P57|
|D7　　	|P33|
|D6　　	|P32|
|D5　　	|P43|
|D4　　	|P42|
|D3　　	|P53|
|D2　　	|P50|
|D1　　	|P31/TXD|
|D0　　	|P30/RXD|
|A0　	|P20/AIN4|	
|A1　	|P21/AIN5|	
|A2　	|P22/AIN6|	
|A3　	|P03/AIN11|	
|A4　	|P34/AIN0|	
|A5　	|P35/AIN1|

以上。
[自動テスト001.py]アマゾンにログインするだけ、それだけ。

# アマゾンにログインするコードを書く
はじめての投稿で自動テストに関する環境構築の話を書きました。
今回は、実際にpythonを動かして、ログインの自動化を行います。

## 千里の道も一歩から
結論：コードは以下の通り。

```python
from selenium import webdriver

# 次にchromedriverの保存場所を指定します。
driver = webdriver.Chrome("~/chromedriver")

# pytest で動かしたときに、testの数を収集するためにtest1()内にコードを書きました。なくてもよい
def test1():
    driver.get("https://www.amazon.co.jp/")
    driver.find_element_by_xpath("//a[@id='nav-link-accountList']/span").click()
    # ログインするためのメールアドレスを""内に記載する
    driver.find_element_by_id("ap_email").send_keys("example@example.com")
    driver.find_element_by_xpath("//input[@id='continue']").click()
    #ログインするためのパスワードを""内に記載する
    driver.find_element_by_id("ap_password").send_keys("p@ssword")
    driver.find_element_by_id("signInSubmit").click()
    # ログイン後ページのタイトルに"Amazon"が含まれているか確認。
    assert 'Amazon' in driver.title
```

あとはこれをVScode（ターミナルでもなんでも）で``pytest ~~.py``すればOKです。
これにより、
1. Chromeをもちいてページが開き
2. ログインページヘ遷移し
3. ログインIDを入力する画面でアドレスを入力し
4. クリックして遷移し
5. パスワードを入力し
6. クリックしてログイン！
7. 行き先で、ここは"Amazon"か？を確認

という一連の操作が出来ました。
これからはこれを一つのベースに社内で使える超基本機能に関するコードを作成していきたいと思います。


### 参考Qiita記事
[PythonでSeleniumを使った自動テスト
](https://qiita.com/ogihara/items/4d96cb5961ab3d10be48)[たった1人から始める社内テストコード文化
](https://qiita.com/haminiku/items/9f1b9a2fb773c732c494)
ESP32-DevKitCでdeep sleep中もGPIOに接続したLEDを光らせる

#目的
ESP32はdeep sleepモードに入れることで消費電力を抑えることができるが、deep sleep中もGPIO出力だけはHighに保ちたい。
(How to keep a GPIO output high even in deep sleep mode at ESP32)

#環境
Arduino-IDEでESP32-DevKitCを使用
(Arduino-IDE is used.)

#詳細
deep sleepモードに入ってもGPIO出力をHighに保つには以下のようにするとできる。

```
#include "driver/rtc_io.h"
gpio_num_t pin_led=GPIO_NUM_25;
void setup() {
  rtc_gpio_init(pin_led);
  rtc_gpio_set_direction(pin_led,RTC_GPIO_MODE_OUTPUT_ONLY);
  rtc_gpio_set_level(pin_led,0);
  delay(1000);
  rtc_gpio_set_level(pin_led,1);
  esp_deep_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON);
  esp_deep_sleep_enable_timer_wakeup(5 * 1000 * 1000);
  esp_deep_sleep_start();
}
void loop(){
}
```

１秒間Lowにした後、Highにして直ぐに５秒間deep sleep状態になるが、その間LEDが点灯していることが確認できた。
(I confirmed that the LED is off for 1 second and kept on during 5 seconds of deep sleep.)

以下のguideを参考にした。
ESP-IDF Programming Guide
[Deep_Sleep](https://esp-idf.readthedocs.io/en/v2.0/api/system/deep_sleep.html)
[RTC_GPIO](https://esp-idf.readthedocs.io/en/latest/api-reference/peripherals/gpio.html)
[小ネタ]PersistentVolume の Reclaim Policy を変える

小ネタ。
以下のドキュメントの通りですが少しハマったのでメモ
基本的には以下のようにやれば良い

[Change the Reclaim Policy of a PersistentVolume](https://kubernetes.io/docs/tasks/administer-cluster/change-pv-reclaim-policy/)

>kubectl patch pv -p ‘{“spec”:{“persistentVolumeReclaimPolicy”:“Retain”}}’

ただ上記はそのままコピペするとエラーになった

```bash
# JSON のパースでエラーとなる模様
$kubectl patch pv pvc-3fdc5920-8595-11e8-a565-06fc7dc53c2c -p ‘{“spec”:{“persistentVolumeReclaimPolicy”:“Delete”}}’
Error from server (BadRequest): json: cannot unmarshal string into Go value of type map[string]interface {}

# コピペのJSONはダメ
$echo ‘{“spec”:{“persistentVolumeReclaimPolicy”:“Delete”}}’ | jq .
parse error: Invalid numeric literal at line 1, column 4

# 少し変えて JSON がパースできることを確認
$echo '{"spec": {"persistentVolumeReclaimPolicy":"Delete"}}' | jq .
{
  "spec": {
    "persistentVolumeReclaimPolicy": "Delete"
  }
}

# 一応指定する JSON が合っているかも確認したが良さそう
$kubectl get pv pvc-3fdc5920-8595-11e8-a565-06fc7dc53c2c --output json |less

(一部略)
  "spec": {
        "accessModes": [
            "ReadWriteOnce"
        ],
        "awsElasticBlockStore": {
            "fsType": "ext4",
            "volumeID": "aws://us-west-2c/vol-03c4886d59252eb54"
        },
        "capacity": {
            "storage": "20Gi"
        },
        "claimRef": {
            "apiVersion": "v1",
            "kind": "PersistentVolumeClaim",
            "name": "mysql-pv-claim-6",
            "namespace": "default",
            "resourceVersion": "4636186",
            "uid": "04449e69-8558-11e8-a565-06fc7dc53c2c"
        },
        "mountOptions": [
            "debug"
        ],
        "persistentVolumeReclaimPolicy": "Retain",
        "storageClassName": "gp2"
    },
    "status": {
        "phase": "Released"
    }
}
```

これで準備OK
やってみる

```bash
# patch が無事成功
$kubectl patch pv pvc-3fdc5920-8595-11e8-a565-06fc7dc53c2c -p '{"spec": {"persistentVolumeReclaimPolicy":"Delete"}}'
persistentvolume "pvc-3fdc5920-8595-11e8-a565-06fc7dc53c2c" patched

# policy が Retain から Delete に変わっていることを確認
$kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS    CLAIM                      STORAGECLASS   REASON    AGE
pvc-3fdc5920-8595-11e8-a565-06fc7dc53c2c   20Gi       RWO            Delete           Bound     default/mysql-pv-claim-3   gp2-2                    2d
pvc-41fbc5b0-8595-11e8-971c-022ca775d168   20Gi       RWO            Delete           Bound     default/mysql-pv-claim-4   gp2-2                    2d
pvc-440b8688-8595-11e8-a565-06fc7dc53c2c   20Gi       RWO            Delete           Bound     default/mysql-pv-claim-5   gp2-2                    2d

```

OK.

なお、PullRequest しようかと思ったが Github 上のコードだと抜けてしまっている「your-pv-name」というのもあり「'{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'」もJSONパース出来て問題ない。
Hugoにする時の問題?
整理できたらIssue切るか。。。。

https://github.com/kubernetes/website/blob/master/content/en/docs/tasks/administer-cluster/change-pv-reclaim-policy.md