OmniAICreator/Qiita-1.07M huggingface dataset:
GolangでPaizaに挑戦するときの個人的Tips

#概要
paizaをGolangでPaizaに挑戦するときの個人的Tipsです。
気づきがあればどんどん追記していきます。
（最終更新 2020/1/29）

内容は主に問題へのアプローチの仕方と、よく使うコードのメモ書き。
個人的なメモなので必ずしもベストプラクティスではないです。
したがってより良い方法をアドバイスいただけると助かります。

#問題へのアプローチ
##標準入力
以下の記事を参考に標準入力を受け取るテンプレートを作成する。
https://qiita.com/zurazurataicho/items/c8856fc97924decf23b41


##回答の作成のフロー
1.標準入出力のコピペ
2.標準入力の値の分解して変数に落とし込む
3.ロジックを考える
4.処理を書く

##デバック
各ロジックのセクションごとにデバックをすること。
これを怠ると途中で流れを追えなくなったとき大幅なタイムロスになる。
したがってセクションが組み上がったら例え簡単な処理でも出力結果が自分の意図通りになっていることを確認すること。

##関数の作成条件
セクションにおける処理が2つ以上の場合は関数に切り分けた方が見やすいかも。
逆に長くても処理が１つなら関数として書き出すのは時間がもったいない気もする。
あるいは巨大なコメントアウトでも設けるか。

