OmniAICreator/Qiita-1.07M huggingface dataset:
AndroidStudioでKotlinの変数を覚える

#ここまでは
空のアクティビティの生成イベントを利用して画面に値を表示する方法がわかったところで次に進みます。

```MainActivity.kt
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val tvMain = findViewById<TextView>(R.id.tvMain)
        tvMain.setText("Hello Kotlin World!")
    }
}
```
MainActivity.kt を上のように2行追加すると Hello World!の代わりに Hello Kotlin World!が表示されます。

この**tvMain.setText("Hello Kotlin World!")**
の所を変えて色々試して見ましょう。

##Kotlinの変数
setTextの引数に直接値を渡さずに変数**str**を使って渡してみましょう。
その上の行を参考に

```MainActivity.kt
  val str = "Hello Kotlin World!"
  tvMain.setText(str)
```
たったこれだけで簡単に実現できました。でも色々疑問も出てきますね。

###Kotlinは「;」セミコロンが要らない
様々な言語では命令文の区切りとして必ず**「;」セミコロン**を付ける必要がありましたがKotlinでは付けません。付けてもエラーにはなりませんが付けないのが一般的のようです。
**※VisualBasicもなかったような**

###Kotlinは変数の定義場所が自由
変数の定義は最初に行う言語が多いですが、Kotlinではどこに書いても構いません。

###Kotlinでの命名規則
これを記載している段階でまだ仕様や規約を探しきれていませんが
1.変数は小文字で始まる
2.変数の型は大文字で始まってる
3.定数は全て大文字で命名の区切りは「_」アンダーバーで区切る
とされていてそれ以外は**Java**の命名規則に従っているようです。

###Kotlinでの型宣言
C言語などで 整数型の変数 i を宣言しようとすると

```C.cpp
int i;
```
という書き方になります。これがKotlinだと

```Kotlin.kt
i : Int
```

と宣言と変数の位置が逆になります。Kotlinの宣言には初期化が必要なので

```Kotlin.kt
i : Int = 0
```

のように記述します。

PascalやDelphiのような連続定義は出来ないようです。

```Delphi.pas
  i,j : Int; // KotlinではNG
```
###Kotlinの型推測
例題では

```kotlin.kt
val str = "Hello Kotlin World!"
```

のように型を書きませんでした。これは初期化の時に渡した値で型が推測されるためです。
文字列と数値は渡す値で区別しやすいですが、間違って型が推測されるよりは型指定した方が良いように思えます。

###Kotlinで良く使う変数型

```kotlin.kt
var str    : String= "漢字対応"  // 文字列 
var int    : Int = 0            // 32bit符号付き数値
var long   : Long = 0L          // 64bit符号付き数値
var double : Double = 0.0       // 64bit浮動小数点数値
```

StringとIntはよくわかりますが LongとDoubleは初期化する数値の表現に注意が必要です。
Longの場合は数値の後ろに「L」をDouble型の場合は小数点以下が無くても 0.0という表現にしないとエラーになります。
このように初期化する値の表記が異なるので型の指定が無くても推測されるのです。

Int型の初期化時の書き方はさらに

```kotlin.kt
var dec : Int = 16
var hex : Int = 0x10
var bin : Int = 0b00010000
```

10進、16進、2進で表現した数値を代入することが出来ます。
10進数の10、16進数の 10h、2進数の 0001 0000 はどれも同じ値になります。
通販商品ページをVBAで量産

##背景
通販サイトの商品ページを作る際に
このようなページを何度も作る事があります。

```html:product.html
<img src="https://image.rakuten.co.jp/test/abc-1.jpg"></br>
<img src="https://image.rakuten.co.jp/test/abc-2.jpg"></br>
<img src="https://image.rakuten.co.jp/test/abc-3.jpg"></br>
```

商品によって頭文字（abc)が違うものになり
写真が2枚なら-2.jpg　10枚なら -10.jpgまであります。

どうやって商品の良さを伝えるかと
photoshopに向かう時間が好きでそちらの時間を増やしたいです。
その後の手作業でHTML100個作るのは苦痛で、VBAで作ってみました。

##excelとVBA
作ってみると意外と簡単

![excel.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376165/3ae48ac0-a240-b980-a212-c6a6a457e028.jpeg)


A行にフォルダ名を入れる。
そのフォルダの中に「1.jpg 2.jpg・・・」商品画像が入っています。

B列には画像の名前につけた頭文字を設定する
1.jpg　が　aaa-1.jpgになるのがゴール

E列に楽天の画像URL
aaa-1.jpg　が　https: //image.rakuten.con.jp/test/aaa-1.jpg　となるのがゴール

```vb:html作成.xlsx
Sub html作成()
Dim folder As String
Dim head As String
Dim rakuten_img As String
Dim target As String
Dim i As Long
Dim file_names As String
Dim accu As String
Dim datFile As String

'ファイル名と頭につける文字を取得
With Worksheets("sheet1")
For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
    folder = .Cells(i, 1).Value
    head = .Cells(i, 2).Value
    rakuten_img = .Cells(1, 5).Value
    
'ターゲットとなる場所
    target = ThisWorkbook.Path & "\" & folder & "\*.jpg?"
    
    'ターゲットに入ってるファイルを取得します。1.jpg,2.jpgしかない
    file_names = Dir(target)
    accu = ""
    
   '<img src="1.jpg" /><br/>
   '<img src="2.jpg" /><br/> を表現
   
    Do While file_names <> ""
    'htmlを蓄積して
    accu = accu + "<img src=" & Chr(34) & rakuten_img & head & "-" & file_names & Chr(34) & " /><br />" & Chr(13) + Chr(10)
    file_names = Dir()  '次のファイルを取得
    Loop
    
    
    '名前を変えるためにもう一度　前のloopでやるとうまくできないので
    file_names = Dir(target)

    'file_names<>""にするとリネームしたものを再度リネームしちゃうので
    '頭文字がついていないものだけをリネームする仕様へ
    
    Do While InStr(file_names, head) = 0
    '名前も変更
    Name ThisWorkbook.Path & "\" & folder & "\" & file_names As ThisWorkbook.Path & "\" & folder & "\" & head & "-" & file_names
    file_names = Dir()  '次のファイルを取得
    Loop
    
    
    '蓄積の最後にサイズリンクを入れる
    accu = accu + "<br />" & Chr(13) + Chr(10) & "<p>その他のサイズ柄</p>" & Chr(13) + Chr(10)
    
    datFile = ThisWorkbook.Path & "\" & head & ".html"
    
    'ターゲットフォルダに123456.htmlを作って、<img>のつなぎ合わせを書き込む
    '書き込み処理
    Open datFile For Output As #1
        Print #1, accu
    Close #1
    

Next i
End With    
End Sub
```

各フォルダにDirで訪問して
そのフォルダに何が入ってるか調べて
\<img src="URL">\<br/> 
の形にして、それを蓄積を繰り返して出力する。
ついでに画像の名前を変える。

名前変更の際にDo　while<>にしたら、2回名前が変更されたので
頭文字がすでについちゃってる分は、変更しないように切り替える
do while instr(file_names,head)=0

動きはこちら
![rusult.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376165/b1d0fc5d-6092-a00a-e42c-37055ba29e8f.gif)


最終的にはhtmlは、一括で商品csvに貼り付けるので
htmlファイルを作成でなく、セルに貼り付けたほうがよいと思うけど
ほぼしたいことができた。

あとは並べたい写真を集めて、リネームだけの仕事。繰り返しのhtmlは書かない。
GNU Octaveの歩き方 

GNU Octave をこれから始める人に役に立ちそうなことをまとめました。具体的な文法などは他のサイト、記事にあたってください。

# GNU Octave とは
GNU Octave はフリーの数値計算ソフト（言語）でMATLABと互換性が（ある程度）あります。私はオーディオの測定・解析・フィルタ設計などに使っています。
 初心者にも分かりやすく、グラフなども簡単に描けます。

# GNU Octave　公式サイト
https://www.gnu.org/software/octave/



