OmniAICreator/Qiita-1.07M huggingface dataset:
FirebaseAuthとFirestoreをuidで繋げる

前回の『[FirebseAuthでアカウントを作成するコード](https://qiita.com/agachan0930/items/08e7f8412dbd32323ef7)』からEmailとPasswordを使ってアカウントを作成していきました。この情報をFirestoreに繋げていきたいと思います。
#コードはこんな感じ

```swift:ViewController.swift
    //前回の記事を参考にしてください→https://qiita.com/agachan0930/items/08e7f8412dbd32323ef7
    private func createUserToFireAuth(){
        guard let email = emailTextField.text else {return}
        guard let password = passwordTextField.text else {return}
        
        Auth.auth().createUser(withEmail: email, password: password){(auth, err) in
            if let err = err{
                print("You cannot create New Tinder Account", err)
                return
            }
            guard let uid = auth?.user.uid else {return}
            //新しく追加したのはここで下のsetUserDataToFirestoreの関数と接続されています。
            self.setUserDataToFirestore(email:email, uid: uid)
        }
    }

    //MARK:Create&ConnectFromFirebaseAuthToFirestore
    private func setUserDataToFirestore(email:String, uid: String){
        guard let name = nameTextField.text else {return}
        let document = [
            "name": name,
            "email": email,
            "createAt": Timestamp()
        ] as [String: Any]
        
        
        Firestore.firestore().collection("users").document(uid).setData(document){ err in
            if let err = err{
                print("You cannot save your account in FireStore", err)
                return
            }
            
            print("You success & save your account uid in FireStore")
        }
    }
```

#コード解説
Emailの情報とuidの情報をsetUserDataToFirestoreの関数に引き渡す。ここでの返り値はなし。

```swift:createUserToFireAuth内
self.setUserDataToFirestore(email:email, uid: uid)
```
createUserToFireAuthからEmailとuidをString型で受け渡しをする。

```swift
    //MARK:Create&ConnectFromFirebaseAuthToFirestore
    private func setUserDataToFirestore(email:String, uid: String){
    //省略
    }
```
辞書型[String:Any]で名前とEmail及び登録した時刻を型に準じてdocumentに格納する。

```swift
        let document = [
            "name": name,
            "email": email,
            "createAt": Timestamp()
        ] as [String: Any]
```

FireStore.firestoreでFirebase全体のデータベースを呼び出す。そのデータベース内の名前（users）に接続をする。
.documentで階層のリストを検索。
.setData(document)で先ほどセットしたデータ(document)を中に埋めこむ。
そしてif関数を用いて登録ができたかどうかを判定する。

```swift
        Firestore.firestore().collection("users").document(uid).setData(document){ err in
            if let err = err{
                print("You cannot save your account in FireStore", err)
                return
            }
            
            print("You success & save your account uid in FireStore")
        }
```

#次回
『[モデルの作成を行う]()』
JavaScriptでオブジェクトのパラメータ指定を省略する

例えば、

~~~
const setParameter = 1;

const sendParameter = { id: setParameter }
~~~
という変数とオブジェクトがまとまったコードがあったとします。

こういったコードは

~~~
const id = 1;

const sendParameter = { id };
~~~
のように
{ プロパティ名:　値 }
のような書き方を省略することができます。

この書き方はReactやVueなどでよくある

~~~
actionMethod(value) {
  const parameter = { value }
  this.vuexMethods(parameter);
}
~~~
の状態管理ライブラリ(ReduxやVuex)を使って状態を変更する際に便利だったりします。
【Excel】手順書・ツール作りに役立つ「名前の定義」

## 概要
Excel手順書・ツール作成に役立つ「名前の定義」を紹介する。

## 効果
Excel手順書・ツールの作成・修正の効率化、可読性の向上。

## 事例
複数の宛先にpingを打って疎通試験をするための手順書を作る。
inputシートに必要なパラメータを記入し、outputシートにコマンドを自動出力させる。
※構成とかは深く考えてません。

![name1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/17b59be0-5ac0-fa00-8974-1f755ff0adbb.png)

![name2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/117e6347-adef-ac98-eca8-8cc02d64171f.png)


##現状
セルに対して参照している。
`Ctrl＋Shift＋@`でOutputシートの関数を全表示すると、下記のとおり。

![name3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/93f5ae15-6389-2a3a-92c3-a0c1792e3b10.png)


## 問題
・そのセルが何を指しているかわかりにくい。
　2台目のインターフェースってどのセルだっけ、B5セルってなんの値だっけ…など。
・シート名を表す`input!`や絶対参照の`$`がいちいちつくので、読みにくい。

## 対策
名前を定義し、それを参照する。

## 使用法
#### 名前を定義する
方法はいくつかある。

1.「名前の定義」`Alt＞M＞M＞D`：基本。定義した名前が使える範囲やコメントをすぐに設定できるのが利点。
![name7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/d9544d2c-72b1-16a7-0a71-3ee141e7bbd1.png)

2.セルを選択して、「名前ボックス」に名前を入力：マウス派ならアリかも。
既存の名前の編集や削除はできない。すでに名前を定義しているセルを選択して別の名前を定義すると、2つ目の名前として定義される。
![name6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/36ec7086-b1da-45f8-e7af-095ab86ad95d.png)

3.「選択範囲から作成」`Alt＞M＞C`：複数まとめて登録するにはこれがオススメ。左端列や上端行のセル内容を自動的に名前として設定することもできる。
![name5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/2b2b4edf-3840-b1c3-1a88-13ab4d493a1a.png)

#### 名前を利用する
関数と同じような扱い。制御文字を入れたりダブルクォーテーションで囲ったりは不要で、そのまま記載すればOK。英数字以外でも使える。
定義した名前の一覧は、「名前の使用」`Alt＞M＞S`で呼び出せる。

#### 利用しやすくするには
inputシートに列を増やし(普段は非表示にする)、英数字のみで呼び名をつけておく。
![name9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/e717150c-ace0-5cb3-7807-805d7978c424.png)

いくつか文字を打てば候補を出してくれるので、最初の数文字をわかりやすくすることが重要。
出てきた候補にカーソルを合わせてTabキーを押すと挿入できる。
なお、if1・if2だとIF関数と紛らわしいので、iface1・iface2としている。
![name10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/155b1cc1-289b-acce-554e-5075fbdc5efa.png)

## 改善後

#### 日本語名
名前を**日本語名**で定義した場合のコード。
関数と名前を混同しにくく、直感的に読みやすいところが利点。
![name11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/aa6b7d8f-10e3-c1d6-c85a-e7c8078ecb44.png)

#### 英数字
名前を**英数字**で定義した場合のコード。
英数字入力から定義した名前を呼び出すのが簡単なので、入力がスピーディなのが利点。
![name12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/c3d94b5e-1bbd-d186-086c-cf97eaf83167.png)



## 注意点
シートをコピーすると、定義した名前もコピーされる。名前定義済みのinput(2)シートをコピーしたあとに「名前の管理」`Alt＞M＞N`を見ると、2つずつになっているのがわかる。
![name8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/f972f534-958d-769c-8412-04c34c6542c4.png)
範囲がinput(3)になっているものが、新しく増えた定義。ソートして削除してしまった方が安全。

## まとめ
セルに名前をつけると、人に優しい手順書・ツールを作れる。

## 2022/12/15追記
Excelオンラインでは、既存の名前を利用することはできますが、新たに名前を定義したり、既存の名前を管理したりすることができません。
なんでー！？Microsoft様、ぜひとも改善をお願いします。

https://support.microsoft.com/ja-jp/office/%E6%95%B0%E5%BC%8F%E3%81%A7%E5%90%8D%E5%89%8D%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%97%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B-4d0f13ac-53b7-422e-afd2-abd7ff379c64#ID0EBBH=Web
自分の作業している現場がアジャイル開発なのかどうか分からなくなったので考えてみた

アジャイル開発についてまとめてみようと思ったのは、今自分が携わっている案件がアジャイル開発かなのかどうかが分からなくなったからです。

しかし、どうもアジャイル開発(スクラム開発)に似ているところがあるので、自分の携わっている現場がアジャイル開発なのか、それとも、完全にアジャイル開発に近いものなのかを検討してみようと思いました。

<h2>現場の状況</h2>
ざっとまとめてみると、
○スクラムマスターみたいな人はいない
○プロダクトオーナーみたいな人はいる
○コードレビュー等はなく、問題があれば対処する(最初の方はフロントエンド、バックエンドそれぞれのチームでコードレビューの時間があったが、自然となくなったので、コーディング規約に反してない限り、問題にはならない。)
○定期的にそのプロダクトオーナーみたいな人とMTGをして、作成したものが作りたいものから逸れていないかどうかをチェックすることはある
○タスク1つについて、1~2週間程度の作業期間がある
○作業内容がリリースされたのちに、振り返る時間とかはない
○朝と夕方に進捗報告がある
○Redmineで作業内容はまとめられている

こんな感じです。

<h2>アジャイル開発とは</h2>
実装したい機能やシステムを短期間で区切って開発する方法のことです。

開発を行っていると、
○作りたいものが変わった
○急遽必要な機能が増えた
○実際にリリースしたけど、ユーザからクレームが増えたため、リリース前の状態に戻す
など予想できないことが起こることがあります。

そういった要所要所で発生する問題に対応しながら開発を勧めることができるのがこのアジャイル開発のメリットです。

<h2>アジャイル開発の流れ</h2>
アジャイル開発は主に
○システムをリリースするまでの計画
○「計画→設計→実装→テスト」の繰り返し(これをイテレーションといいます)
の2つに分けられます。

<h2>アジャイル開発には種類がある</h2>
そして、アジャイル開発には種類があり、
○スクラム
○エクストリーム・プログラミング(XP)
○ユーザー機能駆動開発（FDD）
の3つのいずれかに分けられます。

<h3>スクラム</h3>
チーム内で密にコミュニケーションを取りつつ開発を行っていく手法です。

○分からないいことがあればミーティングする
○新しく実装する機能について意見を出し合う
などコミュニケーションが大切になります。

ラグビーの「スクラム」が由来だそうです。

<h3>エクストリーム・プログラミング(XP)</h3>
仕様変更等が生じた際に、柔軟に対応しつつ開発を行っていく手法です。

仕様変更が起こりやすい顧客の案件を取り扱うときに効きます。

<h3>ユーザー機能駆動開発（FDD）</h3>
ユーザの求めるものを優先的に重視して開発を行っていく手法です。


<h2>アジャイル開発に関する用語</h2>
<h3>スクラムマスター</h3>
スクラム開発の進め方を管理する役割の人。

<h3>プロダクトオーナー</h3>
システムや機能含むプロダクトの決定権を持ちつつ、最高責任者の人。

<h3>チーム</h3>
スクラム開発を行っていくメンバーの集まり。

<h3>スプリント</h3>
1つの開発・実装における期間のこと。
大体1~2週間で組まれるのが主。

<h3>プロダクト・バックログ</h3>
機能やユーザーからの要望、技術的な改善要素を優先順位付きでまとめたリスト。
Redmineなどでこれを作成できる。

<h3>スプリント・バックログ</h3>
1つのスプリント間で行うタスクのこと。
このスプリント・バックログは、1スプリント内のタスクを消化できるかどうかを検証したりする。

<h3>デイリースクラム</h3>
チーム内で情報を共有すること。
主に、
・昨日やったこと
・今日やること
・つまずいていること
などを共有する。

<h3>タスクボード</h3>
俗に言うTo doリスト。
○これからやること
○現在やっていること
○終わったこと
を視覚化するのに丁度いい。

Trelloとかでこれが作れる。

<h2>結論</h2>
そこそこ簡単に調べてみたところ、完璧ではないが、スクラム開発には近いように感じました。

自分の現在携わってる環境と照らし合わせ見てたところ、何個か当てはまるところがあるので、ニアリーイコールスクラム開発という結論としましょう。笑


<h2>参考にした記事や動画</h2>
https://www.youtube.com/watch?v=mCR09b0B6D8

https://ja.wikipedia.org/wiki/%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA

https://www.kagoya.jp/howto/cloud/what-is-agile/

https://codezine.jp/article/detail/12296

https://www.geekly.co.jp/column/cat-position/1912_003/
使用 ansible 查看磁盘使用空间 Use ansible to view disk space usage

```yml
- hosts: 1.1.1.1
  gather_facts: no
  tasks:
    - name: Collect only facts about hardware
      setup:
        gather_subset:
          - 'hardware'

    - name: ensure disk at least 10% free space
      assert:
        that:
          - mount.size_available > mount.size_total|float * 0.1
        fail_msg: "Disk avail: {{(mount.size_available/1000000000.0 )| round(1,'common') }}GB    Disk total: {{(mount.size_total / 1000000000.0) | round(1,'common') }}GB    Disk space is near full!!! "
        success_msg: "Disk avail: {{(mount.size_available/1000000000.0 )| round(1,'common') }}GB    Disk total: {{(mount.size_total / 1000000000.0) | round(1,'common') }}GB"
      vars:
        mount: "{{ ansible_mounts | selectattr('device', 'equalto', '/dev/vdb1') | list | first }}"

# https://gist.github.com/mahemoff/07c0c3427aa3eb3c0abc07f76fc68279
# https://gist.github.com/goodc0re/cbaffab5674cc9324ecb591ab350e564
# https://stackoverflow.com/questions/26981907/using-ansible-to-manage-disk-space

```

如果磁盘空间不足10%，运行结果如下：
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169726/d7e7e1fa-b6e6-af23-6c6f-ea1cfbbdeb89.png)
CloudWatchのダッシュボードを使ってAWSの請求金額をIAM Userを持たない人にも共有する

