OmniAICreator/Qiita-1.07M huggingface dataset:
Flask を Cloud Nativeアプリケーション にする

この記事は、[求ム！Pythonを使ってAzureで開発する時のTips！【PR】日本マイクロソフト Advent Calendar 2020](https://qiita.com/advent-calendar/2020/azure-python) の 9 日目です（後から追っかけで書いています）。

----
Flask を Cloud Nativeアプリケーション にするって話です。

※ Cloud Nativeアプリケーション開発のTips！ でもあるのですが、Qiita の仕様で、いずれか一つの Advent Calendar にしか参加できないようなので、Pythonを使ってAzureで開発する時のTips！に参加しています。

## What is Flask?

Flaskは、Python 用のウェブアプリケーションフレームワークです。

## How to make Flask a Cloud Native application?

Flask を Cloud Nativeアプリケーション にする手順は簡単で、以下になります。

1. Flask で Webサイトを作成する
2. Dockerfile を作成する
3. Docker イメージをビルドする
4. Docker イメージを公開する
5. Docker イメージを使用して、Azure Web Apps を作成する

以下に 実行コマンド例を記載します。

### 1. Flask で Webサイトを作成する

```
$ mkdir flaskwebapps
$ cd flaskwebapps
$ touch app.py
$ touch requirements.txt
```
`app.py` を VS Code などのお好みのエディタで開き、以下のコードを追記します。

```
from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, Flask!"

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

`requirements.txt` を VS Code などのお好みのエディタで開き、以下のコードを追記します。

```
Flask
```
### 2. Dockerfile を作成する

```
$ touch Dockerfile
```

`Dockerfile` を VS Code などのお好みのエディタで開き、以下のコードを追記します。

```
FROM python:3.8

RUN mkdir /app
WORKDIR /app
ADD . /app/
RUN pip install -r requirements.txt

EXPOSE 5000
CMD ["python", "/code/app.py"]
```

### 3. Docker イメージをビルドする
```
$ docker build -f Dockerfile -t flaskwebapps:latest .
```

### 4. Docker イメージを公開する
[Azure Container Registry](https://azure.microsoft.com/ja-jp/services/container-registry/?WT.mc_id=AZ-MVP-5001601)(以下ACR) や Docker Hub などに Docker イメージを公開します。

以下では、Azure CLI で ACR に公開するイメージを登録しています。

```
$ az acr create --resource-group [リソースグループ名] --name [ACR 名] --sku [好きなの選択] --admin-enabled true --location [リソースグループと同じ場所]
$ docker tag [タグ] [イメージ名]
$ az acr login --name [ACR 名]
$ docker push [イメージ名]
```

### 5. Docker イメージを使用して、Azure Web Apps を作成する

まず、Azure CLI で App Service Plan を作成します。

```
$ az appservice plan create --resource-group [リソースグループ名] --name [App Service Plan 名] --sku [B1とかS1とか指定] --location [リソースグループと同じ場所] --is-linux
```

Azure CLI で App Service Plan と ACR の Docker Image をパラメーターに指定して App Service を作成する

```
$ az webapp create --resource-group [リソースグループ名] --plan [App Service Plan名] --name [App Service 名] --deployment-container-image-name [イメージ名]
```

次に、Azure CLI で App Service と ACR を関連づけます。

```
$ az webapp config container set --name [App Service 名] --resource-group [リソースグループ名] --docker-custom-image-name [イメージ名] --docker-registry-server-url [ACR の場所] --docker-registry-server-user [ACR 名] --docker-registry-server-password [ACR の Password]
```

次に、Azure CLI で App Service に CD を設定します。

```
$ az webapp deployment container config --resource-group [リソースグループ名] --name [App Service 名] --enable-cd true
```

続いて、Azure CLI で ACR に Webhook を設定します。

```
$ az acr webhook create --name [App Service 名] --resource-group [リソースグループ名] --scope [ACR の名とタグから場所を引いたもの] --location [リソースグループと同じ場所] --uri [URI] --actions push delete
```
【Phaser3】画面リサイズ時にクリック座標がズレてしまうのを防ぐ

ゲーム起動後にウィンドウサイズが変わると、クリック時の座標がズレてしまう。

`ゲームインスタンス.scale.refresh()`で解消する模様。

resizeイベントで実行されるようにしましょう。

```js
const game = new Phaser.Game(option)
window.addEventListener('resize', () => game.scale.refresh())
```

おわり。
AWS SAA-C02 合格体験記 (リモート受験)

## 初めに
半年程前にAWS SAA(C02)に合格したので、備忘録として、学習内容を残します。
また、今回リモートで受験したので、そちらの様子も簡単に書き残して行きたいと思います。
※Qiita初投稿なので、練習も兼ねて、他ユーザの投稿も参考にさせて頂きながら書かせて頂きたいと思います。。

## リモート受験の感想、所感
- リモート受験申込時の環境テストで一度目は不適応となったが、二、三回やり直すとあっさりと通ったので、一度目でダメでも何度か挑戦して見るべき

- 受験時にＰＣを一回転して部屋の様子をすべて見せるように言われるので、部屋はきれいにしておくべき、、

- 目線をデスクトップから少しでも反らすと、余計な所を見るなと注意されるので、目が疲れるのと神経を使う

- 上記に気を付ければ、比較的気軽に自宅で受験出来てしまうので、テストセンターが遠くにある/業務が忙しく受けに行く暇がない人に非常におすすめ

## 学習期間
2020/02/01(うろ覚え)～2020/07/11
繁忙期学習が止まってしまっていた期間を除くと3か月程

## 学習内容
- 書籍
    - [徹底攻略 AWS認定 ソリューションアーキテクト](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5-AWS%E8%AA%8D%E5%AE%9A-%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E2%80%93-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88%E6%95%99%E7%A7%91%E6%9B%B8/dp/4295005495/ref=pd_sbs_1?pd_rd_w=eeEpN&pf_rd_p=c295905f-82f9-4d73-8142-c393a4211258&pf_rd_r=QD7KK4TE8XTQWTCQ9F1G&pd_rd_r=8b923206-8804-4410-8130-4e477a0cf893&pd_rd_wg=k0CKQ&pd_rd_i=4295005495&psc=1) ×2周
    - [ブラックベルト](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/#management-admin) ×2周
- WeB学習
    - [これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（SAA-C02試験対応版）](https://www.udemy.com/course/aws-associate/)
- 模擬試験
    - [【SAA-C02版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）](https://www.udemy.com/course/aws-knan/) ×2周 


- その他
自分の場合はIT技術に対する基礎知識が不足していたため、DNSサーバやロードバランサ等インフラ技術の補修が必要でした。


## 総評
- 上記模試で7～8割到達する位が受験の目安かと思います。（5つ目の模試は難易度高めなので6割前後でも問題なしかと思います。）

- インフラ技術等基礎固めに少し時間を使ったのと、途中中断した分リハビリ期間を必要としたため、実際にはもう少し短めの期間で取れたかなといった感触です。

## 最後に
- re:Invent 2020がコロナでリモート開催になってしまい悲しかったです、、（ラウンジ入るの楽しみにしていました）

- 今までどちらかと言うとアプリの開発に携わっており、インフラについて疎かったので一歩目として勉強になりました！引き続き他ベンダーの資格や他のAWS資格の取得を目指して頑張っていきたいです！
【Java】enum型について

#プログラミング勉強日記
2020年12月29日
Javaでenumを使って列挙型を扱う方法について簡単にまとめる。

#enum型とは
　複数の定数を1つにまとめることができる型のこと。定数なので後から変更できないデータを扱う。ennum型は複数の定数をひとまとめにできるというメリットがある。

~~enum型はswitch文を扱いやすくなるというメリットがある。~~
　→enumのインスタンスを取得している時点で分岐はできているので、enum自体にswitchで分岐したい処理や値を持たせるといい。

#enum型の使い方
　enum型は以下のように記述する。

```java:基本的な書き方
enum 列挙名 {列挙子1, 列挙子2, ・・・};

// 列挙型を取り出すとき
列挙名.取得したいデータ
```

```java:サンプルコード
public class Sample {
           public static void main(String[] args) {
                      // Nameを取得してその中のTanakaのデータのみを出力
                      Name name = Name.Tanaka;
                      System.out.println(name);
           }
           // 列挙型Nameを定義する
           protected enum Name {
                      Tanaka,
                      Sato,
                      Kimura
           };
}
```

```:実行結果
Tanaka
```

#switch文を使ったサンプルコード

```java
public class Sample {
  public static void main(String[] args) {
    Name name = Name.Tanaka;

    switch(name) {
      case Tanaka:
        System.out.println(“田中”);
        break;
      case Sato:
        System.out.println(“佐藤”);
        break;
      case Kimura:
        System.out.println(“木村”);
        break;
      }
    }

    protected enum Name {
       Tanaka,
      Sato,
      Kimura
    };
}
```

```:実行結果
田中
```


#参考文献
[【初心者向け】JavaのEnum型について解説！基本的なメソッドも紹介！](https://www.tech-teacher.jp/blog/java-enum/)
[Javaでenumを使って列挙型を利用する方法【初心者向け】](https://techacademy.jp/magazine/9244)
Azure Purview : 分析情報の利用

今回は Azure Purview の分析情報 (インサイト) の機能を見ていきます。

[参考: Azure Purview の分析情報についての理解](https://docs.microsoft.com/ja-jp/azure/purview/concept-insights)

# 分析情報とは

これまで見てきた通り、Azure Purview は資産をスキャンし、メタデータを作成し、検索できるようインデックスを作成してくれますが、これらのメタデータや分類結果、また手動で構成した用語の利用状況などを分析情報として、見やすく提供しています。

# 資産の分析情報

Azure Purview が管理する資産の情報で、資産の種類や分類別、ファイルサイズ別など様々な観点からの情報が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/79e11fa8-40fd-9d83-c132-90f15524cd35.png)
[参考: アセットの分析情報](https://docs.microsoft.com/ja-jp/azure/purview/asset-insights)

# スキャンの分析情報

資産をスキャン結果が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/9a1987cd-7c6d-8d8a-6ed7-dc42a762b19b.png)
[参考: スキャンの分析情報](https://docs.microsoft.com/ja-jp/azure/purview/scan-insights)

# 用語集の分析情報

用語集の利用状況やステータスなどが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/e09bb66b-f331-7408-fdfb-3b4337f68ade.png)
[参考: 用語集の分析情報](https://docs.microsoft.com/ja-jp/azure/purview/glossary-insights)

# 分類の分析情報

分類結果や分類がある資産、多く分類された種類の表示などがされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/49ca7bff-5fa5-6bdf-ab76-c5e9f119a539.png)
[参考: 分類の分析情報](https://docs.microsoft.com/ja-jp/azure/purview/classification-insights)

# 秘密度ラベルの分析情報

Azure Purview は [Microsoft 365 の秘密度ラベル](https://docs.microsoft.com/ja-jp/microsoft-365/compliance/sensitivity-labels?view=o365-worldwide) を資産のスキャン結果に適用することができ、その分析情報が表示されます。利用するには E5 ライセンスや管理者権限が必要であり、今回はまだ構成出来ていないため、データも残念ながらありませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/a7123298-4031-3834-b2da-94c85e0d85d3.png)
[参考: 秘密度ラベルの分析情報](https://docs.microsoft.com/ja-jp/azure/purview/sensitivity-insights)

# ファイル拡張子の分析情報
資産が持つファイル拡張子の種類と数が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/4f6c2534-da0a-39b8-8c94-06834e969d88.png)
[参考: ファイル拡張子の分析情報](https://docs.microsoft.com/ja-jp/azure/purview/file-extension-insights)

# 分析情報の利用

多くの分析情報はカードやチャート形式で表示されますが、一部の情報はより詳細が確認できます。

1\. チャート下部にある「View more」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/5b75e240-86b5-f2b1-8590-82fe48744c21.png)

2\. テーブル形式で情報が表示されるので、確認したいアイテムをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/eed99d32-3b1b-016b-2075-77529bfb7e27.png)

3\. ここでは Blob ストレージを選択。ドリルダウン結果が表示される。さらにリンクをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/b3d473ea-aa5f-fb83-491c-b5aba419233e.png)

4\. さらにドリルダウンされた情報が表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/698b2b7b-ed07-fc6d-3940-ae23f6044120.png)

このように分析情報から実際のデータまでドリルダウンしていく事が可能であり、状況に応じてトラブルシューティングなどにも役立ちます。

次回は REST API について見ていきます。

[次の記事へ](https://qiita.com/kenakamu/items/b5f6b55ca7d7b2542589)
[前の記事へ](https://qiita.com/kenakamu/items/cae5fd8562cb14dba948)
python関数に引数を渡してWebサーバ上のPHPから実行したい

# はじめに
タイトルからわかるようにニッチすぎる要求ですが、途中いろいろエラーにひっかかったので半ば自分用にまとめています。

# python関数をPHPで実行する
## コマンド実行関数
python関数にかぎらず、PHPでコマンドライン上と同じようにコマンドを実行するには、execコマンドが使えます。(参照 [https://www.php.net/manual/ja/function.exec.php](https://www.php.net/manual/ja/function.exec.php))

```PHP
exec($command, $output, $result_code);
```

\$command に実行したいコマンドを渡します。
\$outputと\$result_codeはオプションですが、\$outputはコマンド実行結果を配列で格納、\$result_codeは、コマンド実行に成功したかどうかを表すコードが格納されます。

例えば、

```PHP
exec('ls', $output, $result_code);
```

を実行すると、カレントディレクトリ内のファイルやディレクトリを表示するコマンド"ls"が実行され、その結果が\$outputに格納されます。
成功した時の\$result_codeは0になるようです。(※要確認)

## python実行コマンド(引数渡し)
以下のようなpythonファイルhello.pyを考えます。

```python:hello.py
def hello(name):
    print(name)
```
引数を受け取ってprintするだけです。

これをコマンドラインから実行するには以下のようにします。

```
# python -c 'import hello; hello.hello("Alice")'
```

このコマンドを\$commandとして、先述のexecコマンド引数としてあげると、PHPからpython関数を実行することができます。
ただし、この方法で関数を実効するには、hello.pyと同じディレクトリでコマンドを実行する必要があります。

## 別ディレクトリから実行できるようにする
pythonには詳しくないので行き当たりばったりでうまくいった方法が以下です。

- $PYTHONPATHの利用

python実行時に参照するPATHという認識。

```
# export PYTHONPATH=<指定したいパス>:${PATH}
```

とすることで、指定したいパスを参照するようになります。
今回はhello.pyを含むディレクトリを指定するとよいです。
このようにすると、hello.pyを含まない別のディレクトリからでも python -c コマンドでhello関数を実行できます。

# Webサーバ上で実行する
PHPを使っている時点でWebサーバを運用していることが多いと思います。
単純にサーバ上のコマンドラインから上記のような方法で実行するのと、Webサーバ上から同じコマンドを実行するのとでは違いがあります。
(参照 [https://sierra-kilo.hatenablog.jp/entry/2017/08/11/233708](https://sierra-kilo.hatenablog.jp/entry/2017/08/11/233708))

$PYTHONPATHで指定していたパスは、Webサーバから実行する際に引き継がれないようです。
参照記事では、apacheの設定ファイルを書き換えて対処していますが、今回は/etc/sysconfig/httpdで設定を変更します。
(参照 [http://yukke.blog3.fc2.com/blog-entry-68.html](http://yukke.blog3.fc2.com/blog-entry-68.html))

こちらの参照記事では

```/etc/sysconfig/httpd
export ORACLE_HOME=/oracle/home/
```

とすることで、環境変数ORACLE_HOMEを追加していますが、今回追加したい環境変数はPYTHONPATHです。
また、なぜかexportではうまくいかなかったので以下のようにしました。

```/etc/sysconfig/httpd
PYTHONPATH=<指定したいパス>:${PATH}
```

ここまで書き換えたらapacheを再起動して確認します。
環境変数の確認にはphp.info()が便利です。(使い方の詳細は割愛します)

環境変数にPYTHONPATHが追加されていたら、Webサーバから指定パスを参照することができるようになるので、python関数を実行することができるようになると思います。

# まとめ
今回は、1つの目的のためにいくつかひっかかった点があったのでいっぺんにまとめましたが、それぞれ独立してまた使えるものだったと思います。

簡潔にまとめると

- exec関数の使い方
- python -c コマンドの使い方
- PYTHONPATHを指定して別ディレクトリから実行
- Webサーバから実行する際の環境変数を追加する

でした。

日々勉強ですね。
ogr2ogrでディゾルブ

## はじめに
- 先日とあるデータをQGISでディゾルブかけようと思ったら、データの作りが良くないのか、うまくできなかったため、ogr2ogrでやってみたのでそのメモです。
- ogr2ogrというものもそもそもほぼ初めて扱うので、よくわかってないが、形式変換や座標変換などなんでもできる万能な機能のイメージ
- 基本的な使い方は@tohka383さんのこちらを参照ください([ogr2ogr 備忘録](https://qiita.com/tohka383/items/d3d1bf80db2cfb416330))

- ogr2ogrはQGISをインストールしていれば、プログラムからQGISのフォルダに入っているOSGeo4W Shellでなんの手間もなく使うことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/6917f21b-c642-8b35-3b58-dbfb6f8a0e01.png)


## 基本形
`ogr2ogr -f GeoJSON output.geojson aaaa.shp`　という風に
ogr2ogr -f 出力形式 出力データセット 入力データセット [入力レイヤ]
という形で指定する。

## ディゾルブ
ディゾルブする際はこう書く
### 全てのジオメトリをディゾルブする

`ogr2ogr output.shp aaaa.shp -dialect sqlite -sql "SELECT ST_Union(geometry) FROM aaaa"`

### フィールドを使ってディゾルブする
`ogr2ogr output.shp aaaa.shp -dialect sqlite -sql "SELECT ST_Union(geometry) FROM aaaa GROUP BY dissolve_field"`

- `dissolve_field`のところにディゾルブに使うカラム名を指定するといい。


## 結果

### ディゾルブ前
- A40_003カラムでディゾルブします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/5942c2f5-5c42-7c8f-5ac4-eaedd01f5f1c.png)



### ディゾルブ後

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/0e29522d-ceeb-7129-1318-679e6785345c.png)

ちゃんとディゾルブされました。
ディゾルブ後の属性の値がIDのみになってるのはパラメータが足りないんですかね。。精進します。


# 追記
コメントいただきましたとおり

```ogr2ogr output.shp aaaa.shp -dialect sqlite -sql "SELECT ST_Union(geometry),A40_001, A40_002, A40_003 FROM aaaa GROUP BY A40_003"
```

で実行したら無事属性も維持してディゾルブできました。
ありがとうございます！！！
【3D Segmentation】pointnet++ : sampling & groupingでlocal情報を学習

<h1>PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/d9c9f8cf-34f8-21a8-e1f5-05efc6d0621e.png)
[PointNet](https://qiita.com/minh33/items/d81d68bc3f149f8d70ca)の問題点を改善したPointNet++を理解していきたいと思う！

<h1>アルゴリズム</h1>
<h2>PointNetの問題点</h2>
PointNetではlocal構造を学習することが出来なかった。

PointNet++では、sampling & groupingをすることで、local構造を学習する事が出来るように改善した。


<h2>sampling</h2>
FPS(Farthest Point Sampling)という手法を使ってPointを均等な間隔でK個選ぶ。


<h2>Grounping</h2>
FPSで選ばれなかったPointを、FPSで選ばれた点のなかから、一番近いGroupに振り分ける。

<h2>Segmentation</h2>
Sampling & Grouping & pointnetの組わせ(Set abstraction)を行っていくとPointの数が少なくなってきてGlobalの情報を抽出出来るようになる。
それを入力Point数までinterpolationとskip Connectionをしながら、元のサイズまで戻す事で、Semantic Segmnentaitonが出来る。


<h2>Groupingの向上</h2>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/e51171b3-39f2-5b6d-e62b-3f06f178c4ec.png)
さらに、1つの距離でGroupingするより、複数の距離でGroupingしたほうが、より学習が効率的に行える。

ここでは2つの手法MSGとMRGを提案している。
どっちも複数の領域を学習したいってこと。

<h1>結果</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/1e3bbc67-fe34-a586-16c4-1e45b1b4bc26.png)
SSG(Single Scale Grouping)よりMSGとMRGのほうが精度が高くなっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/d73e26d6-1ceb-0f52-1ca4-e17afffc2d9b.png)
MSGの方が精度が良くて、MRGの方が高速

<h1>結論</h1>
・PointNetに比べてSmpling&GroupingのおかげでLocalの情報が学習しやすくなった。
・精度と速度のバランスを考えてMSGかMRGを選ぶべし。

<h1>参考文献</h1>
PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space
https://arxiv.org/pdf/1706.02413.pdf
エラー「zsh: no matches found:〜」が出た時の対処法

##問題

```:ターミナル
composer require doctrine/dbal:2.*
```
パッケージのインストールをしようと2系の中の最新バージョンを*で指定して実行した際に、下記のエラーが出ました。

```:ターミナル
zsh: no matches found: doctrine/dbal:2.*
```
コマンドにglobで使用されるメタ文字(*,[],?…)が含まれている場合、zshがファイル名だと判断して解析をし、「そんなファイルありません」とエラーを返すようです。

##解決法
~/(ホームディレクトリ)の中にある.zshrcというファイルの中身を変更します。

```:ターミナル
cd ~                //ホームディレクトリに移動
vi .zshrc           //vimで.zshrcを開く
```

iでインサートモード(-- INSERT --)に変え、以下の記述を書き加えます。

```:.zshrc
setopt +o nomatch
```
escキーを押し、インサートモードから抜けます。
その後、:wqと入力して保存しvimを終了します。

新しいタブで開く、もしくはターミナルを再起動して先ほどのコマンドを
入力して実行すれば通ります。

```:ターミナル
composer require doctrine/dbal:2.*
```
JSの文字列比較で少しつまずいたのでメモ


文字列比較で長さが違う場合、不思議なことが起こりました。
意外と知らなかったので記事にしてみました。

JavaScriptでは、大なり小なり演算子を用いてnumber, bigint, string型を比較できます。(大体の言語でできると思うけど)
文字列同士を文字コードで比較できるんです。便利ですね～。
そこでですね、使っていると不思議なことが起こりました。(仕様通りで何も不思議ではないんですが)

```js
"A" < "A" // > false
"A" < "AA" // > true !?
"B" < "AA" // > false
```

何故だっ...何故っ...

[仕様書]: https://tc39.es/ecma262/#sec-abstract-relational-comparison
調べても中々出て来ないし[仕様書]まで読みに行くもわからずじまい。(わかってから見返すとちゃんと3のcに書いてあるんですが、仕様書がむずすぎた)
そこに颯爽と現れる神ページ
[javascript 文字列のまま数字を比較すると危険が危ない。](https://chaika.hatenablog.com/entry/2016/02/01/153218)
ありがたやーありがたやー

内部では大体こんな事が起こっているみたいです。

```js
"A"[0] < "AA"[0] // "A" < "A" false(同値)なので次のインデックスを比較
"A"[1] < "AA"[1] // true
  undefined < "A"
  0 < "A".charCodeAt()
  0 < 65
```

長さが違う文字列を比較する場合は気をつけないといけませんね。

(公開したつもりが下書き保存してた)
Rubyのバージョンが切り替わらない

<h1>Rubyの参照先</h1>

```
$ rbenv local 2.4.9
$ ruby -v
ruby 2.6.3p62 (2019-04-16 revision 67580) [universal.x86_64-darwin20]
```
切り替わってないので、どこを参照しているのかチェックします。

```
$ which ruby
/usr/bin/ruby
```

`/.rbenv/shims/ruby`ここを参照するように変更を加えていきます。

<h1>参照先の変更</h1>

まずは`~`に移動します。

```
$ cd
~$ vi ~/.bash_profile
```

`i`でInsertにする。(ファイルに変更を加えられる状態にする。）
下記の変更を加える。

```ruby:vim
export PATH="~/.rbenv/shims:/usr/local/bin:$PATH"
eval "$(rbenv init -)"
```

`esc`でInsertを終了。
`Shift + ZZ`で保存して終了。

```
~$ source ~/.bash_profile
```

変更をPCに反映させます。

```
$ rbenv local 2.4.9
$ ruby -v
ruby 2.4.9p362 (2019-10-02 revision 67824) [x86_64-darwin20]
```

バージョンを変更できました。
以上です。
【Ruby on Rails】ストロングパラメータの要約

##ストロングパラメータとは

* **フォームから送られた値を指定して、安全に受け取る為の仕組み**  
`マスアサインメント`の脆弱性を解消する為に使用
<br>
<br>
* **マスアサインメントとは**  
DBへの保存・更新をする際に複数のカラムを一括で指定できる仕組みのこと

##マスアサインメントの脆弱性

例えばフォームからのデータ入力の際、デベロッパーツール等を使用して入力用フィールドとそれに対応するカラムの入れ替えや書き換えをすることにより、意図しないデータの入力値をそのまま受け入れてしまう可能性がある。

![スクリーンショット 2020-12-29 10.12.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/936377/de1db4fd-044c-1cf5-5d9a-d341371cbed3.png)
↓　拡大
![スクリーンショット 2020-12-29 10.08.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/936377/5c33e800-f4bc-69cb-6e50-4726651fc4ca.png)
**※本来のフォームに対応しているカラムとは異なったカラムにデータが保存されてしまう**

##ストロングパラメータのメリット

投稿フォームに入力された情報をparamsで取得する際、不正な内容を保存することを防ぐことができる。
ストロングパラメータでカラムを設定しておくと、そのカラムの情報だけを受け取ることが可能。

##使用方法

```rb:books_controller.rb
private

def book_params
  params.require(:book).permit(:title, :body)
end     #モデルの指定　　　   #キーの指定
```
**permitメソッド**
 **= paramsで取得したキーのうち、データベースに保存することを許可するメソッド**

上記の場合、paramsの中に他のカラムのデータが含まれていても、データベースには保存されない。

具体的には、フォームを送信した際に送られてくるパラメータは基本的に下記のような`二重ハッシュ構造`で送られてくるが、今回の場合はその中の"book"の部分のみを保存することを許可している。

```terminal:terminal
Processing by BooksController#create as HTML
Parameters: {
　"utf8"=>"✓", 
　"authenticity_token"=>"トークン情報が記載",
　"book"=>{"title"=>"坊ちゃん", "body"=>"夏目漱石による小説"},　　#params.require(:book).permit(:title, body)で指定された部分
　"commit"=>"Create Book"
}
```

##privateメソッド

上記のコード内の最初の行で記述している`"private"メソッド`により、それ以下に記述したメソッドや変数に制限をかけることが出来る。

上記の場合は`books_controller`内で使用している為、その他のコントローラ（例：`users_controller`）では上述した`"book_params"メソッド`は呼び出せない。


##まとめ
#####ストロングパラメータをprivateメソッドのスコープ内で使用することによって、不正なデータの保存を防ぐことができ、セキュリティが強固になる。


内容に関して間違い等あればコメントなどでご指摘頂けると嬉しいです。
【Vue.js】条件付きレンダリング(v-if, v-else)

Vue.jsの条件付きレンダリングを行うための「v-if」,「v-else」についてまとめました。

## 【要約】

この記事では以下のステップ学んでいきます。

1. v-if
2. v-else
3. 条件付きレンダリングの対象範囲

## v-if

`v-if` ディレクティブは、要素(ブロック)を条件に応じて描画したい場合に使用されます。

ブロックは、ディレクティブの式が真を返す場合のみ描画されます。

### v-ifの書き方

v-ifディレクティブは以下のように書きます。

```html
<p v-if ="条件式">表示する文字</p>
```

## v-else

v-elseは「v-ifで設定した条件に当てはまらない場合」にレンダリングするための要素です。

### v-elseの書き方

**v-else**要素は、以下のように**v-if**または**v-else-if**要素の直後になければいけません。それ以外の場合は認識されません。

```jsx
<p v-if ="条件式">表示する文字</p>
<p v-else>表示する文字</p>
```

## v-if, v-elseを使用したサンプルコード

以下のような簡単なサンプルコードを用意しました。

- 年齢（age)が20以上だったら「成人です」と表示
- 年齢（age)が20以上ではない場合は「未成年です」と表示

条件分岐を行い、ブラウザに表示される文章を変えるプログラムです。

### HTML側の記述

HTML側ではv-if, v-elseを用いて以下のように記述します。

- v-if でageが20以上だったら「成人です」と表示するpタグを記述
- v-else で ageが20以上ではない場合は「未成年です」と表示するpタグを記述

```html
<div id="app">
  <p v-if="age >= 20">成人です</p>
  <p v-else>未成年です</p>
</div>
```

### JS側の記述

JS側で以下のようにインスタンスを作成します。

```jsx
const peaple = new Vue ({
  el: '#app',
  data:{
      age : '20'
  }
});
```

## 条件付きレンダリングの対象範囲

条件を付与した要素の中に子要素や孫要素がある場合、それらの要素もすべて条件付きレンダリングの対象となる特徴があります。

つまり、親要素に条件をつけることで子要素以下も一気にレンダリングの有無を、一括で切り替えることが出来ます。

## 【まとめ】

- v-if は条件に合う場合にレンダリングする要素
- v-else はv-ifの条件に当てはまらない場合レンダリングする要素

となります。

今回は直接HTMLに条件式を記述していますが、今後は条件を算出プロパティに記述してJSファイルで管理する方法も覚えてきたいと思います。

おつかれさまでした！

Vue.jsの条件付きレンダリングを行うための「v-if」,「v-else」についてまとめました。

## 【要約】

この記事では以下のステップ学んでいきます。

1. v-if
2. v-else
3. 条件付きレンダリングの対象範囲

## v-if

`v-if` ディレクティブは、要素(ブロック)を条件に応じて描画したい場合に使用されます。

ブロックは、ディレクティブの式が真を返す場合のみ描画されます。

### v-ifの書き方

v-ifディレクティブは以下のように書きます。

```
<p v-if ="条件式">表示する文字</p>

```

## v-else

v-elseは「v-ifで設定した条件に当てはまらない場合」にレンダリングするための要素です。

### v-elseの書き方

**v-else**要素は、以下のように**v-if**または**v-else-if**要素の直後になければいけません。それ以外の場合は認識されません。

```
<p v-if ="条件式">表示する文字</p>
<p v-else>表示する文字</p>

```

## v-if, v-elseを使用したサンプルコード

以下のような簡単なサンプルコードを用意しました。

- 年齢（age)が20以上だったら「成人です」と表示
- 年齢（age)が20以上ではない場合は「未成年です」と表示

条件分岐を行い、ブラウザに表示される文章を変えるプログラムです。

### HTML側の記述

HTML側ではv-if, v-elseを用いて以下のように記述します。

- v-if でageが20以上だったら「成人です」と表示するpタグを記述
- v-else で ageが20以上ではない場合は「未成年です」と表示するpタグを記述

```
<div id="app">
  <p v-if="age >= 20">成人です</p>
  <p v-else>未成年です</p>
</div>

```

### JS側の記述

JS側で以下のようにインスタンスを作成します。

```
const peaple = new Vue ({
  el: '#app',
  data:{
      age : '20'
  }
});

```

## 条件付きレンダリングの対象範囲

条件を付与した要素の中に子要素や孫要素がある場合、それらの要素もすべて条件付きレンダリングの対象となる特徴があります。

つまり、親要素に条件をつけることで子要素以下も一気にレンダリングの有無を、一括で切り替えることが出来ます。

## 【まとめ】

- v-if は条件に合う場合にレンダリングする要素
- v-else はv-ifの条件に当てはまらない場合レンダリングする要素

となります。

今回は直接HTMLに条件式を記述していますが、今後は条件を算出プロパティに記述してJSファイルで管理する方法も覚えてきたいと思います。

おつかれさまでした！
Docker on NILFS2 filesystem (for raspbianOS)

#結論
- DockerをNILFS2 filesystem上で使う場合、storage driverを "devicemapper"に設定せよ。

``` /etc/docker/daemon.json 
{
  "storage-driver": "devicemapper"
}
```

## 背景
Raspberry PI3bを常用する際に一番怖いのはSDカードがある日突然壊れること。
そこで/(rootfs) をNILFS化したのだが、dockerがうまく動かなかったのでメモしておく。

## 当方環境
32GBのmicro SDカードのみで運用。/dev/mmcblk0p2をNILFS2にしてます。

```
pi@raspberrypi:~ $ uname -a
Linux raspberrypi 5.4.79-v7+ #1373 SMP Mon Nov 23 13:22:33 GMT 2020 armv7l GNU/Linux
pi@raspberrypi:~ $ df -hT
ファイルシス   タイプ   サイズ  使用  残り 使用% マウント位置
udev           devtmpfs   424M     0  424M    0% /dev
tmpfs          tmpfs       93M  8.7M   84M   10% /run
/dev/mmcblk0p2 nilfs2      30G   19G  9.6G   66% /
tmpfs          tmpfs      463M  4.0K  463M    1% /dev/shm
tmpfs          tmpfs      5.0M  4.0K  5.0M    1% /run/lock
tmpfs          tmpfs      463M     0  463M    0% /sys/fs/cgroup
/dev/mmcblk0p1 vfat       253M   68M  185M   27% /boot
tmpfs          tmpfs       93M  4.0K   93M    1% /run/user/1000
pi@raspberrypi:~ $ docker version
Client:
 Version:           18.09.1
 API version:       1.39
 Go version:        go1.11.6
 Git commit:        4c52b90
 Built:             Fri, 13 Sep 2019 10:45:43 +0100
 OS/Arch:           linux/arm
 Experimental:      false

Server:
 Engine:
  Version:          18.09.1
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.11.6
  Git commit:       4c52b90
  Built:            Fri Sep 13 09:45:43 2019
  OS/Arch:          linux/arm
  Experimental:     false
```

## お試しした storage driver
- overlay2 (default) ... △ (hello-world, busyboxは動く。だがubuntuとか大きめの（複数レイヤがある）イメージはpullできない。
- overlay ... × (permission deniedと言われて全く動かない）
- vfs ... ○、だが、パフォーマンスが最悪。
- devicemapper ... ◎。問題なく動いているようだ。

## devicemapperてどうやって動いてるの？
見た目巨大なsparseファイルを予め作成して、それを切り出して使っているようだ。
32GBしかないSDカード上に100Gのファイルがあるのを見るのは新鮮だ。w

```
root@raspberrypi:/var/lib/docker# ls -lh devicemapper/devicemapper/data 
-rw------- 1 root root 100G 12月 29 08:34 devicemapper/devicemapper/data
```

## 残項目
- Raspbian OSの rootをNILFS化する手順をメモ化。（案外いろんなところでハマりました）
remi php74で、PDOないって言われる。

[php7でpdoのmysqlドライバーがない！？](https://teratail.com/questions/37882)より、

```
yum install --enablerepo=remi,remi-php70 php php-devel php-mbstring php-pdo php-gd
```

70のところは既にインストールされたremi phpの数値と合わせましょう。
これ使ったらいけました。
AWS EC2でPHPのexec()でpython3系実行

[Amazon LinuxでPython3系を使う](https://michimani.net/post/aws-using-python3-on-amazonlinux/)
こちらのブログの方法で解決しましたが、少し自分なりに足りないと思ったところを補足して紹介します。

### 大前提：Pyenvのインストール先は、/usr/bin/..にしよう。

他のブログでは、pyenvのインストール先は/home/ec2-user/...のところにあると思うのですが、ec2-userディレクトリは権限が厳しいので、その中にpython3をインストールして、例えば、exec(/home/ec2-user/.../bin/python3.7)とかしても、

```
permission denied
```

になります。
だからといって、homeディレクトリや、ec2-userディレクトリの権限を書き換えると、セキュリティの仕様？か何かで、scpやsshでサーバーに入れなくなるという恐ろしいことが起きます。（もしそうなっちゃったら、AWS ec2のインスタンスページからターミナルを開けば解決できます。）

#### 1. pyenvを使用するために必要なライブラリのインストール

```
$ sudo yum install gcc gcc-c++ make git openssl-devel bzip2-devel zlib-devel readline-devel sqlite-devel
```

#### 2. pyenvのインストール、権限・パスの設定

```
$ sudo git clone https://github.com/yyuu/pyenv.git /usr/bin/.pyenv
$ cd /usr/bin/.pyenv
$ sudo mkdir shims
$ sudo mkdir versions
```

#### 3.インストールしたフォルダの権限をexecからアクセスできるように、変えよう。

```
$ sudo chown -R ec2-user:apache /usr/bin/.pyenv

# あるいはapacheがインストールされていない場合は
$ sudo chown -R ec2-user:ec2-user /usr/bin/.pyenv
```

#### 4.パスを設定しよう

パスの設定については他のブログで詳しく紹介されてるのがあるのでそちらをどうぞ。
vimエディタを使い、.bashrcを開きます。

```
vi ~/.bashrc
```

これを追記。

```
export PYENV_ROOT="/usr/bin/.pyenv"
if [ -d "${PYENV_ROOT}" ]; then
    export PATH=${PYENV_ROOT}/bin:$PATH
    eval "$(pyenv init -)"
fi
```

書き換えた状態で、リロード。

```
$ source ~/.bashrc
```

#### 5.普通にpyenvで、pythonインストール

今回は適当にpython3.7.0をインストールしてみます。
インストールしても、既存のシステムのpythonのままなので

```
$ pyenv install 3.7.0
$ python -V
Python 2.7.12
```
こうやって、python3.7.0にモードチェンジします。

```
$ pyenv global 3.7.0
$ python -V
Python 3.7.0
```

#### 6.phpでpython3を実行。

さっきインストールした場所をもぐっていくと、python3.7がインストールされている場所が見つかります。
「/usr/bin/.pyenv/versions/3.7.0/bin/python3.7」
__これを使えば、python3.7を使えます。__
__パスを通して同じように見せてるだけで、以下の二つは同じものです。__

```
$ python
```

```
$ /usr/bin/.pyenv/versions/3.7.0/bin/python3.7
```

これで、python3.7.0を、phpで使えるようになりました。
試しに、こんな感じでexec()を使ってみましょ〜。ちゃんとpython3.7使えます。

```php
$command = "/usr/bin/.pyenv/versions/3.7.0/bin/python3.7 -V";
exec($command, $output, $return_var);
$json_array = json_encode($output);
echo $json_array
```
結局composition APIは何のために導入されたの？

## Composition APIを使うメリットとは？

メリットは大きく２つ

- ロジックの抽出と再利用

    → **責務を分けることで管理やテストのしやすさ向上**

- TypeScriptとの親和性が上がる

    → **型推論を行いやすくなる**

## なぜロジックの抽出と再利用？

ロジックの抽出を行う理由は、

複雑に肥大化したコンポーネントを小分けにして関心事で分別（＝**複数の責務を持つコンポーネントを小分けにして責務の整理**をする）

今まではhtml/js/cssを合わせたコンポーネントが最小単位だったが、ロジックだけを切り分けたりできるようになった。

これにより、必要な機能だけをimportして呼び出すことで責務が分けられて管理もしやすくなるし、テストも書きやすくなる。

上記のように小分けにしたことで、ロジックの再利用性が上がった。

## Composition APIを使うといいCaseって？

コンポーネントがぶくぶく太って責務を持ちすぎている場合

→逆に言うと、コンポーネントがそれほど大きくない（今後大きくならない）プロジェクトに導入するのは微妙（学習コストに見合わない？）

## 気をつけないといけないこと

ロジックを自由に切り出せるようになった

→自由にやりすぎると無秩序になる

（例）

切り出したロジックの中で他の切り出したロジックを使うなど依存の方向が複雑になる

こうならないためにも、**設計やアーキテクチャをしっかり理解してチームで共通認識**を持っていないといけない。

## 抽出と再利用でわかりやすい例

[vue-composition-apiを使って機能単位のコード分割と合成を試してみた - Qiita](https://qiita.com/snagasawa_/items/ef70032f996face318e5#component%E3%81%A7%E5%88%86%E5%89%B2)

# 参考資料

[Composition API RFC | Vue Composition API](https://vue-composition-api-rfc.netlify.app/)

[まもなくやってくる Vue.js 3](https://speakerdeck.com/kazupon/mamonakuyatutekuru-vue-dot-js-3)
【Rails】deviseとactiveadminをインストール時のエラー解消について

Railsにて管理者画面を作ろうとしていた時にエラーがでました。

## エラー内容

```:ターミナル
rails g devise install
rails g active_admin:install
```
を打った所、

`method_missing': undefined method `devise' for Install (call 'Install.connection' to establish a connection):Class (NoMethodError)

というエラーが出ました。
どうやらdeviseが未定義みたい？？

あとあとになって気がついたのですが、
`rails g devise:install`の「：（コロン）」が抜けてました。

## 解決手順

config/routes.rbの内容を一旦消去。
そして、`rails db:rollback`コマンドを実行。
再度、`rails g devise:install`と`rails g active_admin:install`コマンドを実行。
これで無事にdeviseとactiveadminがインストールされました。

## まとめ
「：」が抜けていただけでエラーが出るものか？と思いましたが、実際にエラーになっていたので、ダメだったのだと思います。コロンが抜けたコマンドでもデータベースが作成されたような表示になっていたので、騙されてしまいました。
今後はコロンも含めてきちんと実行していきます。
急にyarnコマンドが打てなくなった時の話

いつも通りにローカルサーバーを立てるために、コマンドにて``yarn serve``を打つと、下記のようなエラーが発生しました。

```
$ vue-cli-service serve
'vue-cli-service' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
```

これは何事！？

Nodeを再インストールでもしなきゃいけのか、、、、

はたまた、エラーで長い時間を潰してしまうのか、、、、

色々と調べてみても、よくわからないことがズラーっと書いてたり。

ただ、このようなエラーが出た方はご安心を！！！！

以下のコマンドを打つだけでこのエラーは解消されます！

```
yarn add yarn
```

長い時間を潰さなくて良かった。。。。

皆さんのエラー解決のお役に立てればなと思います！

良ければ、LGTM、コメントお願いします。

また、何か間違っていることがあればご指摘頂けると幸いです。

他にも初心者さん向けに記事を投稿しているので、時間があれば他の記事も見て下さい！！

Thank you for reading
【DeepLearning】MLPとFully Connected Layerの違いについて

<h1>MLPとFCNって何が違うん？</h1>
Fully ConnectedとMLP(Multi Layer Perceptron)の違いってなんだろ？って思って、とりあえず現状の自分の理解をメモして置こうと思う。

<h2>Fully Connected Layer</h2>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/20732cdb-5c65-1121-ec18-7f9a6ce9c926.png)
言うまでも無いが、入力と出力がすべて繋がっているのがFully Connected Layer