# Octave のインストール
## windows
[公式サイト](https://www.gnu.org/software/octave/)のダウンロードページからインストーラーをダウンロードします。
## mac
Homebrewでインストールできるようです（macは持ってないので...）
## Linux
ディストリビューションのパッケージマネージャーを使ってインストールします。flatpakを使う方法も有りますが、ディストリビューションのパッケージマネージャを使うほうが面倒が少ないです。
Ubuntuならコマンドラインで

```
sudo apt install octave
```
### Raspberry Piに関する注意
標準のRaspbian Busterでグラフが描けない不具合が有ります。Ubuntu64bitなら大丈夫です。
[Raspberry Pi でOctave を使う](https://qiita.com/assi-dangomushi/items/0be56e1376840283ca61)

# Octaveの起動
コマンドラインで

```
# GUIで起動
octave --gui

# CUIで起動 
octave --no-gui
```
オプションを指定しなかった場合にどちらが起動するかはバージョンにより違います。

# パッケージ
Octave は色々なパッケージがあって機能拡張することができます。
パッケージの公式ページ
https://octave.sourceforge.io/


##パッケージインストール
Windowsでは基本的なパッケージはインストール済みです。
Ubuntu の場合にはOctave内からpkgコマンドでインストールするよりもaptを使ってインストールしたほうが楽です。

```
# signal packageをインストールする場合（Ubuntu,Debian）
sudo apt install octave-signal
```
インストールされているパッケージを表示するにはOctaveのコマンドラインで

```
octave> pkg list
```


## パッケージのロード
パッケージはインストールしただけでは使えません。ロードする必要が有ります。
signal package をロードする場合、Octaveのコマンドラインで

```
octave> pkg load signal
```
いつも使うパッケージは ~/.octaverc などに記入してしまいましょう。

# GNU Octave の情報
Octaveの情報をどこで得るか、簡単にまとめました。
## 公式サイト
なにはともあれ公式サイトのDocsページ
オフラインで見たければ[PDFファイル](https://octave.org/doc/)もあります。
同じものはGUI起動のoctaveのドキュメントタブ
CUI起動のoctaveの場合はコマンドラインで

```
octave> doc
```
で見ることができます。CUIの場合にはinfoで表示されるのでキー操作に慣れが必要です。


## 関数（演算子・キーワード）の情報
octaveコマンドラインでhelpコマンドを使います。
help の後に関数名または演算子、キーワードを入力します。

```
octave> help 関数名
```
関数ファイルのコメントが表示されます。自作関数にもコメントで使用法の説明を入れてhelpコマンドで表示できるようにしておきましょう。

演算子を表示するにはOctaveのコマンドラインで

```
octave> help .
```
演算子・キーワード・関数をすべて表示する

```
octave> help --list
```

この場合でもロードしていないパッケージ内の関数は表示されません。

パッケージについては
https://octave.sourceforge.io/
を参照してください。

## MATLABのサイト
Octave はMATLABと互換性があるのでMatlabのサイトが参考になります。
日本語サイト
https://jp.mathworks.com/products/matlab.html?s_tid=hp_products_matlab

中にはoctaveの公式サイトの説明が不完全で、MATLABのサイトを見ないと詳しい使い方がわからない関数もあったりします。
ただし、MATLABにはあるのにOctaveにはない関数も多くあるので注意してください。

## Octave入門
"octave入門"あたりでググれば色々なサイトがヒットします。あちこちの大学の講義資料なんかも有ります。
古い情報が多いですが、v2.xの頃と基本的な文法は変わってないのでたいてい大丈夫です。

# Octave のバージョンについて
最新版が良いとは限りません。
v5.0に上がった直後はsignalパッケージのバージョンアップが間に合わずに使えないなんてこともありました。
またUbuntuのLTSは2年に一度でその間、基本的にOctaveのバージョンも変わりません。Octaveのバグフィックスは同じバージョンではなく、次のバージョンになるので（頻繁にバージョンが上がる）うっかりするとバグ入りで不安定なバージョンを使い続けることになります。
Ubuntu20.04に入る5.2.0はそこそこ安定しているようなので、一安心です。
連番の初期値リストを作る

angular(typescript)で
1 2 3 ・・・　100など連番の初期値リストを作る

```typescript

  ageList = [...Array(10).keys()].map((i) => {
    i++;
    return i * 10;
  });
  monthList = [...Array(12).keys()].map((i) => ++i);

```

```html
<div>
  <span *ngFor="let age of ageList">{{ age }}歳</span>
</div>
<div>
  <span *ngFor="let month of monthList">{{ month }}月</span>
</div>
```
![スクリーンショット 2020-05-24 12.10.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607742/7f08320e-c9ec-a5c3-2163-1840bc995ea6.png)


0から始めたいときは++iをi++にする

...　を使った書き方については
[「…」←これ、ただの省略記号かと思ってました。（Spread operatorのお話）](https://analogic.jp/spread-operator/)
[スプレッド構文](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_syntax)

keysについては
[Array.prototype.keys()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/keys)
ブランチを切って過去のコミットを取り入れる方法

##前提

・現在masterブランチにいる。
・masterブランチには最新のコミットをpush済み。
・テストが通らなくなったので怪しいコミットの部分まで遡りたい。




```
$  git log   #戻りたいコミットIDをコピーする

$  git checkout -b testbranch   #masterブランチから検証用のブランチを作成

$  git reset --hard #戻りたいコミットID

$  git log  #過去の怪しいコミットに戻れているか確認。
```

念の為ローカルのファイルにも反映されているか目視で確認しましょう。
プルリクエストを使用した開発について　〜自分用〜

#プルリクストとは
Pull Requestの略で、Githubの機能の一つ。誰でもどんなリポジトリに対しても、修正や機能追加を提案できる機能。

共有のリポジトリ(master branch)を操作することが出来るのは、基本的にリポジトリの管理者だけである。チーム開発をする際はBranchを切り、別のBranchから、本番環境に対してプルリクを出し、採用となれば（マージ）、本番環境に反映する。

#プルリクエストを使った開発プロセス
プルリクエストを利用したプロセスは、以下の流れで行う。

１．[ 開発者 ] 作業対象のソースを clone または pull。

２．[ 開発者 ] 作業用のブランチを作成。

３．[ 開発者 ] 機能追加、改修といった開発作業を行う。

４．[ 開発者 ] 作業が完了したら pushを行う。

５．[ 開発者 ] プルリクエストを作成する。

６．[ レビュー・マージ担当者 ] 通知されたプルリクエストから変更を確認しレビュー。

７．[ レビュー・マージ担当者 ] レビュー結果を判断し、必要ならば開発者にフィードバック。

８．[ レビュー・マージ担当者 ] レビューの結果、問題がない場合はマージする。

９．[ レビュー・マージ担当者 ] レビューの結果、対応自体が不要となるなど、プルリクエスト自体が必要ない場合はクローズする。

上記の3〜7の工程を、必要な分だけ繰り返す。その結果、最終的にマージされるソースコードの品質を向上させる。
【Swift5】自作クラス（と配列）をUserDefaultsに簡単に保存する

## はじめに
初めまして。Lukeです。

この記事では自作クラスをUserDefaultsに簡単に保存する関数を紹介します。

ちょっとしたデータの保存はUserDefaultsを使うのが一般的ですが、保存できる型が限られています。
対応していない場合はDataに変換して保存する必要があり、少し面倒です。
そこで今回は関数（と言っても大したことはないですが）を作成しました。

## 保存したいクラス

```Swift
class Friend: NSObject, NSCoding {
    var name:String?
    var age:Int?

    init(_ name: String?, _age: Int?) {
        self.name = name
        self.age = age
    }
    
    func encode(with coder: NSCoder) {
        coder.encode(name, forKey: "name")
        coder.encode(age, forKey: "age")
    }
    
    required init?(coder: NSCoder) {
        name = coder.decodeObject(forKey: "name") as? String
        age = coder.decodeObject(forKey: "age") as? Int
    }
}
```

ポイントは１行目に`: NSObject, NSCoding`と加えることと、エンコード・デコードの部分を用意することです。

## 保存、取得用の関数
### 通常

```Swift
extension UserDefaults {
    func getFriend(_ key:String) -> Friend? {
        if let storedData = UserDefaults.standard.object(forKey: key) as? Data {
            if let unarchivedObject = try! NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(storedData) as? Friend {
                return unarchivedObject
            }
        }
        return nil
    }
    
    func setFriend(_ friend:[Friend],_ key:String) {
        let data = try! NSKeyedArchiver.archivedData(withRootObject: friend, requiringSecureCoding: false)
        UserDefaults.standard.set(data, forKey: key)
    }
}
```

### 配列の場合

```Swift
extension UserDefaults {
    func getFriends(_ key:String) -> [Friend]? {
        if let storedData = self.object(forKey: key) as? Data {
            if let unarchivedObject = try! NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(storedData) as? [Friend] {
                return unarchivedObject
            }
        }
        return nil
    }
    
    func setFriends(_ friends:[Friend],_ key:String) {
        let data = try! NSKeyedArchiver.archivedData(withRootObject: friends, requiringSecureCoding: false)
        self.set(data, forKey: key)
    }
}
```

## 使用方法
この関数はUserDefaultsの拡張なので、このように使います。

### 通常

```Swift
let boy = Friend("Tom",25)
//保存
UserDefaults.standard.setFriend(boy,"friend")
//取得
let friend = UserDefaults.standard.getFriend("friend")
```
### 配列の場合
```Swift
let boys = [Friend("Tom",25),Friend("Bob",18)]
//保存
UserDefaults.standard.setFriends(boys,"friends")
//取得
let friends = UserDefaults.standard.getFriends("friends")
```
## おわりに

通常のUserDefaultsのように１行で使えるので、コードが見やすくなると思います。

間違っている部分があったら教えていただけると助かります🙇‍♂️
【MySQL】外部キー制約を一時的に無効にする

#きっかけ
CRUD処理の開発中にテストで一回論理削除したデータを復活させたくなったけど、データに外部キー制約がかかってて戻せない...
一時的に外部キー制約無効にしたい！

#解決法
外部キー制約を無効にする

```sql
SET FOREIGN_KEY_CHECKS = 0
```

有効に戻す

```sql
SET FOREIGN_KEY_CHECKS = 1
```

外部キー制約がかかっているテーブルをDROP TABLEで削除したい場合も、上記のコマンドで無効にすることで削除できるようになります。削除した場合、外部キー制約をかけていたテーブルの制約も削除されます。

#参考
[MySQL 5.6 リファレンスマニュアル](https://dev.mysql.com/doc/refman/5.6/ja/create-table-foreign-keys.html)
Visual StudioからAWS CodeCommitを使う

Visual Studio Community 2017からAWS CodeCommitを使えそうだったので、調べて、その結果を、まとめる。

# 1. はじめに

## 1.1AWS CodeCommitについて

### 料金
5ユーザーまで無料でOK。
https://aws.amazon.com/jp/codecommit/pricing/

# 2.準備

## 2.1 AWSでの作業
以下のページに従って操作する。
https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/setting-up-ide-vs.html

何か問題が出たら、問題と解決したやり方について記載することとする。

### ステップ1でIAMユーザの準備で「Security credentials」タブが見つからない
「ステップ 1: IAM ユーザーのアクセスキーとシークレットキーを取得する」に従って、「IAM ユーザーのアクセスキーを作成するには」の操作を実施。
「Security credentials」は「認証情報」だが、わからなければ、画面左下の言語を日本語から英語表記に変更するとわかりやすい。

## 2.2 Visual Studioでの作業

### チームエクスプローラに表示されない
[拡張機能]-[拡張機能の管理]から「Visual Studio Marketplace」で"AWS"をキーワードに検索し、「AWS Toolkit for Visual Studio 2017 and 2019」をダウンロードし、導入する。ダウンロード後、Visual Studioを終了するとインストーラが動き出す。

### チームエクスプローラでAWS CodeCommitに接続できない
エラーが出て、一度消したら元に戻らなくなった・・・
別環境にVisual Studio 2019を入れてもう一度試す・・・

### 接続時の「New Account Profile」にある「Account Number」について

12桁の番号。以下を参考に
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/console_account-alias.html

# 3.運用

## 3-1.クローン

### クローン時のユーザ名とパスワード
IAMでユーザを作成し、IAMから「AWS CodeCommitのHTTPS Git認証情報」
で認証情報を生成する。
Jetson nanoをセットアップする

# Jetsonをセットアップする
サークルでJetsonを買ったのでセットアップしていきますー！
この記事はOSが起動するまでを書いていきます
![0488D1C9-19BB-465D-899A-9A00CFA4CE9C.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641105/70254ba3-3ce7-fd54-cba9-1c176ed28872.jpeg)


# 必要なもの
電源(5v2A以上のUSB充電器か、5.5mmのDC電源)
SDカード
Wifiドングル
マウス、キーボード
ディスプレイ

#開封
![F82F0582-2B1D-4FBF-A6F1-64A9AFD61D8F.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641105/e52d4b3f-2359-2576-ef11-88e0afb56dc0.jpeg)
案外シンプルかも

内容物は**Jetson本体、説明書、紙の台だけ**
この微妙に余った段ボールのスペースには何も入ってません(筆者が振って確かめました)
この余分なもの削ればいいのに…

#電源について
**最低でも5v2A以上の電源を買ってください**
一応5v2AでのUSB給電での動作は確認しました
ただし、これはjetsonの性能をセーブした状態での動作になるため５v4Aぐらいの電源の方がいいです

##DCジャック電源を利用する時
DCジャック電源を利用する時はジャンパピンをショートさせます![3353DDCE-A246-4C99-84CA-68D02F92471D.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641105/a0d3787c-e1b4-b40c-74e6-897055beb0d6.jpeg)
画像の場所にジャンパピンがついてると思うので隣のピンとショートさせます
なんか昔はジャンパピンが付属してなくて大変だったそうです

追記
JetsonNanoにはUSBデバイスモードというのがあり、USBでSSHできるらしのですが、それを利用するときはDCジャックからの給電が必須となります。

#OS
Jetson nanoのOSは下記からダウンロードできます
https://developer.nvidia.com/embedded/downloads
このOSはUbuntu18.04ベースです
ファイルは6GBぐらいで解凍するとimgファイルが入っていると思うので、それをSDカードに書き込んでください
ここら辺はJetsonを買おうと思っている方にとっては経験あると思うので割愛します

#wifiにつて
Jetson nanoにはwifiモジュールはついてないので自分で買う必要があります
選択肢は2つあって
 ・ jetson推奨のWifiモジュールを買う（ノートのWifiモジュールみたいなやつ）
 ・ USBドングルのWi-Fiモジュールを買う

前者につては少々お高いです、なので今回はUSBWi-Fiモジュールを使いました。
https://www.amazon.co.jp/gp/product/B008IFXQFU/ref=ppx_yo_dt_b_asin_image_o01_s00?ie=UTF8&psc=1

TL-WN725Nという格安モジュールです(安さは正義！)

調べてみればわかるのですが、USBWi-Fiモジュールは相性問題があり、運が悪いとドライバのインストールとかめんどくさいことになるので注意

#起動
問題がなければ以下の画面が表示されます
されなかった人は....ファイト！
![E89912A1-96C8-47A3-84EE-9DC7998D389D.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641105/7f0a68e0-f42a-b993-d2d8-62e5b1b0a6f1.jpeg)

この記事では紹介しませんがJetcardというパッケージをインストールするとsampleでGPGPUできます

![6EE40278-689F-4F6C-B9DB-7C15D91139D0.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641105/fa5fb2ce-e6b6-5076-3fd2-52243333c341.jpeg)

楽しーーー！(変人の自覚はある)

#最後に
Jetson nanoは１万でCUDAとLinuxが遊べるようになるのでおススメ
時代はGPUよ！
CUDAで上げろ、自分の市場価値！
スイッチ、ルーター、ハブ、ブリッジの違い

# Layer 2
|機器|説明|
| --- | --- |
|リピータハブ|送信されてきたフレームを、接続された全てのPCに送信する|
|ブリッジ|送信されてきたフレームを、次の送信先PCのMACアドレスと紐づくポートに送信する|
|スイッチングハブ|高速なブリッジ|
|L2スイッチ|VLAN機能を持つブリッジ。VLANとは、1つのスイッチ内に仮想的に複数のスイッチを用意し、セグメントを分割する機能|

# Layer 3
|機器|説明|
| --- | --- |
|ルーター|ポートと送信先PCのIPアドレスを紐付けたブリッジ|
|L3スイッチ|VLAN機能を持つルーター|

# [補足]VLANの2つの方法
|方法|説明|
| --- | --- |
|ポートVLAN|ポートとセグメントを紐付ける|
|タグVLAN|送信データにVLANタグを付加する。送信先PCはタグでセグメントを判断する。タグにより、1つのポートで複数のセグメントを扱えるため、使用ポートの節約が可能|
簡単に椅子を前傾椅子にする

# はじめに
家にあるもので前傾椅子をつくる方法を考えてみました。

# 用意するもの

- 椅子
- 頑丈なもの

# 方法

椅子の後ろの足のしたに頑丈なものを置くだけです。自分は2.5kgのバーベルプレートを使用しました


![学習椅子を前傾にする.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282788/a717b180-6134-f392-96ec-e8622e30a082.png)
EC2でデプロイした本番環境にELBを使ってssl化をする際の詰まったところ・注意点

下記URLを参考にELBを設定したのですが10日ほどつまづいたのでメモします.
https://recipe.kc-cloud.jp/archives/11084

##一番簡単なパターンのELB(+ACM発行証明書)→EC2の形

初学者はとりあえず一番簡単なパターンのELB(+ACM発行証明書)→EC2の形でssl化を行うのが良いかと思います。
EC2内のファイルを加筆、変更しなくて済みます。
もう一度言います。

##EC2内のファイルを加筆、変更しなくて済むので初学者はとりあえず一番簡単なパターンのELB(+ACM発行証明書)→EC2の形でssl化を行うのが良いかと思います。

構成は次の通り。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568461/b19ccdd6-fc19-79bc-70b9-d21abc871b93.png)


##注意点

###ACMで証明書を発行する際に入力するドメイン名はアプリ名.confに書いたドメイン名と同じにする必要がある。
つまり、取得したドメイン名はaaaa.comだけど、アプリ名.confにwww.aaaa.comと書いたらACMの方にもwww.aaaa.comをつける必要があります。

ACMで証明書を発行するドメイン名とnginx周り＆Route53周りのドメイン名が異なると

```
NET::ERR_CERT_COMMON_NAME_INVALID
```

というエラーが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568461/28479001-f91d-cfdf-3ba9-a3e30f835e7c.png)



###ELB（ロードバランサー）用のセキュリティグループのインバウンドルールのソースは0.0.0.0/0、::/0にする。
下記画像のようにしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568461/a8eb947c-cb1d-6965-08b4-7207d6a95b9f.png)

ソースの部分でマイIPを指定してしまうと自分だけがアクセスできて第三者がアクセスできなくなります。

ACMでSSL化の証明書を発行した場合はnginxでリダイレクトさせようとするとうまくいかないので、上記のようにELBでリダイレクトさせるのが良いです。


###サブネットは2つ以上作成する必要がある。

###nginx.confの設定はそのままで良い。


```
ssl_certificate "/etc/pki/nginx/server.crt";
ssl_certificate_key "/etc/pki/nginx/private/server.key";
```
これは証明書までのパスを書き込むので、ACMで発行している場合EC2にはないのでnginx.conf内に書かなくて良い。
PHP 実行時に選択肢を出したい(標準入力)

<h1>やりたいこと</h1>
今回やりたいこととしては、PHPファイルを実行して下記のような選択肢を出したい。

```
$ php sample.php
sample.phpを実行しますか? (y/n)
```

こいつを作ってみたい。

恐らく、『PHP 標準入力』などでググれば出てくる。


<h1>実践</h1>
簡単な処理を書いてみました。

```sample.php
<?php

echo 'sample.phpを実行しますか? (y/n)';

$anser = trim(fgets(STDIN));

if($anser == 'y'){
    echo '実行しました';
} else {
    echo '中断しました';
}

?>
```

下記でできるみたいですね。

```
$anser = trim(fgets(STDIN));
```
動画を限定公開する際にひっかかったこと2

#この記事を読もうとしている方へ
すみません、技術的に高度なことは書いてありません。
もし万一、私と同じことでハマっている人がいて、この記事が解決のヒントにでもなればいいなと思っています。

#与えられた要件について
は、[動画を限定公開する際にひっかかったこと1](https://qiita.com/mana13u/items/ed86b5e05f199caf69e1)を参照のこと。

#一方そのころ公開用webサーバでは
こんな手順を進めていた。


#まあ落ち着いて。リトライする前にちょっとエラーメッセージを読もうよ
certbot-autoを起動すると、何度やってもエラーになる。しまいには短時間に何度もエラーになったんでしばらくロックがかかってふて寝したり。
メッセージをよく読んだら（最初に読めよ）には「80番にアクセスしたらhttpsが応答するんであんたのことは信用できない（意訳）」と書いてある。
待て待て、それはもう散々やって、だから先述の手順じゃないの。いまは、80番にアクセスが来たら素直に80番で応答する設定のはずでしょ。

#ほうぼう検索して回った挙句に
英語の掲示板にたどり着いて、HSTSが悪さしてるんじゃないの、と。
その掲示板での質問者は「そっかわかった！じゃあもHSTSやめるわっ！」と宣言して戻ってこなかったけどそのあと「maxage=0に設定して証明書を取得、そのあと戻せばいけるんだけど…」というレスがそっとついていた。

#というわけで
- 取得済みのドメインに関してDNSを変更、newhost.hoge.com（たとえばね）を当該サーバーに向けておく
- ドキュメントルート用のディレクトリを準備して
- .confファイルを書いて（80番ポートをシンプルに受けるだけ＝この時点ではhttpsへの転送も書いていない）
- .confファイルを修正（HSTSのmaxage=[大きな数]をmaxage=0に書き換え）httpdを再起動
- certbot-autoを起動して証明書を取得（サイトの存在確認のため指定したホストの80番ポートにアクセスする）
- .confファイルを書き換えて（80番へのアクセスをhttpsの同パスに転送、443を受ける、証明書の指定）
- .confファイルのHSTSに関する記述をmaxage=[大きな数]に戻してhttpdを再起動

という手順となりました。めでたしめでたし。

#しかし残る疑問
証明書の新規取得なんだからhttpsに転送されたら信用できない、というスタンスは、まあわかる（ドメイン/ホストの存在は確認できるんだから別にいいじゃねえかとも思うが）。
ただ、HSTSはそのサーバーがリターンコード301や302を返しているわけではなく、その仕様にのっかるかどうかはユーザーエージェント（この場合だったらcertbot-autoに呼び出されるホスト存在確認用のクローラー）の実装しだいではないのか。
30xでのリダイレクトにせよHSTSにせよ、それを用いた証明書の不正取得が想定されるから禁止しているのだろうと想像するのだが、具体的にどういう不具合があるのかは想像できず、釈然としない思いが残る。
【Railsチュートリアル】第２章のまとめ




# はじめに

この記事では[Rails チュートリアルの第2章](https://railstutorial.jp/#toc)
についてまとめた記事です。
ベストプラクティスや間違いがあれば
チュートリアルをやりながら書き直していく予定です。

--------------------------------

# 今回知ったこと

・データモデルを作成できる。
・データモデルを作成するときはscaffoldジェネレータを使う。
・データモデルを作成したらマイグレーションを必ず行う。
・データモデルはModelsにhas_manyとbelongs_toを使うことで関連付けできる。

・Railsにはルーティングという仕組みがある。
・ルートURLにアクションを指定すると表示するページを操作できる。
・modelsを編集することで簡単な入力のサニタイズが可能

--------------------------------


# データモデルを作成

データモデルを作成するときはscaffoldジェネレータを使う。

```
nameカラム,emailカラムをもったUserというデータモデルを作成する。
rails generate scaffold User name:string email:string

データモデルを作成したらマイグレーションを行う。
rails db:migrate
```

--------------------------------
# ルーティングという仕組み

インフラ屋でIPアドレスのルーティングを書いたことがある人は
ちょっとだけ親しみのある言葉かと思う。

リクエスト文字列に応じて
表示するページや動作を変更できる。

チュートリアルでは動作のことを***アクション***と表記している。

URL/show 表示
URL/new 新規作成
URL/edit 編集

--------------------------------
# 入力のチェック・無害化
 入力のサニタイズはmodelsを編集することで可能

 チュートリアルではmicropostのデータモデルを編集した。

``` ruby
class Micropost < ApplicationRecord
  belongs_to :user
  validates :content, length:{maximum:140},
                      presence: true
end
```
--------------------------------
# Rubyとオブジェクト指向（OOP）
今回作成したデータモデルmicropostを操作するMicropostは
ApplicationRecord クラスを継承したクラス

まぁ、わからない人は２代目 ApplicationRecord という
認識でだいたい問題ないです。

ApplicationRecordというのがスーパークラス（ベースクラスともいう）

親：ApplicationRecord
子：Micropost

という感じ

--------------------------------
# エラー対応

gitでリモートリポジトリにpushしてたら
いろいろ行き詰ったのでメモ

SSH RSAキーを登録していないパティーン

> アクセス拒否（publickey）
> リモートリポジトリが読み込めませんでした。
> Permission denied (publickey).
> fatal: Could not read from remote repository.

対処方法
> １：鍵を作成する。
> ２：作成した鍵をコピーする。
> ３：gitghubに公開鍵を登録する。
> ４：configファイルを作成し直す。(接続確認）
> 鍵がすでにあれば cat コマンドで表示する。
> 鍵があるリポジトリ内で以下のコマンドを叩き
> GitHubに登録
> cat ~/id_rsa.pub

リモートリポジトリにリポジトリがあるパティーン

> リモートリポジトリにすでにoriginが存在しています。
> fatal: remote origin already exists.

> 解決策
> git remote rm origin originの削除
> git remote add origin git@bitbucket.org:ユーザー名/アプリ名.git
> git push -u origin master

削除しちゃって問題ないのかって？
今、自分の手元にあるリポジトリが最新であれば問題ないかと思う。
そもそも、リモートのほうが新しい状態って結構異常かと思う。

--------------------------------
# 今回忘れてたこと・コマンド
```
git remote add origin リポジトリ
git push -u origin master
```

# 出力メッセージの日本語翻訳(まとめ)

チュートリアルの最中に気になった文言

|単語|日本語|
|:-------------------------------------|:-----------------------|
|On branch master                      |マスターブランチを参照しています         |
|No commits yet                        |まだコミットされていません           |
|Changes to be committed               |コミットされる変更               | 
|Changes not staged for commit         |変更がステージングされていません   |
|nothing to commit, working tree clean |作業ツリーにコミットするものは何もありません|
|discard changes in working directory  |作業ディレクトリの変更を無視する      |
|fatal: remote origin already exists.  |リモートリポジトリにすでにoriginが存在しています。|
|Permission denied (publickey).|アクセス拒否|
|fatal: Could not read from remote repository.|リモートリポジトリを読み込めませんでした。|
|GitHub found 6 vulnerabilities |GitHubが6個の脆弱性をみつけたよ|

--------------------------------
# 他
herokuのインストール方法
source <(curl -sL https://cdn.learnenough.com/heroku_install)

スペルミスで発生したエラー文
Range unspecified. Specify the :in, :within, :maximum, :minimum, or :is option.

--------------------------------
#おわり
リモート作業に優しい Apache 認証設定

以下の要件を満たす Apache conf が必要でした。

* オフィスネットワークからのアクセスは認証なし
* 外部からのアクセスでは Basic 認証
* ロードバランサーからのヘルスチェックは認証なし


```apache
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule authz_host_module modules/mod_authz_host.so

# 許可された IP アドレスからのアクセス条件
SetEnvIf Remote_Addr "^172\.16\." load_barancer # LB ネットワーク
SetEnvIf X-Forwarded-For "^xxx\.xxx\.xxx\.xxx(,| |$)" allowed_access # 社内 IP
SetEnvIf X-Forwarded-For "^$" internal_access # LB からの直アクセス

<Location />
  <RequireAny>
    # LBからの直接アクセス
    <RequireAll>
      Require ip 172.16.0.0/16
      Require env internal_access
    </RequireAll>

    # 許可された IP アドレス
    <RequireAll>
      Require env load_barancer
      Require env allowed_access
    </RequireAll>

    # それ以外のアクセスはBasic認証
    AuthType basic
    AuthName "Private Zone"
    AuthUserFile /var/www/html/.htpasswd
    Require valid-user
  </RequireAny>
</Location>
```

最後の条件、ヘルスチェックについては `401` を OK コードにするか、 `/healthcheck` エンドポイントを用意できればこんな面倒な記述は不要で、以下で OK です。

```apache
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule authz_host_module modules/mod_authz_host.so

# 許可された IP アドレスからのアクセス条件
SetEnvIf Remote_Addr "^172\.16\." load_barancer # LB ネットワーク
SetEnvIf X-Forwarded-For "^xxx\.xxx\.xxx\.xxx(,| |$)" allowed_access # 社内 IP

<Location />
  <RequireAny>
    # 許可された IP アドレス
    <RequireAll>
      Require env load_barancer
      Require env allowed_access
    </RequireAll>

    # それ以外のアクセスはBasic認証
    AuthType basic
    AuthName "Private Zone"
    AuthUserFile /var/www/html/.htpasswd
    Require valid-user
  </RequireAny>
</Location>

<Location /healthcheck>
  Require ip 172.16.0.0/16
</Location>
```

> 内部ネットワークの prefix が 16 以外の場合は前方一致だと不完全なため、`SetEnvIf Remote_Addr` が複数必要になります。

## 参考サイト

- [Apache2.4 のRequireディレクティブでアクセス制御を行う - 闘うITエンジニアの覚え書き](https://www.magata.net/memo/index.php?Apache2.4%20%A4%CERequire%A5%C7%A5%A3%A5%EC%A5%AF%A5%C6%A5%A3%A5%D6%A4%C7%A5%A2%A5%AF%A5%BB%A5%B9%C0%A9%B8%E6%A4%F2%B9%D4%A4%A6)
- [apache2.4系でBasic認証 or Digest認証、特定IPアドレスからは認証なしで](https://qiita.com/mmotoi/items/5d7dcbb9e461feba98cd)
- [Apache 2.4 系で IP アドレスなどのアクセスブロックをする方法](https://qiita.com/katzueno/items/4cf15117d228dbaf2448)
pydocで No Python documentation found for ... が出たときの対処

#現象

```
[kimisyo@localhost work]$ pydoc3 test.py
No Python documentation found for 'test.py'.
Use help() to get the interactive help utility.
Use help(str) for help on the str class.
```

な、なぜ？


#原因
コマンドラインリファレンスによると、引数はファイル名ではなく、モジュール名、パッケージ名、モジュール内のクラス、パッケージ内のモジュール等を指定しないといけないようだ。

```pydoc3
pydoc3 <name> ...
    Show text documentation on something.  <name> may be the name of a
    Python keyword, topic, function, module, or package, or a dotted
    reference to a class or function within a module or module in a
    package.  If <name> contains a '/', it is used as the path to a
    Python source file to document. If name is 'keywords', 'topics',
    or 'modules', a listing of these things is displayed.
```

#対応
これで解決

```
[kimisyo@localhost work]$ pydoc3 test
```
NETGEAR スイッチングハブの設定後 "Admin Mode" を "Enable" にすること

「NETGEARのスイッチを設定したら、"Admin Mode" を Enable にすること」

名前が悪い。"Admin Mode" って一体なにかと思ったら、その機能を Enable にする設定でやんの。

## LAG を設定したら、ネットワークがおかしくなった

ことの始まりは、フロアまたぎの NETGEAR スイッチングハブ (GS308T - GS116Ev2) とでトランキングを設定したときにさかのぼります。`GS308T` および `GS116Ev2` で `LAG` のメンバーシップを設定(下図は`GS116Ev2`の場合)。基本的にはこれだけでトランキングの設定ができます。技術革新スゴイ。

<img width="797" alt="Screen Shot 2020-05-24 at 10.41.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37263/cfaf9a8d-5322-81a5-ac2d-e1b9e5312a41.png">

いずれのスイッチングハブで設定したあとにケーブルを接続します。`GS116Ev2`の場合、アルゴリズム設定などはできないので、デフォルト設定でおk。

のハズが、次のようにおかしな状況に。

- DHCP パケットが飛んでこない
- 他のLAGしているサーバへアクセスできなくなる

などなど、急にネットワーク全体でおかしくなる現象が。でもふつーに使えたりもしていて、ひじょーに厄介。他のLAGしてるサーバにpingうち続けると、たまにパケットロスする。（・３・）アルェー

## そもそもLAGがEnableになっていなかった

よくよく調べたり設定手順を見ていると "Admin Mode を Enable にする" って書いてあるけど、それが何を意味するかについては詳しく書かれていない。たまたま見つけた [ストーム制御の設定/NETGEARスマートスイッチ](https://beginners-network.com/netgear/smart_storm_control.html) を見てみると

> 　青枠部分のように、「Admin Mode」がDisableになっています。赤枠部分で、そのポートを選択し、緑枠部分のようにEnableにしてから「APPLY」をクリックすると、ポートが使えるようになります。

はっ、もしかして "Admin Mode" ってポートや機能の ON/OFF を意味してるの...?

と、`GS116Ev2`側の`LAG`設定を見てみると

<img width="708" alt="Screen Shot 2020-05-24 at 10.41.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37263/e3a66f12-faca-8905-1f28-64d71d3bdf50.png">

はい、ここ Default で`Disable`でした。写真のように`Enable`にしてあげると、うまく動き出しましたよ。不穏な動きしていたのは、そもそも`LAG`されていなかったので、パケットが両方の毛色に謎の分散をされてしまって、ロストしたケースがあったからですね。`GS308T`側は`LAG`設定がデフォルトで`Enable`だったり、いずれのスイッチングハブでループ検出も`Disable`してたりして、挙動がおかしくなったということです(ループ検出`Enable`にしてたらどうなってたんだろう)。

ということで、相互で正しく設定されていなかったから、が原因でしたが意味がわかりません。`Admin Mode`ってなんや。どういう意味や。

ということで「NETGEARのスイッチを設定したら、"Admin Mode" を Enable にすること」を忘れずに。
VS Codeで効率的にPythonコーディングするためのsettings.jsonを晒してみる

普段Pythonでコーディングすることが多いので、効率的にコーディングできるようにVS Codeで設定をしています。
その設定を紹介しようと思います。

# 環境

- MacOS
- VS Code
- Python3

# 効率的にコーディングするための開発用ライブラリ

pipenvで開発環境を構築するのを前提としています

- black
- isort
- mypy
- flake8
- pytest

# settings.json

## 設定全文

```json:.vscode/settings.json
{
  "[python]": {
    "editor.tabSize": 4,
    "editor.formatOnSave": true,
    "editor.formatOnPaste": false,
    "editor.formatOnType": false,
    "editor.insertSpaces": true,
    "editor.codeActionsOnSave": {
      "source.organizeImports": true
    },
  },
  "python.pythonPath": "${workspaceFolder}/.venv/bin/python",
  "python.envFile": "${workspaceFolder}/.env",
  "python.linting.enabled": true,
  "python.linting.pylintEnabled": false,
  "python.linting.pycodestyleEnabled": false,
  "python.linting.flake8Enabled": true,
  "python.formatting.provider": "black",
  "python.formatting.blackPath": "${workspaceFolder}/.venv/bin/black",
  "python.sortImports.path": "${workspaceFolder}/.venv/bin/isort",
  "python.linting.mypyEnabled": true,
  "python.linting.mypyPath": "${workspaceFolder}/.venv/bin/mypy",
  "python.linting.mypyArgs": [
    "--config-file", "mypy.ini"
  ],
  "python.testing.unittestEnabled": false,
  "python.testing.nosetestsEnabled": false,
  "python.testing.pytestEnabled": true,
  "python.testing.pytestArgs": [
    "-vv",
    "--show-capture=all",
    "tests"
  ],
  "autoDocstring.docstringFormat": "google",
}
```

## 環境変数の読み込み

```json
"python.envFile": "${workspaceFolder}/.env"
```

環境変数を設定しているファイルをpython.envFileで指定すれば、環境変数を読み込んでくれます

## isortによる自動フォーマット

isortでimport文を自動フォーマットするには、isortのPATHを指定する以外に自動フォーマットを有効にする設定が必要です。

```json
"editor.codeActionsOnSave": {
   "source.organizeImports": true
}
```

[Add isort CodeAction (sort imports on save) #1926](https://github.com/microsoft/vscode-python/pull/1926#issuecomment-477340967)のプルリクに設定が書いてあります。

## docstring

docstringはgoogleの記法を使用しています。
`"""`をタイプしてEnterを押下すると自動でdocstringを補完してくれます。

```json
"autoDocstring.docstringFormat": "google"
```

# 参考

- [Editing Python in Visual Studio Code](https://code.visualstudio.com/docs/python/editing)
- [https://github.com/microsoft/vscode-python/pull/1926https://github.com/microsoft/vscode-python/pull/1926](Add isort CodeAction (sort imports on save) #1926)
Surface Pro のヘッドホンジャックにイヤホンをつけると内蔵マイクが使えない

かならずヘッドホンジャックにイヤホンがついている状態で以下を行ってください。

コントロールパネル ⇒ サウンド ⇒ ｢録音｣タブ をクリック。

｢Headset microphone｣が既定のデバイスになっているので、

｢マイク配列｣を選択して

｢既定値に設定｣ ⇒ ｢OK｣ 

と押すことで

イヤホンを付けた状態でも内蔵マイクが使えました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102784/e149c5d7-a710-0492-7f89-10ad1f0ea697.png)
yarn v2 は開発時における効率を損ねるのではないか

# 背景
[npm, yarn による zero install 戦略](https://yosuke-furukawa.hatenablog.com/entry/2019/06/10/113111)を読んで Zero Install を知り、yarn v2 の有用性が気になった。パッケージ追加の速度やパッケージのサイズは従来よりも改善されるそうだが、パッケージをランタイム時に読み込むということはアプリ起動速度は従来よりも劣るように思えたため、検証を行った。

# 検証方法
yarn v2 と v1 を用いる別環境にて、CRAを用いたプロジェクトを作成して以下の3点から優位性を比較する。
* パッケージ追加の所要時間
* プロジェクトディレクトリのサイズ
* アプリ起動の所要時間

# 検証
## 1. パッケージ追加の所要時間
ReactアプリのプロジェクトをCRA経由で作成する。途中でパッケージ追加が行われるため、以下のコマンドを実行してdateコマンドの差から所要時間を算出する。

```bash
$ create-react-app --version
3.4.1
$ date && create-react-app test-react-app && date
```

## 2. プロジェクトディレクトリのサイズ
以下のコマンドを実行し、出力結果からプロジェクトディレクトリのサイズを取得する。

```bash
$ du -sh test-react-app
```

## 3. アプリ起動の所要時間
以下のコマンドを実行し、アプリ起動のメッセージが出力されるまでの時間をストップウオッチで計測する。

```bash
$ cd test-react-app
$ yarn start
```

## 結果と考察
検証結果は以下の通りである。当初の想定通り、パッケージ追加の速度とプロジェクトディレクトリのサイズは v2 が優位であるが、アプリ起動の所要時間は v1 の方が短く優位である。

|    |  yarn v2  | yarn v1 |
| ---- | ---- | ---- |
|  パッケージ追加の所要時間  |  **67s**  |  88s  |
|  プロジェクトディレクトリのサイズ  |  **70.9M**  |  247.1M  |
|  アプリ起動の所要時間  |  19.70s  |  **13.73s**  |

アプリ起動を頻繁に繰り返す開発時における6秒の差は大きく、体感的にも待たされているストレスを強く感じる。パッケージ追加は高速であるとはいえ、頻繁に発生するアプリ起動時の遅延を補えるものではなく、プロジェクトディレクトリのサイズは記憶媒体が大容量化している今日ではさほど問題ではないように思える。現時点の個人的な感想としては v2 は開発の効率を損なうもののように思え、好意的な印象を持つには至らなかった。
RDKit環境構築 for Mac @JupyterLab

#はじめに
＊インフォマティクス初学者がRDKit環境を構築するまでの流れの記録です。

初めまして。
メーカーで材料の研究開発に従事している技術者です。
最近はインフォマティクス系にも関わり、試行錯誤している最中です。

先週ケモインフォマティクス勉強会に参加し、興味が沸いたのでRDKit環境の構築を行いました。
RDKitについては下記参考にさせていただきました。<sup>[[1]](https://github.com/Mishima-syk/py4chemoinformatics
)</sup>
（詳細記載されておりますので、RDKitの説明については割愛いたします。）
[1] https://github.com/Mishima-syk/py4chemoinformatics

しかしながら、初学者である私は環境構築に非常に苦戦しました。。。
そこで備忘録として記載します。
（初学者のため、誤りがあれば御指摘いただけると幸いです。）

#実施環境
・MacBook Pro (Retina, 13-inch, Early 2015)
・macOS Catalina 10.15.4

#RDKit環境構築
##1. JupyterLab環境の構築
インフォマティクスに取組む際、下記参考にさせていただきました。<sup>[[2]](http://datawokagaku.com/startjupyternote/)</sup>
そのときからJupyterLabを利用しています。
JupyterLab環境についての全体的な説明については割愛いたします。
[2] http://datawokagaku.com/startjupyternote/

##2. RDKitのインストール ＠JupyterLab
JupyterLabを起動し、RDKitのインストールを実施します。

まず、仮想環境の構築です。

```
conda create -y -n py4chemoinformatics
```
と入力します。
`py4chemoinformatics`は他の名称でも問題ないです。

`conda create -n py4chemoinformatics`だけの入力では出力時に`"Proceed ([y]/n)?"`と確認されるので`y`で続行する必要があります。
`-y`の追記により確認動作を省略し、仮想環境構築を進めることができます。
出力画面にて
`"Note: you may need to restart the kernel to use updated packages."`
と表示されますが、
Kernelタブ内のRestart Kernelを選択すればOKです。

次にRDKitをインストールします。

```
conda install -c conda-forge rdkit
```
と入力し実行すると、インストールが完了します。

この時に以下のようなエラーが発生しました。
`"ImportError: libXrender.so.1: cannot open shared object file: No such file or directory"`
これは`libXrender`がインストールされていないことによるものだそう。

そこで、

```
!sudo apt-get install -y libxrender1
```
と入力し実行することで`libXrender`をインストールすることができました。

さらに進めてみると以下のようなエラーが発生しました。
`"ImportError: libXext.so.6: cannot open shared object file: No such file or directory"`
これは`libXext`がインストールされていないことによるものだそう。

そこで、先ほどの要領で、

```
!sudo apt-get install -y libxext-dev
```
と入力し実行することで`libXext`をインストールすることができました。
上記に関しては下記参考にさせていただきました。<sup>[[3]](https://omohikane.com/python3_open_cv_libsm/)</sup>
[3] https://omohikane.com/python3_open_cv_libsm/

##3. RDKitによる構造式描画
RDKitを実際に使ってみます。
今回は基本的な構造式描画を行いました。

```
from rdkit import Chem
from rdkit import IPythonConsole #構造描画の設定
from rdkit.Chem import Draw
```
`from rdkit import IPythonConsole`にて構造描画の設定をしているようです。

構造を入力するために今回はSMILES記法を利用しました。
＊SMILES：Simplified Molecular Input Line Entry System
　構造情報を文字列に変換した記述方法

では実際にフェノールの構造式を出力してみます。

```
mol = Chem.MolFromSmiles("c1ccccc1")
mol
```
実行した出力結果がこちらです。

![benzene.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235125/507f3dbe-0290-6d0b-0817-1d1486c25863.png)

何と簡単に描画できることでしょう！
いつも市販ソフトウェアを利用して描画していますが、フリーで描画できてしまうことに感動を覚えました。

下記サイトでは様々な分子構造の記載方法が紹介されています。<sup>[[4]](https://magattaca.github.io/RDKit_unofficial_translation_JP/Supplementary_Text_jp.html
)</sup>
[4] https://magattaca.github.io/RDKit_unofficial_translation_JP/Supplementary_Text_jp.html

#終わりに

RDKitのインストール方法について記載いたしました。
環境構築に非常に手間取りましたが（今でも環境面で苦戦すること多数です。。。）、先人の知見の蓄積を参考にさせていただきながら、挑戦していければと思います。
備忘録としてまた記載していきます。

#参考リスト
[1] RDKit全般について
https://github.com/Mishima-syk/py4chemoinformatics
[2] JupyterLabを使う
http://datawokagaku.com/startjupyternote/
[3] ImportErrorの対処法
https://omohikane.com/python3_open_cv_libsm/
[4] PythonでRDKitを始めよう
https://magattaca.github.io/RDKit_unofficial_translation_JP/Supplementary_Text_jp.html
Rails6でngrokが動かなくなったんだけど

# 答え
Rails6からwhite listが追加されました。
ローカル内の通信でも、ホストがwhite listに追加されていなければ、リクエストを受け取りません。
下記のようにホストを追加すると動きます。

```./config/environments/development.rb
Rails.application.configure do
...
  config.hosts << ".ngrok.io"
end
```
DocFXメモ

#はじめに
ドキュメント自動生成ツールDocFxについて調べてみた。前提はC#。

#インストールとか
以下参照
https://qiita.com/sukakako/items/072b6145f15683eb0add

#コメントに改行をいれるには？
brタグを入れればよい

コメント例

```
        /// <summary>
        /// ユーザ一覧表示するクリックイベントハンドラ
        /// 1. ユーザ一覧ダイアログを表示する。<br/>
        /// 2. ユーザ一覧ダイアログの戻り値がOKの場合<br/>
        ///    2.1 現行ユーザIDを設定する。<br/>
        ///    2.2 画面にユーザ情報を表示する。
        /// </summary>
        /// <param name="sender">イベント発生元オブジェクト</param>
        /// <param name="e">イベントオブジェクト</param>
```

表示例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329816/8355a964-7024-8dac-5b38-a97e3fc8367f.png)


おお！それっぽい！　これで意味のない『プログラム設計書』(笑) から解放される。

#private メソッドを表示させることができる？
できない。以下参照。
https://github.com/dotnet/docfx/issues/2764

public, protectedはできるので、どうしても表示させたい場合は、これらに変更するしかない。
APIとしてprivateメソッドは見せる必要はないとの考えらしい。
BinaryenがEmscriptenからどう使われているのかわからない

## 動機
Emscriptenを使っていると、ところどころでBinaryenが出てくるので、どういう風につかわれているのか気になり調べた。

## 結果
どう使われているのかわからない。

## Binaryenとはどういうものか
wasmをパースして、最適化して、wasmを出力してくれるツール群の総称。

## EmscriptenのdocでのBinaryenについての説明
```
Emscripten’s WebAssembly support depends on Binaryen, which is provided by the emsdk
```

とある。emsdkがwasmサポートをBinaryenを使って提供しているとだけいっていて、どんな場面で使われているかについての説明はない。

## asm2wasm
Binaryenにはasm2wasmというツールが入っていて、これはasm.jsをwasmに変換してくれる。

```
An asm.js-to-WebAssembly compiler, using Emscripten's asm optimizer infrastructure. This is used by Emscripten in Binaryen mode when it uses Emscripten's fastcomp asm.js backend.
```

1.38の以前のfastcompバックエンドベースのemscriptenでは、上の説明にあるように、このツールを使って、emscriptenの出力したasm.jsをwasmに変換していたらしい。

```
Emscripten emits WebAssembly using the upstream LLVM wasm backend, since version 1.39.0 (October 2019)
```
とあって、現行の1.39以降はLLVMのwasmを出力するバックエンドを使っているので、Binaryenはこの形では使われていない。

## もしかして？
Binaryenは、wasmを最適化してくれるツールなので、一度LLVMが出力したwasmを、さらに最適化するために使われてるのかもしれない。もしくはwasmバックエンドでは全く使われていないのか。うーんわからない。emsdkのソースを読む機会があれば、調べてみる。

## 参考にしたページ
https://kripken.github.io/talks/binaryen.html#/
https://github.com/WebAssembly/binaryen
https://www.oreilly.com/library/view/learn-webassembly/9781788997379/780259f3-ab01-4bad-b218-37e07e11c41d.xhtml
https://developer.mozilla.org/en-US/docs/Mozilla/Projects/Emscripten
Cumulus VXでBGPを設定してみる

# 環境
GNS3で動かしてます.
インストール方法はこちら.
[GNS3 Remote Server - Qiita](https://qiita.com/Shakapon/items/0ddce186213521a42660)

Cumulus VXの導入はこちら
[GNS3 and QEMU - KVM | Cumulus VX 3.7](https://docs.cumulusnetworks.com/cumulus-vx/Development-Environments/GNS3-and-QEMU-KVM/)

# インターフェース設定

![スクリーンショット 2020-05-24 9.08.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228406/2f3143cd-55ab-d254-c042-8a98840f1260.png)

こんな感じで行きます.

ログインは, これでいけました.
id: cumulus
password: CumulusLinux!


```:CumulusVX1
net add interface swp1 ip address 192.168.0.1/31
net add interface swp2 ip address 192.168.0.5/31
net commit
```

```:CumulusVX2
net add interface swp1 ip address 192.168.0.0/31
net add interface swp2 ip address 192.168.0.2/31
net add interface swp23 ip address 172.16.0.1/16
net commit
```

```:CumulusVX3
net add interface swp1 ip address 192.168.0.7/31
net add interface swp2 ip address 192.168.0.3/31
net commit
```

```:CumulusVX4
net add interface swp1 ip address 192.168.0.6/31
net add interface swp2 ip address 192.168.0.4/31
net add interface swp23 ip address 172.17.0.1/16
net commit
```

インターフェース確認

```
net show interface all
```

ubuntuにIPアドレスとデフォルトゲートウェイを設定します

```:ubuntu1
ip a add 172.16.0.10/16 dev eth0
ip route add default via 172.16.0.1
```

```:ubuntu2
ip a add 172.17.0.10/16 dev eth0
ip route add default via 172.17.0.1
```

# BGP設定
```:CumulusVX1
net add bgp autonomous-system 64512
net add bgp neighbor 192.168.0.0 remote-as 64513
net add bgp neighbor 192.168.0.4 remote-as 64514
net commit
```

```:CumulusVX2
net add bgp autonomous-system 64513
net add bgp neighbor 192.168.0.1 remote-as 64512
net add bgp neighbor 192.168.0.3 remote-as 64512
net add bgp network 172.16.0.0/16
net commit
```

```:CumulusVX3
net add bgp autonomous-system 64512
net add bgp neighbor 192.168.0.2 remote-as 64513
net add bgp neighbor 192.168.0.6 remote-as 64514
net commit
```

```:CumulusVX4
net add bgp autonomous-system 64514
net add bgp neighbor 192.168.0.5 remote-as 64512
net add bgp neighbor 192.168.0.7 remote-as 64512
net add bgp network 172.17.0.0/16
net commit
```

# 確認
```:CumulusVX
net show bgp
net show route
```

疎通確認します.

```:ubuntu1
ping -c 1 172.17.0.10
```

```:ubuntu2
ping -c 1 172.16.0.10
```

# 参考
- [Cumulus VX で VXLAN+EVPN (original : 2017/03/22) - kakkotetsu はてなブログ](https://kakkotetsu.hatenablog.com/entry/2017/05/11/001708)
- [Border Gateway Protocol - BGP | Cumulus Linux 4.1](https://docs.cumulusnetworks.com/cumulus-linux-41/Layer-3/Border-Gateway-Protocol-BGP/)
Rails ランダムな重複しないユニークID生成

# 重複しないIDを付与したい場合の解決策

ユーザー数や投稿数などを悟られたく無い場合、
RDBMSで付与されるidとは別にidを付与する手段

### ①ランダム　SecureRandom.uuidを使用
バージョン 4 の UUID (Universally Unique IDentifier) を生成して返します。
version 4 の UUID は全くランダムです (バージョンを除いて)。この UUID は MAC アドレスや時刻などのような意味のある情報を含みません。

```ruby:controller.rb
p SecureRandom.uuid #=> "2d931510-d99f-494a-8c67-87feb05e1594"
p SecureRandom.uuid #=> "62936e70-1815-439b-bf89-8492855a7e6b"
```

### ②連番　Gem Sequencedを使用
https://github.com/derrickreimer/sequenced

コントローラーなどで指定せずとも以下の例ではスコープを渡してそのcolumn_nameに対して連番を自動的に降ってくれます。
※スタートする番号など各種カスタマイズ可能

1. カラムにsequential_idというカラムを作成
2. model.rbに以下記入
3. あとは何も考えずレコードを生成すれば自動的に連番にしてくれます

```ruby:model.rb
acts_as_sequenced scope: :column_name
```
動画を限定公開する際にひっかかったこと1

#この記事を読もうとしている方へ
すみません、技術的に高度なことは書いてありません。
もし万一、私と同じことでハマっている人がいて、この記事が解決のヒントにでもなればいいなと思っています。

#検索よけ、ダウンロードよけ
所属する合唱団で練習動画を限定公開することになった。
プロの先生にお願いしてZoom越しに体操と発声のご指導をいただき、それを録画して参加者が見返すのに使おう、という趣旨。
少額とはいえ参加費用を徴収する関係上、普段の練習録音のようにYouTubeに上げてURLを告知、というわけにもいかない。
- 検索よけを施したサイトを新規に立ち上げる
- ダウンロードしにくいように（＋ファイル全体を読み込まなくとも再生が開始できるように）動画は細かく分割してHLSで配信する
という方向性が示された。

#Elastic Transcoderじゃだめですか？
AWSのElastic Transcoderを試す。元動画を既存のs3バケットに放り込んで、ウェブ画面からトランスコード処理のこまごまとしたパラメータを入力して起動。
出力先のs3バケットを公開用に立ち上げたWebサーバーにマウントすれば、元動画のアップロード→処理の起動→video.jsを埋め込んだHTMLを修正、だけで完了するなあ。よしよし。
…え、金がかかるのはだめですかそうですか。
MediaConvertもだめですよね。どう違うかも調べずじまいでしたが。

#ffmpegにたどり着くまで
そりゃあGoogleで検索しますよね。「m3u8 ts 分割」とか、「HLS m3u8 分割」とか。
いくら検索しても逆向きのツール（ストリーミング配信されている動画を結合して.mp4とかの形に変換する）ばっかり出てくる。まったくもう！

#コマンド一発、しかし強力なコマンドほどパラメータは難しい
ffmpegのパラメータ設定は本当にややこしいので、GUIをかぶせたものをインストールすべきだったと後悔している。
そして、正しい設定の組み合わせについてはちゃんとわかっている方がたくさん投稿しているのでそちらを参照されたい。
私がここで書きたいのは一点だけ。
「-f hls で動画を細かく分割するときは -hls_list_sizeに十分に大きなサイズを指定しておくこと！」
 -hls_list_sizeのデフォルト値は5です。hls_timeのデフォルト値は2秒なので、10秒を超える動画をデフォルト値のままでHLS分割してしまうと、動画のラスト5秒だけしかプレイリストには記述されないので注意。
CodePen - フラクタル圧縮された画像を描画してみた

「C言語によるアルゴリズム事典」に掲載されている「フラクタルによる画像圧縮」が面白そうだったのでJavaScriptに移植してみた。

<p class="codepen" data-height="650" data-theme-id="light" data-default-tab="result" data-user="kob58im" data-slug-hash="NWGJMzN" style="height: 650px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Fractal Compression Drawing">
  <span>See the Pen <a href="https://codepen.io/kob58im/pen/NWGJMzN">
  Fractal Compression Drawing</a> by kob58im (<a href="https://codepen.io/kob58im">@kob58im</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

ちなみに、わたしはアルゴリズムの内容をほとんど理解できておりません・・・。
階層的に[アフィン変換](https://qiita.com/koshian2/items/c133e2e10c261b8646bf)して、乱数使ってなんかやってるっぽい・・・程度の理解。
プログラム中の配列`a`～`f`のパラメータを変えると別の構造を描けるようです。

なお、この圧縮技術に関しては特許化されているようで、製品やサービスに組み込む場合は注意が必要と思われます。
https://ja.wikipedia.org/wiki/フラクタル圧縮
bashで取得した複数のファイル名をJavaScriptの配列に書き出す簡単な方法

## 目的
- JavaScriptに複数のファイル名を渡したいです。
- bashでサクッと作りたい

## 環境
- MacOS/bash5.0
- centOS7/bash4.24


## 方法
1. bashで複数ファイル(例えばpng)を`find`で取得し整形する。
2. `hoge.js`というテンプレートの変数宣言の場所に1.の結果を入れる
3. JavaScriptの配列定義は`foo = ["a.png", "b.png"]`というフォーマットに合わせます。

## コード
```{bash}

# 結果が何もない場合に備えて空文字を入れておく。
$ lst_png="" ; touch a.png b.png C.png;

# ファイル名で検索する。念のためソートしておく。改行を,に変えて文字列にする。
$ lst_png=$( find . -name "*.png" -printf "\"%f\"\n" | sort | sed -z 's|\n|,|g' ); echo ${lst_png}
"C.png","a.png","b.png",

# JavaScript用に最後の１文字を消して、テンプレートに置換する
$ sed -e "s|%1|${lst_png/%?/}|" hoge.js > tmp.js
```
- 説明です。
- bashの`find`で　`-printf`で出力フォーマットを整えています。`"%f"`はファイル名単体を取得します。その前後に`"`を加えるためにエスケープシーケンスを加えて`\"`としています。
- `=$()`はコマンド実行して標準出力文字列を変数定義するいつもの方法ですね。
- `find`はソート機能がないので必要に応じて`sort`でソートします。その他も改行単位でゴニョゴニョできます。ソートが必要ないならこの時点で文字列にしてもいいでしょう。`-printf "\"%f\","`となるのではないかと思います。
- `sed`で`/`を使わず`|`を使っているのは、コード再利用で万が一変数にディレクトリの文字列`/`が混じったときに誤動作しないようにです。


```{bash}
# 最終文字を取る書き方
$ echo ${lst_png/%?/}
"C.png","a.png","b.png"
```

- テンプレート(hoge.js)にある`%1`を３つ目の`sed`で`lst_png`を置換しています。ここで一番最後にあるデリミタ文字`,`を消したいのでbashの機能を使います。それが`/%?/`です。知っていれば簡単ですね。最後から検索して１文字を示す`?`で削除しています。

### 確認です

```{bash}
$ cat hoge.js
...
const lst_png = [ %1 ];
...

$ cat tmp.js
...
const let_png = [ "C.png","a.png","b.png" ];
...
```
- どなたかのお役に立てれば嬉しいです（コメント歓迎）。

## リファレンス
- [sedで改行を含めて削除する](https://kinjouj.github.io/2015/06/sed-remove-newline.html)
【NestJS】初期データまたはテスト用データを作成する

# 環境

- [NestJS 7.0.7](https://nestjs.com/)
- [nestjs/typeorm 7.0.0](https://github.com/nestjs/typeorm)
- [typeorm 0.2.25](https://github.com/typeorm/typeorm)
- [factory.ts 0.5.1](https://github.com/willryan/factory.ts)

# やりたいこと

「初期データ」または「テスト用データ」を npm script を使って作成する。

# 前提

- [node-config](https://github.com/lorenwest/node-config) を使って、DBの接続設定を定義している。
- factory.ts を使って、テスト用オブジェクトを作れるようになっている。
  - [やり方](https://qiita.com/luigiii/items/a34321afb163588a9a7e) 

# やり方

## package.json

```package.json
  "scripts": {
    "generate-test-data": "bin-gogh/generate-test-data"
  },
```

## shell

ディレクトリ、ファイル名は任意。

```shell:bin/generate-test-data
#!/bin/sh
COMMON_SRC=`dirname $0`/../src/common
GEN_TEST_DATA_TS=$COMMON_SRC/scripts/generate-test-data.ts
npx ts-node -r tsconfig-paths/register $GEN_TEST_DATA_TS
```

## TypeScript ファイル（本体）

ディレクトリ、ファイル名は任意。

```typescript:src/common/scripts/generate-test-data.ts
import { organizationFactory } from '#/../factories/organization.factory'
import { userFactory } from '#/../factories/user.factory'
import { createConnection, getRepository } from 'typeorm'
import { MysqlConnectionOptions } from 'typeorm/driver/mysql/MysqlConnectionOptions'

import config from '@config'
import { Organization } from '@modules/domain/organization/organization.entity'
import { User } from '@modules/domain/user/user.entity'

const generateTestData = async (): Promise<void> => {
  const dbConfig: MysqlConnectionOptions = config.get('database')
  const connection = await createConnection(dbConfig)

  const userRepo = getRepository(User)
  const orgRepo = getRepository(Organization)
  // multiple database 環境の場合は、getRepository(User, 'secondDBName') となる。

  const user = await userRepo.save(userFactory.build({ name: `foo` }))
  const org = await orgRepo.save(organizationFactory.build({ users: [user] }))

  connection.close()
}

generateTestData()
```
【Golang】newとmakeの違い

#【Golang】newとmakeの違い
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

```
package main
//new makeの違い
//new メモリーにポインタが入る空の領域を確保したい場合
//ここ調査

import (
	"fmt"
)


type Person struct{
	id int
	name string
}

func main() {
	//アドレスだけ付与する
	var p *int = new(int)
	fmt.Println(p)
	//>>0xc000016068
	fmt.Println(**&p)
	//>>0
	fmt.Println(*p)
	//>>0

	//メモリーはあるので、（0なので）カウントアップする
	*p++
	fmt.Println(*p)


	//まだアドレスがない
	/*
		var p2 *int
		fmt.Println(p2)
		//>>nil

		//アドレスはnilなのでエラーになる
		*p2++
		fmt.Println(p2)
	*/



	//newとmakeの違い
	//newはポインタを返す
	//makeは空を返す
	//スライス、マップ、チャネルはmake
	//変数、structはnew 
	//で使い分ける

	s := make([]int, 0)
	fmt.Println(s)
	//>>[]
	fmt.Printf("%T\n", s)//型を表示


	m := make(map[string]int)
	fmt.Println(m)
	//>>map[]
	fmt.Printf("%T\n", m)


	ch := make(chan int)
	fmt.Println(ch)
	//>>0xc00005c060

	//new
	//変数
	var p2 *int = new(int)
	//*int 
	fmt.Printf("%T\n", p2)
	//>>*int

	//struct
	var st = new(struct{})
	fmt.Println(st)
	//>>&{}
	fmt.Printf("%T\n", st)
	//*struct {}

 

	//newと&
	//動作上違いはあまりない
	man := new(Person)
	man.id = 0
	man.name = "genius"
	fmt.Println(man)
	//>>&{0 genius}

	woman := &Person{id:1, name:"nancy"}
	fmt.Println(woman)
	//>>&{1 nancy}
}
```
VisualStudio2019のXamarin.iOSで”Brokerを開始しようとしてエラーが発生しました”が出た時の対処方法

##経緯
C#の勉強をしよう！スマホのアプリも作ってみたい！そうだ！
Xamarinでスマホアプリのコードを書けるらしいやってみよう!
・・・
・・
・

##起こったこと
コードを書いてandroidのエミュレータで起動するところまでは、すんなり行くけど、iOS側のシミュレータを起動しようとすると次のエラーメッセージが表示されて失敗する。

エラーメッセージ
”Brokerを開始しようとしてエラーが発生しました”

参考ページ:
ここまでの環境設定は以下のサイトが動画もついていてとても参考になりました。
[最初の Xamarin.Forms アプリのビルド][1]
[1]:https://docs.microsoft.com/ja-jp/xamarin/get-started/first-app/?pivots=windows

##解決のために
さて、エラーメッセージでググると色々出てくるのですが、日本語で検索していると、問題が発生した当初の記事で設定ファイルを削除したりと色々面倒なことをやる必要があったようです。
しかし、現時点ではVisualStudio側で対応されて"VS2019 update to 16.5.2"で治っているそうですので、VisualStudioのインストーラから更新をかけてあげるとアサッリ問題が解消しました。

VisualStudioを昔から入れていてXamarinを使いだそうとした方はひっかるかもしれないため共有です。

参考ページ:
全体的な流れは以下のサイトから追えます。
[Broker error][2]
[2]:https://github.com/xamarin/xamarin-macios/issues/7882