# この記事の内容
メールアドレスとパスワードベースでログインできるダッシュボードを作成します。
今回は請求金額の情報をダッシュボードにまとめています。
![CloudWatch_Dashboard_shareview_nomark.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43015/7102589e-f9f1-53e6-56bc-43ab0e81ee9d.png)


### 請求金額をダッシュボードにするメリット
* IAM Userの管理コストが減る
* AWSやITに疎いユーザーにとって、利用するハードルが低い
* 毎回AWSにログインして金額を確認するよりもお手軽に確認できるため、コスト自体の管理コストが減る。

AWS自体にアクセスするのは面倒だけど、今の利用料を把握したいビジネスサイドの方がいる場合などに活用が可能です。
また余計なIAM Userを作成することで、IAMの管理コストを増やすことも避けられます。自動的に最小限の権限だけ付与されるため、余計な心配をする必要がなくなります。

ただし、ダッシュボードの運用でも、アクセスできる**メールアドレスの棚卸等の統制業務は必要**になる点に注意です。
これらを加味した上で、ケースバイケースで導入を検討するのが良いです。

# 設定方法
### おおよその作業フロー
1. CloudWatchにダッシュボードを作成する
1. ダッシュボードにパネルを追加する
1. ダッシュボードの共有設定をする
1. ログイン確認

### 準備
* **バージニア北部(us-east-1)**で作業をしてください
* 下記のページを見て必要な権限を作業用のユーザー/ロールに付与してください
    * https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/CloudWatch_Dashboards.html
    * https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/cloudwatch-dashboard-sharing.html
        * ダッシュボードの認証にCognitoを使う点に注意です。

### 設定手順
#### 1.ダッシュボードの作成
Cloudwatchを開いて、ダッシュボード画面を表示します。現在存在するダッシュボードが一覧されるので、右上のダッシュボードの作成ボタンを選択します。
![CloudWatch_Management_Console_panel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43015/ca217dfd-c67b-3502-42b9-90ffd67d7261.png)

#### 2. ダッシュボードにパネルを追加する
ダッシュボードができたら、ウィジェットを追加していきます。
このとき請求のメトリクスを見るには**バージニア北部(us-east-1)**で作業することが必要な点にご注意ください。
グラフの種類はお好きに選択してください。メトリクスの選択画面が出たら、「請求>請求金額合計」を選んで、下記画像のように設定します。

![CloudWatch_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43015/7ab9a3f6-bda5-57b1-f682-899a4fd544f8.png)

他にもお好きなものを追加してダッシュボードを使いやすく設定して行きましょう！
ダッシュボードにパネルを追加したのに、表示期間が思ったとおりにならない…という場合はダッシュボード自体の右上にある表示期間を調節してみてください。
![CloudWatch_Dachboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43015/b8c9801b-3b28-4cc4-eacd-47cc8f8e2d27.png)

#### 3. ダッシュボードの共有設定をする
ダッシュボード画面から**「アクション>ダッシュボードの共有」**を選択します。
**「ダッシュボードを共有し、ユーザー名とパスワードを要求する」**を選択してメールアドレスを入力するだけで設定完了です。
そのメールアドレス宛に初期パスワードを記載したメールが届くので、ユーザー宛に閲覧用ダッシュボードのリンクを共有してください。

接続用リンクは設定後に表示される緑色のバーか、ダッシュボードの共有画面を再び開くと表示されます。
![CloudWatch_create_link.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43015/ce6f8cac-8055-4cef-65d7-09623ab913b0.png)
![CloudWatch_dashboard_configure_sharesetting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43015/2247ba26-bd59-5ac5-89ca-493c787d398e.png)

#### 4.接続確認
メールアドレスに記載されたパスワードを使ってログインすると、初期パスワードの変更を求められた後に無事にアクセスできるはずです。


# 参考
### Cognito
この作業を行うと、自動的にダッシュボード用のユーザープールが"CloudWatchDashboardSharing"という名前で作成されます。
棚卸等はこの画面で行うか、何かしらの通知が行くような作り込みをしてください。

### 参考文献
公式サイトだけで作業ができました。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/create_dashboard.html
備忘録　ECCUBE　テーブル追加について

忘れないようにメモ。。。

●テーブル追加について
　カスタマイズディレクトリにentityクラスとrepositoryクラスを作成
　※このふたつのクラスは「src/eccube/repository or entity」を真似して、欲しいテーブル通りに作ればいい

あとは、ちょちょいのちょいする

```
　php bin/console eccube:generate:proxies 　→コマンドを実行(proxyクラスなるものを生成しているらしい)
　php bin/console doctrine:schema:update --dump-sql　→コマンドを実行し、実行されるSQLを確認する（あんま意味ない）
　php bin/console doctrine:schema:update --dump-sql --force　→コマンドを実行し、SQLを実行する
```
【Windows】PATHをコマンド一つで追加する便利な方法

##ワード説明
**・set** 環境変数の表示・設定を行うWindowsコマンド
**・%path%** 環境変数pathの中身を示す
##方法１（ユーザー環境変数）

コマンドプロンプトを起動し下記のコマンドを実行