<h2>Multi Layer Perceptron</h2>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/39f7db7e-5422-1df4-ee51-55e283c1862e.png)
Fully Connected Layerが1つ以上連なっているのが、MLP

<h1>結論</h1>
MLPは複数のFully Connected Layerで構成されたネットワークの事を言う。と思っている
Java Lambda Command Pattern

エキサイト株式会社メディア開発の佐々木です。

## はじめに

みんな大好きデザインパターンですが、Java8から導入されたLambda式により、簡素にかけるようになるので、今更ですが紹介です。

## command pattern (従来)

コマンドパターンは下記のように書きます。FileActionのインターフェース

```java:FileAction.java
public interface FileAction {
    void openFile();
    void writeFile();
    void closeFile();
}
```

```java:Command.java
public interface Command {
    void execute();
}
```

```java:OpenFile.java
public class OpenFile implements Command {
    private final FileAction FileAction;
 
    public OpenFile(FileAction fileAction) {
        this.fileAction = fileAction;
    }
 
    @Override
    public void execute() {
        fileAction.openFile();
    }
}
```

```java:CloseFile.java
public class CloseFile implements Command {
    private final FileAction FileAction;
 
    public CloseFile(FileAction fileAction) {
        this.fileAction = fileAction;
    }
 
    @Override
    public void execute() {
        fileAction.closeFile();
    }
}
```

