OmniAICreator/Qiita-1.07M huggingface dataset:
Visual Feature Attribution using Wasserstein GANs - GANでクラス間のピクセルの違いを抽出 -

今回はCVPR2018から判断根拠系の論文です。とうとうこの分野にもGANが入ってきました。論文リンクは[こちら](https://arxiv.org/abs/1711.08998)

よくあるニューラルネットワークの判断根拠は「ある分類・回帰モデルがどの入力を見て出力を得ているか？」に近いのに対し，この研究は「__データの中でラベルXXX足らしめている特徴は何か？__」を表す手法になります。正確にいうとモデルの判断根拠ではなく，データ内の判断に使われるであろう特徴を抽出する手法となります。

医療分野の組織なので，実験はアルツハイマーを見分ける脳画像です。

## 概要
* 画像の二値分類において，そのクラスで重要な画像領域をGANを用いて抽出する手法VA-GANの提案
* クラスAの画像にGeneraterから作成したマスクを足し合わせた画像を，DiscriminaterがクラスBの画像と比較して，Generaterのマスクがかかっているか否かを学習する
* GeneraterはクラスBに変更するマスク，すなわちそのクラス特有の特徴を表すようなマスクを生成するようになる

## どういうことができるか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185518/058cee1c-2360-dadc-78d8-7b536a9c8da5.png)

ガウシアンノイズで作成した画像と，それに四角形の領域（画像上）を足した画像を用意し，それぞれラベル0, ラベル1というラベルをつけておきます。
この画像に対して，判断根拠的な手法と提案手法を用いて，ラベル１を見分けるのに重要なピクセルを抽出する実験を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185518/ec98e701-6b03-fe53-c62f-acc8221d8b91.png)


実験結果がこちら。左の３つが既存手法，一番右のVA-GANが提案手法です。既存手法ではノイズが混じっていたり，輪郭しか出せなかったり，加えたマスクをぼやっとした領域でしか出せていませんが，提案手法は領域をはっきり抽出できています。

## どうやってやってるの？
ほぼこの図で説明されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185518/b9127d74-2094-460a-59b7-aea4c47c7c2a.png)

以下のフローで学習を行います。

1. あるクラス1の画像$X$をGenerater $M$に入力する
1. $M$の出力$M(X)$と画像$X$の和をとり，画像$Y$を出力する
1. Discriminator $D$は$X$とは別のクラス（ここでは0）の画像$X'$と，2.で出力された画像$Y$を比較し，それが本物の画像か生成された画像か判別する

直感的に，$M$は__クラス1の画像をクラス0に変更するマスク__を生成するように学習することとなります。すなわち，そのマスクは__クラス0とクラス1の異なる部分__であることとなります。

## 学習方法
ロス関数は以下の式で表されます。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185518/5ee1d79a-3bec-a986-fa8a-4375ccc32bb0.png width=300>
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185518/648cef8e-fbac-0861-efff-d39a924a487f.png width=200>
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185518/84f015fc-d629-61dd-9d7d-35a4bc00fa7d.png width=300>


一番上は本物の入力に対して$D$が0と判断した確率（つまり正解した確率）からマスクされた画像を1と判断した確率（つまり間違った確率）を引いたものです。

二番目は正則化項です。これは画像そのものを変更してしまうのを防ぐために，マスクをある程度スパースにして変更箇所を限定するために入れているようです。

三番目は全体のロス関数です。

## 実験
アルツハイマーかそうでないかを二値分類する脳画像データセットを用いて，アルツハイマーの原因となる箇所（脳の縮小が起きるので脳のエッジ部分）を抽出できるか可視化を行いました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185518/6c7ab466-5871-d759-5d36-1f45ddcac565.png)

ObservedがGrand Truthです。他の手法と比べて提案手法は実際に縮小した部分を表現できています。他の手法は四角を与えるプレ実験のように，ノイズが多かったりぼやけていたりしてうまく抽出できてないですね。