あくまで問題の回答の速さと正答率、処理速度を競うので過度な可読性と保守性は切り捨てよう(戒め。

#よく使うヤツ
##空のスライスの作成
```go
array := []int{}
```
データを放りこみたいが、いくつ入るかわからない時。



##長さのあるスライスの作成
```golang
length := 5
var array = make([]int, length)
```
問題では処理や登場人物などの長さが与えられるケースが多いのでよく使う。



##空のスライスに値を追加する
```go
appendValue := 0
array := []int{}
array = append(array, appendValue)
```
回答（標準出力）するデータを作る時。



##配列の最初/最後を除いたスライスの作成
```golang
length := 5
var array []int
//=> [1,2,3,4,5]

dataRemoveFirst := array[1:]
//=> [2,3,4,5]
dataRemoveLast := array[:length-1]
//=> [1,2,3,4]
```
問題に使用されている標準入力データのいらない部分を削ぎ落とす時。
特に１行目(array[0])は必要ないケースが多いので「array[:length-1]」はよく使う。
また、最後を削る時は「:スライスの長さ」ではなく「:スライスの長さ-1」にすること。


##数値変換
```golang

number, _ := strconv.Atoi
```

##配列のソート
```golang

sort.Strings(words)
sort.Ints(numbers)
```

詳しくは[sortパッケージ](https://golang.org/pkg/sort/)を参照。
いろいろsortの設定ができるがそのケースに直面した時に更新しようと思う。

##配列の長さ
```golang

length := len(array)
```
MySQL SlowQueryの対処法

## 概要

MySQLでSQLの実行が遅い場合の原因と対処法についてメモ

## 目次

- MySQLの評価順序の確認
- HAVING句を使わない
- JOIN時に作成されるテーブルが小さくなるようにJOINを実行する
- Using Temporary または Using Filesort を表示させない

## MySQLの評価順序の確認

SlowQueryの改善の前に、まずはMySQLがどのような順にSQLを評価し実行するかを
確認しておく必要があります。MySQLでは、

 `FROM` → `JOIN`
 → `WHERE` → `GROUP BY` → `HAVING` → `SELECT` → `DISTINCT`
 → `ORDER BY` → `LIMIT`

上記の順に評価&実行しデータを取得しますが、大まかに考えると、

1. データ取得のためのテーブルを作成する
2. 作成したテーブルから対象のデータを絞る
3. データをソートし、指定した件数だけ取得する

のような流れでデータを取得します。
上記の流れを意識して、SlowQueryの対処方法について説明していきたいと思います。

## HAVING句を使わない

基本的にHAVING句はWHERE句に書き換えが可能です。
また、HAVING句はMySQLがメモリ上で1レコードずつ条件判定をしてデータ集約して対象を絞り込むため、データ取得にかかる時間はテーブル数が大きくなるほどWHERE句で絞り込むよりも遅くなる傾向があります。

## JOIN時に作成されるテーブルが小さくなるようにJOINを実行する

SQLの評価順序で、WHERE句よりもJOIN句の方が先に実行されるため、
JOIN時の条件を必要なデータのみに絞る(ex. WHEREで絞る前にJOINで絞る)ことで、
WHERE時の計算コストを下げることができます。

## Using Temporary または Using Filesort を表示させない

EXPLAIN文を用いてQueryの実行計画を調べると、

- `Using Index Condition`
    - 指定したソート順(=order句)+検索条件(=where句)を作成済みのINDEXを使ってデータの取得ができる
- `Using Temporary`
    - 指定した検索条件でデータを取得しようとした際にJOINするデータがメモリに乗らない
- `Using Filesort`
    - 指定したソート順+検索条件でデータがINDEXされていない(=検索条件ではデータがINDEXされているが、ソート順ではINDEXされていない)

のように表示される場合があります。SlowQueryと考えられるQueryは基本的に
`Using Temporary` もしくは `Using Filesort` と表示されます。
以下でそれぞれ解説していきます。

### `Using Temporary` と表示される

EXPLAIN文を用いてQueryの実行計画を調べると `Using Temporary` と表示される場合がありますが、これは取得するデータが設定したメモリのバッファーサイズに収まらないときに表示されます。

JOIN句を実行してデータを取得する際に、取得するデータが設定したメモリのバッファーサイズに乗らなくなるとMySQLは一時テーブルを作成してJOINEDテーブルを作成しますが、このようなデータに対してEXPLAINを実行すると  `Using Temporary`  と表示されます。

`Using Temporary` が発生してしまうと、MySQLでは一時テーブルにデータを展開した後、quicksortを実行してデータのソートを行い結果を返すため、実行されるSQLは非常に遅くなります。

上記の場合はメモリのバッファーサイズを変えることで解決するので、

- `tmp_table_size` (デフォルト値は16MB)
- `max_heap_table_size` (デフォルト値は16MB)

をそれぞれ必要なサイズに変更してみて下さい。

### `Using Filesort` と表示される

EXPLAIN文を用いてクエリの実行計画を調べると `Using Filesort` と表示される場合がありますが、このように表示されるのは、 **検索条件とソートの条件の両方に利用できるINDEXが作成されていない** ことが原因となります。

MySQLの評価順序のうち、 **INDEXが利用できるのはWHERE句とORDER句のみ** です。
したがって、`Using Filesort` を解消しINDEXのみで検索&ソートを実行してデータを取得するためには検索とソートに適した複合INDEXを作成する必要があります。

複合INDEXを作成する際は、基本的にはカーディナリティが大きいものから順にカラムを指定して複合INDEXを作成するほうがMySQLの探索コストが小さくなり、検索が早くなります。

また、条件に合致する複合INDEXを作成しても `Using Filesort` が表示され続けてしまう場合があります。このような場合、 **条件に最適なINDEXとは別のINDEXが検索またはソートに使われてしまっている** 可能性が考えられます。

MySQLのQueryでは **1つのQueryに使えるINDEXは1つまで** であるため、
不要なINDEXは基本的に消しておくことをおすすめします。

## むすび

システムを運用時に起こりそうなSlowQueryのパターンをいくつかあげて、
その対処法を簡単にまとめてみました。
知識を使うということ

　私は昔 VB プログラマーだった。とはいえコンピューターが0と1で動くことを説明することはできず、小人が動かしていると信じている。ここだけの話、パケットを運ぶ小人を見たことがある。
　Wi-fi の時代になり 小人を見なくなった。昔は有線ケーブル の中を小人が走り回りパケットを運んでいたものだ。
　ところでLAN ケーブルには、ストレートとクロスの2種類がある。クロスケーブルでは、in と out が逆になる。昔取った杵柄で私はそんなことを知っている。
　ついこの前、ある人がある機器に IP を設定しなければならなくなった。そこには対象の機器とパソコンしかないという状況。この状況下で、対象機器に 最小限の資源で IP を設定するために必要な道具はクロスケーブルである。自動判別機能（AutoMDI/MDI-X）が一般的になっている昨今、クロスケーブルの役割はほぼなくなり、LANケーブルと言えばストレートというかそもそも有線のLANケーブルを見ることすら、現代ではなくなっている。だがきちんとした知識がありかつ知識を使える人であれば、この解決方法を思いつくことができる。IP層で解決するならね、そんな気の利いたコメントも出すことが出来る。そしてヨドバシカメラでは、やはりクロスケーブルは売っていなかったとのことなので、この策による解決はできなかったわけなのだが。
　ただこの「解決行動が思いつく」ことがエンジニアの能力だと、その時私は思った。情報処理2種試験に通っただけでは、OSI参照モデルの単語は知っていても、限られた状況の中でIPを設定する知恵が浮かばない。私のことだ。ちなみに情報処理2種すら取っていない。ひたすら小人頼み。そして小人を見たというのは嘘です嘘ついてごめんなさい。

　知識とは、OSI参照モデルのように段階で表せる。知らない知ってる使える、そしてその上に作れる、が来る。上の三角を極めるエンジニアたちは、支える下の台形も広い。
三角の頂点だけを見て、偉そうに文句だけ言う人間にならないよう、その下にある台形の広さに思いを馳せられるようにありたい。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552797/3086633f-222c-4cbf-0acc-6b7eeaab99e7.png)
タイムスタンプ偽装について

解析者を誤解させるため・不正ファイルの発覚を遅らせる目的でマルウェアがタイムスタンプ偽装を行うことがあります。
本記事ではタイムスタンプ偽装に関する初歩的な内容を記載します。

#タイムスタンプとは
ある時刻にその電子データが存在していたことと、それ以降改ざんされていないことを証明する技術。
タイムスタンプに記載されている情報とオリジナルの電子データから得られる情報を比較することで、タイムスタンプの付された時刻から改ざんされていないことを確実かつ簡単に確認することが可能。

>国民のための情報セキュリティサイト　タイムスタンプとは？
>https://www.soumu.go.jp/main_sosiki/joho_tsusin/security/basic/structure/05.html
>「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典　タイムスタンプ (timestamp)
>https://wa3.i-3-i.info/word13116.html

#タイムスタンプ偽装とは
フォレンジックの際に解析者を誤解させたり、不正ファイルの発覚を遅らせる目的などで、マルウェアによりタイムスタンプが改ざんされることがある。
専門用語でtimestompという。

#タイムスタンプの仕組み
Windowsのデータ格納の構造としてはデータ自体だけでなく、それに紐づく様々なデータと構造がある。
※データを管理するためのデータ = Metadata
ファイルの変更日時やパーミッション、データの実位置など、様々な情報を含む。

メタデータもファイルとして扱われるが、その中でも重要なのがMFT(Master file table)。
「$」から始まる隠しファイルで、ファイルシステムの情報を格納した特殊なデータファイル。

MFT内ではSIAとFNAの二種類のタイムスタンプを保持する。
１．SIA（Standard Information Attribute）　※ Windows上から確認できるタイムスタンプはこちら
２．FNA（File Name Attribute）　本当にファイルが作成された時刻
→SIAの偽装は比較的簡単に行うことができ、フリーウェアのツールなども存在する。

>より詳細な仕組みについてはこちらを参考：MFTアーティファクト
>https://www.kazamiya.net/fte/MFT



#実際現場で使われていたタイムスタンプ偽装
端末内に存在する正規のアプリケーション（calcやnotepad等）からコピーし、タイムスタンプを改変している挙動が確認された。
[Java]鋳型にはめるマルチスレッド

#はじめに
バッチ処理などで、時間のかかる似たような処理をマルチスレッドを使用して、
時間短縮させたいことありますよね。

例えば、単純化して考えるために、
1処理5分かかるものを10処理することを考えます。
1スレッドだと 5 * 10 = 50分かかりますが、
10スレッドだと5分で終わりそうな気がします。

そういった場合にスレッドセーフな処理で記述するというのは、
なかなか骨が折れます。
次回以降、似たような場面で心理的負荷を下げるために、
鋳型のようなものを作成しておきたいと思って書きました。

##実装例
とりあえずこの形ならスレッドセーフに書けるという大雑把な枠組みです。
欲しい情報の肝以外は省略しているつもりなので、
自分の必要な処理を埋め込んでいくと、
完成するような「鋳型」をイメージしています。

```MultiThreadExecute.java
/**
* マルチスレッド化するクラス
* ここでスレッドを作成し実行させる
*/
public class MultiThreadExecute {
	public static void main(String[] args) {
		MultiThreadExecute logic = new MultiThreadExecute();
		int status = logic.run();
	}

	/** スレッド作成数 */
	private static const THREAD_COUNT = 5;
	
	protected int run() {
	
		// 処理対象データ取得
		int dataSize = ...(省略)...;
		
		// 並行実行処理
		// 終端処理を含めるためスレッド数分領域を増やしておく
		final BlockingQueue<DataDto> taskQueue =
            new LinkedBlockingQueue<DataDto>(dataSize + THREAD_COUNT);
            
		// キューに追加
		for (DataDto data : (省略。どこかから取得)) {
			taskQueue.add(data);
		}
		
		final OnExecListener listener = new OnExecListener();
		final ExecutorService executor = Executors.newFixedThreadPool(THREAD_COUNT);
        for (int i = 0; i < THREAD_COUNT; i++) {
            // 終端ということが分かるようにしておく
            taskQueue.add(空のDataDtoなどを入れる);

            // 子スレッドの実行
            final LogicTask task = new LogicTask(taskQueue, listener);
            executor.execute(task);
        }

		// スレッドの終了を待機
        executor.shutdown();
        while (!executor.awaitTermination(5, TimeUnit.SECONDS)) {
        }
		
		// 処理件数などは以下のように取得
		// listener.getTotalCount()
	}
}
```

```DataDto.java
public class DataDto {
	// 処理をするために渡す引数を格納
}
```

```Listener.java
/**
 * 処理終了検知
 */
private static interface Listener {
	/**
	* 処理後に欲しい情報を設計し、作成する
	* interfaceをきっちり定義することで、
	* 欲しい情報を柔軟に対応できるようにする
	*/
	void execute();
}
```

```OnExecListener.java
/**
 * 処理終了リスナー
 */
private static class OnExecListener implements Listener {

	private int totalCount = 0;

    @Override
    public void execute(){
        synchronized (this) {
            totalCount++;
        }
    }

    synchronized int getTotalCount() {
        return totalCount;
    }
}
```

```LogicTask.java
private static class LogicTask implements Runnable {
	private final BlockingQueue<DataDto> taskQueue;
	private final Listener listener;
	
	/**
	* コンストラクタ
	*/
	LogicTask(BlockingQueue<DataDto> taskQueue, Listener listener) {
		this.taskQueue = taskQueue;
		this.listener = listener;
	}

	/**
	* タスクの実行
	*/
	@Override
	public void run() {
		try {
		    while (true) {
		        if (終了判定) {
		            break;
		        }
		        
		        final DataDto data = taskQueue.take();
		        
		        // 時間のかかる処理を実行
		        exec(data);
		    }
		} catch (// 省略) {
		    // 省略
		}
	}
	
	private void exec(DataDto data){
		// 省略
		return;
	}
}
```

#思ったこと
- スレッドセーフにマルチスレッド処理を記述するのは気を遣う
- 自分なりの「鋳型」を増やしていくことで1回きりにしない！
北海道情報大学で教員免許状を追加取得するまでの経緯まとめ

Qiitaなのにテックな記事ではなくてすみません。
2014年～2019年までの5年間でゆっくり教員免許の追加取得をし、ぶじ高等学校教員（情報）一種の免許状を取得することができましたので経緯をまとめます。
同様のことを目指している方の参考になれば幸いです。

#前提条件
・すでに高等学校教諭1種免許状または高等学校教諭専修免許状を<B>所持している</B>
・高等学校教諭1種免許状（情報）の追加取得を目指している
→イチから免許状を取得する前提の方の場合は本記事の範囲外となりますのでゴメンナサイ。

ちなみに私は下記の前提です。
・大学の専攻（英米文学）で中学・高等学校教諭1種免許状（英語）を取得済
・通信大学の科目等履修生で24単位追加受講し、高等学校教諭1種免許状（情報）を追加取得したい

#北海道情報大学を選んだ理由
・追加取得の実績が多い
・通学が一切不要（社会人である都合上、リモートでできることが最大の条件でした）
・試験会場が全国に用意される（特に首都圏は充実、神奈川県人としては横浜会場があったのがありがたかった…）
・価格が許容範囲
・科目等履修生で通える（最終学歴に含めたくはなかった）

#入学後のギャップ
上記の選んだ理由について、ほぼ入学前後のギャップはなかったです。
とはいえ入学後に気づいたよかった点、想定外だった点もありましたので下記に記載します。

##よかった点
・今まで部分的にしか認識していなかったIT基盤の仕組みについて包括的に学ぶことができた。新たな発想も多く得られた。
コンピュータ技術などのハードスキルについても興味深かったが、知的所有権論（著作権や商標などの権利の話）や情報科教育法（どのような情報教育を今後行っていくべきか、現状の学習カリキュラムの欠点など）などの考え方に関する知見を得られたことも印象的だった。
・キャラクターが濃くて面白い先生が多く、IM授業は楽しんで受講できたｗ
コンピュータサイエンス入門、ディジタル画像概論、システム設計演習の先生とかパンチ強かったｗ
・IM授業はスマホ経由で見られるので、家で腰を据えて勉強する時間が最小限で済んだ

##想定外だった点
・1～2年で終える予定だったが社会人生活の両立は厳しく5年かかってしまった。
→私の事前想定不足でもあるが、講義によっては負荷の高いもの（課題提出やIM授業の講義時間が長いものなど）もあり、想定以上に時間が必要だった。
特に重かったのは下記２つの記憶。
 -プログラミング基礎（IM上で毎週C言語の課題提出が必要）
 -システム設計演習（毎授業の課題提出と最終課題（VBAプログラミングだったかな）が必要）
・長引いたので結果的にお金も想定よりはかかった。

#かかった時間とお金
上記の通りですが、時間は入学前に想像していた以上にかかりました。
半期で2科目くらいのペースで
・定常的な時間時間：週4~5時間くらい。
→IM授業の受講、課題提出、ノートまとめなど。
・試験前の勉強時間：10時間くらい
→持ち込み不可の試験勉強
→持ち込み可の場合でも自筆ノートのみなど制限されていたり（ディジタル画像概論、データベースシステム）したのでノートにまとめる時間が必要でした。

価格についてはぶっちゃけて言うと厳密には覚えていませんが、ざっくり概算で45～50万くらいだと思います。
（科目ごとの価格とか記憶がおぼろげで違うかもしれない、あくまで参考でお願いします）
・入学金/継続費用　半期1.5万　×7期　＝　10.5万
・授業料　1科目1.5万(?) ×　11科目　＝　15万
・IM（インターネットメディア授業）利用料　1科目3万 × 6科目＝18万
・教科書などの書籍購入　3,4万くらい？

参考前に、受講した科目の一覧です。
これで全24単位となり、免許の追加取得の最短コースとなるかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102081/ab21f487-fcc6-102d-617a-fc5bc0d2696d.png)

