OmniAICreator/Qiita-1.07M huggingface dataset:
非同期処理メモ

参考資料 
[スレッドプールとタスク　++C++; // 未確認飛行 C]
(https://ufcpp.net/study/csharp/misc_task.html)

###同期処理とは
 - 処理が文字通り順番に処理されていく
 - 一つの処理が終わるまで次の処理に移ることができない

###非同期処理とは
 - 処理が順番に処理されていかない
 - 一つの処理を行っている最中、他の処理を行うことができる

##非同期処理の種類
ここでは同期処理のやり方は省きます。
非同期学ぶ方は既にご存知だと思うので。

###詳細
#####1.スレッド(Thread)
CPUでよく聞くスレッドと同じもの
既定値は各パソコンのCPUのコア数と同じ。
スレッドは規定値よりも多くのスレッドを生成することが難しい(または遅延が発生する)為、
スレッドを用いた非同期処理ができる量は限られている。

```csharp
Thread.Thread(ThreadStart start) // クラスの新しいインスタンスを初期化
delegate void system.Threading.ThreadStart() // 実行するメソッドを表すThread
```
#####2.タスク(Task)
タスク ＝　やること(日本語訳)
タスクはスレッドと違い制限がない
スレッド数を気にせず多くの非同期処理を実装することが可能

```csharp
Task Task.Run(Action action) // スレッドプール上で実行する指定された作業をキューに配置
```

スレッドプールとは：
幾つかのスレッドを予め生成しておき、
一度作ったスレッドを可能な限り使いまわすような仕組みのこと。
タスクが限りなく多くの非同期処理を行うことができる理由。

キューとは：
限りあるスレッドに対して幾つかのタスクをリスト化し、並べているものである。

#タスクとスレッドどっちがいいの？
使い方にもよると思うけど、タスクの方が柔軟性は高いんじゃないかなと思います。

#####例えば一時処理を停止する時：
 - スレッド<br>
スレッド自体を止めてしまうため、中断中のスレッドが一つ丸ごと指定されたミリ秒の間使用不可となる。

```csharp
Thread.Sleep(1000); // 指定したミリ秒の間現在のスレッドを中断します。
```
 - タスク<br>
Task.Delay()の下にある処理を遅延後に実行されるタスクとして作成。<br>
そして再びタスクとしてキューへ入れるため、この遅延している間は他のタスクが処理することが可能。

```csharp
Task.Delay(1000); // 遅延後に完了するタスクを作成します。
```
<br>
これだけでもタスクの方が便利であるということが言えると思います。
でもスレッドしかできないこともあるよ？っていうものがありますが、今回は割愛。
今度解説します
Linux mpstatコマンド を試してみる

マルチプロセッサ統計ツールの mpstat（MultiProcessor STATistics）を試してみます。

###1. 環境
さくらのクラウド（IaaS） 2CPU 2GB

```
$ cat /etc/redhat-release
CentOS Stream release 8
```

###2. インストール
```
$ yum install sysstat
```

###3. シンプルに動作させてみる
```
$ mpstat
Linux 4.18.0-257.el8.x86_64 (localhost.localdomain)     2021年10月12日  _x86_64_        (2 CPU)

00時09分34秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
00時09分34秒  all    0.08    0.02    0.05    0.01    0.05    0.05    0.10    0.00    0.00   99.64
```

| 項目| 説明|
|:--|:--|
|CPU|論理CPU ID。サマリ情報ではall|
|%usr|ユーザー時間|
|%nice|ナイス値で優先度を操作したプロセスのユーザー時間|
|%sys|システム時間（カーネル）|
|%iowait|I/O待ち時間|
|%irq|ハードウェア割り込みによるCPU使用時間|
|%soft|ソフトウェア割り込みによるCPU使用時間|
|%steal|ほかのテナントのために使われたCPU時間|
|%guest|ゲスト仮想マシンのために使われたCPU時間|
|%idle|アイドル時間|

###4. CPUごとの統計情報を1秒毎に出力させる
```
$ mpstat -P ALL 1
Linux 4.18.0-257.el8.x86_64 (localhost.localdomain)     2021年10月12日  _x86_64_        (2 CPU)

00時16分59秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
00時17分00秒  all    0.00    0.00    0.00    0.00    0.00    0.00    0.50    0.00    0.00   99.50
00時17分00秒    0    0.00    0.00    0.00    0.00    0.00    0.00    0.99    0.00    0.00   99.01
00時17分00秒    1    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00

00時17分00秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
00時17分01秒  all    0.00    0.00    0.00    0.00    0.50    0.00    0.00    0.00    0.00   99.50
00時17分01秒    0    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
00時17分01秒    1    0.00    0.00    0.00    0.00    0.99    0.00    0.00    0.00    0.00   99.01

00時17分01秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
00時17分02秒  all    0.50    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   99.01
00時17分02秒    0    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
00時17分02秒    1    0.98    0.00    0.98    0.00    0.00    0.00    0.00    0.00    0.00   98.04
```

###5. ヘルプ情報
```
$ mpstat -h
使い方: mpstat [ オプション ] [ <時間間隔> [ <カウント数> ] ]
Options are:
[ -A ] [ -n ] [ -u ] [ -V ] [ -I { SUM | CPU | SCPU | ALL } ]
[ -N { <node_list> | ALL } ] [ -o JSON ] [ -P { <cpu_list> | ALL } ]
```

###6. 参考
[詳解 システム・パフォーマンス：O'Reilly](https://www.oreilly.co.jp/books/9784873117904/)
【Linux】viコマンド時の効率化

※当方開発が少ないため、同レベルの方に向けた共有のような記事になります。

viコマンド時、カーソルの移動など面倒に感じたことはないでしょうか。
私はかなりありました。
以下、viコマンド用のショートカットキーをピックアップして紹介していきたいと思います。
※insert時は使用不可です。

1.カーソル移動
---
| ショートカット      | 意味             |
|-------------------|-------------------|
| K        | 上へ1マス移動 |
| J        | 下へ1マス移動 |
| H        | 左へ1マス移動 |
| L        | 右へ1マス移動 |
| 0（ゼロ） | 行の先頭へ移動       |
| $        | 行の末尾へ移動       |
| gg       | ファイル内の先頭行へ移動 |
| shift+g  | ファイル内の最終行へ移動 |

2.文字の編集
---
| ショートカット      | 意味              |
|-----------------------|-------------------|
| r             | 修正したい文字へカーソルを移動し、r押下後文字を入力 |
| dd             | 消したい行数分数字を入力後、dd押下 |


以上になります。
少しでもお役に立てれば嬉しいです。
【Rails】Active_hashの結合テストコードの書き方【Rspec】

ユーザー新規登録を例に、Active_hashを含む結合テストコードのやり方をアウトプットしていきます。

**前提条件**
・Rubyバージョン2.6.5
・Railsバージョン6.0.0
・Gemファイル内の`:development, :test`に
　「gem 'rspec-rails'」「gem 'factory_bot_rails'」を導入し、`bundle install`済み
・Active_hashを作成してページに表示済み

# 結論
`select '選択肢', from: 'name属性'`とする。

# 書き方

フォームに入力する動作をテストしたい時は`fill_in`を用いますが、
Active_hashのプルダウン形式は「入力」ではなく「選択」となります。
そのため`select`を使って選択する動作をテストしていきます。

```
require 'rails_helper'

RSpec.describe "ユーザー新規登録", type: :system do
  before do
    @user = FactoryBot.build(:user)
    sleep 0.2
  end

  context 'ユーザー新規登録ができる時' do
    it '正しい情報を入力すればユーザー新規登録ができてトップページに移動する' do
      # トップページに移動する
      visit root_path
      # トップページにサインアップページへ遷移するボタンがあることを確認する
      expect(page).to have_content('新規登録')
      # 新規登録ページへ移動する
      visit new_user_registration_path
      # ユーザー情報を入力する
      fill_in 'email', with: @user.email
      fill_in 'password', with: @user.password
      fill_in 'password-confirmation', with: @user.password_confirmation
      select "男性", from: 'user[gender_id]'        //ここから下4行がselectの例です
      select '1994', from: 'user[birthday(1i)]'
      select '9', from: 'user[birthday(2i)]'
      select '18', from: 'user[birthday(3i)]'

　　〜省略〜
```

**＜「選択肢」と「name属性」の調べ方＞**

**検証ツール**を活用して`select '選択肢', from: 'name属性'`に必要な情報を集めます。
①Active_hashの選択ボックスが表示されているページで「⌘ + option + i」(もしくは右クリックから選択)を実行して検証ツールを起動します。
②検証ツール枠内の一番左上にある矢印をクリックすると、ページ内のあらゆる要素に照準を合わせることができるので、その状態で選択ボックスをクリックします。
③すると検証ツールのElements内に、フォームのHTMLコードが表示されます。

![de5fad3f07a47edb4c1d8f66bc8558d4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1884909/4a4dfc96-6faa-31a3-0a39-c884dd49bf2e.png)

これは性別のフォームをクリックした時の表示です。
ここから次の2つのことがわかります。
・**optionタグ**に囲まれている3つの選択肢(---, 男性, 女性)
・**name属性**に指定されている`user[gender_id]`

ぶっちゃけoptionタグに囲まれている選択肢はここを見ずとも、自分で設定したものなので分かると思います。
それよりも大事なのは**name属性**です。

下記のように、erbファイルのコードではname属性を記述していないのに、HTMLコードに変換されたものではしっかりとname属性が表示されています。

```
 //name属性の記述はどこにも見当たらない
 <%= f.collection_select(:gender_id, Gender.all, :id, :name, {}, {class:"select-box"}) %>
```
この現象には**form_withの特性**が関与しています。

#form_withの特性
実はform_withで作成されているフォームには、何も指定しなくても**id名**と**name属性**が自動で付与されるようになっています。
・**id名**：`modelオプションに指定されている変数名_カラム名`
・**name属性**：`modelオプションに指定されている変数名[カラム名]`

今回で言えば、
①form_withのmodelオプションに指定されている`@user`
②入力された値を保存する`カラム名gender_id`

そのため次のようになります。
・**id名**：`user_gender_id`
・**name属性**：`user[gender_id]`


なので仮に「`model: @post`」と「カラム名 :prefecture_id」であれば、
・**id名**：`post_prefecture_id`
・**name属性**：`post[prefecture_id]`
<br>
以上のことから、`select '選択肢', from: 'name属性'`に必要な情報は、**検証ツール**を使うことで見つけることができ、Active_hashを含む結合テストコードが可能となります。

これでActive_hashを含む結合テストコードの書き方の説明は終わりです！お疲れ様でした。
ご指摘などあれば、ご教授いただけると幸いです。
RSpec reloadの使い方

# RSpecとは
Railsでwebアプリを開発する時、想定通りに動くかを検証するためのテストフレームワークです。
実務ではスクールみたいなコードレビューではなくRSpecのようなテストで動作するか確認します。
実務のコードは１ファイル何百行とかあったりする」ためです。

# reloadとは
updateがちゃんとできるのかをテストをしたいときに使います。
インスタンスの値を更新したい時に使うみたいです。
下のようなスタッフの値を更新できるかをテストします。

```requests/staffs_spec.rb
describe "PATCH /staffs/:id" do
#都合により省略

 it "スタッフのレコードを更新" do
  expect {subject}.to change {staff.reload.name}.from(staff.name).to(params[:staff][:name])
  
end
end

```
expectの部分を説明すると、
staffの名前はstaffの名前からparamsで送られてきたstaffの名前に変わるつまり
staffの名前が更新されるという意味のコードです。


# 補足
paramsはフォームから送られてきた値を受け取るものです。
staff.reload.nameはstaffの名前をデータベースから取り直す意味です。


# 参考資料
https://qiita.com/ry_2718/items/3ffdf7c24857fc5724c2
https://takacc.hatenadiary.jp/entry/2020/06/29/131412
Linux vmstatコマンド を試してみる


仮想メモリ統計コマンド vmstat(8)（Virtual Memory STATistics）を試してみます。

###1. 環境
さくらのクラウド（IaaS） 2CPU 2GB

```
$ cat /etc/redhat-release
CentOS Stream release 8
```

###2. シンプルに動作させてみる
```
$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 1455792  65984 333008    0    0     0     2   44   54  0  0 100  0  0
```

| 分類| 項目| 説明|
|:--|:--|:--|
|procs|r|ランキューの長さ、実行可能スレッドの総数|
|procs|b|割り込み不可能なスリープ状態にあるプロセス数|
|memory|swpd|スワップアウトされたメモリの容量|
|memory|free|空きメモリ容量|
|memory|buff|バッファキャッシュ内のメモリ容量|
|memory|cache|ページキャッシュ内のメモリ容量|
|swap|si|スワップイン（ページング）されたメモリの容量|
|swap|so|スワップアウト（ページング）されたメモリの容量|
|cpu|us|ユーザー時間|
|cpu|sy|システム時間|
|cpu|id|アイドル時間|
|cpu|wa|I/O待ちの時間。スレッドがディスクI/Oのためにブロックされていて、CPUがアイドル状態になっている時間|
|cpu|st|盗まれた(STolen）時間。仮想環境でほかのテナントにサービスを提供するために使われたCPU時間|


###3. 連続動作させてみる
3秒毎に4回

```
$ vmstat 3 4
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 1455444  66140 333152    0    0     0     2   44   54  0  0 100  0  0
 0  0      0 1455396  66140 333152    0    0     0     0  116  137  0  0 100  0  0
 0  0      0 1455236  66140 333152    0    0     0     0  103  119  0  0 100  0  0
 0  0      0 1455268  66140 333152    0    0     0     0   86  107  0  0 100  0  0
```

###4. ヘルプ情報
```
$ vmstat -h

Usage:
 vmstat [options] [delay [count]]

Options:
 -a, --active           active/inactive memory
 -f, --forks            number of forks since boot
 -m, --slabs            slabinfo
 -n, --one-header       do not redisplay header
 -s, --stats            event counter statistics
 -d, --disk             disk statistics
 -D, --disk-sum         summarize disk statistics
 -p, --partition <dev>  partition specific statistics
 -S, --unit <char>      define display unit
 -w, --wide             wide output
 -t, --timestamp        show timestamp

 -h, --help     display this help and exit
 -V, --version  output version information and exit

For more details see vmstat(8).
```

###5. 参考
[絵で見てわかるシステムパフォーマンスンの仕組み：翔泳社](https://www.shoeisha.co.jp/book/detail/9784798134604)
[詳解 システム・パフォーマンス：O'Reilly](https://www.oreilly.co.jp/books/9784873117904/)
各ベンダーごとの Java17 バージョン情報

各ベンダーごとに、`java --version` で表示されるバージョン情報をまとめました。

|ベンダー|名称|バージョン情報|
|:---|:---|:---|
|Amazon|Corretto|OpenJDK 64-Bit Server VM Corretto-17.0.0.35.1<br/>(build 17+35-LTS, mixed mode, sharing)|
|BellSoft|LibericaJDK|OpenJDK 64-Bit Server VM<br/>(build 17+35-LTS, mixed mode, sharing)|
|Eclipse Foundation|Temurin|OpenJDK 64-Bit Server VM Temurin-17+35<br/>(build 17+35, mixed mode, sharing)|
|Microsoft|Microsoft Build of OpenJDK|OpenJDK 64-Bit Server VM Microsoft-26987<br/>(build 17+35, mixed mode, sharing)|
|Azul|Zulu|OpenJDK 64-Bit Server VM Zulu17.28+13-CA<br/>(build 17+35-LTS, mixed mode, sharing)|
|Oracle|OpenJDK|OpenJDK 64-Bit Server VM<br/>(build 17+35-2724, mixed mode, sharing)|
|Oracle|Java|Java HotSpot(TM) 64-Bit Server VM<br/>(build 17+35-LTS-2724, mixed mode, sharing)|

# VM 情報

バージョン情報の `mixed mode` などの値は、実行時のVMオプションによって決まります。
（なので、`java -Xint --version` と実行すると表示が変化します）

* *mixed mode*
    * JIT コンパイルとインタプリタを併用するモードになっていることを示しています。
    * VM オプション `-Xint` で、インタプリタモード（interpreted mode）に変更できます。
    * VM オプション `-Xcomp` で、JIT コンパイルモード（compiled mode）に変更できます。
* *sharing*
    * [CDS (クラス・データ共有)](https://docs.oracle.com/javase/jp/16/vm/class-data-sharing.html#GUID-7EAA3411-8CF0-4D19-BD05-DF5E1780AA91) が有効になっていることを示しています。
    * VM オプション `-Xshare:off` でオフにできます。
* *emulated-client*
    * C1 （クライアント・コンパイラ）のみを使用することを示しています。[^c1]
    * `-XX:CompilationMode=quick-only` を付けた際に表示されます。

[^c1]: `java -XX:CompilationMode=quick-only -XX:+PrintCompilation --version` と実行すると、C1しか使われていないことが分かります。
Bigqueryの不要テーブルを一括で削除する方法

# 削除コマンド
データセット単位で一括削除するコマンド

``` 
bq ls --project_id　【PROJECT-ID】 -n 1000 【DATASET】 | awk '/【削除したいテーブルフィルタ条件】/{ print "【DATASET】."$1 }'　| xargs -n 1 -t bq rm -f
````

#### 分解して解説してきます
1.`bq ls --project_id　PROJECT-ID -n 1000 DATASET `ですが、これは指定したプロジェクトのデータセットのテーブルを1000件まで表示するコマンドです。
`-n`で上限を決めていますが、なくても良いですし、100件までとすることもできます。

2.`awk '/フィルタ条件/{ print "DATASET."$1 }'`ですが、[awk](https://qiita.com/yamazon/items/563af1b485ff413d381f)コマンドを使用してフィルタを掛けています。
これをすることで特定のデータセットの不要なテーブルのみを抽出します。
$1は変数です。
パイプラインで繋いでいる1の結果を受け取っています。

3.`xargs -n 1 -t bq rm -f`ですが、[xargs](https://techblog.kyamanak.com/entry/2018/02/12/202256)を使用して、2で実行した結果を受け取ってコマンドを実行します。
`-n`オプションは必須です。
削除テーブルを一つずつrmコマンドで実行するので１を指定します。
-tはコマンドを 1 つ読み込み、実行してから終了するオプションです。

これらをパイプで結合して実行することで不要テーブルを削除することができます。
是非活用してください
【さくらのクラウド】オブジェクトストレージをCyberduckから利用する

# 概要

さくらのクラウドのオブジェクトストレージをCyberduckから使う方法をまとめました。
MacユーザーでCyberduckを使っている人はぜひ参考にしてください。

WinSCPについてはこちらの記事を参考にしてください（私も参考にさせていただきました！）

https://qiita.com/Dalice/items/59cb283748b7d66ba0ca

# 注意事項

https://manual.sakura.ad.jp/cloud/objectstorage/about.html#amazon-s3

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901444/78007456-17e1-cb49-34de-a9529689d4d8.png)

上記の通り公式ではサポートされておりません。自己責任で利用をお願いします。

# 設定手順

今日のゴールです。操作がわかる人はこちらを参考にしてください。
ブックマーク追加から設定してください。

![設定画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901444/a3194125-3d19-ceab-e450-c75ed6bb0b74.png)

## コンパネ側の設定

1. サイトの作成
![サイト作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901444/4b06242f-d7a1-3c26-9590-1976477150ca.png)
1. バケットの作成<br>
![バケット作成1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901444/2ec1026f-ae04-9d32-5e7b-3caf6edce7e0.png)
![バケット作成2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901444/687525bb-58ac-c81c-a7d3-df7dc9f0e7aa.png)


1. パーミッションの作成
![パーミッション作成1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901444/c1186055-d674-899c-4ba3-c54e7f4b1654.png)
![パーミッション作成2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901444/7cfc97e3-606d-bdf3-853c-e27596a107e7.png)
![パーミッション作成3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901444/13d4d0a0-e3e6-6465-f0f6-bd39da34530c.png)

## Cyberduckの設定

1. ブックマーク一覧から新規ブックマークを追加する<br>
![cyberduck add ブックマーク.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901444/39c1ba0d-dd6d-9cbc-31c4-d73890d61195.png)
1. 設定を入力する<br>
  - 上のプルダウンから[Amazon S3]を選択
  - サーバにS3エンドポイントを入力（ポートはそのまま443）
  - アクセスキーIDは、パーミッションで控えたもの
  - シークレットアクセスキーも、パーミッションで控えたもの
  - パスは作成したバケット名を入力
<br>
![設定画面2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901444/af375cd1-6d1d-edfb-2990-527b20b7e859.png)
1. バケットに接続する<br>
![設定3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901444/3d154722-85c5-97f5-f2bb-65ae3876b17a.png)


# つまったところ

さくらのオブジェクトストレージを使うにはパスの設定が必要なのですが、[新規接続]からはこの設定ができないみたいです。
設定手順のように新規ブックマークから設定を行ってください。

![注意1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901444/3ae26b90-2c21-7c77-4afb-c60022005329.png)

# まとめ

ターミナルで触るよりもツール使った方が簡単ですよねー。快適なオブジェクトストレージライフをお送りください！

![まとめ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901444/4f451940-49c8-dae6-df7d-404106515d71.png)
[Java]条件分岐について（初学者）

# はじめに
本記事では、Javaの繰り返し分岐について記述します。
本日よりJavaの学習を始めました。

# if文
## 例文(ifのみ)

```java
int i = 100;
if (i == 100){
  System.out.println("True");
}

// 「True」と表示されます。
```

### 参考
#### データ型
以下参考サイトになります。
[基本のデータ型](https://www.javadrive.jp/start/var/index4.html)

|データ型|値|
|-|-|
|int|整数|
|boolean|true or false|
|double|小数点付きの数字|
|String|文字列|

#### System.out.println
以下参照ください。
[System.out.printlnとは](https://www.javadrive.jp/start/const/index8.html)
> System.out.println は標準出力へ引数に指定した値を出力する

## if+else文
もし、aでなければbという風に、bに対する分岐として`else`を使用します。

```java
int i = 100;
if (i > 110){
  System.out.println("True");
} else {
  System.out.println("False");
}

// 「False」と表示されます。
```

## if+else if+else文
もし、~ならばaで、そうでなくとも、もし~ならばb(`else if`)で、
それ以外は、cに対する分岐として(`else`)を使用します。

```java
int i = 100;
if (i > 120){
  System.out.println("iは120より大きい");
} else if (i > 110){
  System.out.println("iは110より大きく、120以下");
} else {
  System.out.println("iは110以下")
}

// 「iは110以下」と表示されます。
```

# switch文
条件の値が`case`と一致する場合の処理が実行されます。

```java
int i = 100;
switch (i % 3){
  case 0:  //ここは「:」 
    System.out.println("3の倍数です");
    break;
  case 1:  //3で割った余りが「1」ということ
    System.out.println("3の倍数に1加えた数字です");
    break;
  case 2:
    System.out.println("3の倍数に2加えた数字です");
    break;

// 「3の倍数に1加えた数字です」と表示されます。
```

### break
`switch文`を`終了`させる命令です。

```java
int i = 100;
switch (i % 3){
  case 0:  //ここは「:」 
    System.out.println("3の倍数です");
    //break;
  case 1:  //3で割った余りが「1」ということ
    System.out.println("3の倍数に1加えた数字です");
    //break;
  case 2:
    System.out.println("3の倍数に2加えた数字です");
    break;

// 「3の倍数です」
// 「3の倍数に1加えた数字です」
// 「3の倍数に2加えた数字です」と連続で表示されてしまいます。
```

### default
どのcaseにも、`一致しなかった時`に実行する処理です。

```java
int i = 100;
switch (i % 30){
  case 0:
    System.out.println("30の倍数です");
    break;
  case 1:
    System.out.println("30の倍数に1加えた数字です");
    break;
  case 2:
    System.out.println("30の倍数に2加えた数字です");
    break;
  default:  //ここも「:」
    System.out.println("該当しませんでした");
    break;

// 「該当しませんでした」と表示されます。
```

以上です。

# 終わりに
私は、Rubyを学習していましたが、
考え方が似ている(?)のかJavaの学習がしやすいです。

基礎の基礎で、
学習を始めたてなので、応用じみた投稿ではありませんが、
コツコツ頑張ります！
G検定を受験する方へ

# はじめに

下記試験合格までに使用した参考書などを紹介します。
これから受験する方の受験準備の目安になれば幸いです。
JDLA Deep Learning for GENERAL 2020#2

# １．G検定ってなに？

ジェネラリスト検定の略。
2017年から日本ディープラーニング協会が実施する、ディープラーニングの基礎知識等を検定する試験。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035894/50b34d16-7ddd-a51b-ee2c-1697b407e1b6.png)　　　　　　
　　　　[公式HPはこちら](https://www.jdla.org/certificate/general/)

# ２．試験はいつやってる？

2017年から実施されているが、
現在は年3回程実施しており、2021年のスケジュールは下記の通りです。

2021#1 ： 2021年3月20日（土）・・・終了
2021#2 ： 2021年7月17日（土）・・・終了
2021#3 ： 2021年11月6日（土）受験申し込み受付中
2022#1 ： 2021年3月5日（土）
2022#2 ： 2021年7月2日（土）
2022#3 ： 2021年11月5日（土）

# ３．試験のために準備したもの
## 本
* [人工知能は人間を超えるか ディープラーニングの先にあるもの](https://www.amazon.co.jp/dp/4040800206/)<br>
* [深層学習教科書ディープラーニングG検定(ジェネラリスト) 公式テキスト 第2版](https://www.amazon.co.jp/dp/4798165948)
* [AI白書2020
～広がるAI化格差（ギャップ）と5年先を見据えた企業戦略～](https://www.amazon.co.jp/dp/4049110342/)

## オンライン模擬試験
* [Study-AI　](https://study-ai.com/generalist/)


## 例題

### 問題１
1946年にアメリカで世界初の汎用コンピューター（　ア　）が誕生し、その圧倒的な計算力はいずれコンピュータが人間の能力を超えるだろうという可能性を見出すきっかけとなった。人工知能という言葉は、1956年にアメリカで開催された（　イ　）において、著名な人工知能研究者である（　ウ　）が初めて使った言葉である。

選択（　ア　）
A. ワトソン
B. ディープブルー
C. エニアック
D. HAL9000

<details><summary>答え</summary><div>
C. エニアック
</div></details>

選択（　イ　）
A. ボストン会議
B. ダボス会議
C. ウエストファリア会議
D. ダートマス会議

<details><summary>答え</summary><div>
D. ダートマス会議
</div></details>

選択（　ウ　）
A. マービン・ミンスキー
B. ジョン・マッカーシー
C. クロード・シャノン
D. アレン・ニューウェル

<details><summary>答え</summary><div>
B. ジョン・マッカーシー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035894/3464fbe2-c714-b651-5b4a-6395d0a5982f.png)

</div></details>

### 問題２
教師あり学習と教師なし学習はデータセットの形式に違いがあり、教師あり学習は（　ア　）が、教師なし学習は（　イ　）が用いられる。これらのデータを用いて、教師あり学習は（　ウ　）を、教師なし学習は（　エ　）を学習する。

A. 入力データと出力データ
B. 入力データのみ
C. 訓練データとテストデータ
D. 訓練データのみ
E. データ間の関係性
F. データが持つ構造・特徴

<details><summary>答え（　ア　）</summary><div>
A
</div></details>
<details><summary>答え（　イ　）</summary><div>
B
</div></details>
<details><summary>答え（　ウ　）</summary><div>
E
</div></details>
<details><summary>答え（　エ　）</summary><div>
F
</div></details>

### 問題３
|レベル|名称|運転主体|走行領域|
|---|---|---|---|
|1|運転支援|人|限定的|
|2|部分運転自動化|（　ア　）|限定的|
|3|条件付運転自動化|（　イ　）|限定的|
|4|高度運転自動化|システム|（　ウ　）|
|5|完全運転自動化|システム|（　エ　）|

A. 人
B. システム
C. 限定的
D. 限定なし

<details><summary>答え（　ア　）</summary><div>
A
</div></details>
<details><summary>答え（　イ　）</summary><div>
B
</div></details>
<details><summary>答え（　ウ　）</summary><div>
C
</div></details>
<details><summary>答え（　エ　）</summary><div>
D
</div></details>


[ディープラーニング協会リンク](https://www.jdla.org/membership/)
ABC140 C - Maximal Value を解いた

https://atcoder.jp/contests/abc140/tasks/abc140_c

![abc140_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/a6216079-20ec-5d4e-a496-c3e83b621581.png)
![abc140_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/f86d8c5f-688d-a71a-4b61-2917af90c449.png)

問題文の通りに書いてみた

```MaximalValue.py
N = int(input())
A = [0]*N
B = list(map(int,input().split()))
 
for i in range(N-2,-1,-1):
    if i == N-2:
        A[i],A[i+1] = B[i],B[i]
    else:
        A[i] = B[i]
        if B[i] <= A[i+1]:
            A[i+1] = B[i]
print(sum(A))
```
Google Compute Engineで作成したインスタンスに任意のポートで接続できない

<h1>背景</h1>
　webであれこれデータとかをやり取りしてみたいと思い立って、機械系知識無の状態から色々勉強し始めた。そこで、とりあえずサーバーとかいうのもよく分からないが動作するようにGoogle Compute Engineを環境設定することから始めた。
　だが、あまりにも知識がなさすぎて問題に対処できない状態にある。

<h1>環境と問題の状況</h1>

　主に以下の記事を見てそのまま設定した。
https://qiita.com/Brutus/items/22dfd31a681b67837a74

　インスタンスを作成することはできたが、問題はそのあとにある。
　起こっている問題の順序。
・元々sshのポートとして設定されていた”22”を任意の値のポート”2222”に変えた。
・ファイアウォールの設定を22から2222に変えた。
・一度インスタンスから抜け出し、もう一度入りなおそうとする。
・この時、SSH接続で入ろうとすると接続できず、「ポート22で接続することができません」というような文章が出る。
（疑問ポイント：ファイアウォールで22に接続する設定を消したのに何で？）
・カスタムポート接続で2222を入力し、入ろうとするが接続することができない。
（トラブルシューティングではファイアウォールに拒否られているのでは？などのようなことが書かれている）
・シリアルコンソールを見てみると、きちんとポートが2222に割り振られていることになっている。

　要は、インスタンスに任意のポートで接続したいのにそれができないというのが問題となっている。

<h1>どのようになってほしいのか（理想像）</h1>
　インスタンスに任意のポートで接続できる。（結果、セキュリティを向上させることができる）

<h1>問題の解決方法</h1>

　分からない。
　回避する方法はあるのかもしれないが、現状では知識が足りず思いつくことができない。
しかしファイアウォール設定で22から入れるよう設定しなおせばSSH接続で入ることができるようになるので、解決策が見つかるまでそのままでいくしかないだろう。セキュリティ的にはよろしくないのだけれど、無料枠があるうちになんとかできるこを信じて…。
　この問題の解決策を知っている方はぜひコメントで教えてください。私への助けになるだけでなく、将来同じ問題で悩んでしまった人にとってもこの記事を読んだときに悩む時間の短縮になります。

(１時間後追記)
　その後ちまちまやっていたら接続することができた。
　sshdを再起動するのを忘れていたらしい。

```
$ sudo systemctl restart sshd
```
　このコードを入れたら一発だった。設定を変えたら再起動しないと反映されないんだね。

　ほかにも、なぜかプロジェクトを切り替えたりしたらうまくいった人もいたらしい（おそらく状況は私の場合とは異なるのだろう）。

　この記事も参考になるかも。
[GCE にSSHできなくなったときに確認すること](https://wqwq3215.medium.com/gce-%E3%81%ABssh%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%AB%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8-621ebd4b7f5b)

[GCPのVMインスタンスがSSH接続できない！解決までの手順！](https://www.lisz-works.com/entry/gcp-ssh#%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB%E3%83%9D%E3%83%BC%E3%83%88%E6%8E%A5%E7%B6%9A)
縦にページングするScrollViewを作成（UIScrollView） 

#今回の内容

<img width="150" alt="DA84C277-B012-4E55-BF91-DE1EDE28E6DC_1_201_a.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466343/983256a1-2db8-17f2-0606-633abdf73b7f.jpeg"> <img width="147" alt="1B279A81-AF70-4323-92CB-FC622356FDD4_1_201_a.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466343/d1065643-317b-8ef3-b993-7b6866c14df9.jpeg"> <img width="147.5" alt="0E8DE2AA-79E8-49F8-A579-F863B97B4B29_1_201_a.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466343/d15d8a52-c720-d34f-3c52-1df902b14c70.jpeg"> 



#コードと簡単解説

* まずは、`.isPagingEnabled`を`true`で設定して、ページングを可能にします。

* `.contentSize`でスクロールするサイズを設定します。今回は、縦にだけスクロールさせるので、`width`を`view.frame.width`で設定します。

* `contentSize`に`height: view.frame.height * 3`を設定して、y軸方向に３段階のぺージングをする様にします。

```Swift:
import UIKit

class ViewController: UIViewController {
    
    let scrollView = UIScrollView()
    
    override func viewDidLoad() {
        super.viewDidLoad()
       
        scrollView.frame = CGRect(x: view.frame.minX, y: view.frame.minY, width: view.frame.width, height: view.frame.height)
        scrollView.contentSize = CGSize(width: view.frame.width, height: view.frame.height * 3)
        scrollView.isPagingEnabled = true
        scrollView.backgroundColor = .systemIndigo
        view.addSubview(scrollView)
        
        let topLabel = UILabel(frame: CGRect(x: scrollView.frame.maxX / 4, y: scrollView.frame.maxY / 10, width: scrollView.frame.width / 2, height: scrollView.frame.height / 20))
        topLabel.text = "Top"
        topLabel.font = UIFont.boldSystemFont(ofSize: 25)
        topLabel.textColor = .white
        topLabel.textAlignment = .center
        scrollView.addSubview(topLabel)
        
        let centerLabel = UILabel(frame: CGRect(x: scrollView.frame.maxX / 4, y: scrollView.frame.maxY + scrollView.frame.maxY / 10, width: scrollView.frame.width / 2, height: scrollView.frame.height / 20))
        centerLabel.text = "Center"
        centerLabel.font = UIFont.boldSystemFont(ofSize: 25)
        centerLabel.textColor = .white
        centerLabel.textAlignment = .center
        scrollView.addSubview(centerLabel)
        
        let bottomLabel = UILabel(frame: CGRect(x: scrollView.frame.maxX / 4, y: (scrollView.frame.maxY * 2) + scrollView.frame.maxY / 10, width: scrollView.frame.width / 2, height: scrollView.frame.height / 20))
        bottomLabel.text = "Bottom"
        bottomLabel.font = UIFont.boldSystemFont(ofSize: 25)
        bottomLabel.textColor = .white
        bottomLabel.textAlignment = .center
        scrollView.addSubview(bottomLabel)
    }

}
```

# 終わり
ご指摘、ご質問などありましたら、コメントまでお願い致します。
Java Silver アウトプット4

前回の続きです

https://qiita.com/0W5E8fPq1EOm4yE/items/77016a1b0b496f682d1b

今回はchapter4の繰り返し文と制御文です。

・for文の構文は「for(要素データ型 変数名:配列名)」


・配列に対して、hasNext()、next()の各メソッドを使用することはできない

・ラベルを使用する際は「:」で終わらす

・contiune文は繰り返し文内のみで処理を飛ばして次に進む

・defaultは任意の場所でOK!省略も可能

・2次元配列に対し、arx[x]のような1次元の呼び出しはできない

・配列の各要素にアクセスするには[要素番号][要素番号]であり[要素番号,要素番号]はNG

・for文とwhile文があった際はwhileが終わってからfor文の処理を行う

・引数の型があっているか値が大文字なのか小文字なのか一致しているか確認する

・まずはコードを読み、どのような実行結果になるのかを自分で導き出す

練習問題がズタボロですが解説を見たり、落ち着いて確認すると分かるようになってきました。
配列や繰り返し文、制御文は慣れていく必要があると新たな課題を見つけました。
ABC139 C - Lower を解いた

https://atcoder.jp/contests/abc139/tasks/abc139_c

![abc139_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/c5f5c699-ac30-0e1d-13a7-37f5f17c867c.png)
![abc139_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/1b7f9dfe-00a3-f8f9-b4fc-71c493d393b0.png)

もっと上手な書き方はあると思う。

```Lower.py
N = int(input())
H = list(map(int,input().split()))
 
ref = H[0]
cnt = 0
ans = 0
for i in range(1,N):
    if H[i] <= ref:
        cnt += 1
        ref = H[i]
        ans = max(ans, cnt)
    else:
        ref = H[i]
        ans = max(ans, cnt)
        cnt = 0
 
print(ans)
```
C#9.0 レコードのはじめの一歩 【初心者向け】

# レコードのはじめの一歩

この記事では、C#9.0で追加されたレコードを、主に初心者向けに解説します。

> note:この記事では、C#9.0で追加された`record`によるデータ構造を取り扱います。
> データベースの話題はこの記事では扱いませんのでご注意ください。

> C#10 では  **当記事で扱う `record` は `record class` と書くこともできる**ようになりました。
> C#10で追加された、レコード構造体 `record struct` についてはこの記事では扱っていません。


---
## レコードの定義

「どのような値を順番に持つかを決めて、そのデータ構造に名前を付ける」のがレコードの機能です。

```C#:レコードを定義する
record MyData(string Name, int Number);
```

上のように`MyData`という名前のレコードを定義することができます。

> `class`を定義するのと同じ階層に定義しましょう。

格納する値を指定している `(string Name, int Number)` の部分を「位置指定パラメータ」と呼びます。

> note: はじめは、「位置指定パラメータ」に、`int` , `double` , `string`などの基本的な型の組み合わせを使いましょう。
> 配列や独自のクラスなどを指定したい場合は、後半の注意点も確認してください。

## インスタンスの生成

定義通りの順番に実際の値を格納したインスタンス(実体)を生成できます。

```C#:インスタンスを生成する
MyData data1 = new MyData("なまえ", 123);
```

レコードのインスタンスは、以下のような性質を持っています。

* 値を読み取ることができる
* 値を書き換えることができない
  * 一部を書き換えたコピーを作ることができる

```C#:それぞれ読み取る
string a = data1.Name;
int b = data1.Number;
```

```C#:いっぺんに読み取る
(string x, int y) = data1;
```

```C#:Numberだけ書き換えたコピーを作る
MyData data2 = data1 with { Number = 234 };
```

> `with`式は、C#9.0時点ではレコードの特徴的な機能の一つです。
> `with`式の機能は今後拡張される予定です。

## 比較、文字列化

レコードでは、格納した値をいっぺんに比較できます。

```C#:2つのインスタンスを比較する
if(data1 == data2) {
    /* NameとNumberがすべて一致したら何かの処理を行う */
}
```

また、レコードではプロパティの中身まで文字列化してくれます。

```C#:中身まで表示してくれる。
Console.WriteLine(data1);
// 出力=> "MyData { Name = なまえ, Number = 123 }"
```

> これらの機能は、クラスでも自分で実装することで可能です。
> レコードはこの面倒な実装を勝手にやってくれます。


## 基本はここまで

レコードの基本の使い方はここまでです。
ここからは追加の説明になります。

---
## レコードのメンバー追加

クラスと同じように、レコードにもメソッドなどのメンバーを追加することもできます。

```C#:レコードの中身を追加？
record MyAdvanceData(string Name, int Number) {
   /* こうやってメソッドなどを定義することもできる */
}
```

ただ、ある程度のメンバーを定義しないと役に立たないクラスと違って、レコードでは「位置指定パラメータ」を指定するだけで十分に役に立ちます。
不要な場合は __何も書かない方が良い__ でしょう。

> ここにメンバーを追加する例は、また別の記事で書くつもりです。

## 注意点

「値を書き換えることができない」と書きましたが、「位置指定パラメータ」で指定した __型の種類によっては注意が必要__ です。
例えば、配列のような書き換え可能な型は、以下のような書き換えができてしまいます。

```C#:こういう定義には要注意
record MyArrayData(int[] Values);
```

```C#:不変ではない型を格納すると……
int[] array = new int[] { 2, 3, 5, 8 };
MyArrayData data = new MyArrayData(array);
// 配列の中身の書き換えはdataの中身も書き換えてしまう。
array[1] = 10; 
// 格納した後の配列内の値を書き換えることができてしまう。
data.Values[2] = 13; 
```

また、比較に関しては、配列の中身まで比較されることはありません。

こういうレコードの定義の良し悪しは、簡単に断定できるものではありませんが、「レコード型に格納したからといって、 __不変な性質が追加されるわけではない__ 」という事は頭に入れておいてください。

> 不変な性質を保ちつつ配列を格納するレコードの例は、別の記事で書くつもりです。
> 不変な配列やリストについて、参考までに↓
> [使いこなせていなかった System.Collections.Immutable"](https://qiita.com/muniel/items/46ffbbdfd360f6a2bead)

---
# おわりに

クラスとレコードで、できる事はそんなに大きく違うわけではありませんが、「変更しない値を保持することが主な目的」で「複雑な機能を必要としない」ならば、レコードは選択肢に入ります。
まずは、レコードらしい基本的な使い方が出来そうな場面から使ってみてください。

複雑なレコードの使い方もできますし、そういうサンプルを私も公開する予定ですが、 __シンプルな使い方こそがレコードの最大の魅力__ だと思っています。

> Qiitaに限らず、レコードの紹介記事ではレコードを使う意味がほとんど無いサンプルを時折見かけます。
> 多くの場合、メンバーを書き換えすぎていることが原因のように思います。
> 「メンバーの追加定義や書き換えはしなくてもいいんだよ」ということが、この記事で伝われば幸いです。
WSL2 上のアプリケーションに別ホストからアクセスする方法（管理者権限なし）

WSL2 上のアプリケーション（Docker コンテナを含む）に別ホストからアクセスするには、[`netsh interface portproxy` でポートフォワードさせる方法](https://github.com/microsoft/WSL/issues/4150)が有名です。

しかし、WSL2 はホストを再起動するたびに IP アドレスが変動します。したがって、毎回マッピングの修正（以前のマッピングの削除と新規登録）が必要となるのですが、そのたび `netsh` に管理者権限を要求されるのは嬉しくありません。[^1]

[^1]: 本稿の内容の他、バッチを Windows サービスとして登録し、管理者として実行させる方法もいいでしょう。

そこで、サードパーティーのアプリケーションを利用してポートフォワードしてみましょう。管理者権限が不要ですし、ファイアウォールの許可設定もより単純にできます。

## ホストから WSL2 にポートフォワードさせる

ポートフォワード機能を持ったアプリケーションの一例として、[stone](http://www.gcd.org/sengoku/stone/Welcome.ja.html) を利用してみましょう。

```powershell:forward.ps1
Param(
    $WSL2_PORT, # WSL2 側のポート
    $HOST_PORT # フォワード先のポート
)

# 既定のディストリビューションからIPアドレスを取得する
$WSL2_HOST = bash -c "ip -4 a show eth0 | grep -oP '(?<=inet\s)[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'"

# stone でポートフォワード
stone "${WSL2_HOST}:${WSL2_PORT}" ${HOST_PORT}
```

stone 以外のアプリケーションを利用する場合は、最終行を適切に修正してください。

実行方法は以下の通りです：

```powershell
.\forward.ps1 <WSL2 側のポート> <フォワード先のポート>

# WSL2 の Port 8080 <=> ホストの Port 8081
.\forward.ps1 8080 8081
```

ファイアウォールで stone が許可されていれば、別ホストから WSL2 内に到達できるはずです。

## 接続元ホストを限定してセキュリティを強化する

このままでは任意のホストがファイアウォールを抜けて WSL2 上に侵入できてしまうので、接続元ホストを制限しましょう：

```powershell:forward.ps1
Param(
    $WSL2_PORT, # WSL2 側のポート
    $HOST_PORT, # フォワード先のポート
    $ALLOWED_LIST # 接続許可リスト
)

# 既定のディストリビューションからIPアドレスを取得する
$WSL2_HOST = bash -c "ip -4 a show eth0 | grep -oP '(?<=inet\s)[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'"

# stone でポートフォワード
stone "${WSL2_HOST}:${WSL2_PORT}" ${HOST_PORT} ${ALLOWED_LIST}
```

実行方法は以下の通りです：

```powershell
.\forward.ps1 <WSL2 側のポート> <フォワード先のポート> <接続許可リスト>

# WSL2 の Port 8080 <=> ホストの Port 8081
# ただし接続元ホストを 192.168.1.* に限定する
.\forward.ps1 8080 8081 "192.168.1.0/255.255.255.0"
```

接続許可リストの書式については [stone の解説記事](https://www.gcd.org/sengoku/docs/NikkeiLinux00-08/relay.ja.html)を参考としてください。

## 参考リンク

* [Netsh interface portproxy コマンド](https://docs.microsoft.com/ja-jp/windows-server/networking/technologies/netsh/netsh-interface-portproxy)
* [grepの-oオプションと-Pオプションの組み合わせが便利](https://greymd.hatenablog.com/entry/2014/09/27/154305)
0からNextJS+Tailwind+AWS Amplify環境を立ち上げる

# ハードウェア環境
- MacBook Pro (13-inch, M1, 2020)
- Memory 16GB
- MacOS Big Sur

# 開発環境
インストールと設定方法は下記リンクで確認できる。
- [NodeJS](https://qiita.com/kyosuke5_20/items/c5f68fc9d89b84c0df09) v16.9.1
- NPM v7.24.0
- [yarn](https://qiita.com/akitxxx/items/c97ff951ca31298f3f24) v1.22.11
- [VSCode](https://qiita.com/watamura/items/51c70fbb848e5f956fd6) v1.60.2
- [AWSアカウント（IAMユーザー）](https://qiita.com/ikemura23/items/d95d783b0ed35dad1d6e)

# Amplifyの設定

### インストール
```bash
$ yarn add global @aws-amplify/cli
```

### 設定
```bash
$ amplify configure

Sign in to your AWS administrator account:
https://console.aws.amazon.com/
Press Enter to continue

# ここからAWSに飛ばされるので、ログインしてから戻ってEnterを押す

Specify the AWS Region
? region:  ap-northeast-1
Specify the username of the new IAM user:
? user name:  <新しいユーザーネーム>
Complete the user creation using the AWS console
https://console.aws.amazon.com/iam/home?region=ap-northeast-1#/users$new?step=final&accessKey&userNames=test&permissionType=policies&policies=arn:aws:iam::aws:policy%2FAdministratorAccess
Press Enter to continue
# またAWSに飛ばされるので、IAMユーザーを作成してから戻ってEnterを押す
# アクセスキーだけ選択して、権限はAdministratorAccessを選択
# 作成されたユーザーのアクセスキーとシークレットキーを下にペーストしていく
# 既存のIAMユーザーを使用したい場合は、そのままEnterを押して、ユーザーのキー情報を下にペーストする


Enter the access key of the newly created user:
? accessKeyId:  ***************************************
? secretAccessKey:  ************************************
This would update/create the AWS Profile in your local machine
? Profile Name:  default

Successfully set up the new user.
```


# NextJS+Tailwindで新しいプロジェクトを作成
- 開発するディレクトリに移動


```bash
$ npx create-next-app -e with-tailwindcss <プロジェクト名>
$ cd <プロジェクト名>
$ yarn dev
```

ローカル環境は[http://localhost:3000](http://localhost:3000)で立ち上がるはず。
RAIDの復習

# RAIDとは

（安価な）複数のハードディスクを組み合わせて1つの仮想的なハードディスクとして認識させ、冗長性や性能を向上させる技術のこと。

- RAID（Redundant Arrays of Inexpensive Disks）
  - Redundant：冗長
  - Arrays：配列
  - Inexpensive Disks：安価なディスク


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/3f7afe23-e9d3-138e-138b-22ac8378f600.png)

RAIDの構成によって、ディスクが1本壊れても残りのディスクで継続して使えたり、複数のディスクに分散して書き込み処理をすることで高速化したりできる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/d3558ebb-7403-afd0-9c4a-fdc1c7de4d88.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/aa66f5fc-aa7f-f134-e3f9-accb353b7ac7.png)

 **RAIDコントローラ** と呼ばれる装置でRAIDを構成し、ストレージの状態を管理する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/0d212ee2-9b27-9834-7373-c9bc4426b6da.png)



# 1. RAID0（ストライピング）
データを複数のドライブに分散させて書き込むことで、性能を向上させる。
ストライピングと呼ばれる。
2本以上のディスクで構成可能。

- メリット
  - 読み書き（I/O）を高速化する。
- デメリット
  - 冗長化されていないため、物理ディスクが1本壊れると復旧不能になる。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/f0bf7d2b-dd98-e923-cefd-73a2f13c02a4.png)

# 2.RAID1（ミラーリング）
複数のハードディスクに同じデータを書き込むことで、ディスクの耐障害性を実現する。
ミラーリングと呼ばれる。
 **2本の** ディスクで構成可能。（3本以上のディスクでは構成できない）

- メリット
  - 1本ディスクが故障しても処理の継続が可能。
- デメリット
  - ディスクの利用効率が1/2になる。（2本のディスクで1本分のデータしか保持できない）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/1a1e1050-ae23-eaf0-a30a-750db9918397.png)

# 3.RAID5（パリティレイド）
データからパリティ（誤り訂正符号）を生成し、 **3本以上** のディスクに分散して書き込む。

- パリティ：各データを修復するための符号。

耐障害性と利用効率が共に得られるバランスのよい構成であり、広く利用されている。

- メリット
  - 複数のディスクに分散しているため読み込みが優れている。
  - 1本ディスクが故障しても、残りのディスクで処理の継続が可能。
  - パリティ情報と正常なディスクのデータから、故障したデータの復旧が可能。
- デメリット
  - パリティ情報を生成するため書き込み速度は劣る。
  - 2本以上ディスクが故障するとデータ復旧できない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/fd991a3d-7c2f-b5ad-5314-0d97f6e034d5.png)


# 4.RAID6（ダブルパリティレイド）
データからパリティを二重に生成し、**4本以上** のディスクに分散して書き込む。

- メリット
  - 2本のディスクが故障しても、残りのディスクで処理の継続が可能。
  - パリティ情報と正常なディスクのデータから、故障したデータの復旧が可能。
- デメリット
  - パリティ情報を二重に生成するため、書き込み速度はRAID5よりも劣る。
  - パリティ情報が増えるため、ディスクの利用効率はRAID5よりも劣る。
  - 3本以上ディスクが故障するとデータ復旧できない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/b3bc4cb5-5d6a-7c51-5b31-46de3730b095.png)

# 5.RAID10（1+0）
RAID1とRAID0を組み合わせた構成。
 **4本以上の偶数本** のディスクで構成可能。

- メリット
  - RAID1を構成する2本のディスクが共に故障しない限り、残りのディスクで処理の継続が可能。
- デメリット
  - ディスクの利用効率が1/2になる。（2本のディスクで1本分のデータしか保持できない）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/6655b7f1-8d19-d25f-a5eb-f128d5390a05.png)

# 6.RAID計算

|RAID LEVEL|計算式|例|
|:--|:--|:--|
|RAID0|ディスク本数×ディスク容量|2本×2TB=4TB（4TB分のディスク容量で4TB全て使える）|
|RAID1|(ディスク本数×ディスク容量)÷2|(2本×2TB)÷2=2TB（4TB分のディスク容量で実効容量は2TB(半分)）|
|RAID5|(ディスク本数－1)×ディスク容量|(3本-1)×2TB=4TB（6TB分のディスク容量で実効容量は4TB）|
|RAID6|(ディスク本数－2)×ディスク容量|(5本-2)×2TB=6TB（10TB分のディスク容量で実効容量は6TB）|
|RAID10|(ディスク本数×ディスク容量)÷2|(4本×2TB)÷2=4TB（8TB分のディスク容量で実効容量は4TB(半分)）|

# 参考
[RAID：RAID0 / RAID1 / RAID5 / RAID6 / RAID10](https://www.infraexpert.com/study/networking9.html)
[大事なデータを守る！RAIDとは？](https://www.networld.co.jp/sp/learn_first/storage/p17_21.html)
[RAIDの容量計算](https://note.cman.jp/server/raid/raidcal/)
NVIDIA製GPU付きホスト上のLXDでOpenGLを使用する方法

# 背景

LXD上でROSのGUIを出そうと思ったらOpenGLのversionがmesaは1.2までしか対応していないけれど1.4を要求されるので動かないという事態が発生した。
NVIDIAじゃなくてIntelのeGPUとかでも動く。

# 解決策

ホストにはNVIDIAのGPUが刺さっているので、これをコンテナから使えるようにしてやる。
基本的には[これ](https://t.co/SYUYuvPIrE?amp=1)と[これ](https://blog.simos.info/running-x11-software-in-lxd-containers/)の内容を組み合わせてまとめただけである。

# １度だけやる必要のある処理

**これはホストに変更を加える。**
ホスト側のUID周りの設定を変更して、LXCコンテナに存在するユーザをホストのユーザにマップできるようにする。こうすることでホストのドライバやGPUを使えるようにする。

```
echo "root:$UID:1" | sudo tee -a /etc/subuid /etc/subgid
```

# コンテナに適用する処理

ここではコンテナの名前をnoeticとする。

```
lxc launch ubuntu:20.04 noetic
```

以下のコマンドはLXCコンテナのユーザを実際にホストのユーザにマップしている。

```
lxc config set noetic raw.idmap "both $UID 1000"
lxc restart noetic
```

以下のコマンドはLXCコンテナの中からX serverにアクセスできるように、必要なファイルをマウントしている。

```
lxc config device add noetic X0 disk path=/tmp/.X11-unix/X0 source=/tmp/.X11-unix/X0 
lxc config device add noetic Xauthority disk path=/home/ubuntu/.Xauthority source=${XAUTHORITY}
```

以下のコマンドはgpuをLXCコンテナに追加して、マップしたユーザで使用できるようにUIDとGIDを設定する。

```
lxc config device add noetic mygpu gpu
lxc config device set noetic mygpu uid 1000
lxc config device set noetic mygpu gid 1000
```

NVIDIAのGPUを使っている場合は以下のコマンドでLXCコンテナにNVIDIAのGPUを利用するための全権限を許可する。IntelのeGPUとかであればこの設定は不要。

```
lxc config set noetic nvidia.driver.capabilities all
lxc config set noetic nvidia.runtime "true"
```

設定を反映するために再起動する。

```
lxc restart noetic
```

# テスト

設定がうまく行ったか確認する

```
lxc exec noetic -- sudo --login --user ubuntu
sudo apt update
sudo apt install x11-apps mesa-utils alsa-utils
nvidia-smi
export DISPLAY=:0
xclock
glxgears
```
SequelAceでSSH接続する方法

踏み台サーバーを経由してMysqlに接続する方法をメモ。

~/.ssh/xxxx.pemに秘密鍵を配置

~/.ssh/configにSSH接続情報を記述（デフォルトで接続エラーが出る場合）

記述例↓

```
# Mysql
Host mysql
    HostName 10.22.33.44
    User ec2-user
    IdentityFile ~/.ssh/xxxx.pem
    Port 22
```

Sequel Ace のPreferencesのファイルにxxxx.pemとconfigファイルをaddFilesする
ネットワークのところのSSH Configを先程記述したconfigファイルを設定する

最後にSSH接続すれば完了
![スクリーンショット 2021-10-11 22.05.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360790/014eda4a-9585-a625-ea8e-281c0a1ab077.png)

サラッとですが以上です。
クレジットカードの基礎知識

# 本記事の目的
クレジットカード関連の業務知識を整理すると共に
昨今（2021年9月現在）のクレジットカード業界の状況を知る。

# クレジットカード会社の種類

* 銀行系
* 信販系（ライフカード、オリコカードなど）
* 流通系（エポスカード、楽天カードなど）
* 消費者金融系

# ブランド一覧

* Visa
  * 2018年時点で決済額、約8兆5,000億米ドル
  * 世界シェア約65％ 
  * VISA自体はカード発行無し。消費者はVISAブランドのライセンスカードを使用することになる。
* Mastercard
  * 2018年時点で決済額、約4兆3,000億米ドル
  * 世界シェアは約33％
* JCB
  * 2018年時点で決済額、約2,800億米ドル
* American Express
* Diners Club

# 最近人気のクレジットカード（価格.com参照）

* 三井住友カード（NL）
  * 両面ナンバーレスで安心
  * コンビニ、マクドナルドでタッチ決済することで得られるポイントが高い
  * 年会費無料

* JCB CARD W
  * ポイント還元率が通常のJCBの2倍
  * 年会費無料

* 楽天カード
  * 年会費無料
  * 楽天市場で高いポイント還元

* イオンカードセレクト
  * 年会費無料
  * イオンで高いポイント還元

# 信用情報機関

|信用情報機関|概要|
|---|---|
|CIC|クレジット会社の共同出資により1984年に設立された信用情報機関。保有する信用情報は、他の2機関と比べても最も多いと言われる。クレジットカード会社や消費者金融などが加盟している。|
|JICC|消費者金融が中心となって1986年に設立された信用情報機関。加盟している金融機関が最も多い。消費者金融から銀行まで多くの金融業者が加盟している。|
|全国銀行個人信用情報センター（KSC）|全国銀行協会（JBA）によって運営されている信用情報機関。銀行（メガバンク・地方銀行・ネット銀行・信用金庫・信用組合）が加盟している。加入条件が最も厳しい。|
[OutSystems]Forgeコンポーネントのバージョン問題

OutSystemsで利用できる、OSSのリポジトリがForgeです。
トラブルシュートするときや、新機能の確認をするときには、現環境にインストールされているForegeコンポーネントのバージョンを知りたくなります。

Forgeコンポーネントでは、バージョンチェックが難しい点があるので、解説と対策をまとめておきます。

# インストールされているForgeコンポーネントのバージョンがわからない
Service StudioやService CenterのUIには、インストールされているForgeコンポーネントのバージョンを確認する方法がありません。
例えば、Service Studioでモジュールを開き、Moduleメニュー > Open other versionを選択するとバージョンが表示されますが、これは各環境内で振られたバージョン番号であって、Forgeにおけるバージョン番号とは別物。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/33a93fe1-0a38-8ed1-bebd-129675d39766.png)

一部、モジュールのDescriptionにバージョン番号を記載してくれているものもありますが、これは例外で当てにはできない。
例えば、ardoJSONなどはこの方法をとっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/df6e59a7-008a-4d4c-5f08-fd11917580df.png)

# Forge Components Installed Versionsを利用する
直接インストールしたものだけが対象とのことだが、環境にインストールされているForgeコンポーネントをバージョン付きでリストアップしてくれる。これ自体もForgeコンポーネント。
https://www.outsystems.com/forge/component-overview/8152/forge-components-installed-versions

↓がPersonal EnvironmentでForgeコンポーネントを表示してみた例。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/84ff835c-7cd1-0b40-79f5-2064dac08f6d.png)

## 直接インストールとは
Service StudioのForgeタブからインストールしたものと、oapファイルを使ったインストールが該当するようです。

oapファイルを展開して取得したomlをPublishしたときと、lifetimeを使ったリリースしたものは、このForgeでは検索対象外（Personal Environmentでは、lifetimeを使ったリリースができないので未確認）。

## 仕組み
このForgeコンポーネントは非公開API（Table）を使っているので、バージョンアップ時に動作しなくなる可能性は考慮に入れる必要があると思います。

OSSYS_APP_FORGEという名前のテーブルとApplication Entityをジョインすることで、Forgeからインストールした「アプリケーション」を検索する仕組み。

公式モジュールでは、このテーブルにアクセスできるEntityはない（Forgeにはある）。
そのForgeBaseVersionという列を加工することでバージョン番号を取得可能。

# ForgeホームページのVersionsで当たりをつけ、Service StudioでCompareして特定
1. Service Centerでバージョンを確認したいモジュールを開く
1. Service CenterのVersionsタブで該当モジュールをインストールまたは更新した日時を確認する
1. [Forge](https://www.outsystems.com/forge/)で該当コンポーネントを開く
1. ForgeのVersionsタブで日時に近い物を探し、ダウンロード
1. ダウンロードしたoapファイルをzipファイルとして展開する
1. 展開したフォルダに含まれているomlをインストールされているモジュールと比較（Service Studioでモジュールを開き、Moduleメニュー > Compare and Merge with Another Version or File > CHOOSE A FILEボタン > omlファイルを選択）

この方法で、両方のバージョンのdiffが取れます。
少々面倒ですが、差分を見てあたりをつけながら、対象バージョンを切り替えながら調査する。
LifeKeeper: GenericARKでスクリプトを書くときはsuは必須！？

#結論
GenericARK内でスクリプトを書く場合、少なくとも何らかの製品コマンドなどを実行するときには必ずsuを利用して実行ユーザーを指定した方が良い。例えそれがrootユーザーでの実行であっても。

```txt:例
$ su - root -c "実行コマンド"
```


#GenericARK内でsuを利用せずに直接`env`コマンドを実行した時の例


- USERは設定されていない。
- PWDは`/opt/LifeKeeper`。
- HOMEは設定されていない。
- - HOSTNAMEが設定されていない。
- PATHに`/usr/local/sbin`や`/usr/local/bin`が含まれていない。


一応`root`ユーザーとして実行されているのだが、上記のように環境変数が違うために想定とは違う挙動をすることがあり、私はハマってしまった。

```txt:env
RemoveScript=/root/generic_stop.sh
fromCreate=true
RestoreScript=/root/generic_start.sh
LANG=C
LKROOT=/opt/LifeKeeper
LocalServer=sios-fn-vsi1
ok_text=OK
QuickCheckScript=
cancel_text=Cancel
LKTMP=/tmp
LKSYSLOGTAG=LifeKeeper
lkUserPermissionName=Administrator
lkUserPermission=*
PWD=/opt/LifeKeeper
root=/opt/LifeKeeper
LC_CTYPE=C.UTF-8
Extension=.sh
APP_LOCALRECOVERYDIR=!recover
RootTag=app108361
help_text=Help
APP_QUICKCHECKDIR=!quickCheck
back_text=<Back
LKOSTYPE=Linux
close_text=Close
APP_REMOVEDIR=!remove
SwitchbackType=intelligent
LKDEVNULL=/dev/null
APP_RESTOREDIR=!restore
Common=</p><p class='caption'>Valid characters allowed in the script pathname are letters, digits, and the following special characters: <br><span class='lkGui'>&nbsp;&nbsp;&nbsp;&nbsp;- _ ! . /</span> </p><p class='caption'>A copy of this script or program will be saved under:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class='lkGui'>/opt/LifeKeeper/subsys/gen/resources/app/actions</span><br>Whenever this resource is extended to a new server, the copy will be passed to that server.</p>
fromInstanceCreate=true
Kit=Generic Application
clear_text=Clear
apply_text=Apply
DoRestore=Yes
LKSYSLOGSELECTOR=local6
LC_MESSAGES=ja_JP.utf8
OBJ_DIR=/opt/LifeKeeper/lkadm
acceptDefaults_text=Accept Defaults
HIDE_GUI_SYS_LIST=
SHLVL=2
allowCancel=false
finish_text=Finish
PATH=/opt/LifeKeeper/bin:/bin:/usr/bin:/usr/sbin:/sbin
AppInfo=
next_text=Next>
_=/bin/env
```

#GenericARK内で`su - root -c env`を実行した時の例

こちらは想定された環境変数が設定されている。

```
LANG=ja_JP.utf8
HISTCONTROL=ignoredups
HOSTNAME=sios-fn-vsi1
XDG_SESSION_ID=c6
USER=root
PWD=/root
HOME=/root
MAIL=/var/spool/mail/root
SHELL=/bin/bash
SHLVL=1
LOGNAME=root
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/0/bus
XDG_RUNTIME_DIR=/run/user/0
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt/LifeKeeper/bin
HISTSIZE=1000
LESSOPEN=||/usr/bin/lesspipe.sh %s
_=/usr/bin/env
```
【Laravel】楽天レシピAPIからレシピを取得する方法

#はじめに
献立アプリを作る際に、楽天レシピAPIからレシピ（1カテゴリにつきランキング上位4つのレシピ）を取得したので、そのときのコードを備忘録として残しておきます。

#Bladeの`body`タグ内に記述

```php:welcome.blade.php
<body>
    @php
    $json = json_decode('APIテストフォームでパラメータ（categoryId=10といった感じ）を指定し、GETをクリックしたら出てくるデータをここにコピペ', true);

    use App\Models\Menu;
    $array = $json['result'];
    for($i=0; $i<sizeof($json['result']); $i++){
        $menu = new Menu();
        $menu->recipe_category_id = 10;
        $menu->user_id = 1;
        $menu->step = '';
        $menu->seasoning = '';
        $menu->menu_name = $array[$i]['recipeTitle'];
        $menu->image_path = $array[$i]['foodImageUrl'];
        $menu->description = $array[$i]['recipeDescription'];
        $menu->ingredient = implode(',', $array[$i]['recipeMaterial']);
        $menu->save();
    }
    @endphp
</body>
```

この記述を行った後、このページをリロードすると、自分で用意したテーブルのカラム内にそれぞれのデータを入れることができます。
また、IDを変えていくことで、そのIDを持つカテゴリの上位4つのレシピをどんどん取得することができます。
Mbed CLI 2 コマンドメモ

Mbed CLI 2を使ってみたら、Mbed CLI 1とだいぶ違った。
なので、よく使うコマンドをメモしておく。

# プロジェクトを新規作成

指定したプロジェクト名でフォルダが作成されて、ちょっとしたサンプルコードとmbed-osがgit cloneされます。

```
mbed-tools new <プロジェクト名>
```

> プロジェクトをgitリポジトリにしたいときは、プロジェクト名のフォルダに移動後、`git init`が必要です。

# 既存ライブラリを追加

指定したライブラリがgit cloneされます。オプションでclone先のフォルダ名を指定できます。

```
mbed-tools import <Git URL> [<フォルダ名>]
```

> Mbed CLI 1では<ライブラリ名>.libというファイルが自動的に作成されましたが、Mbed CLI 2では作成されなくなりました。`mbed-tools deploy`で依存関係を解決できるようにしたいときは、<ライブラリ名>.libを手作業で作成してください。

# 依存ライブラリの更新

<ライブラリ名>.libを参照して、特定のリビジョンがチェックアウトされます。`-f`オプションを付けると、ローカルの変更を破棄してチェックアウトされます。

```
mbed-tools deploy
```

# コンパイル

指定したターゲット、ツールチェーンでコンパイルします。

```
mbed-tools compile [-m <ターゲット>] [-t <ツールチェーン>]
```

# （おまけ）ざっと調べたときの印象・気づき

* Mbed CLI 1 -> Mbed CLI 2 で、gitに寄せていると感じる。
* プロジェクト自体をgit管理に強制しないことから、.libは残っている模様。
* コンパイルにCMake使うようになった。
* 各IDE向けのexport機能が無くなった。-> CMakeへ
* Mbed CLI 2のドキュメントが簡素すぎる。。。（Mbed CLI 1 + Migration guideか、`mbed-tools -h`を見てカンをはたらかせるか。。。）
* Mbed CLI 2のインストールに[手間](https://os.mbed.com/docs/mbed-os/v6.15/build-tools/install-or-upgrade.html)がかかる。[Dockerイメージ](https://os.mbed.com/docs/mbed-os/v6.15/build-tools/docker.html)があるので、いまからDocker学んででも使うことを強く推奨。

# 参考リンク

* [Mbed CLI 2 Use](https://os.mbed.com/docs/mbed-os/v6.15/build-tools/use.html)
* [Mbed CLI 2 Migration Guide](https://os.mbed.com/docs/mbed-os/v6.15/build-tools/migration-guide.html)
* [Mbed CLI 1](https://os.mbed.com/docs/mbed-os/v6.15/build-tools/mbed-cli-1.html)
オブジェクトトラッキング(DeepSORT)をJetson Nanoで動かす

Jetson Nano2Gを使って、オブジェクトトラッキング(DeepSORT)ができるように実装していきます
Jetson Nano4Gでも同様の手順で実装できます


###環境
・YOLOv5  https://github.com/ultralytics/yolov5
・Jetson Nano2G(4G)　SWAPファイル設定と冷却ファン必須
・JetPack 4.6 
・OpenCV 4.5.1
・PyTorch 1.9.0
・TorchVision 0.10.0

###更新履歴
2021年10月　初版

##このシリーズのゴール
Jetson Nano2G(4G) でUSBカメラを使って
オブジェクトトラッキング(DeepSORT)を動かします

DeepSORTの論文こちら
https://arxiv.org/pdf/1703.07402v1.pdf

##1.準備
Jetson Nano2G(4G)でYOLOv5が動く環境が構築されていること
環境構築ができていれば簡単です

環境構築ができてない場合はこのシリーズを参照
[YOLOv5をJetson Nano2G(4G)で動かして、物体を検知するから応用まで　その1]
(https://qiita.com/ShimoyamaAi/items/9b97f0888632fbc342ec)
[YOLOv5をJetson Nano2G(4G)で動かして、物体を検知するから応用まで　その2]
(https://qiita.com/ShimoyamaAi/items/57a9f0b5c3996b651bce)
[YOLOv5をJetson Nano2G(4G)で動かして、物体を検知するから応用まで　その3]
(https://qiita.com/ShimoyamaAi/items/7e44d07bc4b98d7ee055)
[YOLOv5をJetson Nano2G(4G)で動かして、物体を検知するから応用まで　その4]
(https://qiita.com/ShimoyamaAi/items/a4846de8c72c610d541f)

##2.実装
クローンします

```
git clone --recurse-submodules https://github.com/mikel-brostrom/Yolov5_DeepSort_Pytorch.git
```

環境が崩れてしまわないように
requirements.txtをコメントアウトします

```
# pip install -r requirements.txt

# base ----------------------------------------

#matplotlib>=3.2.2
#numpy>=1.18.5
#opencv-python>=4.1.2
#Pillow
#PyYAML>=5.3.1
#scipy>=1.4.1
#torch>=1.7.0
#torchvision>=0.8.1
#tqdm>=4.41.0

# plotting ------------------------------------

#seaborn>=0.11.0
#pandas

# deep_sort -----------------------------------

easydict
```

とりあえず動かしてみます

```
python3 track.py --source 0 --show-vid
```

ここからは特定の対象物だけで動かしてみます
YOLOv5 と同じように --class で指定できます
人の場合は

```
python3 track.py --source 0 --show-vid --class 0
```

実行結果です

<iframe width="560" height="315" src="https://www.youtube.com/embed/zfsP_Zqk75Q" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
アソシエーションの基礎知識

<h1>初めに</h1>

Rubyのモデルやアソシエーションの記載方法について
苦手意識があって初学者がつまりやすい箇所を分かりやすく
備忘録もかねて残そうと思います！

<h2>役に立つアソシエーションとモデルの書き方</h2>

モデル名でコードを記載する：

User.find
Book.new
Book.save

コントローラーやモデルにモデル名を記載して
コードを記述していきたい場合は"モデルの名前は大文字"で記載！

アソシエーション名でコードも記載する：

user.title
post.comment

このようにアソシエーションでつなげる場合は
アソシエーション名は小文字にする必要がある。

<h2>最後に</h2>

モデルやアソシエーションで役立つ記述があれば
今後もアップデートをしていきます！