OmniAICreator/Qiita-1.07M huggingface dataset:
新しい日本の選挙システムを考える

#はじめに
現行法の改正対象が多すぎたり、選挙における既得権益層が大反対しそうなので多分100年経っても実現できないようなシステムなんだけど、せっかく~~妄想した~~考えたので投稿してみる。

#システムの目的
・投票にインセンティブを持たせ、投票率を向上させる。
・選挙コストの大幅削減とそれに伴う供託金制度の廃止(お金がなくても立候補可能)
　→現状は衆議院選挙の立候補に300万供託金入れないと立候補できなくて、一般市民は到底立候補できない仕組みなのでその点を改善する。
・『毎月が選挙』という状況を作り政治家に危機感を持たせる
・『毎月投票できる』という状況を作ることで、第三者が投票しても翌月には投票先を変えることができる
・『この地域は○○党が必ず当選する』を無くす
・『選挙区内に投票したいと思える人がいない』を無くす
・比例代表のような『党とかいう大きすぎる母体への投票』ではなく『個人を信任する投票』に変える(〇〇党がいいんだけど〇〇の派閥は嫌だなぁ、を無くす)
・インターネット上以外の選挙活動の無意味化(地方でチビチビ票を集めても意味がない)により五月蠅い選挙カーを無くす
・得票を譲渡する仕組みにより派閥を見える化

