OmniAICreator/Qiita-1.07M huggingface dataset:
mosquitto_pubでJSONを送るときの注意点

#mosquitto_pubでJSONを送りたい
MQTTBrokerであるmosqiuttoに付属するmosquiotto_pubでJSONを送信しようとしたのですが、ハマったのでメモ

##mosquitto_pub
mosquitto_pubはMQTTプロトコルでメッセージを送信することが可能なプログラムです。
以下のようにホスト、ポート、トピック名、メッセージを指定してメッセージを送信することが出来ます。
(-dはデバッグ)

```mosquitto_pub.exe -h 127.0.0.0 -p 1803 -t my/topic -m aaaaa -d
```
##jsonが送れない、、、
mosquitto_pubで送信したメッセージをmqtt.jsで受け取って処理しようとしたのですが、以下のようなエラーがでて苦しみました。

```
SyntaxError: Unexpected token i in JSON at position 1
    at JSON.parse (<anonymous>)
```
##原因は単純でした
30分ほど苦しんでいろいろと試したのですが、原因はエスケープをちゃんとしてなかったという単純な理由でした、、、メッセージ内で使用するダブルクォーテーションは以下のようにバックスラッシュでエスケープしましょう。

```
-m {\"id\":1}
```
AtCoder 生活　11日目