```java:WriteFile.java
public class WriteFile implements Command {
    private final FileAction FileAction;
 
    public WriteFile(FileAction fileAction) {
        this.fileAction = fileAction;
    }
 
    @Override
    public void execute() {
        fileAction.writeFile();
    }
}
```

```java:Macro.java
public class Macro {
    private final List<Runnable> commands;

    public Macro(){
        this.commands = new ArrayList<>();
    }

    public void record(Command command) {
        this.commands.add(command);
    }

    public void run(){
        this.commands.forEach(e -> {
            e.execute();
        });
    }
}
```

3つのコマンドを発行するだけなんですが、`Command`インターフェースをそれぞれに実装する必要があり、結構面倒です。これを部分的にJava:Lambdaで書き換えると、スッキリかけます。

## command pattern (Lambda式)

```java:FileActionImpl.java
public class FileActionImpl implements FileAction {

    @Override
    public void openFile() {
        System.out.println("open");
    }

    public void writeFile() {
        System.out.println("write");
    }

    @Override
    public void closeFile() {
        System.out.println("close");
    }
}
```

FileActioｎインターフェースを実装したクラスを作成し、そこにメソッドを集めます。(ここではわかりやすいように標準出力しているだけです)

```java

    Macro macro = new Macro();
    FileActionImpl action = new FileActionImpl();
    macro.record(() -> action.openFile());
    macro.record(() -> action.writeFile());
    macro.record(() -> action.closeFile());
    macro.execute();
```
上記のように、呼び出し側でLambda式でそれぞれ何をさせたいかを書きます。
これで、 executeを実行したタイミングで実行されます。