Grand Truthと抽出したマップの[NCC](http://www.sanko-shoko.net/note.php?id=f7j3)（いわゆる正規化された画像の輝度の内積）を出した結果は以下です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185518/c137c7c1-db1f-1855-cca8-cbf123c85c26.png)


提案手法が一番高い精度を出せています。

## まとめと所感
モデルがどう判断した，ではなくデータ自体がクラス間でどのような異なる性質を持っているかをニューラルネットで示した論文は意外と少ない気がしています。こっち系の論文も増えるとまた一段難しいタスクにも適用できそうですね！
【Java】CollectionクラスのComparator

Comparator…コレクションで全体順序付けを行う比較関数

###Listの要素を昇順に並び替えたい

```java
		public static void main(String[] args) {
		    List<String> list = Arrays.asList("apple","melon","banana","cherry","orange");
		    Collections.sort(list, Comparator.naturalOrder());
		    System.out.println(list);
		  }
```

###Listの要素を降順に並び替えたい
```java
		public static void main(String[] args) {
		    List<String> list = Arrays.asList("apple","melon","banana","cherry","orange");
		    Collections.sort(list, Comparator.reverseOrder());
		    System.out.println(list);
		  }
```
Visual Studio 2017 で OpenCVのテンプレートプロジェクトを作成する

# 環境
・Windows 7 Professional 64bit
・Visual Studio 2017 Version 15.9.14
・OpenCV 3.4.1

OpenCVの導入方法などは、下記を参照ください。
[Visual Studio 2017 + OpenCV 3.4.1 + CUDA 10.0 + Intel TBB 2018U5 ビルド手順](https://qiita.com/East_san/items/7072257fb12b26c8d215)

# 手順
1. Visual Studio 2017 を起動
2. ファイル>新規作成>プロジェクト>Visual C++>空のプロジェクト を選択
3. ソリューションエクスプローラー>ソースファイル>追加>新しい項目>C++ファイルを新規作成
4. ソリューションエクスプローラーからプロジェクトのプロパティを開く
5. 構成を"すべての構成" 、プラットフォームを"すべてのプラットフォーム"に設定
![WS000000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92978/092f7643-3256-fe20-1327-cceeb3b571e2.png)
![WS000001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92978/d0e75907-c269-7979-f934-5325a85aa5b2.png)
6. C/C++>全般>追加のインクルードディレクトリを設定
![WS000002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92978/60aa8c7d-73ae-d119-3f3e-d3f8798a3c45.png)
![WS000003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92978/9cde64d4-7ef5-1df2-d530-f1078a4b38ae.png)
![WS000004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92978/cc01f647-dc7e-dff7-5fe8-902bd15e676e.png)
7. リンカー>全般>追加のライブラリディレクトリを設定<br>※x86のライブラリもある方は両方設定してください(私の環境ではx86のCMakeは行っていないので、今回はx64しか設定していません)
![WS000005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92978/9a16deec-534d-7c4f-f97c-152e961e9113.png)
![WS000006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92978/f879dddb-2e50-02f3-83a9-1c64d655eaf8.png)
![WS000007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92978/d5526f3d-6604-bd53-b57e-5e0973287bb5.png)
8. 手順3.で作成したC++ファイルにテスト用のコードでも記述しておきます

```cpp:main.cpp
#include <iostream>
#include <opencv/cv.hpp>
#include <opencv2/opencv.hpp>
#include <opencv_lib.hpp>

int main()
{
	//OpenCV ビルド情報の表示
	std::cout << cv::getBuildInformation() << std::endl;
	system("pause");

	return 0;
}
```
9. プロジェクトをテンプレート化します<br>メインメニュー>プロジェクトテンプレートのエクスポート でテンプレートをするためのウィザードが出てくるので設定します
![WS000008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92978/dd11f99c-c6bf-febc-365d-ae588278fd5e.png)
![WS000009.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92978/c73b8f9f-52bc-65d3-01bd-a81672fe1f91.jpeg)

# 確認
Visual Studio を起動して、プロジェクトの作成に入ると以下のような、テンプレートが読み込まれ一覧に表示される
![WS000010.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92978/ed1a3d53-ebb3-fd63-a930-4ff7b8cef4de.jpeg)

# 余談
テンプレートファイルはzip形式なので、コピペなどで簡単にバックアップや移行したりできると思います。

# 参考サイト
[1]:[プロジェクト テンプレートを作成する](https://docs.microsoft.com/ja-jp/visualstudio/ide/how-to-create-project-templates?view=vs-2019)
UIUX設計の原則メモ

あちらこちらで、Webページ、スマホアプリのUI UX設計の方法について調べたいたのでメモを・・


####用語について
UI= User Interface 見た目や操作性、広義ではキーボードやマウスなどの入力も含む
UX= User Experience::サイトを利用する上での快適さや、必要な情報へのアクセスのしやすさなど


####ページ全体のUI設計基本
ほとんどのUI設計の教科書で説かれていること

#####ダメなUI設計
「誰が」
「何を」
「どうしてもらう」
そして「どう伝えるか」が明確になっていない。

#####良いUI設計
「誰に」
「何を」
「伝える方法」
３点が組み込まれている。


######デザインの原則
英国政府のWeb担当が作った“デジタルデザインの原則10か条”がスゴい！
から引用。一部省略修正
https://webtan.impress.co.jp/e/2014/07/15/17846

１まずニーズからはじめる ―― 自分たちのニーズではなく、**ユーザーニーズ**から。本当のユーザーを理解し、そのニーズを知る。想像や思い込みではなく、ちゃんとデータで確認する。

２なんでもかんでも手を広げず、するべきことだけをする

３実証をもってデザインする ―― 試作し、実際のサイトで実際のユーザーにA/Bテストを行い、その結果をデザインに活かすやり方を理解する。

４シンプルにすることに心血を注ぐ ―― 「シンプルであるように見える」ものを作るのは簡単だが、本当に何かをシンプルにするのは大変

５繰り返し、繰り返す ―― 小さく始めて、実ユーザーでテストして、フィードバックを絵ながら改善を繰り返していく。

６受け入れられやすいものに作る ―― アクセシブルなデザインは良いデザインだ。どんな人でも（ネットに慣れていない人にとっても）できるだけ読みやすく、判別しやすいものにする。それによって多少エレガントでなくなるとしても、そうするべきだ。

７コンテキストを理解する ―― PCのディスプレイのためにデザインするのではなく、人のためにデザインする。どんな場所で、どんなデバイスで、どんな人が使うのかを、真剣に考える必要がある。

８デジタルサービスを作るのであって、Webサイトを作るのではない ―― 人々に対するサービスはWebサイトだけで完結するとは限らない。検索エンジンも関係するし、リアルな場も併せて使う必要があるかもしれない。変わりゆく況を理解し、デザインしなければいけない。

９一貫しているべし、単に統一するのではなく ―― 使う言葉やデザインをさまざまな場所で同じにするべきだ。そのほうがユーザーには使いやすくなる。 背後に一貫したアプローチがあれば、ユーザーが理解しやすくなる。

10 オープンにすれば、物事はもっと良くなる ―― 可能な限り、自分たちのやっていることをオープンにする。同僚に、ユーザーに、世界に。コードも、デザインも、アイデアも、狙いも、失敗も。そうすれば、凡ミスが見つかり、もっと良い方法がみつかり、全体のレベルが上がっていく。
SATySFiでカルノー図

## 何
レポートに載せる必要があってTeXとかで作ろうとしたけど良い感じのを見つけられなかったので結局SATySFiで書いた。
こんなんが

```
let-math \dc = ${\dontcare} in
{
  \karnaugh-map(${xy})(${zw}) [
    ${| 1   | 0   | 0   | 1   |};
    ${| 1   | 1   | 0   | 1   |};
    ${| \dc | \dc | \dc | \dc |};
    ${| 1   | 0   | \dc | \dc |};
  ] [
    Karnaugh.box  (0, 1);
    Karnaugh.tall (3, 0);
  ];
}
```

```
{
  \karnaugh-map(${AB})(${C}) [
    ${| 1 | 1 | 0 | 1 |};
    ${| 1 | 0 | 0 | 0 |};
  ] [
    Karnaugh.slim (0, 0);
    Karnaugh.flat (0, 0);
    Karnaugh.flat (3, 0);
  ];
}
```

こんなんになる

![example.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202369/f7da53fe-b99e-530e-f301-5494d4f72e26.png)

（囲み枠のマージンがそれぞれ変わるようになっていないので線が重なって見にくい。）

## 方法
SATySFiの表組では、表の内容のほかに、各行/列の境界の座標を受け取って表の罫線を返す関数を指定できる。その関数として、カルノー図の囲み枠（？）を返すものを渡すことで表内に囲み枠を描けるので、頑張ってカルノー図が書けるようになった。`Karnaugh.box`等はそのような関数を作る関数である。

----

リポジトリです→&ensp;https://github.com/takagiy/satysfi-karnaugh
rails 関連の

## bundle install 
gem ファイルに何か記述した時に実施するコード

## bundle install --path vendor/bundle
こちらもgemファイルに何か追記した時に記述するコードだが、プロジェクトごとにインスートルできる。不具合が起きにくい。

## rake db:create 
これを実行するとrailsプロジェクトのconfigディレクトリの中にあるdatabase.ymlを読み込んでデータベースを作成します。

## rails g devise:install
deviseの設定ファイルを生成する

## rails g devise モデル名　
dbディレクトリの中にある、migrateの中にdeviseファイルを生成する

## bundle exec rake db:migrate
migrationファイルをデータベースに反映するために実行
[C++] 文字列(String)を文字列delimiter(String)で分割

# 動機
競技プログラミングに使えそうだったので

# 仕様
sprit_string(元の文字列, 区切り文字列)で、vector\<string>を返します。
なお、区切り文字列が二つ続いた場合、空白文字を返します。

# 計算量
O(NM)
※元の文字列長: N 区切り文字列長: M
# コード

テスト用のmain関数も合わせて置いておきます。

```C++
#include <bits/stdc++.h>
using namespace std;
#define REP(i, n) for (int i = 0; i < n; i++)
int i, j, k;

vector<string> sprit_string(string srcstr, string delim) {
  vector<string> result;

  string fragment = "";
  for (int i = 0; i < srcstr.length(); i++) {
    bool delimMatch = true;
    for (int j = 0; j < delim.length(); j++) {
      if (srcstr[i + j] != delim[j]) {
        delimMatch = false;
        break;
      }
    }

    if (delimMatch) {
      result.push_back(fragment);
      fragment = "";
      i += delim.length() - 1;
    } else {
      fragment.push_back(srcstr[i]);
    }
  }
  result.push_back(fragment);

  return result;
}

int main() {
  string S, delim;
  cin >> S >> delim;

  vector<string> splited_string = sprit_string(S, delim);

  REP(i, splited_string.size()) {
    cout << splited_string[i] << endl;
  }
}
```

# 実行例

```:input
delimtodaydelimisdelimadelimdelimbeautifuldelimday
delim
```

```bash:output
$ ./a.out < input

today
is
a

beautiful
day
```
C言語の復習がてら、ゲームに応用してみる Part4

#はじめに
この記事は、私の投稿している「C言語の復習がてら、ゲームに応用してみる」のPart4である。最初から見たいという方は[こちら](https://qiita.com/lastorder0316/items/3a5e8565d47a4ab7a494)から

#目には目を、弾には当たり判定を
さて、今度は弾の当たり判定についてを考えよう。
弾の生成や移動に関してはpart3の知識で同じように理解できると思う。
では、当たり判定についてだ。一番簡単な考え方としては、弾が敵の中に食い込んだ時あたりという判定にする方法だ。
実際にコードを見ていこう。

```c
//弾の数
#define PLAYER_SHOT_NUM 200

//弾の座標
int shot_x[PLAYER_SHOT_NUM],shot_y[PLAYER_SHOT_NUM];

//敵が出現しているかのフラグ
int enemy_flag[ENEMY_NUM_I][ENEMY_NUM_J]


/*省略:for文を使って弾の座標設定・敵のフラグの設定(初期値:1)*/

for (int enemy_i = 0; enemy_i < ENEMY_NUM_I; enemy_i++) {
      for (int enemy_j = 0; enemy_j < ENEMY_NUM_J; enemy_j++) {

                    /*~~~~省略：敵に関する処理~~~~*/

                    /******弾とのあたり判定*****/
                    for (int shotf_i = 0; shotf_i < PLAYER_SHOT_NUM; shotf_i++) {
                        if (player_shot_x[shotf_i] + SHOT_SIZE > enemy_x[enemy_i][enemy_j]  && player_shot_x[shotf_i] < enemy_x[enemy_i][enemy_j] +OBJECT_SIZE)
                            if (player_shot_y[shotf_i] < enemy_y[enemy_i][enemy_j] + OBJECT_SIZE){
                                enemy_flag[enemy_i][enemy_j] = 0;//敵を消す
                            }
                    }

                    //フラグが立っている敵のみ描画する。
                    if (enemy_flag[enemy_i][enemy_j] == 1)
                       DrawGraph(enemy_x[enemy_i][enemy_j], enemy_y[enemy_i][enemy_j], enemy_imgbuf, TRUE);

    }
}

```

以上がコードだ。弾との当たり判定は先ほど言った通りだが、これをコードに起こすには弾と敵との座標がどうなっているかを考える必要がある。
状況として、食い込んでいる＝
「**弾の左端の座標が敵の右端の座標より小さい**」または「**弾の右側の座標が敵の左側の座標より大きい**」
という状況、かつ
「**弾の上側の座標が敵の下側の座標より小さい**」または「**弾の下側の座標が敵の上側の座標より大きい**
という状況だ。」
これをif文で書いたものがコードとなる。
少しわかりづらいが2つのif文と2つずつの条件からできているのがわかる。一度わからない場合には紙に書いてみることをお勧めする。

# わかりやすくまとめるべきだ。
また、これまでやってきたがある程度まとまった処理なんかは関数を別に作るべきである。

```c
//プレイヤーのキー操作+はみ出し防止
void Player_KeyOperation() {

    int movex = 0;
    
    switch (CheckHitKeyAll()) {
    case KEY_INPUT_RIGHT://右
        movex = 3;
        break;
    
    case KEY_INPUT_SPACE:
        for (int shotf_i = 0; shotf_i < PLAYER_SHOT_NUM; shotf_i++)
            if(player_shot_interval == 0)
                if(player_shot_flag[shotf_i] == 0){//空いている弾を探す
                    player_shot_flag[shotf_i] = 1;
                    player_shot_x[shotf_i] = player_x + OBJECT_SIZE / 2 - 10;
                    player_shot_y[shotf_i] = player_y - OBJECT_SIZE     + 20;
                    player_shot_interval++;
                }
        break;
    }

    player_x += movex;
}
```

これは、プレイヤーのキー操作と画面からのはみだしをまとめたものだ。もっとも細かくすることももっと大きなくくりにすることもできる。そこは自分のコードを書いている際に判断してほしい。

# 最後に
説明が少し雑だった気がしてなんだか申し訳ない。もっと説明すべきこともあったのかもしれないが、今の文章力と能力ではこの程度が私の限界である。まことに申し訳ない。わからないことやコードに関してより詳しい説明が必要な場合はコメントをいただきたい。もしかしたら続くかもしれない。
ここまで読んでいただき本当にありがとう。これを機にもっとプログラムをやってみたい人ぜひ一緒に頑張ろう！
【Java】Listの要素を削除する

###要素を一つ削除する

◆要素の値を指定する場合

```java
	public static void main(String[] args) {
				
		String arr[] = {"orange","apple","cherry","melon","grape"};
		
		List<String> list = new ArrayList<>(Arrays.asList(arr));
		list.remove("apple");
	}
```

◆要素のINDEX番号を指定する場合

```java
	public static void main(String[] args) {
				
		String arr[] = {"orange","apple","cherry","melon","grape"};
		
		List<String> list = new ArrayList<>(Arrays.asList(arr));
		list.remove(1);
	}
```


###要素を複数削除する

削除したい要素を持つlistを生成し、list.removeAll()メソッドの引数に入れる

```java
	public static void main(String[] args) {
				
		String arr[] = {"orange","apple","cherry","melon","grape"};
		
		List<String> list = new ArrayList<>(Arrays.asList(arr));
		
		List<String> remove = new ArrayList<>();
		Collections.addAll(remove,"apple","melon");
		
		list.removeAll(remove);
		
		System.out.println(list);
	}
```

###要素をすべて削除する
全削除なのでlist.sizeは0になる

```java
	public static void main(String[] args) {
				
		String arr[] = {"orange","apple","cherry","melon","grape"};
		
		List<String> list = new ArrayList<>(Arrays.asList(arr));

		list.clear();
		
		System.out.println(list.size());
	}
```
Leetcode #544: Output Contest Matches

```swift
func findContestMatch(_ n: Int) -> String {
    var team = [String]()
    for i in 1...n {
        team.append("\(i)")
    }
    var n = n
    while n > 1 {
        for i in stride(from: 0, to: n/2, by: 1) {
            team[i] = "(\(team[i]),\(team[n-i-1]))"
        }
        n = n / 2
    }
    return team[0]
}
```
【SpringBoot】スコープ外でAutowireされる内容をMock化する【JUnit5】

# 背景
`@Autowired`を用いるような`CustomValidator`が絡む内容をテストするため、`Bean`を`Mock`化します。

# やり方
実装は以下の通りです、解説はそれぞれコメントを参照してください。

```java
// この2つを付ければ@RunWith(MockitoJUnitRunner.class)やrule類のアレコレは不要
@ExtendWith(SpringExtension.class)
@SpringBootTest
class HogeTest {
    // BeanをMock化、このインスタンスがinjectされる
    @MockBean FugaDao fugaDao;

    @Test
    @DisplayName("Daoから取得できなかった場合")
    void isEmpty() {
        // mockに対する設定方法は通常のMockitoを用いる時と同じ
        when(fugaDao.selectFuga(anyInt())).thenReturn(Optional.empty());

        /* 実際のバリデーションについては省略 */

    }
}
```

# 補足
以下このやり方に関する補足です。

## 1
コンストラクタに入力できるなど、自分でインスタンス内容に関与可能な内容については、余程の事情が無ければ直接`Mock`化してテストした方がいいです。

## 2
本来具体的なクラスのテストが`CustomValidator`の実装に左右されるのはおかしいため、`CustomValidator`を`Mock`化する方がよいです。
これについては、調べた限りだとざっくり以下のやり方を見つけました。

- リフレクションを用い、`CustomValidator`を`Mock`に差し替える
- `JMockito`や`Power Mock`を用い、「そのクラスのインスタンス全てをMock化する」ようにする

この記事では諸事情によりどちらの方法も用いないこととしたため、`Bean`を`Mock`化する方法でテストを行っています。

# 関連記事
- [【SpringBoot】バリデーション（@Validated / @Valid）を任意のタイミングで動かす \- Qiita](https://qiita.com/wrongwrong/items/4f1901b2f5fa6ef135bb)
- [【SpringBoot】テストクラスで@Autowiredを動かすまで【JUnit5】 \- Qiita](https://qiita.com/wrongwrong/items/d80903a0ed553099d6a6)
【読切】非同期処理の沼~Vue.js Django編~

# あらすじ
2019年8月10日。私はVue.jsとDjango REST Frameworkを使い、ある業務システムの画面開発を担当していた。
フレームワークなんて代物はまだ触り始めて２，３か月。とは言えどこを触れば何が変わるか多少は理解してきている自負もあった。
そんな良くも悪くも弾みのついていた私を戒めるかのように、単体テスト中、そいつは突然現れた。

# 出会い
####『更新中の…ステータスが…… エラーコード：409』

「（動作確認では何度も正常に作動していた機能開発...そんなはずは...）」
NG判定とエラー内容をテスト記録として記述する。

"""
HTTP 409 Conflict はリクエストが現在のサーバーの状態と競合したことを示すステータスコード。

競合は PUT メソッドを使用したリクエストのレスポンスで最も発生しやすい。例えば、サーバーにすでに存在しているファイルよりも古いバージョンのファイルをアップロードした際に409の応答が返され、バージョン管理システムの競合が発生する可能性がある。
"""
[409 Conflict](https://developer.mozilla.org/ja/docs/Web/HTTP/Status/409)

困った困った。なけなしの知識と経験であれやこれやと思考した。
そして画面の再描画後、再度そいつは現れた。

####『更新中の…ステータスが……　エラーコード：409』


# 非同期処理の沼
「ここか。」
答えに辿り着くのに長くはかからなかった。

```typescript:heavyHoge.ts

 // post(url, data, loading)
 // url : 呼び出し先のURL
 // data : REST側に送りたいデータ
 // loading : 処理終了までローディング画面を表示

 // 重ための処理
  private async heavyProcess(): Promise<void> {
    const payload = '画面から送る何かのデータ群';
    this.$http.post(url='hoge-url1', data={'payload': payload}, loading=false);
    this.$http.post(url='hoge-url2', data={'payload': payload}, loading=false);
    // 画面の更新処理
    this.onShown();
  }
```

ボタンを押下して、この処理が走っている間に他の作業も進められるようにしたい。数十秒～数分なんて流石に待っていられない。
そのような声は当然にあり、この処理は上記の通り非同期処理で実装していた。
ここでの2つのhttp.post(以下、処理①と処理②)は類似処理を行っているが、具体的には下記の処理を行っている。

１．画面内のデータを取得しREST側へPOST
２．取得したデータの条件が合えば、外部APIへ有料の関連データを取得
３．種々のCRUD処理を行う

更にエラーの発生パターンについて調べたところ、大きく下記の2つであった。

１．処理①が上記１～３を終えて、戻り値を返して処理②を行おうとした直後
２．処理①のみor処理②のみが走るように画面側で予め条件設定し、1度目の処理を終えた直後に同じ処理のトリガーを引いた直後

つまり、処理量の多さにCRUD処理が実際には完了しきいっていない状態の時に再び処理①②を行うことでエラーが起きていた。
それを示すように awaitを付記するとloading画面は処理終了まで続くがエラーは消える。（当然っちゃ当然だが）

```typescript:heavyHoge.ts

 // post(url, data, loading)
 // url :
 // data : 何かのデータ群
 // loading : 処理終了までローディング画面を表示

 // 重ための処理
  private async heavyProcess(): Promise<void> {
    const payload = '画面から送る何かのデータ群';
    await this.$http.post(url='hoge-url1', data={'payload': payload}, loading=false);
    await this.$http.post(url='hoge-url2', data={'payload': payload}, loading=false);
    // 画面の更新処理
    this.onShown();
  }
```

とにかく、今回のエラーの発生要因やその背景なんかを整理すると
・外部APIが有料ということもあり、連続or多数の本チャンデータ取得パターンの確認を怠った。
・1度のボタン押下で行う非同期処理を２つに分けてしまった。
　（※片方は他画面で使用しているViewに飛んでいた為、このような実装になった）
・REST側で各処理を行うViewを呼び出す為の、共通クラスを用意しなかった。
　（※やってることは2個目と同じ）

しかし、上記の課題を全てクリアして当初の設計通り実装しようとしても、まだエラーの発生パターン２が解決しない。
そう、ユーザーが短時間に連続で同じ処理を行おうとした時だ。完全に非同期処理の沼に嵌まってしまったのである。


2019年8月11日。27歳の誕生日を迎えた今日、未だ解決策は見つかっていない。

To Be Continued






# 後日談
2019年8月16日。夏季休暇も空け、リードエンジニアの先輩に相談したところ、解決策らしきものはあった。只、ユーザビリティの向上が見込まれるとは言え、スケジュールの都合もあり今回の実装は断念するに至った。非同期処理は諦めて、上述したようにawaitを追加した次第である。
ちなみにその解決策だが、then()関数を用いて、非同期処理が失敗または完了するまで該当のボタン押下時処理を行えなくするというものだった。詳しくは[こちらのサイト](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Using_promises)を参照されたし。
Docker for Macを使ったローカルのKubernetesクラスタ上でSparkジョブを実行する

# Docker for Macをインストールする
以下を参照ください。
https://docs.docker.com/docker-for-mac/install/

# Kubernetesクラスタを有効にする
Preferences -> Kubernetes -> Enable Kubernetesをクリックします。
<img width="502" alt="Screen Shot 2019-08-11 at 4.52.56 PM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22858/3cda3efb-e317-28a3-055e-afdc311e72cc.png">

# SparkのDockerイメージを作成する
以下の記事を参照ください。
https://qiita.com/yohei1126@github/items/efcc906b8609d78274ff

# Sparkジョブを実行する
サンプルとして提供されている `spark-examples_2.11-2.4.3.jar`  を実行します。これはπを計算するプログラムです。
まずクラスタのURLを確認します。

```
 $ kubectl cluster-info
Kubernetes master is running at https://localhost:6443
KubeDNS is running at https://localhost:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
```

# サービスアカウントの作成

* 今回は、次の記事を参考にπを計算するSparkジョブを実行します。 https://qiita.com/ysakashita/items/1f87646ae804ba509d07
* 引用した記事の通り、ジョブの認証・認可はKubernetesのサービスアカウントで行うため、ジョブで使うサービスアカウントを作成しておきます。

```
$ kubectl create serviceaccount spark
$ kubectl create clusterrolebinding spark-role --clusterrole=edit --serviceaccount=default:spark --namespace=default
```

ジョブの実行にはSpark-submitコマンドが必要なため、リポジトリから取得して以下のコマンドを実行します。

```
$ wget https://www-us.apache.org/dist/spark/spark-2.4.3/spark-2.4.3-bin-hadoop2.7.tgz
$ tar zxvf spark-2.4.3-bin-hadoop2.7.tgz
$ cd spark-2.4.3-bin-hadoop2.7
$ bin/spark-submit \
  --master k8s://https://localhost:6443 \
  --deploy-mode cluster \
  --conf spark.executor.instances=3 \
  --conf spark.kubernetes.authenticate.driver.serviceAccountName=spark \
  --conf spark.kubernetes.container.image=yohei1126/spark:v2.4.3 \
  --class org.apache.spark.examples.SparkPi \
  --name spark-pi \
  local:///opt/spark/examples/jars/spark-examples_2.11-2.4.3.jar
```

# Sparkジョブの結果を確認する
* Sparkジョブはpodのなかで実行されるため、podの一覧を取得します。
* `kubectl logs` でpodの中のログを確認すると、πが計算されています。

```
$ kubectl get pods
NAME                                               READY     STATUS      RESTARTS   AGE
spark-pi-2e689dc329e934f38c1017d59635da59-driver   0/1       Completed   0          46m
$ kubectl logs spark-pi-2e689dc329e934f38c1017d59635da59-driver
...
Pi is roughly 3.1442157210786053
...
```
R初心者のための共発現解析（相関分析） イントロ編


#目的
- 自力で共発現解析のスクリプトを書けるようになること。

#対象
- R初心者で、オブジェクトやfor文とかよくわからない方。

#共発現解析をするための考え方～実際に一行ずつ走らせて、感覚的に理解しよう！
##Rにもともと用意されているデータセット、irisを基にイントロ
```
iris　
a <- iris #編集できるように任意のオブジェクト(a)にirisを格納
a　#aにirisデータが入っていることを確認できます。
```

##データの要素を確認
```
a[1, ] #1行目
a[, 1] #1列目
a[1, 1] #1行目かつ1列目
a[1:3, ] #1行目から3行目まで
```

##行名(row)、列名(col)が確認できる

```
rownames(a)
colnames(a)
```

##行数、列数が確認できる
```
nrow(a)
ncol(a) 
a <- a[, 1:4] #5列目は文字なので数値のみを抜き出す
```

##列間の相関を計算する
```
cor(a[, 1], a[, 1]) #Sepal.LengthとSepal.Lengthの相関
cor(a[, 1], a[, 2]) #Sepal.LengthとSepal.Widthの相関
cor(a[, 1], a[, 3]) #Sepal.LengthとPetal.Lengthの相関
cor(a[, 1], a[, 4]) #Sepal.LengthとPetal.Widthの相関
#ちなみに1列目とn列目の比較ではなく、n列目と1列目の比較をしても計算結果は同じです。
#なんでか気になる人は「ピアソンの相関係数」の算出式を調べるといいと思います。
```
##手打ちで変えていくのはめんどくさいのでfor文を使って自動化しよう！
今回は4C2パターンの相関分析だが、実際の共発現解析だと数千、億パターンの相関分析をする必要があるので、自動化は必須です。

```
#自分との相関が1なのは当たり前なのでそのようなパターンは抜こう！
n <- 2
for(n in n:ncol(a)){
  cor(a[, 1], a[, n])
}
```
オブジェクトに計算結果を入れていないから何も表示されない。

```
n <- 2
for(n in n:ncol(a)){
  test <- cor(a[, 1], a[, n])
}
```
最後の結果だけしかでない

```
n <- 2
for(n in n:ncol(a)){
  test <- c(test, cor(a[, 1], a[, n]))
}
```
一見できているように見えるけど本来結果は3つのはず

```
n <- 2
test <- c()　#testに入っている数値を初期化するためのコマンド
for(n in n:ncol(a)){
  test <- c(test, cor(a[, 1], a[, n]))
}
```
できた！
##この結果を表にしてまとめると
```
source <- rep(colnames(a)[1], times = 3) #rep(複製したいもの, times = 複製したい回数)
check <- data.frame(source = source,
                    value = test,
                    target = colnames(a)[2:4])
```
ここまで何をやっているのか分かったそこのあなた！

##では4C2の組み合わせの相関を計算するためにはどうしたらいいのだろうか？
ここまでの内容を理解出来たらそこのあなた！for文を使って全組み合わせを算出し、以下のような表でまとめてみよう！

|        | source | value | target |
|:------:|:------:|:-----:|:------:|
|1|A|-1~1|B|
|2|A|-1~1|C|
|3|A|-1~1|D|
|4|B|-1~1|C|
|5|B|-1~1|D|
|6|C|-1~1|D|

#次回の内容
[R初心者のための共発現解析（相関分析） 実践編](https://qiita.com/Ykeito/items/38191088a1edd2ba4979)
javascriptを一行使用するだけで、プルダウンメニューで選択した瞬間に画面遷移

プルダウンメニューから選択した瞬間に画面を移動する機能の実装に躓いたのでメモします。
以下のソースをhtmlファイルに記述します。

```html
<select onChange="location.href=value;">
    <option class="selected">並び替え</option>
    <option value="URL1">新しい順</option>
    <option value="URL2">参考になった順</option>
</select>
```

以下の写真のようにブラウザに表示されます。
![515f9a9a4eed683fbe048261b938a309.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477146/3cae077c-b63d-5bc9-b5ff-e69828a9afd0.png)

これで、新しい順を選択するとURL1、参考になった順を押すとURL2に遷移するようになります。 `onChange="location.href=value;"`の一文をselectタグに追加するだけで機能するので便利だと感じました。
Eclipseでクラス図を作成

## 概要
javaでクラス図を作成する．
やることは以下の三つ．

- GEFのインストール
- AmaterasUMLのインストール
- クラス図の作成

![classfig.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479931/43990151-7d6c-e696-508e-411ad5b11fd8.jpeg)


## 参考サイト
https://qiita.com/meio/items/e71dbcf32dbfce59a987

## 前提条件 
Eclipse(4.0.7)のインストール
https://www.eclipse.org/downloads/

## GEFのインストール
Eclipseのヘルプ>新規ソフトウェアのインストール
作業対象に
`--すべての使用可能なサイト--`
を指定し，
`GEF (MVC) SDK`
をインストール．<img width="946" alt="スクリーンショット 2019-08-11 17.33.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479931/3072822c-048e-1167-c65f-a0aa951a8fdf.png">

## AmaterasUMLのインストール
[AmaterasUML](http://amateras.osdn.jp/cgi-bin/fswiki/wiki.cgi?page=AmaterasUML)からAmaterasUML_1.3.4.zipをダウンロード.
三つのjarファイルを， `Eclipse.app/Contents/Eclipse/dropins/`ディレクトリに移動．<img width="712" alt="スクリーンショット 2019-08-11 17.39.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479931/b210fe1f-02ff-fa2d-ea49-5ff366988471.png">

## Eclipseの再起動
## クラス図の作成
クラス図を作成したいディレクトリで， 新規＞その他＞AmaterasUML＞クラス図 でクラス図の新規ファイルを作成．

## まとめ
クラス図を作成する一つの方法．メソッド数が多いと文字はかなり小さくなってしまう．
[参考](https://qiita.com/meio/items/e71dbcf32dbfce59a987)を真似しただけだが， つまずいたところがいくつかあった．
文字列（配列）を作成せず一文字ずつ処理する方法

    #include <bits/stdc++.h>
    using namespace std;
    
    int main(){
        char ch;
        cin >> ch;
        cout << ch << endl;
        return 0;
    } 
    //入力→ABC
    //出力結果→A
char型は一文字だけ入る箱である。そのため、2つ以上の文字をchar型箱に入れる場合、初めの1文字目のみ箱に入る！（2文字目以降の文字は排除される）

    #include <bits/stdc++.h>
    using namespace std
    
    int main(){
        char ch;
        while(1){
            scanf("%c",ch); 
         //cin >> chにすると、改行が読み込めないため出力結果がABCCCCC…となってしまう問題が発生する！//
            cout << ch << endl;
        }
        return 0;
    }
    //入力→ABC
    //出力結果→ A
            　 B
               C
cinは改行（'/n'）と空白を削除する役割を持っている！
入力をEOFまで読み込む場合はwhile(cin >> ch)と書けばよい。 
配列を作らないで、複数の文字を一文字ずつ読み込むためには（初めの1文字→次の2文字→…）while(1)でループさせるしかない！！
それが唯一の配列を使わない方法！
[Docker知識不要] Ruby on railsの環境をDocker上に作る方法

# ruby on railsの環境をDocker上に作る方法

こんにちは、ITエンジニアの田中です！
2019年11月30日時点動作することを確認しています！

この記事を読むと下記の事ができるようになります。

- Docker上でRuby on Railsの環境を作れる。

下記のことが事前に完了していることが前提です。

- Dockerがインストールされている

# インストールされる各アプリのバージョン

Ruby   2.6.1
Rails  5.2.3
nodejs v10.16.3

## フォルダ構成

- 任意フォルダ
    - src
        - Gemfile
        - Gemfile.lock
    - Dockerfile
    - docker-compose.yml

**Gemfile**

```
source 'https://rubygems.org'
gem 'rails', '~> 5.2.3'
```

**Gemfile.lock**

空ファイル

**Dockerfile**

```
FROM ruby:2.6.1
RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - && apt-get update && apt-get install -y nodejs --no-install-recommends && rm -rf /var/lib/apt/lists/*

RUN mkdir /myapp
WORKDIR /myapp
ADD src/Gemfile /myapp/Gemfile
ADD src/Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
ADD . /myapp
```

**docker-compose.yml**

```
version: '2'
services:
  db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
  web:
    build: .
    command: /bin/sh -c "rm -f /myapp/tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"      
    volumes:
      - ./src:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
```

## コマンド

```
docker-compose run web rails new . --force --database=postgresql
```

```
docker-compose build
```

config/database.ymlの編集

```
default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password:
  pool: 5
```

データベースの作成

```
docker-compose run web rake db:create
```

Dockerの起動

```
docker-compose up
```

http://localhost:3000/にアクセスして下記のページが表示されれば成功

![RubyOnRails.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282387/03fb3ab2-850f-987e-efc7-14c3204d8463.png)


## 注意点

Gemfileを更新した場合は、下記のコマンドを実行してイメージを作り直してください。

```
docker-compose build
```

理由としては、docker-compose run web bundle installしても、既存のコンテナーに対して実行されるため、docker-compose upすると新しいコンテナーを生成してしまうため、リセットされてしまいます。
【初心者】AWS Elastic Beanstalk を使ってみる

# 目的
- AWS Elastic Beanstalkについて話題になり、知ったかぶりするため、基本動作を確認することにした。（目標：なんとなくアプリのデプロイまでできること）

# AWS Elastic Beanstalk とは（自分の理解）
- インフラ(EC2、ELB等)の構築、運用を自動化し、アプリケーションの実行環境として一元管理できるサービス。

# やったこと
- Elastic Beanstalk によるサンプルアプリ実行環境(python)の作成
- 構成変更(EC2*1 ⇒ ELB+EC2*2)
- アプリケーションのデプロイ(追加バッチとローリング)

# 構成図
![ebt13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/3691960d-8477-f3fd-160a-a0d13a66b610.png)

# 動作確認

## Elastic Beanstalk 「アプリケーション」の作成
- Elastic Beanstalk の画面で、「今すぐ始める」を選択する。設定値としては、「アプリケーション名：mksamba-ebtalk-sample」、「プラットフォーム：Python」とする。
![ebt01a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/05107216-a8ce-f5aa-cca8-9b9b10d7ac3d.png)

- 数分で環境が構成され、アプリケーション「MksambaEbtsample-env」の作成が完了する。デフォルト構成（最小構成）のため、EC2インスタンス(t2.micro) 1台、ELBなしとなり、その1台のインスタンス上のみでPythonの実行環境が動作する。

![ebt03a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/30d81ea9-4b13-f0bb-9738-27e56fab84e0.png)

- WEBアクセス用のURLが用意されるため、ブラウザからアクセスして初期画面を確認する。apacheとかと同様の「無事インストールできましたね」的な画面が表示される。

![ebt04b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/a0f37509-a396-39ad-7146-f2aacf3f4f98.png)

## アプリケーションのデプロイ
- [公式ガイド：チュートリアル及びサンプル](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/tutorials.html)のところに、pythonのソース(python-v1.zip)が配布されており、このソースが初期状態として使われている様子。
- zipファイルの中にある application.py の中身（表示文言および背景色）を少し変更し、再度cron.yaml(こちらは変更なし)と合わせてzipファイルにする。
- 「アップロードとデプロイ」のボタンから、zipファイルをアップロードしてデプロイを行う。
- デプロイが無事完了し、文言と色が変わったことを確認する。

![ebt06a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/48c6ab18-2b4d-9e67-d508-ef3ae702913c.png)

## 構成の変更
- EC2 1台構成だとローリングでのデプロイができないため、ELB + EC2 2台の構成に変更する。
- 「設定」-「容量の変更」のところで、値を以下に変更する。他の値はデフォルト値とする。
    - 環境タイプ：　単一のインスタンス ⇒ 負荷分散
    - インスタンス：　（設定なし）　⇒　最小2, 最大2
- 設定を更新すると、ELB(CLB)が作成され、EC2も2台に増加する。

![ebt16a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/7c680f83-092d-7007-d352-61d20fe7acac.png)

## アプリケーションのデプロイ（追加バッチとローリング）
- 「設定」-「ローリング更新とデプロイの変更」のところで、値を以下に変更する。他の値はデフォルト値とする。
    - デプロイメントポリシー：　1回にすべて　⇒　追加バッチとローリング
    - バッチサイズ：　（設定なし）　⇒　固定 1インスタンス/1回

![ebt14a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/a1e72ba5-a1b2-5210-8962-4b4532331533.png)

- 再度「アプリケーションとデプロイ」のボタンから、デプロイ（色を変えるだけの更新）を行う。
- ポリシーを「追加バッチとローリング」としたため、まずバッチ（追加の1台）を作成し、そこに新しいアプリをデプロイしてELBに組み込む。その後で既存のEC2インスタンスへのデプロイを行い、一番古い？インスタンスが削除される。
- アプリが更新されていることを確認する。

![ebt15a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/6f38ab03-2f7b-8e72-de9a-19ec39a4e6d7.png)

# 所感
- いろいろ奥が深そうだがこの辺にしておき、実案件で使うことがあれば深堀したい。

# 参考記事
- [AWS Elastic Beanstalkのデプロイメントポリシーについて](http://shepherdmaster.hateblo.jp/entry/2019/01/28/232511)
    - 各デプロイポリシーの動作仕様がが分かりやすく記載されている。
yarn devするとエラーなしでクラッシュする

## 問題
Nuxt使用時に、yarn devもしくはyarn run devを行うとエラーやログを出力せずに、nodemonがクラッシュする。
実際のエラーはこんな感じ:

```
[HPM] Proxy created: /  ->  http://localhost:5000
ℹ Preparing project for development                         02:06:33
ℹ Initial build may take a while                            02:06:33
✔ Builder initialized                                        02:06:34
✔ Nuxt files generated                                       02:06:34

● Client █████████████████████████ building (52%) 352/386 modules 34 active
 babel-loader › ts-loader › vue-loader › src/hoge/path/mom.vue

● Server █████████████████████████ building (37%) 228/240 modules 12 active
 url-loader › src/static/hoge.png

[nodemon] app crashed - waiting for file changes before starting...
```

### 環境
VagrantのDebian9 (Windows10 Pro上)
`cat /etc/os-release` -> `PRETTY_NAME="Debian GNU/Linux 10 (buster)"`
↑ stretchをbusterアップデートしてしまったため...

## 原因
メモリが足りなかったためです！！！！！！！！！！！
`free -h`して確認すると、512MBしか割り当てられてませんでした。みなさんも気を付けましょう！！！！！！！！！！！！！！！
【Java】特定のオブジェクトが含まれているかを判定するListメソッド



##list.contains()
特定の要素があるかを判定し、booleanで返す

```java
	public static void main(String[] args) {
				
		String arr[] = {"orange","apple","cherry","melon","grape"};
		
		List<String> list = new ArrayList<>(Arrays.asList(arr));
		
	if(list.contains("banana")) {
			System.out.println("存在する");
		}else {
			System.out.println("存在しない");
		}
	}
```


##list.indexOf()
特定の要素のINDEX番号をintで返し、存在しない場合は-1を返す


```java
	public static void main(String[] args) {
				
		String arr[] = {"orange","apple","cherry","melon","grape"};
		
		List<String> list = new ArrayList<>(Arrays.asList(arr));
		
		int x = list.indexOf("orange");
		System.out.println(x); 
		
		if(list.indexOf("orange") != -1) {
			System.out.println("存在する");
		}else {
			System.out.println("存在しない");
		}

	}
```
.gitignoreでgitにコミットしないディレクトリを管理する【node_modules】

# node_modulesなどはgitにcommit、pushする必要はない
node.jsの開発において、

```
npm install --save [library name]
```
でインストールしたバッケージは、`package.json`のdependenciesにて依存関係が定義されている。

```JSON
{
  "name": "project-name",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "cheerio": "^1.0.0-rc.3",
    "puppeteer": "^1.19.0",
    "request": "^2.88.0",
    "request-promise": "^4.2.4"
  }
}
```

`npm install`を実行すれば、`package.json`の依存関係を参照して必要なライブラリがダウンロードされる。
したがって、ライブラリの実体が保存されているnode_modulesを含める必要がない。
プロジェクトの容量が無駄に大きくなってしまうので、`.gitignore`ファイルでcommit対象から外して管理するのがいい。

# .gitignoreファイルの作成
`.gitignore`の作成は、通常のファイル作成と同様に

```
touch .gitignore
```
で作られる。
ファイルは、**ワーキングディレクトリ直下(プロジェクトの最上位のディレクトリ)に作成**する。
` .git`ディレクトリに置くと読み込まれないので注意。

# .gitignoreの記述方法
下記のように記述できる。

```
# ディレクトリを指定する場合
node_modules/

# ファイルのパターン一致でコンパイルなどで生成したファイルを指定する場合
*.com
*.class
*.dll
*.exe
*.o
*.so
```
ディレクトリの場合は`ディレクトリ/`で指定でき、
ファイルの場合は正規表現で指定できる。

# 設定後、実際にcommitしてみて確認
`.gitignore`を設定後、commitすると

```
$ git add *
The following paths are ignored by one of your .gitignore files:
node_modules
```
のように除外されたパスが表示される。
意図通り除外されているか確認出来る。


# 参考書籍
[GitHub実践入門](https://amzn.to/2DEdyvG)
弊社での新卒エンジニア向け課題図書になった。
必要なコマンドを随時調べるのも良いけど、最初に一通り理解して置くとスムーズにいく。
PythonでのXMLファイル操作例












# はじめに
今回は今研究で扱っているxml形式のデータをPythonでどう扱うのかをまとめてみました。
Qiitaに記事を出す練習も兼ねているので、わかりずらいかもしれません。悪しからず...
基本的には、公式チュートリアルを参照しています。
(https://docs.python.org/ja/3/library/xml.etree.elementtree.html)
##環境
OS: macOS Mojave
pythonのバージョン :3.7.2
#xmlとは
簡単に言えば、複雑な情報をみやすくするための言語です。
xmlの構造の一例を以下に示します。
(引用元:pythonのElementTree XML APIのサイトhttps://docs.python.org/ja/3/library/xml.etree.elementtree.html)

```xml:country.xml
<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank>1</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank>4</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
    <country name="Panama">
        <rank>68</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor name="Costa Rica" direction="W"/>
        <neighbor name="Colombia" direction="E"/>
    </country>
</data>
```
それぞれ詳しくみていきます。
XMLでは各情報(contents)を要素名(element)を記載したタグで括ります。

```xml:
<element>contents</element>
```
また、要素名が同一の場合は、各要素に対して属性(attribute)と属性値(attribute value)をつけることがあります。

```xml:
<element attribute="attribute value">contents</element>
```

#pythonでxmlを扱う一例
ここでは、上のcountry.xmlをファイルとして扱うと仮定して、xml解析方法を説明します。
まずxmlを扱うためのライブラリをimportしましょう。

```python:
import xml.etree.ElementTree as ET
```

次に、xmlファイルを以下のコードで読み込みます。

```python:
#xmlデータを読み込みます
tree = ET.parse('country.xml')
#一番上の階層の要素を取り出します
root = tree.getroot()
```
rootには読み込んだxmlの最上階層にある<data></data>の情報を保持しています。
rootの要素名と属性をみたい場合は次のコードでみれます。

```python:
print(root.tag)
print(root.attrib)
```


```:実行結果
data
{}
```
rootの要素名がdataと出てきました。属性はないので、ないも出てきてないです。

次に、rootより下の階層は以下のようにfor文を使って抽出できます。

```python:
for child in root:
    print(child.tag)
    print(child.attrib)
```
```:実行結果
country
{'name': 'Liechtenstein'}
country
{'name': 'Singapore'}
country
{'name': 'Panama'}
```
dataの下にある3つの国の情報が出てきましたね。属性と属性値は辞書型として抽出することができます。とても便利...
辞書型なので、以下のようにして、国名の情報を抽出することができます。

```python:
for child in root:
    print(child.attrib["name"])
```
```:実行結果

Liechtenstein
Singapore
Panama

```

childをもう一度for文に入れれば、さらに下の階層の情報を見ることができます。しかし、一つ下の階層の情報を見るならば、findを使った方がやりやすいです。例えば、各国のrank情報を抽出したい場合は以下のようにします。

```python:
for child in root:
    print(child.attrib["name"],child.find("rank").text)
```

```:実行結果
Liechtenstein 1
Singapore 4
Panama 68
```

findで指定した要素の下の階層の要素を指定することができます。今回は<country>の下にある<rank>を指定しました。<></>で括られている情報を文字列として、抽出するには.textと書けば、抽出することができます。


#まとめ

初めて、本格的な記事を書きましたが、文章に落とし込む難しさを実感しました。同時に、今まで参照してきた技術記事がどれだけ凄いのかを改めて実感しました。今後も自分のスキルアップのために、頑張りたいと思います...!　もし改善点があれば、気軽にコメントください。
<button>のデフォルトのうざい変なグレイのデザインを消し去る方法

##buttonの変なグレイの正体
buttonのレイアウトは、ブラウザ毎に、デフォルトでボタンっぽいレイアウトを付与する設定がされています。

###消す方法

cssでデフォルトの挙動を消し去るように上書きします。

```css
button {
  /* 下の二つのプロパティーが button だと変なグレイがつくので、noneに上書き。 */
  -moz-appearance: none;  /* Geko (firefox) */
  -webkit-appearance: none; /* Chrome*/
}
```

##例

```html
<button style="-webkit-appearance: none">-web-kit-appearance: none</button>
<button style="-webkit-appearance: button">-web-kit-appearance: button</button>
```

###結果
<img width="346" alt="Screen Shot 2019-08-11 at 17.31.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200431/058772f2-78fb-9778-ef33-3fd55f62b8a6.png">
Spark 2.4.3 の Docker イメージを作成する

以下のコマンドでビルド済みSparkのコードを取得します。

```
$ wget https://www-us.apache.org/dist/spark/spark-2.4.3/spark-2.4.3-bin-hadoop2.7.tgz
$ tar zxvf spark-2.4.3-bin-hadoop2.7.tgz
```

以下のコマンドでDockerイメージをビルドし、DockerHubにpushします。

```
$ ./bin/docker-image-tool.sh -r yohei1126 -t v.2.4.3 build
$ ./bin/docker-image-tool.sh -r yohei1126 -t v.2.4.3 push
```

これでDockerイメージが3個あります。

```
$ docker images | grep spark
yohei1126/spark-r                                                           v2.4.3              3fe1391b05dc        23 minutes ago      741MB
yohei1126/spark-py                                                          v2.4.3              181ffe00ea8f        24 minutes ago      447MB
yohei1126/spark                                                             v2.4.3              4758132028fd        24 minutes ago      356MB
```
Bashのコンソール上でよく使う操作まとめ[カーソル移動、文字の削除  ]

# 概要
　プログラミングやファイルの操作などでCUIでの操作をメインにするようになると、ターミナルでの操作を１日に数百回、数千回の単位で行うようになります。
　そのときに今まで限られたショートカットしか使っていなかったのですが、ショートカットを使って効率化できると、時間の節約になると思い、まとめていみました。

## 環境
```
$ bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
Copyright (C) 2007 Free Software Foundation, Inc.
```

　ターミナル(bash)上で`man bash` を入力することでbashの説明を見ることができます。
　今回は、キーバインドをみたかったので、
`/key bindings`で検索すると目的の箇所を見ることができます。


## カーソル移動、文字の削除
Ctrl+A,E,U,Kだけでもだいぶ楽になります。

man bash での説明
カーソル移動について
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253261/96ffd582-02fb-9cf0-6cc9-862a3da687ea.png)

文字の削除、コピーについて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253261/d43adc73-710d-807c-f5d2-f0572dfb6049.png)

参考
https://qiita.com/odacoh/items/b94be0deecaaa27b0263
http://yonchu.hatenablog.com/entry/20110214/1297662332

| よく使うキー | 動作 |
|:-:|:-:|
|  Ctrl + A |  カーソルを先頭に移動 |
|  Ctrl + E |  カーソルを末尾に移動 |
| ESC + F| カーソルを1単語進める|
| ESC + B| カーソルを1単語戻る| 
| Ctrl + U | カーソル位置から行頭までを削除 |
| Ctrl + K| カーソル位置から行末までを削除　|
| Ctrl + W | カーソル位置から単語の先頭までを削除 |
| ESC + D | カーソルから単語の末尾まで削除 | 

###ESCを使う操作での注意 
ESC + F,Bの操作で戸惑ったのは、連続で複数の単語間を移動したい場合に、

例えばこの例で、行末からcpまで移動したい場合

```
$ mv fileA dirB & cp fileC dirB
```

ESC を押しっぱなしにして、Bを２回連続でいくと、２回目のbは普通の入力とと判定されてしまうので、

```
mv fileA dirB & cp fileC bdirB
```

というように、１単語分戻ったあと、bが入力されてしまうことになります。　
　
　そのため、２単語分戻りたい場合は、Esc+b Esc+bともう一度Escキーから指を話してキーを押しなおす必要があります。



###雑感：一文字の移動、操作について
 また、僕は一文字進めるぐらいなら矢印キーを使ってもかわらない気もするので、Ctrl+B,Ctrl+Fなどは使っていませんが、常にホームポジションから動かずに全ての操作をしたいという人には一文字移動や、一文字削除のキーバインドも覚えるといいと思います。

## Metaキーの変更
 上にスクショしたbashのマニュアルをみて貰えばわかりますが、ESCキーを押しましょうと僕が書いているところは、マニュアルでは`M-`と表記してあります。
 
 これは、Metaキーの略です。

　Metaキーが標準ではESCに割り当てられているみたい（Altキーにも割り当て？）なので、説明ではESC＋と書いていたのですが、ESCキーはキーボードの一番左上にあるので、押しにくいですよね。

　しかも<strong>ESCを使う操作での注意 </strong> で書いたように連続しての入力の際に、いちいちキーを押しなおす必要があるという欠点があります。

　これらの問題は、Metaキーをoptionにも割り当てることで解決されます。

参考：http://playet.jugem.jp/?eid=167

ターミナル ->　環境設定 -> プロファイル -> キーボード で

メタキーとしてOptionキーを使用にチェックを入れるとOptionキーがMetaキーとして使えるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253261/bc4f2376-4b85-dcf7-3f2d-6e3174838caa.png)
uGUIのImageにGlowっぽい輪郭線を付けるスクリプトの改良

# 初めに

UnityのuGUIのImageにOutlineスクリプトを適用すると、画像に輪郭線を付けることが出来るが、Glowの様なぼやけた輪郭線を付けるのは難しい。
対応策としてはこちらのコガネブログさんでも紹介されているが、以下のGlowImageというプロジェクト内にあるC#とShaderコードを使うという方法がある。
http://baba-s.hatenablog.com/entry/2017/12/31/211500
GlowImageのGithub
https://github.com/SylarLi/GlowImage

今回自分の勉強がてらこちらのコードを解読していた時に、「UnityのMask機能に対応していない事」と「シェーダーで最適化出来そうな所がある事」に気づいたので、改良してみた。

# 元コードのGlowImageで行っている事
箇条書きにすると以下のようになる
・Imageコンポーネントを継承したGlowImageクラスを作成
・GlowImageクラスのパラメーターから、既存Imageにアウトライン用の頂点とメッシュを追加する
・シェーダーでアウトラインを描画しつつガウシアン処理でぼかす
・最後に通常のImageを描画して行い終了

# UnityのMask機能に対応させる
UnityのMask機能は、canvasRendererに登録されているマテリアルからマスク処理が適用されているコードを選別して処理を行っている。
既存コードではcanvasRendererに登録する処理が抜けていたため、canvasRendererをオーバーライドして、Image.materialにマテリアルを格納してからGraphicクラスのmaterialForRenderingを呼んで対応した

``` C#
        public override Material materialForRendering
        {
            get
            {
                if(m_Material == null)
                {
                    material = new Material(Shader.Find("UI/GlowImageImprovement"));
                }
                // ここでパラメーター設定行う
                material.SetFloat("_OutlineSize", m_OutlineSize);
                material.SetColor("_OutlineColor", m_OutlineColor);
                material.SetFloat("_OutlineStrength", m_OutlineStrength);
                string format = "QUALITY_{0}";
                foreach (var item in System.Enum.GetNames(typeof(ImageOutlineQuality)))
                {
                    material.DisableKeyword(string.Format(format, item.ToUpper()));
                }
                material.EnableKeyword(string.Format(format, quality.ToString().ToUpper()));

                return base.materialForRendering;
            }
        }
```

# ガウシアン処理の最適化
既存コードのシェーダーだと通常の平滑化処理のため重み(3x3, 7x7など)の数が増えるほど、ループ数が9, 49などかなり顕著に多くなっている。
画像処理のぼかし処理でよく使われるガウシアンブラーを使用する時、xとyの要素を切り離して処理できる場合ループ数を抑えることが出来る。
今回は以下のサイトを参考にコードを組んだ。

【Unity】【シェーダ】ガウス関数を使ってブラーを掛ける
http://light11.hatenadiary.com/entry/2018/05/20/010105
Unityでガウシアンブラーを実装する
http://edom18.hateblo.jp/entry/2018/12/30/171214

# サンプルプロジェクト
コード全文は以下のプロジェクトを参照してください
※Windows10 + Unity2018.4.0f1で動作確認済み。
※ImageのTypeが「Simple」のみ対応
https://github.com/madoramu/GlowImageImprovement

実行結果
![ss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332769/07474313-ea1b-92f1-3094-b011ce928bcd.png)

# 補足
UnityのOutlineは頂点と頂点カラーを追加しているだけなので元画像も含めて1passで描画しているが、今回のコードはガウシアン処理の関係上2passで描画しなくてはいけないので、処理的には少し重いかも・・・
Vuetify のアップデート(v1.5.x => v2.x) with TypeScript and Webpack

# 本記事の立ち位置

[ここ](https://qiita.com/filunK/items/e71999d5abef404744b3)の拡張版。

[Vuetify](https://vuetifyjs.com/en/)とは`Vue.js`用のUIフレームワークです。

## 相違点

- `vue-cli` を利用しない
- `package`と`webpack`を更新してアップデート
- サンプルプログラムを抜粋して記載

## How to

#### 1. `package`のアップデート

- `npm update`を利用しても`vuetify`などの一部パッケージが最新版にならない場合があります。これは既存のアプリを破壊（動かなく）してしまう可能性があると判断されているからです。
- それを抑えてなお破壊的な更新を行いたい場合は[ncu](https://github.com/tjunnone/npm-check-updates)を利用しましょう！

```bash
$ npm update # まずは普通にアップデート
$ ncu # アップデートできるパッケージの確認
$ ncu -u # 破壊的アップデート
```

#### 2. `webpack`の更新

- `vuetify`をコンパイルするために`vuetify-loader`をインストールします。
- `webpack-cli`

```bash
# 以下はやってない人
$ npm i -g webpack webpack-cli 
$ exec $SHELL -l # コマンドプロンプトの再起動（linux, mac）
$ npm i -D vuetify-loader
```

```js:webpack.config.js
const VuetifyLoaderPlugin = require('vuetify-loader/lib/plugin')

let baseWebpack = {
    /* 略 */
    plugins: [
        new VuetifyLoaderPlugin()
    ],
    /* 略 */
};

module.exports = baseWebpack
```

#### 3. Vuetify の読み込み

`src/plugins`は作成する必要はありませんが、ライブラリは別ファイルで管理しておくと可読性が良くなります。

`tsconfig.json`への設定も忘れずに

```json:tsconfig.json
{
  ***
  "types": [
    "vuetify"
  ],
  ***
}     
```

```ts:src/plugins/vuetify.ts
import Vue from 'vue'
import 'vuetify/dist/vuetify.min.css'
import Vuetify from 'vuetify/lib'

Vue.use(Vuetify);

/*
// directiveも利用する場合
import { Touch } from 'vuetify/lib/directives'

Vue.use(Vuetify, {
  directives: {
    Touch
  }
});
*/

export default new Vuetify({
  icons: {
    iconfont: 'fa'
  }
});
```

```ts:src/main.ts
import Vuetify from './plugins/vuetify';
import App from './components/App'

new Vue({
    vuetify: Vuetify,
    template: '<App/>',
    components: {
        App
    }
}).$mount('#app')
```

以上！
【Java】配列からListへの変換

配列からListへ変換をしたい

```java
public static void main(String[] args) {
				
	String arr[] = {"orange","apple","cherry","melon","grape"};
	List<String> list = Arrays.asList(arr);
```

arrを引数にしたArrays.asListをlistに代入


###要素数を追加したい場合

####NG例

```java
	List<String> list = Arrays.asList(arr);
	list.add("banana");
```
(原因)Arrays.asList()は追加や削除といったListのメソッドの操作を受け付けない


####OK例
```java
	List<String> list = Arrays.asList(arr);
	List<String> list2 = new ArrayList<>(list);
	list2.add("banana");
```
listをArrayListの引数にしてlist2に代入
上記を簡潔に書くと

```java
	List<String> list = new ArrayList<>(Arrays.asList(arr));
	list.add("banana");
```
PySC2 - StarCraft II 強化学習環境を構築してみる（Windows 10）

# PySC2のインストール
Windows 10でDeepMindのPySC2のミニゲームを動かすまでのメモです。StarCraft IIのゲームは20GBぐらいのサイズです。そのため、標準のインストール先（"C:\Program Files (x86)\StarCraft II"）にインストールできない人もいるのではないでしょうか。Pythonを触っていないと環境変数の設定でハマる可能性があるため、本記事を参考にしてください。

## Pythonのインストール
Anacondaを使用します。以下のサイトからPython3.x系のWindowsのインストーラーをダウンロードしてインストールしてください。

https://www.anaconda.com/distribution/#download-section

## StarCraft IIのインストール
StarCraft IIのインストールは以下のサイトからになります。右上の「PLAY FREE NOW」からインストールできます。ゲーム自体は20GBぐらいになりますので、私はEドライブにインストールしました。

https://starcraft2.com/en-us/

私のインストール先：E:\Games\StarCraft II

## Pythonの環境作成
スタートメニューから、「Anaconda Prompt」を実行します。condaコマンドで新しい環境を作成します。

```
(C:\Users\kenta\Anaconda3) C:\Users\kenta>conda create -n py36 python=3.6
(C:\Users\kenta\Anaconda3) C:\Users\kenta>activate py36
```

新しい環境を作成したら、activateコマンドで新しい環境に変更します。

```
(C:\Users\kenta\Anaconda3) C:\Users\kenta>activate py36
```

## PySC2のインストール

pipでインストールします。

```
(py36) C:\Users\kenta>pip install pysc2
```

## ミニゲームのインストール
GitHubのPySC2からミニゲームをダウンロードします。
https://github.com/deepmind/pysc2

README.mdに書かれている以下のURLからzipファイルをダウンロードします。
https://github.com/deepmind/pysc2/releases/download/v1.2/mini_games.zip

ダウンロードしたzipファイルを展開する前に、StarCraft IIのインストール先にフォルダ（ディレクトリ）を作成します。

```
(py36) C:\Users\kenta>e:
(py36) E:\>cd \Games\StarCraft II
(py36) E:\Games\StarCraft II>md Maps
```

Mapsフォルダにzipのミニゲームを展開すると、Mapsフォルダは以下のようなファイル構成になります。

```
(py36) E:\Games\StarCraft II>cd Maps
(py36) e:\Games\StarCraft II\Maps>tree /F
E:.
└─mini_games
        BuildMarines.SC2Map
        CollectMineralsAndGas.SC2Map
        CollectMineralShards.SC2Map
        DefeatRoaches.SC2Map
        DefeatZerglingsAndBanelings.SC2Map
        FindAndDefeatZerglings.SC2Map
        MoveToBeacon.SC2Map
```

# 事前設定されたミニゲームの実行
部分的な課題を学習するミニゲームを実行してみます。

## PySC2の環境変数設定
StarCraft IIのインストール先をカスタマイズした場合は、PySC2の環境変数を設定する必要があります。ここで注意しないといけないことは、ディレクトリを'\'ではなく'/'で設定することです。また、'"'で囲まないようにしてください。

```
(py36) E:\Games>set SC2PATH=E:/Games/StarCraft II
(py36) E:\Games>echo %SC2PATH%
E:/Games/StarCraft II
```

## マップの確認
既知のマップのリストは以下のコマンドで確認することができます。

```
(py36) E:\Games>python -m pysc2.bin.map_list
```

## ミニゲームの実行
ミニゲームは以下のコマンドで確認することができます。

```
(py36) E:\Games>python -m pysc2.bin.agent --map BuildMarines
```

s2client-protoのprotobufとのやり取りも表示されます。
https://github.com/Blizzard/s2client-proto
![BuildM.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32580/6007e832-36c5-75a8-c40c-b642151e7578.png)

## 他のミニゲームを実行するには

ミニゲームのmap引数は以下から選択できます。

BuildMarines
CollectMineralShards
CollectMineralsAndGas
DefeatRoaches
DefeatZerglingsAndBanelings
FindAndDefeatZerglings

それぞれのミニゲームは以下の動画を参考にしてください。
https://youtu.be/6L448yg0Sm0

## ラダーマップを使う場合は
以下のサイトからダウンロードして、Mapsフォルダに展開します。使い方はミニゲームと一緒です。
https://github.com/Blizzard/s2client-proto#downloads