OmniAICreator/Qiita-1.07M huggingface dataset:
iOSアプリ開発用の.gitignoreの管理方法

# 概要
git管理したくないファイルは.gitignoreで管理しているかと思いますが、プロジェクトを作成するたびに生成するのは手間になります。

.gitignoreを自動生成し、さらにカスタマイズしたものをテンプレートとしてgistで管理する方法をまとめます。

1. giboで.gitignoreを自動生成
2. .gitignoreをカスタマイズ
3. .gitignoreをgistにアップロード
4. gistでrawデータのURLを取得
5. wgetでgistから.gitignoreをダウンロード

## giboで.gitignoreを自動生成
[gibo]((https://github.com/simonwhitaker/gibo))という.gitignoreを自動生成するツールを利用します。

```bash
# giboのインストール
brew install gibo

# iOSアプリ開発用の.gitignoreを生成
gibo dump Swift Xcode >> .gitignore
```

## .gitignoreをカスタマイズ
そのままでも十分ですが、自分用に.gitignoreをカスタマイズします。
カスタマイズが不要な場合は、giboだけで十分なのでこの後の手順は不要です。

## .gitignoreをgistにアップロード
カスタマイズした.gitignoreを[gist](https://gist.github.com/)にアップロードします。

自分の場合は以下gistにアップロードしました。
https://gist.github.com/shtnkgm/dfe0a0478a15de11ce93ca6f39223cd5

## gistでrawデータのURLを取得
gistでrawボタンをクリックすると、ファイルのrawデータにアクセスできるので、このURLからwgetで取得します。

<img src="https://qiita-image-store.s3.amazonaws.com/0/113553/770f0872-e0cc-6715-72c2-9fbbf945a8e1.png" width="500px">

ここで注意点としては、gistのrawデータのURLはハッシュ値で管理されており、gistを更新するとURLが変わります。ファイルを更新しても最新のgistを取得するよう、ハッシュ値は取り除いておくと良いです。

```bash
# ハッシュ値あり
https://gist.githubusercontent.com/[user_id]/[gist_id]/raw/[hash_id]/.gitignore
↓↓↓
# ハッシュ値なし（最新のgistを取得）
https://gist.githubusercontent.com/[user_id]/[gist_id]/raw/.gitignore
```

## wgetでgistから.gitignoreをダウンロード

```bash
# wgetで.gitignoreを取得する
wget https://gist.githubusercontent.com/[user_id]/[gist_id]/raw/.gitignore -O .gitignore

# 長いのでbitlyなどで短縮URLにしておくと使い勝手が良いです
wget https://bit.ly/shtnkgmgi2 -O .gitignore
```

# 参考
 - [rcmdnk's blog - GitHubのGistの古いraw urlが無効になっていたので対応してみた](https://rcmdnk.com/blog/2016/04/22/blog-octopress-github-ruby/)
abc 076

B
square1001 は、電光掲示板に整数 1 が表示されているのを見ました。
彼は、電光掲示板に対して、以下の操作 A, 操作 B をすることができます。
操作 A： 電光掲示板に表示する整数を「今の電光掲示板の整数を 2 倍にしたもの」に変える。
操作 B： 電光掲示板に表示する整数を「今の電光掲示板の整数に K を足したもの」に変える。
square1001 は、操作 A, 操作 B 合計で N 回 行わなければなりません。 そのとき、N 回の操作後の、電光掲示板に書かれている整数として考えられる最小の値を求めなさい。

```
#include<iostream>
using namespace std;
int main() {
	int  N, K;
	cin >> N >> K;
	int start = 1;
	for (int i = 0; i < N; ++i) {
		if (start * 2 <= start + K)
			start *= 2;
		else
			start += K;
	}
	cout << start << endl;
	return 0;
}
```
C
E869120 は、宝物が入ってそうな箱を見つけました。
しかし、これには鍵がかかっており、鍵を開けるためには英小文字からなる文字列 S が必要です。
彼は文字列 S' を見つけ、これは文字列 S の 0 個以上 |S| 個以内の文字が ? に置き換わった文字列であることも分かりました。
ただし、文字列 A に対して、|A| を「文字列 A の長さ」とします。 
そこで、E869120 はヒントとなる紙を見つけました。 
条件1：文字列 S の中に連続する部分文字列として英小文字から成る文字列 T が含まれている。 
条件2：S は、条件1を満たす文字列の中で辞書順最小の文字列である。
そのとき、鍵となる文字列 S を出力しなさい。
ただし、そのような文字列 S が存在しない場合は代わりに UNRESTORABLE と出力しなさい。
制約
1≤|S'|,|T|≤50
S' は英小文字と ? から成る
T は英小文字から成る

```
#include <iostream>
#include<string>
using namespace std;
int main() {
	string S, T;
	cin >> S >> T;
	bool flag1 = true;
	bool flag2 = false;
		for (int j = S.size()-T.size(); j >=0; --j) {
			flag1 = true;
			if (S[j] == T[0] || S[j] == '?') {
				for (int k = j; k < T.size() + j; ++k) {
					if (S[k] == '?'||S[k]==T[k-j]) {
						continue;
					}
					else {
						flag1 = false;
						break;
					}
				}//可能であることが分かったのでSの一部をTに変える作業
				if (flag1) {
					for (int k = j; k < j + T.size(); ++k) {
						S[k] = T[k - j];
					}
					flag2 = true;
					j -= 100;
				}
			}
		}
	//そもそも可能かどうか.可能なら?を全部aに変える
	if (flag2) {
		for (int i = 0; i < S.size(); ++i) {
			if (S[i] == '?') {
				S[i] = 'a';
			}
		}
		cout << S << endl;
	}
	else {
		cout << "UNRESTORABLE" << endl;
	}
}
```
JavaScriptでインスタンスのprivateプロパティを擬似的に実装する

JavaScriptでprototype継承を行う際、各インスタンスが内部的に保持しておきたいプロパティを、次のように外部から通常アクセスできないように隠蔽する方法があります。
これにより、他の実装者が手軽にオブジェクトの改変を行ってしまうことを防ぐことができます。

```javascript:sample.js
(function(){
    // 呼び出し元をチェックする関数.
    // このオブジェクトにアクセス可能なスコープからしか、エラーが発生しない呼び出しをできない.
    var chk = function(c) {
       if (c !== chk) { throw new Error("illegal access.") }
       return true
    }
    window.Sample = function() {
       // 内部的なプロパティ
       var pvt = {
           count: 0,
       }
       // 内部的なプロパティを取得するメソッド. 
       // 引数にchkオブジェクトを渡さないといけない点がポイント.
       this._p = function(c) { return chk(c) && pvt }
    }
    Sample.prototype.increment = function() {
       this._p(chk).count++
    }
})();
// 外部からの呼び出し
var sample = new Sample()
sample.increment() // ok
sample._p().count++ // error

```
- ポイント
    - 特定のスコープでしかアクセスできないオブジェクトを、メソッド呼び出しの認証のように使っています。
    - 同様の方法でprivateメソッドの実装が可能です。
    - ES2015以前の仕様でも実装可能です。

- 注意
    - 当然ながら、オブジェクトの挙動を変更する方法は他にいくらでもあるため（上の例だと、window.Sampleそのものを上書きするなど）、あくまでプロパティを手軽にアクセスしたり、変更したりすることを防ぐための措置です。
    - 対象オブジェクト（上の例だとnew Sample()）をコンソール出力しても、隠蔽しているプロパティが表示されないため、デバッグに困ることがあります。
    - prototypeを使う必要がなければ、privateなプロパティの実装はクロージャを使えば簡単に済みます。上記の手法はprototypeを定義しつつ、各インスタンスごとのprivateプロパティを保持する場合に役立ちます。
abc 075

B
H×W のマス目が与えられます。 
入力において、全てのマスは文字で表されており、.は空きマス、 # は爆弾マスに対応します。 
マス目は H 個の文字列 S1,…,SH で表されます。 
文字列 Si の j 文字目は、マス目の上から i 番目、左から j 番目のマスに対応します。(1≦i≦H,1≦j≦W) 
イルカは各空きマスの上下左右および斜めの 8 方向で隣接しているマスに爆弾マスが何個あるか気になっています。 
そこで、各空きマスに対応する . を、その空きマスの周囲8方向に隣接するマスにおける爆弾マスの個数を表す数字で置き換えることにしました。 
以上の規則で置き換えられた後のマス目を出力してください。

```
#include<iostream>
#include<string>
using namespace std;
int main() {
	int h, w;
	string s[50];
	cin >> h >> w;
	for (int i = 0; i < h; ++i) {
		cin >> s[i];
	}
	const int dx[8] = { 1,0,-1,0,1,-1,-1,1 };
	const int dy[8] = { 0,1,0,-1,1,1,-1,-1 };
	for (int i = 0; i < h; ++i) {
		for (int j = 0; j < w; ++j) {
			if (s[i][j] == '#') {
				continue;
			}
			int num = 0;
			for (int d = 0; d < 8; ++d) {
				int nx = j + dx[d];
				int ny = i + dy[d];
				if (nx < 0 || nx >= w)continue;
				if (ny < 0 || ny >= h)continue;
				if (s[ny][nx] == '#') {
					num++;
				}
			}
			s[i][j] = char('0' + num);
		}
	}
	for (int i = 0; i < h; ++i) {
		cout << s[i] << endl;
	}
	return 0;
}
```
文字列と数字の扱いに慣れていきたいな

C
自己ループと二重辺を含まない N 頂点 M 辺の無向連結グラフが与えられます。
i(1≦i≦M) 番目の辺は頂点 ai と頂点 bi を結びます。 
グラフから辺を取り除いたとき、グラフ全体が非連結になるような辺のことを橋と呼びます。
与えられた M 本のうち橋である辺の本数を求めてください。
ノート
自己ループ とは、ai=bi(1≦i≦M) であるような辺 i のことをいいます。 
二重辺 とは、ai=aj かつ bi=bj(1≦i<j≦M) であるような辺の組 i,j のことをいいます。 
無向グラフが 連結 であるとは、グラフの任意の二頂点間に経路が存在することをいいます。 
制約
2≦N≦50
N−1≦M≦min(N(N−1)⁄2,50)
1≦ai<bi≦N
与えられるグラフは自己ループと二重辺を含まない。
与えられるグラフは連結である。

```
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<map>
#include<math.h>
#include<queue>
#include<deque>
#include<stack>
#include<cstdio>
#include<utility>
#include<set>
#include<list>
#include<cmath>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
const int INF = 1e9;
int N, M;
bool g[51][51];
bool visited[51];
void dfs(int v) {
	visited[v] = true;
	for (int v2 = 0; v2 < N; ++v2) {
		if (g[v][v2] == false)continue;
		if (visited[v2] == true)continue;
		dfs(v2);
	}
}
int a[51], b[51];
int main() {
	cin >> N >> M;
	for (int i = 0; i < M; ++i) {
		cin >> a[i] >> b[i];
		a[i]--; b[i]--;
		g[a[i]][b[i]] = g[b[i]][a[i]] = true;
	}
	int ans = 0;
	for (int i = 0; i < M; ++i) {
		g[a[i]][b[i]] = g[b[i]][a[i]] = false;
		for (int j = 0; j < N; ++j)visited[j] = false;
		dfs(0);
		bool bridge = false;
		for (int j = 0; j < N; ++j) {
			if (visited[j] == false) {
				bridge = true;
			}
		}
		if (bridge)ans += 1;
		g[a[i]][b[i]] = g[b[i]][a[i]] = true;
	}
	cout << ans << endl;
	return 0;
}
```
openpose-plus をコンパイルする(動作までは未確認)

推論部分が C++ で書かれている openpose-plus を動かしたいですね

https://github.com/tensorlayer/openpose-plus

動作までは確認できませんでしたが, コンパイルまでは確認しました.

## 環境

* Ubuntu 16.04
* CUDA 9.0(CUDA 9.2 でも動くかも)
* cuDNN 7.3, TensorRT4
* conda で python 3.6 環境
* CMake <= 3.10(3.11 以降だと openpose-plus の CMake の書き方が悪いのか No SOURCE given to target というエラーが出ます)

TensorRT は deb パッケージをインストール後, sudo apt update し, sudo apt install libnvinfer-dev で開発ライブラリ(NvInter.h)をインストールしておく必要があります.


Ubuntu 16.04 では OpenCV3 は apt では提供されないため, conda のパッケージ, もしくは自前で OpenCV3 をビルドします.
(自前 OpenCV ビルドだと, CUDA のビルドをうまく処理しないといけないので注意です)

conda の場合は以下です.

```
$ conda install -c conda-forge opencv
```

`opencv_DIR` で cmake OpenCV package のパスを指定して cmake を bootstrap するように Makefile を書き換えます.

```
...
cmake_targets:
        mkdir -p $(BUILD_DIR)
        cd $(BUILD_DIR); opencv_DIR=$HOME/miniconda3/envs/py36/share/OpenCV cmake ...
...
```

また, Ubuntu では file system は case sensitive にしているので, 
`cmake/openpose-plus.cmake`, `cmake/example.cmake` で 

find_package(opencv) 

となっていたら

find_package(OpenCV)

に修正しておきます. (PR は取り込まれているので最新 repo なら修正不要:  https://github.com/tensorlayer/openpose-plus/pull/102 )

必要に応じて `cmake/openpose-plus.cmake` での CUDA_RT のパスを変えます.

https://github.com/tensorlayer/openpose-plus/blob/master/cmake/openpose-plus.cmake#L8

すでに `cmake-build` があればそれを消して, 再度 cmake && make します.

```
$ make
```

gflags が見つからないと出ますが, apt で入る libgflags-dev では gflags の CMake パッケージがないので warning が出ますがとりあえずビルドできるはずです
(https://github.com/gflags/gflags/issues/248)


## TODO

* サンプルの実行まで行う(pretrained model のセットアップやらが必要だがそのあたりドキュメントがない. openpose から持ってきて freeze すればいいのかな?)
* openpose-plus のコード自体は Apache 2.0 ライセンスで商用利用も可能だが, OpenPose 自体は別のライセンスなので, OpenPose 由来のモデルデータを使っていたり, openpose-plus に OpenPose のコードが含まれている場合は注意が必要なので, ライセンス周りクリアにする.
ワーカースレッドで処理をキューに管理して順次処理を行う。

以下の記事で実装方法を紹介してくれています。
[別スレッドでキュー管理(Handler, Looper, HandlerThread)]
(http://daichan4649.hatenablog.jp/entry/20111004/1317724067)

このサイトでは、「other」という名前のワーカースレッドを作成して、そこでキュー管理し、処理を順次実行するようにしています。
ProgateでHTML、CSSの道場にチャレンジ（2）

#HTML、CSSの道場（中級）をやってみた！
引き続きProgateさんでHTML、CSSの力試ししています
中級道場、今回はヘッダー部分の作成です

ヘッダーの作成は初級の道場でもやった気がするのですが
今回はfloatあたりで少しマニアックなことをしているようです

今回の課題は以下のとおりです
**●ヘッダーのレイアウト構成を考える**
**●要素の透過をopacity以外で行う**
**●行間の幅を指定する**
**●aタグのクリックできる範囲を広げる**

いってみよう！

##ヘッダーのレイアウト構成を考える
比較的シンプルなお題です

課題では左端に社名（ロゴ）、右端にログインのリンクを作成します
ヘッダー⇒コンテナ⇒左側クラス、右側クラス
こんな感じで外から内側への構成です

```html
 <header> ←　ヘッダー全体
    <div class="container">　←　内側の容器・・としておく　
        <div class="header-left">　←　ヘッダー左側の容器
          <img class="logo" src="●●△△.jpg">
        </div>
        <div class="header-right">　←　ヘッダー右側の容器
          <a class="login" href="#">ログイン</a>
        </div>
    </div>
   </header>
```
ロゴとログインリンクをそれぞれ配置するのはCSSで行う

```css
.header-right {
  float: right; ←　要素を右寄せする
}
.header-left {
  float:left;　←　要素を左寄せする
}
```
左右ともに指定しないと横並びにならない
私は右しか記述しなかったため、ロゴとログインの文字がずれていました

##要素の透過をopacity以外で行う
前回の課題では「opacity」プロパティで要素を透過してました

今回は「rgba」プロパティを使用します

両者の違いは
opacity：要素の中身全てを透過させる
rgba：背景色のみを透過させる

どうして？と思い、解説を読んでみると納得
「社名であるロゴは透過させたくない。ヘッダーの背景のみ透過させたい」
なるほど　そういう使い分けか～

rgbaの「rgb」はRGBカラーの意味で、最後の”a”で透過率を指定
要は前半３つの引数が透過させたい色で、4つ目の引数で透過率を指定してやる

```css
header {
  height: 65px;
  width: 100%;
  background-color: rgba(34, 49, 52, 0.9);　←　RGB(34,49,52)を0.9の透過率にする
}
```
##行間の幅を指定する
「line-height」プロパティは行間の幅を指定できます

ここでは少し工夫して、ロゴの位置がヘッダーの縦中央に来るために使用してます

```css
.header-right a{
    display:block;
    line-height:65px;
    padding:0px 25px 0px 25px;
    color:white;
}

ヘッダーの高さが65pxで指定されているので上記の記述でロゴがヘッダーの縦中央に表示される
header {
  height: 65px;
  width: 100%;
}
```
##aタグのクリックできる範囲を広げる
前回の課題でもやったようにaタグは何もしなければインライン要素なので
文字をきっちりクリックしないとリンクに飛んでくれません

なのでここで「必殺！インライン要素をブロック要素へ！」を行います

```html
<div class="header-right">
    <a class="login" href="#">ログイン</a>
</div>
```
このaタグをcssでブロック要素に変身させます

```css
.header-right a{
    display:block;　←　ブロック要素に変身！
    line-height:65px;　←　ログインもヘッダーの縦中央に配置する
    padding:0px 25px 0px 25px;
    color:white;
}
```
とりあえず合格できたけど、今回は仕様書に記述がない部分で判定に引っ掛かりました

```css
header {
  height: 65px;
  width: 100%;
  background-color: rgba(34, 49, 52, 0.9);
  position: fixed;　←ココ！
  top: 0;　←ココ！
  z-index: 10;　←ココ！
}
```
矢印で指してる箇所は「要素の検証」を使ってお手本をコピペしました
そしたら合格できたけど・・
なんだか不可解な気になった今回の力試しでした((+_+))
AWS Kinesis 初心者向けの考え方

# AWS Kinesis
ネタざっくり備忘録

## AWS Cli
Kinesisがどういうやり取りしてるかは、AWSCLI実行するのが一番わかりやすい。
※公式https://docs.aws.amazon.com/ja_jp/streams/latest/dev/fundamental-stream.html

## 細かい動作が書いてあるところ（読み取り時の細かい挙動とか）
https://aws.amazon.com/jp/kinesis/data-streams/faqs/

## Streamって何
データが溜まってるところ。
Streamに溜まるデータはパーティションキーによってシャードに割り当てられる（シャード数によって割り当てられるシャードが変わる）

## シャードって何
Streamにたまっているデータをコンシューマに渡すための口。
Streamを作るときにシャードの数を指定できる。
Stream内のデータを取得するためのがシャードが決まっている（というかStreamにデータを登録する時点でそのデータがどのシャードで取得できるかが割り当てられる）
cli使うと分かるけど、データの取得はシャードに対して行う。

## Kinesisのシャードの割り当てのルール
https://qiita.com/ssossan/items/8acfb380493cbfc7fbee

Patition key の値に応じてどのシャードを使うかが割り当てされる。
※シャードを増やした状態でawscli使ってput-recordsした結果見ると感覚が掴みやすい。

## シャードの読み込み位置の話

シャードイテレータを取得する時の指定の仕方で、シャードの最初からとか、指定したシーケンスの続きからとかが指定できる。

※aws cliだと↓の赤字部分

```
aws kinesis get-shard-iterator --shard-id shardId-000000000000 --shard-iterator-type TRIM_HORIZON --stream-name Foo
```

[KinesisClientLiblary(KCL)におけるLATESTとTRIM_HORIZONの挙動について](https://qiita.com/its/items/2913858e075fa8bdaf55)

## チェックポイント
DynamoDBにシャード単位？で、どこまで読み込んだかのシーケンスが記録されていて、シーケンスを記録するアクションがチェックポイント。
チェックポイントに記録されているシーケンス番号より古いシーケンス番号でチェックポイントを記録しようとすると実行時例外。
sympyによる導関数の算出・描画

### 導関数算出・描画
- 細かい設定等は後で順々に調べていくとして、まずは一番シンプルに。
 
```py
import sympy as sy

x = sy.Symbol('x')

f = (1 * x**3) + (0 * x**2) + (-2 * x) + (0)
print f

g = f.diff()
print g

sy.plot(f, g, (x, -2, 2))
```
```txt:実行結果
hogehoge$ python plot2.py 
x**3 - 2*x
3*x**2 - 2
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/135051/345352d4-9070-df8d-ab83-fc5d2abacbbf.png)
### 参考記事
- https://qiita.com/sci_Haru/items/49ad277b204004d848bf
- http://taromaru-kun.hatenablog.com/entry/2015/03/14/214822
- https://showa-yojyo.github.io/notebook/python-sympy/plotting.html
DeepLearning勉強メモ

### Docker
DockerならNvidiaのドライバーさえ入っていれば、CUDA等をインストールしなくてもGPU版のtensorflow等が使えるようになる。
* インスタンス内ではディレクトリは共有されない。明示的にマウントする必要あり
* -p 8888:8888でポート変換できる
* コンテナ内にインストールするにはDockerfileを用いてインストール済み環境を生成する。
## Dockerfileの生成
```Dockerfile:Dockerfile
FROM tensorflow/tensorflow:latest-gpu
RUN  apt-get update \
  && apt-get install -y wget fish\
  && rm -rf /var/lib/apt/lists/*
```
イメージ生成
`$ nvidia-docker build .`
最後に出てくる文字列がイメージ名になる
`$ nvidia-docker run -v $HOME/github/models/:/foo -p 8888:8888 -it b74de41c2d27 fish`

`nvidia-docker run -v $HOME/github/models/:/foo -it 2f246b82e8f7 fish`

### DeepLab v3
Python2で動かすこと。⑽⌒
Python3だと`testBuildDeepLabWithDensePredictionCell`でエラーが出る。
* checkpoints, which is a format dependent on the code that created the model.
* SavedModel, which is a format independent of the code that created the model.

チェックポイントのネットワークと学習するネットワークは形を合わせる。
"deeplab/core/feature_extractor.py"にサポートするネットワーク名が載っている

```bash
cd /foo/research/
set -x PYTHONPATH :(pwd):(pwd)/slim $PYTHONPATH
```

公式のFAQが転移学習時のパラメータ設定方法とか説明してあって非常に親切
https://github.com/tensorflow/models/blob/master/research/deeplab/g3doc/faq.md

##### データセットの内訳
- train.txt：ネットワークのパラメタ（重み）を学習するデータ
- val(trainval).txt　：学習時に定期的にテストし、過学習を起こしていないかチェックするデータ
- test(val).txt ：本番テスト用データ

```bash
# データセットのダウンロード
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar
````


### TensorFlow
```python
# パラメータの追加.argparseに似ている.
FLAGS = tf.app.flags.FLAGS
# FLAGSにパラメータが追加される.このメンバ変数は,別のスクリプトでもグローバルに共有される.
tf.app.flags.DEFINE_enum('image_format', 'png', ['jpg', 'jpeg', 'png'],
                         'Image format.')
```
tfのsaverでモデルをリストアするときは,
`model.ckpt`
or
```
model.ckpt-15000.data-00000-of-00001
model.ckpt-15000.index
model.ckpt-15000.meta
```
があるときは
`demo.ckpt-15000`と,meta等の前までのファイル名を指定

`*.pb`: フリーズした重み付きモデル.プロトコルバッファファイル.
WSLでターミナルが上がらなくなった事例紹介

# 概要
WSLで自動起動される`/mnt/c`等のマウントオプションを`/etc/wsl.conf`で調整できることを知り、設定を行ったところ、wsl-terminalが上がらなくなってしまいました。
その時の原因と復旧方法の紹介です。

# 環境
* Win10 Home 64bit Ver1803 Build17134.320
* Ubuntu 16.04.5

```shell-session:ディストリビューション一覧
>wslconfig /l
Windows Subsystem for Linux ディストリビューション:
Legacy (既定)
```

# 背景
なぜ調整しようと思ったかは、記事「WSLでもgitでsshを使いたい」への[コメント](/angel_katayoku/items/9d95241af81dc4466ee1#comment-f4aa5d82c47a7e4261fb)をご覧ください。

# 原因
`/etc/wsl.conf`で調整できる、drvfsのマウントオプション ( `[automount]`セクションの`options`パラメータ ) に、`fmask=177`という記述をしてしまったせいでした。

wsl-terminalが上がらないため、なぜマズかったのかは推測になるのですが、`fmask=177`というオプションをつけると、Cドライブ,Dドライブ,…上のファイルは全て実行権が消えてしまいます。
自分の環境ではホームディレクトリをDドライブに置いていて、おそらくwsl-terminalが参照するファイルの中に実行権を要するものがあることで、起動時の初期化処理に失敗するようになったのではないか、と推測しています。

# 復旧
復旧のためには次の2つの処理が必要です

1. `/etc/wsl.conf`の消去、或いは内容の適正化
2. マウント済み drvfs のアンマウント或いは、適切なマウントオプションでの再マウント

2.については、最悪PCの再起動で良いのですが、問題は1.です。なぜなら wsl-terminal が上がりませんから。
そこでどうするかと言うと、Windowsのコマンドプロンプト(`cmd.exe`)を起動し、そこから`wsl`コマンドでWSLを起動し、そのままシェルを使いました。
※次の図を参照のこと

![image.png](https://qiita-image-store.s3.amazonaws.com/0/74396/3da86efc-14f8-3fdd-d6e7-3578492c12e0.png)


後は`sudo rm -f /etc/wsl.conf`で削除するなり、`sudo mv /etc/wsl.conf{,.bak}`で別ファイルに退避するなりご自由に。
※2.についてもumountコマンドを実行すれば、PC再起動までせず対処できます。

# 終わりに
いきなり起動しなくなるためビビりますが、慌てず騒がず対処を探しましょう、的な。
…とは言え、何もエラーメッセージを残さず画面が消えるってのは、ちょっと頂けないかなと思います。
※wsl-terminalの設定項目を1通り見たのですが、異常終了時でも(エラー等保全のために)画面を残すようなオプションは無さそう…。SSHクライアントソフトであるputtyなんかはそういうのちゃんとあるんですけどね。
tmux cheat sheet

# tmux cheat sheet
Linuxのターミナルマルチプレクサーであるtmuxで、個人的によく使うコマンド忘備録。
ターミナルマルチプレクサーとは何ぞやといったことや、tmuxの基本的なことは以下を参照するといいと思う。

[第127回　ターミナルマルチプレクサ tmuxを使ってみよう](http://gihyo.jp/admin/serial/01/ubuntu-recipe/0127)

## tmuxコマンド
|コマンド           |説明　　　　　　　 |
|-----------------|------------------|
|tmux             |tmux起動          |
|tmux ls          |起動済みセッションを一覧表示|
|tmux attach [-t target-session]     |起動済みセッションにアタッチ。-tで特定セッションを指定可能。target-sessionに指定する名前はtmux lsの出力で確認。|

## Key Bindings
|コマンド          |説明　　　　　　　 |
|-----------------|------------------|
|Ctrl-B C         |新規Window作成          |
|Ctrl-B N or P    |次 or 前のWindowに変更  |
|Ctrl-B D         |セッションからデタッチ。デタッチしたセッションは、`tmux ls`で確認、`tmux attach`で再接続。|
|Ctrl-B [         |コマンド実行後、矢印キーで画面をスクロール。`q`で終了。 |
|Ctrl-B "         |ペインを上下に分割          |
|Ctrl-B %         |ペインを左右に分割          |
|Ctrl-B 矢印      |ペイン間を移動          |
|Ctrl-B X         |現在のペインを閉じる          |

## ちょっと高度な機能
分割したペインで同時に同じ操作を実行するには、`Ctrl-B` → `:` → `set-window-option synchronize-panes on`。これで、一つのペインで入力したコマンドが別のペインでも同時に実行される。無効にするときは、`Ctrl-B` → `:` → `set-window-option synchronize-panes off`。

|コマンド          |オプション         |説明   |
|-----------------|------------------|-------|
|Ctrl-B :         |                  |       |
||set-window-option synchronize-panes on|ペイン間でコマンド同期実行ON|
||set-window-option synchronize-panes off|ペイン間でコマンド同期実行OFF|
SRE#1


##SRE : Site Reliability Engineering
Googleが提唱・実践しているシステム管理とサービス運用の方法論:bulb:

---
## 1.1 サービス管理へのシステム管理者のアプローチ

---
従来のDevOps : 「開発」「運用」で分かれる

- Dev
  - 好きなものを好きなときにローンチしたい
- Ops
  - 一度動いたシステムは一切変更したくない

>対立しがち:cry:

---
### 1.2 サービス管理へのGoogleのアプローチ（SRE）
Googleはソフトウェアエンジニアを採用して、いままでシスアドが手作業で行ってきた作業を遂行するシステムを構築するようにした。

---

→ ソフトウェアエンジニアが運用チームの設計

1. 手作業でタスクをこなすことにすぐに飽きてしまう
2. 代替するソフトウェアを書くスキルセットを持つエンジニアチーム


すべてのSREに共通するのは、複雑な問題を解決するソフトウェアシステムの開発に対する信念と適正。


---

`常にエンジニアリングをしないと、運用の負荷が増大し続ける`

SREに対して、チケット、オンコール、手作業といった「運用」業務の合計を50%以下にするように上限を設けた。


---
### 1.3 SREの信条(責任を持つ領域)

- サービスの可用性
- レイテンシ
- パフォーマンス
- 効率性
- 変更管理
- モニタリング
- 緊急対応
- キャパシティプランニング


---
#### 1.3.1 エンジニアリングへの継続的な注力の保証

- 運用50%
- 残りはコーディングを伴うプロジェクト作業

---
目標

- 運用負荷のオーバーフローが起こらない
- プロダクトが過大な運用負荷を生じさせない

SREと開発者がお互いに目標を支持する:thumbsup:
50%をオーバーするようであれば、50%以下になるまで開発サイドにも手伝ってもらう。

---

ページャー（アラートのこと）が無くても、インシデントについてポストモーテムを書くべき

- モニタリングの欠陥
- 問題を明らかにする

---
#### 1.3.2 SLOを下回ることなく、変更の速度の最大化を追求する

---
`エラーバジェット（予算）`
信頼性の目標を100%にするのは間違っているという考え。
ユーザとサービスの間には数多くのシステムが存在するため可用性が下がる。
100%にするための苦労が見合わない

---
`信頼性の目標をどう考慮するか`

- ユーザが満足する可用性のレベル
- 可用性に満足できないユーザへの代替策
- 可用性のレベルを変更した場合にプロダクトの利用に変化が起こるか

可用性のターゲットを決める


---
`100% - 可用性 = エラーバジェット（予算）`

- 開発:ローンチのリスクに使う
- SRE:エラーバジェットを節約

→ 素早いローンチに向けた最適化

---
エラーバジェットを使うことでSREの目標は
`「サービス障害を0にすること」ではなく「機能のリリース速度を最大化するためにエラーバジェットを使うこと」`になる。

サービス障害は悪いことではなく、予想済みの部分。これをコントロールする。

---
#### 1.3.3 モニタリング

システムの健全性と可用性を追跡。

アラートメールは効果的ではない。

- 人間がメールを読み、何らかの対応アクションの必要性を判断しなければならないようなシステムは、根本的に欠点を抱えている
- ソフトウェアが解釈を行い、人間はアクションを行う必要があるときのみ通知を受けるべき。

---
モニタリングの出力

1. アラート
  即座にアクションを行う
2. チケット
  即座である必要はない
3. ロギング
  人間が見る必要はないもの

---
#### 1.3.4 緊急対応
信頼性

- 平均故障時間(mean time to failure)
- 平均修復時間(mean time to repair)

`予めオンコール手順書を作って練習することでMTTRを短縮`

---
#### 1.3.5 変更管理

サービス障害の70%はシステムの変更によって生じている。

- 漸進的なロールアウトの実装
- 高速かつ正確な問題の検出
- 問題が生じた際の安全なロールバック

これらを自動化することで、リリースの速度と安全性が高まる

---
#### 1.3.6 需要の予測とキャパシティプランニング
- 自然な成長
- 突発的な成長

ステップ

- 自然な需要の正確な予測。リードタイムも考慮
- 突発的な需要の発生源を織り込む
- リソースとサービスのキャパシティ把握のための定期的な負荷テスト

---
#### 1.3.7 プロビジョニング

必要に応じてリソースを提供できるように準備しておくこと。
変更管理とキャパシティプランニングの組み合わせ。
すばやくかつ必要な場合のみ行う。

---
#### 1.3.8 効率とパフォーマンス
`リソースは需要（負荷）、キャパシティ、利用率の関数`
レスポンス速度のキャパシティのターゲットを満たすようにプロビジョニングを行う。
パフォーマンスを改善するためにモニタリングと改修に努め、キャパシティを追加して効率を改善する。
Pythonで文字列クラスを継承する方法

strを継承するには`__init__`ではなく`__new__`を使う必要があります。

```log.py
class Log(str):
    def __new__(cls, id_: str, val: str):
        self = super().__new__(cls, val)
        self.id: str = id_
        return self


log1 = Log("id1", "test")
print(log1, log1.id)

```

```結果
test id1
```
Vuforia の External Camera (File Driver) を使う

## 概要

[前回の記事](https://qiita.com/mironal/items/f15464071e8a1a22e3d0) では Vuforia の File Driver をビルドしました.

今回の記事では実際に Unity のプロジェクトに組み込んで外部カメラとしてローカルの画像ファイルを読み込ませたいと思います.

出来上がったものがこちらになります(3分クッキング的な).

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17704/e2043eca-59e2-5acc-ca8c-0ed35fa42b97.png)

[動画はこちらから御覧ください](https://youtu.be/HlKqb6DeW54)

[作業したプロジェクトはこれです](https://github.com/mironal/VuforiaExternalCameraSample)

※ ファイルサイズの関係で一部のみアップロードしています.

## ノウハウ

基本的には Vuforia の公式サイトにある [Building and Using the File Driver Sample](https://library.vuforia.com/articles/Solution/file-driver.html) を動かしただけなのでそんなに難しいことは無いのですがいくつか気がついた点を書いていきます.

### Unity Editor では普通のカメラを使う

FileDriver は UWP もしくは Android 上でしか動きません(2018/10/08現在). そのため、 UnityEditor 上で動かそうとすると警告が表示されてしまいます.

なので UWP として実行しているときだけ FileDriver を使うように以下のようにコードを変更しました. Android の場合もよしなに `#if` すれば大丈夫です.

```cs
    void Awake()
    {
#if UNITY_WSA && !UNITY_EDITOR
        string filePath = Application.streamingAssetsPath.Replace("/", "\\");

        userData = new FileDriverUserData()
        {
            sequenceDirectoryAbsolutePath = filePath
        };

        userDataPrt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(FileDriverUserData)));
        Marshal.StructureToPtr(userData, userDataPrt, false);


        VuforiaUnity.SetDriverLibrary("FileDriver.dll", userDataPrt);
#endif
        VuforiaRuntime.Instance.InitVuforia();
    }
```

### 常に同じ画像を使う

`sequence.txt` の `NumberOfImage` を 1 にして `image00000.png` という画像をおいておけばその画像だけを永遠にループし続けるので静止画を認識させるときに使えます.

### アニメーションの画像を作る

こちらは Photoshop の機能なのですが、2つのコマから間のコマを作って出力する事ができます. `photoshop タイムライン` とかでググるとやり方が出てきます.

### ↑ で作った画像を `image00000.png` 形式にリネームするのがめんどい

こうやりました.

```js

const fs = require("fs");
const regex = () => /.+ ([0-9]+)\.png/
const pad = 5
let dry = true

/**
 *
 * @param {string} path
 */
const toMap = path => {

  const re = regex()
  const match = re.exec(path)
  const valid = match && typeof match[1] == "string" && !isNaN(parseInt(match[1], 10))
  return {
    valid,
    path,
    replacePath: valid ? `image${match[1].padStart(pad, "0")}.png`: null,
    match: valid ? parseInt(match[1]) : null
  }
}

fs.readdirSync(".", { encoding: "utf8" })
  .map(toMap)
  .filter(f => f.valid)
  .sort((a, b) => a.match - b.match)
  .forEach(f => {
    console.log(`Rename: "${f.path}" => "${f.replacePath}"`)
    if (dry === false) {
      fs.renameSync(f.path, f.replacePath)
    }
  })

```
String.substringの実行結果メモ

```java
public class Sample {
	public static void main(String[] args) {
		String str = "あいうえお";
		System.out.println(str.substring(0,3)); // -> あいう
		System.out.println(str.substring(3));   // -> えお
		System.out.println(str.substring(0, str.indexOf("う"))); // -> あい
	}
}
```
substringの動きをいつも覚えられなくて毎回スニペット書いているので、書いておきます。
CloudBreak 2.7 built HDF 3.1 has error: 'kerberos-provider' could not be found. 

# Error
CloudBreak 2.7 built HDF 3.1 has error: 'kerberos-provider' could not be found.

```
    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'loginIdentityProvider': FactoryBean threw exception on object creation; nested exception is java.lang.Exception: The specified login identity provider 'kerberos-provider' could not be found.
```

# Solution
The reason is HDF 3.1's blueprint has problem:

nifi.security.user.login.identity.provider= is set to kerberos-provider but that provider doesn't exist in login-identity-providers.xml, or is commented out
Nilエラーの解決方法

顧客のプロフィールページでバグが発生しています。
プロフィールページをクリックするとNilエラーが発生して
困っています。

英単語のスペルチェックは行ったので、
基本的なミスではなさそうなのですが…。

Nilエラーの解決方法などの事例なども
教えて頂ければ幸いです。

<img width="671" alt="スクリーンショット 2018-10-08 15.19.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/299509/90717c86-0cfd-a0aa-41ec-0c2035d882ed.png">

<img width="662" alt="スクリーンショット 2018-10-08 15.19.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/299509/5fc90e45-10c7-c75e-628d-5a750cefcb9a.png">
pandas で groupby した後のはなし

#pandas で groupby する話

公式サイト：[pandas.DataFrame.groupby](https://pandas.pydata.org/pandas-docs/version/0.22/generated/pandas.DataFrame.groupby.html)

Qiita [Pandas の groupby の使い方](https://qiita.com/propella/items/a9a32b878c77222630ae)

Qiita [Pandasでデータ集計をする際に最低限覚えておきたいメソッド](https://qiita.com/kyo-bad/items/f5ddb7e4b8e7ad9103c5)

とっても便利でパワフルなpandasのgroupbyですが、この関数の返り値がオブジェクトなのが問題です。というか、僕にとっては問題でした。

#pandas で groupby した後のはなし

```python
print(data.groupby(['col1', 'col2']))
```
した時に表示されるものの絶望は忘れません。

多くのチュートリアルは、data.groupby(['col1', 'col2'])の後に、.mean() .max() .sum() などの処理をする前提で書かれています。

```python
print(data.groupby(['col1', 'col2']).mean())
```
とかすると、中身のデータは平均化されるけど、とりあえず見ることはできます。

ちゃんと公式の[マニュアル Group By: split-apply-combine](http://pandas.pydata.org/pandas-docs/stable/groupby.html)に他の処理方法が書かれてます。


他にもstackoverflowを漁っていると lambda を使う面白い記事がありました
元記事は見失ったのですが、僕が書いたプログラムの一例です。

とある生放送プラットフォームの視聴者側の会話やアイテムのログのdataframeからの抽出です。

Dataframeのdfでcol:idol_nameがmenberに含まれるものを抽出して、さらに視聴者のuseridとその視聴者のpointを選択。
そこから、groupbyのuseridにして、user_idごとの合計値sum()を計算します。
ここまではごく普通のgroupbyなのですが、ここからさらに、pointの合計値から足切り（> limit）をするために、.loc[lambda]を使ってます。
.loc[lambda]を知るまでは、.sum()以降を二行に分けて、無駄に変数を多く用意していました。

```python
df[df["idol_name"]==menber][["userid","point"]].groupby(by=["userid"]).sum().loc[lambda df2: df2["point"]> limit].sort_values(by=["point"]).index.tolist() 
```

誰かの幸いになればいいとおもっています。
TCP通信ネタ

# TCP通信ネタ

TCP関係備忘録

## 自分Github
https://github.com/KosigayaSuguru/sample-project/tree/master/test-socket
※細かい挙動の確認は↑の README.md 参照


## closeされたsocketへの動作について
https://okwave.jp/qa/q7163796.html

socket.close()はFINの送信を行っているのだと思われる。
実際にclose()を実行すると、close()した時点でTCPのステータスが、
自分:FIN_WAIT2
相手:CLOSE_WAIT
になる。

ゆえに、相手側はwrite()してもエラーにならない。（CLOSE_WAITなので、相手側的には通信を終わらせるつもりがない。）
※でも2回witeするとエラーになる。。※※自分github参照
read()した場合、終端が返ってくる。（相手が通信を終わらせるつもりなのがここで分かる）

相手がreadブロックしている際にclose()以外（つまりFINの送信以外）の方法で強制終了させると、read側でそれに応じた例外が出る。

close()実行後、相手がwrite()した場合、TCP的にはそこで通信が終了している。
自分FIN_WAIT2,相手CLOSE_WAITの状態から、自分LISTENINGのみにかわる。
相手がもう一度writeすると、相手側で例外が発生する。

自分githubのまとめも参照。


## Socket
通信相手が切ったことは検知できないので、定期的に監視の電文を送る監視スレッドが必要。


## Stream
Writerを使うと扱いの単位が文字単位になり、バイトを使った厳密な操作ができないので注意。


## InputStream.read()でブロックされていることに気がつかず、躓いてしまった
http://redfreshet.com/2015/11/01/java_inputstream_read/
※readブロックを解除するのは通信相手のflush()かclose()らしい（flush(の方は未確認)）


## Javaの実装の注意点
http://majimem.hatenablog.com/entry/2014/06/11/165732
http://axe1lyze.blogspot.jp/2011/08/java.html?m=1
InputStreamをOutputStreamより先にgetする（もしくはその逆）と、良いことあるかも。（read()が動くようになるかも。。）


## Javaの実装の注意点２
close()した後、相手との通信状態によっては、readブロックの部分で例外が吐かれる可能性がある。
close()がコールされたことを管理するフラグを持たせ、closeのフラグが立っている場合は例外の出力を抑止するなどの小技が必要。。
FlaskをPycharmでhtmlとcssを使用してみた。

みなさん、こんにちは。中川([@naka33321](https://twitter.com/naka33321?lang=ja))です。最近、Flaskを始めました。日本でのweb開発では、pythonよりもrubyの方が主流で人気もあると思いますが、海外ではpythonもweb開発で結構使われているようです。pythonはまだ日本では浸透していないのでpython自体は海外のサービスで学習しました。pythonのweb開発では、Flaskが使われたりしているのですが、日本での情報が少ないために情報収集に少してこずったのですが、pythonも海外のサービスで学習したのでFlaskも海外のサービスで学習しようとい無事に少しずつできるようになっています。
<h2>開発環境はPycharmを</h2>
私は、基本pythonの開発環境はpycharmでしています。英語で書かれているし機能たくさんあるので、英語が全くできない人には厳しいかもしれません。英語が得意という人にはぜひおすすめです。
pycharmの導入方法は下のリンクがわかりやすいです。
[Pycharmの導入方法](https://gammasoft.jp/python/pycharm-install-on-windows/)

flaskのライブラリもインストールする必要があります。その導入方法も下のリンクから参考にしていけばいいと思います。
[PyCharmでライブラリをインストール](https://gammasoft.jp/python/install-packages-with-pycharm/)

下の動画は英語ですが環境開発は動画の方が理解しやすいと思うので一応貼り付けておきます。
(https://youtu.be/jaNjzjojqUQ)

<h4>pythonコード</h4>
```python.py
from flask import Flask,render_template

app = Flask(__name__)

@app.route("/")
@app.route("/<user>")
def index(user=None):
    return render_template("user.html", user=user)

@app.route('/profile/<name>')
def profile(name):
    return render_template("python.html",name=name)

@app.route("/shopping")
def shopping():
    food = ["Cheese","Tuna","Beaf"]
    return render_template("shopping.html",food=food)

if __name__ == '__main__':
    app.run()
```
<h4>CSS</h4>
```

<h4>HTMLコード</h4>
```shopping.html
<!doctype html>
<ul>
    {% for item in food %}
        <li>{{ item }}</li>
    {% endfor %}
</ul>
```

```user.html
<!doctype html>
<ul>
    <!doctype html>

{% if user %}
    <h1>Hello {{ user }}</h1>
{% else %}
    <h1>Plaese log in </h1>
{% endif %}
</ul>
```

```python.html
<!doctype html>
<title>welcome to </title>
<link rel="stylesheet" type="text/css" href="{{url_for('static',filename='new.css') }}">
<h1>Hey there {{ name }}</h1>
```
<h4>CSS</h4>
```
h1 {
  color: deepskyblue
}
```

<h4>webサーバーを立ち上げた後の画像</h4>
![hello.PNG](https://qiita-image-store.s3.amazonaws.com/0/285969/ab19cc78-1ec0-61b0-4aca-32d61dd35f23.png)
![hey.PNG](https://qiita-image-store.s3.amazonaws.com/0/285969/fc0d8ef9-a6c6-e151-d53a-2f57c0702691.png)
![please.PNG](https://qiita-image-store.s3.amazonaws.com/0/285969/d9411147-628a-db0d-d071-777e7a72b6e3.png)
![ryuu.PNG](https://qiita-image-store.s3.amazonaws.com/0/285969/26714d34-00ae-3b6e-5d1f-d54cd7641f97.png)

<h4>参考にした動画</h4>
今回参考にしたものは英語ですがyoutubeの動画です。
ぜひFlaskに興味のある方は以下のリンクを参考にしてみてください
(https://www.youtube.com/watch?v=t24ZOk06wa8)
(https://www.youtube.com/watch?v=AOboS0RESt4)
Line Clova AI の OCR Demo を気軽にお試しください（日本語・英語）

![clova_ocr_jp.png](https://qiita-image-store.s3.amazonaws.com/0/298454/69295da1-4280-14f6-b9d7-efb9bef514b4.png)

こんにちは。Line Clova AI で、Optical Character Recognition （画像の文字認識）タスクに携わっている白と申します。
今まで研究開発した結果を集め、Web Demoを作りました。
日本語・英語認識ができるDemoです。お気軽にお試しください。

URL：https://demo.ocr.clova.ai/

#### スマホからの接続
- iOSはSafari、AndroidはChromeの使用推奨
- Demoアプリから画像を撮影して、結果を確認可能
- 既に保存された画像を読み込み、OCRの結果を確認可能

#### PCからの接続
- WindowはChrome、Mac OSはSafariの使用推奨
- 既に保存された画像を（+）ボタンを押して呼び出し、結果を確認可能

#### 注意事項
- 日本語・英語・数字・一部の記号のみ検出・認識可能

ご意見やご感想がございましたら、是非 dl_clova_ocr_feedback@linecorp.com にEメールをお願い致します。
PHPとFirebase接続方法

### はじめに
- 至らないところが多いかもしれません。ご容赦ください。
- 実行環境としてローカルサーバーで実行しています。
- 実行環境(MBP Mojave,サーバー:Ubuntu18.04LTS,PHP7,Apache2)

# PHPからFirebase接続(Realtime Database）
PHPとMysqlが接続されたコードをFirebaseに切り替えます。
##準備
1. Firebaseで新規プロジェクトの作成
2. プロジェクト->設定->サービスアカウント->Firebase Admin SDK->新しい鍵のペアを発行
（ダウンロードしたJsonファイルは後ほど使います）
3. プロジェクトファイルを作成(ダウンロードしたJsonファイルを移動します。)
4. PHPのファイル等々を作成
5. composer作成
6. composer```$ composer require kreait/firebase-php ``` ライブラリを追加    
 Firebaseのドキュメントを参考にしました.
（https://firebase.google.com/docs/database/rest/start?hl=ja）
7. .git を使いサーバーへ移動
8. apache2で実行

## コード
今回はこの記事を参考にしました。
>note Firebaseをphpから。Luck88 さん　https://note.mu/88luck/n/ne42039aa4640

## いじってみて
参考にした記事では"set"になっていましたが、"push"に変更すると連続してデータをあげることができました。この時、IDは自動的に設定されるみたいです。
![1538978085718.jpg](https://qiita-image-store.s3.amazonaws.com/0/281051/a22050fe-5d87-bfbd-d8c0-9428b3214bcd.jpeg)
Emacsで該当のspecにパッと飛びたい

Rails Projectでの開発効率をちょっとだけ上げるpackageの紹介です。実質10行くらいの簡単なもの。
~~projectile-railsを使えばすべて解決す(ry~~

本体は[GitHub/spec-jump.el](https://github.com/blue0513/spec-jump.el)においておきます。

# What's This

Rails Projectでファイルを編集中に `M-x spec-jump` を実行することで、対応するspecファイルをサジェストします。
（注意）Git管理下のRails Projectである必要があります。

![image.gif](https://qiita-image-store.s3.amazonaws.com/0/144707/c460431e-9b78-f233-6c0b-766b7c3a475a.gif)

# Usage

### 1. init.el を編集

git cloneした後に、init.el に以下を記述してください。

```el
;; pathを通す
(add-to-list 'load-path "/path/to/spec-jump")
(require 'spec-jump)
```

### 2. counsel のインストール

ファイル検索に[counsel](https://github.com/abo-abo/swiper)を使用しています.
MELPAからインストールしてください。

### 3. 実行

簡単です

1. Git管理下のRails Projectでファイルを編集します
2. `M-x spec-jump` を実行します
3. 対応するspec fileの候補がMinibufferにサジェストされます
Emacsで単語の使用頻度をパッと見る

カーソル上の単語が、Project内で何回使われているか教えてくれるpackageの紹介です。
本体は[GitHub/how-many.el](https://github.com/blue0513/how-many.el)においておきます。

# What's This

ポップアップで表示してくれます。
（注意）内部でgit grepをしているので、Git管理下のProjectである必要があります。

<img width="800" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/144707/32754746-c766-4433-9a52-94fd66f8792f.png">

# Usage

### 1. init.el を編集

git cloneした後、init.el に以下を記述してください。

```el
;; pathを通す
(add-to-list 'load-path "/path/to/how-many")
(require 'how-many)

;; お好みで
(global-set-key (kbd "H-i") 'how-many)
```

### 2. 実行

簡単です

1. 数えたい単語にカーソルを合わせます
2. `M-x how-many` （上の例ではショートカットで `H-i` ）を実行します
3. ポップアップ！

---
**みんなのPR待ってるぜ！**
Emacsでbufferをパッと光らせたい

bufferを光らせるシンプルなpackageの紹介です．
本体は[GitHub](https://github.com/blue0513/buffer-flash.el)においておきます。

# What's This

bufferをピカっと光らせられます．

![image.gif](https://qiita-image-store.s3.amazonaws.com/0/144707/0a8bc64e-835f-a519-4742-bf767d496a0d.gif)

# Usage

### 1. init.el を編集

git cloneした後、init.el に以下を記述してください。

```el
;; pathを通す
(add-to-list 'load-path "/path/to/spec-jump")
(require 'buffer-flash)
```

### 2. 実行

簡単です

1. `M-x flash-foreground` （もしくは `M-x flash-background` ）を実行します
2. 光ります

---

**みんなのPR待ってるぜ！**
技術書典5に行ってきました。

# はじめに
初めて技術書典5(2018.10.08)に行ってきました。
今まで存在自体を知らなかったのですが、twitterとかで技術書典の話が盛り上がっていて、そこで初めて知りました。

![IMG_4178.jpg](https://qiita-image-store.s3.amazonaws.com/0/226008/edcfadee-196b-1994-21ba-13f0635f2986.jpeg)

感想になってしまうのですが、多くの人に知ってもらいたいと思いQiitaに投稿します。

# 技術書典とは？
[技術書典](https://techbookfest.org/)
>新しい技術に出会えるお祭りです。 
技術書典は、いろんな技術の普及を手伝いたいとの想いではじまりました。 
技術書を中心として出展者はノウハウを詰め込み、来場者はこの場にしかないおもしろい技術書をさがし求める、技術に関わる人のための場として『技術書典』を開催します。

今回で５回目で開催時期は4月と10月の年2回の周期で今の所、開催されているみたいです。
技術書の同人誌即売会のイメージでよさそうです。

# 事前に気になるサークル確認
とりあえず、サイトで気になるサークルをチェックしました。
全部のサークルを見るのに何だかんだ1時間ぐらいかかった気がします。。
自分は33個ぐらいリストアップしていました。

リストに登録するとオレンジに色になるので良いですね。
<img width="1187" alt="スクリーンショット 2018-10-07 1.23.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/226008/516020e4-ea26-e78e-059d-601891e7114b.png">


調べてもサークル数の合計が出てこなかったので、サイトに表示されている数を調べたら、471サークルありました。
下記調べ方です。間違えていたらごめんなさい。。

```
# サークルリスト（https://techbookfest.org/event/tbf05/circle）を開発ツールで開く

# 1サークル毎に「circle-list-item」クラスが付与されているようだ

# 開発ツールのコンソールで下記を実行して確認(結果：471)
document.getElementsByClassName('circle-list-item').length
> 471

```

# 行ってきました
- 11時開場で10時45分ぐらいに着いたのですが、すでに数百人規模の人が並んでました。
- 何だかんだ開場に入ったのは11時45分ぐらいでした。
- 人が多すぎて、ゆっくり一つ一つ見る時間はなかったです。
- 立ち読み広場があってよかったです。（人が多いので、それを買いに行くためは大変でした。）

# 戦利品
何だかんだ、１万円以上使ったと思います。。

![IMG_4180.jpg](https://qiita-image-store.s3.amazonaws.com/0/226008/2f0ff770-60b8-875b-2c53-1ba79d6e589c.jpeg)

![IMG_4181.jpg](https://qiita-image-store.s3.amazonaws.com/0/226008/00c6d574-7327-1a2c-ad49-1afea9184e38.jpeg)

# 所感
- 自分が行った時には物理本がなくなっているのがあったので、欲しい物がある場合は早めに行く必要がある
- お金は千円札に崩しておくこと（かんたん後払いシステムがあるみたいですが今回は仕様しなかったです。）
- 気になるサークルは事前にチェックしておくほうが無難
- 何となく流行りが分かります。今回はFirebaseやVue、React関係が多かったです。Angularはなかった気がします。（フロント側目線）

# 最後に
始めての参加でしたが、とても楽しかったです。
特にあれだけ多くのエンジニアが一同に集まると、「頑張らないと！！」というモチベーションが湧いてきました。
次も参加したいと思えるイベントでした。

それでは、購入した本を読んでいきます。
fishでnodeをインストール（Mac環境）

## nodebrewをインストール

```shell
$ brew install nodebrew
```

## nodeの最新版をインストール

```shell
$ nodebrew install-binary latest
```

バージョンを指定したい場合は、

```shell
nodebrew ls-remote                                                                                                                                                                            (~) 14:15:44
v0.0.1    v0.0.2    v0.0.3    v0.0.4    v0.0.5    v0.0.6

〜〜〜〜〜〜〜〜〜〜

v0.9.0    v0.9.1    v0.9.2    v0.9.3    v0.9.4    v0.9.5    v0.9.6    v0.9.7
v0.9.8    v0.9.9    v0.9.10   v0.9.11   v0.9.12

v0.10.0   v0.10.1   v0.10.2   v0.10.3   v0.10.4   v0.10.5   v0.10.6   v0.10.7
v0.10.8   v0.10.9   v0.10.10  v0.10.11  v0.10.12  v0.10.13  v0.10.14  v0.10.15
v0.10.16  v0.10.17  v0.10.18  v0.10.19  v0.10.20  v0.10.21  v0.10.22  v0.10.23
v0.10.24  v0.10.25  v0.10.26  v0.10.27  v0.10.28  v0.10.29  v0.10.30  v0.10.31
v0.10.32  v0.10.33  v0.10.34  v0.10.35  v0.10.36  v0.10.37  v0.10.38  v0.10.39
v0.10.40  v0.10.41  v0.10.42  v0.10.43  v0.10.44  v0.10.45  v0.10.46  v0.10.47
v0.10.48

v0.11.0   v0.11.1   v0.11.2   v0.11.3   v0.11.4   v0.11.5   v0.11.6   v0.11.7
v0.11.8   v0.11.9   v0.11.10  v0.11.11  v0.11.12  v0.11.13  v0.11.14  v0.11.15
v0.11.16

〜〜〜〜〜〜〜〜〜〜

$ nodebrew install-binary v10.10.0
```

とする。

### エラー対策

```shell
$ nodebrew install-binary latest
Fetching: https://nodejs.org/dist/v10.11.0/node-v10.11.0-darwin-x64.tar.gz
Warning: Failed to create the file
Warning: /Users/hondy12345/.nodebrew/src/v10.11.0/node-v10.11.0-darwin-x64.tar.
Warning: gz: No such file or directory
                                                                           0.0%
curl: (23) Failed writing body (0 != 1057)
download failed: https://nodejs.org/dist/v10.11.0/node-v10.11.0-darwin-x64.tar.gz
```
となってしまう場合があるが、この場合は　ディレクトリを作ってあげるといい。

```shell
$ mkdir -p ~/.nodebrew/src/
```

## バージョンの指定

```shell
# コンソールに出た以下の文言のvほにゃららを利用する
# Fetching: https://nodejs.org/dist/v10.11.0/node-v10.11.0-darwin-x64.tar.gz
$ nodebrew use v10.11.0
use v10.11.0
```

## PATHを通す
fishの場合はexportではなくset -xを使う

```shell
$ set -x PATH $HOME/.nodebrew/current/bin $PATH
```

### ※永続化
~/.config/fish/config.fishは最初は存在しないが、新規作成すれば次回から読み込まれる

```~/.config/fish/config.fish
set -x PATH $HOME/.nodebrew/current/bin $PATH
```

## バージョン確認

```shell
$ node -v
v10.11.0
$ npm -v
6.4.1
```

こんな感じになればOK。
python websocket-client のdecode errorの対策

python で websocket を使った通信をする場合

僕のように某生配信プラットフォームのwebsocketを取ってこようと思うと、ここのを使うのが一般的だと思います。
https://github.com/websocket-client/websocket-client

あまり使っている人がおらず、正直、コミュニティは活発っぽくないです。
バージョンによって挙動が違う（らしい）です。
ですので、ぼくは現行動いているバージョンから変えるつもりはありません。

僕は
pip install websocket-client
でインストールしました。

某生配信プラットフォームは、utf-8以外の文字も使えるっぽいので、特定のユーザーが現れると、デコードエラーでプログラムが落ちます。

当初は非常に不思議で、まったく原因がわからなかったのですが、特定の配信者のところに現れる特定のユーザー名が原因でした。
この現象はchromeのDeveloper Toolでwebsocketの通信を眺めていても、特定ユーザーが何かするたびに落ちて、再接続してました。
おそらく、配信プラットフォーム側がutf-8以外の文字列もOKにしていることが原因だと思います。

ライブラリのソースコードを見ていると、skip_utf8_validation=False というのがあるのですが、これをTrueにしても落ちます。

ですので、僕は、ライブラリのソースコードのdecodeとencode部分をすべて、ignoreをつけて力業で対処しています。

ライブラリの原因箇所の特定や、英語での提案をする元気は無いので誰かやってください。
全く同じissue が [ここ](https://github.com/websocket-client/websocket-client/issues/481)とかstackoverflowにもあがってるのですが、おそらく開発者側も再現性がないので直せないのだと思います。
たぶん日本独特の問題なのかな？

こんな知識誰か役に立つんですかね？
新しいExcelでの新機能・スピルの有効活用ケース

こちらの記事では新しいExcelで追加になる計算方法、「スピル」について解説しました。
<a href="https://qiita.com/yosatonet/items/2fc441343d210a484789">新しいExcelの一番の変更点は「スピル」？</a>
とてもインパクトのある機能でして、多くの皆さんにご覧いただき知っていたけて、とてもうれしかったです。
ただ、インパクトのある機能ではあるものの、どのようなケースで使えるか、具体的にどんな業務に使えるかということまではなかなか繋がりにくいと思います。
夢でまでスピルが出てくるほど考えていまして、そんな中で、これはスピルでしかできないという有効活用方法を見つけましたので、お知らせいたします。
具体的には計算式作成の時短・効率化に役立ちます。
#時間と単価と基本料金の表
今回紹介するケースはこのような、貸し部屋の料金表のケースです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/39cd5875-f52b-869a-8bd4-5de5957bffc4.png)
４つの表があります。
それぞれの表の左上は「基本料金」です。短時間使ってもこの料金はかかります。
それぞれの横軸は「単価」、縦軸は「利用時間」となっています。
料金は基本料金＋単価×利用時間で求まります。
#従来での効率的な計算プロセス
従来のExcelで最もこの表の黄色のセル範囲に計算する方法は、セルB2に次の計算式を作成します。
=\$A\$1+B\$1*\$A2
そして、その計算式を縦横にコピーし、1つの表を作成します。
次にA6からの表の範囲に計算式を反映させようと思っても、
\$A\$1は必ずセルA1を見るし、B\$1は必ず1行目を見ます。\$A2はそのまま使えるのですが、F列からの表にコピーする場合には使えなくなります。
ということで、最初から計算式を作るか、上記の計算式を一度コピーしてその表にあわせて範囲を指定し直すか、そしてその改造した計算式を範囲にコピーします。
これが４つの表すべてで行う必要があります。
#スピル使ったら？
スピルの場合は、セルB1に絶対参照を意識しない次の計算式を入力します。
=A1+B1:D1*A2:A4
それだけで、B2からD4の範囲に計算結果が出ます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/ab232e78-120d-523b-c865-d4f155c8667d.png)
後は、セルB2の計算式をセルをB7、G2、G7の各セルにコピーするだけです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/90fc5929-ae8d-3a3d-f621-4093281b8fd6.png)
スピルでの位置関係が完全にコピーされます。
#スピルでの問題点
それでもまだスピルでは問題があります。
今回はすべて同じ範囲の大きさの表でしたが、それぞれバラバラのケースもあるでしょう。
その場合では、残念ながらすべての範囲でスピル式を作成する必要があります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/3976d7b4-3f3f-99b2-4d60-64f1f34a716e.png)
ここ、OFFSET関数などでうまくできる方法があれば知りたいところです。
あらかじめ表の上にでも縦横の大きさが計算されるような関数を仕込んでおいて、そこをOFFSET関数で処理して範囲を決めてもいいのかもしれないです。
次のような計算式もアリかもしれないです。
=(B1<>"")*(A2<>"")*(A1+B1:D1*A2:A4)
=IF(AND(B1<>"",A2<>""),A1+B1:D1*A2:A4,"")
この計算式は実働しません。もう少し検討が必要です。
もしその方法も使えない場合でも、スピルを使わない方法よりは使った方が効率化できると思います。
#もっと応用
下のような表を作り、他の営業部のデータを作る時は、従来では、セルC3に計算式を作成し、セルC3からE4までの範囲にコピーして使い、そのシートをコピーし、中のパラメータを変更し、コピーしたシートの表範囲を切り取り、コピー前の表の6行目以降に貼り付ける、といった手順が最も早いかと思います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/bc310fbc-e2fa-6cd5-eb68-fe2b361fe359.png)
スピルであれば、セルC3にスピル計算式を作成し、表全体を6行目以降に貼り付けてパラメータを変更するという流れだけで作業ができます。
日本語をマークダウンの改行が面倒なときは入力設定を変更する

# 問題点  
エンジニアとしてマークダウン方式で投稿をすることになったけど 
日本語で改行を打つと全角スペースになって不便だった。
# 解決策 
キーボードの入力設定で「全角スペース」を無効にする。
※google日本語入力の場合 
# 手順
1. ツールバーから「環境選択」を選択  
<img width="245" alt="スクリーンショット 2018-10-08 14.19.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/297148/f4469a4d-2978-a066-9b9d-37483296997f.png">

2. 「一般」タブから「スペース入力」で「半角」に変更する
<img width="523" alt="スクリーンショット_2018-10-08_14_16_14.png" src="https://qiita-image-store.s3.amazonaws.com/0/297148/ebbed8a3-224e-963f-94c1-59d6065cd6f4.png">

# どれくらい改善されたか？ 
私の場合は普通の文章でマークダウンを打つのに 
ストレスなく開業できるようになり非常に満足です。
GCEで利用した静的内部IPの削除

## 経緯
GCPでサブネットワークを作成し、GCEを静的内部IPを付与して作成。
サブネットワークを再作成する必要が出てきたため、コンソールからGCEをインスタンスを削除し、
サブネットワークも削除しようとしたところ、内部IPが存在するとのエラーが出力。

どうやらgcloudコマンドで作業をする必要があるため、備忘録としてメモ。
なお、gcloudコマンドはGCPコンソールからCloud Shellを起動して実行。

## コマンド
現在の静的内部IP一覧を確認

```
$ gcloud compute addresses list
NAME            REGION           ADDRESS        STATUS
testip-1        asia-northeast1  10.10.10.1   RESERVED
testip-2        asia-northeast1  10.10.10.2   RESERVED
```

IPの削除

```
$ gcloud compute addresses delete testip-1 --region=asia-northeast1
The following addresses will be deleted:
 - [testip-1] in [asia-northeast1]
Do you want to continue (Y/n)?  Y
Deleted [https://www.googleapis.com/compute/v1/projects/<project name>/regions/asia-northeast1/addresses/testip-1].
```
こちらで削除成功。
あらかじめregionを変更しておくか、--regionを引数で設定しないと別リージョンのオブジェクトを削除しようとしてエラーになることがある。

```
$ gcloud compute addresses list
NAME            REGION           ADDRESS        STATUS
testip-2        asia-northeast1  10.10.10.2   RESERVED
```

## 補足

プロジェクト一覧の確認
`$ gcloud projects list`

デフォルトプロジェクトの確認
`$ gcloud config list`

デフォルトプロジェクトの変更
`$ gcloud config set project <project name>`

コマンド実行時プロジェクト指定でもよいらしい
`$ gcloud --project <project id>`

参考
https://cloud.google.com/sdk/gcloud/reference/?hl=ja
UglifyJSの代わりに、terserを使ってwebpackする

#terser始めました

最近、お遊びでドメイン取得したり、firebase触ったり、webpackしたりしているのですが、ES6で書いたJavaScriptを、webpack定番の圧縮ツールであるUglifyJSで圧縮すると、エラーが散見されるようになりました。
原因は、UglifyJSが、ES6+に対応していないって事でした^q^


ということで、UglifyJSの代わりに、terserとterser-webpack-pluginを使っています。

[https://www.npmjs.com/package/terser](https://www.npmjs.com/package/terser)
[https://www.npmjs.com/package/terser-webpack-plugin](https://www.npmjs.com/package/terser-webpack-plugin)


使い方は、今までのUglifyJSと同じように使えます。
基本的には、tereser-webpack-pluginを使う感じです。

## terser-webpack-pluginの設定

```webpac.prod.config.js
const TerserPlugin = require('terser-webpack-plugin');
module.exports = {
    optimization: {
        minimize: true,
        minimizer: [new TerserPlugin({
        terserOptions: {
          ecma: 6,
          compress: true,
          output: {
            comments: false,
            beautify: false
          }
        }
      })]
    }
};
```

こんな感じで設定してやれば、いい感じに圧縮してくれます。
便利。


## 終わりに


他の詳細が見たい場合は、[teser-webpack-pluginのgithub](https://github.com/webpack-contrib/terser-webpack-plugin)見てください。
劣悪な現場にいるSier系エンジニアにも救済を

Sier系の現場って開発環境が酷く劣悪なのが特徴です。Web系のエンジニアの方々には想像もつかないかもしれませんが、過去に経験してきた現場をいくつか紹介したいと思います。
若手のSier系エンジニアには私が気づいた事をアドバイスしたいと思います。

劣悪な開発環境
--
  
|No|言語| OS | インターネット利用 |テストツール|ビルドツール|CI| 有用なツールDL |備考|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|1|Java| Win7 x64  |  可 |有り|有り|無し|  不可 |割とマシな方|
|2|JavaScript|  WinXP |  不可 |無し|-|無し|  不可 |IE6使用|
|3|Java|  Win7 x86 | 不可  |  無し |無し|無し|不可|コボラーが多い:older_man_tone2:|
|4|VBA|Win10|可|無し|-|-|可|VBA？|
* Mac？Ubuntu？**使えるわけないでしょう。**
* なんだ、さすがにテストツールは有るか。**JUnitのみです。**
* とすると画面系のテストはまさか…**そのまさかです。手で画面ポチポチ、Excelにスクリーンショットをペタペタ。**
* あれ、IE6？**そうです。IE6です。デバッガーが搭載されていません。`alert()`をあちこちに突っ込んでデバッグです。**
* ん、インターネット不可…？**言葉通りです。インターネット使えません。専用端末有りません。有用なコードはおろか、公式リファレンスすら読むことはできません。ググりたい？自分のスマホを使ってください。もしくは参考書でも持ち込んでください。**
* コミュニケーションツールは？**メールが殆どです。Slack？Teams？Skype？言わずもがな、使えません。**
* VSC使いたい、Sublimeがいい、Atomが、IntelliJが etc... **そんなものありません。ネットからダウンロードなんて言語道断。こちらで用意したEclipse、サクラエディタを使いなさい。あ、秀丸の方がいいですかね？**

他にも**F12を無効化**してデバッガーが起動しないようにしているシステムも存在しています。
ユーザーに勝手に弄られて挙動がおかしくなるのを防止したいらしいですが…

こんなSier系の現場にも救いを
--
ああ無情。救いを求めること自体が間違いです。
一つ言えるとしたら、その日の仕事が終わったら足早に帰りましょう。皆が残っているから手伝わないと？ダメです。振り返ってはいけません。日本は助け合い文化です。今日手伝ってあげた方は、後日貴方が遅くまで残業する時に「今度は私が彼を助けなければ」と思い、一緒に残業しようとしてくるでしょう。結果的に皆が慢性的な残業の日々を送ることになります。

さぁ、退社した貴方は先ずどうしますか。

* まっすぐ帰宅してゆったりNetflix
* 友人と食事
* フィットネスクラブ
* 趣味に没頭

何でもいいんです。まずはその溜まったストレスを解消しましょう。セロトニンが分泌されてきましたか？
では次のステップです。

勉強しましょう
--
これに尽きます。
普段から勉強する習慣が無い人には酷かもしれません。少しずつでもいいので勉強する習慣を身につけましょう。私の場合は休日はガッツリやって平日は程々にしています。
勉強嫌いな貴方には…　そうですね、まずは今現場で使っているツールの事をもっと知りましょう。公式のドキュメントやQiitaで記事を漁ってもいいです。きっと驚くことが多いでしょう。こんな機能があったんだ、これ使ったら作業効率化できるぞという事が分かります。そして家のPCにツールをインストールして実際に使ってみてください。知った事をどんどん試してください。これだけでも結構違います。
ツールを使いこなせるようになりましたか？では次にサーバーの環境構築をしてみましょう。最初は仮想環境にLinuxを入れてTomcat立ち上げただけのAPサーバーでいいでしょう。適当なサンプル画面を作ってスマホからアクセスしてみてください。Web系エンジニアの方々から見れば「は？学生レベルじゃん」と思うかもしれません。この道10年なんて言ってるWebシステム専門のSier系エンジニアにこれが出来ない人は大勢います。

このままSier系の現場にいたらヤバい？
--
今貴方が立っている場所は沈みゆく船です。
ゆっくり、でも確実に沈んでいっています。船ですからよく揺れるでしょう。波で沈み込んだり浮き上がったりします。だからこそ船に乗っている今は気づきにくいのです。
Sier系の現場は大勢の要員を投入してタスクを細かく分割します。それを多重下請け構造によって行う為に、最悪、今作っているコレが何なのか分からないことさえあります。タスクが細かく分割されているが為に携わる領域が狭まりスキルアップは見込めません（特定の領域は強くなるかもしれませんね:hugging:）。
大手のSierエンジニアは下請けの管理が主な業務です。プログラミングはしません。下請けからアレが出来ました、コレは出来ません、ソレは遅延ですといった報告をとりまとめて上に報告します。上はそれを受けてどう返答するか？

**「遅延？　キャッチアッププランを出せ。徹夜休日出勤してでも終わらせろ。出来ない？それを何とかするのがお前らの仕事だ。」**

お役所仕事です。他人事です。プロジェクトを成功させようなんて考えてません。
次に下請けのSierエンジニアです。実際にプログラミングを行う人達です。
繰り返しになりますが勉強する習慣を身につけましょう。そしてWeb系の会社に転職しましょう。視野が広がり、自分が穴空き船に乗っていたことを知る事が出来ます。

**今のままではレガシーシステムと人貸し企業に自分の将来を潰されます。**
JUnitネタ

# JUnitネタ

ざくっとした備忘録メモ

mockito
powerMockito
JMockit
whitebox


## JavaでのDBのテストデータ作成はDbSetupが楽DbSetup


## PowerMockとSpringJUnit4ClassRunnerを同時に起動する
```Java
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(SpringJUnit4ClassRunner.class)
```


## mockito, powerMockのパターン毎のサンプル
https://qiita.com/euledge/items/a224777c15ae7145114a


## Javaでprivateメソッドのテストとそのメソッドをパーシャルモックする方法
※テストにprivateが絡んで来たときhttps://qiita.com/shotana/items/142bcd03ef6f9f25bf2a

Springのrunner使ってインジェクションすると重くなる（できればインジェクション無しの状態でテストできるのがいいけど。。
※InjectionMocksを使ってモックでDIするとよいかも。

InjectionMocks

- @Autowiredとか関係なく、privateなフィールドにモックをセットできる

インジェクションのモック

- http://qiita.com/nyasba/items/16daeff7b9a2a65ef07f
- http://tech-blog.tsukaby.com/archives/305
- http://qiita.com/nyasba/items/cd72231f56536a9ef199
- http://javatechnology.net/java/mock-injectmocks/


## DBUnit

- JUnit用のDBスキーマを用意しないと、中断したりした時に開発で使ってるスキーマの中身が消えてしまう可能性があるので注意


## privateメソッドの試験は、リフレクションで無理やり呼ぶ

- http://qiita.com/village/items/2f0d99b25eef0c8fd4ec
- JMockit使うのもあり


## protectedはビルドパスで設定すると楽

- http://qiita.com/stkdev/items/622e389e9387b75f99ad


## セッション（HTTP）

- https://codezine.jp/article/detail/7719

ライブラリで用意されてるメソッドを使っている場合、最悪、メソッドそのものがコールされたかどうかで確認してもよい
fail()を使う（例:：異常系の確認の場合、正常系に行ったらエラーにしないといけない
macOSにpygameをインストール

以前Macでpygame動かすのは色々めんどくさかった記憶があるのだけど、今はpip使って簡単にバイナリをインストールできるのね。拍子抜け。

使用するpythonのバージョンは3.6.1以降推奨。

```
$ python3 --version
Python 3.7.0
$ mkdir pygame_project
$ cd pygame_project
$ python3 -m venv venv
$ source venv/bin/activate
(venv) $ pip install pygame
Collecting pygame
  Using cached https://files.pythonhosted.org/packages/b9/89/aca02f8771727c2713c11a39c1cc295e4deb60be322be19ad7460570f978/pygame-1.9.4-cp37-cp37m-macosx_10_11_intel.whl
Installing collected packages: pygame
Successfully installed pygame-1.9.4

```

サンプルを起動して動作を確認。

```
$ python3 -m pygame.examples.aliens
```
Privateメソッドで外部から呼び出せないようにする

# Privateメソッドの使い方
クラス内でPrivateと記述すると、Private以下に記述したメソッドをクラス外で呼び出すことができない。

```ruby:class.rb
class Sales
    attr_accessor :name
    def initialize(name)
      @name = name
    end
    def sale(customer,target)
        target_amount_money(target)
        puts "#{@name}は、#{customer}に広告を売った"
    end

    private

    def target_amount_money(target)
        puts "広告目標額は#{target}万円"
    end
end

hiro = Sales.new("hiro")
hiro.sale("見込み客", 200)

#広告目標額は200万円
#hiroは、見込み客に広告を売った
```

以下のようにクラス外で呼び出そうとすると、エラーになってしまう。


```ruby:class.rb
class Sales
    attr_accessor :name
    def initialize(name)
      @name = name
    end
    def sale(customer,target)
        target_amount_money(target)
        puts "#{@name}は、#{customer}に広告を売った"
    end

    private

    def target_amount_money(target)
        puts "広告目標額は#{target}万円"
    end
end

hiro = Sales.new("hiro")
hiro.target_amount_money(200)

#ruby-practice.rb:19:in `<main>': private method `target_amount_money' called for #<Sales:0x007fb1e01088c8 @name="hiro"> (NoMethodError)
```
Railsでよく出てくるけど、　改めて学ぶと理解が増す。