OmniAICreator/Qiita-1.07M huggingface dataset:
VB.Net を C# に変換した。(有償ツール $149)

#概要
VB.Net のソースを、C# に移行するを社内で実施中です。
ようやくやり方がまとまってきたので久しぶりに書いてみました。
さて、過去の記事だったり、日本語の記事ではほとんど SharpDevelop を使った方法の紹介がほとんどでしたが、ちょっと前に有償ツールですが、[Instant C#](https://www.tangiblesoftwaresolutions.com/product_details/vb-to-csharp-converter.html) というツール($149)を見つけました。

今まで使用していた、Sharp Develop よりはるかに精度が高い。多少は手で直さないといけないですが、SharpDevelop に比べると数倍は精度が高い。
画面はこんな感じ。
移行元プロジェクトのプロジェクトか、ソリューションを選んで出力先フォルダを選んでコンバートするだけ。
![instant.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84226/827cd2df-3ec2-de6c-4351-629dbd93eccd.png)

画面の右側に、プロジェクトごとに結果の概要が表示される。
ここでは、note, warning, ToDo の3種類の個数がされます。

これらのコメントは`INSTANT C#`という文言で検索するとその箇所が分かりますが、これらは違和感のある変換をしているとはいえ、ちゃんと変換してくれてるので、無視してもほとんど問題なし。これを追うよりも、ツールが追えていないないエラーの方が大変です。
ただ、これらも Visual Studio で開いてエラーをつぶしていけばオーケーです。

#個人的なオススメ使用法。

1. 一度ツールを当てる。
2. Visual Studio で開いてエラーを見る。
3. 元のソースで直した方がよさそうなところを直しておく。
4. 必要に応じで、1~3を繰り返す。
5. Visual Studio でエラーつぶす。

1~4であらかたつぶしておくと、慣れてくると5の作業は1日で1万行ぐらいできるイメージ。


#事前にやっておいた方がいいこと

1. このツールでは、ソースが Shift-JIS だと文字化けするので事前に UTF-8 に変換しておいた方がいいです。昔の Visual Studio でなければ大丈夫ですが。[こちら](https://qiita.com/wacha/items/ce4afcdb5d4f5938d4ce)に上げておきました。

2. メソッドに「()」を付けておいた方がいい。特に、ToString はかっこを付けてないことが多かったので、正規表現で一括で置換しました。こんな感じ。元`.ToString([^(]|$)`、後`.ToString()$1`。よくある関数はこんな感じで一括で変換するコードを書いた方が楽かも。

```VB.Net
not good: x.ToString
good:     x.ToString()
```

#主なひっかかりどころ

c# に慣れてる人には当たり前かもしれないけど、主な移行作業。

1. しばしばデリゲートでエラーになるので、`new Action(` で囲む。
2. 配列のインデックス参照の "[","]" が普通のカッコのままなのを直す。
3. `Enum`と`int`の変換にキャストが必要になる。これを使っていると案外面倒。
4. VB.Net でいうと、Char と String のキャストも自動でなくなるので、キャストが必要。`"a"c == "a"`みたいなのがエラーになっちゃう。
5. (たぶん)C# では、`System.IO.File` を参照するのに `using System;` ってしても、`IO.File`で参照できなくて、`System.IO.File`と書かないといけない。
6. ほかにもいろいろありますが、[SharpDevelop で、VB.Net を C# に変換してみた( その1 )](https://qiita.com/wacha/items/64df18569b5b8a5c5bd6)で書いていたのはほとんど、ツールが解決してくれてありがたい。
7. [SharpDevelop で、VB.Net を C# に変換してみた( その2 )](https://qiita.com/wacha/items/d17ee9b2f3451963881d)で書いていたのもけっこう変換してくれる。

#C#に移行して

いろいろ手がかかって面倒でしたが、すでに数十個のプロジェクトを VB.Net から C# に移行しました。慣れてくるとだいぶ早く変換できるようになってきます。
グローバル関数も、`using static Class1.Module1;`って書いてあげればC#でも使えたのでだいぶよくなってきました。

やっぱり、有償ツールはいいですねって感じ。
kshでよく使うコードをまとめてみた

ここ半年ほど仕事でLinuxのシェルプログラムの一つ、kshをちょこちょこ使う機会があり、
少しずつ勝手がわかってきたので今回それをまとめて投稿してみたいと思います。


#コマンドの実行結果を変数に格納する
```ksh
RESULT=`echo "result"`
echo ${RESULT} # 「result」と出力される
```
「\`」でコマンドを挟むと変数に入れられるようになります。
「\`」はJIS配列互換キーボードでは＠＆Shift同時押しで出せます。
筆者はDBのselectコマンドなどと組み合わせて使うことが多いです。

#文字列のフォーマットを行い変数に格納する
```ksh
PRICE=`printf "This is %d yen." 500`
echo ${PRICE} # 「This is 500 yen.」と出力される
```
C言語のprintfはここから来たのでしょうか？
printf自体は文字を出力するコマンドですが、
前出の結果を変数に入れる書き方を使って
フォーマットした文字列を変数に入れています。

#YYYYMMDD_HHMMSSの文字列を作成（ファイル名などに）
```ksh
DATE_FOR_FNAME=$(TZ=UTC-9 date '+%Y%m%d_%H%M%S')
echo ${DATE_FOR_FNAME} # 20210926_183020などと出力
```
キモはdate '+%Y%m%d_%H%M%S'です。
このコマンドで日付を指定フォーマットの形で出力しています。
その前のTZはタイムゾーンの指定です。

#特定プロセスの生き死にの確認
```ksh
ps -aux | grep [プロセス名]
```
psはDockerにも同名のコマンドがありますね。

#特定プロセスの消費メモリを一定時間ごとにファイルに出力
```ksh
top -d [更新間隔(秒)] | grep [プロセス名] >> [出力ファイルパス] 
```
dオプションを付けた場合、Ctrl+Cでコマンドを終わらせるまで動き続けます。

#画面とファイル両方に出力
```ksh
コマンド | tee [出力ファイルパス] 
```
teeコマンドをパイプ（|）でつなげます。
teeの後に-aオプションをつけると、上書きモードから追記モードになります。

#バックグラウンドで、かつターミナルを終了してもコマンドを終了させずに動かす
```ksh
nohup コマンド >ログファイル名 & 
```
「\>ログファイル名」は省略可能です（その場合、出力はnohup.outというファイルに書き込まれる）。
前半のバックグラウンドでというのを&が担当し、
ターミナルを終了してもコマンドを終了させずに動かすという部分をnohupが担当しています。
通常はコマンドを実行して終わるまでターミナルを起動したままにしておかなくてはならないのですが、
このコマンドを使うことで、実行後は放っておくことができます。
処理に時間がかかるスクリプトなどを呼び出すときに利用しています。
bindとthis

bindとthisに関して勉強した自分の備忘禄。

関数内関数で外側にあるidを内側にあるthisで使いたい時に
bindしたいが、その書き方にちょっと詰まって書いたのがこれ。

show.bind(this)()で出来ました。

```javascript
let Outer = {
    id: 'mk1000',
    show: function(){
        console.log(this.id);
        let show = function(){
            console.log(this.id);
        }
        show.bind(this)();
    }
}
Outer.show();
```

アロー関数でも同じことができるのか...

```javascript
let Outer = {
    id: 'mk1000',
    show: function(){
        console.log(this.id);
        let show = () => {
            console.log(this.id);
        }
        show();
        //show.bind(this)();
    }
}
Outer.show();
```
Node.jsとMongoDBで作られたサンプルアプリを動かす


#はじめに
本記事は以下チュートリアルを補足したものです。
チュートリアルを進める上で嵌った個所などについて補足してみました。


https://docs.microsoft.com/ja-jp/azure/developer/javascript/how-to/with-visual-studio-code/install-run-debug-nodejs

最終的にローカルで動作するTODOアプリが出来ます。↓
![Node_Angular-Todo-App-Google-Chrome-2021-09-26-18-10-20.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2087075/f8c037b5-186b-2c18-107d-c6aceaff5f1a.gif)


#環境
Windows 10 Home

#前提
以下がインストール済みであること。
git version 2.14.1.windows.1
nodejs v14.15.4
Docker Desktop 20.10.7
MongoDB Compass 1.28.4
Visual Studio Code

#MongoDBコンテナ作成
コマンドを実行し、MongoDBのDockerイメージを取得します。

```
docker pull mongo
```

Docker Desktopを起動し、images > RUNを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2087075/e488d7ce-3d5a-9df8-e2cd-8cb644eaa789.png)

Container NameとPortsを入力し、Runを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2087075/497004a1-92de-7a66-9773-991d0aff1726.png)

MongoDB Compassで接続に成功することを確認します。

```
mongodb://127.0.0.1:27017/
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2087075/4ebb9f4d-02f3-55c9-a9f5-d24a08054e7d.png)


#サンプルコードのダウンロードと実行
1. Visual Studio Codeを開きます。
1. **F1** キーを押してコマンド パレットを表示します。
1. コマンド パレットのプロンプトに```gitcl```と入力し、**Git: Clone** コマンドを選択して、**Enter** キーを押します。
1. **リポジトリの URL** の入力を求められたら、```https://github.com/scotch-io/node-todo```と入力し、**Enter** キーを押します。
1. プロジェクトの複製先となるローカル ディレクトリを選択 (または作成) します。
1. **Ctrl+`** キーを押して Visual Studio Code の統合ターミナルを表示します。
1. ```npm install -g```と入力し、**Enter**を押します。
1. server.jsを開き、12行目の```mongoose.connect(database.localUrl);```の**localUrl**にマウスカーソルを合わせ、**Ctrl+Shift+F12** キーを押します。
1. localUrlを次のように変更します。```localUrl: 'mongodb://127.0.0.1:27017'```
1. server.jsのタブがアクティブになっている状態で**F5** キーを押下します。
1. Node.jsを選択します。<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2087075/35e2026c-dd86-0253-e183-a3a920a75b14.png)


#動作確認
ブラウザを開いて ```http://localhost:8080``` に移動し、エラーなくアプリが表示されることを確認します。


#おわりに
おわりです。
workona有料化がついにきたので無料でも探してみた

# そもそもworkonaってなに？

https://workona.com/

Google Chromeの拡張機能で複数あるタブやウィンドウの管理をしてくれます。
これが意外と便利で10個以上ウィンドウを開きっぱなしにしてしまう私には重宝していました。
1ウィンドウあたり5~10個のタブを開いて、放置（あとで詳しく読もうとして放置的なアレ）

こんな使い方をすればメモリは圧迫するわけでとあるひworkonaを入れるとウィンドウの数がスッキリ！
結果的にまぁワークスペース（ウィンドウの数だけ生成される）はこの通り（**ネーミングセンスの悪さ**）
~~4月から新社会人＆初一人暮らしなのでレシピをめっちゃ開きまくってローテーションしてます~~
![workona.com_0_117851920.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565925/42ee3742-ed97-1929-1e68-066d35aa8925.png)


# 有料化が10月に...
実は3~4日前くらいからいきなり有料化されてたみたいなんですが、どうやら延期されたよう（よっぽど愛用者が多かったんでしょうね）

https://workona.com/blog/update-to-premium-plans/

> To make this right, we’ve taken the following steps:
> 1. We pushed the launch of our Free plan restrictions back to October 6th to allow you time to plan & adjust. You can do everything you’re accustomed to, including creating new workspaces, until that time.
> 2. For those who’ve already upgraded, we’ve issued a prorated account credit for the time between Sep. 21st and Oct. 6th.


延期はされたもののそのうち新しくワークスペースが作れなくなるので、サブスク登録するかは検討中
ちなみに無料プランのワークスペースは5個までのようで、これだとworkona使うよりウィンドウ５個開いてる方がマシなのでは？というレベル
![workona.com_pricing_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565925/7166d801-ef61-0f08-9e0b-920e5553539c.png)


~~正直Collaboration機能は要らないなと((ry~~

そういえばこういうプランでワンコインで収まるようなものは少ないイメージ($7~くらいが多いような？）
手数料とかを考えるとそんな感じに落ち着くんでしょうかね。。。。

# 代替手段がありそう？
無料でいい感じのないかなーって探してみました。
### 1つ目はTab Session Manager
workonaに比べるとスマートな見た目

右上のアイコンからクリックして管理する感じなので、設定を弄ったりショートカット登録すれば中々良さそう。
ページでの管理もできるけど、お手軽にアクセスすることを考えるとショートカット登録かな？
ちなみに保存はウィンドウ毎ではなく、現在開いているウィンドウ全てで一つの管理になってるので、人によっては選り好みはあるかも
![スクリーンショット 2021-09-26 17.56.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565925/60bf5454-7106-9c72-2d84-52dfa79842f2.png)

ウィンドウが開いた状態でさらに新しいウィンドウで開くと二重に開いて管理されるのでちょっと癖はあるかも。
workonaがいかに便利か物語っているとも言えますね。
https://chrome.google.com/webstore/detail/tab-session-manager/iaiomicjabeggjcfkbimgmglanimpnae

### ２つ目はToby
Tobyは新しいタブの画面で管理する模様
新しいタブはSpeed Dial 2でよく行くサイトの管理をしている私にはどっちを取るかの選択肢になっちゃう。
こっちは１つのウィンドウのタブを一気に保存できて、タブの並び替えとかを簡単にできる感じ
まだ色々機能はありそうなもののサインアップしないと使えないことが多そうなので、またゆっくり試してみます。
![chrome-extension___hddnkoipeenegfoeaoibdmnaalmgkpip_toby.html.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565925/4c084d7b-1778-041a-4a8b-eae2746f38f1.png)

https://chrome.google.com/webstore/detail/toby-for-chrome/hddnkoipeenegfoeaoibdmnaalmgkpip

# まとめ
workona結構気に入ってたんですが、月$7~9でワークスペース無限....
正直非常に悩みます。仕事で使うなら全力で購入してもらうんですが←

無料でも使える拡張機能は色々ありそうなので、無料プランを選ぶなら自分に合うものを探していきたいなと思いつつ、
workonaの便利さをbeta版から味わってきたので、お布施しちゃうかもですね。

他に便利そうな拡張機能があれば教えてくださるとありがたいです！
Kerasでのモデル可視化

Kerasでのモデル可視化方法は、.summary()とplot_modelを使用する方法の2種類がある。それぞれ使用した結果を比較する。

### .summary
まずは、.summary()を試してみる。

```
print(model.summary())
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/1a0af906-9529-0493-7786-2b4abb08406e.png)

### plot_model
次に、plot_modelを試してみる。

```
from tensorflow.keras.utils import plot_model
plot_model(model, show_shapes = True, expand_nested = True, to_file='model.png')
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/d6cd8000-db1f-4018-4562-c4692908d897.png)

### 結果
plot_modelは図示されるので見やすい。一方で、plot_modelのほうではパラメータの数が見えない。Tensorflowの公式ドキュメントを見ても、表示させるための引数は無さそう。
https://www.tensorflow.org/api_docs/python/tf/keras/utils/plot_model
RubyとPythonの基本構文の違い【配列編】


## Rubyでは配列末尾への追加を << で行うことができる

__Ruby__

```rb:sample.rb
# 配列末尾への追加
a = [1, 2]
a << 3
p a # -> [1, 2, 3]
```


__Python__

```py:sample.py
# 配列末尾への追加
a = [1, 2]
a.append(3)
print(a) # -> [1, 2, 3]
```

## Rubyでは多重代入の際に、変数の数と配列の要素数が異なってもエラーが起こらない
Pythonの場合、変数の数と配列の数が同じでないと、エラーが起こります。

配列の要素数が変数の数より多い場合、Rubyでは超えた分の配列の要素は無視されます。
__Ruby__

```rb:sample.rb
a, b = [1, 2, 3]
p(a) # -> 1
p(b) # -> 2
```


__Python__

```py:sample.py
a, b = [1, 2, 3]  # -> ValueError: too many values to unpack (expected 2)
print(a)
print(b)
```


配列の要素数が変数の数より少ない場合、Rubyでは足りない分nilで埋められます。
__Ruby__

```rb:sample.rb
a, b = [1]
p(a) # -> 1
p(b) # -> nil
```


__Python__

```py:sample.py
a, b = [1]  # -> ValueError: not enough values to unpack (expected 2, got 1)
print(a)
print(b)
```

## 配列のX番目からY番目を取得する方法
Rubyでは`list[X...Y]`, `list[X, 取得する要素数]`で取得できます。
Pythonでは`list[X:Y]`です。

__Ruby list[X...Y] Y番目を含まない__

```rb:sample.rb
numbers = [1, 2, 3, 4, 5, 6]
print(numbers[1...4]) # > [2, 3, 4]
```

またlist[X..Y]ではY番目を含んで取得できます。
__Ruby list[X..Y] Y番目を含む__

```rb:sample.rb
numbers = [1, 2, 3, 4, 5, 6]
print(numbers[1..4]) # > [2, 3, 4, 5]
```

__Ruby list[X, 取得する要素数]__

```rb:sample.rb
numbers = [1, 2, 3, 4, 5, 6]
print(numbers[1, 3]) # > [2, 3, 4]
```


__Python__

```py:sample.py
numbers = [1, 2, 3, 4, 5, 6]
print(numbers[1:4]) # > [2, 3, 4]
```
ポートを使用しているプロセス

# 指定したポートを使用しているプロセスを探す
いつも、ちまちまとコマンドを打っていたけど、さすがに面倒くさくなったので、普段使っている「現在使用されているポート一覧」を表示する自作コマンドに、パラメータでポート番号を与えるとそのポートを使用しているプロセスを表示するようにアップデート。

うん、かなり楽になった。

```bash
#!/usr/bin/env bash

PATH=/bin:/usr/bin:/sbin:/usr/sbin

OPT=$1

NETSTAT=`which netstat`
if [ -z ${NETSTAT} ]; then
  echo "Can't execute netstat command."
  exit 1
fi

if [ "$OPT" = "" ]; then
  case "${OSTYPE}" in
  darwin*)
    PORTLIST=(`netstat -an | grep 'LISTEN ' | awk 'match($4, /[\:\.][0-9]*$/) {print substr($4, RSTART+1, RLENGTH)}' | sort -nu`)
    ;;
  linux*)
    PORTLIST=(`netstat -an | grep 'LISTEN ' | awk '{print $4}' | grep '^[0-9:]' | sed -e 's/.*://' | sort -n | uniq`)
    ;;
  esac
  for p in ${PORTLIST[@]}; do
    echo $p
  done
else
  ps ax | grep `lsof -ni :$OPT | grep LISTEN | awk '{print $2}'`
fi
```
【Jest】イコールの評価しよう〜toBe関数とtoEqual関数の違い〜

# はじめに
テストの評価には```expect```関数を利用します。イコールの評価には、```toBe関数```と```toEqual関数```を使用します。```toBe関数```と```toEqual関数```を普段使ってましたが、違いがあることに学んでて知りました。違いについてもまとめたいと思います。

## expect関数

* Jestを使用する際は、expect関数はグローバル関数になるため、importをする必要はない
* [公式ドキュメント　Expect](https://jestjs.io/docs/expect)

## ```toBe関数```と```toEqual関数```
* どちらも値がイコールか比較する際に使用する
* ```toBeはインタンスの参照まで確認する```

```javascript:food.test.js
const food1 = {
  type: "yakiniku",
  price: 300,
};
const food2 = {
  type: "yakiniku",
  price: 300,
};

const food3 = food2;

test("have all the same properties -- ①", () => {
  expect(food1).toEqual(food2);
});

test("are not the exact same food -- ②", () => {
  expect(food1).not.toBe(food2);
});

test("are the same references -- ③", () => {
  expect(food2).toBe(food3);
});

test("are the same value -- ④", () => {
  expect(food1.price).toBe(food2.price);
  expect(food1.price).toEqual(food2.price);
});
```

```sh:実行結果
$ npx jest food.test.js
 PASS  src/food.test.js
  ✓ have all the same properties -- ① (2 ms)
  ✓ are not the exact same food -- ②
  ✓ are the same references -- ③
  ✓ are the same value -- ④

Test Suites: 1 passed, 1 total
Tests:       4 passed, 4 total
Snapshots:   0 total
Time:        0.383 s, estimated 1 s
Ran all test suites matching /food.test.js/i.
```

①　```toEqual関数```は、同じプロパティ、同じ値が同じため、イコールになります。
②　```toBe関数```を利用して比較しているため、同じプロパティ、同じ値でも異なるインスタンスのためnotになります。
③　food2とfood3は同じ参照をもっているため、イコールになります。
④ food1とfood2のpriceを比較しています。こちらはプリミティブな値のため、```toBe関数```と```toEqual関数```両方ともイコールになります。


## 注意点

* ```toEqual関数```は、異なる２つのクラスのインスタンスが全く同じプロパティをもつ場合、イコールの結果になります。

```javascript:assertion.test.js
test("toEqualは、全く同じプロパティをもつとイコールと判定される", () => {
  class Hoge {
    constructor() {
      this.message = "hello";
    }
  }

  class Hogehoge extends Hoge {
    constructor() {
      super();
    }
  }

  const hoge = new Hoge();
  const hogehoge = new Hogehoge();

  // 全く同じプロパティをもつためイコールと判定される
  expect(hoge).toEqual(hogehoge);

  // クラス名を評価した場合は、異なると評価される
  expect(hoge.constructor.name).not.toEqual(hogehoge.constructor.name);
});
```

```sh:実行結果
$ npm test /Users/jest-basic/src/assertion.test.js

> jest-basic@1.0.0 test /Users/jest-basic
> jest "/Users/jest-basic/src/assertion.test.js"

 PASS  src/assertion.test.js
  ✓ toEqualは、全く同じプロパティをもつとイコールと判定される (4 ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        0.594 s, estimated 1 s
Ran all test suites matching 
```
ModuleNotFoundError: No module named 'allauthlogin' が出た

>
ModuleNotFoundError: No module named 'allauthlogin'

settings.py のINSTALLED_APPSで以下のようなコードを書いていたら、`python manage.py makemigrations` で上のようなエラーが発生した。

```python3:setting.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    """allauth"""
    'login.apps.LoginConfig',#login app
    'django.contrib.sites', #for djnago-allauth
    'allauth', #for djnago-allauth
    'allauth.account', #for djnago-allauth
    'allauth.socialaccount',#for djnago-allauth
]
```

リストの中で`"""〜"""`のコメントアウトは使えないみたい、、
それを消したらエラーなく動くようになった。
python初学者の備忘録　文字列のフォーマット：printf形式 %演算子

#### [←目次へ](https://qiita.com/dondondon/items/cd45224ca93e65c976cc)

:::note info
python,Qiita初心者なので、備忘録として記載していきます。
なにせ初心者なので、知識不足はご容赦ください。
知識を深めながら追記していきたいと思います。
:::

# printf形式でのフォーマット

`基本`

+ 変換指定子を含む文字列　% 値
+ 変換指定子を含む文字列　% (値1,値2,...)
+ 変換指定子を組み合わせて使用する

### -- 変換指定子の詳細 --

#### ※ -- 省略可 --
##### 　1.(マップキー)
##### 　2.変換フラグ

| 変換フラグ | 説明 |
|:-:|:-:|
|"#"|値の変換に (下で定義されている) "別の形式" を使う|
|"0"|数値型に対してゼロによるパディングを行う|
|"-"|変換された値を左寄せにする ("0"と同時に与えた場合、"0"を上書きする|
|" "|(スペース)符号付きの変換で正の数の場合、前に一つスペースを空ける(そうでない場合は空文字になる)|
|"+"|変換の先頭に符号文字('+'または'-')を付ける("スペース"フラグを上書きする|

##### 　3.最小フィールド幅

　　・ 確保される桁数を指定
　　・ "*" を指定した場合、確保される桁数を値の方で指定することができる

##### 　4.精度

　　・小数点以下の桁数を指定(デフォルトでは6桁)
　　・指定する場合は桁数の前に.(ドット)を付ける

##### 　5.精度長変換子

　　・Pythonでは必要ないため無視される

#### ※ -- 必須 -- 

##### 　6.変換型

|変換型|説明|
|:-:|:--|
|"d"|符号付き10進整数|
|"i"|符号付き10進整数|
|"o"|符号付き8進数|
|"u"|旧式の型 -- 'd' と同じ|
|"x"|符号付き16進数(小文字)|
|"X"|符号付き16進数(大文字)|
|"e"|指数表記の浮動小数点数(小文字)|
|"E"|指数表記の浮動小数点数(大文字)|
|"f"|10進浮動小数点数|
|"F"|10進浮動小数点数|
|"g"|浮動小数点数。指数部が-4以上または精度以下の場合には小文字指数表記、それ以外の場合には10進表記|
|"G"|浮動小数点数。指数部が-4以上または精度以下の場合には大文字指数表記、それ以外の場合には10進表記|
|"c"|文字一文字(整数または一文字からなる文字列)|
|"r"|文字列(Python オブジェクトをrepr()で変換する)|
|"s"|文字列(Python オブジェクトをstr()で変換する)|
|"a"|文字列(Python オブジェクトをascii()で変換する)|
|"%"|引数を変換せず、返される文字列中では文字'%'になる|

##### 　-- 実行例 --

```python
# -- マップキー使用例 --
>>> "10進数=%(dec)d, 16進数=%(hex)x" % {"hex":255, "dec":255}
'10進数=255, 16進数=ff'

# -- 進数変換例 --
>>> "10進数=%d, 8進数=%o, 16進数=%x" % (255, 255, 255)
'10進数=255, 8進数=377, 16進数=ff'

# プレフィックスを付けたい場合
>>> "10進数=%#d, 8進数=%#o, 16進数=%#x" % (255, 255, 255)
'10進数=255, 8進数=0o377, 16進数=0xff'

# -- 浮動小数型変換例 --
>>> "指数表記=%e, 固定小数点表記=%f, 固定小数点表記桁指定=%.2f, 浮動小数点数=%g" % (0.0752, 0.0752, 0.0752, 0.0752) 
'指数表記=7.520000e-02, 固定小数点表記=0.075200, 固定小数点表記桁指定=0.08, 浮動小数点数=0.0752'

# -- 0埋め使用例 --
# 変換フラグ"0"を指定した場合指定フィールド幅(ここでは5)よりも数値の桁数が小さかった場合に"0"で埋める
# 左埋め
>>> "数値1=%05d" % 255
'数値1=00255'

# 右埋めは出来ない
>>> "数値1=%-05d" % 255
'数値1=255  '

# -- 空白埋め使用例 --
# 変換フラグ"-"を指定した場合指定フィールド幅(ここでは5)よりも数値の桁数が小さかった場合に空白で埋める
# 右寄せと左寄せ
>>> "数値1右寄せ=[%5d], 数値2左寄せ=[%-5d]" % (255, 255)
'数値1右寄せ=[  255], 数値2左寄せ=[255  ]'

# -- スペース --
>>> "数値1=%d, 数値2スペース=% d, 数値マイナススペース=% d" % (255, 255, -255)
'数値1=255, 数値2スペース= 255, 数値マイナススペース=-255'
#　※マイナス表記をするとスペースが詰められるので以下のようにする
>>> "数値1=%d, 数値2スペース=% d, 数値マイナススペース=%5d" % (255, 255, -255)
'数値1=255, 数値2スペース= 255, 数値マイナススペース= -255'
JavaFx使ってみた～初級編～

### はじめに

Javaで簡単にGUI作成したいなって思ったことがあった。。

JavaでのGUI作成はSwingとかAWTとかJavaFxがあるみたいだが、
Java8以降はSwingよりもJavaFxだぜ的な記載ｍの見かけたので、最近はJavaFxなんだろうと思う。笑

筆者は安易なので、最近の流れにそってJavaFxを使用します！笑

今回はJavaFxをインストール～簡単なGUI作成(Hello World!!)までの初級編として執筆する。

### 必要なもの

- eclipse
- Scene Builder
- JavaFxSDK


### インストール

まずは、eclipseのマーケットプレースから`e(fx)clipse`をインストール。
![WS000000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250217/92d5ae8b-9fdb-2e70-330f-0766ae3fb433.jpeg)

eclipseの再起動を促されるので従って再起動。

続いて、`Scene Builder`も使用するので下記サイトからダウンロード

[Scene Builder](https://gluonhq.com/products/scene-builder/)

eclipseの設定 > JAVAFX
から実行可能ファイルに`Scene Builder`のexeファイルを設定
![WS000001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250217/90757b7d-5715-c544-2fd3-d98147f209fd.jpeg)

Java9以降はデフォルトでJavaFxが入っていないのでSDKを下記サイトからダウンロード

[JavaFxSDK](https://gluonhq.com/products/javafx/)


### 環境変数の設定

以下の変数を追加する。

```
JAVAFX_HOME = JavaFxSDKのインストールディレクトリ\lib
path = JavaFxSDKのインストールディレクトリ\bin
```

### JAVAFXプロジェクトを作成

新規作成からJAVAFXプロジェクトを作成

![WS000002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250217/a7b3b757-0729-06db-9631-abaed6da9abf.jpeg)

![WS000003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250217/e96b30ce-40b2-3420-76dc-af7c42e6b97c.jpeg)

ビルドパスの構成から
`JavaFxSDKのインストールディレクトリ\lib`配下のjar群をclasspathに追加する。

### 実装

`Sample.fxml`を`Scene Builder`で開く

![WS000004.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250217/6cf28172-992e-2106-d66b-ec998cd1f98a.jpeg)

好きなようにコンポーネントを配置する。

![WS000005.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250217/0cc74e6c-c500-7487-2a46-00ba4e84d91b.jpeg)

コンポーネントを配置したら、
右側のパネルの以下の項目を設定する。
`fixid` →　コンポーネントを.javaで扱う際の変数名
`on Action` → ボタン要素などのクリック時に動作する関数名

![WS000010.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250217/d453f837-7986-ca00-fd91-9bf65d5ab56a.jpeg)

eclipseで`SampleControloler.java`を実装する。

```java:SampleController.java

package application;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TitledPane;

public class SampleController {
	@FXML
	private Button ButtonSample1; // fixidに入力した変数名
	@FXML
	private Label labelSample1;
	@FXML
	private TitledPane titlePane;

	@FXML
	// onAcrtionに記述した関数名
	public void clickBtn(ActionEvent e) {
		labelSample1.setText("Hello JavaFx!");
	}
}


```

### 実行

`main.java`をアプリケーションとして実行！

![WS000007.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250217/234c729e-0910-e52f-4659-e8e74f6637a6.jpeg)

![WS000008.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250217/da094c51-178c-2cf4-5848-4cf34e4f86a9.jpeg)

### おわりに

JavaFxはOpenJDKに標準搭載されていないなど、意外と不便な点も多く感じた。。。

コンポーネントを置くのもなれないとどんなコンポーネントが置かれるのかわからないため、もっと勉強が必要だと感じた。。

なにより、別個でダウンロードしたSDKにpath通すとかある程度プログラミングできて勘の鋭い人じゃないとできないだろう…(知らんけど…)

なんだかんだで環境構築～Hello World!!でおおよそ2時間くらいかかった。。

疲れたから終了で…(*´Д｀)
MiMC

高価な $F_q$ 上での掛け算の数を少なくすることによって高速化する。

具体的には、SPN構造で使われる、S-Box による Substitute 部分をなくし、round 関数を、体上での多項式を使った計算 $F(x) = x^3$ にする。

Knudsen-Nyberg cipher をベースにして作られている。

## MiMC-b/k

$MiMC-b/k$ は、ブロックサイズが $b$ で、キーのサイズが $k$ の MiMC という意味。

## 計算
### 言葉での説明
#### 各ラウンドでの処理

1. 初回であれば入力の $x$、そうでなければ前回の計算結果に、キー $k$ を足す
1. ラウンド定数 $c_i \in F_q$ を足す（はじめと終わりは $0$。それ以外は $F_q$ からランダムに選択する）
1. 結果を $3$ 乗する。

#### 最終処理
最後のラウンドの結果に、再度キー $k$ を足す。

### 数式での説明
$F_i(x) = F(x \oplus k \oplus c_i )$ where $c_0 = c_r = 0$
$MiMC-n/n(x) = (F_{r-1} \circ F_{r-2} \circ \; ... \; F_0)(x) \oplus k$

## ラウンド定数
事前に決定したものを使いまわして問題ない。例えば、暗号化コードに埋め込んで全ての入力に対して同じ定数のセットを使っても構わない。

## 必要なラウンド数
- $MiMC-n/n$ で、体が $F_2^n$ の場合
$n$ を奇数として、$\lceil \frac{n}{log_2 3} \rceil$

- $MiMC-n/n$ で、体が $F_p$（$p$ は素数）の場合
$\lceil \frac{log_p}{log_2 3} \rceil$

## 体が素数ベースの場合の注意点
ラウンド関数で、$x^3$ が permutation を作ることを確実にするために、$gcd(3, p-1)=1$ となるような $p$ を選ぶ。

## 参考サイト
https://eprint.iacr.org/2016/492.pdf
https://tidsskrift.dk/daimipb/article/view/6946/5908
Python初学者がはじめにやったこと

# 環境づくりから、基本的な文法を学ぶまで
## はじめに
Pythonを学習するために、自分が使った環境・情報などをまとめました。
今回の内容は、**Python3エンジニア認定基礎試験**に合格するところまでとなります。
（本記事は詳細を含みません）

## 経緯
40年近く前、専門学校でBASIC,FORTRAN等の当時の筆頭言語を習いました。
卒検作成には、入学する時に買ってもらった８ビットパソコンでBASICとマシン語を使いおもちゃのロボットを動かそうとしましたが、何度も暴走させてしまい、自分が目標としていたモノは出来ませんでした。
また、現職はプログラミングとは異なる業務です。
PythonはBASICと同様、インタープリター言語は習得しやすく、環境も容易に構築できるので、改めプログラミングの出直し学習をはじめた次第です。

## 記事概要
- 機材
- 環境
- 教材
- 手順

### PC

- WindowsPC: Lenovo ThinkPad L580
- Linux PC: Lenovo IdeaPad 120i  
 （どちらか、一台あればOK）

### 環境
- 上記PC（Windows10、Linux(ubuntu20.04)）
  - VS Code（MS VisualStudio Code）
  - Jupyter Notebook
  - Anaconda（Linux機には未インストール）  

- インターネット環境

### 教材
- 書籍
  - 真剣に学ぶPythonの基礎（Amazon電子書籍）
  - はじめてのPython問題集130問（ 〃 ）
  - Pythonチュートリアル 第4版

- 動画
  - プログラミング言語 Python3入門（Udemy）
  - [Visual Studio Codeの使いかた解説！Pythonを動かすのもかんたん♪-超入門編-](https://www.youtube.com/watch?v=Qdgwaz3bKx4)
  - [【超入門!!】Jupyter Notebookの使いかた♪-Pythonの始め方②-](https://www.youtube.com/watch?v=yckLbh1i4_k&t=84s)

- サイト
  - [Python初心者によるPython3エンジニア認定基礎試験の勉強方法（2020年8月合格）](https://qiita.com/gomasa/items/a0c91cea24f41fd63c1c)
  - [Python3エンジニア認定基礎試験の効率的な勉強方法!](https://ccie-go.com/python-exam-study/) 
  - [DIVE INTO EXAM(模擬試験)](https://diver.diveintocode.jp/dive_into_exam/lp)

## 手順

1. まず、Pythonを動作させる
  1. Python3をPCにインストールする
  1. 初心者向けの本で紹介されているコードを入力する  

1. 次に、学習しやすい環境を整える
  1. Jupyter Notebook をインストールする
  1. Anacondaをインストールする
    （基礎試験の範囲ではAnacondaインストールは未実施でした）

1. 問題集を解く
  1. 一問一答形式でプログラムを作成する
  1. 模擬試験を解く  
     解けなかったり間違えたりした問題は、Jupyter Notebookを使い、どう間違えたか、また解決・理解するために使用したサイトと自分のコメントをマークダウンにて付け加え復習を容易にしました。

## 最後に
問題解決に使用したサイトは他にもありますが、上記が主たるソリューションです。

冒頭記載の基礎認定は合格（業務の合間と休暇の半分程度を学習に費やし、期間は4ヶ月程度）。
これだけやれば合格できると思いますが、会社から研修許可をもらったのでオンラインの対策コース（1日）を受講しました。

これからも、学習を継続しプログラムが作れるようになりたいと考えています。
flask_loginを使う際の要点

flask_loginはログインが必要なページを @login_requiredデコレーターで簡単に管理することができる便利なライブラリです。要点を備忘録として記載します。

##LoginManager
login_manager = LoginManager()とすることで、flask-loginライブラリとアプリケーションを協調させて動作させることができる

##login_manager.init_app(アプリケーション名)
アプリケーションとFlask-Loginを連携させるコード。
またflask-loginはセッションを利用するから、シークレットキーを設定する必要がある。
そうしないと、Flaskからエラーメッセージが表示される。

##＠login_manager.user_loader
例）def load_user(user_id):
　　　　　return User.get(user_id)

＠login_manager.user_loaderは、セッションに保存された、ログインしたユーザーを返すためのコード。
UnicodeIDを取得し、対応するユーザーオブジェクトを返す必要がある。
IDが有効でない場合は、None（例外を発生させない）を返す。

##重要なプロパティ
・is_authenticated：ユーザーの認証されているかの確認
・is_active：ユーザーがアクティブかどうかの確認

##flask.flash
ログインできた場合に表示する

##@login_required
ユーザーがログインしていなければ実行されない

##flask.request.args.get('next’)
flask_login.login_urlを使用してログイン後の次のリダイレクト先が指定されていた場合にはそのURLへ、そうでない場合は指定した他のページへリダイレクトする、という処理。
next は url の一部みたいなもの。
その url は flask_login.login_url で作られて、nextでそれを指定することができるということ。

##login_manager.login_view = "users.login"
上記の書き方をすることが多いため、このように書いています。
デフォルトでは、ユーザーがログインせずに@login_requiredデコレータのビューにアクセスしようとすると、Flask-Loginはメッセージをフラッシュし、ログインビューにリダイレクトする。 


##まとめ
flask_loginはわかってしまえば簡単ですが、所々複雑な点もあると思う。
一緒に頑張りましょ
状態を持つクラスのメソッドでyield returnした時にはまった現象

# 現象
こういうクラスを作った。

```c#
class Foo
{
    int[] _array;
    int _pos;

    public Foo(int[] array) => _array = array;

    public IEnumerable<int> Yield()
    {
        while (_pos < _array.Length)
            yield return _array[_pos++];
    }
}
```

中身を出力してみた。

```c#
static void Main(string[] args)
{
    var foo = new Foo(new int[] { 0, 1, 2, 3, 4, 5 });
    var a = foo.Yield();
    if (!a.Any())
        return;
    // "012345"が出力されてほしいのに
    foreach (var x in a)
        Console.WriteLine(x);
    // ⇒ "12345"
}
```
`0`が消失した。
# 原因

`if (!a.Any())`を呼んだ時点で`_pos`がインクリメントされてしまっているため、そのあとの`foreach`では`0`が出力されなくなってしまう。
ちなみに、以下のようにすると`Any()`をしても1回目の`yield`の時点で止まるので`_pos`は変わらず、foreach`で`0`が出力されるようになる。

```c#
class Foo
{
    int[] _array;
    int _pos;

    public Foo(int[] array) => _array = array;

    public IEnumerable<int> Yield()
    {
        while (_pos < _array.Length)
        {
            yield return _array[_pos];
            // インクリメントを分ける
            _pos++;
        }
    }
}
```

これで元のコードは動くようになるものの、コメントをいただいた例のように、`if (!a.Any())`を`if (!a.Any(n => n == 5))`に置き換えると、再び思った出力が得られなくなる(今度は`5`だけが出力される)。

`Foo.Yield()`を呼ぶたびに`_pos`がリセットされるようになっていないのが根本的な原因。

# 考察
`yield return`を記述したメソッドは、コンパイラが生成したステートマシンに処理が移譲されるが、このステートマシンは`IEnumerable<T>`と`IEnumerator<T>`の両方を実装している。
ということは、このステートマシンが正しく`IEnumerator<T>`としての役割を果たすためには、`yield return`を記述したメソッド自身が呼び出された際のコンテキストを保存する(自らの数え上げを何度でも再現できる)ようになっている必要がある。
ところが今回、`Foo.Yield()`は`Foo._pos`を数え上げに使用してしてしまっているのでその条件を満たしていない。つまり`IEnumerator<T>`としての役割を果たしていないので予想していない挙動になった。
ということでしょうか...？
7行のコードだけでTwitterのアイコン画像を変えるプログラム＋自動更新もする

どうも。なんかTwitterをインタラクティブに活用したいなと思って**Twitterのユーザーアイコンを定期的に変更する**プログラムを作りました。

…と言っても既存にあるかもしれませんが調べるくらいなら書いたがいいだろって感じで**なるべく短く**PHPで書きました。

https://github.com/ichii731/php-examples/tree/main/Twitter_IconChange

※プログラムとか良く分からない人でも使えるよう配慮はしたつもりです。
## サンプルコード&設定手順
まず以下のリポジトリのReleaseから`Twitter_IconChange.zip`を落としてください。

https://github.com/ichii731/php-examples/releases/tag/3

次に**`composer install`**を実行してください。Compser環境必須。

DLしたら`.env.example`を`.env`にリネームして環境変数にTwitterの開発者キーをセットしてください。
CKにはAPI Key・CSにはAPI Secretのキーを入力、ATにはAccess Token・ATSにはAccess Token Secretをそれぞれ入力してください。
なお、**TwitterAPIのパーミッションをRead Only以外に設定しないと失敗します！**

```bash:.env
CK=""
CS=""
AT=""
ATS=""
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513165/cb04849f-0936-d86d-2e2f-9724945ca137.png)
そして、**`imgs/`**ディレクトリに変更したい画像を配置します。**２枚以上画像を配置すると自動でランダムにどの画像をセットするかを選んでくれます！**
あとは`change.php`を実行するだけ！簡単だと思います。

```bash
php change.php
```

これを定期実行する方法はコード解説の後に書いてます。
## コード解説
`change.php`のPHPコードは**ライブラリのおかげでたった８行**で構成されています。

```php:change.php
<?php
require('vendor/autoload.php');
use Abraham\TwitterOAuth\TwitterOAuth;
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();
$connection = new TwitterOAuth($_ENV['CK'], $_ENV['CS'], $_ENV['AT'], $_ENV['ATS']);
$img_arr = glob('imgs/*');
$connection->post('account/update_profile_image', ['image' => base64_encode(file_get_contents($img_arr[array_rand($img_arr, 1)]))]);
```

1・2行目でComposerから取ったパッケージを読み込みます。
3・4行目で環境設定ファイルの`.env`をphpdotenvっていうパッケージを使って読み込みます。
※なんで直接PHP上でセットしねぇんだよと思うかもしれませんがプログラムわからない人でも使えるようにしたかったからです…(でも結局いらなかったな)
５行目でTwitterOauthに認証を通すためのインスタンスを作成
６行目でimgsディレクトリ内の画像のパスを配列取得・７行目で`account/update_profile_image`エンドポイントに画像をぶん投げます。以上！
### ハマったポイント
最初、単純にpost送信してたのだがうまくいかない…
う～んと悩みまくって10分。**twitteroauthのIssueにbase64でエンコードしろと書いてありました。**やはりGithub偉大なり

https://github.com/abraham/twitteroauth/issues/361

```php
base64_encode(file_get_contents($img_dir));
```

## 自動的に更新させるには
自動でアイコン変更を行うにはやはり定期実行がベストでしょう。てかそれ以外無い。
**最近の若者はもうCronを使わない。時代はsystemd.timer**という話をどこかで聞いたことがあるので最近はより自由に設定できるのでそっちを使います。
※私は一応若者の部類です(18 year)
まずは以下の2ファイルを配置します。コードはさっきのリポジトリに同梱したのでコピペするだけでOK。

```systemd:/lib/systemd/system/changeicon.service
[Unit]
Description= ChangeIcon Service

[Service]
Type= oneshot
ExecStart= /usr/bin/php /<絶対パス>/change.php
```

```systemd:/lib/systemd/system/changeicon.timer
[Unit]
Description= changeicon timer

[Timer]
OnUnitActiveSec=6h
# 上記の例では6時間おきに実行する設定です！
[Install]
WantedBy=timers.target
```

あとはApacheを実行するかのようなノリで**`systemctl start changeicon.timer`**でタイマーを起動させれば勝手に指定したタイミングで自動実行してくれます！

---
以上是非参考にしてみてください。アイコンは全く違う物に変えると、誰だかわからなくなる可能性がありますので背景色を変えるくらいに下が良いと思います。
私のアカウントは**6時間ごとに全自動でアイコン背景色を変えてます**。ぜひ見てやってください。
![rapture_20210926060156.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513165/30f5dbdb-c598-ce92-12af-a0748b1bf6ad.png)

[Portfolioサイト](https://ic731.net) | **[Twitter @ichii731](https://twitter.com/ichii731)**
ドメイン駆動設計入門で学んだこと #3

# はじめに

本記事は以下の書籍を読んで学んだことをまとめることを目的としています。
[前回](https://qiita.com/minoura_a/items/5e0f66fc4c29a11ed35d)の続きです。
[ドメイン駆動設計入門 ボトムアップでわかる! ドメイン駆動設計の基本 | 成瀬 允宣 |本 | 通販 | Amazon](https://www.amazon.co.jp/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88%E5%85%A5%E9%96%80-%E3%83%9C%E3%83%88%E3%83%A0%E3%82%A2%E3%83%83%E3%83%97%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8B-%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88%E3%81%AE%E5%9F%BA%E6%9C%AC-%E6%88%90%E7%80%AC-%E5%85%81%E5%AE%A3/dp/479815072X/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=325IZJW8OL7R9&dchild=1&keywords=%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88&qid=1593219430&sprefix=%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3,aps,244&sr=8-1)

# リポジトリ

ドメインオブジェクトの永続化や再構築を行います。オブジェクトのインスタンスを保存・復元するときは、直接DBに対して操作を行うのではなく、リポジトリのインターフェースに依頼します。

## リポジトリを使用する理由

- ドメインオブジェクトがドメインを表現することに集中するため
- ソフトウェアに柔軟性を持たせるため
- テストを容易にするため

リポジトリは実現したいアプリケーションの概念に出てくるものではないですが、もしこれが無ければ、前回までで紹介した、ドメインオブジェクトやドメインサービスに、データの保存や復元のためのとあるDBの詳細で複雑な実装をが出てくることになります。ドメインに本質的に関係のない実装が増えることで、そのドメインの持つの意味や振る舞いが薄れ、DB操作の実装により、何をしているメソッドなのか理解するのに時間がかかり、可読性が落ちます。

また、インターフェースにすることにより、特定のDBや技術に依存せず開発がで、柔軟性が高まるというメリットがあります。さらに、インターフェースであることにより、モック化など置き換えが可能なため、テストがしやすいというメリットもあります。

# アプリケーションサービス

アプリケーションサービスとはドメインオブジェクトを使用して、ユースケースを実現するためのオブジェクトです。

## 実装上の工夫

### DTOを使う

ドメインオブジェクトを操作し、その結果オブジェクトをそのままクライアント側に返してしまうと、アプリケーションサービス以外からドメインオブジェクトのメソッド呼び出すという意図しない実装が起きる可能性が出てきます。
また、本来アプリケーションサービス1箇所に記述されるべきロジックが様々な箇所に散ってしまうので、DRY原則に反する可能性もあります。
そのため、筆者はDTO(Data Transfer Object)にデータを移し替えて、外部には必要なデータのみを公開するという方法をおすすめしていました。

### コマンドオブジェクトを使う

例えば、ユーザー情報を更新するというユースケースを考えます。最初はユーザー名しかユーザー情報がなかったため、ユーザー情報を更新するメソッドの引数はユーザー名のみでした。しかし、ほかにも住所やメールアドレスなどさまざまなユーザー情報が増えていくとすると、そのたびにメソッドの引数を増やすこととなり、シグネチャが変わります。
そのため、ユーザー情報を更新するメソッドは、直接更新したいユーザー情報を引数で受け取るのではなく、更新したいユーザー情報を持つコマンドオブジェクトを作成し、それを引数で受け取るようにすることで、メソッドのシグネチャが変更されないようにするという方法が紹介されていました。

## 実装上の注意

### ドメインロジックを書かないこと

例えばユーザー登録・更新の重複チェックはドメインサービスに任せるようにします。前回まででも言っているように、ドメインのルールはドメインオブジェクトに閉じ込めること同じようなロジックの点在を防ぐことができます。

### 凝集度を高めること

全てのメソッドが、全てのフィールドを使っている状態は「凝集度が高く」、コードの見通しが良くなります。一部のフィールドしか使っていないメソッドは、別クラスに切り出せる可能性があります。ただし、凝集度が絶対の指標ではなく、あくまでもコードを整理するための一つの指標であることを覚えておきましょう。

### インスタンスの状態によってふるまいを変えない

状態を一切持ってはいけないという意味ではなく、インスタンスの状態によってふるまいを変えないようにします。
状態によって振る舞いがかわると、実装者がサービスを使うときに、状態を気にしなければならず、複雑度が増してしまいます。

# さいごに

ここまでお読みいただき、ありがとうございました。
長くなるので、#4に続きます。
Shift-JIS のファイルを自動認識して、UTF-8 に変換する

#背景
VB.Net のソースをツールで変換するのに、UTF-8 と Shift-JIS のソースコードが混在していてわけわからなくなってきたので、エンコーディングを自動認識するコード変換ツールを作ってみました。
拡張子は、.vb 用になってますが、そのあたりは適当に。

#ソース
```c#
using System.Linq;

/// <summary>
/// エンコーディングを自動判定して、Shift-JIS のファイルを UTF-8 に変換します。
/// </summary>
/// <param name="folder">フォルダ名又は、ファイル名を指定します。</param>
private void Convert( string folder )
{
	foreach( var child in System.IO.Directory.GetDirectories( folder ) ) {
		this.Convert( child );
	}
	var sjis = System.Text.Encoding.GetEncoding( 932 );
	// var utf8 = System.Text.Encoding.UTF8; // BOM あり
    var utf8 = new System.Text.UTF8Encoding( false ); // BOM なし
    
	foreach( var filename in System.IO.Directory.GetFiles( folder, "*.vb" ) ) {
		var bytes = System.IO.File.ReadAllBytes( filename );
		var bytes_SJIS = sjis.GetBytes( sjis.GetString( bytes ) );
		var bytes_UTF8 = utf8.GetBytes( utf8.GetString( bytes ) );
		// Shift-JIS だと、正しく認識できて、UTF-8 だと正しく認識できていない場合に、UTF-8 で書き込む
		if( bytes.SequenceEqual( bytes_SJIS ) && !bytes.SequenceEqual( bytes_UTF8 ) ) {
			System.IO.File.WriteAllText( filename, sjis.GetString( bytes ), utf8 );
		}
	}
}
```

#動作原理
とりあえず、ファイルをバイナリで読み込んでみて、Shift-JIS と、UTF-8 の両方で文字列に変換します。
それを、再びバイト列に戻して元のバイト列に戻るかどうかで、エンコーディングを判断しています。
どちらでも正しく認識できるのは英数字のみの場合だと思われるので、Shift-JIS でのみ正しく認識できた場合に、utf8 で保存しています。

ログとか、バックアップファイルとかは面倒なんでとりあえず省略。
Next.jsで初期レンダリングの際のCSSが効かないときの対処法

以下のように初期レンダリングの際に一瞬CSSが当たらない問題をFOUCというそうです

> CSS @importルールを使用している一部のページでは、MS Internet ExplorerのWindows版で、スタイル化されていないページのコンテンツが一瞬フラッシュするという奇妙な表示の奇妙な現象が発生します。私はこの現象を「スタイル化されていないコンテンツのフラッシュ（Flash of Unstyled Content）」、略して「FOUC」と呼んでいます。

![FOUC.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660329/edf8c9bd-ab98-944d-5f1c-663e6a255838.gif)

まずやったこと

https://zenn.dev/catnose99/articles/3c106c81cbfdec

上記の記事を参考に

```_document.tsx
class MyDocument extends Document {
  render() {
    return (
      <Html lang="ja">
        <Head />
        <body>
          // ****追加****
          <script> </script>
          // ********
          <Main />
          <NextScript />
        </body>
      </Html>
    );
  }
} 
```

ただ自分の環境ではこれだけでは治りませんでした。

そこで`_app.tsx`でコンポーネントのマウントが完了したタイミング(useEffectが呼ばれる)ときにフラグをtrueにしてtrueのときにコンポーネントを表示させることでFOUCの問題は解決しました。

```_app.tsx
function MyApp({ Component, pageProps }: AppProps) {
  const [show_screen, setShowScreen] = useState(false)
  
  useEffect(() => {
    setShowScreen(true)
  }, [])

  return (
    <>
      {show_screen ? <>
        <GrobalStyle />
        <Header categories={categories} tags={tags} />
        <Component {...pageProps} />
        <Footer />
      </> : ''}
    </>
  )
}


export default MyApp

```
正規表現で覚えておくべき基礎知識

正規表現を使いこなす上で必須になってくる基礎知識についてまとめました。勉強にお役立てください。

##基礎知識
・デリミタ：最初と末尾の/

・正規表現の基本構文は以下
/正規表現パターン/修飾子

##独自の機能を持つ記号：メタ文字
 ・ワイルドカード(ピリオド、ドット) 

・= 一文字分を何でもカバー  

・[]　角かっこは一文字分の選択肢を設定

 ・ハイフン・・・角カッコの中で文字数字の範囲を指定する 

例)チーム[A-Za-z0-9] 上記の場合、チームに後に続く一文字がローマ字の大文字であっても小文字であっても、どんな数字であっても一致する
例2)[0-9][0-9] 上記では、二桁以上の数値に何でも一致

 ・キャレット(^)・・・角カッコの中で、直後の対象範囲を逆転させる。角カッコの外では、行頭であることを指定する。
 例)[^cd]ash
上記は、cd以外の一文字に一致
※先頭でしか使えない
例2)^ash

・\$・・・行末であることを指定する $と^の併用もできる。その場合は、行全体が指定の文字単独でなければ一致しない
・\ (バックスラッシュ)・・・直後のメタ文字を単なる文字として扱う(エスケープする)
\n・・・改行
\t・・・タブ
\d = [0-9] = 0から9までの数字
\D = [^0-9] = 上記以外全て
\w = [a-zA-Z0-9] = アルファベットと数字全て
\W = [^a-zA-Z0-9] = 上記以外全て
\s = [ \f \n \r \t] = スペース、改行、改ページ、タブ
\S = [^  \f \n \r \t] = 上記以外全て
\b = スペースや改行などの区切り
\B = 上記以外の区切り

##修飾子
・s(single line)：改行をワイルドカードの対象に含める 
・I：大文字と小文字の区別をなくす ・g：可能な限り多くを検出する
 ・m：複数行を対象にする 
・u：unicodeを正規表現パターンに含める

 ※正規表現はスペースも対象にする

##数量詞：パターンの直後に記述する
*(アスタリスク) = 0回以上 
+ = 1回以上 
? = 0回か1回
 例)flavou*r
 上記の場合は、uがなくても、10個以上あっても一致

##回数の指定
・{n} = n回の繰り返し 例) riki{4} 上記は、iの4回未満はヒットしない
・{n,} = n回以上の繰り返し
・{0,1} = 繰り返しの下限と上限の設定

##数量詞のデフォルト
最長一致 = 可能な限り範囲を広げる
最短一致 = 可能な限り範囲を狭くする = 数量詞の直後に?を記述

##丸括弧とパイプ
・() = 正規表現パターンをグループ化する
例) (xyz){2}
・| = 選択肢を設ける
例)red|white
例2) (red|white|black) team 例2は、red team、white team、black teamに一致 ※([])は使える。しかし、[()]はグループ化機能はなくなり単なる文字として扱われる。
 ※()はネストすることもできる。ネストとは二重にしたりできるということ。

##キャプチャ
\ + 1~9の数字で、既出の丸括弧を参照する
例) (ab)(cd)\1
上記はabcdabと一致
・キャプチャはhtmlタグとかと一致させるときとかにも便利
 
・vscodeとかのedit→replaceで正規表現を使うときは、\ + 1~9のところを$ + 1~9にする必要がある。若干書き方が変わるってこと。
・キャプチャの機能をなくすには、(?:〜〜〜)のように、()の先頭に?と:をつける

##アサーション
後読み = 直前またはすぐ左を調べる 
先読み = 直後またはすぐ右を調べる 

肯定先読み = 直後に「ある」かどうかを調べる
 否定先読み = 直後に「ない」かどうかを調べる   

先読みの例)
 ・/太郎(?=さん)/ 上記の場合、太郎さんならば一致 
否定先読みの例)
 ・/太郎(?!さん)/  
肯定後読みの例) 
・/(?<=山田)太郎 上記のように、後読みの場合は左向きの不等号が必要。

##まとめ
これだけ覚えておけばあとは応用を少し勉強するだけで正規表現は使いこなせます。
参考程度に。
データサイエンティスト検定を受けてみた。勉強法と感想（第1回：2021.09）

2021.09.25に第一回DS検定を受けてきました!
勉強した内容や、実際の受験内容とのギャップを書いていきたいと思います。

##・私の概略
機械学習の勉強を独学で1年ほど
G検定取得(2020.11)
IT業界未経験の社会人
データサイエンティストへの就職活動中



##・勉強した内容
全体の勉強期間は2週間程度です。

+ 対策講座「DS検定リテラシーレベル対応データサイエンティスト基礎講座」
https://www.skillupai.com/ds/
所要時間10時間。リンクから登録すると、YOUTUBEの限定公開のリンクが届きます（無料）。
分かりやすいんですが時間が結構かかるので、事前知識のある方はいらないかも。

+ 「最短突破　データサイエンティスト検定（リテラシーレベル）公式リファレンスブック」
https://www.amazon.co.jp/dp/B09F2PW92T/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1
所要時間8時間。分かりやすくまとまっていて良書でした。
後半に模擬問題が45問ついてます。公式だけあって、本番の問題ともかなり類似してました。

+ DS検定™リテラシーレベル対策アプリ
https://www.skillupai.com/ds-app/
所要時間3時間。本番と同じく90問を収録。本番の問題ともかなり類似してました。
1000円程かかりますが、使いやすいインターフェイスなので買ってよかったです。

上記3つを上からやってくのがオススメです。

##・受験した感想
公式本とAppの練習問題が8割解ければ受かるのではないかと思います。
ちなみに私は本番の正答率が87.7%でした。（試験後すぐに得点がわかります。結果発表は2ヶ月後だそうです）
練習問題を解いている時は7割くらいの正答率だったので、学習の成果ですね。

G検定が機械学習の「歴史・概略・最新動向」だったのに対して、DS検定は「統計・分析・ビジネス」と実務寄りになっていました。難易度としては最新動向などトリッキーな問題がない分、DS検定の方が難易度低い印象です。G検定は家で受験するので検索ができるという面はありますが。

今回勉強して、G検定とは別領域の基礎的な部分について幅広く学べたので、初学者としては有益だったと思います。
第2回は2022.03らしいので、気になる人は是非受けてみてください。
Salesforce いつも忘れちゃうことをまとめとく vol.2 ～ 基礎知識（Lightning と Classic）

# はじめに
- Salesforce は便利ですが、一度設定しても「あれ？どう設定したっけ？」と、覚えていたのに忘れてしまう…　そんな内容をまとめておきましょう。
- まずは、Salesforce の基礎的な部分を押さえておきたいと思います。

# Lightning と Classic について
Salesforce では、Lightning と Classic と言う2種類のユーザインターフェース(UI)が用意されています。

#### ■ Lightning
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309141/93285375-89c5-ee1b-beca-698011858978.png)

#### ■ Classic
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309141/8fdd73f5-1c6f-acb9-d679-67aed38a9b57.png)

## 切り替え
この2つの表示モードは、切り替えをすることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309141/cdc973f4-4f3f-7825-fdf9-6535cdfb4ec0.png)

#### ■ Lightning から Classic へ切り替えする。
1. 画面右上のユーザアイコンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309141/ee253de2-11df-27c4-f3c8-f7d73de157ec.png)

1. メニューが表示されるので、「Salesforce Classic に切り替え」リンクをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309141/7a713625-68ac-f9fb-771f-c5d89dac5cdd.png)


#### ■ Classic から Lightning へ切り替えする。
1. 画面上部の「Lightning Experience に切り替え」リンクをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309141/657c3035-1132-5309-1f0b-d82164a34efe.png)



## ログイン直後、どちらで表示されるの？
- ログイン直後、どちらで表示されるか、は【基本】その直前のログアウト時の表示モードが引き継がれます。
    - Lightning 表示状態でログアウト、再ログインすると Lightning で表示されます。
    - Classic 表示状態でログアウト、再ログインすると Classic で表示されます。


# 過去の記事
- Salesforce いつも忘れちゃうことをまとめとく vol.1 ～ 基礎知識（組織 と エディション と インスタンス）https://qiita.com/xx_mana/items/a6546d425e748fc5743b


# ご了承ください
- まだまだ勉強中の部分もあります。間違っている箇所もあるかもしれません。
- Salesforceは、この時点のバージョン(2021年8月～9月頃) での内容になります。今後、仕様変更が変わることによって、内容の通りにならない可能性もあります。ご了承ください。
 - また、URLなども変更になっている可能性もあります。
Salesforce いつも忘れちゃうことをまとめとく vol.1 ～ 基礎知識（組織 と エディション と インスタンス）

# はじめに
- Salesforce は便利ですが、一度設定しても「あれ？どう設定したっけ？」と、覚えていたのに忘れてしまう…　そんな内容をまとめておきましょう。
- まずは、Salesforce の基礎的な部分を押さえておきたいと思います。

# 組織 と エディション と インスタンス
- 組織は Salesforce の一つの環境のことを指します。
    - 組織には エディション と言った種類がいくつかあります。
        - https://help.salesforce.com/s/articleView?id=sf.overview_edition.htm&type=5 

    - 色々試すことができるのが「Developer Edition」です。以下から環境を取得できます。
        - https://developer.salesforce.com/jpblogs/2016/04/developer-edition-signup/

    - また、インスタンスという組織の領域の情報があります。
        - 利用の地域によって、自動的に割り振られます。
        - Salesforce Services
            - https://status.salesforce.com/products/Salesforce_Services

    - エディションやインスタンスは、以下から調べられます。
        - (Classic) [設定] > [管理] > [組織プロファイル] > [組織情報] の [組織のエディション]
        - (Lightning) [設定] > [設定] > [会社の設定] > [組織情報] の [組織のエディション]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309141/76d87dc0-94b9-e71f-80d1-99f3d4452c8e.png)


# ご了承ください
- まだまだ勉強中の部分もあります。間違っている箇所もあるかもしれません。
- Salesforceは、この時点のバージョン(2021年8月～9月頃) での内容になります。今後、仕様変更が変わることによって、内容の通りにならない可能性もあります。ご了承ください。
 - また、URLなども変更になっている可能性もあります。
Kubernetes完全ガイド 第2版 第3章まとめ

# K8s環境構築の選択肢

k8sクラスタ利用構築する環境によって手法が異なる

- ローカルk8s...ユーザーの手元のマシン1台にクラスタを構築・利用する。冗長性の担保はできないのでプロダクション利用には適さない。また、一部利用できない機能もある。
    - Minikube...シングルノード構成。ハイパーバイザー(仮想マシンを作成・実行するソフトウェア)が必要。
    - Docker Desktop...k8sのバージョン指定ができない。シングルクラスター、シングルノード構成。
    - kind...Dockerコンテナを複数起動し、各コンテナをk8s Nodeとすることで、複数台構成のクラスタを構築する。現在、ローカルでマルチノードクラスタを構築するならこれ。クラスタ構成は、YAMLで管理可能。クラスター構築時にはDocker Desktopが起動している必要がある。kindは内部的にkubeadmを使用している。YAMLにkubeadmのパッチを当て、FeatureGates(k8sの機能を有効化/無効化するための仕組み)の有効化を通して、アルファ機能の有効化も可能。
- k8s構築ツール...ツールを利用して、任意の環境に(オンプレミス/クラウド)にクラスタを構築・利用する。多くのマネージドサービスではk8s Masterのノードのスケールアップは自動で行われるが、ツールを用いる場合は、k8s Masterのインスタンスサイズを自分で設定する必要がある([k8s公式自動構築スクリプトのkube-upを使用してAWSやGCP上に構築する際に使用されるインスタンスサイズの目安が公開されている。](https://kubernetes.io/ja/docs/setup/best-practices/cluster-large/#%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E3%81%AE%E3%82%B5%E3%82%A4%E3%82%BA%E3%81%A8%E6%A7%8B%E6%88%90%E8%A6%81%E7%B4%A0))
    - kubeadm...k8s公式ツール。用意した各ノードに、Master/Worker Nodeのプロセスを稼働させるところまで。クラスタとして成立させるためには、異なるノードのPod同士で通信できる必要がある。(各ホストのInternal Netwotkの接続性を確保する必要)
        - Flannel...Pod間ネットワークを構成するための手段の一つ。ノード間のネットワークに仮想的なトンネル(オーバーレイネットワーク)を構成することで、クラスタ内のPod間通信を実現する。
    - Rancher...中央集権サーバーとしてRancher Serverを起動しておき、管理者はRancher Serverからクラスタの構築・管理を行う。クラウドプロバイダー環境上に構築する際も、APIを用いて仲介してくれる。k8sの構築・運用をサポートする様々な機能を備えている。
    - その他構築ツール...Ansibleを使ったKubespray、CloudFormationを使ったkube-aws、Terraform、kops、OpenStack Magnumなど。
    - その他エンタープライズソリューション...オンプレミスで強固なk8s環境を構築したいときは、Red Hat OpenShift Container Platform、VMware Enterprise PKS、IBMCloud Private(ICP)などがある。
- マネージドサービス...パブリッククラウド上のマネージドサービスとして提供されるクラスタを利用。永続化ボリュームや、ロードバランサーとの連携などの機能をフル活用することが可能。
    - GKE(Google Kubernetes Engine)...k8s NodeにはGCEを利用。
        - クラスタの運用負荷を下げる様々な機能がある。(リリースチャンネル、ノードの自動アップデート、ノードの自動修復、ノードの自動プロビジョニング機能(ノードのインスタンスタイプを自動的に決定してくれる))また、プリエンプティブルインスタンス(起動時間)を用いることで、コスト削減が可能。([Preemptible-killer](https://github.com/estafette/estafette-gke-preemptible-killer)の使用を要検討)
        - NodePool...k8sクラスタ内のノードに対してラベルづけしておくことで、グルーピングするような機能。現在は他のクラウドプロバイダにも存在する。
            - スケジューリングの際の制約条件にすることができる
            - ワークロードの混在を防げる
            - どういった種類のノードをどのくらいの数でクラスタを構成するかの制御ができる
    - AKS(Azure Kubernetes Service)
        - Azure Active Directoryをk8sロールベースのアクセス制御(RBAC)と連携できる。
        - AKSクラスタのリソース不足時に、ACI(Azure Container Instance)上にバースティングできる。
    - EKS(Elastic Kubernetes Service)...k8s NodeにはAMI(Amazon Machine Image)から作成したEC2インスタンスを利用。(カスタムAMIも利用可)
        - IAMとk8sのユーザーを紐づけることで、IAMベースで権限を管理できる。
        - PodのNetworkとAWS VPCのSubnetがネイテブ接続されることで、VMからコンテナに直接疎通可能なネットワーク構成が利用できる。
        - 運用負荷を下げるには、ワーカーノードの管理をAWSに任せるManaged Nodegroupsや、AWS Fargateをk8s Nodeとして利用するEKS on Fargateを利用する。

プリエンプティブルインスタンス...通常のGCEインスタンスの最大8割引のインスタンス。
- GCP側の都合で、いつでもVMが強制終了される可能性がある
- プリエンプティブVMは最大でも24時間で強制終了される

クラウドバースティング...コンピューティングリソースの需要が極端に高まったピーク時（バースト）に、処理をクラウド上のリソースに迅速に切り替えることを可能にするもの。
ffmpegで動画を高速化（早回し）する方法

```
ffmpeg -r 120 -i input.mp4 -r 30 out.mp4
```
一つ目の`-r 120`は入力のフレームレートの指定で、この値を増やすともっと高速になる。
二つ目の`-r 30`は出力のフレームレートで、Twitterは40以下に制限されているので30ぐらいにする。
AWS作業環境の構築

## 前置き
awscliでawsリソースをいじれる状態を作ります。
また、下記ページで自宅のwindowsPCの準備は完了している前提となります。

https://qiita.com/yamanashi7474/items/27beedec3c954e965f44

## AWSアカウントの取得
無料で作成できます。

### 初回ログインの注意点とアカウントIDの確認
ログインは`ルートユーザーの E メールを使用したサインイン`から入る

ログイン後、アカウントIDを確認しましょう
上部の黒いバーの右側にあるベルの右のrootユーザー名をクリックするとアカウントIDを確認できます。これをメモしてください。

### ログインユーザーの作成
rootユーザーでも問題なく使用できますが、AWS マネジメントコンソールに毎回rootで入るのは商用ではやりません。作業用にアカウントを作成します。

#### IAM
IAM(Identity and Access Management)はざっくり言えばユーザーとその権限周りを管理するコンポーネントです。IAMでログイン及び作業に使うユーザーを新たに作成します。

AWS マネジメントコンソール(ブラウザログインしてすぐの画面)のすべてのサービスの
`セキュリティ、ID、およびコンプライアンス`から`IAM`を選択します。
![01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1206561/5db96695-1639-fd82-b82a-3cd2ba3eca19.png)

左上に`Identity and Access Management (IAM)`と表示される画面に来たら、左側メニューから`アクセス管理`->`ユーザー`選択します。右上の青いボタンの`ユーザーを追加`をクリックします。
![02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1206561/d05a18ac-e535-c110-bf60-cef447a077b9.png)

ユーザー名を入力し、`AWS 認証情報タイプの選択`はアクセスキーとパスワードの両方にチェックを入れて、右下の`次のステップ：アクセス権限`をクリックします。

個人使用ですし、権限は一旦最大の物を付けます。`既存のポリシーを直接アタッチ`から`AdministratorAccess`にチェックを入れて右下の`次のステップ：タグ`をクリックします。
![03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1206561/a9e4e4a0-c4f8-153f-8d07-77550e131362.png)


タグは不要です。そのまま右下の`次のステップ：確認`をクリックします。

内容を確認して作成を押します。

成功した場合、その画面に`アクセスキー`と`シークレットアクセスキー`、`パスワード`が表示されますので画面を閉じる前に必ず保存してください。
`アクセスキー`と`シークレットアクセスキー`はCLIの設定に使います。

#### ログインする
rootユーザーでログインしていたと思いますが一旦サインアウトして、再度ログインし直します。`IAM ユーザーとしてサインイン`を選択してください。
rootログインではなく、ユーザーログインを行う場合必要になるのは下記3点です。

・アカウントID
・ユーザー名
・パスワード

## awscliの初期設定
Windows Subsystem for Linux (WSL1)で作業を行います。
`aws --version`を入力してawscliのバージョン2がインストールできているか確認します。

```
yamanashi@DESKTOP-9KCV2CQ:~$ aws --version
aws-cli/2.1.35 Python/3.8.8 Linux/4.4.0-19041-Microsoft exe/x86_64.ubuntu.20 prompt/off
```

awscliを叩いた際に、先ほど作成したユーザー権限で実行できるようにする必要があります。
下記コマンドを実行してください。newuserは適宜書き換えてください。

```
$ aws configure --profile newuser
```
アクセスキーとシークレットキー、regionを入力します。regionはこだわりが無ければ東京regionの`ap-northeast-1`を入力してください。outputformatは何も入力しなくて問題ないです。
完了すると~/.aws/configに入力したアカウント情報が保存されます。

デフォルトアカウントを設定する為にプロンプトに下記を入力します。

```
$ export AWS_DEFAULT_PROFILE=newuser
```

.bashrc辺りにも書いておくと次回以降の手間が減ります。

これで作成したawsアカウントに、作成したユーザー権限を使ってawscliコマンドが実行できます。
【初学者向け】JavaScriptのスプレッド構文「...」について

今回はスプレッド構文(スプレッド演算子)について解説していきます。

##①スプレッド構文とは
**ドット３つ("..."こんな感じ)をつけることで配列などを展開することができる**ようになるというものです。
展開というと少し難しいイメージですが
**要は配列の中身を<font color="Crimson">「バラバラにするイメージ」</font>で大丈夫です！**

(※今回は配列の展開についてのみ解説していきます。)


##②コードで確認してみよう

**①配列の展開**

```js
const arry = [1, 3];
// 配列をそのままconsole.log
console.log(arry);          //  [1, 3]

// スプレッド構文を使ってconsole.log
console.log(...arry);       //  1 3 
```

☆スプレッド構文を使ってconsole.logした方は**配列の中身のみ**になってるのがわかると思います。



**②配列を使って新しい配列を作成**

```js
const arry = [1, 2, 3, 4, 5];

// arryにスプレッド構文を使用し、その前後に新しい値を追加
const arry2 = [0, ...arry, 6];  

console.log(arry2);   // [0, 1, 2, 3, 4, 5, 6]
```
**スプレッド構文を使用してarryの中身が展開され、前後に"0"と"6"が追加された新しい配列ができました。**

**③配列のコピーと結合**

```js
// まずは配列を2つ用意
const arry = [1, 2];
const arry2 = [3, 4];

// (1)配列のコピー(arry → arry3)
const arry3 = [...arry];  
console.log(arry3);       /// [1, 2]　中身は同じだが別の配列(それぞれ変化を与えても影響を受けない)

// (2)配列の結合(arryとarryを結合 → arry4)
const arry4 = [...arry, ...arry2]; 
console.log(arry4);              //[1, 2, 3, 4]
```
(1)(2)も **[ ]** の中で配列が展開されて、新たな配列になっています。


:::note
補足説明
:::
配列のコピーに関してですが、スプレッド演算子を使用せずに

```js
const arry3 = arry
```

とすると、**arryの値が修正されるとarry3の要素も修正されることになります。**


**④まとめる**
ある配列の一部を[分割代入](https://qiita.com/yasu-hoshi/items/cf33f50fdec26537842a)
し、**残りをスプレッド演算子を使用してまとめる**

```js
const arry = [1, 2, 3, 4, 5];
const [num1, num2, ...arry2] = arry;
console.log(num1);   // 1
console.log(num2);   // 2
console.log(arry2);  // [3, 4, 5]  　１つの配列として取り出せる

// ちなみにですがこちらは
console.log(...arry2);  // 3, 4, 5 

```


**⑤関数の引数に渡す**

```js
const arry = [1, 2];

// 2つの引数を足し合わせたものをconsole.logする関数
const sum = (num1, num2) => console.log(num1 + num2);

// スプレッド演算子を使用しないパターン
sum(arry[0], arry[1]);    ///  3

// スプレッド構文を使用したパターン
sum(...arry);              ///  3
```


**これを応用すれば足し合わせるものの長さが変わってもOKな関数を作ることができます**

```js

// 引数で渡されたものを足し合わせていく関数
function sum(...args) {

   // 一旦、戻り値を定義
   let ret = 0;

   // 引数が順番にvに入っていきます
   for(let v of args){
   //vがどんどん足されていく処理(ret = ret + v)
      ret += v ;
   }

   // 最後まで足し合わされたretを返す
   return ret;
}

const result = sum(1,2,3,4);
console.log(result);      // 10

const result2 = sum(1,2,3,4,5,6);
console.log(result2);     // 21
```

**このようにスプレッド構文を使用すれば引数が増えても対応できる関数が作れます**

##最後に

今回の投稿が少しでも皆様の力になれたら幸いです。