OmniAICreator/Qiita-1.07M huggingface dataset:
【CakePHP 2.x】 テーブルにカラムを追加しても反映されない 

# 経緯

先日、CakePHPで構成されるWebアプリケーションに新たにデータ項目が追加されることになりました。そこでデータベースのテーブルにカラムを新規に追加しました。しかしコントローラーでモデルを参照しても、追加したカラムのデータを一向に読み取ることができず、ソースコードを何度も見返しても原因がわかりませんでした。

# キャッシュファイルが原因

CakePHPのキャッシングによって、次回以降の重いクエリなどのリソースの読み込みにかかる時間を短縮できます。公式のドキュメントによると、Cacheクラスを使用することでキャッシュを利用することができ、以下にある組み込みキャッシュエンジンを使用できるそうです。

* FileCache
* ApcCache
* Wincache
* XcacheEngine
* emcacheEngine
* MemcachedEngine

2.3以降ではFileCacheがデフォルトのキャッシュエンジンに設定されており、特定のディレクトリにキャッシュファイルが生成されます。今回のケースでは、app/tmp/cache/modelsに該当のモデルのキャッシュファイルが存在しました。テーブルにカラムを追加した後も、キャッシュファイル内の古い情報を参照し続けたことが原因になります。

ちなみにキャッシュの設定はapp/Config/core.phpで行うことができます。

```core.php
Cache::config('default', array(
    'engine' => 'File',
    'duration' => 3600,
    'path' => CACHE,
    'prefix' => 'cake_'
));
```



# 参考
公式ドキュメント:キャッシュ
https://book.cakephp.org/2.0/ja/core-libraries/caching.html
Bundler 2.X系でbundle execがdefaultバージョンを参照してしまう時の対処法



`bundle exec rails g ~`が全く機能しなかったので、調査した件。