#今後
せっかく取ったのに・・・と突っ込まれそうですが、今の仕事がとても楽しいので教員採用試験を受ける気持ちは現状ありません。
とはいえ取得したことは無駄ではないと思っており、ITとの付き合い方について学問的に学べたこと、また将来的な１選択肢を得られたことは非常に嬉しく思っており、後悔は一切ありません。

書き漏れや追加で質問等ありましたらコメントいただければお返しできますので、ぜひぜひ宜しくお願い致します！
汝は継承、罪ありき！

## はじめに

プログラミングしてると自分の頭からまま飛び出してくる「ここは継承つかえばとても良くなるのでは？？」という勘違いを撲滅したい。
継承を使ってはいけないことの理解がふわっとしてるせいだと思うので、ここで言語化して整理する。

主に [Why extends is evil][evil] を参考にしているので Java が下地。

## 継承がダメなところ

### 結合度が高くなる

実装の継承（`extends`）を使うと結合度が高くなり、実装の変更をするときに泣く。

#### 結合度とは

プログラムが再利用や保守・テストしやすくするためコードが整理・分割されているかを示す尺度。
ちなみに _結合_ とはあるモジュール（クラスやメソッドなどのプログラムの部品）が別のモジュールに依存していること。

結合度については低いほど望ましい。
プログラムの結合度が低いということはモジュールの独立性が高いということであり、

- 再利用性や保守性が高い（変更に強い）
- テストがしやすい

というメリットがある。
この結合度が低いことを _疎結合_ という。

プログラムの疎結合を保つために重要なのはオブジェクトの実装を使用する側から完全に隠してしまうこと。
つまり **カプセル化** が重要。

反対の例として、グローバル変数を必要とする実装を書くと簡単に結合度を高くできる。

#### Fragile Base Class Problem

問題は、実装の継承（`extends`）をすると派生クラス（サブクラス）は基底クラス（スーパークラス）と密接に結合することになり、結合度が非常に高くなる。
このせいで基底クラスを変更するとその影響が派生クラスに波及し、派生クラスのモジュールを壊す可能性がある。

変更による影響は基底クラスだけをテストしても確認できないため、すべての派生クラスについてもテストを行って確かめる必要がある。
さらには基底クラスまたは派生クラスを使用しているすべてのモジュールも壊れる可能性があるため、こちらもすべてテストする必要がでてくる。

### 必ずしも `is-a` 関係は成立しない