```

set %path%<uri>;

<uri>の箇所には環境変数PATHに追加するパスを指定して下さい
%path%（変数PATHの中身）の文字列の最後に ";" が無い場合は↓

set %path%;<uri>;

```

<*uri*>の部分が環境変数に追加されます

##方法２（システム環境変数）
Win+Rで"ファイル名を指定して実行"を起動
その後にcmdと入力しCtrl+Shift+Enterを押下して管理者権限でコマンドプロンプトを起動
後は方法１と同じ手順でシステム環境変数にも同様に追加できます

##環境変数の確認（コマンド）

```
set
echo %path% 
```
Azure AD、GUI でアクセス先テナント指定できるようになっていた

## [サインインオプション] > [組織へのサインイン] という選択肢ができていた

[組織へのサインイン] を選択することで、明示的にアクセス先を選択できるようになっていた！これ、いつからあったのだろうか。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1532250/303cf92b-3188-f9ef-fc34-aa0eb5b95c68.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1532250/69d7f76c-39e9-ff8e-2d96-776ae9eb0366.png)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1532250/6575397b-c9ba-2e2c-68d3-ec4914beb7bb.png" width="50">

## 明示的にアクセス先テナントを指定したいパターンって？
言わずもがな (?)、自分のアカウントがゲスト ユーザーとして複数のテナントに招待されているときです。
イメージ↓
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1532250/93f9d9e9-8758-4b4d-870d-bd7bb13f1e55.png" width="900">


例えば、user が kurikinton.work 上の VM を利用するときは kurikinton.work の Azure ポータルに、contoso.com の VM を利用するときは contoso.com の Azure ポータルに入る必要があります。

Azure ポータルの場合は <https://portal.azure.com/kurikinton.work> みたいな形で、末尾にカスタムドメイン追記することでテナントを指定できます。
もしくは一度ホームテナントの Azure ポータルに入って、画面右上の [ディレクトリの切り替え] から組織を切り替えることもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1532250/cc915df7-df45-a369-ba9c-aac8dba10de1.png)

でもサービスによっては、URL で簡単にテナント指定ができなかったり、切り替えの手順が面倒なものも。。。

## 最近見た変な例 : [QnA Maker の QnA ポータル](https://www.qnamaker.ai/)。
[QnA Maker の QnA ポータル](https://www.qnamaker.ai/) は、URL でテナント指定ができません。
なのでゲストユーザーとしてアクセスする場合は、下記の手順が基本でした。

1. QnA ポータルの [Signin] を押下
2. ホームテナントのユーザーとしてサインイン
3. サインイン完了後、QnA ポータル上の [Switch Directory] からテナントを切り替え


何が問題って、**条件付きアクセス ポリシーなどで、ホームテナントの QnA ポータルへのサインインがブロックされるユーザーは、手順 2 で足止めを食らって、その先に進めない** んです。
裏技として、サインイン時の URL 内の "common" を、招待先テナントのテナント ID に置換する、という方法で回避はできるのですが。。。正直面倒。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1532250/93805431-83d1-eeba-a3a9-66c0c1d83a63.png)

でも、↑の画面の [サインイン オプション] > [組織へのサインイン] に進んで、招待先テナントを明示的に指定すれば、ホームテナントを経由せずとも QnA ポータルへサインインすることができる！
最高だ。。。
備忘録　ECCUBE　環境構築

ECCUBE4の環境構築をやった。
当時、なんだかうまくいかなかったので、備忘録用にメモ。。

windowsにて構築。

2021年2月当時におけるもの