- [Ruby 2.6.1 に含まれる Bundler 1.17.2 に不具合があるという話](https://qiita.com/koshigoe/items/7527bd7f65c2ee33bd85)

***
#####今回の実行環境
``` 
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.14.6
BuildVersion:	18G95
```

***

今回起きたエラー内容は以下の通りです。

```
$ bundle exec rails g controller StaticPages home help about
/Users/iori_jp/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/bundler-2.0.2/lib/bundler/runtime.rb:319:in `check_for_activated_spec!': You have already activated bundler 1.17.2, but your Gemfile requires bundler 2.0.2. Since bundler is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports bundler as a default gem. (Gem::LoadError)
```

適用されている`bundler gem`のバージョンが`1.17.2`なので、`2.0.2`に変更してくださいとのことでした。
上記の参考ページ曰く、bundlerバージョンが`1.17.2`だと色々面倒らしく、`1.17.3`に変更した方が良いとのこと。

***

___途中、試行錯誤で試したものが影響を持っている可能性があるため、メモ書き程度で参考にすることをオススメします...___

***
まず、`Gemfile.lock`の`BUNDLED WITH`を確認します。

```
$ cat Gemfile.lock | tail
RUBY VERSION
   ruby 2.6.1p33

BUNDLED WITH
   1.17.2
```

`Gemfile.lock`は、`bundle install`した時点で作成されます。
（ここでバージョンが`1.17.3`であれば、問題は別にありそうです。）
この後の作業として、bundlerのdefaultバージョンを `1.17.3`、
実行バージョン`2.0.2`をインストールしてから、`bundle install`します。

次にbundlerのバーションを確認します。

```
$ gem list bundler

*** LOCAL GEMS ***

bundler (2.0.2, default: 1.17.2)
$ bundle -v
Bundler version 1.17.2
```

`gem update --system`を実施して、defaultのbundlerバージョンを1.17.3に変更します。

```
$ gem update --system
```

bundlerバージョン 2.0.2 をインストールします。
ここで`gem install bundler -v 1.17.3`のように指定することも可能
今回は最新版である`2.0.2`を使用するため、指定はしません。

```
$ gem install bundler
Successfully installed bundler-2.0.2
Parsing documentation for bundler-2.0.2
Done installing documentation for bundler after 1 seconds
1 gem installed
```

次に`Gemfile.lock`を削除します。

```
$ rm Gemfile.lock
```

やっと、`bundle install`。
ここでpathをオプションに入れることで、bundlerのバージョンを`global`でなく、
`local`で持つことができます。

```
$ bundle install --path=vendor/bundle
```

最後に、catで`BUNDLED WITH`のバージョンを確認して終わりです。

```
$ cat Gemfile.lock | tail
RUBY VERSION
   ruby 2.6.1p33

BUNDLED WITH
   2.0.2
```

これで無事、`bundle exec rails g controller ~~`できるようになりました。
ABC142 参加記録

今回から参加したコンテストの記録を残して行くことにします。ほぼ自分用メモ。
公式の解説を見る前に記述しています。

# AtCoder Beginner Contest 142

## A - Odds of Oddness
``` c++:OddsofOddness.cpp
int main(void) {

	int N;

	cin >> N;

	cout << ((N + 1) / 2) / (double)N << endl;

	return 0;
}
```
奇数は`N/2`個あるのでそれを全体の個数`N`で割ってやればよいのだが、`N`が奇数のときは2で割るとC++では切り捨てされてしまうため、
`(N+1)/2`にすることで切り上げを実装。`N`が偶数のときは切り捨てられるので問題なし。

## B - Roller Coaster
``` c++:RollerCoaster.cpp
int main(void) {

	int N, K;

	cin >> N >> K;

	int height, count = 0;

	REP(i, N) {
		cin >> height;
		if (height >= K) count++;
	}

	cout << count << endl;

	return 0;
}
```
与えられた身長を線形に探索し`K`以上の値を数えるだけ。
問題文の形式を見ると`cin`で受け取るときに一旦配列に格納したくなったのだが、保持する必要がないので思いとどまる。

## C - Go to School

``` c++:GotoSchool.cpp
int main(void) {

	int N;

	cin >> N;

	vector<pair<int, int>> A(N);
	int num;

	REP(i, N) {
		cin >> num;
		A[i] = make_pair(num, i + 1);
	}

	sort(A.begin(), A.end());

	REP(i, N - 1) cout << A[i].second << ' ';
	cout << A.back().second << endl;

	return 0;
}
```
登校したときにいた教室の人数=登校した順番なので与えられた配列を昇順に並び替えればOK。
受け取った配列の添字=出席番号なので、配列をそのまま並び替えると出席番号の情報が失われてしまうため、`pair`で出席番号を保持したまま並び替える。`std::sort`は_O（NlogN)_らしいので十分に間に合う。

## D - Disjoint Set of Common Divisors
ACできるコードがかけなかったのでコードは省略。

### 実装した内容

実際に扱う値はAとBの公約数で、公約数の数は素因数の数に依存しているが、素因数の個数の上限を調べようとして[Wikipedia](https://ja.wikipedia.org/wiki/素因数#素因数の個数)を調べたがn=10^12を計算する気にはなれなかった。このときはとりあえずなんとなく10^6個よりは少ないとして考えることに。

AとBの値が何であれ、求まった数がAとBの公約数であることは考えずに、与えられた自然数の集合のから全ての数同士が互いに素な組み合わせを作ることを考える。

組み合わせを作るにあたって一番簡単なのは、
全通りの組み合わせを作って、それぞれの組み合わせで全ての値が素かどうかを調べる。互いに素だった組み合わせのうち個数が最も多かったものを出力。

となるが、公約数の数を`M`とすると全組み合わせの数が`2^M`個あり、各組み合わせの各数が互いに素かを調べるのに計算上_O(M^2)_かかってしまい現実的な時間で終わらない。
そこで思いついた工夫は、個数の少ない組合せから作り、素でないと判断された時点で残りの公約数を追加することをやめ、計算の候補から外すことで作る組み合わせを減らすというもの。
例えば`A=12, B=18`のときに公約数`1,2,3,6`から`{1}, {1,2}, {1,2,3}, {2,3}, {3}...`を作り、`{1,2}`を作ったあともし次の`3`を追加して条件を満たさなくなるのであれば、`6`の入った`{1,2,3,6}`の判定は行わないということ。
さらに`x`と`y`が素であるかどうかを計算しておいた`memo[x][y]`を用意しておいて素であるかの判定を省略できるようにする。

しかし、(今考えれば当たり前だが)これでも計算時間が大きすぎたのでTLEで間に合わず。

### ACできなかったので考え直した結果

前述した方法は、そもそも素であるものすべてを含んでいない組み合わせ(`{1,2}`や`{2,3}`)は作る必要がないので、
ある公約数`x`を基準にしてその値と素である公約数`y1, y2, y3...`自体を組み合わせにして問題なかった。(`x`が1なら`{1,2,3}`だけでよい)

- AとBの公約数を求めるのに、`√n`までの数で割りAB両方割り切れる数を列挙する→ _O(√min(A,B))_ (最悪で_O(√(N))_)
- 公約数同士を素か比較する回数は、`x`と`y`のペアを作る回数→ _O(M(M+1)/2) ≒ O(M^2)_
- `x`が`y`と素であるかは、`x`の約数を求め`y`が含まれているかを計算する→ _O(√max(x, y))_ (最悪で_O(√(N/2))_)

まとめると最悪の場合でも _O(√(N))_ + ( _O((M^2)*√(N/2))_ )
公約数の個数Mが10^3個程度なら間に合いそうな計算時間である。

~~10^12までの値の素因数の個数の上限をさきほどの[Wikipedia](https://ja.wikipedia.org/wiki/素因数#素因数の個数)通りに計算したところ12.86636と出てきたが本当にこんなに少ないのだろうか。~~
19/10/02(追記)
公約数は素因数の組み合わせからも求められるが、約数の個数でいいので最大で√N個以下ということでよかった
超初心者のデータベース導入

久しぶりにプログラミングというか技術的なことをやってみたので、備忘録として投稿。
データベース使えるようになったらマイコンで取得したデータを蓄積ができるかな？と思ってやってみました。
https://qiita.com/camopy/items/ba36508d57b4f05a580f

実験環境はWindows10
Windowsにした理由は目の前のPCがWindows10だからという安直な考え、、、
PythonはAnacondaが既に入ってたのでそれを流用

#0.DBの選定：PostgreSQL
データベースの種類は色々あるけど、昔いじったことのあるPostgreをインストールしてみた。
特に、Postgreじゃないといけないということではない（ハズ、、、）

#1.PostgresSQLのインストール
https://www.enterprisedb.com/downloads/postgres-postgresql-downloads
このサイトからいっちゃん新しい11.5を選択。
とりあえず、新しけりゃOKな気がするので、これも安直に決定。
インストールも適当にポチポチとしていく。
自分は以下のサイトを見ながらやりました。
参考：https://itsakura.com/pgadmin4-db-create
勝手にリンク貼ってすみません。

#2.Postgreのドライバ(psycopg2)の入手
Anacondaをインストールすると色々なものが入ってくる。
その中のAnavonda Navigaterを使用してドライバをインストールした。
コマンドでも入るけど、なんか見やすいのでこれを使用した。

詳細は省くが
1.Anavonda Navigaterを起動
2.Enviromentsタブをクリック
3.デフォルトのrootを選択
(環境を別にしたい場合、Createボタンクリックし新しい環境をつくる）
4.プルダウンメニューのinstalledをAllにして検索ボックスにpsycopg2をいれると
お目当てのものが出てくるので、それをインストール。

#3.プログラミング
ついにお目当てのプログラミング。
まぁ簡単なので見りゃわかるかもしれない
（自分はcursorとかよくわかってない、、、）

```python:コード

import psycopg2

connection = psycopg2.connect("host=127.0.0.1 port=5432 dbname=testdb user=postgres password=設定したパスワード")

cur = connection.cursor()
cur.execute("SELECT * FROM テーブル名;")
#cur.execute("INSERT INTO テーブル名(name, id, romaji) VALUES('hello', 2, 'world');")

print(cur.fetchone())

cur.close()
connection.commit()
connection.close()

```

10分くらい悩んだのが、インサートの方法
インサート文を実行し、pgAdminで確認しても反映されないという現象。
これは単純にコミットを実行してなかっただけで
connection.commit()
を実行したら反映されました。

今日はここまで
Nuxt.jsのはじめかた npm


```
npx create-nuxt-app <project-name>
```

```
✨  Generating Nuxt.js project in designcase_hp
? Project name *****
? Project description My supreme Nuxt.js project
? Author name ****
? Choose the package manager Npm
? Choose UI framework Bulma
? Choose custom server framework None (Recommended)
? Choose Nuxt.js modules Axios
? Choose linting tools ESLint
? Choose test framework None
? Choose rendering mode Universal (SSR)
? Choose development tools jsconfig.json (Recommended for VS Code)
```

```
npm install --save-dev eslint-loader

```

#動的ルーティングの作成 distフォルダの作成
```
npm run generate
```

#contentfulの設定
https://qiita.com/kmifa/items/c320575b65ac35a9e7f1

#bluma
http://bgraphic.no/using-bulma-font-awsome-nuxt/
https://qiita.com/mnmemo/items/5eb4fb8cbfe17670fd36

```
npm i @nuxtjs/bulma -save
```
#fontawsomeの設定
https://kapi-travel.com/programing/nuxt-js%EF%BC%8Bbulma%E3%81%AE%E3%83%AC%E3%82%A4%E3%82%A2%E3%82%A6%E3%83%88%E3%82%92%E7%88%86%E9%80%9F%E3%81%A7%E5%AE%9F%E8%A3%85%E3%81%99%E3%82%8B/

```
$ npm install --save @nuxtjs/font-awesome
```
 
nuxt.config.jsのmodulesに追記する

#vue-instagram
https://www.npmjs.com/package/vue-instagram

#vue-carousel

https://qiita.com/gakumac/items/cc3f1bb0dfcbbefa1eeb

#google analytics
https://ja.nuxtjs.org/faq/google-analytics/

#rich-text-html
https://tech.itpropartners.jp/entry/2019/06/05/171553
https://www.npmjs.com/package/@contentful/rich-text-html-renderer

```
npm install @contentful/rich-text-html-renderer
```

## nuxt: command not foundっていわれたら
```
npm install --save nuxt
```

nuxt generateじゃないww

```
# nuxt コマンドを実行
npm run dev 

# nuxt build コマンドを実行
npm run build 

# nuxt start コマンドを実行
npm run start

# nuxt generate コマンドを実行
npm run generate
```
Class.getSimpleName()の罠

## 学び

Android開発において、SimpleNameは使うべきではなさそう。

## 背景

SimpleNameを使った実装で予期せぬ動作を経験しました。

全く違うクラス名にも関わらず、同一のSimpleNameになっていたのです。
例えば、下記のコードが `true` になるのです。

```kotlin
if (MainFragment.simpleName == SubFragment.simpleName) {
    // "MainFragment" と "SubFragment" の比較になることを期待したので、
    // falseを期待しているのに、trueになる場合がある
}
```

ちなみに、私の環境ではdebugビルドでは `false` になるのに、
releaseビルドでは `true` になりました。

勘のいい人はわかったかもしれませんね。

## 何が起きたのか

難読化。ProGuardの仕業。
上記の例では、`MainFragment` と `SubFragment` が別のパッケージだった場合に、
難読化されて同一のクラス名に置き換わる可能性があります。

初期設定のProGuardの設定では、
パッケージ内のクラス名はアルファベット順に置き換わります。

例えば、下記の二つのクラスは、このように変換されます。
`com.yoshinori.sandbox.main.MainFragment` → `b.b.a.a.a`
`com.yoshinori.sandbox.sub.SubFragment` → `b.b.a.b.a`

このように変換された時の `SimpleName` は、両方とも `a` です。
元々のクラス名は全然違うのに、難読化後は同一のクラス名として処理されてしまうのです。
当たり前のようで、気付きにくいミスです。

## どうやって対応すれば良いのか

`SimpleName` ではなくて `Name` を使用する。

`name` は、パッケージ名 + クラス名です。
難読化前なら `com.yoshinori.sandbox.main.MainFragment` となります。
これであれば、難読化後であっても、同一になることはありません。

```kotlin
if (MainFragment.name == SubFragment.name) {
    // 常にfalseになる
}
```

## 終わりに

もし `SimpleName` を使用している場合、本当に問題ないか確認してみてください。
基本的に普段の実装時にはProGuardは無効にしていると思います。

ですので、リリース直前で気づくことになったり、
最悪の場合は不具合に気付かずストアリリースされちゃいます。
怖いですね。
kaggle犬コンペの上位解法まとめ

[kaggle犬コンペ](https://www.kaggle.com/c/generative-dog-images/overview)というGANを使って犬の画像を生成するコンペティションがありました。僕自身も参加はしていましたが全く奮わなかったので後学のために上位解法をまとめておきます。Discussion に書かれていることをまとめただけでコードは読んでないので注意。

## [1位](https://www.kaggle.com/c/generative-dog-images/discussion/106324#latest-617648)
### データ前処理
- アスペクト比が極端な画像を除く (縦/横 < 0.2 または縦/横 > 4)
- 余分なオブジェクトが写っていない部分のみ使う ([参考](https://www.kaggle.com/korovai/dogs-images-intruders-extraction-tf-gan))
- Bounding Boxの利用
- 64x64へのリサイズ
- Horizontal Flip

### モデル
- BigGAN
- 入力は120次元標準正規分布からのサンプル
- LeakyReLU
- 32x32でSelf-Attention
- truncation trick. 閾値は0.8
- EMAなし

### 学習
- binary cross entropy
- Adam (lrG=3e-4, lrD=3e-4, beta1=0.0, beta2=0.999)
- batch sizeは32
- 130 Epoch
- label smoothing

## [2位](https://www.kaggle.com/c/generative-dog-images/discussion/104211)
### データ前処理
- 画像に一様なノイズを付加
### モデル
- BigGAN(shared embedding、hierarchical latent noise, projection)
### 学習
- RaLSにauxiliary classification lossで荷重
- batch sizeは128
- generator には EMA使用

## [3位](https://www.kaggle.com/c/generative-dog-images/discussion/106514)
### データ前処理
- public scoreとしてはBounding Boxでのclippingをした画像と元画像を両方使うのがベストだった

### モデル
- Self-Attention GAN
- 32x32でSelf-Attention
- 入力は180次元

### 学習
- binary cross entropyが最良、次点でLSGAN-sigmoid
- generatorの学習率は2e-4、discriminatorの学習率は4e-4
- label smoothing
- batch sizeは32 (64も試したが32の方がよかった)
- Cosine Annealing Warm Restarts
- 170 epoch

## [4位](https://www.kaggle.com/c/generative-dog-images/discussion/104281)
### データ前処理
- Bounding Boxで切り抜いたもの+オリジナルの画像
### モデル
- BigGANベース
- channel数のベースが24
### 学習
- batch sizeは32
- 200エポック
- Gの学習率は1e-4、Dの学習率は6e-4

## [5位](https://www.kaggle.com/c/generative-dog-images/discussion/104287)
### データ前処理
### モデル
- BigGAN-deep、ただしtruncation trickなし
- Generatorにshared class embeddingによるhierarchical noise injection
- channel数のベースの数はgeneratorが32、discriminatorが64

### 学習
- cosine annealing
- batch sizeは32

## [8位](https://www.kaggle.com/c/generative-dog-images/discussion/106452)
### データ前処理
- Bounding Box でのcrop、horizontal flip
- 綺麗なデータをピックして使おうとしたがあまりいい影響はなかった

### モデル
- StyleGAN
- 入力は256次元

### 学習
- Auxiliary Classifierはあり


それぞれのコードの詳細を読んだ方がいいのでしょうが、とりあえずほとんどの人がBigGANを推していること、Bounding Boxを使って切り抜いた画像とオリジナルの画像を両方使うことあたりは重要そうな気がします。
Windows/Macでapkを動かす

Androidのアプリの画面をWindowsやMacで見たいという場合、apk自体をエミュレーターで動かしてしまう方法と、apkが動いているAndroidの画面をミラーリングする方法があります。

## apk自体をエミュレーターで動かす方法

### BlueStacksのインストール

BlueStacksをインストールします。Windows/iOS両方対応しています。
https://www.bluestacks.com/ja/index.html

起動すると、こうなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44912/9d9df5c8-0fd9-d176-62ad-78ab07fafef0.png)

縦画面にしたい場合は、右上のボタンでサイドバーを開き、一番下の切り替えボタンを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44912/bd3595c6-1699-1ef7-eadf-f7b95a221b23.png)

### apkのインストール

分かりにくいですが、インストールアプリメニューからインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44912/b23e0fec-8060-5bf4-0f33-ce1f632a9414.png)


## apkが動いているAndroidの画面をミラーリングする方法

ミラーリングする方法はいろいろありますが、USB接続するだけでお手軽にミラーリングする方法です。

VysorというChrome拡張を入れます。
https://chrome.google.com/webstore/detail/vysor/gidgenkbbabolejbgbpnhbimgjbffefm?hl=ja

Android側は、USBデバッグを有効にする必要があります。
その状態でVysorを起動し、USBでつなぐと、Vysorの画面にAndroid側の画面が表示されます。
Android側にはVysorアプリがインストールされます。
Windows側の画面からAndroidの画面をマウスで操作することもできます。

一定時間操作がないと広告が表示されます。戻るボタンで消せます。

おしまい。
英語で海外のFEチームの進行管理をしました

## 経緯
仕事でとあるWEBページの機能追加を海外のFEチーム（オフショア）が担当することになり、そのハンドリング業務を任されることに。

## 進行で行ったこと  
* 日本側で作った仕様（APIも）の説明
* 作成ファイルの管理とコードレビュー
* 修正や質問の仲介
* 定期ミーティングで進捗確認

## 前提条件  
**共通言語が英語！！**  

<dl>
<dt>自分</dt><dd>英語は中高教育どまり。（細々とduolingoで勉強はしている）。 </dd> 
<dt>海外FE </dt><dd>読み書き会話がある程度できる（母国語ではない）</dd></dl> 
* ミーティングでは通訳が入るので日本語でOK
* 進行管理はredmine上で  
* 日常のやりとりはチャット（Teams)。
* チーム内で他の人もハンドリングをした事があるので、流れはイメージできている。

### 役に立ったツール
* chrome機能拡張：[google翻訳](https://chrome.google.com/webstore/detail/google-translate/aapbdbdomjkkjkaonfhkkikfgjllcleb?hl=ja)  
webページ上で右クリック→ページ全体の翻訳  
webページのテキストを選択して、右クリック→ツールチップのように日本語に翻訳されたテキストが表示される。  
機能拡張アイコンをクリック→テキストリンクで別タブで英語⇔日本語ページを表示
* chrome機能拡張：[シンプル翻訳](https://chrome.google.com/webstore/detail/%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E7%BF%BB%E8%A8%B3/pdnmkammncjnifdeclafllianknnoaif?hl=ja)  
キーボードショートカットでコピーしたテキストを英語⇔日本語に翻訳するポップアップが表示されるようにしておく。
* クリップボードアプリ：[Clipy](http://clipy-app.com/)  
定型文のスニペットとショートカット機能があると便利  
(仕事でMACを使っているのでClipyはMACアプリになります。Windowsの場合は[clibor](https://forest.watch.impress.co.jp/library/software/clibor/download_10713.html)が個人的に使いやすかったです。）

## 会話は短く、簡潔に  
会議で話す時は通訳の方が分かりやすいようにゆっくり話す。短い文章で話す。（接続助詞で文をつなげないことを意識しました）  
質問に対しては最初にYes/No、できる/できないなど明快な回答をしてから、なぜなら〜と説明をする

```
ソースのimportは禁止ですが、コピーはOKです。
```
上記を意識した会話  

```
ソースをimportしないでください。
ただし、コピーすることはOKです。
```

## 翻訳はgoogle翻訳のように 
話し言葉そのままを翻訳するとこちらの意図が伝わらない文章になってしまうケースがよくありました。  
google翻訳で訳されたような文章に変換して英訳すると意図した文章に近くなりました。  
シンプル翻訳を使って英→日変換して、意図した文章と同じ意味になるかを確認するとより確実でした。

例1  

```
（私宛に）仕様変更の連絡がまだ来ていません。
ひとまず(私が)チケットを作成します。
⬆︎直接面と向かって話す場合は（）内は省略しても伝わる
```
google翻訳結果  

```
We have not received notification of specification changes.
⬆︎確認できていないのは「私」であってWeではない
Create a ticket first.
⬆︎命令形（チケットをつくれ）になっている
```
伝えたい意図に近い翻訳

```
私は仕様変更の連絡をまだ受け取っていない
→I haven't received a change of specification yet
私は先行してチケットを作成します
→I will create a ticket in advance
```
## 定型文はスニペット＆ショートカット登録で時短
くり返し使うテキストは、クリップボードアプリでスニペットとショートカットを登録することで文書入力の手間を省く。
redmineやTeamsの他の人のやりとりをみて、使えそうな定型文はスニペット登録。

```
I comfirmed the comment.  
(コメントを確認しました)
I comfirmed this ticket.
(チケットを確認しました。)
I checked the committed source code.
Thanks for the fix.
(コミットしたソースを確認しました。ご対応ありがとうございます。)
Thanks and Regards
(よろしくお願いいたします)
Thanks,
名前.
(redmineやチャットの締め言葉)
```

## 下準備は大事

* APIとHTMLとJSのマッピング（APIの値がどこにどう当てはまるのか）の資料を作っておく(翻訳までできていればベスト）  
→そうしないとredmineで質問チケットが山のように作成されて返答だけで1日終わる  
* 実際に画面を見せられる状態にしておく  
→お互いコーダーなので画面を見せながら要望を伝える方がわかる場合もあるので。  

初めてのことだらけで、海外のチームの方にはsorry連発でした。
英語にたくさん接することができたのはとてもいい経験になりました。
次はもっとスムーズに進行を進めたいです！
ndenv環境時にWebStormでpackage.jsonのタスク実行時「npmパッケージが指定されていない」と怒られる

社内でもSublimeTextおじさん~~という名の老害~~として君臨していたのですが、この度JetBrains軍門に下りました。エディタ生活に慣れきっていたので個人的には困ってる困ってないでいえば困ってはいなかったのですが、品質担保という面から自分ひとりだけSublimeおじさんしているわけにもいかなくなったので、丁度いい機会かと思いWebStormを使い始めることにしました。

試しに過去の個人プロジェクトを開いてみたところニョロニョロだらけでげんなりしたのでそっ閉じしました。

# 前提

* Mac
* WebStorm
* `anyenv`の`ndenv`を使ってNode.jsのバージョン管理をしております。

# npmタブからスクリプト実行時に怒られる

WebStormではnpmタブからpackage.jsonに記述したスクリプトをターミナルを経由せずに実行することが出来ます。早速やってみましょう。

`23:02	' ' の実行中にエラーが発生しました: java.util.concurrent.ExecutionException: com.intellij.execution.ExecutionException: Please specify npm or yarn package`

えぇ…。

# 設定を確認してみる

`Preference` > `Node.js および NPM`タブを開くと、`Nodeインタープリター`欄にはきちんとanyenvのパスが入っていましたが、`パッケージ・マネージャー`の欄は空欄でした。

![スクリーンショット 2019-09-28 23.59.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141352/bd049e91-2b7e-5c0b-b744-1f9145eb1872.png)

こいつが怪しそうです。

## 設定しようとしてハマる

三点リーダからパスを指定しようとしたら、ディレクトリ一覧にanyenvが出てきません。先頭にピリオドがついている隠しディレクトリ扱いのためか、表示されないようです。仕方ないので直接パスを指定します。

## 指定先のパスがわからずハマる

いざパスを指定しようとしたところ、じゃあどこを指定すればいいのか、という問題にぶち当たり1時間近く頭を抱える羽目になりました。`ndenv`のバージョン変えてもきちんと動くのか非常に不安ではありますが、グローバルにインストールしている`Node.js`でインストールされている`npm`のインストール先を指定したところ、`package.json`に記述のあるパッケージのバージョンを確認してくれるようになりました。

![スクリーンショット 2019-09-29 0.08.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141352/259c98dc-4146-61a5-d0ec-ea23cca24f21.png)

`~/.anyenv/envs/ndenv/versions/v10.15.0/lib/node_modules/npm`

パスは適時読み替えて、自身のインストール状況に合わせたパスを指定してください。

## npmタブからスクリプトを走らせてみる

設定を保存して再びnpmタブに戻り、スクリプトの実行に再チャレンジしてみます。`構成の編集`ウィンドウが出てきた場合は、`パッケージマネージャー`が空欄になっていると思いますので、プルダウンを開くと`Project`のところに先程登録したnpmのパスが入っていると思いますので、そちらを指定すれば実行出来るかと思います。

# 終わり。

これバージョン変えるたびに都度変えなきゃいけないのはプロジェクト行き来するケースだと結構面倒だと思うのですが、実はプラグインでそのへんカバーされてるのでは、と8割くらい書き終わってから思いました。

とりあえず色々弄くり倒してみようかと思います。
Smalltalk で単アルファベット換字式暗号を作る

　暗号解読の作問をするためのプログラムを Smalltalk(Squeak 6.0) で書いてみました。ソースコードは以下の通りです。

```smalltalk
|plainText cryptoKey stream|

plainText := 'This is plain text.' asLowercase.

cryptoKey := Character alphabet shuffle.

Transcript cr; show: 'Key is: ' , cryptoKey; cr.

stream := TextStream with: ''.
plainText do: [:each ||index|
	index := Character alphabet indexOf: each.
	index = 0 ifTrue: [
		stream nextPut: each.		
		]
	ifFalse: [
		stream nextPut: (cryptoKey at: index).		
	]
].

Transcript cr; show: stream contents.
```

　結果、こんな問題が出来ました。
https://gist.github.com/satoyuichi/f27b3b9b9911da69c7dce5977f27c2d1

# 解説
　暗号は単アルファベット換字式暗号です。アルファベットをスクランブルしたものを鍵として、平文を暗号化しています。平文をすべて小文字に変換しているのは解読しやすくするためです。記号やスペースをそのままにしているのも解読しやすくするためですが、同様にスクランブルするのであれば、

```smalltalk
cryptoKey := Character alphabet shuffle.
```

を

```smalltalk
cryptoKey := (Character alphabet , '.,:; ') shuffle.
```

などのようにすれば対応できます。
CentOS 7にPHP 7.1をインストール（IUS Community Project）

# はじめに

IUS Community Projectを利用してCentOS7にPHP7.1をインストール
親記事：[PHP, PHP-FPMの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/dfe3823554b7caba6f6a)
参考：[Usage - IUS](https://ius.io/usage)

## サポート

本手法で導入した場合、[PHP: Supported Versions](https://www.php.net/supported-versions.php)/[PHP: Unsupported Branches](https://www.php.net/eol.php)より、2019-12-01がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)

# yum install -y https://centos7.iuscommunity.org/ius-release.rpm
... 略

# yum install -y mod_php71u php71u-cli which
... 略
```

### 各種確認

```shell-session
# which php
/usr/bin/php

# php -v
PHP 7.1.32 (cli) (built: Aug 30 2019 15:31:43) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies

# yum info mod_php71u
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * epel: ftp.riken.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
Installed Packages
Name        : mod_php71u
Arch        : x86_64
Version     : 7.1.32
Release     : 1.el7.ius
Size        : 9.2 M
Repo        : installed
From repo   : ius
Summary     : PHP module for the Apache HTTP Server
URL         : http://www.php.net/
License     : PHP and Zend and BSD and MIT and ASL 1.0 and NCSA
Description : The mod_php package contains the module which adds support for the PHP language
            : to Apache HTTP Server.

# yum info php71u-cli
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * epel: nrt.edge.kernel.org
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
Installed Packages
Name        : php71u-cli
Arch        : x86_64
Version     : 7.1.32
Release     : 1.el7.ius
Size        : 14 M
Repo        : installed
From repo   : ius
Summary     : Command-line interface for PHP
URL         : http://www.php.net/
License     : PHP and Zend and BSD and MIT and ASL 1.0 and NCSA and PostgreSQL
Description : The php-cli package contains the command-line interface
            : executing PHP scripts, /usr/bin/php, and the CGI interface.
```
SQL腕試し問題を解く 入会者数と退会者数を日付ごとに集計するSQL(応用編)

#はじめに
SQL腕試し問題（応用編）を解いてみました。
その日時点での会員数を表示させます。
https://qiita.com/jnchito/items/1d21fa3970b3c76bee43


##僕の解答例
こんな感じで作ってみました。
https://github.com/kyotom/SQL/blob/master/gistfile3.sql

会員数も相関サブクエリを使って算出しました。
ただし、left_onにNULLがあると日付計算が正しく算出されないため、
COALESCE関数を使って、なんとか回避しました。

（例）
2014年8月3日に入会し、現在も入会している会員がいる。
この会員のjoined_onは2014年8月3日だが、left_onはNULLとなる。
このデータに対して
「CASE WHEN '2014-08-03'::date <= left_on  THEN 1 ELSE 0 END」
を実行すると判定値は０を返す。

(対処法)
left_onにNULLが格納されている場合は「3000年1月1日」に置き換えて、日付計算させた。




##補足
実行環境：PostgreSQL 11.4
CentOS 6にPHP 7.1をインストール（IUS Community Project）

# はじめに

IUS Community Projectを利用してCentOS6にPHP7.1をインストール
親記事：[PHP, PHP-FPMの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/dfe3823554b7caba6f6a)
参考：[Usage - IUS](https://ius.io/usage)

## サポート

本手法で導入した場合、[PHP: Supported Versions](https://www.php.net/supported-versions.php)/[PHP: Unsupported Branches](https://www.php.net/eol.php)より、2019-12-01がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
CentOS release 6.10 (Final)

# yum install -y https://centos6.iuscommunity.org/ius-release.rpm
... 略

# yum install -y mod_php71u php71u-cli
... 略
```

### 各種確認

```shell-session
# which php
/usr/bin/php

# php -v
PHP 7.1.32 (cli) (built: Aug 30 2019 15:13:15) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies

# yum info mod_php71u
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ftp.tsukuba.wide.ad.jp
 * epel: nrt.edge.kernel.org
 * extras: ftp.tsukuba.wide.ad.jp
 * updates: ftp.tsukuba.wide.ad.jp
Installed Packages
Name        : mod_php71u
Arch        : x86_64
Version     : 7.1.32
Release     : 1.el6.ius
Size        : 9.1 M
Repo        : installed
From repo   : ius
Summary     : PHP module for the Apache HTTP Server
URL         : http://www.php.net/
License     : PHP and Zend and BSD and MIT and ASL 1.0 and NCSA
Description : The mod_php package contains the module which adds support for the PHP language
            : to Apache HTTP Server.

# yum info php71u-cli
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ftp.tsukuba.wide.ad.jp
 * epel: nrt.edge.kernel.org
 * extras: ftp.tsukuba.wide.ad.jp
 * updates: ftp.tsukuba.wide.ad.jp
Installed Packages
Name        : php71u-cli
Arch        : x86_64
Version     : 7.1.32
Release     : 1.el6.ius
Size        : 12 M
Repo        : installed
From repo   : ius
Summary     : Command-line interface for PHP
URL         : http://www.php.net/
License     : PHP and Zend and BSD and MIT and ASL 1.0 and NCSA and PostgreSQL
Description : The php-cli package contains the command-line interface
            : executing PHP scripts, /usr/bin/php, and the CGI interface.
```
CentOS 6にPHP-FPM 7.1をインストール（IUS Community Project）

# はじめに

IUS Community Projectを利用してCentOS6にPHP-FPM7.1をインストール
親記事：[PHP, PHP-FPMの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/dfe3823554b7caba6f6a)
参考：[Usage - IUS](https://ius.io/usage)

## サポート

本手法で導入した場合、[PHP: Supported Versions](https://www.php.net/supported-versions.php)/[PHP: Unsupported Branches](https://www.php.net/eol.php)より、2019-12-01がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
CentOS release 6.10 (Final)

# yum install -y https://centos6.iuscommunity.org/ius-release.rpm
... 略

# yum install -y php71u-fpm
... 略
```

### php-fpm起動/停止

```shell-session
# service php-fpm start
Starting php-fpm:                                          [  OK  ]

# service php-fpm status
php-fpm (pid  129) is running...
```

```shell-session
# service php-fpm stop
Stopping php-fpm:                                          [  OK  ]

# service php-fpm status
php-fpm is stopped
```

### php-fpm自動起動設定/設定解除

```shell-session
# chkconfig php-fpm on
# chkconfig --list php-fpm
php-fpm         0:off   1:off   2:on    3:on    4:on    5:on    6:off
```

```shell-session
# chkconfig php-fpm off
# chkconfig --list php-fpm
php-fpm         0:off   1:off   2:off   3:off   4:off   5:off   6:off
```

### 各種確認

```shell-session
# which php
which: no php in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin)

# which php-fpm
/usr/sbin/php-fpm

# php-fpm -v
PHP 7.1.32 (fpm-fcgi) (built: Aug 30 2019 15:17:39)
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies

# yum info php71u-fpm
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ty1.mirror.newmediaexpress.com
 * epel: ftp.riken.jp
 * extras: ty1.mirror.newmediaexpress.com
 * updates: ty1.mirror.newmediaexpress.com
Installed Packages
Name        : php71u-fpm
Arch        : x86_64
Version     : 7.1.32
Release     : 1.el6.ius
Size        : 4.0 M
Repo        : installed
From repo   : ius
Summary     : PHP FastCGI Process Manager
URL         : http://www.php.net/
License     : PHP and Zend and BSD and MIT and ASL 1.0 and NCSA
Description : PHP-FPM (FastCGI Process Manager) is an alternative PHP FastCGI
            : implementation with some additional features useful for sites of
            : any size, especially busier sites.
```
powershell で python の出力を受け取る


```hello.py
print("こんにちは！")
print("hello!")
```

上記の `.py` ファイルがあるとき、powershellでは下記のように実行して `print` 文の内容をコンソールに出力させることができます。そして **powershell は python の標準出力を戻り値として受け取ることができます。**

```
PS > python .\hello.py
こんにちは！
hello!
```

複数回の `print` 文の内容は配列に格納され、いったん変数に格納してしまえば通常のオブジェクトとして処理することができます。

```
PS > $s = (python .\hello.py)
PS > $s
こんにちは！
hello!

PS > $s[0]
こんにちは！

PS > $s[0] -replace "！", "？"
こんにちは？
```

コマンドライン引数も与えられるので `.py` ファイルが1つの関数のように機能します。python の柔軟な文字列操作を利用したいときに使えそうな tips として紹介してみました。
エンジニアスタンプラリー～フロントエンド編＃6

## 企画主旨
[Frontend Developer Roadmap](https://roadmap.sh/frontend)をひたすら巡回する企画 
詳しくは[こちら](https://qiita.com/tonchan1216/items/8d5f072cf769dfe1bc4f)

## 今回の実施内容
CSSアーキテクチャ
ツールとかではなく設計手法のようだ。

## CSS Architectures

#### BEM
Block, Element, Modifierで構成や命名をする。筆者的には初めましてキーワード。
公式サイト[Quick start / Methodology / BEM](https://en.bem.info/methodology/quick-start/)を参考にしてクラス名を決めた。
&を使ったSCSSの記述は良くないって聞いたけど、スタンプ獲得できれば問題なし。

```html:index.html
<header class="header">
  <h1 class="header__title">Frontend Developer Roadmap スタンプラリー</h1>
  <nav class="top-bar row justify-content-center">
    <h2 class="top-bar__item top-bar__item_active col-sm-6"><a class="top-bar__link top-bar__link_front" href="#">フロントエンド</a></h2>
    <h2 class="top-bar__item top-bar__item_inactive col-sm-6"><a class="top-bar__link top-bar__link_back" href="#"> バックエンド</a></h2>
  </nav>
</header>
```

```scss:main.scss
.header {
  &__title {
    font-size: 3em;
    text-align: center;
    margin: 0;
    padding: 30px 0;
    color: #00539f;
    animation: fadeInTitle 3s ease-in;
  }
}

.top-bar {
  &__item {
    margin: 0;
    padding: 20px 0;
    text-align: center;

    &_active{ background-color: $bg-color; }
    &_inactive{ background-color: white; }
  }

  &__link {
    display: block;
    text-align: center;
    &:hover { text-decoration: none; }
  }
}
```

## 成果物
厳密な命名をすればコードの統一感は増すし、依存関係とかもはっきりするかな、といったところ。
https://tonchan1216.github.io/WDR-frontend/v6/
https://github.com/tonchan1216/WDR-frontend/tree/v6.0
初心者によるプログラミング学習ログ113日目

# 100日チャレンジの113日目

Twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

113日目は、

* ドットインストール、javascriptの三択クイズ作成をやりました。


三択クイズ自体は、今現在途中です。
というのも、やっている最中に猛烈な眠気に襲われて少し瞼を閉じたら、気が付いたら朝でした笑

疲れていたようです。。。


インプット重視で今までやっていたので、ドットインストールなどの〇〇をつくる系の、アウトプット重視の勉強もしていきたいので、今回のをやりました。

チュートリアルなどでは、こんな機能がある、というのはわかるが、実際それを使ってどんなことができる、というのはあまり判別しません。

それはぱぺまぺが初心者だからかもしれないからかもですが。


たまには〇〇をつくる系などアウトプット重視の学習を続けるのも知識の定着に役立つと考えます。
CapybaraでElementNotFoundと出た時の対処法

RSpecでよく使用されるCapybara
ブラウザでの操作やエミュレーターでの操作を全てRuby上で書けるし代行してくれる優れものなのですが、feature Specで決まって
>capybara::ElementNotFound:Unable to find visible field

というエラーが発生するためそれの原因と解決策を忘れない様書いておきます
今回はウェブブラウザーを使用します
どのブラウザーでもいいですがGoogle Chromを使用していきます

## どういった状況で発生するのか
fill_inでどの要素にどの値を入れてほしいかを教えたら

```ruby:./spec/features/sign_up_spec.rb
fill_in "email", with: "example@example.com"
```
capybaraさんから
そんな要素ないから値が入らないです
と怒られました

```
 Failure/Error: fill_in "email",  with: "example@example.com"
```
エラー内容的には、「emailってメソッドないんですけど間違えてないですか？」と教えてくれます
なので修正方法としてはここを直していく感じです

## 解決法
rails serverを開き、Capybaraでtestしたい場所(サイト)まで移動します
そこでMacなら「option + command + C」を押して開発者ツールを起動します
testしたいところにカーソルを近づけると・・・
![スクリーンショット 2019-09-28 23.39.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443678/747d45ed-68c3-6977-2fce-39b1e1f2c6ec.png)
こんな感じで表示されます(今回はemailを入れるinputタグを見本としています)
そしてここをクリックすると
![スクリーンショット 2019-09-28 23.39.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443678/4e5bc854-c8cf-c3bc-eddd-1c64006f8d5b.png)
こうやってHTML形式でinputの詳細が出てくるので、その中の
>name = "session[email]"

をCapybaraのfill_inに読ませればうまく動作してくれると思います
AWSでWEBアプリケーション構築（４）

簡易なWEB／APサーバ、DBサーバのWEBアプリケーション環境をAWSで構築する。
出来上がり時のイメージは以下のとおり。
https://qiita.com/chokunari/items/28d160397b26a50d8c11

参考にした書籍
Amazon Web Services 基礎からのネットワーク＆サーバー構築
https://www.amazon.co.jp/dp/B06Y5ZSYY4/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

【ローカル環境】
MacBookPro
MacOS:Mojave 10.14.6

###RDSでPostgreSQLのDBサーバ構築編
1. RDSインスタンスの作成
    1. RDSダッシュボードのデータベースメニューからデータベースの作成。
    2. データベースの設定はStandard Create。
    3. エンジンのオプションはPostgreSQL。（任意。）
    4. バージョンは11.4-R1。（任意。）
    5. テンプレートは無料利用枠。
    6. DB インスタンス識別子はdatabase-1。（任意。）
    7. マスターユーザ名、マスターパスワードも任意。
    8. DB インスタンスサイズは変更できないので固定。
    9. ストレージ割り当ては無料枠に収まる20GiB。
    10. ストレージの自動スケーリングは無効。（任意。）
    11. マルチAZ配置は変更できないので固定。（本番環境等では活用。）
    12. Virtual Private Cloud (VPC)は作成済みVPCを選択。
    13. サブネットグループは新しいDBサブネットグループの作成。
    14. パブリックアクセス可能はなし。
    15. VPCセキュリティグループは新規作成。
    16. 新しい VPC セキュリティグループ名は任意。
    17. アベイラビリティーゾーンはWEBサーバが配置してあるところを選択。
    18. データベースポートは、今回はお試し用なので5432でOK。
    19. 追加設定の最初のデータベース名は任意で入力。
    20. DB パラメータグループはデフォルト。
    21. IAM db 認証は任意。
    22. 自動バックアップの有効化は任意。
    23. Performance Insights を有効にするは任意。
    24. マスターキーはデフォルトでOK。
    25. 拡張モニタリングの有効化は任意。
    26. ログのエクスポートは任意。
    27. マイナーバージョン自動アップグレードの有効化は任意。
    28. メンテナンスウィンドウは設定なし。
    29. 削除保護は任意。
    30. データベースの作成。
2. WEBサーバからの疎通確認
    1. EC2ダッシュボードのセキュリティグループメニューで、前項番にて作成したセキュリティグループを選択。
    2. インバウンドタブを選択し、編集。
    3. PostgreSQLのソースを任意の場所に設定。
    5. ルールの追加。
    6. タイプはSSHを選択。
    7. ソースは任意の場所を選択。
    8. 保存。
    9. ECS2へログイン。
    10. yumパッケージのアップデート。（コマンド：yum update）
    11. psqlクライアントのインストール（コマンド：sudo yum install postgresql96.x86_64）
    12. DB（DB名：postgres）へのアクセス。（コマンド：psql --host=エンドポイント --port=5432 --username=ポストグレスのユーザ名 --password --dbname=postgres）
    13. 接続できたらDBを抜ける。（コマンド：¥q）


これでWEBサーバからアクセス可能なPostgreSQL（RDS）が完成。プライベートサブネット内に作成したため、外部からのアクセスは不可。

以上で簡易なWEBアプリケーション環境の構築が完了。

※ソースコードや諸々必要なファイルは、
```scp -i [秘密鍵フルパス] [アップロードしたいファイルのフルパス] ec2-user@[パブリックIP]:[コピー先ディレクトリ]```
でEC2インスタンスにコピーできる。

※公式HPに「注意: Amazon RDS では、ping を含むインターネットコントロールメッセージプロトコル (ICMP) トラフィックは受け入れられません。」と記載されており、pingによる疎通はできない。
[https://aws.amazon.com/jp/premiumsupport/knowledge-center/rds-cannot-connect/](https://aws.amazon.com/jp/premiumsupport/knowledge-center/rds-cannot-connect/)
AWSでWEBアプリケーション構築（３）

簡易なWEB／APサーバ、DBサーバのWEBアプリケーション環境をAWSで構築する。
出来上がり時のイメージは以下のとおり。
[https://qiita.com/chokunari/items/28d160397b26a50d8c11](https://qiita.com/chokunari/items/28d160397b26a50d8c11)

参考にした書籍
Amazon Web Services 基礎からのネットワーク＆サーバー構築
[https://www.amazon.co.jp/dp/B06Y5ZSYY4/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1](https://www.amazon.co.jp/dp/B06Y5ZSYY4/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)

【ローカル環境】
MacBookPro
MacOS:Mojave 10.14.6

###DBサーバー用プライベートサブネット構築編
1. パブリックサブネットのAZの確認。
    1. VPCダッシュボードのサブネットメニューでパブリックサブネットを選択する。
    2. 説明タブにあるアベイラビリティゾーンを確認する。
2. プライベートサブネットの作成。
    1. サブネットメニューのサブネットの作成ボタンをクリック。
    2. 名前をプライベートサブネット（任意）に設定。
    3. VPCを作成済みのVPCに設定。
    4. アベイラビリティゾーンは前項番にて確認したパブリックサブネットと同様のものを選択。（今回は耐障害性よりも構築のしやすさ、費用を優先するため、同一のAZに構築する。）
    5. IPv4 CIDR ブロックを10.0.2.0/24に設定。（WEBサーバ用のブロックは10.0.1.0/24だったので、今回は第３オクテットを1ずらした。）
    6. 作成。
3. １〜２と同じ要領で異なるアベイラビリティゾーンにIPv4 CIDR ブロックを10.0.3.0/24でもう一つサブネットを作成する。（RDSを構築する際に、VPCの中に2つ以上の異なるアベイラビリティゾーンのプライベートサブネットが存在することが条件となるため。）

これでWEBサーバとは異なるサブネットルールが適用されるDBサーバ用のサブネットの構築が完了。
RDSでPostgreSQLのDBサーバ構築編へ続く・・・！
[https://qiita.com/chokunari/items/b5b312c069315ecd1106](https://qiita.com/chokunari/items/b5b312c069315ecd1106)
AWSでWEBアプリケーション構築（２）

簡易なWEB／APサーバ、DBサーバのWEBアプリケーション環境をAWSで構築する。
出来上がり時のイメージは以下のとおり。
[https://qiita.com/chokunari/items/28d160397b26a50d8c11](https://qiita.com/chokunari/items/28d160397b26a50d8c11)

参考にした書籍
Amazon Web Services 基礎からのネットワーク＆サーバー構築
[https://www.amazon.co.jp/dp/B06Y5ZSYY4/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1](https://www.amazon.co.jp/dp/B06Y5ZSYY4/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)

【ローカル環境】
MacBookPro
MacOS:Mojave 10.14.6

###WEBサーバー用インスタンス構築編

####手順
1. AMIの選択
    1. EC2ダッシュボードのインスタンスメニューからインスタンスの作成。（VPCを作成したリージョンになっていることを確認。）
    2. Amazon Linux AMI 2018.03.0 (HVM), SSD Volume Typeを選択。（とりあえずお試しなので無料枠のイメージを使用。）
    3. t2.micro（無料枠）を選択した状態でインスタンスの詳細の設定へ。（ネットワークの設定を行うため、詳細の設定に進む。）
2. ネットワーク設定
    1. ネットワークに作成済みのVPCを割り当て。
    2. サブネットに作成済みのパブリックサブネットを割り当て。
    3. 自動割り当てパブリック IPを有効に設定。（インターネットから接続できるようにするため。）
    7. プライマリ IPに10.0.1.10を設定。（作成済みのパブリックサブネットに合わせる。10.0.1.1~10.0.1.254までならなんでもOK。）
    8. ストレージの追加へ。
3. ストレージの設定
    1. デフォルトのままタグの追加へ。
4. タグの追加
    1. タグの追加を押下。
    2. キーにName、値にWebServerを記載。（識別できるようにするだけなのでキーと値は任意でOK。）
    3. セキュリティグループの設定へ。
5. セキュリティグループの設定
    1. 新しいセキュリティグループを作成するにチェック。
    2. セキュリティグループ名にWEB-SG（任意）を設定。
    3. その他は一旦デフォルトのまま確認と作成へ。
    4. 起動。
6. キーペアを作成
    1. 新しいキーペアの作成。（既に作成済みの場合はそれを選択。）
    2. キーペア名をMyKeyに設定。（任意。）
    3. キーペアのダウンロード。
    4. インスタンスの作成。
7. 作成結果確認
    1. インスタンスメニューを確認し、インスタンスの状態がrunningになっていれば成功。（runningの状態は課金対象（無料枠を食いつぶす）なので使用していない時は停止しておく。）
8. ssh接続確認
    1. ターミナル起動。
    2. ssh -i キーペア名.pem ec2-user@パブリックIP でログイン。
9. ファイアウォール設定
    1. セキュリティグループメニューで作成済みのセキュリティグループを選択。
    2. インバウンドタブをクリック。
    3. 編集→ルールの追加、タイプはカスタムTCP、ポート範囲は80、ソースは0.0.0.0/0, ::/0、保存。HTTPポートの解放が完了。
    4. 同じ要領でHTTPSポートの解放をポート443で行う。
    5. インバウンド（外からサーバにアクセスする向き）はSSH（22）、HTTP（80）、HTTPS（443）のみが解放、アウトバウンド（サーバから外への向き）は全て許可、のファイアウォールが完成。
10. WEBサーバーのインストール＆設定
    1. 今回はインフラ構築メインなので省略。
11. DNS名前解決の設定
    1. VPCダッシュボードのVPCメニューで作成済みのVPCを選択。
    2. アクションボタンからDNSホスト名の編集を選択。
    3. DNSホスト名の有効化にチェックを入れて保存。
    4. EC2ダッシュボードのインスタンスメニューでパブリックDNS、プライベートDNSの値が設定されていることを確認。（パブリックDNSはインスタンス起動中のみ値が設定される。また、固定のドメイン・IPにしたい場合はRoute53等でドメインの取得とElasticIPの割り当てが必要。）



ここまででインターネットに繋がるWEBサーバーの構築が完了。
DBサーバー用プライベートサブネット構築編に続く・・・！
[https://qiita.com/chokunari/items/4ac215fd0a5d5305dc58](https://qiita.com/chokunari/items/4ac215fd0a5d5305dc58)
CentOS8初期設定（SSH鍵認証まで）

#はじめに
CentOS8(1905)が9/24にリリースされました。
これを機に趣味サーバの中を整理するためクリーンインストールすることにしました。
最低限、OpenSSHの鍵認証でリモート接続ができるまで一旦セットアップしたので、メモとして残しておきます。

クライアントPCはWindows10です。
##1. ダウンロード～インストール
特になし。

##2. pubキーの設置
ここからパスワード認証のSSHでリモート操作になります。
一連の操作が完了して鍵認証での接続確認ができるまでターミナル画面は絶対閉じないでください。
おおよそサーバー側でローカル操作する羽目になります。

```bash
$ mkdir ~/.ssh
$ chmod -R 700 ~/.ssh
$ vi ~/.ssh/authorized_keys #今まで使ってたpubキーをコピペ
$ chmod 600 ~/.ssh/authorized_keys
``` 

##3. sshd_configの設定
自由に使える最初のポート番号49152を例にしています。
sshd_configは最低限必要箇所の抜粋です。

```bash
$ sudo vi /etc/ssh/sshd_config

# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
#
Port 49152 #デフォルト：#Port 22
#AddressFamily any
ListenAddress 0.0.0.0
ListenAddress ::

#--中略--

# Authentication:

#LoginGraceTime 2m
PermitRootLogin no #デフォルト：PermitRootLogin yes
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10

PubkeyAuthentication yes #デフォルト：#PubkeyAuthentication yes

#--中略--

# To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication yes
#PermitEmptyPasswords no
PasswordAuthentication no #デフォルト：PasswordAuthentication yes
```

##4. firewalldの設定

```bash
$ sudo firewall-cmd --add-port=49152/tcp --permanent
$ sudo firewall-cmd --reload
$ sudo firewall-cmd --list-port
49152/tcp
``` 

##5. SELinuxの設定
CentOS7まではpolicycoreutils-pythonだけでインストールできてた気がしましたが、policycoreutils-python-utilsとする必要があるみたいです。
最後にsshdを再起動します。

```
$ sudo dnf install -y policycoreutils-python-utils
$ sudo semanage port --add --type ssh_port_t --proto tcp 49152
$ sudo semanage port --list | grep ssh
ssh_port_t                    tcp      49152, 22
$ sudo systemctl restart sshd
$ sudo systemctl status sshd
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat yyyy-MM-dd hh:mm:ss JST; ●h ●min ago
```

##6. 接続確認
操作してきたターミナルは閉じずに、新しくターミナルを起動して接続確認します。
接続できれば完了です、お疲れ様でした。

```bash
ssh -l user host -p 49152
```
AWSでWEBアプリケーション構築（１）

簡易なWEB／APサーバ、DBサーバのWEBアプリケーション環境をAWSで構築する。
出来上がり時のイメージは以下のとおり。
[https://qiita.com/chokunari/items/28d160397b26a50d8c11](https://qiita.com/chokunari/items/28d160397b26a50d8c11)

参考にした書籍
Amazon Web Services 基礎からのネットワーク＆サーバー構築
[https://www.amazon.co.jp/dp/B06Y5ZSYY4/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1](https://www.amazon.co.jp/dp/B06Y5ZSYY4/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)

【ローカル環境】
MacBookPro
MacOS:Mojave 10.14.6

###VPC作成＆インターネットに繋がるパブリックサブネット構築編

####手順
1. VPC作成
    1. VPCメニューからVPC作成。
    2. IPv4 CIDR ブロックを10.0.0.0/16で作成。（名前は任意。）
2. パブリックサブネットを作成。
    1. サブネットメニューからサブネット作成。
    2. VPCは作成済みのVPCを選択。
    3. IPv4 CIDR ブロックを10.0.1.0/24で作成。（名前、アベイラビリティゾーンは任意。）
3. パブリックサブネットとインターネットを繋げる。
    1. インターネットゲートウェイメニューからインターネットゲートウェイを作成。（名前は任意。）
    2. アクション→VPCにアタッチで作成済みのVPCを選択。
    3. ルートテーブルメニューからルートテーブルの作成。（名前は任意。VPCは作成済みのVPC。） ＜注意＞ルートテーブルは新規作成すること。デフォルトのルートテーブルはVPC全体に適用されているため、修正を加えると他のサブネットにも修正が適用されてしまう。
    4. ルートテーブルを作成済みのパブリックサブネットに割り当てる。
    5. デフォルトゲートウェイをインターネットゲートウェイとして設定する。
        1. 作成済みのルートテーブルのルートタブをクリック。
        2. ルートの編集→ルートの追加。
        3. 送信先：0.0.0.0/0、ターゲット：作成済みのインターネットゲートウェイ、ルートの保存。
        4. サブネットメニューのルートテーブルタブにて正しくルートテーブルが作成されていることを確認。

ここまでで、宛先が10.0.0.0/16のパケットはローカル、それ以外はインターネットゲートウェイに転送する環境（デフォルトゲートウェイがインターネットゲートウェイになっている環境）が完成。

WEBサーバー用インスタンス構築編に続く・・・！
[https://qiita.com/chokunari/items/9ab5abd507b3af839160](https://qiita.com/chokunari/items/9ab5abd507b3af839160)
CodeSandboxで動かせるVue.jsのサンプルコードまとめ

# はじめに
[CodeSandbox](https://codesandbox.io/?from-app=1)というオンラインエディターサービスで、参考になりそうなVue.jsのサンプルコードがたくさん公開されていました。CodeSandboxにはプレビュー機能も付いているので、コードを見ながらの動作確認も可能です。気になったものをまとめておきます。

# サンプルまとめ

## vue-todos 2
ToDoリストのサンプル。
https://codesandbox.io/s/mzxwr2zl4j
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242526/5fbf8df7-df23-e278-fce1-a0bbd84fcd6e.png)

## Vue LP 2
色々盛り込まれたランディングページのサンプル。
>LP Vue Vuetify (fontawesome) Vuex axios Firebase Login (Email+Pass | Google) Recipes API New York Times APi

https://codesandbox.io/s/54lk4p3q0k
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242526/454e2ef4-844b-ddf0-d37c-5fb16c326e82.png)

## vue-workshop - fresh - 23/9/2019
Vue.jsで書かれたVue.jsのワークショップ教材。この教材自体をCodeSandbox上で編集しながら進めていくらしい。斬新。
https://codesandbox.io/s/vue-workshop-fresh-2392019-2reiz
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242526/b5e26e77-100c-0a30-ac9a-480a0c913cbd.png)

## Easy Shop
ECサイトのサンプル。
https://codesandbox.io/s/1rz05wry73

ここからは全画面表示のプレビューを貼っていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242526/18edfcac-ad28-155d-84a5-691d306bb8a0.png)

## Vue Hoteltest
Hotelのホームページのサンプル。
https://codesandbox.io/s/n3106lv0l0
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242526/e5d8519f-080c-6341-821d-078213dc1ee7.png)


## Vuetify + VueRouter Basic Layout
汎用的に使えそうなサンプル。
https://codesandbox.io/s/l761m0069m
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242526/79011d01-23a1-f75b-d1d6-58d63d444409.png)

## Tiptap vuetify editor
tiptapというVue.js向けのエディタを使ったサンプル。tiptapが多機能で感動した。
https://codesandbox.io/s/p2wnzxyo90
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242526/4d7e24b0-abf2-74c2-9e3a-96821be39081.png)

tiptap自体の紹介記事はこちら。
https://www.moongift.jp/2018/12/tiptap-vue-js%e5%90%91%e3%81%91%e3%81%ae%e3%83%aa%e3%83%83%e3%83%81%e3%81%aawysiwyg%e3%82%a8%e3%83%87%e3%82%a3%e3%82%bf/

# おわりに
これからForkして修正しながら遊んでみたいと思います。わくわく。
命名規則を守ることについて

## はじめに
先日、[コードレビューをするときの心構えについて](https://qiita.com/toppy-luna/items/1841a6d275185b3a2c9c)なんてエラそうなタイトルの記事を書きましたが、その派生です。コードの見た目について思うことを書いています。結論的には、既存のコードと合わせることが一番で、チームの規則が二番、迷ったら[Google C++ Style Guide](https://ttsuki.github.io/styleguide/cppguide.ja.html)に合わせるで良いかと思います。

## 変数名
* 英単語で書く

* あいまいな意味の単語は使わない

* 真偽値は`is`や`has`で真偽値であることを示す

* スコープを示す記号はあったほうが良い
メンバー変数なら`xxx_`と語尾にアンダーバー、グローバル変数がもしあるなら`g_xxx`など。IDEは進化していますが、GitHubでレビューする場合など、変数宣言箇所が遠い場合、レビュワーの負担が増加します。

* ハンガリアン記法は論争になるので避ける
型が変数名からわかることがメリットですが、IDEが進化しているので不要vs可読性の低下には違いない、型が変わった場合のリファクタ対象が増えるvs型が変わる設計自体がおかしい、など論争のもとになるので避けておいたほうがベターかと思います。

## 英単語の省略
* よほど既知のものでない限り長くても省略しない
読み手に迷わせる可能性のあるものは可読性が低下すると考えておくとよいかと。最近は4Kディスプレイなどもありテキスト幅もそう気にしなくても良くなってきていますし。あなたの常識は一歩外に出ると常識じゃないことも考えるとなるべく省略しないほうがいいと思います。64文字なる変数を見たことがありますが、これは別の問題と思っていて、そもそも変数で何をしたいかがわかっていなかったように思います。

* スコープが小さいほどスコープでだけ通じるよう短くする
ループ変数`i`は最たるものかと思いますが、検索性が落ちるので`xxx_index`などつけたほうがいいようには思います。また、`i`と`j`と`k`のループ順が変わったときバグる未来しか見えないですし。メンバー変数などスコープの大きいものは、プライベート変数とまず被らないようにすると安全になります。~~グローバル変数~~

## 文字区切り
読みにくいなど、宗教戦争が起きやすい規則です。これも既存と合わせることが重要と思います。代表的な文字区切りを表にしてみましたが、特定の区切りを使っているものは「関数」である、「変数」であるなど、直感的に理解できることが読み手の読解力を向上させるものと思います。

|文字区切り|所感|
|---|---|
|snake_case|変数名に多い|
|camelCase|関数名に多い|
|PascalCase|クラス名に多い|

## おわりに
新規開発ならlintで命名規則を予め縛っておく、既存開発ならlintを追加導入して問題箇所をリファクタする期間を設けるなどしておくと良いように思います。可読性の低いコードは、後にじわじわと虫歯のように痛みだし、最後には悲鳴が上がることになるかと思います。現場で。
Laravelに関する備忘録

#前書き
初投稿です。
この記事は、Web初心者である私が、Lavelの開発環境を整えるにあたり、出てきた用語についてまとめた記事である。
まだまだ勉強不足であるため、間違い等があるかと思いますが、その際はコメントにてご指摘くださると嬉しいです。

#Lavel
- Laravelは、PHPを記述するためのWebアプリケーションフレームワークである。
- Webアプリケーションの開発が比較的に容易で、開発サイトにログイン処理や、データベースとのデータ連携処理等の機能を追加しやすいといった特徴がある。
- 世界中でも注目があるフレームワークであるため、今後日本でも伸びていくと思われる。

#Laradock
- Laravelで開発したWebアプリケーションをDocker上で動作させるための環境
- PHPのバージョン管理が容易
- 導入が簡単で、GitでLaradockをクローンするだけで導入できる。

#Docker
- Linuxのコンテナ技術を利用した、仮想開発環境技術のこと。
- 元のマシンのOS(ホストOS)以外に、個別のOS（ゲストOS）をインストールする必要が無く、仮想環境としては、動作が軽量である。
-  環境の設定は、設定ファイルを配布すれば、何処の誰でも簡単に同一の環境を設定できるため、多人数での開発時に起こる開発環境の差異による問題を無くすことができる。
-  ローカル環境だけで無く、サーバでも同様にDockerを利用できるため、ローカル環境でも本番と同じ環境で動作させることが出来る。
SQL腕試し問題を解いてみた　締め切り日が近いイベントの一覧

#出題問題
>https://qiita.com/jnchito/items/29e22cc5a73da29f65a3

SQL腕試し問題が出ていたので、解いてみました。


##僕の解答例
こんな感じで作ってみました。
https://github.com/kyotom/SQL/blob/master/gistfile4.sql


##ポイント

       --従業員毎の最新の開始日を出力する（ウィンドウ関数）
            , MAX(start_date) over (PARTITION BY employee_id) AS　employee_latest_date
MacのOSをアップデートした時のhomebrewの現状(2019/09/28現在)

またこの時期がやってまいりました．OSのアップデートは新機能の追加やバグの解消，最適化など嬉しいことも多いのですが，開発者からすれば開発環境が今まで通りに動作するのか不安だったりもします．
今回は環境構築の強い味方`homebrew`のOSアップデート後の挙動をまとめてみました．

#環境
- macOS Mojave 10.14.6（18G103）

# 動作確認
とりあえずhomebrewが動作するか確認してみます．

```zsh:terminal
-> % brew
Error: You have not agreed to the Xcode license. Please resolve this by running:
  sudo xcodebuild -license accept
```

はい，息してないですね...

`Please resolve this by running:`だそうなのでやります．

```zsh
-> % sudo xcodebuild -license accept
```

パスワードが要求されると思うので入力すればOKです．

```zsh
-> % brew --version
Homebrew 2.1.10
```

はい！動くようになりましたね！

# brew upgrade
では今までに入れてきたパッケージをアップデートしてみましょう！
ここでは今までに入れてきたパッケージが多いほど時間がかかる可能性があるので，時間がある時にやることをお勧めします．

```zsh
-> % brew upgrade
Updating Homebrew...
Auto packing the repository in background for optimum performance.
See "git help gc" for manual housekeeping.
```

はい！ではエラーがないか確認してみます．

```zsh
-> % brew doctor
Your system is ready to brew.
```

大丈夫そうですね！
今回はここで終了です！！

# 番外編
`brew cask upgrade`してみました！

```zsh
-> % brew cask upgrade
==> Casks with `auto_updates` or `version :latest` will not be upgraded
==> Upgrading 6 outdated packages:
```

なんと途中でmacが落ちるというハプニングもありましたが，無事アップデートできました！！
が！適当にアップデートかけたことでTexのアップデートまでしてしまったので，2時間近くかかってしまいました(^_^;)
「アップデートは計画的に」ですね...
C#でADグループのユーザー一覧を取得する

とある事情でADグループに所属しているユーザー一覧が欲しくなりました。
検索するとdsgetコマンドで取得できるという情報が出てくるのですが、手元の環境だとコマンドがないと言われてしまったので。
System.DirectoryServices.AccountManagement の参照が必要です。

```csharp
var domainName = ""; //検索したいドメイン名
var groupName = ""; //検索したいグループ名
using (var principalContext = new PrincipalContext(ContextType.Domain, domainName))
using (var groupPrincipal = GroupPrincipal.FindByIdentity(principalContext, groupName))
{
    //名前やメールアドレスを取得できる
    var members = groupPrincipal.Members.OfType<UserPrincipal>();
}
```
【Office 365】PowerShellでGet-MsolUserやGet-Mailboxの実行結果をUPNでマッピング

# はじめに

Office 365にはテナント上のユーザーごとの情報（プロパティ値）を出力するPowerShellコマンドとして例えば以下のようなものがある。

- Office 365 PowerShell
    - Get-MsolUser
- Exchange Online PowerShell
    - Get-Mailbox
    - Get-User

上記コマンドごとに実行時に出力できるプロパティ値は異なるが、ときには複数の異なるコマンドの実行結果を一つのリストにまとめたいときがある。
その場合は各コマンドで共通して取得できるプロパティ値`UserPrincipalName`をキーにしたマッピングを行えば可能である。

# 手順

## `Get-MsolUser`と`Get-User`の結果をUPNでマッピング

例として、`Get-MsolUser`と`Get-User`でユーザーごとに以下の５つのプロパティの値をCSV出力する場合のコマンドを示す。

- Get-MsolUser
    -  DisplayName
    -  UserPrincipalName
    -  Licenses
- Get-User
    - Company
    - Department

### コマンド

```powershell
#すべてのユーザーの情報を格納するオブジェクト$Datasを定義
$Datas = New-Object System.Collections.ArrayList

#Get-Userで取得したユーザーごとの情報を変数に格納
$ExOUsers = Get-User -ResultSize Unlimited

#Get-MsolUserで取得したユーザーごとの情報をForEachにより処理
Get-MsolUser -All | ForEach-Object {

    #UserPrincipalNameをキーにしてGet-UserとGet-MsolUserのユーザー情報を紐付け
    $MsolUPN = $_.UserPrincipalName
    $ExOUser = $ExOUsers | Where-Object {
        $_.UserPrincipalName -eq $MsolUPN
    }

    #ユーザーごとの情報を格納するオブジェクト$Dataを定義し、プロパティ値を設定して$Datasに格納
    $Data = New-Object PSObject | Select-Object DisplayName, UserPrincipalName, Company, Department, Licenses
    $Data.DisplayName = $_.DisplayName
    $Data.UserPrincipalName = $_.UserPrincipalName
    $Data.Company = ($ExOUser).Company
    $Data.Department = ($ExOUser).Department
    $Data.Licenses = ($_ | Select-Object -ExpandProperty Licenses).AccountSkuId -join ";"
    [void]$Datas.Add($Data)

}

#$Datasの内容をCSV出力
$Datas | Export-Csv export.csv -NoTypeInformation -Encoding UTF8
```

### 出力結果

```export.csv
DisplayName,UserPrincipalName,Company,Department,Licenses
Liam,liam@contoso.com,contoso Inc.,marketing,hoge:FLOW_FREE;hoge:O365_BUSINESS_ESSENTIALS
Noah,noah@contoso.com,contoso Inc.,human resources,hoge:O365_BUSINESS_ESSENTIALS
Emma,emma@contoso.com,contoso Inc.,Manufacturing,
Olivia,olivia@contoso.com,contoso Inc.,Manufacturing,hoge:O365_BUSINESS_PREMIUM
Ava,ava@contoso.com,contoso Inc.,Manufacturing,hoge:O365_BUSINESS_PREMIUM;hoge:POWERAPPS_VIRAL
```

以上
flutterあるいはdart（pub）でテストを自動的に再実行させる方法

JSにおけるjestのwatch mode、Railsにおけるguardのようなものがなさそうに見えたのでとりあえずの対応方法を残しておきます。見落としてるかもしれないので、知っている方いたら教えて下さい。

## [watch](https://github.com/mikeal/watch#examples)のインストール
```
$ npm i -g watch
```

再起動してコマンド反映

```
$ exec $SHELL -l
```

## flutterの場合
```
$ watch "flutter test" lib test
```

## pubの場合
```
$ watch "pub run test" lib test
```

watchのオプションとかは[こちらを](https://github.com/mikeal/watch#examples)見てください

## 参考
* [Hot Reload during Unit testing](https://stackoverflow.com/questions/49004259/hot-reload-during-unit-testing)
minikubeのポッドでシェルを取得する

#環境
windows10 home
minikube
#前提
k8とかdockerについて学んでいきたい。
その過程でminikubeにたどり着き、
実行中のポッドでシェルを取得し弄りたくなった。

#問題発生
```
minikube dashboard
```
して、dashboard上でポッドのExecを押したのだが、
何らかの問題発生によってシェルが表示されない。困った。

#解決
minikubeのポッドでシェルを取得する方法には二つある。

1.dashboardでExecをしてブラウザ上でシェルする
2.kubectl execする

1は無理だった。
2で解決した。
以下のコマンドを実行すると、シェルを取得できた。

```
C:\xxx>kubectl exec -it httpd -- /bin/bash
root@httpd:/usr/local/apache2#
```