Cook 氏らによる論文 [Inheritance is not subtyping](https://dl.acm.org/doi/10.1145/96709.96721) で提唱され、広く知られている問題らしい（恥ずかしながら知らなかった）。

Java や C#などの言語では継承に _subtyping_ が組み込まれた言語仕様になっているが、もともとは別々の概念であるため継承では `is-a` 関係が成立しないことがある。
（継承は実装の再利用を、_subtyping_ は `is-a` 関係 の成立を担う）

`is-a` 関係が成立しない継承（インターフェース含む）を行ってしまうと、その基底クラスを必要とするモジュールが壊れる可能性がある。
そしてどの派生クラスが悪さをしたのかコードを精査する作業が待っている。

逆にいえば、まず _subtyping_ （`is-a` 関係）を成立させることが継承を実装する上で重要。

#### `is-a` 関係とは

`A` は `B` の一種である（_A is a B_）として表される関係。
クラス図でいうところの `A` は特化、 `B` は汎化。

プログラミングでは下記の _subtyping_ であること。

#### _subtyping（派生型、部分型、subtype）_ とは

あるデータの型と別の型との関係で置換可能性（[リスコフの置換原則](https://ja.wikipedia.org/wiki/リスコフの置換原則)）が成り立つこと。
すなわち、型 `S` が型 `T` の _subtyping_ である場合、型 `T` のオブジェクトが要求される箇所はその代わりとして型 `S` のオブジェクトが使用可能であること。

もう少し具体的に言うと、基底クラスが必要な箇所に派生クラスを代入しても問題なく動作するなら _subtyping_ といえる。

_subtyping_ はポリモーフィズム（多態性、多相性）の１つである。

### Java の生みの親いわく

> he explained that the real problem wasn't classes per se, but rather implementation inheritance (the extends relationship). Interface inheritance (the implements relationship) is preferable.
> ([Why extends is evil][evil] より引用)

意訳： _（James Gosling 氏は）実装の継承（`extends`）が問題であり、代わりにインターフェースの継承（`implements`） を使うことが望ましいと説明した。_

## まとめ

1. プログラムは疎結合であることを目指すべきなのに、実装の継承（`extends`）は結合度を高くするからダメ
1. インターフェースの継承（`implements`）においてもリスコフの置換原則を守るように実装する

また注意すべき事柄は以下。

- 共通化してコード量を減らそうとがんばる
  - 差分プログラミングというアンチパターンに陥り _Fragile Base Class Problem_ が発生しやすい
- 副作用のある実装
  - _subtyping_ が壊れやすい、テストしにくい
- テストコードを書くのが難しい
  - 元のコードの結合度が高いと思われる

## 参考

- [Why extends is evil][evil]
- [設計におけるオブジェクトの責務分配に有効なものさし -凝集度と結合度- | オブジェクトの広場](https://www.ogis-ri.co.jp/otc/hiroba/technical/Cohesion_Coupling/Cohesion_Coupling.html#3_1)
- [Go はオブジェクト指向言語だろうか？ | POSTD](https://postd.cc/is-go-object-oriented/)
- [第 4 回　関数型言語とオブジェクト指向，および OCaml の&quot;O&quot;について](https://tech.nikkeibp.co.jp/it/article/COLUMN/20061107/252787/)
- [インタフェースの実装は is-a 関係ですか? - スタック・オーバーフロー](https://ja.stackoverflow.com/questions/49510/インタフェースの実装はis-a関係ですか)
- [Subtyping - Wikipedia](https://en.wikipedia.org/wiki/Subtyping)

[evil]: https://www.javaworld.com/article/2073649/why-extends-is-evil.html
2019/12/30にGeoIP(GeoLite2)の変更が発生したので、その影響と対応方法

MaxMind社が無料で提供しているGeoIPデータベース(GeoLite2)について、2019/12/30より変更が行われました。
https://blog.maxmind.com/2019/12/18/significant-changes-to-accessing-and-using-geolite2-databases/
## 理由
[CCPA（カリフォルニア州 消費者プライバシー法）] (https://www.ppc.go.jp/enforcement/infoprovision/laws/CCPA/) への準拠が必要となったため（EULAの変更や提供方法の変更が必要となった）。
「Do Not Sell」リクエストをMaxMind社が受け取った際に、GeoIPデータベース利用者に対して通知可能な状態である必要があります（GeoLite2を含めた、GeoIPのユーザーを特定できるようにする必要があります）。しかし、これまでのGeoLite2のような認証無しのダウンロードではそれに対応することができない（ユーザーが特定できない）ため、ユーザー登録と認証が必要となりました。
> The California Consumer Privacy Act (CCPA) mandates that businesses honor valid “Do Not Sell” requests from California residents. In this context, complying with a valid request involves MaxMind removing IP addresses from the GeoLite2 data and communicating to GeoLite2 users that the IP addresses in question should (immediately) not be utilized for uses covered under the CCPA. We have been advised that any download, including one without charge, constitutes a sale. Serving GeoLite2 database downloads on a public page simply does not allow us to communicate and honor valid “Do Not Sell” requests we receive from individuals.
> 
> The solution we have chosen is to introduce a new end-user license agreement containing the relevant data processing provisions that both we, as the business providing data, and you, as the third party user of the data, need to comply with applicable data privacy regulations. Additionally, by requiring a MaxMind account and contact information from you, we will be able to communicate all valid “Do Not Sell” requests to you as we receive them.
> 
> With this approach, we can continue to offer GeoLite2 databases, without charge, while remaining responsible stewards of data that improves the experience of countless users across the internet.
## 影響
これまでは、wgetやcurlなどで直接（認証無しで）ダウンロードが可能でしたが、今後はライセンスキー（トークン）が必要となります。
cron等でMaxMind社からGeoLite2データベースを自動でダウンロードして、WebサーバのやWebシステムのアクセス制限や、アクセス解析等に利用している場合は、GeoLite2のダウンロードに失敗して適用できていないという問題が発生している可能性がありますので、注意が必要です。
## 対応方法
### １．MaxMindの手順に従い対応する
手順は以下のURLに記載されています。
認証は必要ですが、GeoLite2は引き続き無料で利用することができます。
https://dev.maxmind.com/geoip/geoipupdate/
### ２．dbipを利用する
類似の（GeoIPデータベースと互換性のある）ジオロケーションデータベースとして、dbipがあります。
こちらは、認証無しでダウンロードが可能です。
https://db-ip.com/db/lite.php
また、GeoIPデータベースを利用していたソフトウェアによっては、dbipの利用を推奨しているものもあります。
例えば、Matomo（アクセス解析ソフトウェア 旧名称：Piwik）は、dbipの利用を推奨しています。
https://matomo.org/docs/geo-locate/
Embulkメモ

[embulk github](https://github.com/embulk/embulk#running-example)
[embulk 公式](https://www.embulk.org/docs/)

## はじめに/Embulkとは...
>Embulk is a open-source bulk data loader that helps data transfer between various databases, storages, file formats, and cloud services.(公式リファレンスより)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168550/cd2c5532-f90b-ee33-77fa-f48fe34fc693.png)

つまり、元のデータを一気に整形・変換してアウトプットすることができる。
ETLツール。
→抽出（Extract）変換（Transform）書き出し（Load）


>Embulk(エンバルク)とは、オープンソースの並列データ転送フレームワークです。「fluentd」のバッチ版のようなバルク処理に特化したプラグインベースのデータローダーです。大規模データセットのバルクインポートを行えます。


<メモ>
> bulk: 大きさ、容積、嵩(かさ)、大部分、大半
[weblio bulkの意味](https://ejje.weblio.jp/content/bulk)
> バルクインサート(bulk insert): 大量のデータを一気に投入すること
[「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word15497.html)

## 環境構築
```:Mac環境構築
curl --create-dirs -o ~/.embulk/bin/embulk -L "https://dl.embulk.org/embulk-latest.jar"
chmod +x ~/.embulk/bin/embulk
echo 'export PATH="$HOME/.embulk/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
```


```
embulk example ./try1
embulk guess   ./try1/seed.yml -o config.yml
embulk preview config.yml
embulk run     config.yml
```

## コマンド一覧
#### `embulk example` 
- embulk example PATHで指定したパスに、サンプルCSVと設定ファイルを作成する。


#### `embulk guess`
- `-oオプション` guess実行後の設定出力先ファイルパス

#### `embulk preview`
- 指定したファイルの実行結果をプレビューする

#### `embulk run`
- 指定したファイルを実行する

## config.yml書き方
プラグインに関する設定を書く。
in: インプットプラグインに関する記述
out: アウトプットプラグインに関する記述
filters: フィルタプラグイン関する記述

[Embulk(エンバルク)組み込みプラグインの設定覚え書き](https://qiita.com/hiroysato/items/a71669d3e5be2049c238)


## プラグイン
[Embulk plugin](https://plugins.embulk.org/)
Embulkはデータ元→データ整形→アウトプットのプラグインが各種用意されている。
gemを使用して各プラグインをインストールが可能。


## config.yml.liquid書き方メモ
Embulkはディレクトリ構成に不向きなご様子。
> テンプレートエンジンLiquidの機能を使った場合、includeはサブディレクトリには、
対応しているが、「../」のように上の階層を指定するとエラーになることから、階層分けには不向きのようです。
[Embulkの設定情報（liquid版） - Qiita](https://qiita.com/reflet/items/64f74a4dc2334e6916f4)

つまり
>config
├ sample1_config.yml.liquid
├ sample2_config.yml.liquid
├ sample3_config.yml.liquid
commons
├ _input.yml.liquid
└ _output.yml.liquid

上記の構成にして、*_config.yml.liquidからcommons/以下の共通ファイルを読み込もうとしたのですが、
*_config.yml.liquid内に記述したパスが通らすエラー。

```yaml:*_config.yml.liquid
{% include '../commons/input' with json_file_path %}
```
このパスを読み取ってくれないらしい。
そのため、ディレクトリ構成を変更。

>sample1_config.yml.liquid
sample2_config.yml.liquid
sample3_config.yml.liquid
commons
├ _input.yml.liquid
└ _output.yml.liquid

```yaml:*_config.yml.liquid
{% include 'commons/input' with json_file_path %}
```
vue.js 重なった要素のクリックで、下の要素は動作させない

CSSなどで画像を重ねたり。
下の要素にもアクションが、上の要素にもアクションがあったとする。

その際上の要素をクリックすると、下の要素までクリックされ、動作する場合がある。
それを阻止する書き方。

```

<div :style="{ backgroundImage: 'url(' + images[photoIndex].thumb + ')' }" class="userbg" style="cursor:pointer;position: relative;" v-if="images[photoIndex].thumb != ''" @click="show(photoIndex)">
    <div class="main-logo">
        <a @click.stop="hoge()"><i class="fas fa-ellipsis-v"></i>ここにメソッド</a>
    </div>
</div>



```
これで hoge() のみ動作し、クリックの伝達をストップする。
Amazon Aurora に Mroonga全文検索は可能か

2020-01-25 の[第28回 中国地方DB勉強会 in 岡山](https://dbstudychugoku.connpass.com/event/158127/) に参加してきました。

※シリアルナンバーが28まで伸びてる地方IT勉強会ってすごい

最後のセッションはクリアコード 堀本さんの「[Amazon RDS + Amazon EC2 + ロジカルレプリケーションを使った低コスト高速全文検索](https://slide.rabbit-shocker.org/authors/komainu8/postgresql-conference-japan-2019/)」

自分の担当productはAurora MySQLなので、「MySQL+mroongaでもこの話は成立するんでしょうか」と質問しました。
「MySQLのリプリケーションがPostgreSQLロジカルレプリケーションと同様に機能拡張差があるサーバ間でできるなら、いけそうに思います。実績があるかどうか今この場ではわかりません」

ドキュメントベースで調べてみました。

## Aurora から EC2 MySQLへレプリケーション

[Aurora と MySQL との間、または Aurora と別の Aurora DB クラスターとの間のレプリケーション](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.MySQL.html)

> MySQL と互換性があるため、MySQL データベースと Amazon Aurora MySQL DB クラスターとの間のレプリケーションを設定できます。

いいぞ。Aurora と MySQL は物理層には互換がありませんから「ロジカル」なはずですよね。

> MySQL のバージョン 5.5 以降を実行することをお勧めします。

互換バージョン揃えなくても大丈夫っぽいし

> Amazon RDS MySQL DB インスタンス（Amazon RDS の外部 MySQL データベース）または別の Aurora MySQL DB クラスターにレプリケートできます。

RDSじゃない、外部のMySQLにも言及あります。第1関門クリア

## MySQLレプリケーションはテーブル単位でもできるか

全文検索の対象にしたいのはデータベース全体ではなく一部になるはず。

MySQLリファレンスマニュアルの [テーブルレベルレプリケーションオプションの評価](https://dev.mysql.com/doc/refman/5.6/ja/replication-rules-table-options.html)

> --replicate-ignore-table または --replicate-wild-ignore-table オプション

ありますね。 `--replicate-ignore-db` も当然あると。第2関門クリア

## Mroonga と PGroonga は同等機能か

とくにスライドのPGroongaで注目したところ

- SQL CREATE INDEX で全文検索index作成
- SQL INSERT で全文検索登録
- SQL WHERE などで使える全文検索演算子
- SQL LIKE で全文検索index活用
- 読みがな検索
- 異体字同一視

[Mroonga v9.11 documentation » 4. チュートリアル » 4.4.2. 全文検索の利用方法](https://mroonga.org/ja/docs/tutorial/wrapper.html#how-to-use-full-text-search)

検索演算子はなくて、検索構文がちょっと違うのかな。

[Mroonga v9.11 documentation » 5. リファレンス » 5.2. SQL commands](https://mroonga.org/ja/docs/reference/sql_commands.html)

 `LIKE` の言及も無い。
でも、大体いけそうな感じ。

> `FULLTEXT INDEX (content) COMMENT 'tokenizer "TokenMecab"'`
 
Mecabも使っているので、読みがな検索、異体字同一視もいけてそう。第3関門クリア
他の Tokenizer として Trigram なんかはあって差し替え可能な設計になってるけれど、"sudachi"はまだ無さそう。

## 結論

堀本さんのRDS PostgreSQL + EC2 PostgreSQL+PGroonga の構成は Aurora MySQL とMroongaでも試してみる価値あり。
Git/Githubのイメージ図

初心者向けの概念図です。
![flowImg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14068/d3afc33e-fbd7-a3f2-f41a-2450040d1e6b.png)

![gitImg14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14068/37de66e9-30a9-7a2d-a05e-0a2cf047dabd.png)

![gitImg20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14068/a71bcef2-547d-6cbd-4a12-ef3a8c6e3141.png)

![gitImg18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14068/407f52c1-1c35-b3d0-4fe5-caea7010a0e8.png)
Visual Studio Code の Auto Markdown TOC プラグインという目次作成ツールが神な件

<!-- TOC -->

- [1. Markdownの目次を自動的に書いてくれる件について](#1-markdown%e3%81%ae%e7%9b%ae%e6%ac%a1%e3%82%92%e8%87%aa%e5%8b%95%e7%9a%84%e3%81%ab%e6%9b%b8%e3%81%84%e3%81%a6%e3%81%8f%e3%82%8c%e3%82%8b%e4%bb%b6%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6)
  - [1.1. Overview](#11-overview)
  - [1.2. 前提条件](#12-%e5%89%8d%e6%8f%90%e6%9d%a1%e4%bb%b6)
  - [1.3. 使い方](#13-%e4%bd%bf%e3%81%84%e6%96%b9)
  - [1.4. 上手く目次ができないんだけど！？](#14-%e4%b8%8a%e6%89%8b%e3%81%8f%e7%9b%ae%e6%ac%a1%e3%81%8c%e3%81%a7%e3%81%8d%e3%81%aa%e3%81%84%e3%82%93%e3%81%a0%e3%81%91%e3%81%a9)
- [2. おわりに](#2-%e3%81%8a%e3%82%8f%e3%82%8a%e3%81%ab)

<!-- /TOC -->

# 1. Markdownの目次を自動的に書いてくれる件について
上司から「Markdownで目次作る時、これ使うと幸せになれるよ」って紹介されたやつです。幸せになれましたので、この幸せな気持ちを共有します。

## 1.1. Overview
Markdownでドキュメントを作成している時、目次を作成しますよね？（画像のような）

<img width="573" alt="スクリーンショット 0002-01-29 10.51.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549040/aa9fa429-eb8b-34b7-4077-46800a82bc43.png">

この目次、自動的に記述してくれます。そして、見出しの番号も自動です。びっくり！
それが、Visual Studio Codeプラグイン「Auto Markdown TOC」です。

## 1.2. 前提条件
- これまで10年近く、設計書はExcel方眼紙（神Excel）か、良くてWordでした
- Markdown歴１ヶ月です
- Visual Studio Code バージョン: 1.41.1
- macOS Catalina 10.15.3

## 1.3. 使い方
1. 手順としては、[こちら](https://github.com/sakura-editor/sakura/wiki/GitHub-Tips:-Markdown-%E3%81%AB%E5%AF%BE%E3%81%97%E3%81%A6%E7%9B%AE%E6%AC%A1%E3%82%92%E4%BD%9C%E3%82%8B%E6%96%B9%E6%B3%95) に記載の通りに実施していただければ大丈夫です。

2. 目次を入れたい箇所で右クリック→「Auto Markdown TOC: Insert/Update [^M T]」をクリック

<img width="545" alt="スクリーンショット 0002-01-29 11.49.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549040/b1ed6e87-390c-fef9-c63f-df3aa486acc1.png">

3. すると、目次が作成されます！しかも！見出しに番号が付与されます！

<img width="532" alt="スクリーンショット 0002-01-29 11.53.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549040/8ccd1eb5-1668-30bd-d603-08d126e565ea.png">

4. 目次を作成した後に見出しを作る時も、

<img width="308" alt="スクリーンショット 0002-01-29 11.55.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549040/bc0bdd48-290c-792e-3dec-cb28f606f5e2.png">

5. 勝手に番号が付与されます！

<img width="329" alt="スクリーンショット 0002-01-29 11.55.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549040/292d11e2-4e08-aace-ca40-786ac5821f73.png">

## 1.4. 上手く目次ができないんだけど！？
僕が詰まったポイントを共有しますね。

- 目次に見出し番号が付かん！

設定を変えてあげました。

1. command + , で設定を開いて「markdown-toc」で検索してください。
2. 「Detect And Auto Set Section」と「Ordered List」にチェックがついてる状態にしました。チェックを外すと見出し番号が出なくなりました。お好みで。

<img width="469" alt="スクリーンショット 0002-01-29 12.03.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549040/9d23b5cd-cf31-7e0b-ceba-cfadb76ed8a2.png">

- 改行が変！

なんか改行コードが変かもしれないです。

1. command + , で設定を開いて「eol」で検索してください。
2. Eolの改行コードがautoとなってるので変えてください（Macは\n、Winは\r\nらしいです）。

<img width="554" alt="スクリーンショット 0002-01-29 12.07.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549040/27811498-4adf-2a30-781c-918c4029036b.png">

# 2. おわりに
これからMarkdownでのドキュメント作成に慣れていきたいと思いますので、
記事の内容に不備・改善点ありましたらめっちゃ教えてください。
読んでいただき、ありがとうございました。
Gluster Container Storage の要約 

ソフトウェア定義ストレージシステムのOSSとして、CephとGlusterが有名で、これらは科学計算用の大規模なストレージシステムとして活用されることで知られている。両方とも現在はRed Hat社が開発するOSSであり、サブスクリプションサービスされる製品がある。
Cephは、ROOK によってKubernetes上で利用しやすくなった。一方、Glusterは、IBM Cloud Private 用にHelmチャートをIBMが開発して公開していたが、IBM Cloud Paks に移行するため、今後期待できない。

そこで、Gluster周りの状況について、調べた要約を投稿する。


## 解ったことの要約

* 一番実績の有るのは、K8s + Heketi + Gluster クラスタ https://github.com/gluster/glusterfs コミット数 13,378、貢献者 201名
* Glusterは課題があったため、Glusterd2(GD2)が開発された。https://github.com/gluster/glusterd2　コミット数 2404、貢献者 34名
* GD2のモチベーションとなったGlusterの課題は、SOAの設計になっていない事からK8sと連携するためにHeketiが必要となる点である。GD2はGlusterとHeketiの統合に取り組む。https://github.com/gluster/glusterd2 
* GlusterのCSIドライバーは、Glusterに準拠するとあるが、実際にはGD2のサンプルしかなく、優先度はGD2が高い模様。https://github.com/gluster/gluster-csi-driver
* Glusterコンテナ・ストレージ・プロジェクトに情報が集約されている。https://github.com/gluster/gcs


## Glusterコンテナ・ストレージの主要プロジェクト

1. Glusterd2 (GD2) https://github.com/gluster/glusterd2  GlusterとHeketiの統合によるSOA化
2. anthill/operator https://github.com/gluster/anthill  K8s上でGlusterを動かす際のオペレーターの開発
3. gluster-csi-driver https://github.com/gluster/gluster-csi-driver  GlusterFS & gluster-block のCSIドライバー開発
4. gluster-kubernetes https://github.com/gluster/gluster-kubernetes　k8sでGlusterでの構築手順
5. GlusterFS https://github.com/gluster/glusterfs Glusterのコアとなるリポジトリ
6. Monitoring https://github.com/gluster/gluster-prometheus プロメテウスでメトリックス監視する為のエクスポーターを開発
7. gluster-mixins https://github.com/gluster/gluster-mixins プロメテウスで収集した結果をグラファナのダッシュボードとして表示
8. Gluster-Containers https://github.com/gluster/gluster-containers cri-oやdockerなどで使用できるコンテナビルドの仕様を開発
9. gluster-block https://github.com/gluster/gluster-block glusterボリューム内のファイルをブロックデバイスとして公開する

## それ以外 Gluster関連の情報

* IBM Cloud Private用に作られたHelmチャート https://github.com/IBM/charts/tree/master/stable/ibm-glusterfs
* OpenShift/OKD https://docs.okd.io/latest/install_config/storage_examples/gluster_example.html
* Kubernetes Docsの資料 https://kubernetes.io/docs/concepts/storage/volumes/#glusterfs https://github.com/kubernetes/examples/tree/master/volumes/glusterfs



## まとめ
著書の中でも、Kubernetes クラスタと連携してボリュームを動的プロビジョニングする環境として、Heketi + GlusterFsを紹介している。当初使っていたバージョンは、3.7 でありサブスクリプションが提供されるバージョンである事から利用していた。しかし、アクセスの排他制御の問題でファイルが崩壊するなど問題も発見されたので、現在は、Heketi V9 と Gluster 7.2 に切り替えてある。この部分は、GitHubを直接アクセスしてもらうので、本の内容に修正はない。

ROOKの様なプロジェクトとして、Gluster Container Storageを見つけたので、CSIによるアクセスとGlusterのコンテナ化を検討したが、残念ながら、簡単には動かない。また、GD2の設定では、root特権の有効化を要求し、コンテナホストの設定を変更すると言った不届きなガイドもあり、利用するには早いと感じた。

Kubernetesのストレージとして、Glusterを利用する場合は、当分 Heketi + Glusterクラスタを構築するのが良いと思われる。CSI + Glusterd2 で簡単に、Kubernetes ワーカーノードの内蔵ディスクを利用して使える日を待ちたい。
シングルクラスとマルチクラスのメリット・デメリット

順次更新予定

# シングルクラス
## メリット
- スタイルの適用範囲がわかりやすい
- 視認性が良い
- 詳細度が高くなりにくい

## デメリット
- コード量が多くなる
- デザインを変更するときは新たにコードを追記する必要がある

# マルチクラス
## メリット
- コード量が少なくなる
- 設定を用意していれば、クラスを追加することでデザインの変更が可能

## デメリット
- スタイルの適用範囲がわかりにくい
- 視認性が悪くなりがち
- 詳細度が高くなりやすい（例：.bg-redが.btnについてる時だけ設定追加したい → .btn.bg-red）
Cloud Firestore REST API を使う

# 背景

ESP32(Arduino) から Firestore にデータを貯めたいが、 SDK が使えない環境からだとどうやる？
↓
[Cloud Firestore REST API](https://firebase.google.com/docs/firestore/use-rest-api?hl=ja) だけで済ませられないか？
↓
日本語記事少ないな、試したことをまとめておくか

# 結論

- トークン管理が簡単にできるフレームワークを使えないとめんどくさそう。
- ESP32 からは実際に試していないが、単純に curl で POST しているだけなので、  ESP32 でも同じことはできるはず。

# 前提条件

- Firebase プロジェクトを作成済み

# 手順

i) Firebase プロジェクトのウェブ API キーを使ってプロジェクトに User 作成 & idToken を取得

```bash:Userを作成&idToken取得
$ curl -X POST -d '{"email":"user@example.com", "password":"passw0rd"}' 'https://identitytoolkit.googleapis.com/v1/accounts:signUp?key=[API Key]'
{
  "kind": "identitytoolkit#SignupNewUserResponse",
  "idToken": "{長い文字列}",
  "refreshToken": "{長い文字列}",
  "expiresIn": "3600",
  "localId": "eVysdexYEQPTsLkEDofGlwkVK463"
}
```
ウェブ API キーはこれ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59994/60783ada-c697-7167-d2a4-c839848f0044.png)



ii) `idToken` を使って REST API アクセス（以下、例として document 取得)

```bash:document取得
$ curl 'https://firestore.googleapis.com/v1/projects/{プロジェクトID}/databases/(default)/documents/test' -H "Authorization: Bearer {idToken}"
{
  "documents": [
    {
      "name": "projects/{プロジェクトID}/databases/(default)/documents/test/hoge",
      "fields": {
        "fuga": {
          "stringValue": "123"
        }
      },
      "createTime": "2020-01-27T06:32:39.778017Z",
      "updateTime": "2020-01-27T06:32:39.778017Z"
    }
  ]
}
```
プロジェクトIDはこれ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59994/3927eab2-89de-a170-3843-5b48d32e6ab4.png)


ドキュメントはこんなかんじなので正しく取れている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59994/935a4082-bf3f-9d68-b3f7-64595232be13.png)

# 面倒な点

- 3600 秒で idToken の expire が発生するので、リフレッシュする必要がある。  
  (idToken が expire しても refresh_token は生きているので、 idToken の更新はできる。)

```bash:tokenをrefresh
$ curl -X POST -d 'grant_type=refresh_token&refresh_token={refresh_token}' 'https://securetoken.googleapis.com/v1/token?key={API Key}'
{
  "access_token": "{長い文字列}",
  "expires_in": "3600",
  "token_type": "Bearer",
  "refresh_token": "{refresh_token}",
  "id_token": "{新しいidToken}",
  "project_id": "***********"
}
```


# 対策案

以下3つくらいだろうか？
アプリサーバを噛ませるのが無難な気がする。

1. 定期的に token をリフレッシュする処理を実装する :thinking:  
2. ESP32(Arduino) から直で Firestore にアクセスするのではなく、 Cloud Firestore SDK を使える言語で動いているアプリサーバを1段噛ませて送る。
3. Cloud Firestore SDK が Arduino などに対応するのを待つ :sweat: 

# MEMO

- Firebase Realtime Database は、一度 Secret を生成してしまえばずっと使い続ける事ができた。  
https://github.com/FirebaseExtended/firebase-arduino/issues/326#issuecomment-389023811
Fuzzyhashとは？検証してみた

Hashの一種として、Fuzzyhashというものがあることを知ったので、類似の検体を用いて検証を行いました。

#Fuzzy hashとは？
ハッシュに関する基本的な説明は省略します。
ファイルの内容を少しでも変えるとSHA-1やSHA-256などのハッシュは全く異なる値をとる仕様となっていますが、
これらと異なりFuzzy hashはファイルが類似している場合、ファイル同士で近い値をとります。
そのため、マルウェアの挙動の類似性を検証する際などに有効と言えます。

##Fuzzy hashの種類
知名度の高いものとして下記２点がありますが、今回はSSDEEPの値をもとに検証します。
・imphash
・ssdeep

#検証内容
動きがほぼ同様なEMOTET/POWLOAD検体を５つ用意し、Fuzzy hashの値の類似性を検証します。
▼検知名
<img width="877" alt="スクリーンショット 2020-01-28 13.40.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102081/9d4836d8-4623-2abd-4c26-c45638cdf676.png">
▼展開後のファイル
<img width="737" alt="スクリーンショット 2020-01-28 13.44.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102081/3e91d71f-0871-6d7c-7ab7-6c1e55c82eab.png">


#検証結果
これらのファイルのハッシュ値を求めた結果、下記の通りになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102081/d45dda32-fd11-103d-a8fc-acabb7e8a877.png)
MD5,SHA1などは全く異なる値であるにも関わらず、
SSDEEPの値については頭の値が一致しており（1を除き）類似性があることが確認できました。


#参考資料
ssdeepのより詳細な検証を行っている論文があります（計算方法の原理から説明していただいていて非常にわかりやすいです）
https://ipsj.ixsq.nii.ac.jp/ej/?action=repository_action_common_download&item_id=73252&item_no=1&attribute_id=1&file_no=1

SSDEEP,imphashには類似性がうまく検証できない場合があり、改善の余地があるという意見もあるようです。
https://blogs.jpcert.or.jp/ja/2016/05/impfuzzy.html
php8 JIT vs いろんな言語

# php8 JITと他のサーバーサイド言語を使ってパフォーマンステストをしました。
php8 JITが早くなったということで、他の主要なサーバーサイドの言語とパフォーマンステストして比較する。
どの言語が一番速いかどうかの検証

## パフォーマンステスト用メソッド (フィボナッチ数列の総数計算)
```php
$n = 35;
function fibonacci(int $n): int
{
    return(($n < 2) ? 1 : fibonacci($n - 2) + fibonacci($n - 1));
}
```

## php8 JIT + 比較する言語
| 1 | 2 | 3 | 4 |5|
|:-:|:-:|:-:|:-:|:-:|
|php8-dev JIT|go 1.13|Java 11.0.4|python 3.8.1|Node v13.6.0(javascript)|

## テスト環境
各言語の実行環境は、AlpineをベースのDockerイメージをDockerHubのものを使用しています。


## 実行結果
| 言語 | 速度 |
|:-:|:-:|
| php8-dev JIT | 0.444秒 |
| go 1.13 | 0.052秒 |
| Java  11.0.4 | 0.038秒 |
| Python 3.8.1 | 2.449秒 |
| Node v13.6.0 | 0.2001秒 |

## 総括
当たり前ですが、コンパイラ型言語のgoとJavaが圧倒的に早かった
同じインタプリタ言語である、php, python, nodeの中でもpythonが圧倒的に遅かったですが、
Pythonが特別遅いというより、php 8 JITが早くなったという認識のほうが正しいかも。

## コード
https://github.com/okeita0805/performance_test
Xymonで監視対象から削除したのにログが出力される

## 概要

死活監視ソフトであるXymonをCentOS6で利用していましたが、以下のような症状が発生。

- 既存の監視対象ホストを削除
    1. /etc/xymon/hosts.d/hoge から対象ホスト行を削除
    1. `$ xymon 127.0.0.1 "drop <対象ホスト名>"` コマンドを実行

これでウェブ画面から対象ホストは消え、アラートも通知されなくなりました。
が、後日xymonのアラートログ（/var/log/xymon/alert.log）を確認すると、削除したはずのホストのアラートログが出力され続けていました。

```bash
$ grep "which is not yet defined" /var/log/xymon/alert.log
2020-01-29 09:00:00 Checking criteria for host '<対象ホスト名>', which is not yet defined; some alerts may not immediately fire
2020-01-29 09:02:00 Checking criteria for host '<対象ホスト名>', which is not yet defined; some alerts may not immediately fire
2020-01-29 09:04:00 Checking criteria for host '<対象ホスト名>', which is not yet defined; some alerts may not immediately fire
...
```

削除したはずのホストが何故？？１ホストだけならまだしも、今回は結構な数のホストで発生しており、無駄にディスク容量が消費されていました。ログローテートがあると言ってもこのまま放置するわけにも行かないので調査開始。

## 解決

ぐぐるとドンピシャな情報が！
https://xymon.xymon.narkive.com/UOEFtn72/bogus-hosts-filling-up-alert-log
> If there had been a previous alert for the virtual/fake host, it would
have been stored in memory, and frozen out into the alerts.chk file
(probably in /var/lib/xymon/tmp/ during restarts).
>
The general reason for the alert is that xymond(_alert) is getting a
report about something it doesn't (yet) know about. Usually, this clears
a few minutes later as soon as xymond next checks hosts.cfg for changes,
since typically that's the action pending to be taken.

ほうほう。ｇｇｒ翻訳しながら読み進める。

>Adding the host to hosts.cfg and then dropping it should work for
clearing out the errant alert. Alternatively, you can stop xymon (or at
least xymond_alert, by adding DISABLED into tasks.cfg), grep out the
line for the alert in alerts.chk manually (it's just a normal
single-line-record text file, and then bring it back up.

とあったので、簡単そうな以下手順を試みる。

1. Xymonデーモン停止
1. /var/lib/xymon/tmp/alert.chk から対象ホスト行を除去
1. Xymonデーモン開始

```bash
# Xymonデーモン停止
$ service xymon stop
# alert.chk から対象ホスト行を削除（今回ファイル内には削除したホストしか記載されていなかったので丸ごとクリア）
$ cat /dev/null > /var/lib/xymon/tmp/alert.chk
# Xymonデーモン開始
$ service xymon start
```

これでしばらく`tail -f /var/log/xymon/alert.log`で様子を見ていましたが、削除ホストログが出力される事がなくなりました。
例外と入出力処理

##【例外処理】
→コンパイル時には見つからないエラーを例外という

####(try,catch,finally)

######(例外処理の流れ)
①tryブロックで例外が起きるとそこで処理を中断
↓
②例外がcatchブロックの（）内の例外と一致していればcatchブロック内の処理を行う
↓
③catchブロックが終わったらtry~catchブロックの後から処理が続けられる

・finallyブロックの中には最後に必ず行わなければならない処理を記述

※tryブロックでの例外に対応するcatchブロックが見つからない場合はそこでプログラムが終了する。
※ファイルの書き込み処理やネットワークとの接続終了などの必ず行っておきたい処理はfinallyブロック内に書き込む

```
try{
例外の発生を調べる文;
}
catch(例外のクラス 変数名){
例外が起きた時に処理する文;
}
finally{
最後に必ず処理される文
}
```

##【例外とクラス】
→「例外とは」クラスライブラリの中の```Throwableクラス```のサブクラスのオブジェクト
→```ArrayIndexOutOfBoundsException```などはThrowableクラスのサブクラスから拡張されたオブジェクト
→例外の場合はスーパークラスの変数を使うとサブクラスの例外すべてをまとめて処理できる

#####(例外クラスライブラリの構造)
```
「Throwable」→「Error」
↓
「Exception」→「RuntimeException」→「ArrayIndexOutOfBoundsExceotionなど」
↓
「IOExceptionなど」

```

##【例外の送出】
→自分の設計したクラスに例外を送出することで、そのクラスを利用する他人がエラーに対する処理を記述してもわうことができる

#####(自分で例外を作る)
→Throwableクラスを拡張して例外クラスを宣言する
→例外を送出したいメソッドに```throws 自作Exception```を宣言し、処理を記述

```
class CarException extends Exception{
//例外クラスの宣言
}

//車クラス
class Car{
private double gas;

public void setCar(int gas)throws CarException{
   if(gas<0){
         CarException e = new CarException();
         throw e;
      }　//gasが0より小さい場合例外を送出する
   else{
   gas = gas;
   System.out.println("ガソリン量は"+gas+"です");
   } //例外に当てはまらなければ普通に処理
   }
}
```
→例外はThrow文で送出する
アプリとかシステムのタイムアウト試験ってどうしてる？

アプリとかシステム開発の試験で、タイムアウト試験って意外とめんどくさくないですか？
タイムアウト試験のためにわざわざスタブ作ったり、Webサーバー建てたり、自前のAPIサーバーの設定変えたり。
そんなタイムアウト試験をさくっと実施できるサービスを公開してみたので、使ってみます。

もっと簡単で便利なやり方あるよーって情報持ってる方いましたら教えてください。

# 概要

[URL：https://api-responser.mock-lab.com](https://api-responser.mock-lab.com)

フロントエンドやアプリケーション開発におけるタイムアウト試験や、任意のjsonデータ試験にご利用いただけます。

リクエストはGET,POSTに対応しており、指定された秒数後に、指定されたステータスコードで、指定されたjsonデータを返すサービスです。

# 使い方

指定できるパラメータは、wait値、ステータスコード、jsonデータの３つです。
（その他のパラメータは無視されます。）

## 【wait値】
クエリストリングにwaitパラメータをつけることで、レスポンスが返ってくるまでの秒数を指定できます。

必ず正の整数で指定してください。

デフォルト：0秒（最大30秒）

例（wait：3秒）

`https:api-responser.mock-lab.com/api?wait=3`

##【ステータスコード】
クエリストリングにstatus_codeパラメータをつけることで、レスポンスのステータスコードを指定できます。

デフォルト：200

例（ステータスコード：503）

`https:api-responser.mock-lab.com/api?status_code=503`

##【jsonデータ】
クエリストリングにjson_dataパラメータをつけることで、返ってくるレスポンスのjsonデータを指定できます。

デフォルト：{}

例

`https:api-responser.mock-lab.com/api?json_data={"aaa":"bbb"}`

# 使ってみる
この記事を書いている環境がWindows環境なので、とりあえずPowerShellで叩いてみる。

```
PS > Invoke-RestMethod -Uri 'https://api-responser.mock-lab.com/api?wait=3&status_code=200&json_data={"aaa": "bbb", "ccc":"ddd"}' -Method GET
aaa ccc
--- ---
bbb ddd
```

なるほど。
3秒後に応答が返ってきた。

chromeでも叩いてみる。

```
https://api-responser.mock-lab.com/api?wait=3&status_code=200&json_data={"aaa": "bbb", "ccc":"ddd"}
{
aaa: "bbb",
ccc: "ddd"
}
```
3秒後に応答が返ってきた。
いけてそう。

# おわりに
サーバー代もかかるので、いつまで公開してるかはわかりませんし、
しょぼいサーバーなので、大量アクセスされるとサーバー落ちるとも思いますが、
誰かのお役に立てれれば幸いです。

ココが使えねぇーとか
もっとこうして～とか
ありましたらお手柔らかに、コメントいただけるとありがたいです。
（対応できるかは別として、、、）
VMware Cloud on AWS　実践セミナーの感想

##VMware Cloud on AWS　実践セミナーの感想
みなさんどうもこんにちは。

この記事はAWS上にVMwareの環境が作れるというある意味奇跡について語ります。
イメージとしては既存のオンプレ環境があり、追加でAWS環境を構築するような形です。

##詳細
・AWSとVMwareの共同開発
・VMwareが販売運用サポート
・専用の管理コンソールを提供
・vSphere Web Clientからの管理も提供
・vRealize,PowerCLI,REST APIも提供
・AWSサービスとの連携が可能に

##トピック
・vSphereのバージョンが低くても(5.0とか)互換性がある
・vSphere Replicationを使ったCloud Motionで仮想マシンを移行可能（オンラインでいける）

##サポート
・オンラインのチャットで問い合わせができる

##課金体系
・1時間単位
・年間サブスクリプション
・アドオンサービス購入

支払いはHPPで購入か、クレジットカードがある

無料お試しとかは無いです。
変わりに本番の1/3ぐらいの値段で評価できる機能はある。

##ベアメタルサーバのスペック（ホスト）
・intel Xion E5-2686 v4 18コアかける2
・512GB RAM
・オートスケーリングも可能
・CPUコア数は制限可能（ライセンスの対策）
・AZを跨るクラスタ構成が可能
　（リージョンがダメになった場合は止まる）

##HW障害時
・問題のあるホストを自動検知
・新しいホストをクラスタに追加してフェイルオーバー

##そのほか
・開発者向けツール
・Horizon CPAによりオンプレとAWS間でVDI運用を実現
・VMware vSAN と Amazon EBSを連携させて大容量ストレージ構成が可能
・RDSがVMwareで使える

##感想
オンプレとAWSとで冗長化できる時代になったんですね。
今後はDR対策としてもハイブリット型が流行るんでしょうかねぇ。

**ありがとうございました**
【jQuery Raty】１ページに複数ある星の値を取得する

# Raty とは
- 評価値などをわかりやすく星型で表現できるツール
- jQuery を使っている
- 検索すると表示方法のReadmeは見かけるが、それを取得してWebアプリで受け取るまではあまり載ってない
- https://github.com/wbotelhos/raty

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108113/08946687-c6b5-38a6-e905-8bb679f53ad0.png)

# 実施環境
ブラウザ: chrome
フレームワーク: spring-framework

# 1ページに複数ある星の評価入力をする
- 例：dd タグ ID の先頭に "raty-" をつけたものをまとめて設定
- input type="hidden" を "raty-" の後のIDで用意しておき、raty を onClick 時に value にセット
- ID が長くて複数あっても初期化は１つにしたい
- ページロード完了後に実施

```javascript
	$('dd[id^="raty-"]').each(function(index, element) {
		var rate = $(element).data('rate');
		$(element).raty({
			half : true,
			precision : false,
			score : rate,
			click : function (score, evt) {
				var myId = this.id;
				var matches = myId.match(/^raty-(.*)$/);
				if (matches.length != 2) { return; }
				var hiddenId = matches[1];
				$("#"+selectorEscape(hiddenId)).val(roundHalfScore(score));
			}
		});
	});
```

### HTML側の例
- 複数を想定しているのでIDは配列に
- data-rate に初期表示する値を入れる（動的に入れると思いますが）

```html
              <dd id="raty-reviewFormList[0].pointRate" data-rate="3.5" style="cursor: pointer;">
                <input id="reviewFormList[0].pointRate" type="hidden" />
```

## 利用した関数
#### selectorEscape (セレクタのエスケープ用)
```javascript
function selectorEscape(val){
    return val.replace(/[ !"#$%&'()*+,.\/:;<=>?@\[\\\]^`{|}~]/g, '\\$&');
}
```

#### roundHalfScore(四捨五入)
```javascript
function roundHalfScore(score) {
	var integer = parseInt(score, 10),
    	decimal = getFirstDecimal(score);

	if (decimal !== 0) {
	    decimal = decimal > 5 ? 1 : 0.5;
	}
	return integer + decimal;
}
function getFirstDecimal(number) {
	var decimal = number.toString().split('.')[1],
		result  = 0;

	if (decimal) {
		result = parseInt(decimal.charAt(0), 10);
		if (decimal.slice(1, 5) === '9999') {
			result++;
		}
	}
	return result;
}
```

以上です。お疲れさまでした！
RHEL に yum-cron を RPM でインストールしてメールでアップデート情報を受け取れるようにする

# 背景
AWS で EC2 インスタンスを立ち上げる際に RHEL を選択するとデフォルトのレポジトリでは yum-cron が入らないので rpm ファイルを探してきて入れる必要がありました。

# やること
### yum-cron の rpm のダウンロード
[RPMfind](https://rpmfind.net/linux/rpm2html/search.php?query=yum-cron) と言うサイトから該当する RPM ファイルをダウンロードします。
今回は RHEL7 に入れたいので 「CentOS 7.7.1908 for x86_64」の物をダウンロードしました。

```bash
# wget https://rpmfind.net/linux/centos/7.7.1908/os/x86_64/Packages/yum-cron-3.4.3-163.el7.centos.noarch.rpm
```
※上記をコピーしても問題ないとは思いますが、バージョンが変わっている可能性があるので RPMfind を確認したほうが良いと思います。

### yum-cron のインストール
```bash
# rpm -Uvh yum-cron-3.4.3-163.el7.centos.noarch.rpm
```
上記のコマンドでインストールは完了です。
初期設定はアップデートをダウンロードのみ行う設定になっているはずです。
適用まで行ってしまいたい場合は以下の設定を行ってください。

```bash
# vi /etc/yum/yum-cron.conf
--------------------------------
apply_updates = no
を
apply_updates = yes
に変更
--------------------------------
```

## アップデート内容をメールで受け取る
せっかくなのでアップデートがある場合に所定のメールアドレスで受け取れるように設定します。

```bash
# vi /etc/aliases
--------------------------------
一番下の
#root:          marc
のコメントアウトを外し、メールを受け取りたいメールアドレスを記載する
root:           Your@EmailAddress.com
--------------------------------
# newaliases
```

※ vim の使い方が分からない方は[vim の操作](https://qiita.com/lll_ujm/items/c7ed1c4b43f9470188ea)を参照してください。
※何らかの smtp サーバが入っていることを想定していますので、入っていない場合はインストールしてください。 RHEL7 ならデフォルトで POSTFIX が入っているとは思いますが。
VSCodeの予測変換/サジェスト機能を特定の拡張子（言語）だけオフにする方法

## 注意

タイトルで「特定の拡張子」と謳っていますが、正確には拡張子別の設定ではなく、VSCodeが認識している言語/テキストフォーマット別の設定です。
ただ、個人的にこっちのが目的に近いのでこのタイトル表記とさせていただきます。

## 設定したくなった理由

<img width="521" alt="邪魔なサジェスチョン.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444546/c74af012-36d9-0e4d-be3a-63733612959b.png">
こんな感じで出てくるだけならまだしも、候補を選択してる意図がなくとも、エンターを連打するだけで入力されてしまいます。
MarkDownだとデフォルトでこのサジェスチョンがオフになっているのですが、plaintextに関してはサジェスチョン機能がオンになっているようです。

## 【対処法】settings.jsonに記載する

①Cmd+Shift+PでPreferences: Open Settings(JSON)を選んでsetting.jsonを開く
②以下のように記述します。  

※筆者の場合、txtファイルのようなplain textにのみ対応したかったので、別の拡張子に適応したい方はその部分を書き換えてください。

### サジェスト機能を完全オフにしたい場合

```json:settings.json
    "[plaintext]": {
        "editor.quickSuggestions": false
    }
```

完全にサジェストが表示されなくなります。
<img width="458" alt="サジェストが表示されない.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444546/4d8d2efc-a678-77a6-f1d9-ad00666f2dbd.png">

### Enterによる自動入力だけオフにしたい場合

```json:settings.json
    "[plaintext]": {
        "editor.quickSuggestions": true,
        "editor.acceptSuggestionOnEnter": false
    }
```
サジェストの候補は表示されますが、Enterでは入力されません。
入力したい場合は、Tabキーで入力されます。
<img width="463" alt="サジェストが表示される.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444546/f7bf92bc-a2e3-3c1b-00b5-e9f780b9c7a9.png">

## 所感

自分はVSCodeをメモ帳代わりに使用することもあります。
基本的には学んだ内容をMarkdown形式でまとめて、それらをGit/GitHubで管理、必要に応じてQiitaに投稿していたりします。（この記事もそう）  

ただし、毎回Markdownでまとめるのはだるかったり、txtファイルで一時的になぐり書きを保存したいときもあって、その際に不便に感じたのでこんな感じでいじってみました。

自分の使いやすいように設定を少しずついじるの楽しいですね。
不便だと思ったら少し遠回りになってでも効率的な環境作りを積極的に行っていきたいです。

## 参考

[Visual Studio Codeで、特定の言語にだけ効く設定を書く【言語指定でのエンコード固定と自動判別】](https://www.teradas.net/archives/26687/)
settings.jsonでの設定方法が書いてあります。

[stackoverflow | Prevent autocomplete in Visual Studio Code](https://stackoverflow.com/questions/32911977/prevent-autocomplete-in-visual-studio-code)
ここでサジェスチョン機能ON/OFFの設定方法が書かれています。

[IntelliSense in Visual Studio Code](https://code.visualstudio.com/docs/editor/intellisense#_customizing-intellisense)
より詳細な設定方法がこちらに記載されています。

[VSCodeの予測変換が鬱陶しいときの対処法](https://qiita.com/mitsudaman/items/a727d36c9fac47987fab)
特定の言語や拡張子でなく、完全にVSCodeから機能をOffにする場合は直接設定を変更できるみたいです。
FindFirstで読み取り専用ファイルのみ抽出する方法


Attrパラメータに読み取り専用ファイルを示す「faReadOnly」を指定すればいいと早合点し、

```delphi:sample1.pas
  if FindFirst(IncludeTrainlingBackslash(path) + '*.*', faReadOnly, searchRec) = 0 then begin
    //処理
  end;
```

とすると、path配下の読み取り専用以外のファイルも検出してしまい、
期待した結果を得られません。

Porque?

FindFirstのヘルプをよく読むと

**「Attrパラメータには、すべての通常ファイル以外で検索対象に含めるべき特殊ファイルを指定します。」**

とあります。
ここで、FindFirstのソースを見ると、

```delphi:SysUtils.pasの一部
  faSpecial = faHidden or faSysFile or faVolumeID or faDirectory;
  F.ExcludeAttr := not Attr and faSpecial;
  //※ExcludeAttr;除外する属性
```

特殊ファイルとは非表示ファイル、システムファイル、ボリュームファイル、ディレクトリファイルのみを指すようです。

つまり。

FindFirstは（読み取り専用ファイル、アーカイブファイルを含む）通常ファイルと、Attrパラメータで指定した特殊ファイルを検索する関数だったのです。

では、読み取り専用ファイルを見つけたい場合にはどうするか。

以下のように、Attrパラメータはダミーで"faReadOnly"をしておき※、とりあえず通常ファイルだけを検索したあと、
TSearchRecのAttrを調べて絞りこむとよいようです。

```delphi:sample2.pas
  if FindFirst(IncludeTrainlingBackslash(path) + '*.*', faReadOnly, searchRec) = 0 then begin
    repeat
      if (searchRec.Attr and faReadOnly) = faReadOnly then begin
        //処理
      end;
    until FindNext(searchRec) <> 0;
    FindClose(searchRec);
 end
```



※
FindFirstで"faAnyFile"を指定すると、検索対象に特殊ファイルも含むようになります。
というのも、faAnyFileのnot(2進数000000)とfaSpecial(2進数011110) との論理積は0000000、これが除外対象属性F.ExcludeAttrの値となります。つまり、除外対象となるファイル属性は無いってこと。
すると、特殊ファイルの分の余計にrepeat処理を行うことになります。
大した手間ではないのかもしれませんが。

Web上のサンプルソースで以下のようなのを散見するのですが、

```delphi:sample3.pas
  if FindFirst(IncludeTrainlingBackslash(path) + '*.*', faAnyFile, searchRec) = 0 then begin
    repeat
      if (sr.Name = '.') or (sr.Name = '..') then Continue;
      //処理
    until FindNext(searchRec) <> 0;
    FindClose(searchRec);
```

わざわざ全属性ファイルを指定した上で、ディレクトリファイルを除外してます。
なぜだろう？
QiskitでFidelity計算　簡単な例

$$
\def\bra#1{\mathinner{\left\langle{#1}\right|}}
\def\ket#1{\mathinner{\left|{#1}\right\rangle}}
\def\braket#1#2{\mathinner{\left\langle{#1}\middle|#2\right\rangle}}
$$

密度行列のミスがあったので，再掲載です．
###参考
[Qiskitのドキュメント](https://qiskit.org/documentation/api/qiskit.quantum_info.state_fidelity.html?highlight=fidelity)
[Nielsen & Chuang](https://www.amazon.co.jp/Quantum-Computation-Information-10th-Anniversary/dp/1107002176)

#Fidelityとは
[量子情報理論の基本：フィデリティ](https://qiita.com/SamN/items/634b11b6faf8d713cff1)
## 注意1: 定義の違い
Nielsen & Chuangの定義: $$F(\rho, \sigma ) \equiv \mathrm{Tr} \sqrt{\rho^{1/2}\sigma\rho^{1/2}} $$

Qiskitの定義:
$$
F(\rho, \sigma ) \equiv \mathrm{Tr}\left[\rho^{1/2}\sigma\rho^{1/2}\right]
$$
ルートの有無の違いがあるので注意.最近はQiskitの定義が多いらしい．参考:　[Fidelity convention](https://github.com/QISKit/qiskit-terra/issues/278)
以後，Qiskitの定義を使用する．

## 注意2: 密度行列のルート
### 対角行列の場合
各要素のルートをとる．例えば，

```math
A = \begin{pmatrix}
a_1 & 0 & 0 & 0 \\
0   & a_2 & 0 & 0 \\
0   & 0   & a_3 & 0 \\
0   & 0   & 0   & a_4
\end{pmatrix}
```
のとき，($a_i\ge0$)


```math
A^{1/2} = \begin{pmatrix}
\sqrt{a_1} & 0 & 0 & 0 \\
0   & \sqrt{a_2} & 0 & 0 \\
0   & 0   & \sqrt{a_3} & 0 \\
0   & 0   & 0   & \sqrt{a_4}
\end{pmatrix}
```

### 混合状態の場合
FidelityにはUnitary変換に対して不変という性質がある．(cf. [Nielsen & Chuang](https://www.amazon.co.jp/Quantum-Computation-Information-10th-Anniversary/dp/1107002176), 式(9.61) )

```math
F( U\rho U^{\dagger}, U\sigma U^{\dagger} ) = F( \rho, \sigma )
```

ゆえに，対角化したのちに計算すれば良い．(対角化不可能な場合はどうすれば良いのか？）

#実装

まずは必要なライブラリを`import`

```python
%matplotlib inline
# Importing standard Qiskit libraries and configuring account
from qiskit import QuantumCircuit, execute, Aer, IBMQ
from qiskit.compiler import transpile, assemble
from qiskit.tools.jupyter import *
from qiskit.visualization import *
# Loading your IBM Q account(s)
provider = IBMQ.load_account()

from qiskit.aqua import run_algorithm
from qiskit.aqua.input import LinearSystemInput
from qiskit.quantum_info import state_fidelity
from qiskit.aqua.algorithms.classical import ExactLSsolver

import numpy as np
```

## 純粋状態同士

cf. [純粋状態と混合状態](https://qiita.com/YuichiroMinato/items/10741aaa48220be6efb0)

ベクトルの内積と同じようにかける．
$$
F( |\psi_1\rangle, |\psi_2\rangle ) = \left| \langle \psi_1 \left. \right|\psi_2 \rangle \right|^2
$$

```python
psi1 = np.array([ 1, 0, 0, 0 ])
psi2 = np.array([ 0.5, 0.5, 0.5, 0.5 ])

state_fidelity( psi1, psi2 )

>> 0.25
```

## 純粋状態と混合状態の場合
$$
F( \ket{\psi_1}, \rho_2) = \bra{\psi_1} \rho_2 \ket{\psi_1}
$$

```python
rho1 = np.array([[ 0.5, 0, 0, 0],
                 [ 0, 0.5, 0, 0],
                 [ 0, 0, 0, 0],
                 [ 0, 0, 0, 0]])

state_fidelity( psi1, rho1 )

>> 0.5
```

## 混合状態同士
$$
F( \rho_1, \rho_2 ) = \mathrm{Tr}\left[ \sqrt{ \sqrt{ \rho_1 } \rho_2 \sqrt{ \rho_2 } } \right] ^2
$$

```python
rho2 = np.array([[ 0.5, 0, 0, 0],
              [ 0,   0, 0, 0   ],
              [ 0 ,  0, 0, 0   ],
              [0, 0, 0,  0.5]])

state_fidelity( rho1, rho2 )

>> 0.25
```