#シーケンス図
![選挙管理システム (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65842/8944d3e4-a090-2719-5115-71bfa37a9636.png)

#補足：余剰得票数の譲渡手続きのイメージ
![EYWIDrVUwAEqE6d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65842/df6d91bd-951a-b38d-0ca1-fb84820aac4d.png)

#考えられる問題点
・マイナンバーカード認証だけだと弱いかもしれない(追加でFIDO認証とかつける？)
・「お前の票なんぞ受け取らん」みたいな得票譲渡拒否機能はいりそう。
・「俺の票は誰にもやらん」みたいな一匹狼に大量の得票が行くとそんなに得票がない人でも当選できる。
→やっぱり当選得票数が単純に総投票数÷議席数じゃ問題ありそう。偏差値とるか中央値を基準に決めたほうが良い?
・多分YouTuberが有利
・多分おじいちゃんおばあちゃんを筆頭にITに疎い人のサポートコストが結構かかる
・スマホ/PCない人用に役所に専用の投票機を置く必要がある
・激震災害発生時には投票が難しくなる
・多分他にも腐るほど問題があると思うので現行投票と並行運用して問題ないかどうかを十分洗い出す必要がある。
・政党交付金をどうするか考える必要がある。とりあえず思い付きはこんな感じ？
　旧：「国会議員が5人以上所属する政党」または
　　　「国会議員が1人以上所属し、直近の国政選挙において選挙区か比例区で2%以上を得票している政党」
　新：「4人以上に余剰得票数を譲渡し、本人を含む5人以上が当選すること」または
　　　「当選し、0.07%以上を得票していること」(単純に2%を選挙区の数289で割った)
・｢誰が誰に投票した｣情報はDBに残すべきか否か?残すと万が一漏れた時が嫌。残さないとバグ発生時が怖い。
なんかうまい具合に匿名性を確保できないか？
・｢誰が誰に投票した｣情報を残すべきか否か?残すと万が一漏れた時が嫌。残さないとバグが怖い。
→その辺は賢い人が色々考えてた。
ブロックチェーンを利用した電子投票システム「OMEGA（オメガ）」
https://www.pc-daiwabo.co.jp/from_dis/2005_1.html
【超初級】Node.jsの始め方 〜 2020.05.22ver〜

## 📗 Node.jsをインストールしてみよう♪
https://nodejs.org/ja/
こちらをクリックするとHPに行くと以下のような画面が出てくると思います。
<img width="807" alt="スクリーンショット 2020-05-22 16.40.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545998/c43bd6a1-7a45-b3a6-3ceb-5a965696fcd7.png">

どっちでも良いですが、推奨版をインストールするほうが安定的かもしれません。
流石に、インストールの方法は皆さんご存知かと思うので割愛します。

## 📗 nodeがインストールできたか確認してみよう
実際にnodeが入っているかを確認しましょう！

```ターミナル:ターミナル
node -v
```

ターミナルを開き上記のように入力してみてください。
v12.16.3などと出てきたらOKです！

## 📗 npmについて
nodeで開発を行っていく上で、必須となってくるのがnpmと呼ばれるもので
ノード関連のパッケージマネージャーです。
Node Package Maneger　の略です。

Ruby on Railsでいうgemみたいな感じです。
多様なライブラリを後から追加で使うことができます。
expressなどが有名です。

これは、nodeをインストールすると同時にnpmもインストールされます。
確認してみましょう

```:ターミナル
% npm
```
<img width="516" alt="スクリーンショット 2020-05-22 16.54.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545998/d9d575f3-f294-727f-7058-666166d2643b.png">
このような画面が出ていればnpmもインストールされています。

## 📗 ファイルを立ち上げてみよう！
今回はVSCodeを使っていきます。
それに類するものであればなんでもいいです。
早速、どこでも良いので適当なフォルダを作ります。
<img width="662" alt="スクリーンショット 2020-05-22 17.04.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545998/fea11259-85c1-0412-575d-96f5f312e0b8.png">

先程作ったフォルダの中に、ファイルを作成します。
nodeはJavaScriptなので.jsファイルを作成します。
適当にコードも書いてみましょう。

では、nodeで実際にファイルを立ち上げてみましょう。
ターミナルから自身が作ったディレクトリまで行きます。
<img width="506" alt="スクリーンショット 2020-05-22 17.11.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545998/c1f1021e-e0c7-2189-1c97-ff650d8bbf5b.png">

すると、先程作成した、hello.jsが存在していると思います。

```:ターミナル
% node hello.js
```
このように記入してみてください。
すると、hello.jsに書いたコードが実際にターミナルに反映されています。
書いていて気づきましたが、helloを誤字ってるのは気にしないでください（恥）


このように、nodeでファイルを立ち上げるときは、 node ファイル名　という形でターミナルに記載すればOKです。
ちなみに、ターミナルに入力するときは、.jsといった拡張子は実は書く必要がないので、次回から省いていきましょう！

超基礎的で退屈だったかもしれませんが、今回は以上です！

## 📗 次回予告
今後の方針として、expressを使わずに、簡単なメモツールを作成していこうかと思います。
nodeの基本をさっくりと沿っていくような形になります。
興味のある方は是非、見ていってください！

***記事を見てくださりありがとうございます。
５分で理解できるを記事を目標に執筆しております！
自身も学びの途中ですので、間違い等ありましたら、ドシドシ編集リクエストまでお願いします！***
python+seleniumでchromeの操作を自動化

## 概要
Seleniumを用いた自動テストやWebクローラーを実現する。
Seleniumはいくつかの言語・ブラウザでサポートされているが、今回はPythonとChromeを使う。

Seleniumがプラットフォームとなって、各ブラウザの共通のインターフェースを提供している。WebDriver（ChromeならChromeDriver）を使って、ブラウザを操作することができる。

- Selenium (https://www.selenium.dev/documentation/ja/)
- ChromeDriver (https://chromedriver.chromium.org/)

## Google Chromeのインストール
標準ではリポジトリが無いので追加。

```bash
$ sudo vim /etc/yum.repos.d/google-chrome.repo
```

```text:google-chrome.repo
[google-chrome]
name=google-chrome
baseurl=http://dl.google.com/linux/chrome/rpm/stable/$basearch
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub
```

安定版のChromeをインストール

```bash

$ sudo yum update
$ sudo yum install google-chrome-stable
```

バージョンを確認しておく（WebDriverと合わせる必要があるため：今回はversion 83）

```bash
$ google-chrome-stable --version
Google Chrome 83.0.4103.61
```

これでブラウザは準備完了。

## ChromeDriverをインストール

ブラウザとバージョンを一致させる。

```bash
$ wget https://chromedriver.storage.googleapis.com/83.0.4103.39/chromedriver_linux64.zip
$ unzip chromedriver_linux64.zip
$ chmod 755 chromedriver
$ mv chromedriver /usr/local/bin/
$ chromedriver --version
ChromeDriver 83.0.4103.39 (.....................)
```

## Pythonと、今回使うライブラリをインストール
```bash
$ sudo yum install python3
$ python3 -m pip install selenium chromedriver-binary
```

Pythonと、Selenium、ChromeDriverのライブラリがインストールできたので、実装開始。

```python:selenium-test.py
from selenium import webdriver

driver = webdriver.Chrome()
# 色々操作
driver.quit()
```

実行する

```bash
$ python3 ./selenium-test.py
```

ブラウザが開いて自動操作されているのが確認できる。
VS Codeでフローチャートの描きができた

# はじめに
VSCodeで簡単にDraw.ioで描画できるようになったみたいなので、
導入方法と使い方を備忘として残していきます。

# Draw.ioとは?
Draw.ioとは[draw.io](https://draw.io)にアクセスするだけで、フローチャートやネットワーク図、ER図といった豊富なテンプレートを使用して簡単にお絵かきをすることができるサービスになります。
Draw.ioで作成した図はPNGやJPEGなどの画像形式だけでなく、 SVGやXMLといった豊富な拡張子でエクスポートすることが可能です。
具体的にこんな感じでお絵かきすることができます。
![スクリーンショット 2020-05-14 20.03.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255007/ed86eb5b-9378-58d3-355e-f200f4698bea.png)

# それがVSCodeで使えるようになったらしい！
Draw.ioを知ったところで本題に戻ります。
なんとこのDraw.ioがVSCodeで利用できるようになったらしいです！
Github: https://github.com/hediet/vscode-drawio
MarketPlace: [Draw.io VS Code Integration](https://marketplace.visualstudio.com/items?itemName=hediet.vscode-drawio)

手元で簡単に、しかもGUIベースで利用することができるようで、使い方に迷うこともなく直感的にお絵かきができます！
ブラウザ上で作成するのでも苦はなかったですが、VSCodeでそれができるというのはかなりいいですよね！

# 導入方法
[Draw.io Integration](https://marketplace.visualstudio.com/items?itemName=hediet.vscode-drawio)でinstallボタンを押すか、
VSCodeの拡張機能検索窓で**「Draw.io Integration」**と検索してインストールをするだけです！

反映させ直すために一度VSCodeを立ち上げなおしたほうが良いかと思います。

# 使い方
拡張子を```.drawio```もしくは```.dio```でファイルを作成するだけですぐに利用可能です。
ファイルを作成して開くとすぐに描画画面になります。
![drawiovscode.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255007/cd528935-01fd-92d2-7043-f96635379b26.gif)



# 操作方法
かなり直感的に操作することができると思うので、説明はおそらく不要だと思いますが、
左側のshapeから必要なものをドラッグ&ドロップするだけですぐに描画することができます。

また、描画した図にマウスオーバーすると、矢印が出てきますので、そちらをクリックしたままホールドし、他のShapeに伸ばしてあげることで、リレーションを書くこともできます。

![drawio2.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255007/8c0dfb59-4aca-511b-a3b8-d9900663ec88.gif)

# アイコンを追加する
いろんなサービスのアイコンを追加で使うことができます！
Shapesの下にある[+ More Shapes...]を選択してもらうと追加でアイコンを選択することができます。
AWSやGCP、AzureのアイコンやKubernetesのアイコンを使うこともできます！
![draw4.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255007/440aaa35-8e92-b963-b1d2-896aac7a31c7.gif)


# エクスポートのやり方
上記までで作成した図をエクスポートするときには、
上のメニューバーから
[File]→[Export as]→（任意の拡張子）
の順で選択することで簡単にエクスポートすることが可能です。
![draw3.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255007/c86bec78-3ecc-9b05-226c-8cde2c489e7d.gif)


# 最後に
簡単に導入から使用までを行うことができました！
エンジニアはよく図を描く場面があると思うので、そのときにはぜひ使ってみるといいと思います！

# 参考
Github: https://github.com/hediet/vscode-drawio
MarketPlace: [Draw.io VS Code Integration](https://marketplace.visualstudio.com/items?itemName=hediet.vscode-drawio)
Laravelで複数のSQL文を実行するときはDB::unpreparedを使う

DBのdumpのような大量のSQLをLaravelから実行するときは`DB::unprepared()`という関数を使うと、実行することができます。

生のSQL文を実行するときは`DB::statement()`をよく使いますが、複数のSQL文には対応していません。

以下はファイルに入っている複数のSQL文を読み込んで一括で実行するサンプルコードです。

```php
$sql = file_get_contents(database_path('dump.sql'));
DB::unprepared($sql);
```
行列計算と線形方程式 : 線形代数をPythonで<3>

#線形代数
理系大学で絶対に習う線形代数をわかりやすく、かつ論理的にまとめる。ちなみにそれをPythonで実装。たまに、Juliaで実装するかも。。。
・Pythonで動かして学ぶ！あたらしい数学の教科書 -機械学習・深層学習に必要な基礎知識-
・世界基準MIT教科書 ストラング線形代数イントロダクション
を基に線形代数を理解し、pythonで実装。

#環境
・JupyterNotebook
・言語：Python3, Julia1.4.0

#行列
行列について、少し深く触れてみる。基本的に、

```math
A x = b
```
という、形にするのがスタンダード

###行列について、
行列には、***行***と***列***が存在する。
・横に並ぶのが、行
・盾に並ぶのが、列
いままで、
u = (1, 2, 3)のようにあらわしてきたのは、列ベクトルのことである。
***`行ベクトル : u = [1, 2, 3]`***
***`列ベクトル : u = (1, 2, 3)`***

とする。
本来であれば、以下のように表記しなければならない。

```math
u =
\begin{bmatrix}
1 \\
2 \\
3
\end{bmatrix}
```
ただし、この記事はマークダウン方式により、めんどくさいので今まで通りに記述する。

###線形方程式とベクトル
ex)連立方程式について

```math
\begin{matrix}
 x - 2y =  1 \\
3x + 2y = 11
\end{matrix}
```
を列ベクトルで考える。(= 線形的思考)
線形方程式のメリットは負数の指揮を一つの式で表すことができること。
以下のように変形できる、

```math
x
\begin{bmatrix}
1 \\
3
\end{bmatrix}
+
y
\begin{bmatrix}
-2 \\
2
\end{bmatrix}
=
\begin{bmatrix}
1 \\
11
\end{bmatrix}
```

この時、

```math
u =
\begin{bmatrix}
1 \\
3
\end{bmatrix}
,
v = 
\begin{bmatrix}
-2 \\
2
\end{bmatrix}
,
b = 
\begin{bmatrix}
1 \\
11
\end{bmatrix}
```
とおける。これは、u, vについてまとめてAとするとき、以下のようにAx=bの形で書くことができる。

```math
Ax =
\begin{bmatrix}
1 & -2\\
3 & 2
\end{bmatrix}
\begin{bmatrix}
x\\
y
\end{bmatrix}
=
\begin{bmatrix}
1 \\
11
\end{bmatrix}
= b
```
となる。この線形方程式で、あてはまるx, yを考える必要がある。
ちなみ解析学的に考えると、直線同士の交点を示す。

#行列の計算(プログラム)

```math
a =
\begin{bmatrix}
0 & 1 & 2 \\
1 & 2 & 3
\end{bmatrix}
,
b =
\begin{bmatrix}
2 & 1 \\
2 & 1\\
2 & 1
\end{bmatrix}
```
とする。行列の計算を行う。

###Pythonのコード

```python
import numpy as np

a =  ([[0, 1 ,2],
       [1, 2, 3]])
b = ([[2, 1],
      [2, 1],
      [2, 1]])
print(np.dot(a, b))

#=>[[ 6  3]
#   [12  6]]
```

#Juliaのコード

```julia
using LinearAlgebra
a = [0 1 2; 1 2 3]
b = [2 1; 2 1; 2 1]
a*b

#=>2×2 Array{Int64,2}:
#   6  3
#  12  6
```

前回のコメントで、`LinearAlgebra`モジュールに関することがあったので今回はそれを使って簡単にしてみた。中身の仕組みを理化したい方はモジュールなしでぜひやってほしい。計算合わせにはモジュール使用いいかもね。
【JavaScript】不等号で文字列型の数値を比較してはいけない理由


##結論
JavaScriptで`console.log('3' < '12')`を実行すると、文字列比較となってしまうため、結果はfalseと返ってくる。
単純に数を比較した場合と異なる結果が出ることがあるので、
数値を比較したい場合は文字列型(string)ではなく数値型(number)で比較すべき。

##なぜこうなるのか
不等号で文字列型の数値を比較すると、文字のUnicode値が比較されるかららしい。

こちらを参考にしました

 - [javascript 文字列のまま数字を比較すると危険が危ない。](https://chaika.hatenablog.com/entry/2016/02/01/153218)
 - [JavaScriptで文字列を比較する](https://uxmilk.jp/46945)
 - [ECMAScript® Language Specification 11.8Relational Operators](http://www.ecma-international.org/ecma-262/5.1/#sec-11.8)

##調査記録

実際の挙動も確かめたかったので手を動かしてみた。


#### numberとnumber

```javascript

console.log(1 < 2); // true
console.log(2 < 1); // false
```
number同士の比較なので、当然みたままの数字が大きい方がtrueになる


#### stringとnumber

```javascript
console.log('1' < 2); // true
console.log('2' < 1); // false
```
片方だけstringの場合、stringはnumberに変換されるため、
numberとnumberで比較した場合と同じ結果が得られる。


#### stringとstring (1文字の場合)

```javascript
console.log('1' < '2'); // true
console.log('2' < '1'); // false
```
Unicodeで比較する。
'1'は`u100301`、'2'は `u100302`なので、
結局、numberとnumberで比較した場合と同じ結果が得られる。


#### stringとstring (複数文字列で、文字列の長さが違う場合)　<font color="MediumVioletRed">＊ここがやっかい!</font>

```javascript
console.log('3' < '12'); // false
console.log('12' < '3'); // true
```
左詰で、１文字ずつ順番にUnicodeで比較する。
'3'は`u100303`、'1'は `u100301`になるので、この時点での結果は`'3' > '1'`と同じになる。
次の文字列は片方しか値がないため、その時点で処理が終了し、
結局、'3'と'1'を比較した結果が出力される

##### 補足

stringとstringで文字列を比較した際、以下のような結果になるのも上記と同じ理由だと思われる。

```javascript
console.log('c' < 'ab'); // false
console.log('ab' < 'c'); // true
```
'c'`u00603`と'a'`u00601`を比較し、この時点で結果は`'c' > 'a'`と同じになる。
次の文字列は片方しか値がないため、その時点で処理が終了し、
'c'と'a'を比較した結果が出力される。

## まとめ

数字を比較したい場合は文字列型ではなく数値型で比較すべき。
(JavaScriptの勉強過程で拾い集めた情報からたどり着いた答えです。間違っているところがあればご指摘お願いいたします。)
AWS CLIコマンドがCRON実行できない場合には環境変数(認証周り)を確認する

# AWS CLIシェルプログラムをCRON実行する場合

このようなS3へファイルをコピーする
シェルプログラムを作ってコマンド実行で動作したので

```sh:
#!/bin/bash
aws s3 cp ファイル名 s3://backet_name/
```

そのままCRONへ登録し失敗する理由は大体環境変数まわりかと思います。
  
- AWS IAMのクレデンシャル情報(アクセスキー、シークレットキー、リージョン情報など)を環境変数に指定する
- aws cliのコマンド引数で直接クレデンシャル情報を指定する
- S3へのアクセス権限を付与したIAMロールをEC2インスタンスに紐づける(未確認)

上記のいづれかの方法を取ればCRONで動作します。

ここでは、環境変数でクレデンシャル情報を指定する方法を記述します。
環境変数でクレデンシャルファイルを指定する例)

```sh:
#!/bin/bash

export AWS_SHARED_CREDENTIALS_FILE=クレデンシャル情報を保存したファイル
aws s3 cp ファイル名 s3://backet_name/
```

クレデンシャル情報やIAMに関する詳しい内容につきましては参考情報を

参考情報：
http://dev.classmethod.jp/cloud/aws/how-to-configure-aws-cli/
http://dev.classmethod.jp/cloud/aws/awscli-configure-credential-file-via-envvar/
ABC 037 D 経路

##問題
https://atcoder.jp/contests/abc037/tasks/abc037_d
##見た感じ
各格子をノードとする有向グラフを考えて、それの上で経路を数えようと思って、なんか方向性をもって数えたかったので、ノードの持つ数字の大きい順に数えていけば、それまでに数えた部分だけしか数え上げに登場しないので（ノード間の橋の作り方からそうなる）その方向性ですすめた。

```math
dp[i][j]=i行j列の格子を端点とする経路の数
\\dp[i][j]=\sum_{node\{ i,j\}からいけるnode\{ y,x\}}dp[y][x]
```
##解法
ノードの添え字を持ってる数字順にソートして、その順で今いるノードを通る経路を数えて、後で足した。
##ソースコード
```c++
const int N_MAX=1001;
int a[N_MAX*N_MAX],h,w;
vector<pint> v[N_MAX][N_MAX];\\pint=pair<int,int>
mint dp[N_MAX][N_MAX];\\mint=int%mod

mint solve(int y,int x){
    if(dp[y][x]>0)return dp[y][x];
    mint res=1;
    rep(i,v[y][x].size()){
        res+=solve(v[y][x].at(i).first,v[y][x].at(i).second);
    }
    return dp[y][x]=res;
}

int main(){
    int i;
    //入力
    cin>>h>>w;
    int b[h*w+1];
    rep(i,h){
        rep(j,w){
            b[i*w+j]=i*w+j;
            cin>>a[i*w+j];
        }
    }
    int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
    rep(i,h){
        rep(j,w){
            rep(k,4){
                int nx=j+dx[k],ny=i+dy[k];
                if(nx<w&&0<=nx&&ny<h&&0<=ny){
                    if(a[ny*w+nx]>a[i*w+j])
                        v[i][j].push_back({ny,nx});
                }
            }
        }
    }
    //処理
    sort(b,b+h*w,[](int i,int j)->bool{return a[i]>a[j];});
    mint ans=0;
    rep(i,h*w){
        int x=b[i]%w,y=b[i]/w;
        ans+=solve(y,x);
    }
    //出力
    puts(ans);
}
```
Cloud Foundry on Kubernetesがなぜ素晴らしいのか！

#Cloud Foundry on Kubernetesがなぜ素晴らしいのか！

つたないポストにお付き合いありがとうございます。今回はなぜKubernetes上でCloud Foundryを構築することが良いのか。なぜSUSEがそんなことをしているのかを少しお伝えしたいと思いますのでゆるーくお付き合いくださいませ。お察しくださいｗ

前回のポストに書いたとおり、SUSE以外のディストリビューションはVMware上でCloud Foundryを提供していますが、コンテナ化すると実は様々なメリットを享受出来るようになります。

- VMwareのライセンスが不要
- （何でも出来るし優れているが）複雑で学習コストの高いBOSHが不要
- 1/3～1/4のメモリで動作
- 高いポータビリティー、冗長性、スケール、自己復旧などコンテナとKubernetesのメリットを享受可能

Cloud Foundry自体のメリットに加えてその構成コストが場合によっては最大90%もお得な感じになります。つまりSMBとスモールスタートなど費用感や規模感が合わなかったユーザーもCloud Foundryが気軽に使えるようになるということです。そしてもちろん、Kubernetesのアドバンテージを最大限に有効活用出来る様になります。これはアプリ開発者、インフラ担当者、経営者にとっても大きなメリットだと思われます。そんなコンテナ化されたCloud Foundryですが現在パッケージ化して企業向けにサポートを提供しているのはSUSEのみとなります。

ここでなぜSUSEかという話を少し書きたいと思います。まだ生き残っていたかカメレオンという印象の方も多いかと思いますが...。SAPやHPCの世界では有名なのでご存じの方もいるかも知れませんがここ数年はKubernetesとCloud Foundryにも力を入れております。話はSUSEがHPEのHelion Stackatoを買収したところに遡る訳でございまして（詳しくはWebで）、その後IBM, SAP, Pivotalとも連携しながら主に以下のプロジェクトに携わっておりました。


![quarks.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636313/16a5ad53-fb8f-f847-4423-cc3c13a2b0f5.png)
CF コンテナ化は仮想マシンの代わりにCFAR(Cloud Foundry アプリケーションランタイム)をコンテナとしてパッケージ化し、CFARをKubernetesにデプロイ出来るようにします

![eirini.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636313/d059638a-bbda-e151-497d-c1f0f5734129.png)
EiriniはCFARのプラガブルスケジューリングを有効にします（運用者はCFARがDiegoかKubernetesのどちらかを利用するか選択可能です）

![stratos.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636313/61612cda-ec09-1a88-260d-aafb0258427b.png)
StratosはCloud Foundryを管理するためのWebベースのUIです。これにより、ユーザーと管理者の両方がCloud Foundryクラスターで実行されているアプリケーションを管理し、クラスター管理タスクを実行することができます

![kubecf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636313/7b4a712b-f424-5fcf-41b2-af7c03e3c4c8.png)
Kubernetes向けのアプリケーションランタイムディストリビューション
Cloud Foundry Application Runtimeのオープンソース実装

そう最後のKube CF*1はSUSE Cloud Foundryとして開発されていたscfが2020年3月20日にインキュベーションプロジェクトとしてCNCFに寄贈されました*2。今後はCF on K8sが主流となっていく訳ですが、そんな流れがあって実はSUSEもLinuxだけではなくパフォーマンスとセキュリティに優れたカーネルを活かしてKubernetesとCloud Foundryにガッツリ取り組みパッケージ化をしているという次第でございます。KubeCFについて興味のある方は[こちらのブログ](https://www.cloudfoundry.org/blog/kubecf-now-an-incubating-project-of-cloud-foundry-foundation/)もお読み頂くと良いかと思います。

Cloud Foundryが頭に浮かんだ際には数あるディストリビューションの中にSUSEという選択肢を入れて頂ければこれ幸いでございます。ガッテン(LGTM)頂けましたでしょうか？また緩い話でもご質問等大歓迎でございます。またアップデートがあれば共有させて頂きたいと思います。

*1)[https://www.cloudfoundry.org/kubecf/](https://www.cloudfoundry.org/kubecf/)
*2)[https://www.atmarkit.co.jp/ait/articles/2003/23/news056.html](https://www.atmarkit.co.jp/ait/articles/2003/23/news056.html)

Happy coding!
SSHにてAWSにあるインスタンスにログインできない時の対処法

AWSを学習中のものです。
ローカル環境にて、SSHを使って、AWSにあるインスタンスにログインを試みていました。



#エラーの内容
```:ターミナル
$ ssh -i my-key.pem ec2-user@18.181.72.120
Warning: Identity file my-key.pem not accessible: No such file or directory.
ec2-user@18.181.72.120: Permission denied (publickey).

```

上記のようなエラーにずっと悩まされていて、やっと解決したので記録に残しておきます。

#解決策

##「cd .ssh」という隠しフォルダに移動する

```:ターミナル
$ cd .ssh
```

##フルパスに書き換えて実行する

```:ターミナル
ssh -i ~/Downloads/my-key.pem ec2-user@18.181.72.120
```
自分はダウンロードディレクトリに my-key.pemをおきました。

#SSHにログイン完了

```:ターミナル
Last login: Fri May 22 07:05:26 2020 from p2409178-ipbf1128funabasi.chiba.ocn.ne.jp

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2018.03-release-notes/
4 package(s) needed for security, out of 11 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-0-1-10 ~]$ 
```

接続できました！
**「cd .ssh」という隠しフォルダに移動する**
 **フルパスに書き換えて実行する**

SSHにてAWSにあるインスタンスにログインできない時、上記を試してみるのも、良いかもしれません。

以下、大変参考にさせていただきました。
>[SSHにてAWSにあるインスタンスにログインしたい](https://ja.stackoverflow.com/questions/23073/ssh%e3%81%ab%e3%81%a6aws%e3%81%ab%e3%81%82%e3%82%8b%e3%82%a4%e3%83%b3%e3%82%b9%e3%82%bf%e3%83%b3%e3%82%b9%e3%81%ab%e3%83%ad%e3%82%b0%e3%82%a4%e3%83%b3%e3%81%97%e3%81%9f%e3%81%84)

>[Warning: Identity file ChatSpace.pem not accessible: No such file or directory. ec2-user@13.112.68.204: Permission denied (publickey).のエラーの解決例](https://qiita.com/KONTA2019/items/14760addecd51bd6abd8)

> [はじめてのssh](http://iatlex.com/linux/ssh)

> [インフラエンジニアじゃなくても押さえておきたいSSHの基礎知識](https://qiita.com/tag1216/items/5d06bad7468f731f590e)
文字列リテラルとインスタンス

（新人エンジニアのふぎと君。
今日はJavaのコードをせっせと書いているみたい）

#Stringクラスのインスタンス

「…と、ほなそろそろStringクラスで文字列作るか」

~~~
String string1 = "Hello";
String string2 = new String("Hello");
~~~

「遊び心を加えて書き方変えてみたで」
「これは先輩もくすっと笑ってくれるやろ！」

##先輩のもとへ

「先輩、コード書いたんで見てください」
「おもろいですやろ」
「んー、どれどれ・・・？」
「おん？」
「なあふぎと、お前この違いわかってへんのと違うか？」
「・・・？どの違いですか？」
「Stringクラスの初期化の仕方の違いや」
「違いって・・・どっちもStringクラスのインスタンスを
つくってるんと違うんですか」
「そうとも言えるし、そうやないとも言える」
「1つはリテラルで、もう1つはインスタンスや」

~~~
String string1 = "Hello"; //リテラル
String string2 = new String("Hello"); //インスタンス
~~~

「ええっ」
「そうなんですか」

##先輩ガチレク発動

「newしてつくった文字列はな」
「メモリのヒープ領域におかれんねん」
「ヒープ領域…？(;^ω^)」
「ざっくり言うたら『材料の保管庫』って感じや」
「プログラムの実行に必要なデータを置いとくとこやな」
「あーなるほど」
「話もどすけどな」
「newして作った文字列はヒープ領域におかれるんに対して」
「代入演算子で作った文字列はヒープにおかれた後」
「その参照が文字列リテラルプールに登録される」
「モジレツリテラルプール？」
「せや」
「ここに登録されたんと同じ文字列が次に作られたとき、」
「プログラムは文字列リテラルプールに登録された文字列の
　参照を返して、新しいインスタンスはつくらへん」
「なんとなくわかってきましたわ」
「同じ文字列やったら同じインスタンスを使いまわすってことですね？」
「まあ、ざくっと言うたらそうや」
「そもそもインスタンスの作成はコンピュータにとって
　しんどい仕事やねん」
「せやから、よく使うStringクラスはそのしんどい仕事を
　なるべくせえへんようにできるようになっとる訳やな」
「ほへー」
「勉強なりました」
「ありがとうございました(*´ω｀)」

###参考

https://it-trend.jp/development_tools/article/32-0041
川場隆『Javaオブジェクト指向徹底解説』(秀和システム)
【HTML&CSS】初心者向けメモ

**デザイナーではないので、web開発に必要最低限の知識をメモしておく。**
・HTMLの最低限のタグの役割を理解する。
・CSSにより画面がどう見えるのかを理解する。

##HTML&CSS 実習に使用したサイト
[Progate　･･･　とにかく実習できるサイトが必要だった。途中までは無料で使用でき、実習の有効性が満足のいくものだったので、引き続き、月額料金を支払い学習を継続した（このサイトの宣伝をしている訳ではありません。念の為）。](https://prog-8.com/)


##HTML&CSS 初心者向け参考記事
[「【初心者向け】CSSセレクタとは？セレクタの種類や指定方法を解説！（基礎編）」株式会社アーティス様 ブログ記事より](https://www.asobou.co.jp/blog/web/css-selectors)

##HTML とりあえず覚えておきたいタグ
・見出し：　\<h1>~\<h6>
・リンク：　\<a href="url">
・画像　：　\<img src="url">
・リスト：　\<ul>または\<ol>、\<li>
・構成　：　\<div class="構成名">　･･･　文章の構成を作る場合はこちらを推奨。
・段落　：　\<p>　･･･　大きな構成の中での纏まりに使用する（改行あり）。
・集約　：　\<span>　･･･　文中の一部のみ装飾する（改行なし）。

・複数クラス指定：　class="xxx yyy"
　※CSSの子孫セレクタと記法が類似しているが、親子関係等ではないので注意。
　※CSSの設定を目的別に設定したい時などに使用。
　※JavaScriptでクラスを動的に付加して処理を変えたい場合などに使用。
・CSSファイル読込：　\<link rel="stylesheet" href="stylesheet.css">
・閉じるアイコン（×）：　\<i class="fa fa-times">\</i>

##CSS 基本の記法例
凡例）セレクタ␣ {プロパティ（何を:␣どうする）}

```css:組み込みクラス（先頭修飾子なし）
li {
  color: red;
}
```
```css:ユーザークラス（先頭ドット）
.selected {
  color: red;
}
```
```css:id（先頭#）
#selected {
  color: red;
}
```
```css:子孫セレクタ（親␣子孫）
/* 親の設定が別にあり、該当子孫の設定のみ別に実施したい場合。*/
.list-item h3 {
  color: red;
}
```
```css:複数セレクタ（複数のセレクタに同一設定）
h1, p {
  color: red;
}
```

``` css:CSSセレクタ例（理解不足で間違ってるかも）
  対象HTML
  <input type="text" name="user-name" value="user-value">

  CSSセレクタ例（上記inputタグのname属性の属性値を参照）
  $('input[name="user-name"]')
```

##レスポンシブデザイン
PC／スマフォ等の画面サイズに応じて表示を変える手法。
メディアクエリーを使用して実現する（CSSファイルに定義）。
凡例）
&emsp;&emsp;@media( 条件式 ){ CSS定義 }

```css:メディアクエリー
@media (max-width: 670px) {
  h1 {color: blue;}
}
@media (max-width: 1000px) {
  h1 {color: red;}
}
/* 条件式は、CSSの定義に類似（末尾にセミコロンはつけない）。 */
/* 条件式の閾値（670px, 1000px）をブレイクポイントと呼称する。 */
```

```html:スマフォ・タブレット用にviewport定義が必要
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>

```
##調べたHTML要素を随時記載

■classとidの使い分け
　学級名(class)、学籍番号(id)
■\<link>
　リンクする外部リソースを指定する際に使用する。rel属性とhref属性が必須。
　rel属性：リンク先との関係。relationの略。
　href属性：リンク先アドレス。hypertext referenceの略。
■\<link rel="dns-prefetch" href="アドレス">
　rel="dns-prefetch"：リンク先を事前読み込み。
■\<link rel="canonical" href="アドレス">
　rel="canonical"：URL正規化タグ。
　ウェブマスターやサイトオーナーが検索エンジンのインデックス内での重複コンテンツ問題を解消できる。
■\<link rel="alternate" href="アドレス">
　非公開ページでは不要。
　スマホサイトURLの存在をGoogle検索エンジンに伝えるのに役立ちます。
■\<meta>
　SEO対策用タグ（検索エンジン対策）。非公開ページでは不要。name属性で種類を、 content属性でその内容を指定。
■schema.org
　SEO対策用のタグ
　itemscope、itemtype、itemprop等
■OGP設定
　SNSシェア時の要約情報。非公開ページでは不要。
　\<meta property="og:title" content="タイトル">
　property：og:title, og:type, og:url等
■viewport 表示領域
　どの端末でも下記記述でOK。
　\<meta name="viewport" content="width=device-width,initial-scale=1">
■divとspanの違い
　div⇒display: block。
　span⇒display: inline。
　divはCSSで幅（width）と高さ（height）の指定ができます。一方でspanは幅と高さを指定しても反映されません。
台湾のスタバのフリー Wi-Fi につなぐ方法

# 台湾のスタバのフリー Wi-Fi につなぐ方法

## 手順
1. SSID「StarBucks_Free_WiFi」を選択
1. Wi-Fi の接続画面から、電話番号を入力して隣のボタンを押す
1. SMS で認証コードを受信
1. 電話番号を入力下画面で、パスワードと認証コードを入力して、登録完了

## 電話番号について
- 電話番号は、先頭の「0」を削除して、国番号「81」をつけたもの
  - 例：電話番号が 「09011112222」なら、「819011112222」と入力する

## SMS受信の料金
- どのキャリアでも、受信は無料のようです

## 次回からは
- Account
    - 登録した電話番号
- Password
    - 登録したパスワード

## その他
- 数ヶ月後、再度台湾に訪れたときも、同じアカウントで問題なく接続できました
- Wi-Fi につなぐ前に必要な情報なので、困った時にはこのページは見れないというジレンマ
PHPMailerによるメール送信

#なぜ今更
あるEC2から異なるリージョンのEC2で起動しているメールサーバを使ってメールを送りたかった。sendmailをインストールしてmailコマンドでやってみたら以下のようなエラーが出た。

```diff
connect to mailhost.domain.com[3.136.146.20]:25: Connection timed out
to=<admin@domain.com>, relay=none, delay=30, delays=0.02/0.03/30/0, dsn=4.4.1, status=deferred (connect to mailhost.domain.com[3.136.146.20]:25: Connection timed out) B8B79CA81C: to=<user@domain.com>, relay=none, delay=30, delays=0.02/0.03/30/0, dsn=4.4.1, status=deferred (connect to mailhost.domain.com[3.136.146.20]:25: Connection timed out)
message-id=<20200521063716.D013DCA81E@ip-172-31-40-247.ap-northeast-1.compute.internal>
from=<>, size=6462, nrcpt=1 (queue active)
```
接続タイムアウトになっている。メールサーバはオハイオリージョンなので「us-east-2.compute.internal」のはずだが、送り元が東京リージョンだからなのか「ap-northeast-1.compute.internal」となっていて、接続先がおかしくなっている。
どう対処していいのかわからず、そもそもセキュリティ的に許されているかもわからなかった。

稼働監視の通知をしたかったのでLineやSlackに飛ばすことも考えたが面倒なのでやはりメールで行いたかった。
ということで言語ライブラリでメールてみた。

#結論
以下のスクリプトでできた。
PHPMailerは[こちら](https://github.com/PHPMailer/PHPMailer)から入手。
配置構造

```
　├ mailsend.php
　└ PHPMailer/
```

```php:[mailsend.php]
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'PHPMailer/src/Exception.php';
require 'PHPMailer/src/PHPMailer.php';
require 'PHPMailer/src/SMTP.php';

$inquiry_no;
$mail = new PHPMailer(true);

$error = null;

try {
  // サーバ設定
  $mail->isSMTP();
  $mail->Host = 'mail.domain.com';        // メールサーバ
  $mail->SMTPAuth = true;
  $mail->Username = 'sender@domain.com';  // 送信アカウント
  $mail->Password = 'password';           // 送信アカウントのパスワード
  $mail->SMTPSecure = false;              // TLSなどの暗号化非対応のサーバならfalseを設定。使えるなら'tls'か'ssl'を設定。
  $mail->SMTPAutoTLS = false;             // SMTPSecureをfalseにする場合はfalseにする。それ以外なら未設定で。
  $mail->Port = 587;

    // 送り先情報
  $mail->setFrom('sender@domain.com');       // 送信元アドレス
  $mail->addAddress('reciever@domain.com');  // 送信先アドレス
  $mail->addReplyTo('sender@domain.com');    // 返信先アドレス

  // 本文
  $mail->isHTML(false);
  $mail->CharSet = 'UTF-8';

  $mail->Body = "ここに本文を記載";
  $mail->Subject = "ここに件名を記載";
    
  $mail->send();
} catch (Exception $e) {
    $error = $e;
    echo $mail->ErrorInfo;
}
if ($error!=null) {
    echo "send";
}
```

#課題
Postfix+doevcotでメールサーバはEC2に立てられるけど、リレーとか理解してない。
EC2インスタンスのSwap領域を作成する

AWSでEC2インスタンスを立ち上げた直後ではインスタンスタイプによっては
SWAP領域が確保されていない場合があります。
※T2、T3インスタンスタイプでは確保されていません。

Swap領域が確保されていないと、メモリを使い果たしてしまった場合
OOM(Out Of Memmory) Killerが実行されます。

OSがAmazonLinux2の場合にSwap領域を１GB確保する手順を
記述します。

#### 1.メモリ情報確認
```
# free -h
              total        used        free      shared  buff/cache   available
Mem:           985M         49M         60M        388K        875M        771M
Swap:            0B          0B          0B
```
Swapが確保されていません。

#### 2.Swap領域の確保

Swapで利用する１GBのファイルを作成します。

```
# sudo dd if=/dev/zero of=/swapfile bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 14.514 s, 74.0 MB/s

# chmod 600 /swapfile
```
####  3.Swapの有効化

```
#  mkswap /swapfile
Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
no label, UUID=660eff32-62d3-4d07-b7ae-c59cbcec4153

# swapon /swapfile
```
#### 4.メモリ情報確認
```
# free -h
              total        used        free      shared  buff/cache   available
Mem     985M         50M         58M        388K        876M        770M
Swap:          1.0G          0B        1.0G:      
```
1GBのSwap領域が確保されました。

#### 5./etc/fstab編集

EC2インスタンスを再起動した場合にSwap領域を確保されるよう
/etc/fstabに、起動時にswapファイルをswap領域としてマウントする
設定を記述します。

```
# vi /etc/fstab
#
UUID=XXXXXXXXXX     /           xfs    defaults,noatime  1   1
/swapfile swap swap defaults 0 0
```

#### 6.再起動及び確認
```
# reboot

再起動後

# free -h
              total        used        free      shared  buff/cache   available
Mem:           985M         48M        779M        388K        157M        791M
Swap:          1.0G          0B        1.0G
```

完了です。
【GCP】VPCについて

予約済みIPを調べる必要があったため、VPCについてちゃんと勉強した。

わかりやすいところだと、以下のリンクで十分。
https://www.topgate.co.jp/gcp31-gcp-subnet

※ちなみに、RFC1918 にはIPアドレス帯について定義されており、
プライベートIPアドレスの範囲はRFC 1918で規定されている。

で、予約済みIPは以下のドキュメントを見たほうが早い。
https://cloud.google.com/vpc/docs/vpc?hl=ja
「予約済み IP」と「10.128.0.0/9 の未使用部分」になる。
AmazonLinux2でタイムゾーン(Asia/Tokyo)とロケール(日本語)を設定する


#### タイムゾーンを「Asia/Tokyo」へ変更
```
# timedatectl status
      Local time: Fri 2020-05-08 03:18:51 UTC
  Universal time: Fri 2020-05-08 03:18:51 UTC
        RTC time: Fri 2020-05-08 03:18:51
       Time zone: n/a (UTC, +0000)
     NTP enabled: yes
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a

# timedatectl set-timezone Asia/Tokyo

# timedatectl status
      Local time: Fri 2020-05-08 12:19:06 JST
  Universal time: Fri 2020-05-08 03:19:06 UTC
        RTC time: Fri 2020-05-08 03:19:05
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a
```

#### ロケールを変更
```
# localectl status
   System Locale: LANG=en_US.UTF-8
       VC Keymap: n/a
      X11 Layout: n/a

# localectl set-locale LANG=ja_JP.UTF-8
# localectl set-keymap jp106

# localectl status
   System Locale: LANG=ja_JP.UTF-8
       VC Keymap: jp106
      X11 Layout: jp
       X11 Model: jp106
     X11 Options: terminate:ctrl_alt_bksp
```
ImageJ上で深層学習が出来る｢Deep ImageJ」

[以前の記事でImageJ上でU-Netを行うプラグインを紹介しました](https://qiita.com/takeajioka/items/0d0873af09245bffc793)が、
ImageJ上で深層学習が出来る新しいプラグイン｢Deep ImageJ｣が登場しました。

ホームページ：https://deepimagej.github.io/deepimagej/
論文：https://www.biorxiv.org/content/10.1101/799270v2

開発元には、EPFL(スイス連邦工科大学ローザンヌ校)の名前がありました。
（EPFLというと、[TurboReg](http://bigwww.epfl.ch/thevenaz/turboreg/)という画像レジストのプラグインも個人的によく使っています。）

##インストール
通常のプラグインのインストール方法で可能のようです。以下からダウンロード出来ます。
https://deepimagej.github.io/deepimagej/download.html

##使用できるモデル
Instance Segmentation
Denoising
Isotropic Reconstruction
Super-Resolution
など、様々な用途のモデルがすでに公開されていて、使用できるようです。
現在13個のモデルがありました。以下からダウンロード出来ます。
https://deepimagej.github.io/deepimagej/models.html

##自分のモデルをエクスポートする
モデルのトレーニング自体はImageJで行うわけではなく、Pythonで行うようです。
tensorflow<=1.13でのモデルに対応しているようです。
Kerasを使用したモデルでも、変換をすることで可能です。（変換コード例は[こちら](https://github.com/deepimagej/python4deepimagej)に公開されています。）
トレーニングが終わったモデルファイルが出来たら、プラグインを通してBundledModelを構築するようです。

##感想
まだあまり使っていないので、今後分かったことがあれば追記します。
これまでいくつかDeepLearningを行うImageJ pluginはありましたが、総合的に様々なモデルが使用できるプラットフォームはすごいと思いました。
【Kotlin】listOfNulls的なこと（null埋めしたList取得）をする

# やりたかったこと
`Kotlin`には`null`で`Array`を初期化する`arrayOfNulls`関数が用意されています。

```kotlin
val nullArray: Array<Any?> = arrayOfNulls(size)
```

`List`でも同様に`listOfNulls`関数が用意されているかと思いましたが、有りませんでした。

# 代替手段
以下のように書くことで`null`埋めした`List`を取得できます。

```kotlin
val nullList: List<Any?> = List(size) { null }
```

## 補足
`List`のコンストラクタ的なものを呼んでいますが、これは実際は以下のように定義されています。
使う感じは`Kotlin`の`Array`のコスントラクタと同じですね。

```kotlin
/**
 * Creates a new read-only list with the specified [size], where each element is calculated by calling the specified
 * [init] function.
 *
 * The function [init] is called for each list element sequentially starting from the first one.
 * It should return the value for a list element given its index.
 *
 * @sample samples.collections.Collections.Lists.readOnlyListFromInitializer
 */
@SinceKotlin("1.1")
@kotlin.internal.InlineOnly
public inline fun <T> List(size: Int, init: (index: Int) -> T): List<T> = MutableList(size, init)
```
【Matlab】自分用忘備録-関数偏

#引数のデフォルト値を設定する
・公式ページの[リンク](https://jp.mathworks.com/help/matlab/matlab_prog/function-argument-validation-1.html#mw_7d29b198-98bc-4268-93a2-d74504d2b023)

・使用例

```matlab:exampleFunc.m
function c = Func(a,b)

arguments %ルール1：必ず実行コード行の一番初めに記入する
    a = 100 %ルール2: すべての引数を列挙する。デフォルト値を設定しない場合は a のみ書く。
    b = 200 
end

c = a+b;
end

```

```matlab:example.m
res = Func
%結果
%res = 300

res = Func(300)
%res = 500

```
[WVD ARM ] Application groups・Workspace及びユーザー管理編

#はじめに
本記事では WVD ARM の管理操作についてご紹介します。
WVD ARM とは 既存のPower ShellベースのWindows Virtual Desktop（WVD）から、Azure Portal 上で操作可能になった新しい Windows Virtual Desktop です。

便宜上　Power　ShellベースのWVDを WVDv1、 WVD ARM を WVDv2と表記します。
なお、Windows Virtual Desktop（WVD）についての解説は割愛しています。
※2020年6月1日時点ではプレビュー状態です。

#Application groups
WVDv2 の利用ユーザーに対してアプリケーションの使用権限を付与や管理を行います。

WVDv2 から追加・改善された箇所は以下の2点です。

- ユーザーが同じホストプール内にある Desktop Application ・RemoteApp  両方に登録可能　
※WVDv1では同じホストプールに登録不可


- Azure PortalでのRemoteAppの設定が可能　※WVDv1ではPower Shellで操作可能
作成方法は以下のリンクに進み「Step5:RemoteAppの作成」をご参照ください。
https://www.cloudou.net/windows-virtual-desktop/wvd016/


**注意事項**
Workspace に Application groups を紐付ける際、Desktop Application ・ RemoteAppは同じWorkspace に紐づける必要があります。

#Workspace
利用者側の使用するアプリケーションを接続画面に表示できます。
WVDv1では「WVDテナント」でしたが、 WVDv2では　Workspace と名称が変更しています。


作成するタイミング別の作業手順は以下の通りです。

- ホストプール作成時 ※WVDv1 Power Shellで操作可能
以下のリンクから「Step３：Host Pool (+Desktop)の作成」を参照
https://www.cloudou.net/windows-virtual-desktop/wvd016/

- 個別作成 
Azure Portal > WVD > Workspace > 「+追加」 をクリック > 各項目に必要事項を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614396/53253311-b98b-d048-70c6-85758d6fa965.png)


**注意事項**
利用者側に表示させたい Desktop Application を Workspace に紐づける必要があります。

#ユーザー管理
WVDv1 はユーザー管理を Power Shell での操作が必要でしたが、WVDv2 では Azure Portal で以下の操作が可能です。

- 管理権限の割り当てが可能　※ WVDv1 では Power Shellから操作可能
- グループ単位で追加可能　※ WVDv1 では選択不可

操作手順は以下の通りです。

■ 管理権限の割り当てが可能　※ WVDv1 ではPower Shell から操作可能
手順：　Azure Portal > WVD > Host Pool(他のカテゴリーも選択可) > アクセス制御
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614396/7559cf11-33e1-8434-a56e-b1f1f14a715c.png)


■ グループ単位で追加可能　※ WVDv1 では選択不可
手順：　Azure Portal > WVD > Application groups (他のカテゴリーでも選択可） > Assignments > 「+ 追加」 を選択 > 追加するユーザーまたはグループを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614396/79e845bc-ce60-3b18-a192-bf36a6fbdcf7.png)


##ユーザーの接続状況を確認可能
Azure Portal 上でユーザーの接続状況を確認できます。
以下が接続状況を確認するまでの手順です。

■ ユーザーの接続状況を確認可能　※WVDv1 ではPower Shellで操作可能
手順：　Azure Portal > WVD > Users > 確認するユーザーを選択 > Sessionsを選択
接続中： Active
未接続： Disconnected
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614396/336bc0b0-08ad-a9b2-432f-b8d5b2c87f0a.png)

**注意事項**
ユーザーアカウントが WVD 用の Azure AD に同期している必要があります。


#最後に
最後まで読んでいただきありがとうございました。

WVDv1ではユーザー管理やアプリケーショングループ・Workspaceでの作業は Power Shell での操作が必要でした。WVD ARM では Azure Portal で操作可能になり、数クリックで管理やデプロイができ、WVDv1より利便性が向上しています。

この機会にWVD環境構築を試してみてはいかがでしょうか？



#Windows Virtual Desktop (WVD)をより詳しく知りたい方
Windows Virtual Desktop (WVD)に関しての情報は以下のリンクをご参照ください
■ Windows Virtual Desktop サービスについて知りたい

- [Windows Virtual Desktop とは](https://docs.microsoft.com/ja-jp/azure/virtual-desktop/overview)

- [リモートワーク環境をサポートする WVD 概要・環境構築](https://qiita.com/d-masaoka/items/48dca2f44e5fd766a510)

■ Windows Virtual Desktop ARM を作成

- [WVD ARM (WVDv2) を構築する！](https://www.cloudou.net/windows-virtual-desktop/wvd016/)
AmazonLinux2にPHP7.4をインストールする

#### 利用できる拡張パッケージを確認する

```
#amazon-linux-extras

 42  php7.4                   available    [ =stable ]
```

#### PHP7.4を有効にする
```
#amazon-linux-extras enable php7.4
```
#### 確認
```
#amazon-linux-extras

42  php7.4=latest            enabled      [ =stable ]
```
#### PHP7.4インストール
```
 # yum clean metadata
 # yum install php
```

他、利用したいphpパッケージを都度インストールします。
TensorFlow.jsのfacemeshで顔向き推定を試してみた


これは[Head Pose Estimation using OpenCV and Dlib](https://www.learnopencv.com/head-pose-estimation-using-opencv-and-dlib/)を参考にTensorFlow.jsの[facemesh](https://github.com/tensorflow/tfjs-models/tree/master/facemesh)にSolvePnPを用いた顔向き推定の実装の備忘録です。

## 前書き

調査前はVTuberが顔動かすのが当たり前の時代ですので大概のライブラリで顔向き推定は実装しているものかと思っていたのですが、どうやらそうではないようです。

それなりに高速に動く[face-api.js](https://github.com/justadudewhohacks/face-api.js/issues/107)では議論はあれども実装は進んでいない状況ですし、[jeelizFaceFilter](https://github.com/jeeliz/jeelizFaceFilter)は[live demo](https://jeeliz.com/demos/faceFilter/demos/threejs/multiCubes/)を見る限り速度、精度共に微妙そうです。

調べた中では[ML Kitの顔認識](https://firebase.google.com/docs/ml-kit/detect-faces?hl=ja)で実装しているようですが、今回はブラウザで試してみたいのでML KitはiOS/Android用ですので検証しないことにしました。

そこで高速で精度良い[facemesh](https://github.com/tensorflow/tfjs-models/tree/master/facemesh)に顔向き推定を実装をするのも面白そうだと思い試しました。

## 実装について

[Head Pose Estimation using OpenCV and Dlib](https://www.learnopencv.com/head-pose-estimation-using-opencv-and-dlib/)を元に実装しまして、[Rotation Matrix to Euler Angles](https://www.learnopencv.com/rotation-matrix-to-euler-angles/)の方法でEulerAnglesを求めました。

実装して解ったのですが、SolvePnPは結構な頻度で外れ値を出します。
そのため、フレームレートを稼ぐのに難があります。
また、facemeshは3D座標を持っていますのでもっと簡単な計算で算出できそうなことに後から気づきました。
これから試す人は[オンラインデモ](https://infocom-tpo.github.io/facevrm/)を参考にあとで後悔しないようお気をつけください。

### OpenCV.jsのビルド

solvaPnP、Rodriguesの関数が必要で、OpenCV.jsをビルドしたのですが、そのままだと9.7Mありましたのでcore only buildをしまして、solvaPnP、Rodriguesを追加したうえで、2.5Mまで縮小することができました。

## 製作物

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Tensorflow.jsのfacemeshで顔姿勢推定を試しました。<br>MacBook Proのブラウザ上でそれなりの速度と精度が出ているように見えます。 <a href="https://t.co/xXpUmYtv30">pic.twitter.com/xXpUmYtv30</a></p>&mdash; o2 (@mb_otsu) <a href="https://twitter.com/mb_otsu/status/1263012169106382849?ref_src=twsrc%5Etfw">May 20, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## オンラインデモ

https://infocom-tpo.github.io/facevrm/

## References

- [FaceVTuber](https://facevtuber.com/)
- [Head Pose Estimation using OpenCV and Dlib](https://www.learnopencv.com/head-pose-estimation-using-opencv-and-dlib/)
- [OpenCVで顔向き推定を行う](https://qiita.com/TaroYamada/items/e3f3d0ea4ecc0a832fac)
- [VRMお試しサンプル](https://chimaya.booth.pm/items/1784241)
- [2D-3D対応からのカメラ位置・姿勢の推定](http://moitkfm.blogspot.com/2014/06/2d-3d.html)
- [Rotation Matrix to Euler Angles](https://www.learnopencv.com/rotation-matrix-to-euler-angles/)
- [three-vrm](https://github.com/pixiv/three-vrm/)
PRML 演習問題2.24 解答

##問題
>(2.76)の両辺に次の行列(2.287)を掛け. また(2.77)の定義を用いることで(2.76)の恒等式を証明せよ.
 

```math
\begin{pmatrix}
A&B\\
C&D
\end{pmatrix}^{-1}
=
\begin{pmatrix}
M&-MBD^{-1}\\
-D^{-1}CM&D^{-1}+D^{-1}CMBD^{-1}
\end{pmatrix}
\tag{2.76}
```

```math
\begin{pmatrix}
A&B\\
C&D
\end{pmatrix}
\tag{2.287}
```

```math
M=(A-BD^{-1}C)^{-1}
\tag{2.77}
```

##方針
誘導に従い(2.287)を(2.76)の両辺にかけ整理
あとで便利なので$M^{-1}=(A-BD^{-1}C)$を示しておく。

##解法
まず右辺から

```math
\begin{pmatrix}
A&B\\
C&D
\end{pmatrix}
\begin{pmatrix}
A&B\\
C&D
\end{pmatrix}^{-1}
=I
```

次に左辺

```math
\begin{pmatrix}
A&B\\
C&D
\end{pmatrix}
\begin{pmatrix}
M&-MBD^{-1}\\
-D^{-1}CM&D^{-1}+D^{-1}CMBD^{-1}
\end{pmatrix}
=
\begin{pmatrix}
AM-BD^{-1}CM&A(-MBD^{-1})+B(D^{-1}+D^{-1}CMBD^{-1})\\
CM+D(-D^{-1}CM)&-CMBD^{-1}+DD^{-1}+DD^{-1}CMBD^{-1}
\end{pmatrix}
```

左上

```math
\begin{align*}
\mathrm{AM-BD^{-1}CM}
&=\mathrm{(A-BD^{-1}C)M}\\
&=\mathrm{M^{-1}M}\\
&=1 
\end{align*}
```
右上

```math
\begin{align*}
\mathrm{A\bigl(-MBD^{-1}\bigr)+B\bigl(D^{-1}+D^{-1}CMBD^{-1}\bigr)}
&=\mathrm{MBD^{-1}\bigl(CBD^{-1}-A\bigr)+BD^{-1}}\\
&=\mathrm{-MBD^{-1}M^{-1}+BD^{-1}}\\
&=0
\end{align*}
```

左下

```math
\begin{align*}
\mathrm{CM-DD^{-1}CM=0}
\end{align*}
```

右下

```math
\begin{align*}
\mathrm{-CMBD^{-1}+DD^{-1}+DD^{-1}CMBD^{-1}}&=\mathrm{DD^{-1}}\\
&=1
\end{align*}
```

まとめると

```math
\begin{pmatrix}
1&0\\
0&1
\end{pmatrix}
=I
```

したがって**左辺=右辺**より(2.76)の恒等式は示された
CSSってたのしい！（動的背景）

#CSSのみで色をかえる
スライドショーみたいな切り替えではなく、だんだんと色が変わっていく背景を目指す。

#コード

```html
<head>
	<title>backgroundslide</title>
	<link rel="stylesheet" type="text/css" href="backslide.css">
</head>
<body>
</body>
```

```css
body{
    height: 100vh;
    width: auto;
    background: linear-gradient(-45deg, 
    #873742, #648323, #238747, #108483);
    background-size: 400% 400%;
    animation: gradient 15s ease infinite;
	background-position: top center;
	background-attachment: fixed;
}
@keyframes gradient {
    0% {
        background-position: 0% 50%;
    }
    50% {
        background-position: 100% 50%;
    }
    100% {
        background-position: 0% 50%;
    }
}
```

斜めのスライドになっているが
`background: linear-gradient(-45deg, #873742, #648323, #238747, #108483);`
の部分の角度と色を変えれば流れる方向と色の組み合わせも変えることができる。
ただこれは意外と無駄なところもあるから改善の余地ありだね。


#ちょっとしたコメント
最近WEBでのフロントデザイナーとか多くなったけど、その分、初心者が作るものも増えてきているなぁと。でも見てみると動的なものを作るのはjavascriptとかがやっぱり多いけど、単純なCSSでも作れるのも知っておくといいなと思った！
JavaScriptにおいてforを用いた繰り返し文の取扱説明書

# 繰り返し文のサンプルコード
以下、サンプルです。この仕組みを説明していきます。

```javascript
num = 1;

for(let i = 0; i<10 ; i +=1){
  console.log(num + "回目だよ" )
  num += 1
}
```
出力結果は以下の画面です。
<img width="1219" alt="JavaScript-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625088/76f41021-2b1e-60c0-f4ee-f57cb4517265.png">

# for文の解説
for(){}で括られているものは繰り返し扱いになります。
（）で括っているものは計算式でしたね。どういう風に実行するかというための式が書いてあります。
{}で括っているものは実行するコードが書いてあります。
サンプルコードにはconsole.logが書いてあるためこちらが実行するものになります。
今回はletで変数iを設定しており、このiは10回まで繰り返すという表記にしています。

```javascript
for(let i = 0; i<繰り返す回数; i += 1)省略
```
このような感じです。繰り返す回数を記載するのは上記のコードの部分です。
そしてその後に繰り返すたびに変数iに１ずつ足していくコードが書かれています。
そしてその結果をconsole.log()で出力していることになります。
console.log()って何だっけ？って思った人は以下の記事をみてください。
[console.log()の取扱説明書](https://qiita.com/Nyanmaru-12/items/fc430a1ee28c26901e91)

次は関数について記事を書いていこうと思います。
Angular Material DialogのPaddingを0にする

Angular MaterialのDialogを使用すると何もしないとPaddingが適用されて期待通りのダイアログの大きさにならない。

例えばダイアログの背景色を指定した場合Paddingのところはテーマ色に依存するため下の通りとなる。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377078/00399530-df15-e3cc-19f3-5747e2547618.png)

このPadding箇所を削除したい場合、呼び出し側を以下のようにする。

dialog-overview-example.component.ts

```
const dialogRef = this.dialog.open(DialogOverviewExampleDialog, {
      width: '250px',
      panelClass: 'example-dialog', // ここにPadding=0とするCSSを指定
      data: { name: this.name, animal: this.animal },
    });
```

dialog-overview-example.component.css

```
/deep/ .example-dialog .mat-dialog-container {
  padding: 0px !important;
}
```

ここで/deep/を指定することでAngular MaterialのCSSを強制的に上書きする。

結果は以下
![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377078/f733ed87-b96b-e5d3-d1e8-78cc6442e630.png)
WSLでjupyter+Javaを使うときにClassPathを指定する

JupyterLab＋Javaを使う場合にクラスパスを設定するぞ．

## 設定ファイルはどこだ
$ jupyter kernelspec list

```console
java       /path/to/jupyter/kernels/java
python3    /path/to/jupyter/kernels/python3
```

## 通常のJavaとは違うjava-libというkernelを作るぞ
$ cd /home/user_name/.local/share/jupyter/kernels/
$ mkdir java-lib
$ cd java-lib
$ ln -s ../java/ijava-1.3.0.jar
$ cp ../java/kernel.json ./
$ vi kernel.json

```kernel.json
{
    "argv": [
        "java",
        "-Xmx8g",
        "-cp",
        "/path/to/lib/dir/*:/path/to/java-lib/ijava-1.3.0.jar",
        "io.github.spencerpark.ijava.IJava",
        "{connection_file}"
    ],
    "display_name": "Java-lib",
    "language": "java",
    "interrupt_mode": "message",
    "env": {

    }
}
```

できた．
以下のコードでクラスパスがズラズラ出てくれば成功．

```
Properties properties = System.getProperties();
String clsPath = properties.getProperty("java.class.path");
System.out.println(clsPath);
```

しかし，実行ファイルごとにクラスパスを変更することはできないようだ．
ま，特定のlibファイルにjarファイルを全部入れておくという罰当たりなやり方で何とかなりそう．

しかし，Eclipseに慣れすぎているので，補完があまり効かないJupyterLabでどこまでコードが書けるか自信がない・・・
JIS X 0304 国名コード JSON

(長く放置していたので、JISの更新に対応できていませんでした。JIS X 0304:2021に対応しました。また、リンク切れの修正も行いました。)

# 概要
JIS X 0304:2021「国名コード」(この規格は、ISO 3166-1:2013「国別コード」と「一致している」とのこと)から、国名の漢字、英字表記をJSONデータに整備してみた。

「国コード」が正しいと思うが、JISで「国名コード」と定めているので、そのまま使用している。


# 国名コード JSON
以下のリンクからダウンロード可能
[国名コードJSON](https://github.com/HirMtsd/Code/blob/master/JISX0304/Country_list.json)

JSON Schemaは以下のリンクからダウンロード可能
[国名コードJSON Schema](https://github.com/HirMtsd/Code/blob/master/JISX0304/Country_schema.json)


# 正式国名確定の困難性
## 国名・地域名
ある国が独立国として承認されるか否かは、政治的な問題も絡むので、世界の国一覧を正しく保守することは非常に困難。
(例：北朝鮮＝朝鮮民主主義人民共和国は、国際連合加盟国ではあるが、日本は国家承認していない。)
独立国ではないが、特定の地域が一定の自治を行っている場合、地域として別に扱うケースもある。
(例：中華人民共和国におけるホンコン、マカオや、国際連合非加盟の台湾など)

コソボ共和国、クック諸島、ニウエについては、国際連合は正式加盟国とはしていないが、日本は2008年、2011年、2015年に国家承認している。

「エルサレム、ロードス及びマルタにおける聖ヨハネ主権軍事病院騎士修道会」は、領土を持たないが主権国家として、112の国と国交がある。(日本とは国交がない)

## 法律
日本の法律で、外国名を定めたものとして、直接のものは存在しないが、「在外公館の名称及び位置並びに在外公館に勤務する外務公務員の給与に関する法律」(昭和27年4月21日法律第93号)には、「別表第一　在外公館の名称及び位置」があり、これが日本の法律上外国の名称を一覧表示しているものになる。
しかしこの表には、外国名の略称(共和国、王国など政体にかかるものを記載していない)が列挙されており、正式名称ではない。

【在外公館の名称及び位置並びに在外公館に勤務する外務公務員の給与に関する法律】
https://laws.e-gov.go.jp/law/327AC0000000093

外務省のWEBサイト「国・地域」には、国名が一覧表示されている。

【外務省WEBサイト「国・地域」】
https://www.mofa.go.jp/mofaj/area/index.html


## 日本産業規格(JIS)
JIS X 0304では、ISO 3166-1の英語正式名称(English full name:設定されていない場合は、English short name)に対応する日本語正式名称を付与しているが、上記のように外務省が正式名称を公表していないので、国名変更など規格改正後の変更に対応できない。



## 国際標準化機構(ISO)
国際標準化機構(ISO : International Organization for Standardization)では、WEBサイトで国の一覧を公開している。

【ISOの公開している国一覧】
https://www.iso.org/obp/ui/#search

ISO 3166:2006規格制定の後、国名変更が発生した場合、ISO 3166 Newsletterで差分を公表していたが、ISO 3166:2013規格制定後は差分の公表をWEBサイトの更新で行いNewsletterの公表は廃止した模様。

現在は、年間300CHF(スイスフラン：1CHF約175円なので、5万3千円くらい)で差分の提供を受けることができる。

【ISOによるCountry codesの差分提供サイト】
https://www.iso.org/publication/PUB500001.html

【スイスフラン/円】
https://finance.yahoo.co.jp/quote/CHFJPY=FX

# 補足
公開情報のみから作成しているので、誰の権利も侵害していないと思います。

JIS X 0304の参照元 : [JIS検索](https://www.jisc.go.jp/app/jis/general/GnrJISSearch.html)
「JIS規格番号からJISを検索」にX0304を入力後、「一覧表示」ボタンを押下。

ISO 3166-1の参照元 : [ISO Online Browsing Platform (OBP)](https://www.iso.org/obp/ui/#search)
「Country Codes」をチェックして、「SEARCH」ボタンを押下。

ISO 3166-1を有償で入手する方法 (29,898円)
[ISO 3166-1:2020 国及びその下位区分の名称の表示基準－第1部：国別コード](https://webdesk.jsa.or.jp/books/W11M0090/index/?bunsyo_id=ISO+3166-1%3A2020)


# 参考
国名コードについては、ISO 3166-1の原典のほかにも、多くのサイトでまとめを作っているようです。
https://countrycode.org/
　オランダの会社「International Numbering Plans B.V.」が運営していると思われる。
http://www.statoids.com/wab.html
　個人でまとめられているが、2018年が最後の更新のようである。
https://pypi.org/project/iso3166/
　pythonのパッケージとしてまとめている。
macOS Mojave から Catalinaへの移行で Google Drive File Stream が使えなくなったのを直す


Security設定の問題でなくて、使えなくなってかなしい〜みたいな人がいたら救いたい

#対象者
Google Drive File Stream を Catalina で run させても、loading みたいな view がずっとまわって、何にも起きない。
Preferenceから sign in しようとしても、何も起きない。
などになってしまった人が対象。

#対処法
まずはlog をみる。
```$HOME/Library/Application\ Support/Google/Logs```
にあるどれかをみてみる。
わたしの場合、kernel extension の load error が起きていた。
```Google File Stream AuthComplete Account context authorization failed with error: LOAD_KEXT_ERROR```
こんな log が出ていたので、kextがあやしい。loadではなく、まずは cacheのクリアをしてみた。
```kextcache --clear-staging```
でシステムを再起動したら、sign in からはじまった。

#教訓
Logをよむこと。
Adの大枠を理解する

# web広告の目的
- 認知広告
  - いわゆるブランディング広告
  - 知ってもらうことが目的
  - 純粋想起や助成想起を指標とする
      - 純粋：技術共有でどんなサイト知ってる？
      - 助成：Qiita知ってる？
  - テレビ広告や交通系広告
- 獲得広告
  - パフォーマンス広告
  - 興味を持っている人に買ってもらうことが目的
  - CVやCPAを指標とする
  - リスティング広告やディスプレイ広告

# web広告のチャネル
  - 集客を行うための媒体・経路
  - 新聞、チラシ、テレビ、DM、インターネット etc
  - インターネットを詳しく見ると..
    - organic: 通常検索
    - ad: リスティング広告など
    - mail: メルマガ
    - direct: ブックマークやURLの直接入力など
    - link: サイト内リンク
    - sns: Twitter、facebookなど
  - さらにadを詳しく見ると..
    - リスティング広告
      - 検索に連動して掲載される広告(= 検索連動型広告)
      - Google_listingやYSS(Yahoo Sponsored Search)など
      - クリック課金(CPC: Cost Per Click)
        - 例
          - バイト系：~200円
          - 不動産：~5000円
      - デバイスやユーザータイプごとに表示される広告が異なる
    - ディスプレイ広告
      - webサイト/webメディアに掲載される広告
      - GDN(Google Display Network)やYDN(Yahoo Display Network)など
      - クリック課金(CPC)またはインプレッション課金(CPM：Mile)
      - 訪問したことのあるサイトの広告や訪問先のサイトに類似した広告が表示される
    - 動画広告
      - 動画配信サイトで掲載される動画型広告
      - インストリーム動画広告のことを指すことが多い
    - SNS広告
      - LINE, Twitterなどに掲載される広告
    - インフィード広告
      - コンテンツとコンテンツの間にPRとして出てくる広告
      - 例えば、日経サイトで記事と記事の間に表示される広告のこと
    - アフィリエイト広告
      - アフィリエイターに商品を紹介する記事を書いてもらう広告
      - ASP(Affiliate Service Provider)を通すことが一般的
        - A8、バリューコマースなどの仲介企業

# チャネルとファネル
  - ファネルとは
    - 漏斗、じょうご
    - ユーザーの購買プロセスを表したもの
      - 例：AISAS  

| ユーザー数| 行動 | 内容 | 
| ----  | ---- | ---- | 
|↓↓↓↓↓↓↓↓↓↓↓↓ |  注目: Attention  | 認知してもらう為に広告を実施する
|↓↓↓↓↓↓↓↓↓↓  |  興味: Interest  | 興味を持ったユーザーが広告を見る(クリックする)
|↓↓↓↓↓↓↓↓   |  検索: Search | 検索エンジンでいろいろと調べる(比較する)
|↓↓↓↓↓↓    |  購買: Action| あれこれ検討し商品を購入する
|↓↓↓↓     |  共有: Share| ユーザーは口コミサイトやSNSなどで共有

- ファネルごとにチャネルを整理する
      - 動画広告/インフィード広告：A, I
      - リスティング広告/アフィリエイト広告：S, A
      - ディスプレイ広告：A, I, S, A
      - SNS広告：A, I, S, A, S
Sign in With AppleでSandboxアカウントを使う

# はじめに

2020/5/22 現在の情報です
Sign in With Apple(以後、SIWA)でSandboxアカウントを使う為のメモです

SIWA自体やInAppPurchaseについての対応は割愛します。

## 流れ

1. よし、SIWAの実装確認できた
2. 課金周りテストするか、Sandboxアカウントでログインして
3. SandboxアカウントでSIWAログインできるのかな？まぁ、やってみるか
4. お、できた。メールにPIN送ったから入力しろって。
5. よし、入力完了。次は？。2FA認証が必要です。設定を開いて〜
6. 「お客様のApple IDでは、現在2ファクタ認証をご利用できません」 :thinking:

で困っていたら、[Apple Developer Forums][LINK-1]にあったので共有と解説です

---

## 準備作業

### ブラウザで作業

1. [icloud.com](https://www.icloud.com/)にアクセスして、sandboxアカウントでログイン。

2. メールアドレスを確認する
<img width="650" alt="メールアドレスを確認する" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228438/79ace47d-6515-8097-f3f5-6986aec1e123.png">

3. メールを確認する
<img width="854" alt="メールを確認する" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228438/81d5af6c-c88f-e942-58ca-1fc846a60ccd.png">

4. セキュリティ質問を入力
<img width="645" alt="セキュリティ質問を入力" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228438/d3da09d7-8e8d-ba71-f3a9-77cdd4a805ca.png">

5. Apple IDとプライバシー
<img width="648" alt="Apple IDとプライバシー" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228438/d0ab1bad-9aee-8f4b-2484-75075530e927.png">

6. 利用規約に同意
<img width="649" alt="利用規約に同意" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228438/043083be-1d29-585a-0eb1-a03ed3519d17.png">

---

### Macで作業

※ ローカルに別ユーザ作って管理した方がiCloud周りが楽です

1. システム環境設定＞Apple IDからサインイン
<img width="668" alt="Apple IDからサインイン" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228438/539f5a16-a65e-aa2b-b3e8-00257244ffa4.png">

2. 2ファクタ認証を有効にする
<img width="544" alt="2ファクタ認証を有効にする" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228438/0e04458d-110c-e60a-10ba-f17a4e61572e.png">

3. icloudで登録したセキュリティ質問を入力
4. 電話番号を入力
<img width="623" alt="電話番号を入力" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228438/cb17a6f9-5c95-96ab-7d65-6c869bf561c9.png">
5. SMSからPINを入力
6. Macのパスワードを入力

---

### iPhone(or シミュレータ)で作業

1. サインイン
![サインイン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228438/cb96099a-9dd1-de15-c9b5-2c18536981a5.png)

2. 2FA認証
<img width="480" alt="2FA認証" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228438/8573d92a-2b0b-6c93-6acf-b179af9c6ed3.png">
3. PINを入力

---

## 使う

1. SIWAでログイン
![SIWA](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228438/d03bbddb-dc22-3058-978a-658688ccd9a9.png)

2. 課金処理[Sandbox]を呼び出す
![InAppPurchase](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228438/b22d7d9f-de4a-41ff-851b-8363593f44c3.png)

3. 購入[Sandbox]完了！
![購入完了](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228438/b2f841b8-da2c-b8b7-1606-693ae03325d1.png)

---

## Sign in With AppleでSandbox Accountを使うのに大事なこと

- `受信できるメールアドレス`を使って`Sandboxアカウント`を作成すること

---

## 参考

- [Apple Developer Forums: Sandbox Account for "Sign in With Apple"][LINK-1]

[LINK-1]:https://forums.developer.apple.com/thread/121940