[前回](https://qiita.com/flandrescarlet237/items/a5d4efc40b8cf50bc46c)

#10日目

今日は、ABC062からABC064のB問題を解きました。


##ABC062_B

[Picture Frame ]
(https://atcoder.jp/contests/abc062/tasks/abc062_b)

```c++

#include<bits/stdc++.h>
using namespace std;

int main(){
	int H,W;
  	cin >> H >> W;
  	string a;
  	string pre = "";
  	string lat = "";
  	for(int i = 0;i<W+2;i++){
    	pre += '#';
    }
  	cout << pre << endl;
  	for(int i = 0;i<H;i++){
    	cin >> a;
      	cout << "#" << a << "#" << endl;
    }
  	for(int i = 0;i<W+2;i++){
    	lat += '#';
    }
  	cout << lat << endl;
}

```

もうむりやり解きました。

##ABC063_B

[Varied]
(https://atcoder.jp/contests/abc063/tasks/abc063_b)

```c++

#include <bits/stdc++.h>
using namespace std;

int main(){
	string S;
  	cin >> S;
  	bool res = true;
  	sort(begin(S),end(S));
    for(int i = 0;i < S.size();i++){
    	if(S[i] == S[i+1]){
        	res = false;
          	break;
        }
    }
  	if(res) cout << "yes" << endl;
  	else cout << "no" << endl;
}

```

ソートしてしまえば一気に簡単に

##ABC064_B

[Traveling AtCoDeer Problem]
(https://atcoder.jp/contests/abc064/tasks/abc064_b)

```c++

#include <bits/stdc++.h>
using namespace std;
int main(){
	int N;
  	cin >> N;
  	int a[N];
  	int a_max = 0;
  	int a_min = 1000;
  	for(int i = 0;i < N;i++)cin >> a[i];
  	for(int i = 0;i < N;i++){	
  		a_max = max(a_max,a[i]);
  		a_min = min(a_min,a[i]);
    }
  	cout << a_max -a_min << endl;
}


```

しばらくどこに間違いがあったのか気付けなかった、、、



62と63は30分ほどで、64は2時間もかかってしまった
もっと早く解けるように取り組んでいきたい
autodetect’: Could not find a JavaScript runtime. See https://github.com/rails/execjs for a list of available runtimes.


masterからサブブランチに切り替えて、

```
rails s
```

をしたら、

autodetect’: Could not find a JavaScript runtime. See https://github.com/rails/execjs for a list of available runtimes.


とエラー分が表示され、Javascriptになにか関係が??初めて見るエラー分で、何かしたかと思っていると、、、、


最近、何かとこのエラーに遭遇する人が多いだとか、、、、、


私の場合は、masterからサブブランチに切り替えたときに起こりましたが、これはタイミングが被っただけではないでしょうか。


解決策としては、gemfileに

```
gem 'therubyracer'
gem 'libv8'
```

として、bundle installでいけるのかと、思いきやここでエラー分が出たため、node.jsをインストールすることにしました。


一度、上記のgemをインストールできるか試してみてください。


node.jsをhomebrewを使ってインストールする場合は、


```
 brew install nodejs
```

でインストールできます。


見事rails sが可能になりました。
ASP.NET MVC TempDataはアクセスしても消えないことがある

ASP.NET MVC
.NET 4.7.2
C#

SessionのスマートラッパーらしいTempData
…一度値をgetすると削除マークされて現在のリクエストが終了するときに存在が削除される。
という、ちょっと便利なやつ程度の認識でした。

削除マークを付けないように（削除マークを消すのも）

```c#
TempData.Keep()    ←  全TempData
TempData.Keep(KEY) ←  指定のTempData
```

を現在のリクエスト内で`明示的に呼ぶ`いう。

で、Keep()していないのに？
次のリクエストでもバッチリ居座っている現象が発生。
特定のActionMethodで毎回getで前回と同じ値が取得できてしまう。


結論。
RedirectはKeepしてますね。

```c#
RedirectToAction()
Redirect()
```
スグに試せた対策

```c#
TempData.Remove(string key)
```
スグに消しておく。
<br>
いやいや、どっかで再セットしてるだろ  →  ない
ActionMetho内でgetしているタイミングを変えてみる　→　消えない
直前の別ActionMethodでTempDataをgetしてみる　→　消える

>Keep()していないのに？

どっかでKeep()してないかの視点に立つ。
プログラミングMicrosoft ASP.NET MVC 第3版によると。
>データがメモリ内にとどまるのは、現在のリクエストと次のリダイレクトという２つのリクエストの間だけです。

んー。

```c#
        public ActionResult Index()
        {
            TempData[TempDataKey] = "TempValue";
            return View();
        }

        public ActionResult About()
        {
            var result = getTempData(MethodBase.GetCurrentMethod().Name)
            System.Diagnostics.Debug.WriteLine(result);

            return RedirectToAction("Contact");
            // return Redirect("Contact"); // 同じ
        }

        public ActionResult Contact()
        {
            var result = getTempData(MethodBase.GetCurrentMethod().Name)
            System.Diagnostics.Debug.WriteLine(result);

            return View();
        }
```

Index → About →(Redirect)→ Contact

```
About Get!:TempValue
Contact Get!:TempValue
```
ContactでTempData取れてるじゃん。

About → Contact

```
About Empty!
Contact Empty!
```
TempData消滅。


```c#
        const string TempDataKey = "TEMP_KEY";

        private string getTempData(string actionMethodName)
        {
            var tempData = TempData[TempDataKey];
            if (tempData != null)
            {
                return ($"{actionMethodName} Get!:{tempData.ToString()}");
            }
            else
            {
                return ($"{actionMethodName} Empty!");
            }
        }
```


<br> 
これって当たり前のなのか…
どっかにReferenceとかないのかな。

<br>
参考文献
プログラミングMicrosoft ASP.NET MVC 第3版 日経BP社 P.273
Poetry - Pipenv の代替

Python の環境作成に今まで Pipenv という物を使っていた。node で言うと npm みたいな物だ。これがあまりにも遅いと苦情が出たので違うやつを探していたところ、検索すると Poetry https://python-poetry.org/ が比較的メジャーっぽい事が分かったので使ってみる。

Poetry とは、ある Python プロジェクトに必要なライブラリを簡単に準備する仕組みだ。他の Python プロジェクトと混ざらないように閉じた環境を作ってその中にライブラリをインストールする。Python 自体の実行ファイル選択には pyenv https://github.com/pyenv/pyenv という別の仕組みを使う。Node の NPM と比較すると次のようになる。

* 閉じた環境の作成:
    * Python: `poetry install` で環境を作成してライブラリをインストールする。
        * ライブラリ本体は Virtual environment path という所に入る。
    * Node: `npm install` で環境を作成してライブラリをインストールする。
        * ライブラリ本体は、`node_modules` ディレクトリに入る。
* 実行ファイルの選択:
    * Python: `pyenv local (version)` で Python のバージョンを指定する。
        * ディレクトリで勝手にバージョンが切り替わる。
        * `.python-version` に使うバージョンが記載される。
        * pyenv にも、pyenv-virtualenv という環境を作るプラグインがあるが使わない。
    * Node: `nodebrew use (version)` 等で Node のバージョンを指定する。
        * 特にディレクトリごとにバージョンを変える機能は無いと思う。

## 始め方

Poetry インストール

久しぶりに https://python-poetry.org/docs/ を見ると `pipx` を使ってインストールする紹介になっていた。

```shell
brew install pipx
pipx ensurepath
pipx install poetry
```

poetry 自体の更新

    poetry self update

pyenv インストール

    brew install pyenv

## pyenv で Python バージョンを選択する

インストール可能バージョンを調べる

    pyenv install --list

3.7.7 をインストール

    pyenv install 3.7.7

このディレクトリでは 3.7.7 を使う。

    pyenv local 3.7.7

## プロジェクトを作る

サンプルプロジェクトを作って欲しい時 (新しく my-package という名前のフォルダが出来る)

    poetry new my-package

質問に答えながらプロジェクトを作りたい時 (現在のフォルダにプロジェクトを作成する)

    poetry init

## プロジェクトを管理する

実行時に使うパッケージを追加する

    poetry add (package)

開発時に使うパッケージを追加する

    poetry add -D (package)

pyproject.toml もしくは poetry.lock に基づいてライブラリをインストール。デフォルトで dev 用もインストールする。

    poetry install

pyproject.toml だけを見てライブラリを更新

    poetry update

環境の削除

    poetry env remove 3.7.7

## プロジェクトのディレクトリに環境を作る

標準で poetry は ~/Library/Caches/pypoetry/virtualenvs のような所に環境を作る。プロジェクト以下の .venv に作りたい時は以下のようにする。

    poetry config virtualenvs.in-project true

## Pipenv から Poetry への移行

私はちびちび Pipfile を見ながら `poetry add` して移行しました。`poetry init` の後で pyproject.toml を直接編集して必要パッケージを記述してみましたが、その後の `poetry install` が終わらなくなってしまいました。

その後一つづつ `poetry add` していくと、どうやら `poetry add -D awscli` で止まる事が分かりました。Poetry 側の問題なのか awscli の問題なのか分かりませんが、随分時間を無駄にしました。

あと、Poetry にはタスクランナーとしての機能が付いていないので(https://github.com/python-poetry/poetry/pull/591#issuecomment-504762152 を見てると将来も望み薄)、作業用スクリプトを Makefile 起動に切り替える必要がありました。

Poetry を使っての感想としては `poetry install` はむしろ `pipenv install` より遅かったですが他は速いのでまあ満足です。
JavaScriptのライブラリ

###ただのメモ書きです(^^;


#ライブラリとは？
　JavaScriptで開発を行うのを簡単にするツール
　汎用性の高い複数のプログラムを再利用可能な形でひとまとまりにしたもの。
　ライブラリ ＝ Rubyでいうところの gem である。
　
#ライブラリの種類
##●jQuery　
￼<img width="638" alt="write less, do more.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591023/9f801557-22c4-7382-2e17-43454a26c1e4.png">

　　DOM操作を短く簡単に書ける
　　Web制作などではこの知識が使える


##●React
￼<img width="1301" alt="SUPPORT.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591023/c80eb065-80ef-2df6-3d70-f0fc1e1f2a9b.png">

　　Facebookが開発したライブラリ
　　仮想DOMの概念により、高速なアプリケーション実装が可能
　　AndroidやiOSに対しても「React Native」を使用することにより実装できる
　　最近人気のライブラリ

　　◎仮想DOMとは？
　　　構造化した仮のDOMを作成、データを更新したら仮想DOMの差分だけを
　　　DOMに反映させることで、処理速度を早くする
　　　※DOMを直接操作するのは処理が遅い

##●Vue.js
￼<img width="811" alt="bb8b159f87fd3cc1b9c57c6ede805452.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591023/52839aa0-adca-ef79-1b75-f06094a8d2d6.png">

　　JavaScriptのフレームワークとして使われる現場が増えている
　　仮想DOMの概念があり、冗長な記述を減らせる
　　HTML,CSSを中心にしたWebアプリ開発が可能

#これから学ぶもの
　この中からjQueryについて、学んでいきます。
Microsoft Power BI Community にPowerBI のビジュアルライブラリを投稿しました。

#前回に続きMicrosoft Power BI Community に投稿しました。
 今回は、Microsoft Power BI のレポートに利用されるビジュアルを用途別に11種類に分類し、ライブラリを作成しました。
Power BI には、多くのグラフィックがありますが、いざ利用しようとしても、どれを利用してよいか迷ってしまうことがあります。また、どんなグラフィックがあるか一元でわかるものがあまりありません。
よって、必要な時に利用しやすいよう辞書的に使えるものを作成しました。

PowerBI コミュニティーからPBIXファイルもダウンロードできるようになっていますのでお試しください。
[ PowerBI Visual Library](https://community.powerbi.com/t5/Data-Stories-Gallery/PowerBI-Visual-Library/m-p/998398#M3611)
![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600844/290514ea-841a-66fc-7a11-e65328d58da6.png)


また、私が運営しているBI online にもその紹介と、今後は、グラフィックの使い方をひとつひとつ紹介していく予定です。


[BI online](https://bi-online.jp/page-5962)
ESP32でスタックオバーフローが起こった時の対処法

#はじめに
先日、ESP-IDFで、ESP32-CAMでプログラムを組んでいた際、スタックオーバーフローが起こったので、まとめておきます
なお、環境は以下のようになっています

- MacOS10.15(Catalina)
- ESP-IDFv3.3
- Xcode10.0

# What happen?　-何が起こったのか-
まず、起こったのは、単純なスタックオバーフローでした

![スクリーンショット 2020-03-26 19.25.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263079/2d19487c-b6c3-7394-e76f-856aa6de77a3.png)

このスクリーンショットにもあるように、
エラーコードは`0x40085130`でスタックオバーフローのエラーが**ファイルから**出力されています
これに対し、自分は、以下のように対処しました
# What were you doing? -どんなことを試したのか-
![スクリーンショット 2020-03-26 19.26.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263079/09f31d10-5077-3e38-24f5-d3006e714470.png)
まずapp_main関数から、タスクとして、今まで使ってきたものを呼びだし、スタックサイズを調節しました。

しかし、この結果、一部の関数で不具合(具体的にはカメラの垂直同期に失敗)が発生します。

そこで、別のアプローチから、問題解決を試みます
![スクリーンショット 2020-03-30 21.09.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263079/efb72f34-0548-adb1-fe15-ce0b9a193e57.png)
![スクリーンショット 2020-03-30 21.10.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263079/f9c31942-0802-4517-4fd9-3d24102c2d2a.png)
![スクリーンショット 2020-03-30 21.10.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263079/aa980ffd-48d5-c38f-1bd2-d6dc56933675.png)

 make menuconfig->Componet config->ESP32-spefig
の順に辿ると,Main task stack sizeの設定がありここから操作できます
私は、このスタックサイズを変え、プログラムのコードも元に戻しました
しかし、まだスタックオバーフローは解決していませんでした
# Why is this? -エラー、治らず-
![スクリーンショット 2020-03-30 14.52.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263079/7e943957-8a66-c54f-0578-b70ccb1306d7.png)

この写真にもあるように、今度はファイルから呼び出される前に、**ファームウェア?**から呼び出されています。

私は、そのまま、メインタスクのスタックサイズを増やし続けましたが結果は変わらず。。。
#Finally -結論-
結論として、実は、容量が足りていないのはメインタスクではなかったのです。
多分、自分より、スキルの高い方はお気づきかもしれませんがアイドルタスクのスタックサイズが不足していました。
そもそもアイドルタスクとは
> アイドルタスクとは優先度0(最低)で、他に実行条件を満たすタスクが存在しない場合に実行権が与えられて、無駄な電力を消費しないようにするタスクです。 http://www2.denshi.numazu-ct.ac.jp/lego/brickOS/task/task.html

つまり、スタックサイズの設定場所も異なっています。
![スクリーンショット 2020-03-30 21.26.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263079/bf8cc255-ab6c-a009-16c6-9b273a09b4c6.png)
![スクリーンショット 2020-03-30 21.26.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263079/dfa538b5-b9a1-3c27-311d-0d28abb1cdf9.png)
![スクリーンショット 2020-03-30 21.27.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263079/75bdfb9b-a954-46dd-31fa-5a3d39745faa.png)
このように、make menuconfig->Component config->FreeRTOS
と辿ると　Idle Task stack sizeと設定があり、ここをいじるとうまく解決してくれます
#最後に
最後までお読みいただきありがとうございます
ご参考になられましたらありがたいです
(2)-3 カメラ回転実験 eulerAngles

#eulerAnglesを使いたい

eulerAnglesを使用する必要があったので記録します。

###リファレンスを調べてみる
・オイラー角としての角度
・x,y,zの角度は、z軸にz度、x軸にx度、y軸にy度の順に回転します。
・この変数は読み込んだり、絶対値の角度を設定する時のみ使用してください。
・角度が360度を超えた時には失敗するのでインクリメントしないようにしてください。 代わりにTransform.Rotateを使用してください。

名前通りオイラーで、Vector3型で、z→x→y　の順番に回転すると理解。
[スクリプトリファレンス](https://docs.unity3d.com/jp/460/ScriptReference/Transform-eulerAngles.html)

###他サイトで使い方を調べてみよう
```csharp
transform.eulerAngles = new Vector3(45, 45, 0);
```
[回転](http://www.wisdomsoft.jp/48.html)
ふむふむ。

###各XYZの値変更がどうなるのかを実験
```csharp
    void Update()
    {
//ボタン押しながら実験したいのでAボタンを押したら、、、
        if (Input.GetKeyDown(KeyCode.A))
        {
            transform.eulerAngles = new Vector3(45, 45, 0);
//どうなるかの確認用
            Debug.Log(this.transform.eulerAngles);
        }
    }
```

現在の座標は（0,10,0）で（45,45,0）になるはずなので
矢印方向に赤丸が行く予想
![01.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232643/10a581ca-eed5-7890-0e7d-247785023ed9.jpeg)
Aボタンを押すとそんな感じで回転しています。
![02.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232643/0f6f8b53-3056-7519-1937-0900dfa6f64a.jpeg)
Debug.Logの結果
![03.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232643/cbffb5a5-0655-44f8-dc8f-d3d9e28da961.jpeg)

最初（0,10,0）で（45,45,0）にボタン押したらワープする感じ。
###ボタンを押したら、押した分だけ回転させたい

~~⚡もしかして1にしたらいいんじゃない？作戦~~
~~`transform.eulerAngles = new Vector3(1, 0, 0);`~~
~~いつまで経っても、(1, 0, 0)になるので違う(-_-;)~~

`transform.eulerAngles 　+　= new Vector3(0, 0, 1);`
+を入れればいける

~~⚡更新作戦~~
~~なんか移動の時に、Vectoe3を更新する書き方を見た気がする。。~~
~~`Vector3 rightArrow = new Vector3(0.1f, 0f, 0f);`~~
~~`this.transform.eulerAngles(rightArrow);`~~
~~eulerAnglesはメソッドみたいに使えないエラー(-_-;)~~

⚡万策尽きてGoogl先生に聞く
eulerAnglesは指定した座標に回転する。なるほどな-！
一瞬で角度変える時専用ってことか。
[[Unity] transform.eulerAnglesについて](http://iosdeveloperbyunity.blogspot.com/2015/07/unity-transformeulerangles.html)

⚡でもVector3.forwardとかで実現出来るのかも
`transform.eulerAngles += Vector3.forward;`


```csharp
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            transform.eulerAngles += Vector3.forward;
            Debug.Log(this.transform.eulerAngles);            
        }
    }
```
以外に出来て驚く。



###eulerAnglesとlocalEulerAngles
eulerAnglesはワールド座標でlocalEulerAnglesは親からの角度。
Debug.LogではeulerAnglesもlocalEulerAnglesも同じ値を返していた。

eulerAnglesの方だけ公式に360度を超えた時には失敗するのでと書いていたので
どう失敗するのか見てみたくなり、360回連打するが失敗は見れなかった。残念。。
![Inked06_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232643/055fefd2-ed5b-ccfe-a2a0-ddb59a1f1412.jpeg)

###まとめ
・一瞬で角度変える時専用に使うべき
・押した分だけもVector3.forwardとかで可能だけどRotateを使う。



###参考にさせて頂いたサイト
[スクリプトリファレンス](https://docs.unity3d.com/jp/460/ScriptReference/Transform-eulerAngles.html)
[Unity 回転周りについて](https://qiita.com/keito_takaishi/items/60d6be6de69edc504f39)
[回転](http://www.wisdomsoft.jp/48.html)
[[Unity] transform.eulerAnglesについて](http://iosdeveloperbyunity.blogspot.com/2015/07/unity-transformeulerangles.html)
jpgをpngに変換しても透明度がいじれなかったからなんとかした

#はじめに
pythonでjpgをpngに変換しても透明度がいじれなかったので，力業で解決した話

#環境
- Windows 10
- VSCode
- Python 3.7.3

#単純に変換してみる
「python convert jpg to png」とかでググると[Pillow](https://pillow.readthedocs.io/en/stable/index.html)が出てくると思います．

公式を見ながら下記のようにインストール

`pip install Pillow`

[ここ](https://datatofish.com/jpeg-to-png-python/)を参考にサンプルを書くと

```python:jpgToPNG.py
from PIL import Image

#絶対パスも可
img = Image.open('input.jpg')
img.save('output.png')
```

これで一応PNGができるが，透明度をいじるソースを書くとエラーをはく
ちなみに，ペイントを使って変換した画像はきちんと透明度をいじれる

#問題点
しばらく，うんうんうなりながらググっていたら

[png画像とjpg画像の取り扱いの注意点](https://qiita.com/miyamotok0105/items/0630c7f360c0207d8ed0)

上記のサイトがヒット
なるほど，pngをjpgに変換してもRGBAのAが残る場合がある（解釈あってる？）ということなら，逆の場合もあるのかもしれない

というわけで，上記のサイトを参考にチェックするソースを作成

```python:checkPNG.py
from PIL import Image

path_png1 = "output1.png" #透明度編集できないPNG
path_png2 = "output2.png" #ペイントで変換した，透明度編集できるPNG

image = np.asarray(Image.open(path_png1))
print(Image.open(path_png1))
print(image.shape)
image = np.asarray(Image.open(path_png2))
print(Image.open(path_png2))
print(image.shape)

```

```:結果
<PIL.PngImagePlugin.PngImageFile image mode=RGB size=1920x1080 at 0x1762DB300B8>
(1080, 1920, 3)
<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=1920x1080 at 0x176252F92B0>
(1080, 1920, 4)
```

たしかに，編集できないPNGはRGB modeになってる．

#解決
原因が分かったので，解決していきます．

[png画像とjpg画像の取り扱いの注意点](https://qiita.com/miyamotok0105/items/0630c7f360c0207d8ed0)によるとopen()のあとにconvert()を付けるとmodeを変更できるようです．

なので，以下のように実装

```python:jpgToPNG.py
from PIL import Image

rgba_img = Image.open('input.jpg').convert('RGBA')
rgba_img.save('output.png')
print(rgba_img)
print(np.asarray(rgba_img).shape)
```

```:結果
<PIL.Image.Image image mode=RGBA size=1920x1080 at 0x1CF941EF9E8>
(1080, 1920, 4)
```

結果も問題ありませんし，無事透明度をいじることが出来ました．
以上です．
jQuery スムーススクロールの処理を一考

jQuery を使用したスムーススクロールを検索をしていると、
大体下記のソースコードがでてくる。

```js

 $('a[href^="#"]').click(function(){
  var speed = 800,
      href = $(this).attr('href'),
      target = $(href === '#' || href === '' ? 'html' : href),
       position = target.offset().top;
   $('html, body').animate({scrollTop:position}, speed, 'swing');
   return false;
});
```
これを意味を分からずそのまま使うより知っておくべきポイントがあるとおもうので、
自分なりのメモとしてまとめます。

##■ポイント１
```
a[href^="#"]
```

・jQueryのバージョンによっては#を""で囲まないと動作しないらしい。
・「^=」自体は「ビット排他的論理和演算子」。

・ここでは、ビット排他的論理和演算子「^=」によって文字列を指定しているわけではなく、セレクタの書き方の一つ。
　http://www.jquerystudy.info/reference/selectors/start.html

・指定した"値"が属性の値と前方一致する要素を選択する、というもの。
・href属性が "#" で始まる要素を取得することができます。

ただ上記の方法で書くより、
js動作する要素であることを明示する意味でも、対象リンクに class="js-●●"というクラスを設けて、それをセレクタとして指定してあげる方が、運用の更新の多いサイトでは分かりやすいかも。


##■ポイント２

```js
href === '' ? 'html' : href
```

上記の項目は三項演算子である。3つの項目（オペランド）を扱う演算子。
`(条件) ? true値 ： false値` の形であり、条件を満たせばtrue、満たせてなければfalseになる。

```js
href = $(this).attr('href'),
target = $(href === '#' || href === '' ? 'html' : href),
```
`attr('href')` でhrefの中身を取得したのち、取得した `変数href` の値が空っぽの場合は html を返し、そうでない場合は、変数href の値を返す。

ただ、三項演算子の意味を知らないでコピペするよりは、わかりやすくif文で記載する方が良いはず。

```js
//href の値が'#'だけの時、または、href の値が空っぽの場合 html を返し、そうでない場合は変数href の値を返す。
//つまり、クリックした要素の href 属性に指定された id の要素の上端、または、html 要素の上端をスクロール先として指定する。
target = $(href === '#' || href === '' ? 'html' : href)

　↓

//hrefが'#'だけ、ではない時、かつ、空っぽではない時（つまり、#付きリンクの時）
if (href !== '#' && href !== '') {
　（処理内容）
}

```





###以下ソースまとめ
基の構文だと、hfefが空っぽでもoffset() を実施するため、コンソール上ではエラーがでるはず。
下記のように if 文にすることで、href の中身が空っぽの時は、処理が入らない為余計なエラーを出さなくなる。

```js
  $('.js-ancher').on('click', function () { //クリックした際に動作
    var href = $(this).attr('href'); //クリックした対象要素の、ページ内リンク先を取得

    if (href !== '#' && href !== '') { //hrefが#だけではない、かつ、空っぽではない時（#付きリンクの時）
      var position = $(href).offset().top; // #リンクの移動先の位置を取得
      var scroll_speed = 700;
      $('html, body').animate({ scrollTop: position }, scroll_speed, 'swing'); //positionの位置までスクロール
    }
    return false;
  });

```



##■参照
以下参照。

https://wemo.tech/147
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12158430097
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13158142488
【UE4】ぷちコン応募しました／第13回UE4ぷちコン進捗 - 2020/03/30

[1]:https://historia.co.jp/ue4petitcon13
[2]:https://youtu.be/E031FMxMJ8Q



[株式会社ヒストリアさん主催の第13回UE4ぷちコン][1]の作業進捗。
土壇場モードでテンパっていて長らく更新できていませんでしたが、[ぷちコン][1]応募しました。

![PanicFarm01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358170/92db981d-0d8a-754e-4dde-64890f41c689.png)

[応募に使ったYouTube動画はこちら][2]

> 仲間を捜索（そうさく）して、柵（さく）の中に戻せ！
> 地を駆ける竜を操作して、迷子の仲間を見つけて、
> 厩舎に送り届けてあげてください。
> なぜか、ドラゴンが食べに来ます。逃げて！
> 
> プロ20年越えが５回目の参加。そして５回目の徹夜。
> 今回はUnreal C++とアニメーションを頑張りました。


技術ネタはまた今度書きます。
今はやり切った感を満喫したい…

----

【追記】
もう応募作品一覧出てますね(YouTubeのプレイリスト)
https://www.youtube.com/playlist?list=PLOl395n42WiNCdW6suChyl_UqovRGDx8X
Cognos インストール後、起動できない（エラーと対処）

#概要 About
IBM OpenPages のインストール作業を実施
インストール中に発生した Cognos の起動エラーについて
ググっても出てこなかったので記録

実際は、インストールに必要なパッケージが不足していただけだったため、ちゃんと確認して足りない分を追加したら起動するようになった

LinuxにGUIをインストールしてIBM Installation Manager(IIM)を用いてインストールを開始していれば、自動的にやってくれたのかもしれない
今回はコマンドベースでのインストールをだっため、対応漏れがあったのかも。。

Cognos startup error when I installed IBM OpenPages
I did not come out even if I googled, so I recorded

In fact, it was just missing packages needed for installation

#環境 Environment

Red Hat Enterprise Linux Server release 7.7
IBM OpenPages with Watson 8.1
Cognos Analytics 11.1.5.0
IBM DB2 Enterprise Server Edition
BM WebSphere Application Server
IBM Installation Manager


#起こった事象（エラー）What happened "Error"

Cognos起動時に以下のようなエラーが発生して起動できない
Unable to start due to the following error when starting Cognos

>Exception in thread "main" java.lang.UnsatisfiedLinkError: cogconfig_jni (Not found in java.library.path)
at java.lang.ClassLoader.loadLibraryWithPath(ClassLoader.java:1437)
at java.lang.ClassLoader.loadLibraryWithClassLoader(ClassLoader.java:1407)
at java.lang.System.loadLibrary(System.java:584)
at com.cognos.crconfig.data.StartupProcessor.<clinit>(StartupProcessor.java:52)
at com.cognos.crconfig.data.DataManager.getConfig(DataManager.java:2232)
at com.cognos.crconfig.CRConfigConsole.begin(CRConfigConsole.java:144)
at CRConfig.main(CRConfig.java:232)


#対処 Workaround
以下のページで必要なパッケージを確認して、不足分を追加でインストール
Check the required packages on the following page and add the missing parts

[Software Product Compatibility Reports](https://www.ibm.com/software/reports/compatibility/clarity-reports/report/html/osForProduct?deliverableId=E32E9AD000BE11EABCF401BE73544226#!)

今回は以下が不足して発生していました。
This time, the following was missing.

motif-2.3.4-7.el7

#参考 reference
[OpenPages with Watson Documentation Version 8.1](https://www.ibm.com/support/pages/openpages-watson-documentation-version-81)
renderの処理について

# 本記事を書いた経緯
私はエンジニアになるために、プログラミングスクールにて学習を行なっています。
そこで、renderの処理について学び、備忘録として残したい使い方がありましたので本記事を書くに至りました。

# renderの使い方
下記の[A]と[B]は書き方に違いがあれど、どちらも描画されるビューは全く同じです。
しかしながら、ある理由により、[A][B]いずれかの記述の方が好まれます。より良い記述は[A][B]はどちらでしょうか...?

```言語:[A]の場合
@users = User.all
@users.each do |user|
  = render 'user', user: user

```
```言語:[B]の場合
@users = User.all
  = render 'user', users: @users

```
良い記述は[B]となります。
[B]の方が好まれます。
理由は、[B]の方が処理が速いからです。

[A]では、@usersにeachを使用して、user一人一人に対してrenderを実行しています。
この書き方だと、userが100人いると100回、50000人いると50000回、どの部分テンプレートを利用するのか探しにいく処理が実行されるため、ユーザーが多ければ多くなるほどパフォーマンスが低下していきます。

一方、[B]では、renderする際の変数に、@usersを渡しています。
この書き方だと、どの部分テンプレートを利用するのか探しにいく処理は一度しか実行されないため、[A]より高速にビューを描画することができます。

なお、render @users と省略して記述することも可能です。
gitの始め方

# git関連メモ

Githubのアカウントは作っているものとします。
環境はUbuntu、もしくはwslのubuntuです。

## ssh設定

sshとは自分のパソコン内で秘密鍵と公開鍵を生成し、github上に公開鍵を登録することでユーザー名やパスワードの入力なしに安全に自分のリポジトリを操作できるようにする通信暗号化技術です。

#### 鍵生成

生成する場所は ~/.ssh/ です。
最も一般的なrsa暗号を使用するといいと思います。
デフォルトの暗号強度である2048bitでも十分ですが、さらなるセキュリティの強化のために4096bitにしておきます。
コメントの部分にはgithubに登録しているメールアドレスを使用するといいでしょう。

```
$ ssh-keygen -t rsa -b 4096 -C "mailaddress@hoge.com"
# -t 暗号化方式を指定
# -b 暗号化強度を指定
# -C コメントを設定 

Generating public/private rsa key pair.
Enter file in which to save the key (/Users/ts/.ssh/id_rsa): github_rsa # 秘密鍵の名前を指定(なんでもいい)
Enter passphrase (empty for no passphrase):  #パスフレーズを設定したい場合は入力、いらない場合はそのままEnter
Enter same passphrase again:  # 確認入力、いらない場合はそのままEnter
Your identification has been saved in github_rsa.
Your public key has been saved in github_rsa.pub.
```

ここで作成された github_rsa が秘密鍵で、github_rsa.pub が公開鍵です。
秘密鍵は誰にも知られてはいけません。

#### ssh config設定

~/.ssh 内にconfigファイルを作り、下記を追加します。

```
Host github*
  HostName github.com
  IdentityFile ~/.ssh/github_rsa
  User git
```

#### Githubに公開鍵を設定

GithubのSettingのSSH and GPG keysでNew SSH Keyを選択します。
Titleを適当に設定して、Keyの部分に先程作った公開鍵 github_rsa.pub の中身をコピペします。
ちなみにファイルの中身をクリップボードにコピーするのはxclipを使ってできます。aptでインストールしましょう。

```
$cat github_rsa.pub | xclip -selection c
# -selection はコピー先を指定。cはclipboard
```

wslの場合は

```
$cat github_rsa.pub | clip.exe
```
でクリップボードへのコピーが可能です。

#### テスト接続

接続確認して、以下のように出ていれば成功です。

```
$ssh -T github
Hi user_name! You've successfully authenticated, but GitHub does not provide shell access.
```
## localのgitにユーザー情報登録
Gitを初めて使うときは、user.nameとuser.emailを設定しないとコミットやプッシュができません。

```
$ git config --global user.name "Hoge Taro"
$ git config --global user.email hogetaro@example.com
```
これでgitを使う準備ができました。

## git init

実際にソースコードをgitで管理し始めるとき、まずはgithubでリモートリポジトリを作成します。
この状態で、リモートでは一度もコミットをしていない状態です。
次に、ソースコードがあるディレクトリで次のコマンドを実行します。

```
$git init
$echo "# TEST" >> README.md //READMEファイルを作ります
$git add README.md //READMEファイルをadd
$git commit -m "first commit"  //READMEファイルだけをコミット
$git remote add origin git@github.com:username/repositoryname.git  //リモートを追加
$git push -u origin master //プッシュ
```
これで完了となります。
あとはこまめにcommitしたり、ブランチを切ったりして開発していきます。

# Gitを使っていて困ったこと

## commit pushしてしまったがgitignoreしたいとき
.gitignoreに書いただけではignoreされないので、

```
$ git rm -r --cached filename
```
とするとignoreすることができます。
できない理由はキャッシュにインデックスが残っているからです。
坂本俊之『作ってわかる! アンサンブル学習アルゴリズム入門』の誤植情報を集める

坂本俊之『作ってわかる! アンサンブル学習アルゴリズム入門』(C&R研究所, 2019)

- 出版社サイト： https://www.c-r.com/book/detail/1316

出版社サイトを見ても誤植情報がどこにも無かったので集めてみます。

|ページ|誤|正|
|:---:|:---:|:---:|
|3|というの本書の目的となります|というの**が**本書の目的となります|
|13|通常。決定木をベースとして使用しますが|通常**、**決定木をベースとして使用しますが|
|36|「scikir-learn」|「scikit-learn」|
|40, 44|`pred.argmax`|`prob.argmax`|
|43|回帰分類における評価関数|**回帰**における評価関数|
|50～53|`ncol`|`nrow`|
|57|ZeroRuleより悪い結果とる|ZeroRuleより悪い結果と**な**る|
|57|数ら必要な大きさの配列を用意して|？|
|62|次元数とNとすると|次元数**を**Nとすると|
|62|SGDではデータを少しずつ処理できるというため|SGDではデータを少しずつ処理**できるため**|
|68|クラス変数|インスタンス変数|
|81|決定木アルゴリズムの目的とします|決定木アルゴリズムの目的**です**|
|85|データの個枢軸|データの**個数軸**|
|88|「score」変数も作成しまておきます|「score」変数も作成**しておきます**|
|102|差左右のノード|**左右**のノード|
|111|ノード内の枝を削除するれば|ノード内の枝を削除**すれば**|
|117|`def criticalscore(node, x, y, score_max)`|`def criticalscore(node, score_max)`|
|119|テストデータを別にするときの割合を表す「pruntest」|テストデータを別にするときの割合を表す**「splitratio」**|
|120|まずプルーニング際に|まずプルーニング**の**際に|
|121||一番上のコードは間違い。p126のコードが正しい|
|145|5個と10個|5,10,20個|
|148|ここのデータ|**個々の**データ|
|149|Numpyの「agerage」関数|NumPyの「**average**」関数|
|149～|WeighedZeroRule|WeightedZeroRule|
|151～|WeighedDecisionStump|WeightedDecisionStump|
|163|(式3)の $yi$|$y_i$|
|164||(式8)、最初にマイナスがつく|
|166|クラス変数|インスタンス変数|
|166|オーバーロード|オーバーライド|
|167～|itre|iter|
|174|正解しているデータに対する重みを合算|**不正解の**データに対する重みを合算|
|175|正解しているデータの重みの合計を|正解しているデータの重みの合計**で**|
|190|すべての合計の半分になって時点で|すべての合計の半分になっ**た**時点で|
|200|AdaBoostから初めて|AdaBoostから**始めて**|
|200|その値が少なくなる方向ように|その値が少なくなる**ように**|
|200||最後の行、段落変えの1字空白がない|
|211～|`ganma`|`gamma`|
Vagrant Provisioning 一般ユーザーでシェルを実行する方法

Vagrantのプロビジョニング時にシェルを実行するとrootユーザーで実行されますが、プロジェクトの設定を自動化する際は vagrant ユーザーの方が何かと便利だったので vagrant ユーザーでシェルを実行する手順をご紹介します。

```ruby:Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/focal64"
  config.vm.provision :root_user, type: "shell", inline: "echo $(whoami)"
  config.vm.provision :vagrant_user, type: "shell", inline: "echo $(whoami)", privileged: false
end
```

`privileged` オプションを `false` 指定すると`vagrant`ユーザーで実行される。

```
$ vagrant up

... 略

==> default: Running provisioner: root_user (shell)...
    default: Running: inline script
    default: root
==> default: Running provisioner: vagrant_user (shell)...
    default: Running: inline script
    default: vagrant
```

## 参考

- https://www.vagrantup.com/docs/provisioning
- https://www.vagrantup.com/docs/provisioning/shell.html
Macにcloud-build-localをインストールしてもコマンドが見つからない場合の対処法

# ローカルビルダーのインストール

Cloud Build にはローカルマシンでビルドを実行するためのコマンドがあります。
しかし、[公式ページ](https://cloud.google.com/cloud-build/docs/build-debug-locally)に沿ってインストールをしていざcloud-build-localコマンドを打ってみても
`command not found` となってしまい、調べてみると他にも同症状の人が多数いたので
解決策の共有です。

↓これではだめで

```bash
gcloud components install cloud-build-local
```

Goを使うとかんたんに入る
(事前に、MacにGoのインストールが必要になります。Go入れたくない人はゴメンナサイ)

```bash
go get github.com/GoogleCloudPlatform/cloud-build-local
go install github.com/GoogleCloudPlatform/cloud-build-local
```
【PDF】Thinreports Editorで作成したPDFをブラウザで開いた際のタブ名を変更したいときはページタイトルを設定すること！

どうも、たかふみです。

「Webアプリで出力したPDFをブラウザで開いた際のタブ名を設定したい！」ということがありました。
タブ名とは下図の赤線の部分ですね。

![chrome_タブ名.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250884/48205084-7138-a238-9b82-fbaa5c220059.png)

初めは出力処理を書いているLaravel側で設定するものと思っていたのですが、どうやらThinreports Editor側で設定する必要があるようです。今回は『Thinreports Editorで作ったPDFをブラウザで開いた際のタブ名を変更する』についてです！

```
開発環境
・Thinreports Editor 0.8.2 (PHP対応のためver0.8を使用)
・Laravel 6.4.1
```


## ■解決策
Thinreports Editorの[ページ設定]→[タイトル設定]から変更する。

## ■手順
###1.Thinreports Editorヘッダーメニューの「ページ設定」をクリック。
![thinreports_ページ設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250884/16f89607-3533-d71b-10fd-50a3ad1f233f.png)

###2.レポート設定のタイトル設定
![thinreports_ページタイトル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250884/83f74300-7495-2f22-9eb9-e6069e0a9e31.png)

ページタイトルを設定したところ、chromeブラウザで開いた際のタブ名がページタイトルでの設定と同じ名称になりました。ちなみにfirefoxでも同様にタブ名表示を設定することができましたが、Microsoft Edgeはできませんでした。

## ■まとめ：テンプレート作成時に設定しておく
Thinreports Editorを使ってテンプレート作成を行ったときには「このページタイトルはどこで使うんだろうか...。まぁ適当な名前をつけておくか。」で設定を行っていたので、ブラウザのタブ名がこのページタイトルになるという発想に至るまでは少し時間がかかってしまいました。ページタイトルはテンプレート作成時に設定しておくのが良いですね。

それでは！
『Q22 百マス計算で最小のマスをたどると？』もっとプログラマ脳を鍛える数学パズル

# はじめに
アルゴリズムの勉強に、*[もっとプログラマ脳を鍛える数学パズル アルゴリズムが脳にしみ込む70問](https://www.amazon.co.jp/dp/B078LMFXXC)* を解いています。
経路問題がありましたので、*Perl* で実装してみました。
# 苦労した所
最小値のマスを取り出すため、2次元配列 *cost[r][c]* の値でソートし 配列 *que* に格納された (r, c) 座標を返します。

```ruby.rb
  que.sort_by!{|r, c| cost[r][c]}
  r, c = que.shift
```
```javascript.js
  que.sort(function(a, b) {
    return cost[a[0]][a[1]] < cost[b[0]][b[1]];
  }
  var r, c;
  [r, c] = que.shift();
```
座標の受け渡しについて、後発の言語はスマートな感じがします。
特に、*Ruby* は、スッキリしていますね。

```perl.pl
  @que = sort { $cost[$$_[0]][$$_[1]] } @que;
  my $in = shift @que;
  my ($r, $c) = ($$in[0], $$in[1]);
```
# 全ソース
```q22_1.pl
use v5.18;
use warnings;

my @col = (8, 6, 8, 9, 3, 4, 1, 7, 6, 1);
my @row = (5, 1, 1, 9, 1, 6, 9, 0, 9, 6);

my (@board, @cost);
for my $r (0..@row-1) {
  for my $c (0..@col-1) {
    $board[$r][$c] = $row[$r] + $col[$c];
    $cost[$r][$c] = 2000;
  }
}

$cost[0][0] = $board[0][0];

my @que =[0, 0];
while (@que) {
#  @que = sort { $cost[$$b[0]][$$b[1]] <=> $cost[$$a[0]][$$a[1]] } @que; # 降順用
  @que = sort { $cost[$$_[0]][$$_[1]] } @que;
  my $in = shift @que;
  my ($r, $c) = ($$in[0], $$in[1]);
  if (0 <= $r - 1) {
    my ($x, $y) = ($r - 1, $c);
    if ($cost[$x][$y] > $cost[$r][$c] + $board[$x][$y]) {
      $cost[$x][$y] = $cost[$r][$c] + $board[$x][$y];
      push @que, [$x, $y];
    }
  }
  if (0 <= $c - 1) {
    my ($x, $y) = ($r, $c - 1);
    if ($cost[$x][$y] > $cost[$r][$c] + $board[$x][$y]) {
      $cost[$x][$y] = $cost[$r][$c] + $board[$x][$y];
      push @que, [$x, $y];
    }
  }
  if ($r + 1 < @row) {
    my ($x, $y) = ($r + 1, $c);
    if ($cost[$x][$y] > $cost[$r][$c] + $board[$x][$y]) {
      $cost[$x][$y] = $cost[$r][$c] + $board[$x][$y];
      push @que, [$x, $y];
    }
  }
  if ($c + 1 < @col) {
    my ($x, $y) = ($r, $c + 1);
    if ($cost[$x][$y] > $cost[$r][$c] + $board[$x][$y]) {
      $cost[$x][$y] = $cost[$r][$c] + $board[$x][$y];
      push @que, [$x, $y];
    }
  }
}
say $cost[@row - 1][@col - 1];
```
# 優先度付きキュー
*Java* では、*java.util.PriorityQueue* があります。
*[優先度付きキュー](https://ja.wikipedia.org/wiki/%E5%84%AA%E5%85%88%E5%BA%A6%E4%BB%98%E3%81%8D%E3%82%AD%E3%83%A5%E3%83%BC)*
計算量 *O(1) + O(logN)*
(上記 *sort* は *O(N) + O(N)* )

*Ruby* で実装されている方もいらっしゃいます。
*[競プロの為にRubyでヒープ(優先度付きキュー)作った(ABC128E)](https://qiita.com/k_karen/items/e074c7f69a3bcebfd3ce)*
*[Ruby で Priority Queue を実装してみたい](https://qiita.com/mochizukikotaro/items/c335e6dcc5020ead0b92)*

# まとめ
+ ダイクストラ法について少しだけ知見を得た

参照したサイト
*[Perlのdeleteでひっかかった話](https://qiita.com/anapple07/items/6d2f9f0d5dbc008c960c)*
# 追記
```add.pl
  @que = sort { $cost[$$_[0]][$$_[1]] } @que;
  my ($r, $c) = map{$$_[0], $$_[1]} shift @que;
```
*perl* でも2行で記述できましたが、*ruby* のスッキリ感には程遠い感じです。
リンクを投稿できるだけのサイトを作ってみた


aws amplify の勉強を兼ねてリンクを投稿できるだけのサイトを作ってみました。

site : https://techlink.d3pzyr9ae9a8zw.amplifyapp.com 
github : https://github.com/opvelll/techLinkList

![techLink.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202548/d2009e3f-566f-2732-f52c-6bd170a8e3b8.png)

ページ下のフォームから登録できる。
タグをクリックすると、タグ検索ができる。
通勤時間でAWS Certified Developer Associateを取得しよう！

#1. はじめに
こんにちは。
この度、2月10日に**DVA（AWS Certified Developer - Associate）**に合格致しました。
今回の記事では、今後DVAへ挑戦される方向けに私が参考にしたことや勉強方法などを共有させてください。

#2. 私について
新卒でIT企業に入社しWebアプリケーションエンジニアとして2年目となります。
就職前は農学を学ぶ教育機関にいたためどちらかといえばITは未知でした。

入社以来の主な取得資格は下記です。
2019年
・**AWS 認定ソリューションアーキテクト – アソシエイト**
・**Oracle認定JavaプログラマSE 8 Silver**
・**情報処理技術者（基本情報技術者）**
2020年
・**AWS 認定デベロッパー – アソシエイト**

業務ではAWSには触れておりません。
社内のAWS研修のトレーナーとして後輩への講義を行う機会や自学自習でAWSのサービスを使う機会はありました。

今回DVAを取得しようと考えたのは、せっかく後輩に教えるのですから先輩として資格の一つでも取って「私も取れる！」と感じてもらいたかったのが一番の理由です。

それでは、本題に入りましょう。

#3. Results
###勉強期間
約2ヶ月（平日のみ）
↑**休日は休日にできることを楽しみたいです。**

###勉強時間
約125時間（約50日（約2.5時間/1日））
↑**実際は150時間程でしょうか。**

2.5時間の内訳

* 通勤時間：2時間（片道：1時間）

* 昼休憩中：30分

###結果
744点（**合格基準点は720点**）

#4. 使用書籍と問題集
###書籍
[AWS認定アソシエイト3資格対策～ソリューションアーキテクト、デベロッパー、SysOpsアドミニストレーター～](http://www.ric.co.jp/book/contents/book_1199.html)（2500円程）

###問題集
[Whizabs.com](https://www.whizlabs.com/)（2000円程）

#5. 勉強方法
1ヶ月：参考書を1~2周→問題集
↑**参考書と問題解説を照らし合わせて問題の傾向を肌感で知る。知識を定着させる。**
1ヶ月：問題集
↑**参考書は分からなかった箇所のみ復習。**
直前：分からなかった問題のみの解き直し。参考書で覚えておかないといけない箇所を再確認。

※**問題集は5周ほど繰り返しました。分からない問題が減るため周回スピードは上がりました。**

#6. 書籍について
購入当時（2019年5月）はDVA専用の書籍がなかった、また、SOA（AWS Certified SysOps Administrator - Associate）の資格取得も視野に入れていたため[上記の3資格対応用](http://www.ric.co.jp/book/contents/book_1199.html)を使用しました。
みなさんが勉強する際にDVA専用の書籍が出版されていればそちらを使用してみるとよりDVAに特化した学習ができるはずです。

#7. 問題集について
海外の有料サイト([Whizabs.com](https://www.whizlabs.com/))を使用しました。**※Google翻訳使用**
理由としては、
①日本に比べ海外のほうがAWSに積極的
→資格取得者が重宝される
→資格取得目指す人が増える
→資格取得事業会社が市場のシェアを上げるために問題の質を高める
→★**より本番に近い問題を扱うようになるはずだ。**
そのため日本のサイト（koiwa.clubなど）よりも海外のサイトを使用したほうがいいと考えました。
②他サイト（Udemy）よりも問題文も難易度も本番に近い。
③解答が一問ごとに確認できるため移動中などの隙間時間でもスマートフォンで勉強しやすい。
↑**総勉強時間の80%以上は通勤中でしたのでここは大事なポイント！**
④無期限使用可能なので、資格更新の際にも再度使うことができる。
※**問題集は各自で使いやすいものを選んでください。**

#8. 最後に
この資格を取ることで開発者としてAWSを自在に使えるようになったわけではありませんが、後輩たちが自分の合格後に続々とSAA（AWS Certified Solutions Architect – Associate）に挑戦し合格する姿を見られてよかったなと思いました。

私としては近々プロジェクトリーダーを担うことになりますので、情報技術者試験（応用技術者試験、プロジェクトマネージャ）を勉強していきたいと考えています。あと、Oracle Master Bronze（DB系）も体系的に勉強したいです。

ご一読いただきありがとうございます。
少しでも受験される方の参考になれば幸いです。
質問などありましたらお気軽にメッセージいただければと思います。
bundle installのエラー解決法(can't find gem bundler (>= 0.a) with executable bundler)

# エラー内容と状況
エラー内容はタイトルの通り。bundle installしたとき、`can't find gem bundler (>= 0.a) with executable bundler (Gem::GemNotFoundException)`と怒られてしまった。
そもそもこの時はgithubのリモートからpullして、rails sをした時に、`bundle install`してくださ〜いってエラーから始まっています。チーム開発でよくある事象かと思い、自分も何回か直面してその都度調べていたので、そろそろ自分でまとめようと思います！

# 開発環境
- ruby 2.5.1p57
- Rails 5.2.4.1

# bundlerとは
そもそもbundlerとは何だったのかを復習しましょう！
Railsアプリケーションにおいては非常に複雑なgemの管理をする必要があります。これらのgemを管理するのが`bundler`というgemになります。
管理するものが無いのでbundle installできないってことだったのですね。

ターミナルでbundlerをインストールするコマンドを入力しましょう。

```
gem install bundler
```
解決するエラー内容の場合、上記コマンドで解決すると思います。（同様のエラーの記事を読むと）しかし今回は上手くbundlerをインストールできませんでした。

# 原因
今回の場合、`gemfile.lock`にbundlerのバージョンが記載されてえいるため、バージョンを指定しないとインストールができないことによるものでした。

```gemfile.lock
BUNDLED WITH
   2.0.2
```
```
gem install bundler -v2.0.2
```
上記を実装することでエラーを解決することができます。
SQL関連メモ

# SQL関連メモ
SQLについて調べて、残しておきたいものを書き連ねていきます。

## 気をつけること

### FK作成時

* 対象カラムにINDEXが張っているか（対象がPRIMARY KEYでない場合）
* 参照先、参照元のどちらもInnoDBか
* 参照元のカラムと参照先のカラムの型は同じか
* 参照先カラムにデフォルト値をセットしていないか
* ON DELETE SET NULLを指定しているが参照先がNOT NULLではないか
* その他何らかの構文エラーがある
（なぜかSyntax Errorではなく、Can’t create tableが出る）

これらを守らない場合、Can’t create table error 150がでる。

## いろいろなSQL

### 重複データのあぶり出し
```sql

WHERE (user_id in (SELECT user_id FROM user_roles GROUP BY user_id HAVING COUNT(user_id) > 1))
```

### IN句
countryテーブルから「Australia」「Japan」「Spain」を抽出したい場合

```sql
where country in('Australia','Japan','Spain');
```
countryテーブルから「Australia」「Japan」「Spain」を除いて抽出したい場合

```sql
where country not in('Australia','Japan','Spain');
```

### FKをデータを入れた後につけるとき
対応していないデータを探すには

```sql
SELECT ct.id, pt.id
FROM child_table ct LEFT JOIN parent_table pt ON ct.parent_id = pt.id
WHERE pt.id is NULL
```
とすると、FK制約に違反しているデータを探すことができます。
INNER JOINでは結合相手がいない行は結果に出ないので、OUTER JOINで検索する必要があります。

### 最大値や最新日付
最大値や最新日付を出したい場合は、いくつかのパターンがあります。

```sql
SELECT * FROM tableName WHERE columnName=(SELECT MAX(columnName) FROM tableName);

SELECT * FROM tableName ORDER BY columnName DESC LIMIT 1;

SELECT max(columnName) FROM tableName GROUP BY columnName;
```

### テーブル間のデータ移行
古いテーブルから新しいテーブルへデータを移行したいとき

```sql
UPDATE new_table nt
INNER JOIN old_table ot ON nt.old_id = ot.id
SET nt.column1 = ot.column1,
	nt.column2 = ot.column2,
	nt.column3 = ot.column3,
```
MATLABで競艇の解析を始めよう（展示のターンを見てみよう）

# MATLABでボートレース解析をする11番目くらいの記事です。
　外に出れないのは暇ですね。。
「不要不急の外出を控えるように」＝「ボートレースでもしてなさい」という解釈にしてプログラムでも作りましょう。。

## 展示航走で、誰がどこを走ってるのか見てみよう。
　展示って事前にやる練習みたいなやつです。さっきやってた鳴門の８レース。
![naruto8.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475339/e41475ea-02b3-8598-9506-fccc1faa78a8.gif)

　カメラの位置がスタンド側（手前）の上の方についてるので、どこを回ってるのかよくわからないですね。

# 真上から見てみよう！
　鳴門の航空写真をとってきましたけど、こんな感じの視点で見たらわかりやすそう。
![naruto_map.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475339/bb01b829-10ce-e42e-df99-29e85627a206.jpeg)

　ただ、そんなところにカメラはないしドローンも飛ばしちゃダメなので、MATLAB を使いましょう。

## まずは座標変換の準備。
　Image Processing Toolbox で適当な4点を選んで Projective 変換しましょう。動画なので Computer Vision Toolbox も必要です。

```matlab
vfr = vision.VideoFileReader('naru8.mp4');   % 展示の動画
frame = vfr();
map = imread('naruto_map.jpg');    % さっきの航空写真
cpselect(frame,map)
```

選択メニューが出るので、共通するわかりやすい4点を左右で選びましょう！

![naruto_cpselect.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475339/ef8f1977-4567-30db-f7ba-f6420249e16a.jpeg)

後ろのバンパー２箇所と、ターンマークと、ネトロン（フワフワ棒）の色の変わり目なんかをクリックしておこうかな。数字の３の後ろあたりにバンパーの端があります。


　できたらメニューから点をエクスポート！


## クリックした点を元に座標変換をしよう。

　展示航走のカメラは固定っぽいので、１回クリックしてエクスポートしたらその座標は保存しておきましょう。
以下のような４点が得られていれば、試しに以下のコマンドを実行！

```matlab
movingPoints = [ 212.875   21.375
                 414.625   20.875
                 284.125  123.875
                 118.625  122.875];
             
fixedPoints = [  954.00     84.125
                1213.50    174.875
                 848.70    500.431
                 757.17    462.92];

tform = fitgeotrans(movingPoints,fixedPoints,'Projective');
output = imwarp(frame,tform);
imshow(output)
```

結果↓↓↓

![naruto_warp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475339/74b4c632-f216-210c-9848-b99d5834027b.png)

上の方と右の方の文字が伸びたところは要らんな。

```matlab
output = imcrop(output,[5 600 230 330]);
imshow(output)
```

![naruto_crop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475339/54481859-6409-2eb8-9126-b2a0f4c389bd.png)

俯瞰っぽいのと、航空写真と同じような角度のネトロンになってそうだから、こんな感じでいいか。


# パラメーターが決まったら動画で試そう。

　あとはもう簡単。

```matlab
%% 読み込み
vfr = vision.VideoFileReader('naru8.mp4');
player = vision.DeployableVideoPlayer;

%% プロパティ
movingPoints = [ 212.875   21.375
                 414.625   20.875
                 284.125  123.875
                 118.625  122.875];
             
fixedPoints = [  954.00     84.125
                1213.50    174.875
                 848.70    500.431
                 757.17    462.92];

tform = fitgeotrans(movingPoints,fixedPoints,'Projective');

%% ステップ
while ~isDone(vfr)
    frame = vfr();
    output = imwarp(frame,tform);
    output = imcrop(output,[5 600 230 330]);
    player(output)
end

%% 開放
release(vfr)
release(player)
```

結果↓↓↓

![naruto8_result.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475339/f5784ab6-cee3-b689-55b5-84fe9375124b.gif)

4号艇と6号艇がいい角度！


# あとは画像処理で航跡でも追ってみたらいいね。

　とりあえず今回はプログラムよりも、GIF を作るのが大変だったからここまで・・・
気に入ったら LGTM しておいてね！
【Git/Github/SourceTree】Gitのグローバル無視リスト(gitignore_global)を編集する（macの場合）

# SourceTreeでグローバルで無視したファイルをやっぱりGithubにあげたい場合（macの場合）

下記のコマンドを打つと、現在グローバルで無視しているファイルの一覧が表示されます。
その一覧から、グローバルの無視を解除したいファイル名を削除します。

`open ファイル名`で、ファイルを開くコマンドになっています。

```shell
  $ open ~/.gitignore_global
```

開いたファイルを修正後、保存して閉じて少しすると、SourceTreeの差分に反映されるようになります。

**設定ファイルなので、修正するときは慎重に行ってください。**
**こちらの作業を行ったことによる責任は一切負いかねます。**

# この記事を書いた経緯
またこのような事態は起こるだろうと思い、備忘録として。
DBから取得したデータの中身を取得する方法　Ruby on Rails

# MySQLからデータを取得してきた
whereメソッドを使って、特定条件下で検索に該当するクエリを発行させると、条件に当てはまったレコード全てを引っ張ってくる。

```log_in.rb
yesterday_time = Time.now.yesterday
log_in_collection = LogIn.all #LogInというモデルを作成してあり、そこからデータを全て引っこ抜いている
log_in_list = log_in_collection.where("loged_in_at >= ?", yesterday_time)
```

そうすると、log_in_listをpメソッドで出力すると、

```
#<ActiveRecord::Relation [#<LogIn id: 456,  uid: "hogehoge", log_in_at: "2020-03-25 05:49:43", created_at: "2020-03-25 05:50:47", updated_at: "2020-03-25 05:50:47">]>
```

こんな感じのデータが取れる。パッと見、ハッシュに見える物が取ってこれているのが分かる。今回必要なのはこのuidにおけるhogehogeだけを引っ張ってくることがゴールです。

以下の自分の考え方に間違いがあったら、指摘をお願いします。

## 最初に犯したミス
欲しいデータを手に入れたければ、ハッシュのキーになっているものでメソッドチェーンすればいいってことだったので、安直に前述したコードの変数であるlog_in_listを使って、

```hogehoge.rb
p log_in_list.uid
```

と書いて、hogehogeが取れているかを確認してみました。すると、ログはおろか、localhostでこの処理部分を走らせてみると、画面に真っ赤な文字で**undefined uid**と表示されてしまう。何でやねん。

## ハッシュみたいなものからオブジェクトを取り出すような書き方はできん
ハッシュみたいなやつと書いているのは、ActiveRecordから取ってきているデータのことをなんて呼んでいいかわからないからですが、こう考えてみると、log_in_listを最初にpした時、これはデータの型がハッシュみたいなやつであって、**オブジェクトになっていない。**これが本当にハッシュで、ハッシュの値を取り出すには、

```example.rb
log_in_list["uid"]
```

とかにせねばならない。今回のデータはActiveRecordから引っ張ってきているものなので、これでのアクセスもできない・・・ハズ。

また、whereは条件にあった全てのレコードを引っ張ってくるので、条件にあった全てのuidを抜き取る作業を必要とする。それじゃどうするか・・・一旦、このハッシュっぽい奴のデータをオブジェクトにしてやればいい。

```hogehoge.rb
log_in_list.each do |data|
  log_in_users = data.uid
  p log_in_users
end
```

eachを使って、log_in_listの中身をdata変数へと入れ込むと、オブジェクト化してくれるので、オブジェクトへのアクセスする書き方が可能になる。これでhogehogeだけを引っ張ってこれる。

## 補足
後で知ったことですが、ハッシュ用のループ処理で使えるeachもある。この記事によると、やはりハッシュにはハッシュオブジェクトがちゃんと存在してそのオブジェクトへのアクセスの仕方も違うようだ・・・

[ハッシュに対する繰り返し](https://www.javadrive.jp/ruby/hash/index7.html)

## 考察
重要なのは2つあるかなと思いました。

書いているコードに内包されているデータの型を意識的に脳内で可視化すること。脳内で可視化って意味不明かもしれませんが、言わんとしていることは分かると思うんですよ。「今持ってきているデータは〇〇型で、まだ非オブジェクトだな」みたいな意識を持つイメージでしょうか。

また、それをオブジェクト化した時のアクセス方法を知っていること、もしくはそこから検索をかけて調べる足掛かりにする、ということでしょうか。
PythonによるWeb APIをEXE化する 

## はじめに
ときどき以下のすべてを満たしたいというご要望をいただくことがあります。

* Pythonで作ったAIをWindowsアプリに組み込みたい
* AIのインターフェースはWeb APIにしたい
* リモートサーバと通信したくない
* 運用端末にはPythonをインストールしたくない

色々やり方はあると思いますが、

1. AIの機能をPythonのWebフレームワークでWeb APIとして公開できるようにし、
1. そのPythonスクリプトをEXEファイルに変換してアプリ本体に同梱し、
1. アプリ本体からEXEを実行すればこれを実現できます。

今回は以下を使います。

* OS：Windows 10
* Python：3.7.7 （開発環境にのみインストール）
* Webフレームワーク：Flask
* EXE化：PyInstaller

（ちなみにFastAPI × uvicornだと、2020/3/30時点では問題がありました。 [https://github.com/pyinstaller/pyinstaller/pull/4664](https://github.com/pyinstaller/pyinstaller/pull/4664) ）


## 手順
FlaskとPyInstallerをインストールします。

コマンドプロンプトなどで、

```
pip install flask pyinstaller
```

Web APIを公開するPythonファイルを作ります。

``` main.py
from flask import Flask
app = Flask(__name__)

@app.route('/predict')
def predict():
  """
  AIによる予測を返すAPIのつもり
  """
  return {'result': 'Prediction by AI.'}

if __name__ == '__main__':
  app.run()
```


上記ファイルのあるディレクトリに移動し、

```
pyinstaller main.py --onefile
```

`dist` ディレクトリに `main.exe` ができているので、試しに実行してみます。

```
dist\main.exe
```


```
Traceback (most recent call last):
  File "site-packages\PyInstaller\loader\rthooks\pyi_rth_pkgres.py", line 13, in <module>
  File "c:\users\user\appdata\local\programs\python\python37\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 623, in exec_module
    exec(bytecode, module.__dict__)
  File "site-packages\pkg_resources\__init__.py", line 86, in <module>
ModuleNotFoundError: No module named 'pkg_resources.py2_warn'
[24508] Failed to execute script pyi_rth_pkgres
```

上のように、 `ModuleNotFoundError` になる場合は、`main.py` と同階層に生成された `main.spec` ファイルをテキストエディタで編集します。
具体的には、 `hiddenimports` に見つからなかったモジュール名を含めます。

``` main.spec
             # -- 略 --
             hiddenimports=[],
             # -- 略 --
```

↓次のように修正して保存。

``` main.spec
             # -- 略 --
             hiddenimports=['pkg_resources.py2_warn'],
             # -- 略 --
```

pyファイルではなく、修正したspecファイルを指定して、pyinstallerを実行します。

```
pyinstaller main.spec --onefile
```


再度動作確認します。

```
dist\main.exe
```


アクセスしてみると、Web APIが公開されていることをざっくり確認できます。
![browser.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50559/037dbb58-1967-16f5-8612-c5c6128eb511.png)

実際はC#などのアプリからこのEXEを実行し（要プロセス管理）、おなじくアプリからHttpクライアントでアクセスすることになります。
Git&GitHub備忘録

# はじめに

## 目的

最近、@daikikatsuragawa は[Git](https://git-scm.com/)や[GitHub](https://github.com/)に興味があり、試行錯誤や失敗を繰り返しつつ学習しています。本記事では、試行錯誤や失敗を踏まえて学んだメモやコマンドなどを書き留めていきます。

## ※断り

本記事は筆者の学びに応じて更新されます📖
本記事に誤りが存在した場合、積極的に編集リクエストをしてください🙇‍♂️

# Git&GitHub備忘録

## フォーク元リポジトリのブランチの更新をフォーク先リポジトリのブランチに同期させる方法

以下のコマンドを実行！

```bash:フォーク元リポジトリのブランチの更新をフォーク先リポジトリのブランチに同期させる方法
# 以下、TARGET_BRANCHの値は同期させたいブランチ名に変更してください
TARGET_BRANCH=“master”
git fetch upstream
git checkout ${TARGET_BRANCH}
git merge upstream/${TARGET_BRANCH}
git push
```
### 参考

- [フォークを同期する - GitHub ヘルプ](https://help.github.com/ja/github/collaborating-with-issues-and-pull-requests/syncing-a-fork)

## コミットメッセージの思案

難しいですよね。以下を参考にしています。

### 参考

- [gitにおけるコミットログ/メッセージ例文集100](https://anond.hatelabo.jp/20160725092419)

## オンラインIDE 

[Gitpod](https://www.gitpod.io/)がオススメです。開発環境を用意する必要がない！対象リポジトリのGitHub（もしくはGitLab）のURLの頭に`gitpod.io#`を加えることで、利用可能です。


### 参考
- [Gitpodが最強過ぎる件について - Qiita](https://qiita.com/mouse_484/items/394a4984f749cc201422)
- [クラウドIDE「Gitpod」を試してみたら予想以上に使えそうだった - Qiita](https://qiita.com/kai_kou/items/40a7a579f1bce31d6a16)

## remote: error: GH007: Your push would publish a private email address.

`git push`を試みる時、上記のエラーが生じることがある。コミットに設定しているメールアドレスは管理画面でプライベートに設定したものだけど大丈夫？公開されてしまうよ？といった内容である。GitHubは代替のメールアドレスを用意してくれているのでそれに変更する。[Email settings](https://github.com/settings/emails)にアクセスすることで、以下の記述から、代替のアドレスを取得可能である。

>Primary email address
Because you have email privacy enabled, hogefuga@gmail.com will be used for account-related notifications as well as password resets. 12345678+hogefuga@users.noreply.github.com will be used for web-based Git operations, e.g., edits and merges.

この`12345678+hogefuga@users.noreply.github.com`を設定する必要がある。

```bash:エラー解消法
# まずは先ほどのコミットを取り消し
git reset --soft HEAD^^
# メールアドレスの設定
git config --global user.email "12345678+hogefuga@users.noreply.github.com"
# これより、コミット、プッシュなどしてもOK！
```

以後は設定しておくか、`git config --global user.email "12345678+hogefuga@users.noreply.github.com”`を実行してからコミットすると良い。

※`git config --global user.email`により、現在設定されているメールアドレスを確認可能。

## 変更の取り消し

諸々変更したものの、やっぱり現在コミットされている状態に戻したい、変更を取り消したいと思うことがあります。以下コマンドにはよくお世話になっています。念のため開発を始める前に一通り試すこともあります。

```bash:変更の取り消し
git checkout .
```

```bash:変更の取り消し（新規追加の削除）
git clean -df .
```

```bash:add状況の取り消し（コミットされている状態にリセット）
git reset HEAD .
```

プッシュ以降は諸々ややこしくなるのでオススメしない。慎重にしています。


### 参考

- [gitでいろいろ取り消したい - Qiita](https://qiita.com/tani-shi/items/3419600447292abf6c79)
Angularでの開発の注意点メモ

### 出来るだけComponentをRouterパラメーターに依存させないようにする
`/users/{userid}/path/`とnestさせたChild Componentからparameterにアクセスするのは不便。loginしたユーザーのIDに依存する場合、url階層ではなく別の静的なデータの保管場所に依存すべき。(保存場所はlocalstorageなど)
Azure PowershellのRunbookでパラメータを入力形式にする

#はじめに
投稿が久しぶりになってしまったのでリハビリに、Automation Runbookの便利な基本機能を紹介しながら、自分が変な所で躓いた恥を備忘録がてら記事に起こしておきます。(2020/03/30時点の記事です。)
参考文献：[MS:Runbook の入力パラメーター](https://docs.microsoft.com/ja-jp/azure/automation/runbook-input-parameters)

#Runbookを入力形式にする
Runbookでスクリプトを作成した後、起動時に日付やファイルパスなど起動パラメータを設定したい時には以下のようにスクリプト先頭でパラメータの宣言を入れます。複数パラメータを作る時は,(カンマ)を忘れないように！
※現段階ではこれ以上のオプションは付けられないようです。

```imputparameter.ps1
Param
(
  　# 必須入力の場合は$ture/省略可能な場合は$false
　  [Parameter(Mandatory = $true)]
    [datetime] $date1,
　　# 次に繋ぐ時はカンマ
    [Parameter(Mandatory = $false)]
    [datetime] $date2 = "2020/04/01 12:13:14"
)
```

datetime型の時は実行時、下のようにカレンダーで選択できるようになるので便利でした。また、省略可能かどうか、既定値はいくつかなども画面上に表示されます。さらに、必須入力にしておくと入力しない場合、入力チェックで引っかかるので入力チェックをスクリプト内に書かなくても良くてグッドです。

![auto02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515252/e873e204-1db6-4096-6f71-539328d61150.png)

![auto01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515252/9347f16e-5e7a-03fd-d8b4-70b4c6caf762.png)

#注意点
以下が私が躓いた所です。　上記画面上での必須、省略可能は基本的にはMandatoryのフラグ値によって決められるのですがそれ以外にも決められる場合があり、それが「既定値」が設定されている場合です。例えば上の構文を下のように変更すると、入力必須としているのに「省略可能」と表示されます。

```imputparameterF.ps1
Param
(
　  [Parameter(Mandatory = $true)]
    [datetime] $date1,
　　#初期値を設定したまま入力必須にしてみる
    [Parameter(Mandatory = $true)]
    [datetime] $date2 = "2020/04/01 12:13:14"
)
```
入力しなくても既定値が入るなら必須入力だとしても省略可能じゃん！と言われればその通りなのですが、私は最初以下のように入力していたせいで、必須入力とならず、入力なしのままスクリプトが動きエラーで実行失敗となりました。

```imputparameterF2.ps1
Param
(
　  [Parameter(Mandatory = $true)]
    # 値を初期化したかった。。。
    [datetime] $date1="",
    [Parameter(Mandatory = $true)]
    [datetime] $date2 = "2020/04/01 12:13:14"
)
```
ちなみに$nullを投入しても結果は変わらずなので、入力値を指定する場合は「何も入力しない」が正解です。

#おわり
マニュアル通りにやれば動いた筈なのに考え足らずなせいで踏まなくて良い所を踏んでしまった。。。