1操作1ファイルみたいな感じになってないので、省力化したいときには便利かと思います。


## 最後に
Java8がリリースされて、もう6年。早いものです。意外とLambda式に最適化されたデザインパターンというのがあんまり見られないので、書いてみました。

エキサイトはエンジニアを募集しております。ご連絡お待ちしております。
https://www.wantedly.com/projects/529139

では、良いお年を!!
Web App for Containers と Azure Container Instances の比較

この記事は、[求ム！Cloud Nativeアプリケーション開発のTips！【PR】日本マイクロソフト Advent Calendar 2020](https://qiita.com/advent-calendar/2020/azure-cloudnative) の 22 日目です（後から追っかけで書いています）。

----
本記事では一見していると似ている [Web App for Containers](https://azure.microsoft.com/ja-jp/services/app-service/containers/?WT.mc_id=AZ-MVP-5001601) と [Azure Container Instances](https://azure.microsoft.com/ja-jp/services/container-instances/?WT.mc_id=AZ-MVP-5001601) を比較したいと思います。

## What is [Web App for Containers](https://azure.microsoft.com/ja-jp/services/app-service/containers/?WT.mc_id=AZ-MVP-5001601?)

[Web App for Containers](https://azure.microsoft.com/ja-jp/services/app-service/containers/?WT.mc_id=AZ-MVP-5001601) は Azure Web Apps の実行イメージとして Docker イメージを使うというサービスです。Web Apps のインスタンスとなるので、Web Apps の URL や https など各種機能が使えます。

[App Service の料金と機能](https://azure.microsoft.com/ja-jp/pricing/details/app-service/windows/)からもわかる通り、Basic 以上のサービスプランが Web App for Containers をサポートしているため、Linux、東日本、B1（vCPU 1, RAM  1.75 GB） の場合、**月額 2,000円程度かかります**。

## What is [Azure Container Instances](https://azure.microsoft.com/ja-jp/services/container-instances/?WT.mc_id=AZ-MVP-5001601)

[Azure Container Instances](https://azure.microsoft.com/ja-jp/services/container-instances/?WT.mc_id=AZ-MVP-5001601) は、シンプルなアプリケーション、タスク自動化、ビルドジョブなど、分離されたコンテナーのシナリオに向いたサービスです。


[Azure Container Instances の料金と機能](https://azure.microsoft.com/ja-jp/pricing/details/container-instances/?WT.mc_id=AZ-MVP-5001601)からもわかる通りってわかりやすくないですね…。

```
価格の例
例 1:
vCPU が 1 個、1 か月の期間 (30 日間) 1 日 1 回 1 GB の構成を行う Linux コンテナー グループを作成したとします。各コンテナー グループの使用時間は、5 分間 (300 秒) です。

メモリ使用時間:
コンテナー グループの数 * メモリ使用時間 (秒) * GB * GB 秒あたりの料金 * 日数
1 コンテナー グループ * 300 秒 * 1 GB * GB 秒あたり ¥0.0001721 * 30 日 = ¥1.549
vCPU 使用時間:
コンテナー グループの数 * vCPU 使用時間 (秒) * vCPU * vCPU 秒あたりの料金 * 日数
1 コンテナー グループ * 300 秒 * 1 vCPU * vCPU 秒あたり ¥0.0015743 * 30 日 = ¥14.168
課金合計:
メモリ使用時間 (秒) + vCPU 使用時間 (秒) = 料金総額
¥1.549 + ¥14.168 = ¥15.717
```

[Web App for Containers](https://azure.microsoft.com/ja-jp/services/app-service/containers/?WT.mc_id=AZ-MVP-5001601?) と比較するなら、`vCPU が 1 個、1 か月の期間 (30 日間) 1 日 1 回 1.75 GB の構成を行う Linux コンテナー グループを作成したとします。各コンテナー グループの使用時間は、1440 分間 (86400 秒)` として計算すると、

```
メモリ使用時間:
コンテナー グループの数 * メモリ使用時間 (秒) * GB * GB 秒あたりの料金 * 日数
1 コンテナー グループ * 86400 秒 * 1.75 GB(*1) * GB 秒あたり ¥0.0001721 * 30 日 = ¥780.6456
vCPU 使用時間:
コンテナー グループの数 * vCPU 使用時間 (秒) * vCPU * vCPU 秒あたりの料金 * 日数
1 コンテナー グループ * 86400 秒 * 1 vCPU * vCPU 秒あたり ¥0.0015743 * 30 日 = ¥4080.5856
課金合計:
メモリ使用時間 (秒) + vCPU 使用時間 (秒) = 料金総額
¥780.6456 + ¥4080.5856 = ¥4861.2312
*1: GB 単位なので、1.75 GB を選択できないと思いますが、比較のため
```

¥4861.2312 になります。

これからわかる通り、常時起動しているようなサービスの場合は、[Web App for Containers](https://azure.microsoft.com/ja-jp/services/app-service/containers/?WT.mc_id=AZ-MVP-5001601) が適しており、開発（dev）や試験（test）、ステージング（stg）環境、Azure Functions では対応できない長時間のバッチ処理などのスポットで利用するサービスの場合は、[Azure Container Instances](https://azure.microsoft.com/ja-jp/services/container-instances/?WT.mc_id=AZ-MVP-5001601) が適していることがわかります。
Windows HelloのPINと指紋認証のセットアップができないのが直った

#はじめに
今使っているPCには指紋センサーが付いていて、購入して最初にセットアップしたときは、指紋認証によるログインができた。
しかし、一度PCが動かなくなって回復を試みた後、指紋認証によるログインができなくなり、PINのみになってしまった。それでもあまり手間ではないので放置していたが、ふと思い立ったので直してみる気になった。
色々調べると、同じような症状の人が多くいたので、ここにメモしておくことにした。
#環境
ドライバは一応最新にしたが、今回の症状とは関係ないと思われる。
OS: Windows10 home 1909
デバイス: 富士通 LIFEBOOK SH90/T(2016年4月購入)
指紋センサードライバ: Synaptics FP Sensors(WBF)(PID=0050)
#症状
指紋認証の設定をすると設定画面が途中で消えてしまい、設定ができない。
まず、設定のサインインオプションから、「Windows Hello 指紋認証」の「セットアップ」を押す。そうすると、PINの入力画面になる。そこでPINを入力すると、そのままセットアップ画面が終了してしまう。本当ならば指紋の登録が始まるのだが、何度試してもそこで終了してしまい、指紋が登録できない。

似たような症状はMicrosoftコミュニティでも報告されている。
[Windows helloの指紋認証のセットアップができない](https://answers.microsoft.com/ja-jp/windows/forum/windows_10-hello/windows/838041a7-c24f-4135-b3f4-132a152c0b49)
[windows hello セットアップの画面が一瞬で閉じてしまう]
(https://answers.microsoft.com/ja-jp/windows/forum/windows_10-hello/windows-hello/78a43c42-be0a-4e33-b9f5-6b49508b8ae4)

#解決方法
**Credential Managerを実行中にする**
Credential Managerとは、認証情報を管理するサービス。Windows管理ツール内の「サービス」から実行状況を確認することができる。「サービス」は、Windows+Rで出る検索窓に「services.msc」と入れて検索しても開くことができる。
「サービス」の一覧からCredential Managerを探し、右クリック。すると、「開始」という項目があるのでそれを押す。これでCredential Managerが実行中になる。
これで改めて設定から指紋認証のセットアップを行うと、PINの入力の後に指紋登録の画面になり、指紋を登録することができる。
#解決までにしたこと
##クリーンブート(効果なし)
[Windows Hello の指紋認証セットアップができません。](https://answers.microsoft.com/ja-jp/windows/forum/windows_10-hello/windows-hello/3d6b54e1-ece9-4aa7-838b-dbbff933ca3d)の回答を参考に、クリーンブートを試す。クリーンブートの方法は[Windows 10 - 常駐アプリケーションを停止してトラブルの原因を確認する方法](https://answers.microsoft.com/ja-jp/windows/forum/windows_10-update/windows-10/cfdbba51-72fa-4cd5-ba4c-a1eb5e68e583)にあるようにした。しかし、クリーンブート時も指紋のセットアップは同じ症状でうまくいかなかった。
##新規ユーザーで試す
次に、新しくユーザーを作成し、指紋認証のセットアップを行うことを試みた。すると、そもそもPINが登録できないということが分かった。というのも、Windows Hello 暗証番号(PIN)の「追加」ボタンからPINを登録しようとすると、新しいPINを入力したにも関わらず、「追加」ボタンが出たままなのだ。本当だったら一度登録すれば「変更」「削除」ボタンが出るはずである。
そして、指紋のセットアップでは、PINを登録する前だったためにPINの入力を求められず、いきなり指紋の登録画面になった。そして、指紋は登録できたが、PINが設定されていないので指紋認証は使えないという結果になってしまった。
ここで気づいたのは、そもそもこれは指紋のセットアップの問題ではなく、PINの登録がうまくいっていないことにあるのだということだった。
##元のユーザーでPINから登録しなおす
そこで、元のユーザーに戻り、一度PINを削除してからPINと指紋をセットアップしなおそうとした。するとPINを削除した後に、追加ができないという症状が現れた。新規ユーザーで試した時と同じものである。
これを解決するために調べたところ、[PINの追加が出来ない](https://answers.microsoft.com/ja-jp/windows/forum/windows_10-security/pin%E3%81%AE%E8%BF%BD%E5%8A%A0%E3%81%8C%E5%87%BA/13167915-7841-4f32-b367-2e25b0cf7d2e)というMSコミュニティのセッションがヒットした。
これを試したところ、PINの新規追加、指紋の新規登録に成功した。
#まとめ
指紋のセットアップができない原因は、PINの設定にエラーが起きていたからだった。そのエラーの原因は、Credential Managerが停止していたからだった。
PCにPINでログインできていたので、PINの認証系統に問題があることに気づけなかった。同じような症状がある人の参考になればいいと思う。
非営利団体「オープンソースロボット財団」OSRFに少額の寄付してみた

###きっかけは単純。

2020年は、Linux デバイスドライバの学習を始めて前途多難です。目標は、自分で作ったデバイスをＲＯＳ化して楽しむことですので、来年に向けて、年末年始に自分用にラズパイを使ったＲＯＳ専用サーバ（?）を立てたい。

使用したいのは、もちろん、ROS Noetic Ninjemysです。5年のLTSというのは本当に感謝です。

###[Debian install of ROS Noetic](http://wiki.ros.org/noetic/Installation/Debian)
>
**If you rely on these packages, please support OSRF.**
These packages are built and hosted on infrastructure maintained and paid for by the Open Source Robotics Foundation, a 501(c)(3) non-profit organization. If OSRF were to receive one penny for each downloaded package for just two months, we could cover our annual costs to manage, update, and host all of our online services. Please consider donating to OSRF today.
（google翻訳）
**これらのパッケージに依存している場合は、OSRFをサポートしてください。**
これらのパッケージは、501（c）（3）非営利団体であるOpen Source Robotics Foundationによって維持され、支払われているインフラストラクチャ上で構築およびホストされています。 OSRFがダウンロードしたパッケージごとに1ペニーをわずか2か月間受け取るとしたら、すべてのオンラインサービスを管理、更新、およびホストするための年間コストを賄うことができます。 今日OSRFに寄付することを検討してください。

###そこで、やってみた・・・

ROS Wikiをみると、いきなりこんなメッセージが・・・
まあ、確かにコロナ禍の在宅勤務続きで暇になるとROSがらみの作業をしている訳ですから、もはや「依存」関係なのかもしれませんので、少しだけでも寄付してみることにしました。

[![Open Robotics](https://static1.squarespace.com/static/57daacd7f7e0ab084d5efbf0/t/5e3a197c40f86549694b35a7/1608365970802/?format=1500w)](https://www.openrobotics.org/)

トップページの右上に「DONATE」が大きく目立たせられています。クリックして進んでいくと

１．Your Email（メールアドレス）
あとから、Thank youメールが届きます。

２．Your Contribution（寄付金額）
寄付金額は「2ドル」などの少額がラジオボタンで選択できますが、「other Amount」で自由に設定できるようです。私は、手始めに、ラジオボタンから12ドル（1250円くらい?）を選択してみました。

３．Payment(支払方法)
クレジットカードでも支払いできます。

４．Review & Donate（確認と寄付）

の順で記入、選択するだけです。

###それだけ？

寄付を実行すると、登録したメールアドレスに`Open Robotics: Thank You`というメッセージが届きます。ふるさと納税のような「お礼の品」はもちろんありません。Tシャツくらいくれればいいのにと思いますが、さすがに12ドルでは無理でしょうから、自分の心の満足のためだけの行為です。

今でも、名目上は「無料」サービスとして提供されていても、実は、個人情報の提供と引き換えにすぎない（つまり、匿名化したGPSタグ付きの行動情報を端末から吸い出してデータそのものやデータの分析結果を裏で売買している）という偽の[^1]無料サービスは大変多いですから、むしろ、これからは寄付は寄付で払って個人情報との紐づけをさせない方がセキュリティ上もよい方法だと思います。

[^1]: これは、絶対に対価関係にある以上「無料」ではないし、こうした名目だけの「無料」サービスの広告をなぜ公正取引委員会や個人情報保護委員会は問題視しないのか不思議でならない。
Next.jsのTypeScript対応手順

## 手順

### 1. `typescript`, `@types/react`, `@types/node`をインストール

```
npm install typescript
```

```
npm install -D @types/react @types/node
```

### 2. 空の`tsconfig.json`ファイルを作成

```
touch tsconfig.json
```

### 3. 以下のコマンドを実行

```
npm run dev
```

- `next-env.d.ts`ファイルがプロジェクトルートに作成される
- `tsconfig.json`ファイルにデフォルトの設定が書き込まれる。strict モードはデフォルトで false になっているので、`tsconfig.json`で strict を true にする。



```tsconfig.json
"strict": true
```

## 詳細
### TypeScript

#### メリット
- コンパイルエラーによってJavaScriptではフォローできない、スクリプト実行前の未然検知を可能にする。
- IDEと組み合わせることで型補完やエラーを表示させ開発体験を向上させることができる。

### TSX
- TSX = JSX + TypeScript

### tsconfig.json
TypeScriptで記述されたファイル(.ts)をJavaScriptファイル(.js)にコンパイルする時の設定を記述するファイルです。

## 参考

### TypeScript
- [Next.js 公式ドキュメント typescript]()
- [Next.js 日本語翻訳プロジェクト TypeScript]()
- [Next.js + TypeScriptの開発環境を整える]()
IBM Cloudの認定資格をとろう（IBM Certified Professional SRE - Cloud v1編）

# IBM Certified Professional SRE - Cloud v1とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/1000023c-b319-57c0-aade-ab65dd1bce4c.png)

過去記事[IBM Cloudの認定資格をとろう（概要編）](https://qiita.com/teruq/items/62fe97cd25c0110ee030)のとおり、IBM Certified Professional SRE - Cloud v1はIBM Cloud認定資格のProfessional（中級）レベルの1つです。出題の難易度は高いですが、合格に必要な点数は他に比べ低めです。

# 出題範囲

公式の[Study Guide](https://www.ibm.com/certify/api/getpdf/sampletests/samc1000_102)がベースです。ただし、例によってこれ以外の出題も多少ありえます。

試験規約により具体的なアドバイスはできないのですが、私には非常に難しかったです。IBM Cloudの各サービスの理解と、Design for Failureの理解、そしてSRE用語の理解が必要です。

# 無料で受けられるe-ラーニング

この試験に特化したものは残念ながらなさそうです。

# 有料で受けられるe-ラーニング

## Cloud Site Reliability Engineer (SRE) Professional - Learning Path

* URL https://www.ibm.com/training/path/139
* 所要時間 24.1時間

有料で、なんと年間$3600のサブスクリプション購入が必要です。ただし、このコースだけではなく、他のProfessionalレベルのIBM Cloud認定資格のe-ラーニングも含まれているようです。

> https://www.ibm.com/training/subscriptions/SUBR014G

IBM Cloudの認定資格をコンプリートしたい、会社がお金を出してくれる、英語でも大丈夫、という方は利用してみるといいかもしれません。

なお、私はこれを受けていないので、本番試験で有用なものかはわかりません。

# 受験方法

PersonVUE社のサイトから「C1000-102: IBM Cloud Professional SRE v1」を予約し、最寄りの会場で受験してください。受験料は2万円（税抜）です。

> https://www.pearsonvue.co.jp/Clients/IBM.aspx

テストセンターによって試験を開催している日にバラツキがあります。東京駅近辺ですと、秋葉原のテストセンターはほぼ毎日開催していますし、前日予約も可能ですので、急に受けたくなったときはお勧めです。

# 出題形式

1/4択はまた2/5択がほとんどです。基本的には「正しいものを全て選べ」系の問題はないので、そこは安心です。

ちなみにもちろん試験は英語です。

試験時間は90分です。問題数が多いうえに難しいので、私の場合は残り時間はほとんど余裕はありませんでした。

# 合格条件

69問中44問以上の正解で合格となります。正答率63%以上に相当します。他の試験に比べて問題数は多く、必要な正答数は低いです。

# リトライしたい場合

1回で駄目でも記憶がフレッシュなうちに2回目を受験することをお勧めします。IBMの認定試験は同じ試験を30日間に2回まで受験できます。もちろん別料金です。

# アドバイス

繰り返しますが非常に難易度が高いと感じました。しかし合格点は低めなので、これまで他Professionalの試験に合格した人であれば、なんとかなるかもしれません。
Jetson nanoで「現場で使える!TensorFlow開発入門」のサンプルを動かす


[現場で使える！TensorFlow開発入門 Kerasによる深層学習モデル構築手法
](https://www.shoeisha.co.jp/book/detail/9784798154121)
![書影](https://www.seshop.com/static/images/product/21540/L.png)

この本を写経したりサンプルをダウンロードして動かそうとしたのだけど、 tensorflowのバージョンが1.15のため、Nvidia NGCが提供する [NVIDIA L4T ML](https://ngc.nvidia.com/catalog/containers/nvidia:l4t-ml)では素直に動かせなかった。

なので、tensorflow 1.15のサンプルをほぼそのままで動かせるよう Docker環境を構築した。

※ 今 NVIDIA L4T MLを確認したら "* TensorFlow 1.15"って書いてた...最初に動かしたときは確かに 2.x系になっていたはずなのだが。といってもせっかく作った Dockerfileがもったいないので、学習の記録として記事に残しておくことにする (opencvなんかも必要だし)。

## 準備

Jetson nanoに swapを追加しないとビルドに失敗した。6GBくらいのスワップファイルを作っておく。
→ https://qiita.com/n-yamanaka/items/dd82996312ab333fe9b2

## Dockerfile

githubに上げた。
 → https://github.com/Nunocky/JetsonNano_Docker_Containers

```
FROM nvcr.io/nvidia/l4t-tensorflow:r32.4.4-tf1.15-py3
   
RUN apt-get update
RUN apt-get install -y fonts-ipaexfont
RUN apt-get install -y libffi-dev
RUN apt-get install -y python-pip
RUN apt-get install -y python3-pip
RUN pip3 install -U pip
RUN pip3 install notebook
RUN pip3 install matplotlib
RUN pip3 install pandas
RUN pip3 install scipy
RUN pip3 install opencv-contrib-python

RUN mkdir /tf
RUN chmod 777 /tf

ADD jupyter_notebook_config.py /root/.jupyter/

CMD ["jupyter", "notebook"]
```

Dockerfileと同じ場所に jupyter_notebook_config.pyを用意する。 
Jupyter notebookのパスワードは jetsonnano に設定した。 パスワードを変えたい場合は
[ここ](http://starpentagon.net/analytics/remote_jupyter_notebook/)を参考にすると良い。

```jupyter_notebook_config.py
c.NotebookApp.notebook_dir = '/tf'
c.NotebookApp.ip = '*'
c.NotebookApp.open_browser = False
c.NotebookApp.port = 8888
c.NotebookApp.password = u'argon2:$argon2id$v=19$m=10240,t=10,p=8$kDrfziXaxPvbrLZfP2oTKA$zSNR85lqmziWEVjx/ApauQ'    
```

ここまで出来たらビルド

    sudo docker build -t tensorflow:1 .

matplotlib, opencvなどのビルドで数時間かかる。

#### 実行

    sudo docker run -it --rm --runtime nvidia --network host tensorflow:1

起動時に ```-v``` オプションでホストのディレクトリと dockerコンテナ上の ```/tf``` を関連付ければ作業記録を消さなくても済むが、それは dockerの基本の話なので割愛

tensorboardは Jetson nano上から docker execで実行。

    sudo docker exec -it <container id> tensorboard --host 0.0.0.0 --logdir /tf/log --port 6006

## 注意

大量の画像を扱う 10章以降のサンプルはそのままでは ResourceExhaustedError が出て動かせないことがある。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">動いたが止まった <a href="https://t.co/g4wxNOIi7V">pic.twitter.com/g4wxNOIi7V</a></p>&mdash; NUNOKAWA Masato (@Nunocky) <a href="https://twitter.com/Nunocky/status/1343530384861003776?ref_src=twsrc%5Etfw">December 28, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

その時はバッチやエポックの数を調整し、GPUに渡すデータの大きさを変えると良い。

→ [深層学習とかでのtensorflowエラー「tensorflow.python.framework.errors_impl.ResourceExhaustedError: 2 root error(s) found. 」への対処
](https://qiita.com/enoughspacefor/items/1c09a27877877c56f25a)
MySQL テーブル名を指定して全てのカラム情報を取得する

# 目的

- MySQLでテーブル内の全てのカラム情報を取得する方法をまとめる

# 情報

- Macに直接MySQLを立ててDB、テーブル、カラムの作成を行い今回紹介するSQLの動作を確認した。

# 方法

- 下記SQLを実行する。

    ```sql
    show full columns from テーブル名;
    ```

- `show columns from テーブル名;`だとカラムのコメントを確認することはできないが`full`を追加する事により確認することができる。
MacOSをBig Surにアップデートするのはまだちょっと怖いので、とりあえずCatalinaにアップデートしたい

# どういうことか

例えばあなたのMacのOSが **Mojava** だとして、なんらかの事情でOSをアップデートしたい。

> Xcodeは“Machintosh HD”にはインストールできません。macOSバージョン10.15.4以降が必要です。

――など。
で、Appleのサポートページの『[ダウンロード](https://support.apple.com/ja_JP/downloads/macos)』からバージョン `10.15.4` をダウンロードしてインストールしようとたら「**このアップデートには、macOSバージョン10.15が必要です。**」と言われて困った。

## 端的に言うと

**以前のバージョンの macOS を入手する**
<https://support.apple.com/ja-jp/HT211683>

こちらから入手できる。
チャオ。
IBM Cloudの認定資格をとろう（IBM Certified Solution Architect - Cloud v4編）

# IBM Certified Solution Architect - Cloud v4とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/886fe2b6-2f65-6fa0-1293-e03e555b1adb.png)

過去記事[IBM Cloudの認定資格をとろう（概要編）](https://qiita.com/teruq/items/62fe97cd25c0110ee030)のとおり、IBM Certified Solution Architect - Cloud v4はIBM Cloud認定資格のProfessional（中級）レベルの1つです。しかし、難易度はさほど高くはありません（私見）。個人的には初級のIBM Certified Solution Advisor - IBM Cloud Foundations V2よりも簡単ではないかと思っています。

# 出題範囲

公式の[Study Guide](https://www.ibm.com/certify/api/getpdf/studyguides/stuc1000_090)がベースです。ただし、例によってこれ以外の出題も多少ありえます。

試験規約により具体的なアドバイスはできないのですが、出題範囲はFoundationsとあまり変わらず、問題文や選択肢はむしろわかりやすいものが多かった印象でした。

アーキテクトというと領域は広いですが、IBM Cloudにはどのようなサービスがあり、それぞれどのような特徴や制約があるか、というところを理解している必要があります。ですので、自分はクラウドネイティブなアプリケーションアーキテクチャを考えるのは得意です、という人ではおそらくは受かりません。むしろ、ユーザーとしてIBM CloudをクラシックインフラストラクチャーからVPCまで幅広く使い、KubernetesやOpenShiftに普段から触っている人であれば特に事前準備なしで受かると思います。

# 無料で受けられるe-ラーニング

この試験に特化したものは残念ながらなさそうです。

# 有料で受けられるe-ラーニング

## Cloud Developer Professional - Learning Path

* URL https://www.ibm.com/training/path/138/
* 所要時間 36.3時間

有料で、なんと年間$3600のサブスクリプション購入が必要です。ただし、このコースだけではなく、他のProfessionalレベルのIBM Cloud認定資格のe-ラーニングも含まれているようです。

> https://www.ibm.com/training/subscriptions/SUBR014G

IBM Cloudの認定資格をコンプリートしたい、会社がお金を出してくれる、英語でも大丈夫、という方は利用してみるといいかもしれません。

なお、私はこれを受けていないので、本番試験で有用なものかはわかりません。

# 受験方法

PersonVUE社のサイトから「C1000-100: IBM Cloud Solution Architect v4」を予約し、最寄りの会場で受験してください。受験料は2万円（税抜）です。

> https://www.pearsonvue.co.jp/Clients/IBM.aspx

テストセンターによって試験を開催している日にバラツキがあります。東京駅近辺ですと、秋葉原のテストセンターはほぼ毎日開催していますし、前日予約も可能ですので、急に受けたくなったときはお勧めです。

# 出題形式

1/4択はまた2/5択がほとんどです。基本的には「正しいものを全て選べ」系の問題はないので、そこは安心です。

ちなみにもちろん試験は英語です。

試験時間は90分です。私の場合、足りないということはありませんでしたが、あまり余裕はありませんでした。

# 合格条件

64問中44問以上の正解で合格となります。正答率68%以上に相当します。

# リトライしたい場合

1回で駄目でも記憶がフレッシュなうちに2回目を受験することをお勧めします。IBMの認定試験は同じ試験を30日間に2回まで受験できます。もちろん別料金です。

# アドバイス

普段からIBM Cloudの環境構築をしている人であれば難しくはないです。IBM Cloud上のアプリケーションを開発しているだけという人だとIaaSまわりの問題は難しいかもしれません。

ただ、初級のFoundationに合格した人ならこの試験も難しくはないと思います。まずはFoundationを取りましょう。
今どきのテスト駆動開発？

※ この文章はベータ版です。

この文章では、狭義のテスト駆動開発(TDD)ではなく、広義のテスト駆動
開発を扱っています。

狭義のTDDの問題点は、まずテストありき(test first)、にある、と
考えています。これは、本末転倒です。

まずアプリありき(app first)、で、アプリの品質を担保するために
テストをする、のです。

テストには時間とコスト(費用)が掛かります。

テスト駆動開発を実施するにあたり、プロジェクト全体でテストを
どのように実施するのか、どこまでテストするのか、テストの自動化
の範囲をどうするのか、etcを規約化しておくことが必要だと思います。

テストに掛かる時間とコストを見積もり、コストを抑えつつ、
アプリの品質を担保できれば、ベターです。

#テスト・コードを書く意味

テスト・コードを書くのは、テスト・ケースのテスト内容を
コード化する行為です。

テスト・ケースをコード化することで、
そのテストを自動実行できます。

#自動化するテストと手動テストの区分け

同じテストケースをテストコードと手動の双方で全て行うのは
時間とコストの両面でムダが発生してしまいます。

(クライアントor社内の金庫番がそのムダを安心のためのコストとして
受け入れてくれるのなら、ムダもムダではなくなります)

プロジェクト全体で、どのテストは自動化し、どのテストは手動で行うのか、
決めておく必要があると思います。

テストコードを書いたテストケースは手動テストでは網羅せず、手動テスト
ではいくつかの指定するテストケースを確認すれば、OKとする、と決めて
おく感じでよい気がします。
(テストコード(自動化用)でケースを網羅するなら、手動テストでのケースの
網羅は必要ではないかと。)

#テスト自動化の費用対効果

テストの自動化には、テスト・コードの記述、テスト・コードのテスト、
開発するアプリの仕様が変更された場合のテスト・コードのメンテ(改修)
及びメンテにともなうテスト，コードのテスト、を伴い、行うには時間と
コスト(費用)が掛かります。

テストの自動化は、手動で実施した場合より、自動化したほうが、テストに
掛かる総コストが小さくなる場合に有効です。

また、場合分けが多く手動テストでは漏れの発生や時間が掛かることが想定
されるテスト、手動ではしにくいテスト、もテストコードによる自動化が
有効だと思います。

テストに掛かるコストが自動化で小さくなるのが目に見えやすいのは、
反復して行う必要があるテストケースetcです。

テスト・コードが実行されるのは、リファクタリング等による変更の際の
動作確認、本番環境に投入された際の動作確認、動作環境が変更された際の
動作確認、etcのタイミングです。

手動でテストすれば事足り反復する必要のないテスト内容で、テストを
自動化して、自動化に掛かるコストを支払うのはムダです。

変更がほとんど発生しないコードに対して、テストの自動化を行うのは
オーバーコストだと思います。

テスト・コード化するテストケースは選択すべきです。

#テスト・コード作成のタイミング

テスト・コードを作成するのは、仕様を満たすひと通りのコードを
実装完了し、ひと通りの手動テストを通過、コード・レビューを通過した
後がよいでしょう。

開発中に仕様の変更が頻繁に入るような箇所は仕様が安定するまで、
テスト・コードの作成を保留したほうがよいはずです。

仕様の安定しないコードのテスト・コードを頻繁にメンテするのは、
掛かるコストがムダです。