# 公式ドキュメントに関して
推奨バージョンのECCUBE4.0のドキュメントサイトは・・・(https://doc4.ec-cube.net/)
　　→と思っていたが、どうやら最近加筆されたみたい。

ECCUBE3.0のドキュメントサイトはまだマシ(https://doc.ec-cube.net/)
 ※だが、3.0→4.0で、ある程度の互換性？
　3.0はあくまでもslixベース、4.0はsymfonyベースなので、まあ当てにはならない
　slixとsymfonyの違いはパッとはわかんないけど、それでも雰囲気は似ているらしい。
　どうやら2.0から3.0にUPするタイミングでユーザと揉めたために、3.0のドキュメントのほうが濃厚のようだ
・だれかがつくったDB定義のドキュメントをみつけた
http://ec4.umebius.com/

# ECCUBE導入手順
　もう解決されてるのかな。

●前提(2020.02.24時点)
　ECCUBEはPHP7.4でしか動作しないので、PHP7.4の環境を用意する必要がある(現在PHPの最新は8番台)
  ※指定バージョンでないとインストール時にバージョン違いでエラーを吐かれる
 composerが準備されているのは前提

●インストール手順
①composerのバージョンを落とす
```php composer.phar selfupdate --1```
②インストール開始
```php composer.phar create-project ec-cube/ec-cube ec-cube "4.0.x-dev" --keep-vcs```

※ここで、開発環境用DB生成のスクリプト失敗によるエラーが吐かれ、終了する場合がある。
(bin/console doctrine:database:createが失敗と返却される)
インストール状況は適宜コマンドライン上に返却されるので、そこまでが完了しているのが確実である場合は、以下の操作を行う

(1) データベース削除
```php bin/console doctrine:database:drop --force```
(2) データベース作成
```php bin/console doctrine:database:create```
(3) スキーマ削除
```php bin/console doctrine:schema:drop --force```
(4) スキーマ生成
```php bin/console doctrine:schema:create```
(5) 初期データ生成
```php bin/console eccube:fixtures:load```

③インストール成否確認(eccubeの実行)
```cd ec-cube```
```php bin/console server:run --env=dev```

※上記コマンドで実行すると、コマンドライン上に使用ポートが表示される
※が、php -Sでphpのビルトインサーバーで起動しても同じように動くようだ

 確認ポイント
 (1) http://localhost:8000/admin (ECCUBEの管理画面)でID: admin PW: passwordでログインし、動いているかどうか
 (2) http://localhost:8000 でトップページが表示されるかどうか
 ちなみに、eccubeはデモサイトを用意している。初期状態はこれ。
  → https://www.ec-cube.net/product/demo.php
【Swift】UIKitを消す

# どういうことか

たとえば

```swift
titleLabel.isHidden = true
```

こんな感じで書くとたしかに非表示にはなるがAutoLayoutなどが残ってしまう。つまり、たとえばこの `titleLabel` の下に何かしらのUIKit要素があったとして、`titleLabel` が消えたことで上に詰めてくれる（業界用語で言うところの**トルツメ**）ことがない。
そもそも最初から無かったことにしたい。

## 無かったことにしたい

```swift
titleLabel.removeFromSuperview()
```

無かったことになる。
おわり(´・ω・｀)
DIGITAL VORN Future Pix 　5月1日（土）20:00～放送分を聞いて

######デジタルフォルンのラジオ番組「DIGITAL VORN Future Pix」

気になる方はどうぞ。
番組Webサイト　https://www.tfm.co.jp/podcasts/futurepix/

「笹川友里さんと杉原行里さんとの対談」その１を聞いてです。

杉原行里さん
http://www.rds-design.jp/
WEBメディア　HERO X 編集長
http://hero-x.jp/

まずはRDSのプロダクトについて
【車椅子レーサー / WF01TR】
【シーティングシミュレーター / SS01】
など「今日の理想を、未来の普通に。」をテーマに
「座る」モビリティを中心にプロダクトを生み出しています。

リモートでの自宅作業が多くなっている今般、「シーティングシミュレーター / SS01」
について、実施し作業効率を上げることができるのであれば、
良いのではないかと思ってしまいました。

パラリンピックで使用される車いすにも期待ですね。

◆「HERO X」
気になりすぎるので、見てきました。

話題に上がっていたのは

【着けるだけで乳がんを発見できるブラジャー。お値段はたったの1万3千円！】
http://hero-x.jp/article/4068/

【尿検査を日常生活の中に！「Bisu body Coach」開発者ダニエル・マグスの思考　前編】
http://hero-x.jp/article/8369/
個別の検診はしていますが、個人で10分以内にできるのであれば、
値段にもよりますが、購入の段に入るのかと思います。

【お支払いはネイルでピッ！？中国発のスマートネイルはネクストトレンドになるか？】
http://hero-x.jp/movie/8569/
日本で行うのであればまずはSUICAにて導入でしょうか。
メンテナンスがめんどくさそうですので、Apple watch で十分な気がします。

【睡眠不足の経済損失は年間15兆円!?　“眠り”を改善する画期的なアイデアが登場】
http://hero-x.jp/article/10037/
https://www.philips.co.jp/c-e/hs/smartsleep/deep-sleep-headband

これは気になります、家電量販店などで、
製品が見れるそうなので、行って装着感等
を試してみるのが良いかと思います。

個人的に気になった記事は
【人が操縦できる巨大ロボ】
http://hero-x.jp/article/10214/
MegaBots側の記事でした。
・・・・米MegaBotsが破産ってアレ？
これを買い取ったのですね。
https://4re.tokyo/

水道橋工業が作った　クラタスとの巨大ロボ対戦はこちら
https://youtu.be/Z-ouLX8Q9UM
Spring Boot アプリケーションの初期設定をやってみよう！

#Spring InitializrでSpring Boot アプリケーションの初期プロジェクトを簡単に生成する。
Spring Initializrを使うと簡単にSpring Bootアプリケーションの初期プロジェクトを生成することができる。

https://start.spring.io/

##Spring Initializrの項目は何を意味する？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702560/fe8a5686-9501-f4e6-b5ae-923b1ef7fcfa.png)


* Project：build Toolを選択する。
    1. Maven Project：XMLで作成。静的ビルド。(＊１)
    1. Gradle Project：Groovy文法で作成。動的ビルド(＊１)
* Language：使用する言語を選択する。
* Spring Boot：Spring Bootのバージョンを選択する。
* Project Metadata：
    1. Group：ルートパッケージ名
    1. Artifact：プロジェクト名
    1. Name：プロジェクト名
    1. Description：プロジェクトの説明
    1. Package name
    1. Packaging
    1. Java：使用しているJavaバージョン
* Dependencies
* GENERATE or EXPLORE
    1. GENERATE：生成したプロジェクトをzipでダウンロード

#参考
[(＊１)](https://qiita.com/argama147/items/2f636a2f4fd76f6ce130)
AWS CRT Python を使って TLS無し MQTT で Mosquitto に接続する

# 想定している要求・課題
* TLSが重いので素のMQTTを使って接続したい
* AWSの [aws-iot-device-sdk-python-v2](https://github.com/aws/aws-iot-device-sdk-python-v2) を使いたいがTLSなしをサポートしていないので困る
* 他のデバイスやシステムでAWS IoTを使っている等の理由で、できるだけAWSが提供しているSDKで済ませたい

# 対応案
* Device SDK が利用している AWS CRT Python を直接使用する
    * これはTLS無しでも使える
    * https://github.com/awslabs/aws-crt-python

# 試す
### サーバー側(Broker)
今回は[こちら](https://qiita.com/segur/items/0536ced1fe741b55713d)の手順を参考に、Mosquittoを立ち上げる

```
/usr/local/opt/mosquitto/sbin/mosquitto 
```


### クライアント側（Subscribe）
Brokerを立ち上げたホストで、サブスクライバーも起動。すべてのメッセージを受け取る。

```
/usr/local/opt/mosquitto/bin/mosquitto_sub --host 127.0.0.1 --port 1883 --topic '#'
```

### クライアント側（Publish）
* READMEにある通り、 `python3 -m pip install awscrt` でインストール
* サンプルコードを使用したいのでクローン

```bash
git clone https://github.com/awslabs/aws-crt-python.git
cd aws-crt-python
python3 mqtt_test.py --endpoint 127.0.0.1 --port 1883
```

サブスクライバーは、以下のメッセージを受け取る

```
test message 32b49ad6-8a77-4c51-8988-4b2a1f450abc
```

### awscrt を直接叩く代わりに、Python Devcie SDK v2 で強引にTLS無しの接続（Publish）

mqtt_connection を作るところを少し変更

```python:pubsub.py
        # mqtt_connection = mqtt_connection_builder.mtls_from_path(
        mqtt_connection = mqtt_connection_builder._build(
            tls_ctx_options=None, # add
            endpoint=args.endpoint,
            port=args.port,
            # cert_filepath=args.cert,
            # pri_key_filepath=args.key,
            client_bootstrap=client_bootstrap,
            ca_filepath=args.root_ca,
            on_connection_interrupted=on_connection_interrupted,
            on_connection_resumed=on_connection_resumed,
            client_id=args.client_id,
            clean_session=False,
            keep_alive_secs=6,
            http_proxy_options=proxy_options)
```

```python:mqtt_connection_builder.py
    # tls_ctx = awscrt.io.ClientTlsContext(tls_ctx_options)
    mqtt_client = awscrt.mqtt.Client(client_bootstrap, None)
```
これでTLSの設定をスキップして、素のMQTTで繋がる

```bash
python3 pubsub.py --endpoint 127.0.0.1 --port 1883
Connecting to 127.0.0.1 with client ID 'test-ba761af3-5a05-4fa1-a4b7-3408ebfbd3a6'...
Connected!
Subscribing to topic 'test/topic'...
Subscribed with QoS.AT_LEAST_ONCE
Sending 10 message(s)
Publishing message to topic 'test/topic': Hello World! [1]
Received message from topic 'test/topic': b'Hello World! [1]'
Publishing message to topic 'test/topic': Hello World! [2]
Received message from topic 'test/topic': b'Hello World! [2]'
Publishing message to topic 'test/topic': Hello World! [3]

```
Webシステムのパフォーマンスチューニング

Webシステムを長く使っているとパフォーマンスチューニングが必要な場面が発生します。
症状や状態により原因は様々ですが…

こんな場面に遭遇することがあります

・去年よりなんとなく重い
・昨日から重い
・この機能について重い
・＊＊＊件以上検索すると重い
・この条件で検索すると重い
・バッチが終わらない
・この時間帯が重い

などなど…そんなことが多発するようになると
システムの利用頻度がだんだんと少なくなってしまう本末転倒な状況になります。


作業としてはあらゆる可能性を考え、
・いつから発生したのか
・どのような症状なのか
・現状、どのような影響が発生しているのか

等を考察し、

上記のパフォーマンスチューニングを行うと、どのようになるのか
※チューニングを行ったことにより、悪化することもあることを考えて行いましょう

単純な原因もあります。そのあたりも、考慮しながら行いましょう

【よくある単純な原因】
・サーバのファイル容量不足（ログを出力しすぎて残り数MBなんて状態もよく見ました）
・データベースサーバの統計情報が古い状態になっている（バランスが変化）
・デバッグモードでサーバを起動していた
・サーバのメモリの設定が誤っていた

【個別の機能にて遅いことが分かっている場合】
個別の機能にてどのような操作を行ったときに遅いかを調査していきましょう。

大体がデータベースのアクセスが遅い場合、クライアントにて遅くなっている場合
その他に分け、まずはブラウザのデバッガーにてどこで発生しているかを確認し
サーバ側のデバッグでどこで発生しているかを確認していくと
何処が遅いかが判明してきます。

そんな場面があったら・・・・上記な感じで解決していきましょう。
ソフトウェア導入作業を失敗しないために

ソフトウェアの導入を失敗しないために、必要な作業を簡易ですが纏めました。
ソフトウェアを作成していますと、障害等があり、不具合修正やデータ修正等
お客様の本番環境で実施することもシバシバありますよね。

そこで、導入が失敗してしまうと、お客様のシステム運用を止めてしまったり、
その後の更新作業やその後の手順に影響を及ぼす状況となります。
※説明できるとかであれば問題ないですが…

気を付けている点を事例を交えながら…感じてくれるとありがたいです。

不具合修正などで行うのがサーバ作業
事前に考えられるテストを実施しているとは思いますが、

疑似本番環境などあれば、ここで
導入テストを実施、確認できることは確認すること。
手順を一通り実施し、問題ないことをまず確認しましょう。

Java なら、更新しているファイルは対象になっていますよね。
※特にインナークラスに注意
画像やライブラリ等


本番作業です。

【本番適用前】
※一週間前
本当に導入して大丈夫ですか？テストはちゃんと通りましたか？
担当者も納得してますか？

※前日まで
事前に担当者への連絡はすんでますか？
担当者から利用ユーザへの連絡はありましたか？

【本番作業当日】
※当日
導入作業では必ず作業前の状態に戻せる状態を作ることが重要です。
データ更新を行う際はデータのバックアップは必須。
作業実施時にデイリーのバッチが走っていなことを確認しましょう。

・プログラムのバックアップ
・サーバ停止
・データベースバックアップ（直接更新しなくても可能ならやりましょう）

【本番適用時】
可能なら2人以上で行ってください。
声だしのチェック。指さし確認。緊張感をもって行いましょう。
本番環境での不要なワンクリックで大変な目にあいます。

心構え。失敗しても操作ミス以外は自分のせいではないと思いましょう。
ロボットのように動きましょう。
状況判断はやめましょう。それは他の人にしましょう。

・不具合修正適用
・データベースの変更
・その他作業

・サーバ起動
・適用後動作確認

・担当者連絡

※失敗したら…
バックアップしていたプログラムとデータベースを戻しましょう。

お客様への連絡もお忘れなく。

色々なお客様の形態を見て、半自動化してくれているシステムも見かけましたが、
最終的にシステムの再起動、確認は人がやってました。
まだまだ便利になりませんね。
Viewを親ViewいっぱいにaddSubViewする時のTips

# はじめに
それなりにUIコンポーネントが多いアプリを開発しているときに
親のViweに対して、特定のView（子）を親Viewと同じサイズで目一杯にして貼り付けたいという事がよくあります。（コードで）

数ヶ月前までの自分は、そのたびに、子Viewと親ViewのAutoLayout制約を毎回コードで設定していました。

それがあまりにも非効率だったため、最近はExtensionを使うようにしています。
それと、わざわざAutoLayout制約を設定しなくてもいい方法も見つけたので、記事にしてみました。

#### よくある具体的な場面
```swift
// コードでViewを生成
let childView = UIView()
childView.backgroundColor = .orange
// chilidView(子)をparentView(親)に目一杯貼り付けたい
parentView.addSubView(childView)
```

# UIView+Extension で実装する方法
処理としては、Viewの四方に制約を設定するだけの簡単なコードですが、Extensionで用意せずに、各ViewControllerで毎回実装しようとすると、それだけで`FatViewController`になりかねません。（過去の私はなりました）

```swift
extension UIView {
    // childViewを親Viewに目一杯addSubView()する
    func addSubViewFill(_ childView: UIView) {
        self.addSubview(childView)
        childView.translatesAutoresizingMaskIntoConstraints = false
        childView.topAnchor.constraint(equalTo: self.topAnchor, constant: 0).isActive = true
        childView.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: 0).isActive = true
        childView.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 0).isActive = true
        childView.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: 0).isActive = true
    }
}
```

利用するときは、最初から制約が設定されているお得な`addSubView()`という感覚で使ってしまって大丈夫です。

```swift
parentView.addSubViewFill(childView)
```

個人的にはめちゃめちゃ万能なので、重宝しているやり方です。

# AutoLayout制約を設定しない方法
```swift
override func viewDidLoad() {
    parentView.addSubView(childView)
}

override func viewDidLayoutSubviews() {
    childView.frame = parentView.bounds
}
```
こっちの使い時としては、`viewDidLoad()`などで、事前に`addSubView`が完了している子ViewのFrameを
`viewDidLayoutSubviews()`で、親Viewと同じ大きさに設定してしまう方法です。

`viewDidLayoutSubviews()`で設定する理由としては、`viewDidLoad()`のときは、親Viewのサイズが正しく取得できないため、各Viewのサイズが正しく取得されるタイミングにて、設定しているということです。

AutoLayout制約をつけなくていいのがこちらのメリットだと思います。

ただ、注意点があって
1. ユーザーの操作や画面描画後の特定の条件のときのみ、親Viewに貼り付けたいなどといったときは、`viewDidLayoutSubviews()`に予め処理を設定しにくい。
2. `viewDidLayoutSubviews()`は、明示的に呼び出すわけではなく、画面のサイズが変わった時（回転時など）にOSから勝手に呼ばれるので、あまりいろいろなレイアウト設定をするとバグの温床になる。

というデメリットもあると思います。

あまり複雑じゃない画面で、AutoLayout制約が不要なときは、使えると思います。

# おわりに
コードでaddSubViewする機会が多いよ。という方は、新規プロジェクトを作ったらすぐにUIViewのExtensionに実装すると良いかもしれませんね。
読んでいただいた方のアプリ開発が少しでも効率化すれば幸いです。

他にこういう方法あるよ！という方がいらしたら是非コメントで教えていただけると嬉しいです。
[Ruby]要素を拒否できるrejectメソッド

## はじめに
Ruby初学者です。
今回はrejectについて、メモしていきます。

## rejectとは
[公式リファレンス](https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/reject.html)ではrejectについて以下のように説明されています。

`各要素に対してブロックを評価し、その値が偽であった要素を集めた新しい配列を返します。条件を反転させた select です。
ブロックを省略した場合は、各要素に対しブロックを評価し偽になった値の配列を返すような Enumerator を返します。※配列型の場合`

またハッシュ型の場合でもほぼ使い方は同じで、ハッシュを返すということ以外は同じとなります。
尚、rejectは非破壊的メソッドとなります。

## 使い方
rejectメソッドを使った例を以下に示します。

配列の場合

```
[1,2,3].reject {|i| i==1}
=> [2, 3]
```

ハッシュの場合

```
{"a"=>"1", "b"=>"2", "c"=>"3", "d"=>"4"}.reject {|k,v| v=="4" }
=> {"a"=>"1", "b"=>"2", "c"=>"3"}
```

## 使用例

```
word = [1,2,3]
word = word.reject {|i| i==1 }
p word
=> [2, 3]

#破壊的メソッドの場合
word = [1,2,3]
word.reject! {|i| i==1 }
p word
=> [2, 3]
```

# 参考

https://techacademy.jp/magazine/30062

https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/reject.html

https://docs.ruby-lang.org/ja/latest/method/Hash/i/reject.html
【Laravel8】collectionを扱うためのメソッドを試してみる①(all、avg、chunk、collapse、combine)

Laravelにはcollectionを扱うためのメソッドがたくさん用意されています！
たくさんあるので試してみました。

間違い等あればご指摘お願い致します！

参考：https://readouble.com/laravel/8.x/ja/collections.html
とりあえずメソッド一覧を順番に使ってみようかと思います。
全てTinkerで試しています。

# all( )

collectionの裏の配列表現を返します。

```PHP:
//collectionを作成
>>> $weather = collect(['sunny','cloudy','rainy'])

//allメソッド
>>> $weather->all();
=> [
     "sunny",
     "cloudy",
     "rainy",
   ]
```

モデルの値全て取得するときなどは以下のように使いますね。

```PHP:
User::all();
```


# avg( )

平均値を返します。

```PHP:
>>> $weight = collect([30,40,50,60])->avg();
=> 45
```

# chunk( )

指定したサイズで複数の小さなcollectionにします。
主にビューで使うみたいですね。

```PHP:
//collection作成
>>> $animals = collect(['dog','cat','rabbit','cow','wolf','fox','mouse','horse'])
=> Illuminate\Support\Collection {#4294
     all: [
       "dog",
       "cat",
       "rabbit",
       "cow",
       "wolf",
       "fox",
       "mouse",
       "horse",
     ],
   }

//chunkメソッド
>>> $pair = $animals->chunk(2);
=> Illuminate\Support\Collection {#4313
     all: [
       Illuminate\Support\Collection {#4295
         all: [
           "dog",
           "cat",
         ],
       },
       Illuminate\Support\Collection {#4293
         all: [
           2 => "rabbit",
           3 => "cow",
         ],
       },
       Illuminate\Support\Collection {#4303
         all: [
           4 => "wolf",
           5 => "fox",
         ],
       },
       Illuminate\Support\Collection {#4314
         all: [
           6 => "mouse",
           7 => "horse",
         ],
       },
     ],
   }
```

おお、2つずつに別れましたね。


# collapse( )

配列のコレクションを一次コレクションにします。

```PHP:
//collectionを作成
$numbers = collect([[10,20,30],[100,200,300],[1000,2000,3000]]);
=> Illuminate\Support\Collection {#4322
     all: [
       [
         10,
         20,
         30,
       ],
       [
         100,
         200,
         300,
       ],
       [
         1000,
         2000,
         3000,
       ],
     ],
   }

//collapse()メソッド
$collapsed = $numbers->collapse();
=> Illuminate\Support\Collection {#4301
     all: [
       10,
       20,
       30,
       100,
       200,
       300,
       1000,
       2000,
       3000,
     ],
   }
```

一次のcollecttionになりました！


# combine( )

コレクションの値をキーとして他の配列かコレクションの値を結合します。

```PHP:
//collection作成
$collection = collect(['name', 'hobby']);
=> Illuminate\Support\Collection {#4318
     all: [
       "name",
       "hobby",
     ],
   }

//combine()メソッド
>>> $combined = $collection->combine(['aya','music']);
=> Illuminate\Support\Collection {#4305
     all: [
       "name" => "aya",
       "hobby" => "music",
     ],
   }

//以下のように2つ値を与えてみても1つしかダメっぽい。
>>> $combined = $collection->combine(['aya','music'],['nozomi','anime']);
=> Illuminate\Support\Collection {#4296
     all: [
       "name" => "aya",
       "hobby" => "music",
     ],
   }
```
んーこれはどういう時に使うんだろう。。。

6/3 追記
使う場面について
>chunk と combine は CSV ファイルから DB にデータをインポートする時に便利ですね

と教えて頂きました！
ありがとうございます！

今回はここまでにします！
Golangの構造体(struct)の基礎

#Golangの構造体(struct)の基礎
エンジニアになりたての雑魚エンジニアがGolangを学習した忘備録的な記事なので、
間違い等があったら、優しく指摘してもらえるとありがたいです。

参照 スターティングGo言語

##構造体(struct)とは？
複数の任意の型の値を一つにまとめたものである。
基本型、配列型、関数型、参照型、ポインタ型などの様々なデータ構造を持つ型を１つの型として取り扱うことが可能となる。

```.go
struct {
 //ここに任意の変数名 型を定義していく
 Name string
 Age int
}
//また個々のデータをフィールドと呼ぶ
//struct { [フィールドの定義] }
```
構造体に入る前に・・・type!

##型から新しい型を定義するtype
typeとは既にある型をもとに新しい型を定義するための機能である。
これによってエイリアス(別名)を定義することができる。
しかし、あくまで既存の型から新しい型を定義している為、型の互換性は気をつけなければならない。

```.go
type MyInt int
//これで、int型から新しい型であるMyInt型が定義される
//type [新しく定義する型] [既存の型]
```
これを複数でまとめて書くこともできる

```.go
type (
  IntPair [2]int
  String []string
  AreaMap map[string][2]float64
)
//type ()でまとめて定義することも可能
```
メリットとしては、複雑な型定義をプログラムから取り除くことができるため、
コードの見通しがよくなる

#####型の互換性に注意するとは？
下記のコードでパターン１とパターン２は同じだが、パターン３ではコンパイルエラーとなる

```.go
type T0 int
type T1 int

//パターン1
t0 := T0(5)
//5
i0 := int(t0)
//5

//パターン2
t1 := T1(8)
//8
i1 := int(t1)
//8

パターン３
t0 = i0
//コンパイルエラー

```
エイリアスの元となる型とエイリアスで定義した型には互換性が保たれるが、同じint型を元にしたエイリアス同士では型の互換性がなくなる。
エイリアス間では型の互換性がなくなることに注意しなければならない。

また関数型にもエイリアスを定義できる

```.go
type CallBack func(i int) int

//func(i int) int型をCallBackとエイリアスを定義

//第２引数の宣言がtype使わなければ、func(i int) intと書かなければならず、
//なんのための関数だか、見ただけで分からず可読性が下がる
func Sum(ints []int, callback CallBack) int {
	var sum int
	for _, i := range ints {
		sum += i
	}
	return callback(sum)
}

func main() {
	n := Sum(
		[]int{1, 2, 3, 4, 5},
		//ここの部分のを丸っとCallBackとして別名で使える
		//====
		func(i int) int {
			return i * 2
		},
		//====
	)
	fmt.Println(n)
	//30
}

```

##typeと構造体
構造体は上述したように複数の任意の型の値を一つにまとめたものである。
そのまとめた構造体にtypeを使って、新しい型名を与えられる。
構造体は基本的にtypeと併用して使用されるケースが多い。

```.go
type Point struct {
  X int
  Y int
}

//structで定義された構造体にtypeを使って新しい型名を与える
```

##構造体の初期値と代入
構造体は値の一種であり、構造体型の変数を定義すると構造体に定義されている各フィールドに必要なメモリ領域が確保され、型に合わせた初期値を取る

```.go
type Point struct {
  X int
  Y int
}

//Point型の変数を定義
//初期値はint型の0をとっている
var pt Point
pt.X //0
pt.Y //0

//代入
pt.X = 10
pt.Y = 12

pt.X //10
pt.Y //12

//初期値をまとめて与えることもできる
pt := Point{ 1, 2 }
//フィールドを明示的に指定して初期値を定義することもできる
pt := Point{ X: 1, Y: 2 }
//この方法の方が、与えたい初期値を反対に書いてしまう等の
//ヒューマンエラーを防ぐことに加え、コードの可読性も増す
```
##構造体とポインタ
構造体は値型である
関数の引数として構造体を渡しても、値型の為、構造体のコピーがメモリに新たに生成され、それが関数で処理される。
元の構造体には影響を与えられない。

```.go
type Point struct {
	X, Y int
}

func swap(p Point) {
	フィールドX,Yの値を入れ替え
	x, y = p.Y, p.X
	p.X = x
	P.Y = y
}

//X, Yへ値を代入
p := Point(X: 1, Y: 2)

//値の入れ替えを関数で行う
swap(p)

swap関数で処理した後も、構造体の値は変わらない
p.X //1
p.Y //2

変数pが示す元の構造体とswap関数内のコピー構造体は、別であることが分かる

```

値渡しは、新たに別のメモリ領域にコピーを生成してしまうため、
これを元のアドレスを渡す、参照渡しで関数に構造体を渡す必要がある。
そこで、ポインタを使用する。

```.go
type Point struct {
	X, Y int
}

//Point型のポインタへ引数を変更
func swap(p *Point) {
	フィールドX,Yの値を入れ替え
	x, y = p.Y, p.X
	p.X = x
	P.Y = y
}

//X, Yへ値を代入しPoint型のポインタを生成
p := &Point(X: 1, Y: 2)

//値の入れ替えを関数で行う
swap(p)

p.X //2
p.Y //1

```

構造体は主にポインタ型を経由して使用する。
こうすることで、値渡しではなく、参照渡しで処理を実現することができる。
Javaに関するノート

#背景・理由
Javaの周辺知識についてのノート
##リソース
まだ間に合うMaven(再)入門
https://speakerdeck.com/yusuke/madajian-nihe-umaven-zai-ru-men-number-jjug
まだまだ間に合うJUnit(再)入門
https://speakerdeck.com/yusuke/madamadajian-nihe-ujunit-zai-ru-men-number-jjug-ccc-number-ccc-g4
##TakeAway
Maven
pom.xml Project Object Modelの略
%ユーザのホームフォルダ%/.m2/repository
【初学者】ログイン中のユーザー情報を取得する方法

#ユーザー情報を取得する方法
```
use Illuminate\Support\Facades\Auth;
```
コード上部に記載

```
$users = Auth::user();
dd($users)
dd（）で確認するとデータが取れてきているかわかる
return view('index',compact('users'));
```

```
//bladeファイルでユーザー名表示
{{ $users->name }}
```

Auth::user()めっちゃ便利やん
mybatis-spring-boot-starter 2.1 to 2.2

# 概要

mybatis-spring-boot-starter 2.2がGAとなっていたので2.1からの変更点をまとめてみました。

# 対応するSpringBootのバージョン

2.5に対応しています。
spring-bootとのバージョンの対応は以下のとおりです。

mybatis-spring-boot-starter | spring-boot
--- | ---
2.2.x | 2.5.x
2.1.x | 2.4.x, 2.3.x, 2.2.x, 2.1.x
2.0.x ※EOL | -

# Mybatis 3.5.6 → 3.5.7

Mybatisの依存バージョンが3.5.6から3.5.7に更新されています。
この更新はバグフィックスのみで大きな動作の変更はなさそうです。

https://github.com/mybatis/mybatis-3/compare/mybatis-3.5.6...mybatis-3.5.7

# 参考

■Release > complete list of changes.

https://github.com/mybatis/spring-boot-starter/milestone/25?closed=1

# あとがき

まとめたもののたいした内容なさそうだった😇
まぁ初めて追うにはちょうどいい内容だったかな
Recognition of activities of daily living from egocentric videos using hands detected by a deep convolutional network

雑読み
https://eprints.kingston.ac.uk/id/eprint/40873/1/Nguyen-T-H-C-40873-AAM-1.pdf
2018年投稿

## abstract
- 手と物体の相互作用をモデル化,ただし，物体のGTのアノテーションが使える前提
- 一人称行動認識の精度が向上

## method

![スクリーンショット 2021-06-02 21.45.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1584538/d8b179bb-8fc3-eb70-36bf-ba631bbb9359.png)


- 訓練時
    - 各動画を特徴ベクトルに変換
    - k-meansで行動クラスそれぞれについて代表ベクトルを生成
    - 生成した代表ベクトルをマージする（Bug of Visual Wordsが生成される)
    - 全ての動画の各フレームから特徴ベクトルを抽出
    - 行動クラスごとに，抽出した特徴ベクトルがVisual Wordsのどの要素(クラス)に近いかを探し，投票のようなこと(+1)をする
    - 結果として，行動クラスごとにkey-feature-sequenceができる
        - 例えば全てのクラスが全く違う行動であれば，[0,0,0,N,0,0]のようなベクトルになる
        - 似ている行動クラスがあれば，[0,0,0,3N/4,N/4,0]のようなベクトルになる

- 推論時
    - 各フレームから特徴ベクトルを抽出
    - 各フレームの特徴ベクトルについて，訓練時に生成されたVisual Wordsのどの要素に近いかを探し，投票のようなことをする
    - 生成されたkey-feature-sequenceがどのkey-feature-sequenceと近いかで分類する
        - 近さを判断するのにDTW(Dynamic Time Warping)を使用
        
## Experiment

![スクリーンショット 2021-06-02 21.46.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1584538/2f2c8390-d89b-188d-080b-69707e8fa4f5.png)

- 左右の手の距離をd1, 手と行動に関連する物体との距離をd2,d3とする．
    - 物体のGTのBBは使えるという前提あり
- 訓練時に各フレームから特徴ベクトルを抽出するときに，フレームからの特徴量,d1,d2,d3の使用の有無で実験
- フレームからの特徴量は行動に関連する物体の特徴量かも
Java うるう年判定

#【Java うるう年判定】

コーディング試験を体験しました。
書きたいことが頭の中にあっても充分に書けなかった。。
ネットの記事を参考に答え合わせしたけどこんな感じか。

##0年から2020年までのうるう年を判定する。

**うるう年となる条件は以下の通り。**
　・4で割り切れる年はうるう年
　・ただし、100で割り切れる年はうるう年でない。
　・ただし、400で割り切れる年はうるう年である。

```java:Java
public static void main(String[] args) {
 
  //0年～2020年
  for (int i = 0; i <= 2020; i++) {
 
    //年を4で割って、余り0
    if (i % 4 == 0) {
 
      //年を100で割り切れない
      if (i % 100 != 0) {
        System.out.println(i + "年は「うるう年」");
        continue;
      }

      //年を400で割って、余り0
      if (i % 400 == 0) {
        System.out.println(i + "年は「うるう年」");
      //年を400で割り切れない
      } else {
          System.out.println(i + "年は「うるう年」でない");
      }
 
    } else {
        System.out.println(i + "年は「うるう年」でない");
    }
  }
}
```

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
【 6/5 追記】
@fujitanozomu様が当記事のコメントにて、コードのご指摘をくださいました。
ありがとうございました。

こんなにもシンプルに書くことができます。
今回のコーディング試験の失敗を次に活かして、下記のようなコードでシンプルに書けるように自己研鑽に励みます。

```java:Java
public static void main(String[] args) {

  //0年～2020年
  for (int i = 0; i <= 2020; i++) {
    //「年を4で割り切れる」かつ『「年を100で割り切れない」または「年を400で割り切れる」』
    if (i % 4 == 0 && (i % 100 != 0 || i % 400 == 0)) {
      System.out.println(i + "年は「うるう年」");
    } else {
      System.out.println(i + "年は「うるう年」でない");
    }
  }
}
```

##おわりに。

SIerやSESでは無く、Web系の企業様で毎コードを書かれているエンジニアの方は、このようなコーディング試験は簡単に解けるのかな。
あとは、1~100での素数の判定や1~100で特定の一桁の数字が何回出力されるかの判定のコーディング試験が余裕なのかな。
自分ももっと技術力をつけて、ビジネスに貢献できるようになりたい。なる。
[Go] golang.org/x/time/rate でレイトリミット

レイトリミットを実装するために `golang.org/x/time/rate` を採用したものの、しばらく経ってから見返すとその仕様を完全に忘れていてショックだったので、こちらに記事として備忘録的に要点をまとめていきたいと思います。

## トークンバケット

`golang.org/x/time/rate` は「トークンバケット」というアルゴリズムを Go で実装したパッケージになります。
このパッケージは一見すると使い方が分かりづらいのですが、「トークンバケット」を理解すると合点がいくデザインとなっているので、まずはこちらを理解しましょう。

一応 Wikipedia にもページがあるのですが（[トークンバケット - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%83%90%E3%82%B1%E3%83%83%E3%83%88)）、`golang.org/x/time/rate` パッケージのドキュメントを読むのが端的で分かりやすいと個人的には思いました。`Limiter` 構造体に対する説明として記載されておりまして、以下のリンク先から読むことができます。

- [rate · pkg.go.dev](https://pkg.go.dev/golang.org/x/time/rate#Limiter)


## 使い方

例えば、こんなコードがあるとします：

```golang
package main

import (
	"fmt"
)

func main() {
	for i := 0; i < 10; i++ {
		fmt.Printf("%d\n", i)
	}
}
```

コードを見れば自明ですが、このコードを実行すると一瞬で0から9までが出力されます。

```
0
1
2
3
4
5
6
7
8
9

Program exited.
```

それでは次に、レイトリミットを入れていきます。
ポイントは NewLimiter 関数と Wait 関数です：

```golang
package main

import (
	"context"
	"fmt"
	"golang.org/x/time/rate"
)

func main() {
	l := rate.NewLimiter(5.0, 1)
	
	ctx := context.Background()

	for i := 0; i < 10; i++ {
		if err := l.Wait(ctx); err != nil {
			panic(err)
		}

		fmt.Printf("%d\n", i)
	}
}
```

上のプログラムを実行すると、各数字が一定間隔で出力されるようになり、だいたい2秒経過して処理を終えると思います。Wait 関数はその名の通り「待つ」関数です。一定間隔で出力されているのはこの関数が制御を一定時間ブロックしているためです。そして、どの程度待つかをしているのは NewLimiter 関数の引数です：

```golang
func NewLimiter(r Limit, b int) *Limiter
```

r がレートにあたる値で、1秒間に最大何回実行するかを決める数になります。r は Limit 型ですが、これは構造体などではなく単なる float64 なので、float64 実値で指定すれば良いと思います。上のプログラムでは、1秒間に5回実行されるように設定していましたので、10回の出力を終えるまでに2秒程度かかった、ということになります。ちなみに b はバーストと呼ばれる値で、何回までは連続して実行しても良いか、を指定するものです。バーストのユースケースについては「Q&A」の節で考察しておりますが、基本的には1を指定するで良いと思います。

Limit は実値で指定する以外に、Every という便利関数を使う方法もあります：

```golang
func Every(interval time.Duration) Limit
```

Every 関数を使うこと「1秒間に何回」という指定の代わりに、「実行毎にどの程度の間隔をあけるか」という形で指定することができます。先程のプログラム内の NewLimiter 関数呼び出しは、以下のように実装しても等価になります（`1秒 / 5回 = 0.2秒` なので）：

```golang
        interval := rate.Every(time.Millisecond * 200)
	l := rate.NewLimiter(interval, 1)
```

## Q&A

### Every 関数をあえて使う必要がある？

Every 関数はただのユーティリティ関数なので、無理に使う必要はありません。プログラムによっては Every 関a数の指定形式の方が分かりやすく書ける時もあると思いますので、そういった場合にのみ使えば良いです。  
（ちなみに、どうしてか以下のような冗長なサンプルコードが蔓延しているので、あえてこういった Q&A を設けさせていただいております。🤔）

```golang
    interval := rate.Every(time.Second / time.Duration(5))
    l := rate.NewLimiter(interval, 1)
```

### バーストを1以外に指定するユースケースがわからない

レイトリミットを設定しつつAPIを連続してコールするプログラムがあるとします。APIサーバが待ち受けているコネクション数がnで、n個のコールは並列して呼んで良いというときに、バーストをnと設定するといい感じにn個まではウェイトすることなくコールしてくれるので便利、ということだと思います。

### Allow メソッドや Reserve メソッドはどう使うの？

私のコードでは必要なかったのでわからないですが…用意されているということは想定されるユースケースがあるということだと思うので、機会があれば使っていきたいですね。その際にはこちらの記事に解説を追記したいと思います。

### "go.uber.org/ratelimit" はどう？

検索すると、`go.uber.org/ratelimit` に限らず Go のレイトリミット系のパッケージはたくさん見つかりますね。
各パッケージの機能を比較した訳ではないのですが、プレフィクスが `golang.org/x` となっている通り、Go の準標準ライブラリといった位置付けのパッケージですので、個人的にはこちらを好んで使っています。（機能的に優れているなど、他にオススメのパッケージがあれば教えていただけると助かります）
もしメモリ・CPU使用率の監視をシェルスクリプトで書くとしたら

## はじめに

監視といったら、OSSの監視ソフトをサーバーにインストールして行うことが最近は多いと思います。
しかしオンプレ環境では環境を重くしたくないなどの理由から監視ツールを入れるのが億劫なことも多々あるんじゃないでしょうか？
その際、スクリプトを使って簡易的な監視をしたいなんてことも出てくるかもしれません。

今回は、試し書きした物(未完成品)の備忘録です。

※監視といっても、閾値を超えたら「標準出力」「ログファイル出力」をするだけで、どこかに通知するものではないです。
※シェルスクリプト初めて書いてみたので、間違っている部分、イケてない部分あると思います。
※監視初心者です。

## メモリ使用率の監視

```
#!/bin/bash

#日付取得用
YMD=`date +"%Y/%m/%d %p %I:%M:%S"`

#標準出力の出力先ログファイル
MEM_LOG="/home/memory_limit.log"

#メモリ閾値 100%=100で記載
MEM_LIMIT=90
SWAP_LIMIT=10

#メモリ使用率取得
MEM_USED=`free | grep Mem | awk '{ print ($2-$3)/$2*100 }'`
SWAP_USED=`free | grep Swap | awk '{ print $3/$2*100 }'`

#メモリ使用量の閾値チェック
if [ $MEM_USED > $MEM_LIMIT ]; then
echo "$HOSTNAME memory over $MEM_USED %"
echo "$HOSTNAME memory over $MEM_USED %, date is $YMD" >> $MEM_LOG
fi
 
#メモリ使用量の閾値チェック
if [ $SWAP_USED > $SWAP_LIMIT ]; then
echo "$HOSTNAME swap over $SWAP_USED %"
echo "$HOSTNAME swap over $SWAP_USED %, date is $YMD" >> $MEM_LOG
fi
```

### 使い方

```
sh スクリプト名
```

瞬間的にメモリ使用率が閾値を超えているかどうかチェックするスクリプト。
なので一定期間中調査したい場合などは、実行側（例えばcron、ossであればfluentdなど）から、実行時間・実行間隔・終了時間を指定してあげる必要がある。

## CPU使用率の監視

```
#!/bin/bash

#日付取得用
YMD=`date +"%Y/%m/%d %p %I:%M:%S"`

#標準出力の出力先ログファイル
CPU_LOG="/home/cpu_limit.log"

#CPU使用率閾値 100%=100で記載
CPU_LIMIT=90

#cpuの調査間隔
CPU_RESEARCH_INTERVAL=10

function aggregate_over_count() {
    if [ $over_count == $research_count ];then
    # CPU調査の度、毎度閾値を超えていた場合。
    echo "$HOSTNAME cpu is over $CPU_LIMIT %"
    echo "$HOSTNAME cpu is over $CPU_LIMIT %, date is $YMD" >> $CPU_LOG
    fi
}

research_count=0
over_count=0

trap aggregate_over_count EXIT # 正常終了したときに後処理を実行

while :; do
  research_count=$(( research_count += 1))

  if [ `vmstat | sed '1, 2d' | awk '{print $13 + $14}'` -gt $CPU_LIMIT ];then
  over_count=$(( over_count += 1 ))
  fi

  sleep $CPU_RESEARCH_INTERVAL
done

```


### 使い方

```
「timeout 時間 sh スクリプト名」として実行する。
```


上記のコマンドで与えた時間中、CPU_RESEARCH_INTERVALの間隔でCPU使用率の値を調査し、その値が常時90%以上だった場合、閾値超えとしてなんらかのアクションを取るようなロジックにしている。つもり。

おしまい。
【Laravel】Gateでロール毎に権限を分ける

ユーザーの権限を複数作成して、アクセスできるページや表示内容を権限毎に変えたい事はよくあると思います。 
それを簡単に実装できる機能がLaravelにあり、使ってみたらとても便利だったので、メモしておきます。

### 前提条件  
- 権限を２つ以上用意したい（今回は「管理者」と「一般」）
- ログインで使用するユーザーテーブル(usersとする)は下記の通り

```
id
username
email
password
role // 管理者:100 / 一般:1
remember_token
created_at
updated_at
```

### 権限を設定する

```php:app/Providers/AuthServiceProvider.php
class AuthServiceProvider extends ServiceProvider
{
    /**
     * The policy mappings for the application.
     *
     * @var array
     */
    protected $policies = [
        'App\Model' => 'App\Policies\ModelPolicy',
    ];

    /**
     * Register any authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();

        // 管理者のみ
        Gate::define('admin_only', function ($user) {
            return ($user->role_id === 100);
        });
}
```

`$user`には  
`'admin_only'`には、ロールの名前を指定し、functionの中で条件を設定します。  
今回は、usersテーブルのroleカラムが100のユーザーを管理者として設定しました。  

### アクセス制限
管理者しかアクセスできない画面を作ります。  

```php:routes/web.php
Route::group(['middleware' => ['auth', 'can:admin_only']], function () {
    Route::get('account', 'AccountController@index')->name('account.index');
});
```

`can:`で、AuthServiceProvider.phpに設定したロール名を指定し、function内にRouteを設定します。  
こうすると、users.roleが100ではないユーザーがこの画面にアクセスしたとき、403エラーとなりエラー画面が表示されるようになります。

### 権限による表示内容の出し分け
管理者だけに表示したいHTMLがあるとき、下記のように設定します。

```
@can ('admin_only')
  <span>管理者にだけ表示させる</span>
@endcan
```

複数権限があって、それぞれ出し分けたいときは`@elsecan('ロール名')`を使えば良いです。
逆に特定の権限にだけ表示したくないときは`@cannot`
権限がたくさんあり、いくつかの権限に表示したいときは`@canany(['role1', 'role2', 'role3'])`のように配列にして渡すこともできます。 
他にも便利な機能がたくさんあるので、是非↓の参考URLもご覧ください。

参考URL：[公式 Laravel 6.x 認可](https://readouble.com/laravel/6.x/ja/authorization.html)
【HTML】要素のグループ化

#1.情報をグループ化する
HTMLの情報をグループ化することで、以下の恩恵があると理解しています。

* ページ内の情報を理解しやすくなる　→　他人に優しいコードになる
* CSSによるスタイルの割当が容易になる。

HTML5から新たに意味のある要素が追加されました。
本記事の執筆時点では、CSSを未学習なので恩恵を受けているわけではありませんが、今後恩恵を享受できるようになってくるんですかね。
自分の整理のためにこの記事を書きます。

#2.主に用いる要素たち
主に使用する要素を2.1以降に整理します。
ページ内の情報を区分けした図が以下になります。拝借させていただきました。

![html-construction.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584833/dc2b6372-1932-ddc3-d863-06a6e8ed3aff.jpeg)

引用元：https://blog.proglus.jp/4006/

##2.1 div要素
それ自体には意味を持たず、単にグループ化するための要素です。
`<div>要素の中身</div>`でマークアップします。

##2.2 header要素
文書およびセクションのヘッダー領域を示します。
`<header>要素の中身</header>`でマークアップします。
サイトのメインタイトルやリード文を記載する領域です。

##2.3 nav要素
現在のページ内の他の部分や、他の文書へのナビゲーションリンクを提供するためのセクションを表します。
メニューや目次、索引などが該当します。
`<nav>要素の中身</nav>`でマークアップします。

##2.4 main要素
メインコンテンツ領域として、ページの主要な内容を表します。
`<main>要素の中身</main>`でマークアップします。

##2.5 article要素
これだけで独立した自己完結したセクションとして、ブログの記事本文などを表します。
main要素の中で使うのが一般的でしょうか。
`<article>要素の中身</article>`でマークアップします。

##2.5 section要素
自立した一般的なセクション (区間) を表します。
基本的には見出しを置くものです。
`<section>要素の中身</section>`でマークアップします。
これは、私もはっきりと理解できているわけではないので、以下を参照してください。

https://developer.mozilla.org/ja/docs/Web/HTML/Element/section

##2.6 aside要素
補足的なセクションを表すときに用いる要素です。
ページの主題とは間接的な関連しかないような場合に使用します。
`<aside>要素の中身</aside>`でマークアップします。

##2.7 footer要素
ページのフッター領域を示します。
フッターには通常、そのセクションの著作者に関する情報、関連文書へのリンク、著作権情報等を含めます。
`<footer>要素の中身</footer>`でマークアップします。
【Vue.js】vue-paginateを使ってページネーションを実装


#vue-paginateとは

vue用のページネーションをシンプルに実装できるライブラリになります。

#vue-paginateの導入方法

以下のnpmを使ってインストールします。

- npm
 
```
npm install vue-paginate --save
```

#導入手順

###1.ライブラリの取り込み

```javascript
import Vue from "vue";
import VuePaginate from "vue-paginate";
Vue.use(VuePaginate);
```


###2.メソッドを設定

```javascript
export default {
  data() {
    return {
      allData: [],
      paginate: ["paginate-log"],
    };
  },
```

###3. テンプレートを準備

```html
<paginate name="paginate-log" tag="ol" :list="allData" :per="12">
 <List v-for="(list, index) in paginated('paginate-log')" :index="index" :list="list" :userDatas="userDatas" :key="list.id"/>
</paginate>
<paginate-links for="paginate-log" class="pagination flex" v-scroll-to="postTop" :show-step-links="true">
</paginate-links>
```

詳細につきましては、[Github](https://github.com/TahaSh/vue-paginate)をご参照ください。
仮想マシンのエラー対処法

#仮想マシンならCPUはIntelにしたほうがいい
最近はIntel製でなくても性能が宜しいものが出てきたので、AMD製のプロセッサーを積んだPCがより安価に売られている。性能が同じで互換性があるのならば当然安い方を選ぶ、ということでAMD製のPCを購入した・・・が、仮想マシンを使うならIntel製を購入すべきであった。動作保証をしているのはIntelCPU。AMDでは挙動が不安定で、windowsや仮想マシン自体のバージョンアップによって起動しなくなったりが多く、TwitterやネットでもAMD製PCでの仮想マシン使用は相性が悪いという意見が多い。環境設定で時間食うとまじで萎えるので備忘録としてまとめておく。

この話に出てくる仮想化マシン= 『Virtual Box』と『VMware』
#多く挙がっているエラーとその対処法・確認事項
##Error：そのCPUは仮想化支援をサポートしているか
そもそも仮想化マシンに対応するベースがあるPCじゃないと仮想化マシン使えません。

##Error：BIOSで仮想化がenableになっているか
CPUがIntel VT-xまたは、AMD-Vに対応していたとしても、BIOSの設定でこの機能が無効にされていることがある。BIOS menuでenableに変更してくれ。
\>> https://www.archlinux.site/2018/08/windows-10vmwarebios.html
\>> https://www.tekwind.co.jp/ASU/faq/entry_134.php

##Error：Windowsレジストリに仮想マシン系が残っていないか
今回2度目以降のインストールだという君。Virtual boxをアンインストールしても、残りかすをつくって去っていくOracle社の仮想マシンを使ってはいないだろうか。その名も"Virtual Box"。あぁなぜ片付けてくれないんだ・・・。レジストリから手動で消してください。再度インストールし直しても、残りかすがあるとConsole wrapすることがある。
\>> https://ts0818.hatenablog.com/entry/2020/03/07/224428

##Error：GUIのインストールがうまくいかない
CLIのインストールはうまくいく。しかし、インストール画面でそもそもマウス操作をしていると、あるx座標より右にポインタがいかず、結局キーボード操作を駆使して頑張ってCLIのインストールを終えた君。
この問題は現在調査中だ・・・。というか自分も知りたいので知っていたら教えてほしい。


##Error：kaliはインストールできるのに、CentOSがインストールできない
これは自分も知りたい。


##結論：AMD CPU ユーザーにとって各種仮想マシンは使いづらい
上記いずれの解決策も功を奏さなかった場合、AMD CPUのハードウェア上の問題が浮上する。この場合、もう仮想マシンを使うのをあきらめ、普通にLinuxとしてUSBブートで外付けで起動する or ラズパイや中古PCでも買って、壊しても良いPCとして直でインストールするかしかない。

##USB boot (Live USBの作成)
__＜USBからbootする際に必要なもの＞__
USB 4GB以上
Rufus --- USBに指定したisoファイルを自動でUSBブート仕様に変換してくれるフリーソフト。シングルインストーラのみ作成可能。
WinSetUpFromUSB --- 上記同様のフリーソフト。__マルチインストーラ作成対応__！
Live USBの作成方法はググればいろんな人が記事にしてくれているので割愛。

作成したら電源入れてからOSが立ち上がるまでの間にdelキーを連打して、BIOS設定画面に行ってくれ。ブートの起動順序を変更する必要がある。これに関してもたくさんネットに記事があるので割愛。
\>> https://www.pc-koubou.jp/magazine/35542
\>> https://blog.mktia.com/how-to-make-ubuntu-live-usb/

#CentOSのインストール
##Error：新品USBなのにインストール先のUSBの容量不足と表示される
そう。この問題。Linuxは未指定領域に新しくLinux用のパーティションを作成するように作られている。windows用のパーティションを壊さないように配慮してかしないでか知らんが、めっちゃ不便。新品のUSBは基本的に最初からパーティションが割り当てられている。なので、こいつをフォーマットしてノーパーティション状態じゃないとLinux側は空き容量を認識してくれず、容量不足でインストールできない。領域の確保ボタンがあるはずなので、そこから対象のUSB内部のパーティションを削除し、再度割り当て的なボタンを押すとインストール先の指定が完了する。
\>> https://teratail.com/questions/292268