OmniAICreator/Qiita-1.07M huggingface dataset:
Azure Fundamentals(AZ-900)：Azure の基礎: Azure のアーキテクチャとサービスについて説明する「Microsoft Defender for Cloud」

Microsoft Learnを用いたMicrosoft Azure Fundamentals(AZ-900)の試験内容をまとめる投稿です。
この投稿ではMicrosoft Learnで学ぶ内容をできるだけ簡潔にまとめております。
Azureの勉強を一から始める方の参考になれば幸いです。

## 今回の学習内容
**◆「Microsoft Defender for Cloud」**
◇対応するMicrosoft Learn ラーニングパス
[Azure の基礎: Azure のアーキテクチャとサービスについて説明する](https://learn.microsoft.com/ja-jp/training/paths/azure-fundamentals-describe-azure-architecture-services/)
◇対応するモジュール
[Microsoft Defender for Cloud について説明する](https://learn.microsoft.com/ja-jp/training/modules/describe-azure-identity-access-security/9-describe-microsoft-defender-for-cloud)

※前回の投稿は下記から確認できます。
[Azure Fundamentals(AZ-900)：Azure の基礎: Azure のアーキテクチャとサービスについて説明する「多層防御」](https://qiita.com/fsd-jume/items/8e55b6e44020f5651049)

## Microsoft Defender for Cloud
**セキュリティ体制管理と脅威に対する保護のための監視ツール**
⇒すべてのリソースのクラウドセキュリティ体制管理(CSPM)とクラウドワークロード保護プラットフォーム(CWPP)
・クラウド、オンプレミス、ハイブリッド、マルチクラウドの各環境でセキュリティ体制の強化が可能
・リソースの強化、セキュリティ体制の追跡、サイバー攻撃からの保護、セキュリティ管理の効率化のためのツールを提供

### 各環境におけるリソースの保護
・Defender for CloudはAzureのネイティブサービス
⇒多くのAzureサービスはデプロイを必要とせずに監視や保護が可能
・オンプレミスや別のクラウド環境ではAzure Arcを使用して監視や保護が可能

**◆Azureネイティブリソースの保護**
**・Azure PaaSサービス**
　-脅威を検出できる対象はAzure App Service、Azure SQL、Azure Storageアカウント、その他のデータサービスを含むAzureサービス
　-Azureアクティビティログで異常検出も実行可能
**・Azureデータサービス**
　-Azure SQLでデータを自動的に分類するのに役立つ機能あり
　-Azure SQLとStorageサービス全体の潜在的な脆弱性評価と緩和方法の推奨事項を取得可能
**・Networks**
　-ブルートフォース攻撃(総当たり攻撃)を制限可能
　-JIT VMアクセスを使用して、不要なアクセスを防止しネットワークを強化可能

**◆ハイブリッドリソースの保護**
・オンプレミスのマシンにAzure Arcをデプロイして、Azure以外のサーバを保護可能
・カスタマイズされた脅威インテリジェンスと優先順位がつけられたアラートを取得可能

**◆他クラウドのリソースの保護**
・他のクラウド(AWSやGCPなど)内のリソースも保護可能
・AzureサブスクリプションにAWSアカウントを接続している場合
　-AWS固有のセキュリティ推奨事項に従ってAWSリソースを評価し、結果をセキュアスコアに含める
　-資産インベントリページでAzureとAWSのリソースを合わせて管理可能
・Microsoft Defender for Kubernetesのコンテナの脅威検出と高度な防御がAmazon EKS Linuxクラスタまで拡張
・Microsoft Defender for Serversを使用し、WindowsとLinuxのEC2インスタンスで脅威検出と高度な防御を利用可能

### Defender for Cloudの3つのニーズ
**◆継続的な評価
セキュリティ体制を継続的に評価し、リソースの脆弱性を特定して追跡**
・Defender for ServersにはDefender for Endpointとの自動的でネイティブな統合機能を搭載
⇒有効にした場合はMicrosoftの脅威と脆弱性管理で検出された脆弱性をDefender for Cloudで表示可能
・定期的で詳細な脆弱性スキャンがあり、Defender for Cloud内から結果を確認して応答可能

**◆セキュリティによる保護
セキュアスコアでセキュリティ体制の正常性を維持し、セキュリティポリシーでワークロードを保護**
・世界レベルのポリシーソリューションのすべての範囲と柔軟性を利用可能
・管理グループ、サブスクリプション全体、テナント全体に対して実行するようにポリシー設定可能
⇒セキュリティで保護された構成基準をリソース全体に適用することも可能
・ワークロードの新しいリソースを継続的に検出しセキュリティのベストプラクティスに従って評価
・評価後は修正する必要がある推奨事項が優先度順位付きの一覧で表示
・推奨事項の一覧はAzureセキュリティベンチマークにより有効になり、サポートされる
※ベンチマークは一般的なセキュリティとコンプライアンスのベストプラクティスに関するガイドラインを提供
・各推奨事項の重要度が理解できるようにセキュアスコアを表示
・セキュアスコアでセキュリティ体制の正常性や体制の改善に必要な作業リストを確認可能

**◆リソースの防御
セキュリティアラートと高度な脅威保護機能でリソースを防御**
**・セキュリティアラート**
　-脅威を検出するとセキュリティアラートを生成
　-影響を受けるリソースの詳細を説明し、修復手順を提案
　-場合により、ロジックアプリと連携するオプションが表示
　-アラートは生成元や受信元に関係なくエクスポート可能
**・高度な脅威保護**
　-デプロイされた多くのリソースに高度な脅威保護機能を提供
　-JITアクセスと適応型アプリケーション制御を使用したVMの管理ポートのセキュリティ保護が含まれる
　-コンピュータ上で実行すべきアプリや実行する必要がないアプリを示す許可リストが作成

## 次の学習内容
**◆Azure のコストに影響する可能性がある要因**

https://qiita.com/fsd-jume/items/187a36cc0381401586f2

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/e4ec76959adb547ac5e8
備忘録

備忘録
●Githubからのダウンロード方法
 https://rnakato.hatenablog.jp/entry/2018/08/04/151041
●Ubuntu でのリポジトリの追加手順
 https://mtwtfsssite.wordpress.com/2018/09/27/ubuntu-%E3%81%A7%E3%81%AE%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E8%BF%BD%E5%8A%A0%E6%89%8B%E9%A0%86/
LoRaWAN対応無線モジュール Rhino WAN で STMicro および Semtech のライブラリを使用する場合の注意点

技適対応で、入手しやすい LoRaWAN対応無線モジュール Rhino WAN。
https://www.cyrola.co.jp/product-9.html

Grasshopper LoRaWAN Development Board の クローン品ということもあり、
https://www.tindie.com/products/tleracorp/grasshopper-lorawan-development-board/

Arduinoフレームワークベースライブラリ
https://github.com/kriswiner/CMWX1ZZABZ/tree/master/Grasshopper
を使う分には問題ないが、
下記のライブラリを使おうとしてハマるケースが多いイメージだ。

１）LoRaWAN software expansion for STM32Cube (UM2073)(日本対応版)
　https://www.stmcu.jp/design/sw_dev/firmware/55524/

２）LoRaWAN software expansion for STM32Cube (UM2073)
 https://www.st.com/en/embedded-software/i-cube-lrwan.html

３）LoRaWAN end-device stack implementation and example projects
　https://github.com/Lora-net/LoRaMac-node



RHINO(GRASSHOPPER)ボードは、村田製作所の CMWX1ZZABZ-078 というモジュールを利用しており。

CMWX1ZZABZ-091を利用している STMicro製ボード B-L072Z-LRWAN1 と AES関連機能以外での互換性がある。
村田製作所の公式サイトの FAQ にも、互換性があると明記されている。
（実際、同じバイナリで問題なく動作した）


# ■　ハマるポイント１：「GPIO PH1ピンを TCXO VCCとして利用している」

PH1 は他のGPIOと同様に初期化しても GPIO として機能してくれないケースがあるのだ。

PH1 を GPIO として利用するには、

クロック制御レジスタ（RCC_CR）の HSEBYP と HSEON が有効になっている必要がある。


詳細は、STMicroの「RM0367 リファレンスマニュアル」などの、「HSE クロック」について参照のこと。

PH1は、OSC_OUT と 同じピンなので、

クロックソースを外部クロックにして、OSC_OUT の機能を無効化する必要がある。

そのための設定が、クロック制御レジスタ（RCC_CR）の HSEBYP と HSEON だ。


# ■　ハマるポイント２：上記「３）LoRaWAN end-device stack implementation and example projects」限定だが、ライブラリが「GPIO H」の利用を想定していない

ライブラリのソースコードを追ってみるとわかるのだが、
gpio-board.c の GpioMcuInit() 関数にて、
GPIOHを指定しても __HAL_RCC_GPIOH_CLK_ENABLE() が呼ばれないので、PH1が利用できない。
コードを修正する必要がある。


上記、２点が抑えられれば RHINO(GRASSHOPPER)ボードで、各種ライブラリがr動作するようになる。

# 以上
[記事紹介] BIMIを使ってメールにロゴを表示する方法 (受信編)

@qualitia_cdevの中の一人、@hirachanさんが書いた記事をみなさまにご紹介します。


### BIMIを使ってメールにロゴを表示する方法 (受信編)
https://qiita.com/hirachan/items/4922ae25a3d0602a140a
本番環境でToken can't be blank　とでる

Railsでフリマアプリ作成の際、本番環境でToken can't be blank　とでた。
ローカルではうまくいったのに・・・
以下試したこと

・公開鍵と秘密鍵が環境変数に正しく設定されているか確認した
ターミナルにて
```terminal 
vim ~/.zshrc        
```
を使って確認
・JavaScriptの方で環境変数を呼び込む記述を確認した
```ruby
 Payjp.setPublicKey(process.env.PAYJP_PUBLIC_KEY);
```
・heroku logs --tail    をつかって中身をみると、
```terminal
2022-10-31T04:18:04.579549+00:00 heroku[web.1]: Idling
2022-10-31T04:18:04.589889+00:00 heroku[web.1]: State changed from up to down
2022-10-31T04:18:05.370935+00:00 heroku[web.1]: Stopping all processes with SIGTERM
2022-10-31T04:18:05.403392+00:00 app[web.1]: - Gracefully stopping, waiting for requests to finish
2022-10-31T04:18:05.403903+00:00 app[web.1]: === puma shutdown: 2022-10-31 04:18:05 +0000 ===
2022-10-31T04:18:05.403922+00:00 app[web.1]: - Goodbye!
2022-10-31T04:18:05.404078+00:00 app[web.1]: Exiting
2022-10-31T04:18:05.593066+00:00 heroku[web.1]: Process exited with status 143
```
という記述がみられ、ここがエラー箇所に該当するかもしれない。
外部検索によると、143エラーはHerokuの再起動が必要とのことだったので、
```terminal
#再起動のコマンド
heroku restart

# Herokuを停止して起動
heroku ps:scale web=0　　 # =>停止
heroku ps:scale web=１　　　　# =>起動
```
を試してみたが、うまくいかなかった。
その他にも
・Heroku上で公開鍵と秘密鍵が設定されているか確認した
```terminal
 heroku config
```
で確認
・ローカル環境ではうまくいっている

なんだろう・・・思いつくことは全部やってみたのになあ。

と思ったら、公開鍵と秘密鍵が手打ち入力であったことを思い出し、早速payjpのページから鍵をコピーアンドペースト。
すると・・・うまくいった！！！

良い勉強になりました。
JUnit指定順出力




```


★★★ 表示順指定
import org.junit.runners.MethodSorters;
import org.junit.Test;
import org.junit.FixMethodOrder;
@FixMethodOrder(MethodSorters.JVM)
@Test


例	
package test;		
	
import java.util.Arrays;		
import java.util.HashMap;		
import java.util.List;		
import java.util.Map;		
import java.lang.reflect.Field;		
import org.junit.runners.MethodSorters;		
import org.junit.FixMethodOrder;		
import org.junit.Test;


@FixMethodOrder(MethodSorters.JVM)		
public class Test{		
		
	@Test	
	public void test_1_1() {

	@Test	
	public void test_1_2() {


略

★JUnit実行結果

void test_1_1()

void test_1_2()
dotenvで環境変数をセットするには

## 環境
Ruby2.6
Rails5.2
Ubuntu20.4

## はじめに
RDBに接続する時のユーザーIDとパスワードは、database.ymlで設定します。しかし、database.ymlで設定すれば、GitHubに上げた時に、誰でも閲覧可能な状態にさらしてしまうことになります。これはセキュリティ上よくありません。それを防ぐためには、database.ymlをGitHubに上げなけばいいだけの話ではありますが、database.ymlには、ユーザーIDとパスワードの他にも、RDBの接続に関する重要な情報が含まれており、開発環境を再構築するためには、GitHubには置いておかなくてはいけないファイルになります。そこでよく使われる方法が、ユーザーIDとパスワードを環境変数に設定して、環境変数のキーをdatabase.ymlに設定する方法です。この方法をとれば、database.ymlをGitHubに上げても、ユーザーIDとパスワードが外部にさらされることはありません。Railsで環境変数を管理ときは、dotenvというgemが一般的に知られています。そこで、dotenvの使い方について書いてみました。

## dotenvをインストールする
Rubyで環境変数を管理する場合は、dotenvというgemを使いますが、Railsで環境変数を管理する場合は、dotenvではなく、dotenv-railsを使います。Ruby単体でdotenvを使う場合は、次のようにインストールします。Railsで使う場合は、Gemfileに、gem 'dotenv-rails'を追加して、bundle installを実行します。
```
$gem install deoenv
```

dotenv（もしくは、dotenv-rails）をインストールした後、.envファイルを新規作成して、ファイルの中で環境変数を設定します。
```.env
DATABASE_USER=hoge_usr
DATABASE_PASS=hoge_pwd
```

## Rubyで環境変数を取得する
Rubyからdotenvを使って環境変数を取得する場合です。
```ruby.rb
require 'dotenv'
Dotenv.load

puts ENV["DATABASE_USER"]       # =>hoge_usr
puts ENV["DATABASE_PASS"]       # =>hoge_pwd
```

.envファイルに環境変数を設定すれば、OSが持っている環境変数に書き込まれるのかといえば、そうではありません。.envファイルで設定した環境変数を、OSに問い合わせても、OSは値を持っていません。
```
$echo $DATABASE_PASS           # => （空）
$echo $DATABASE_USER           # => （空）
```

.envファイルに値をセットすることを「環境変数を設定する」という言い方をしますが、厳密にいえば、この表現には多少の語弊が含まれます。遠回しないい方にはなりますが、.envという名前のテキストファイルにOSに環境変数を設定するときと同じ記述の仕方をして、Rubyの環境変数を取り出すメソッドを使って、OSが持っている環境変数を取り出す方法と同じやり方で、.envファイルの値を取り出せるといった言い方のが妥当です。

>dotenvを使わずに、自分で適当な名前のiniファイルを作成して、iniファイルに記述した値を、File.Openメソッドなどを使って取得しても、やっていることは大きく変わっていません。そもそも、.envファイルはOSの環境変数には現実的に何の影響も与えていません。しかし、後からコードを見直した時に、何をやっているのかを素早く理解するためにも、dotenvを利用した方が便利であることは確かです。

OSの環境変数に実際に設定されている、HOMEの値を取得する場合です。この時は、dotenvを使うことなく取得できます。
```ruby.rb
puts ENV["HOME"]                # =>/home/tana
```

```
$echo $HOME                     # =>/home/tana
```

環境変数に設定されていない変数（キー）を取得した場合は、nilが返ってきます。環境変数が設定されていればその値を取得するが、設定されていなければ、代わりにデフォルト値をセットしたいといった場合は、次のようになります。fetchメソッドを使った方がスマートでしょう。
```ruby.rb
puts ENV["HOGE"].nil? ? "hoge_def" : ENV["HOGE"]    # => hoge_def
puts ENV.fetch("HOGE"){"hoge_def"}                  # => hoge_def
```

## Railsで環境変数を取得する
.envで設定した環境変数が、Railsで本当に取得できるのかを、Rails cで確認することができます。Ruby単体で使う場合と同じように、最初に、Dotenv.loadを実行しないと、取得できない点が注意です。
```
$rails c
>Dotenv.load
>ENV["DATABASE_USER"]
hoge_usr
```

database.ymlで設定する、ユーザーIDとパスワードを、.envファイルに記述して、database.ymlには環境変数をセットする場合の書き方です。rails sでアプリを起動する場合、config/application.rbで、Dotenv.loadを明示的に記述しなくても大丈夫なのかと思うかも分かりませんが、記述しなくても環境変数は取得できます。恐らく、Railsの内部のどこかで、陰にDotenv.loadが実行されているものと思われます。
```database.yml
development:
  <<: *default
  username: <%= ENV['DATABASE_USER'] %>
  password: <%= ENV['DATABASE_PASS'] %>
  
  # username: hoge_usr
  # password: hoge_pwd
```

## 最後に
.envファイルでにRDBに接続するためのユーザーIDとパスワードを設定した後、.envファイルをGitHubにあげないよう、Gitの.ignoreファイルで指定する必要があります。GitHubには上げなくても、本番サーバーにデプロイする時は、当然、.envファイルは上げなくいといけません。
laravel Carbon 月の数字の先頭を0で埋めないフォーマット

# 概要

- Carbonの月を表すフォーマットにて1桁月の先頭を0で埋めないフォーマットの指定方法をメモ的にまとめる。

# 方法

- フォーマットは`n`を用いることで1桁月の先頭を0で埋めないで出力してくれる。
- 下記に例をまとめる。（laravelのtinkerにて確認）

    ```php
    use Carbon\CarbonImmutable;
    
    $c = new CarbonImmutable('2022-01-01');
    echo $c->format('n'); // 1と出力される。
    echo $c->format('m'); // 01と出力される。
    ```

- 2桁月はとくに変化なく出力される。

    ```php
    use Carbon\CarbonImmutable;
    
    $c = new CarbonImmutable('2022-10-01');
    echo $c->format('n'); // 10と出力される。
    echo $c->format('m'); // 10と出力される。
    ```
『システム運用アンチパターン』輪読会 4章「情報ではなくデータ」

## **本章の内容**
目的に応じた利用しやすいダッシュボードを作成するための実践的なヒントが述べられている

---

## **4.1 データではなく利用者から始める**

**アンチパターン**
すべての人の役に立つ究極のダッシュボードを構築しようとする
**理由**
大事な情報が山のような数字というノイズに埋もれてしまう
誰にとっても役に立たないダッシュボードが完成する

---


**ダッシュボード作成のベストプラクティス**
始めに利用者を念頭に置くこと！！
観点
・誰が見るのか
・目的は何か？
・伝える必要のある情報のうち上位3〜5個の項目は何か？

---

## **4.2 ウィジェット:ダッシュボードの構成要素**
ダッシュボードにどのように表示するか

**折れ線グラフ**
迷ったらこれ
時系列での変化やばらつきを確認できる
複数のデータを一つの折れ線グラフに入れることや、面グラフで割合を見ることにも適している

**棒グラフ**
非常に頻度の低いデータや欠損値がある場合に最適
頻度が低いデータは折れ線グラフにすると不正確になる

**ゲージ**
ある時点での値を表示したい場合に最適

---

## **4.3 ウィジェットに文脈を与える**
単にデータを表示するだけでは十分ではない
データの良し悪しを示す文脈を与える必要がある

**■ おすすめの文脈の与える方法**
**1, 色**
物事の良し悪しを素早く判断できる
緑はOK, 黄色は警告、赤は危険といった一般的に認識されている色を使う

**2, しきい値線**
あるべき値の最大値を設定することで
ウィジェットを見る時の時間軸がどうであってもあるべき値の範囲内かどうかを判断できる

**3, 時間比較**
別の日の同じ時間帯を重ね合わせることで測定データが異常値なのか正常値なのか比較できる
スパイクや異常値の検出に最適

---

## **4.4 ダッシュボードの構成**
必要なデータにできるだけ早くアクセスできるように構成する
まずは、利用者がどの情報に定期的にアクセスするかを考える

■ **ポイント**
・　ウィジェットは左から右へ、上から下へ重要度の高い順に並べる
・　関連するウィジェット同士はまとめて分類する
・　ダッシュボードの先頭行は最も重要なメトリクス
・　ノートウィジェットを使って、どう読み解いて解釈すべきなのかを記述する(読み手を導く)
・　ダッシュボードの名前は対象者向けにすることで利用者が見つけやすくなる

---

## **まとめ**
ダッシュボード作成は未経験のため、
ダッシュボード作成時には以下のことを念頭に作成していきたいと思う

・ 利用者と目的を定めてから作成する
・ 取得するデータの特性に応じて見せ方を使い分る
・ 文脈を与え、一目で分かりやすくする（色・しきい値・時間比較など）
・ ウィジェットは行毎に配置し、左から右へ、上から下へ重要度の高い順に構成する

**手元にあるデータからではなく、利用者や目的を考えて成形することで有益な情報となる！**
[Docker] Ubuntu Desktop 20.04にRDP接続

Dockerで立てたUbuntu Desktop 20.04にRDP接続を行う．

# 目次
* コンテナの作成
* Microsoft Remote Desktopで接続
* 動作結果
* 補足

# 作業環境
* Ubuntu20.04

# コンテナの作成
はじめに以下のコマンドでDockerfileをダウンロードします．
これは，[Gist](https://gist.github.com/ysenkun/3871e58d189f2dd0da66927b4c66076c#file-dockerfile)に置かれているDockerfileをダウンロードするコマンドです．
```bash
$ wget https://gist.githubusercontent.com/ysenkun/3871e58d189f2dd0da66927b4c66076c/raw/13d5849beabbbadeb8f4755ba74091be4653909a/Dockerfile
```

ダウンロードしたDockerfileを用いてbuildします.
`{image_name}_`は適宜変更をしてください．
```bash
$ docker build -f ./Dockerfile -t {image_name} .
```

最後にdocker runをすれば，コンテナの完成です．
`{hostname}`, `{container_name}`, `{image_name}_`は適宜変更してください．
また，すでに13389のポートを使用している場合も13388など適宜変更してください．
```bash
$ docker run -itd --privileged -p 13389:3389 --hostname {hostname} --name {container_name} {image_name} /sbin/init
```

# Microsoft Remote Desktopで接続

Microsoft Remote Desktopを用いてDocker上のUbuntuに接続していきます．
使用しているRmeote PCのIPと先ほど設定したport番号を指定し，追加することで接続が出来るようになります．

<img width="200" alt="Screen Shot 2022-10-31 at 3.14.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744789/7f72b20f-413f-71d6-01dd-e8d3ba43a67f.png">

<img width="400" alt="Screen Shot 2022-10-31 at 3.08.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744789/908f7158-b241-691b-2b7c-ab48585c6e33.png">

# 動作結果
それでは，実際に接続した様子を見ていきます．
接続後，少し時間が経つとWelcomeメッセージが表示されます．
![first.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744789/2db5f9e4-90cf-fbf7-ffc1-ca5df4e9346a.gif)

Terminalを開いてみると，bashが動いていないのでbashと入力し実行することで，以下のように表示されるようになります．
![terminal.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744789/ae65fada-fa6e-180f-1e06-cfa7ff9043fc.gif)
以上で一通り終了です！！！

# 補足
terminalを新しく開く度にbashを打つのが嫌な方は，下の図のように Terminal => Preferencesを開き，チェックを入れてCustom Commandにbashと入力してください．
設定が完了すると以降から，新しくterminalを開いてもbashが動くようになります．
<img width="400" alt="Screen Shot 2022-10-31 at 13.41.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744789/dc144f08-a324-9aca-aecb-695b558a7fd3.png">

# さいごに

今回は，Dockerで立てたUbuntuにRDP接続を行いました．
次回は，さらにCUDAの設定を加えて，GPUを使えるようにしていきたいと思います．
ワンライナーの配列の作り方

# 概要
筆者は、`JavaScript`でワンライナーの配列を作りたいなーと思うことがあります。
そんな時に、よくやる間違いをしてあれ？となることがあるので備忘録として残しておきます。

# サンプル1
スプレッド構文を使って`Array`の`empty`要素に対して`undefinde`を埋める方法
```javascript
[...Array(3)].map((_,index)=>index))
//expected [0, 1, 2]
```

# サンプル2
[Array.prototype.fill](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/fill)などを(keys())使って`empty`に対して`undefinde`など埋め直してあげる方法
```javascript
Array(3).fill().map((_,index)=>index))
//expected [0, 1, 2]
```
# よくやる間違い
`Array(3)`で作った`empty`要素に対して`Array.prototype.map`をすると`empty`要素は無視されるので各種要素に対して処理をすることができない。
```javascript
Array(3).map((_,index)=>index))
//expected [empty, empty, empty]
```

# 終わりに
実は、よくある間違いで挙げた書き方を`React`のコンポーネントに対して行ってしまい何も描画されない状況に陥った。

```typescript
const OneLinerList: FC<Props> = () => {
  return (
    <>
      {[...Array(2)].map((_, index) => {
        return <li key={index}>リスト {index}</li>
      })}
    </>
  )
}
```
nodejsで何も読み込んでないのにMODULE_NOT_FOUNDするときの対処法

先日から事情があってWSLが使えなくなったのでウィンドウズ側でNode.jsを触っていました。
とりあえずコンソールでハローワールドしようと思ったら、以下のエラーが

```    at Module._resolveFilename (node:internal/modules/cjs/loader:995:15)
    at Module._load (node:internal/modules/cjs/loader:841:27)
    at Function.executeUserEntryPoint [as runMain]    at node:internal/main/run_main_module:23:47 { 
  code: 'MODULE_NOT_FOUND',
  requireStack: []
}
```

調べてみたところ、C:\Users\\{ユーザ名}\OneDrive以下のjsファイルにNode.jsを実行するとエラーが出るらしい。OneDrive下のマイドキュメントにスクリプトを置いていたので、C:\Users\\{ユーザ名}\Documentsに移動したところ問題なく動きました。
（そもそもなんでドキュメントフォルダが二つあるんですかね...）

参考: https://stackoverflow.com/questions/72772684/module-not-found-nodejs
VSCodeでPHPのprettierを設定する方法

Run on saveなどいろいろ試したんですが機能しなかったので
シンプルにnpmモジュールをインストールする方法でいけました。

プロジェクト配下のpackage.jsonに下記を記載
```package.json
{
  "devDependencies": {
    "@prettier/plugin-php": "*",
    "prettier": "*"
  }
}
```
プロジェクト配下のディレクトリでnpm installを実行

VSCodeの設定で「Editor: Format On Save」をon
VSCodeを再起動でprettierは有効になってます。(htmlを含むphpファイルは効かないようです)

なお、VSCodeの拡張機能の方のprettierは使わないため
その設定Editor: Default Formatterは「なし」のままです。
Reactの「create-react-app」での手順（覚書）

公式ドキュメントはnpmでの作り方が載っています。
でも、私はyarnで管理する方が安定しました。
下の方にyarnでの作り方を書いてます。

## npmの場合
```
npx create-react-app プロジェクト名
cd プロジェクト名
npm start
```

1行目：Reactアプリを作成するフォルダの指定
2行目：フォルダ移動(パッケージ管理npmは自動でインストールされている）
3行目：ローカルサーバーを立ち上げ

>「npm start」から抜け出すのは、「Ctl + c」

```
npm install -g npm
npm init
```
npmを最新アップデートしておく

```
npm install --save react-modal @types/react-modal
npm i axios
npm install react-icons
npm install react-scroll
npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p
```
コンポーネント類インストール


##### ▶デプロイ（サーバーにアップロード）する前

```
npm run build
npm run deploy
```
1.ソースコードを表示用に吐き出す
2.指定のURL(package.json内)にデプロイする

## yarnの場合

```
yarn create react-app プロジェクト名
//ts
yarn create react-app --template typescript
```
1.javascript
2.Typescript

```
yarn upgrade
```
yarnを最新アップデートしておく

##### ▶yarnをグローバルインストしておく方法
```
yarn add -g create-react-app
//js
create-react-app プロジェクト名
//ts
create-react-app プロジェクト名 --template typescript
cd プロジェクト名
yarn start
```
1.yarnをグローバルインスト
2.jsで作成の場合（2でやる場合は3はしない）
3.tsで作成の場合（3でやる場合は2はしない）
4.フォルダ移動
5.ローカルサーバーを立ち上げ

```
yarn add パッケージ名
```
パッケージインスト

## package.jsonの中

https://classic.yarnpkg.com/lang/en/docs/package-json/
数字+文字列データの文字を削除して数値データにするには

# 実現したいこと

サンプルが100以上あるデータの中に年数を表す変数があります。
term
3 years
4 years
5 years
6 yeras
.
.
.
20 years
となっています。yearsを削除して数値データに置き換えたい。


# やってみたこと
Googleで検索して、次のコードを見つけました。実行すると2020で返ってきます。
```python
import re
s = "2020年"
result = re.sub(r"\D", "", s)
print(result)
```

これを応用して、次のコードを実行しました。

```python
import re
s = df_train["term"]
result = re.sub(r"\D", "", s)
print(result)
```
ですが・・・

```
TypeError: expected string or bytes-like object
```
エラーになってしまいました・・・。

# 正しいコード
投稿サイトで質問を投げてかけて、次のアドバイスをいただきました。

```python
import pandas as pd
df['term'] = df['term'].str.extract('^(\d+)').astype(int)
```
(\d+)が数字を意味するそうです。
Rails&Docker&Reactの導入個人用メモ

## Dockerコンテナへの入り方
```bash
docker-compose exec web bash
```
今回は`web`になってるところがデータベースの名前。ここを変更して入るコンテナを選ぶ。（`docker-compose.yml`で指定している名前）

## テーブル作成
```bash
rails g model Users 
```
モデル名の最初は大文字
これでマイグレーションファイルが`/db/migate`に作成される。
これを適当に編集。
その後さらにコマンドを実行。
```bash
rails db:migrate
```
これで多分いける。その後、実際にできてるかはdbに入って確認するか、dbのスキーマのバージョン確認すればいいと思う。

## スキーマのバージョン確認
```bash
rails db:version
```

## dbに接続してテーブルの中身がどうなってるかの確認
~~~bash
$ docker-compose exec db bash 
bash-4.2# mysql -u root -p
Enter password:(ここはdocker-compose.ymlで指定したパスワードを入力)

mysql>show databases;
myspl>use db_name;
mysql>show tables;
mysql>desc table_name;
~~~
ここまで打つとそのテーブルの設計が表示されるはず。
`db_name`と`table_name`は任意の名前。

## rails consoleでのコマンド
```ruby
post = Post.new(content: "aaaa")
post.save
```





# 参考
https://railsdoc.com/page/rails_db_migrate

https://qiita.com/Yusuke_Hoirta/items/3a50d066af3bafbb8641

https://zenn.dev/ryouzi/articles/a4fdff3c18e32a

https://qiita.com/CyberMergina/items/f889519e6be19c46f5f4#%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E8%A8%AD%E8%A8%88%E3%81%AE%E7%A2%BA%E8%AA%8D

https://yumanoblog.com/rails-migrationfile/
NestJS　Pipe


## Pipeとは

Pipeは、ハンドラーがリクエストを受け取る前にリクエストに対して処理を行います。

- リクエストに対してバリデーションを行う
- リクエストに対してデータの変換を行う
- リクエストに対して認証を行う
- 例外を返す

## NestJSの組み込みPipe

NestJSには、組み込みのPipeが用意されています。

|Pipe|説明|
|:--|:--|
|ValidationPipe|リクエストに対してバリデーションを行う|
|ParseIntPipe|リクエストのパラメータを数値に変換する|
|ParseFloatPipe|リクエストのパラメータを浮動小数点に変換する|
|ParseBoolPipe|リクエストのパラメータを真偽値に変換する|
|ParseArrayPipe|リクエストのパラメータを配列に変換する|
|ParseUUIDPipe|リクエストのパラメータをUUIDに変換する|
|ParseEnumPipe|リクエストのパラメータを列挙型に変換する|
|DefaultValuePipe|リクエストのパラメータのデフォルト値を設定する|
|ParseFilePipe|リクエストのファイルをパースする|

## Pipeを適用する

Pipeを適用するには、パイプを適用したいハンドラーの引数に`@UsePipes`デコレータを付与します。

```typescript
@Get(':id')
@UsePipes(new ParseIntPipe())
findOne(@Param('id') id: number) {
  return this.catsService.findOne(id);
}
```

### Pipeをパラメータに適応する

@Paramの引数にパイプを適用することもできます。

```ts
@Get(':id')
findOne(@Param('id', new ParseIntPipe()) id: number) {
  return this.catsService.findOne(id);
}
```

### Pipeをグローバルに適用する

main.tsでアプリケーション全体にPipeを適応することができます。

```ts
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(new ValidationPipe());
  await app.listen(3000);
}
bootstrap();
```

## 参考

https://docs.nestjs.com/pipes
NestJS　ビルトインのException一覧

## ビルトインのException一覧

|Exception|説明|対応するHTTPステータス|
|:--|:--|:--|
|BadRequestException|リクエストが不正|400|
|UnauthorizedException|認証が必要|401|
|NotFoundException|リソースが見つからない|404|
|ForbiddenException|アクセスが許可されていない|403|
|NotAcceptableException|リクエストで指定されたAcceptヘッダーの値がサポートされていない|406|
|RequestTimeoutException|リクエストがタイムアウト|408|
|ConflictException|リクエストが競合している|409|
|GoneException|リソースが存在しない|410|
|HttpVersionNotSupportedException|リクエストで指定されたHTTPバージョンがサポートされていない|505|
|PayloadTooLargeException|リクエストのペイロードが大きすぎる|413|
|UnsupportedMediaTypeException|リクエストで指定されたContent-Type/Content-Encodingヘッダーの値がサポートされていない|415|
|UnprocessableEntityException|リクエストが処理できない|422|
|InternalServerErrorException|サーバー内部でエラーが発生した|500|
|NotImplementedException|リクエストされた機能は実装されていない|501|
|ImATeapotException|ティーポットだよ(ジョークステータス)|418|
|MethodNotAllowedException|リクエストで指定されたメソッドがサポートされていない|405|
|BadGatewayException|リクエストが不正|502|
|ServiceUnavailableException|サービスが利用できない|503|
|GatewayTimeoutException|ゲートウェイがタイムアウト|504|
|PreconditionFailedException|リクエストの前提条件が満たされていない|412|

## 参考

https://docs.nestjs.com/exception-filters
AI画像生成技術とVRとの関連


## 初めに
最近話題となっているAI画像生成により、人がイラストが描くという作業にもついに次世代の波が普遍的に感じられるようになってきました。

その中でVRで使用するアバターなどのオブジェクト類にもイラストだったりオブジェクト自体の作成などクリエイターの技術によって支えられているものが多くあります。
もしかしてAIでオブジェクトを作成しました！などの技術があるのではないかと考え調べてみたら面白い記事が見つかりました。

## AIによる写真チックな360°パノラマ画像の作成
[Zero-Shot Text-Driven HDR Panorama Generation](https://frozenburning.github.io/projects/text2light/)

上記のものはシンガポールの南洋理工大学(Nanyang Technological University)の論文です。

この論文では3Dシーンのフォトリアル照明や360度反射の情報を持ったHDIR画像の撮影が一般には難しい事を問題としています。そしてその解決として素人でも直感的に操作でき汎用性のある生成モデルが必要であると説いています。

その後説明されるText2Lightはシーンの説明となる自由形式のテキストを与えると4K以上の解像度の HDIR(High Dynamic Range Images)[^1] 画像を作成できるというものです。

[^1]:HDR(High Dynamic Range)技術で生成された画像イメージ。明るさの違う複数の写真、例えば白飛びや黒つぶれ等様々な写真の露出を合成することで適切な露出で撮影された写真を生成することができる。

![スクリーンショット 2022-10-31 113441.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524398/bf262fc2-f7de-f409-1c05-a485eecac2e3.png)

DeepLでの翻訳ですが、
photo of orange chairs(オレンジチェアの写真), brown wooden chairs inside cathedral(大聖堂の中の茶色の木の椅子)
といった風に入力した文字列に応じてこのような画像を生成するようです。

>![スクリーンショット 2022-10-31 113754.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524398/96754923-4ef4-6ceb-1e4e-e471dab3aa4e.png)
サイトのサンプルをクリックすると、生成された画像を用いて作成したと思われる360度回転するサンプルもありました。

このようにイラストをAIにて生成する技術だけでなく、HDRパノラマ画像もAIによって生成する技術が発達してきていることを知れました。
実際の論文や、[githubへのリンク](https://github.com/FrozenBurning/Text2Light)なども上記に掲載したリンクにありますので気になった方々は一読してみてください。

>![スクリーンショット 2022-10-31 122415.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524398/2604e1d7-221a-7c04-9a8a-8d23bb97c3cd.png)
論文で記載されているText2Lightの概要


## まとめ
普段このような360°の光源までくっきりした画像は全天体カメラや複数の写真をツールによって合成する等で作成され、
手間のかかるものが多いといった認識です。

このような技術の進歩はSociety5.0で実現されるAIにより必要な情報が必要な時に提供される社会に強く結びついていると思います。
ゆくゆくはSFチックなフォトリアリスティック画像が生成され、魔王城のようなデザインの部屋を作成したい！
といった要望などにも応えられていくのでしょうか？楽しみです。

## 参考文献
[Text2Light: Zero-Shot Text-Driven HDR Panorama Generation](https://frozenburning.github.io/projects/text2light/)
[論文本体](https://frozenburning.github.io/data/text2light_cr.pdf)
[Text2Light Github](https://github.com/FrozenBurning/Text2Light)
Excel Power Query で行数が勝手に倍増する

# Power Query内で勝手に行数が倍増する
タイトルの通りなのですが、なぜか勝手に倍増してしまいます。
## Query のマージのせいではない
の結合方式をミスると行数が倍増してしまうのは周知の事実なのですが。。。
https://hamachan.info/excel2019-powerquery-kyotu/
https://modernexcel7.hatenablog.com/entry/merge_query_type

## Filter を掛けると倍増する
今回のケースは、Query の Step 内で Filter を掛けると発生してしまいます。
元々 207 行だったものが↓↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573860/b87a8448-26a4-e964-74bb-fdbda5b8dec1.png)


Filter を掛けて、null を取り除くと、386行に倍増 (null 行が取り除かれ、<>null 行がそのまま二倍に増えた)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573860/ac4f4bfe-6387-bfbf-858a-976c677f5e80.png)

今のところ理由がわかりません。参考になる投稿もない状況です。
## ひとまずの解決策
Serial Number や ID から重複したデータを取り除くことで一旦はデータの整理は出来ますが、本来であれば不要なStep を挟むことになるのであまりスマートなやり方では無い気がします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573860/944a2043-2e86-39a5-860d-4556c6398093.png)
Salesforce関連職種の年収調査してみた

こんにちは

Salesforce関連業務に興味がある人、結構多いかと思います

Salesforceシステム管理者やSalesforce開発者の年収など、どれくらいか気になりますよね。

今回の内容は動画でも公開しています

https://www.youtube.com/watch?v=AFkbri6I60o

<iframe width="560" height="315" src="https://www.youtube.com/embed/AFkbri6I60o" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


さて、実はSalesforceでは公式的に職種ごとに年収がいくらか公表されています

https://trailhead.salesforce.com/en/career-path

しかしながら、こちらのデータはすべてアメリカ（US）でのデータなので日本で働く人にとっては参考にならないかもしれないですね

残念ながら現在は公式的にSalesforce業務の年収がSalesfroceから公開されていることはないようです

そこで、Salesforceのパートナー企業であるComputer Futuresが作成した「IT給与調査2022」からSalesfroce分野に関する内容だけ抜き出しましたので共有します

もっと知りたい方は
詳細はこちらのComputer Futuresが作成した「IT給与調査2022」をご確認ください


https://www.computerfutures.com/ja-jp/landing-pages/it-salary-survey-2022/



いかがでしたでしょうか
今回の内容がすこしでもお役にたてれば嬉しいです

他にもSalesforceに関して「こんな内容が知りたい」ということがございさましたらコメントお待ちしております。
MSYS2 64bit(Mingw64)上のvimでホームの.vimrcを編集したらハマったので共有

# はじめに

本ドキュメントは、WindowsのMSYS2 64bitでvimを使おうとしたときの設定を書いていきます。

# 当方の環境

```
OS: Windows10 64bit
Terminal: bash(MingW64 + MSYS2 64bit)
Package manager: pacman
Editor: VSCode + vim
vimの知識: 浅はか
```

# 最初に結論(せっかちな人向け)

$HOME/.vimrcの先頭に以下の行を追加します。

```vimscript
source $VIMRUNTIME/defaults.vim
```

# 事の経緯

MSYS2のBASHをVSCodeのターミナルで実行しているのですが、ちょっとしたテキストファイルを修正するときはVSCodeでは、いささか重たく感じていました。
そこで、小さいファイルを編集するときには`vim`を使おうと思い立ちました。

```bash
pacman -S vim
```

[参考:pacmanコマンドの説明](https://www.asobou.co.jp/blog/web/msys2)

# リソースファイルの編集で詰まった

`bash`のホームディレクトリに`.vimrc`を作っておいていざ実行してみると、`.vimrc`が無かったときに表示されていた色分けなどがごっそり消えていたわけで。

ちょっとドキュメントを読んでみると、ホーム上のリソースファイルを読み込んでしまうと他のファイルの取り込みを取りやめてしまうと。
`bash`でいう`source`で既存のリソースファイルを取り込む必要があると。なるほど。

[参考:vimrc, runtime の優先順位を理解して Windows と Linux で Vim の設定を共有する](https://teppeis.hatenablog.com/entry/20080705/1215262928)

さて、肝心の詰まったところですが…

**その既存リソースファイルがどこにあるのかわからない**

ということでした。そこから、ファイル探しの旅に出ます。

# 読み込むべきリソースファイルの位置を探し当てる

ファイルの場所をわかるには、このコマンドが役に立ちます。

```bash
vim --version
```

すると、標準で読み込むリソースファイルの一覧が出てきます。
(余計な情報は省略しています）

```bash
$ vim --version
(略)
      システム vimrc: "/etc/vimrc"
      ユーザー vimrc: "$HOME/.vimrc"
   第2ユーザー vimrc: "~/.vim/vimrc"
       ユーザー exrc: "$HOME/.exrc"
  デフォルトファイル: "$VIMRUNTIME/defaults.vim"
       省略時の $VIM: "/etc"
省略時の $VIMRUNTIME: "/usr/share/vim/vim82"
(略)
```

さて、本当に重要なのは以下のものと考えていました。

```
      システム vimrc: "/etc/vimrc"
```

ここにあるリソースファイルを読み込みさえすればなんとかなるだろうと思っていて`ls`コマンドでファイルを確認してみると…

**無い**

ハタと困ってしまいました。読んできたドキュメントのセオリーに倣えば、そこにファイルがないとおかしいと考えてしまいました。
完全に先入観でした。はい。

で、もう一度先入観を捨てて、`--version`の内容を確認すると、「デフォルトファイル」なるものを見つけました。

```bash
  デフォルトファイル: "$VIMRUNTIME/defaults.vim"
```

もしかしてこれか？　と`ls`コマンド追っかけると…ありました。

ファイルの中身を確認するとそれらしき設定が見えています。

そこで、`.vimrc`ファイルの先頭に以下の文言を追加すると、無事にこれまでの色分けなどが復活しました。

```vimscript
source $VIMRUNTIME/defaults.vim
```

ああ、疲れた！

# 最後に

プログラムのアウトプットは情報の宝庫です。
でも、先入観を持ってしまうとなかなか「本当に欲しい情報」に出会えないということです、はい。
アルゴリズム実技検定(PAST) 第11回 E問題 Python解答例(二分探索)

SupershipでVPoEしている名畑です。

「[アルゴリズム実技検定(PAST)について 並びに 第11回A〜C問題 Python解答例](https://qiita.com/nabata/items/0421f20e8ec849ee70ad)」と「[アルゴリズム実技検定(PAST) 第11回 D問題 Python解答例(Union-Find使用と不使用)](https://qiita.com/nabata/items/013c2fed8386967daa3f)」の続きとして、アルゴリズム実技検定(PAST)第11回のE問題の私の解答例(Python3)を公開します。

## 第11回の過去問題全部

- [第11回](https://atcoder.jp/contests/past202206-open)


## 第11回 E問題 変わった数列(7点)

### 問題

- [E - 変わった数列](https://atcoder.jp/contests/past202206-open/tasks/past202206_e)

### 私の言語

- Python (3.8.2)

### 解答例

まず、この「変わった数列」がどんなものかイメージしやすくするため、iが1〜5のときの諸々を箇条書きにしてみます。

- i = 1
	- 末尾に追加される数列 (1)
	- 項数 1
	- ここまでの累計項数 1
- i = 2
	- 末尾に追加される数列 (2, 1, 2)
	- 項数 3
	- ここまでの累計項数 4
- i = 3
	- 末尾に追加される数列 (3, 2, 1, 2, 3)
	- 項数 5
	- ここまでの累計項数 9
- i = 4
	- 末尾に追加される数列 (4, 3, 2, 1, 2, 3, 4)
	- 項数 7
	- ここまでの累計項数 16
- i = 5
	- 末尾に追加される数列 (5, 4, 3, 2, 1, 2, 3, 4, 5)
	- 項数 9
	- ここまでの累計項数 25 

これを見ると、i^2がそこまでの累計の項数だとわかります（等差数列の公式から求められる)。

また、末尾に追加される数列の値は中心が1、両端がiであることもわかります。つまり末尾に追加される数列の各項の値は、追加される数列の中央からの距離と比例します。

なので、N項の値は

- N項はiがいくつのときに登場するか
- N項は求められたiで追加される数列の中でどこに位置するか

で求められます。

```
N = int(input())

# 累計桁数がNに近いiを見つけるために二分探索
i = 1
low = 1
high = 10 ** 100  # iの最大値が10^100のため
while i > 0:
    i = (low + high) // 2
    digit = i ** 2  # 累計の項数
    if digit < N:
        if low == i:
            break
        low = i
    else:
        if high == i:
            break
        high = i

# 項数に1を足す
if i ** 2 < N:
    i += 1

num = N - (i - 1) ** 2  # iで追加される数列中の何番目にNがあるか
group_diff = abs(num - i)  # 中心からの距離
print(group_diff + 1)
```

二分探索についてはネット上にたくさん情報ありますので、もしも初見の場合は調べてみていただければと思います。

## 最後に宣伝

[SupershipのQiita Organization](https://qiita.com/organizations/supership-inc)を合わせてご覧いただけますと嬉しいです。他のメンバーの記事も多数あります。

Supershipではプロダクト開発やサービス開発に関わる方を絶賛募集しております。
興味がある方は[Supership株式会社 採用サイト](https://supership.jp/recruit/)よりご確認ください。

是非ともよろしくお願いいたします。
pipをインストールする（mac）

# この記事は
pipをインストールした際のメモ書きです。
公式のインストール手順は[こちら](https://pip.pypa.io/en/stable/installation/)です。
上記の公式手順によれば、`get-pip.py`と`ensurepip`の2つの方法がある様ですが、本記事では`get-pip.py`を用いた方法を示します。（というか`ensurepip`はうまくいかなかった）

# 手順
## 1. get-pip.pyをダウンロード
以下のコマンドを実行するとカレントディレクトリに`get-pip.py`がダウンロードされます。
```shell
# get-pip.pyのダウンロード
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
```

## 2. get-pip.pyを実行
```shell
$ python3 get-pip.py
```
以下の様なワーニングが出た場合は、メッセージ通りPATHが通っていないことを示しているので、使用しているシェルに応じて修正をします。（[参考](https://qiita.com/nbkn/items/01a11392921119fa0153)）
```
Installing collected packages: pip
  WARNING: The scripts pip, pip3, pip3.10 and pip3.8 are installed in '/Users/username/Library/Python/3.8/bin' which is not on PATH.
```

## 3. インストールの確認
最後に、`which`コマンドを使用して`pip`の場所が出力されれば完了です。
```
$ which pip
/Users/username/Library/Python/3.8/bin/pip

```
[OCI]Autonomous Database：マルチクラウド関連記事まとめ

自分で書いたAutonomous Databaseのマルチクラウド関連記事のまとめです。

# Autonomous DatabaseとAzure OpenAI Serviceとの連携（データベース・リンク）

https://qiita.com/500InternalServerError/items/e3934a84bea97feecf29

# Autonomous DatabaseとCloud DBとの連携（データベース・リンク）

**＜Amazon RDS for Oracle＞**

https://qiita.com/500InternalServerError/items/c2d5734ec01a1176500f

https://qiita.com/500InternalServerError/items/7365c7b6d64f35c51744

**＜Amazon RDS for MySQL＞**

https://qiita.com/500InternalServerError/items/7029d76d96009b0441f9

**＜Amazon RDS for PostgreSQL＞**

https://qiita.com/500InternalServerError/items/c6a85703c3e6454de2c0

**＜Amazon Aurora MySQL＞**

https://qiita.com/500InternalServerError/items/ee932f89824de74ba6f1

**＜Amazon Aurora PostgreSQL＞**

https://qiita.com/500InternalServerError/items/65ce1191ae5efcd7a127

**＜Amazon Redshift＞**

https://qiita.com/500InternalServerError/items/d6faad7bbadf3697ee76

**＜Azure SQL Database＞**

https://qiita.com/500InternalServerError/items/f8c7a6d12fecc9584acc

**＜MongoDB Atlas＞**

https://qiita.com/500InternalServerError/items/608830c29d98015d7ce8

# Autonomous DatabaseとCloud Storageとの連携
**＜Amazon S3＞**

https://qiita.com/500InternalServerError/items/bf5917270c1291a3558f

https://qiita.com/500InternalServerError/items/e791ae5e35ab5317f56d

https://qiita.com/500InternalServerError/items/7ab03cc1760bbb7d18b4

**＜Azure Blob Storage＞**

https://qiita.com/500InternalServerError/items/d4c0a3b1f8a9025b5403

**＜Google Cloud Storage＞**

https://qiita.com/500InternalServerError/items/90168b9d1b79be497fba

**＜クラウド・ストレージ内のファイル一括操作（コピー、移動、削除等）、クラウドストレージ間でのファイルの一括操作（コピー、移動）＞**

https://qiita.com/500InternalServerError/items/28bf9492703d96b86e8a

# Autonomous Databaseとデータ・カタログとの連携
**＜AWS Glue＞**

https://qiita.com/500InternalServerError/items/4de78f1c300a2e03a753

# Autonomous DatabaseとFaaSとの連携
**＜AWS Lambda＞**

https://qiita.com/500InternalServerError/items/d8c79b9bf2cc3435613e

**＜Azure Functions＞**

https://qiita.com/500InternalServerError/items/962269f635c26b4015b2

# Vaultシークレットを使用したクレデンシャルの作成
**＜AWS Secrets Manager＞**

https://qiita.com/500InternalServerError/items/913797575a446f9be00e

**＜Azure Key Vault＞**

https://qiita.com/500InternalServerError/items/f1242c1af315fd6a719e

**＜Google Cloud Secret Manager＞**

https://qiita.com/500InternalServerError/items/d84d30868e5e7b6d30bf

# Autonomous DatabaseとCloud Serviceとの連携
**＜Power BI＞**

https://qiita.com/500InternalServerError/items/4861f8efccd84eb41da8

# Autonomous DatabaseとAzure Active Directoryとの連携
**＜DBユーザ認証（SQL*Plus）＞**

https://qiita.com/500InternalServerError/items/a2e8debe2da8d7c17ac5

**＜APEXユーザ認証＞**

https://qiita.com/500InternalServerError/items/0b62a14bf2bbee544230
NTLiteが使いやすくなっていた (windows 10/11 ISO軽量化ツール)

## テンプレート

* 推奨されません を選択。

![template.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/abf15f7e-9bd6-e69c-b307-9bbe7e0cc2a4.png)

### 消したくない機能にチェックを入れる。


IME

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/f0c1e1ec-5882-8e8c-20a1-a8aad467c240.png)


RDO

![0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/23aa87e8-77f8-6d46-122d-c1f45df6a411.png)


telnetクライアント

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/07c01d82-acc3-7b55-bc87-6280cd6ae8f2.png)

リモートデスクトップ接続中にファイルのコピーができるように

![スクリーンショット 2022-10-31 171919.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/68ec1c6c-fd6f-1baa-a6d2-f6294ee7f46a.png)



## しあがり


![aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/9ebedaad-ec18-3899-cad4-053cc0656822.png)
pointpillars論文調査

# pointpillars論文
- **Abstract**
    - 3Dの点群から物体検出を行うというタスク(自動運転などで用いる)
    - 最近の文献では２種類のエンコーダが提案されている
        - 固定的なエンコーダ
           <br>→高速だが、比例して精度が劣る
        - データから学習するエンコーダ
        <br>→精度は高いが、速度が遅い
    - この論文では、pointpillarsという手法を提案
        <br>→ PointNetsと呼ばれるネットワーク構造を使用して、点群を縦の柱(pillar)の集合体にみたてる新しいエンコーダの考え方
    - 速度と精度ともに従来のエンコーダを大きく上回る
    - LIDAR点群のみ使ったアルゴリズムだが、フュージョンアルゴリズムと比べても良い性能が出る
    - 加えて動作が早く、KITTIベンチマーク（３D,bird's Eye view)を６２Hzと、従来に比べて2～4倍の実行時間向上を実現している
    - さらに、高速版は105Hzで最新技術と同等となる
    - 点群中のオブジェクト検出に適した手法だといえる
        <br> 下図は従来手法と比較した図(PPがpointpillars)
     ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259691/07b9b7e6-401d-5f91-26bc-ac93aababcf9.png)
    - DeepLearningの技術が３D点群を処理する方法は過去に考えられてきた。
    - 点群から物体検出する過去の論文に共通する点
        - 点群は疎な表現であるのに対し、画像は密な表現であること
        - 点群は3次元であるのに対し、画像は2次元であること
    - 点群を２Dに見立てる研究は過去にもされており、下記のような種類がある
        - 点群を鳥瞰視点に変換して物体検出するもの
        - 点群を主観視点に変換して物体検出するもの
        - 最近では鳥瞰視点を用いたものが流行っている
    - 長所：サイズがはっきりわかる、近傍ではオクルージョンが少ない
    - 短所：非常に点がスパースであるため、単純にCNNに入れるのではうまくいかない
    - 上記の短所を解決するために、VoxelNetやPointNetという手法があるが、処理速度が非常に遅いのが問題点であった。
    - その問題点を解決するために、PointPillarsを提案する。
    - pointpillarsの特徴：２D convolution layerを用いたend2end 3D物体検出、２Dベースのため計算が高速。点群を縦柱（pillar)に見立てて３Dで物体の検出をする。pillarで扱うことによりvoxelのように点群の高さを区切るビンの高さ設定が不要になった
- **PointPillars**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259691/a90a859b-9361-813f-19a6-10abae41d5ca.png)

    - 入力：３D点群
    - 出力：３Dバウンディングボックス（車、歩行者...）
    - Pillar Feature Net: 点群をスパースなpseudo imageに変換
        - l:点群の中の点
        - x,y,z,r: 点に付随する位置と、反射強度の値
        - xy平面上をpillar, Pで分割する。
        - pillar内の点は計算により9次元の値を持つ、tensor sizeは、size(D,P,N)となる
        - D x P x N = 単点が保有する次元数（9次元) x 点の存在するpillarの数 x pillarに存在する点の数
        - (D, P, N) tensorをPointNetにかけて（Linear layer→Batch-Norm→ReLu)、(C, P, N) tensorを取得
        - Cを取得した後、（C,H,W)のpseudo-imageに変換する（H,W）は鳥瞰視点でみたサイズ
        - (C,H,W)にすることで、通常の色画像と似た扱いが可能になる。
    - Backbone (2D CNN): pseudo imageをハイレベル特徴量へ変換(以下の二つのネットワークで構成)
        - top-down network: 段階的に次元数を下げていき、各段階で特徴抽出する。
        - second network: top-downの各段階の特徴量のupsampling, concatenationを行う
        <br>→（C,H,W）のpsuedo画像を、(6C, H/2, W/2)のtensorに変換する
    - Detection Head(SSD): 検出と３Dボックスへの回帰を行う
        - single shot detectorを使用
        - SSDのprior boxと、真値2D BoxのIoUを使用してマッチング
        - マッチング結果から、クラス分類、物体の位置と高さを推論
BatchNormalizationとDropoutの併用について

# BatchNormalizationとDropoutの併用について

- 下図よりBatchNormalizationとDropoutを併用することで、学習速度が低下するものの、過学習が抑制できることがわかる。<br>また、過学習を抑制することができた結果として、最も低いlossを獲得できている。
- しかし、併用する場合は順序に注意する必要がある。
<br>
<div style="text-align: center;">
    <img src="/attachment/626a6179ece6fa80e1a1f2fa" width="100%">
     
図1:cifar10でのlossとaccuracy
</div><br>

- [論文](https://arxiv.org/abs/1801.05134)ではBatchNormalizationとDropoutを併用した場合の性能低下に関する考察が行われており、BatchNormalizationの前にDropoutを入れることは非推奨となっている。
しかし、FC層の前のみにDropoutを使用することで性能が改善することを示している。

- よって、BatchNormalizationと併用する場合は、DropoutはFCの前のみに適用するのが望ましい。



 <br><br>
>  参考サイト
> 
> https://atmarkit.itmedia.co.jp/ait/articles/2003/11/news016.html
Auto Encoder(オートエンコーダー)について

# Auto Encoder(オートエンコーダー)について
- **Auto Encoder（自己符号化器）**
    -  入力データを圧縮し（次元削減,特徴抽出）そこから再度入力データを復元するようなニューラルネットワーク
    -  重要度の高い情報を洗い出し、それ以外の部分を削ぎ落とす
<div style="text-align: center;">
    <img src="/attachment/62691868ece6fa80e19ed1bd" width="60%">     
    
   出典：[https://qiita.com/LicaOka/items/1f4d1131af05fe30674e]
</div>


- **Auto Encodeの効果**
    -  勾配消失を解決する
    <br>ニューラルネットワークの初期値に、オートエンコーダで学習させたものを用い事前学習を行うことで、勾配消失(層を多くすることで誤差逆伝播に必要な勾配が消える)による学習速度低下を防止する
    -  過学習を解決する
    <br>オートエンコーダによりデータを粗な状態にすることで、過学習を防止する

※オートエンコーダーは事前学習（Pre Training）として次元の削減に使われていたが、最近はCNN（畳み込みニューラルネットワーク）やRNN（リカレントニューラルネットワーク）のように、それぞれのアルゴリズムの中に次元削減処理が含まれているので事前学習として使われることはなくなった。
- **Auto Encodeの事前学習**
    1. ネットワークを構築する多層構造を、複数の単層に分割
    2. 分割する前の構造を想定し、入力層から順に教師なし学習を行う
    3. ２で得た訓練用隠れ層の値を入力値として、すべての隠れ層で訓練を繰り返す
    4. 学習させた層で元のネットワークに戻す

- **Auto Encodeの活用事例**
    - 画像のノイズ除去
    <br>入力値としてノイズを混ぜた画像、正解として元の画像を与えて訓練することで、圧縮時にノイズを除去できる
    - 異常検知
    <br>入力値に異常がある場合、入力値と出力値の間に誤差が生じるので、これを異常発生と定義する
    - クラスタリング
    <br>VAE(確率分布的に潜在変数を取得する仕組み)の学習を経たオートエンコーダにデータを入力することで、入力値がどちらのグループに属するのか判別可能




 <br><br>
>  参考サイト
><br> https://it-trend.jp/development_tools/article/32-0024
DropOut(ドロップアウト)の役割

# DropOut(ドロップアウト)の役割
- **ドロップアウト（Dropout）**
    -  ニューラルネットワークの過学習を防ぐために提案されたテクニックで、一定の確率でランダムにニューロンを無視して学習を進める正則化の一種
<div style="text-align: center;">
    <img src="/attachment/62690493ece6fa80e19e6e78" width="60%">
     
図1:softmax関数のグラフ
    
   出典：[https://deepage.net/deep_learning/2016/10/17/deeplearning_dropout.html]
</div>
ノード間が全て繋がったニューラルネットワークを上図のように、学習時には一定の確率で無視する。<br>

こうすると一時的に、ニューロンが活性化しなくなり、重みの更新もバックプロパゲーション時にされなくなる。<br>

訓練時にランダムでニューロンを消去していくことで、毎回異なるニューラルネットワークを学習していることになる。

→　アンサンブル学習と同様の効果があり、複数の独立したニューラルネットワークを学習しているとみなすことができる。

Dropoutは、ただ訓練時にランダムでニューロンを選択していくだけなので、手軽にアンサンブル学習できる。

推論時はドロップアウトせずに、すべてのニューロンを使う。
実際には、各ニューロンのウェイトに𝑞=1−𝑝を掛けてやることで、学習時と近い状態にする。

- **dropout適用時のコツ**
1. 控えめなサイズでニューラルネットワークを構築する
1. 過学習を起こすまでネットワークのサイズを大きくしていく
1. 過学習を起こしたら、入力層にDropout率0.2、隠れ層に0.5を適用する
1. パラメータを微調整
1. テスト時にはDropoutは使わない


 <br><br>
>  参考サイト
>
 https://deepage.net/deep_learning/2016/10/17/deeplearning_dropout.html
Batch normalization(バッチ正規化)の役割

# Batch normalization(バッチ正規化)の役割
- **Batch normalization(バッチ正規化)**
    -  ミニバッチ毎に、平均０分散1になるよう正規化を行う
    <br>→出力が適度に分散され、勾配消失などの問題が起こりにくくなり、ネットワークの学習プロセスを全体的に安定化させて学習速度を高める
    -  ディープラーニングでは、レイヤを何層にも積み重ねるため、パラメータが変わるとそのアウトプットが変わり、レイヤのインプットの分布が大きく変わることがある（Internal Covariate Shift）
    <br>→ミニバッチごとの統計量を使って、ミニバッチごとにに正規化し、解決する
    - 毎回違うバッチごとの平均・分散で正規化するため、ノイズを生み、ネットワークを汎化させる正則化の効果がある<br>→[ドロップアウト](/user/issei.fukuhara/kensyu/task1/dropout)の必要性を減らせる
    - 推論時は学習時とは違い、バッチ毎の平均ではなく、学習データのバッチ毎の平均と分散の期待値を使用して、各次元の学習済みパラメータγ、βを用いて変換を行っていく
    - 深めのネットワークを作ったときに、フィルタや重みの演算とバイアスの演算の後、活性化関数の前などに数カ所挟むのが良い

- **Batch normalizationのメリット**
    - 大きな学習係数が使える
    - 正則化効果がある
    - 初期値にそれほど依存しない
    - 学習が安定する。
    - ドロップアウトの必要性を減らすことができる

- **Batch normalizationのデメリット**

    - パラメータが多くなりメモリや演算量が多くなる


 <br><br>
>  参考サイト
>
 https://deepage.net/deep_learning/2016/10/26/batch_normalization.html
【AWS】【Wordpress】EC2＝t2.microでwordpress環境を構築して困った話

## 結論
t2.microでwordpress環境の構築・運用は厳しい

## この記事を書いた理由
ネットでwordpressの環境について調べると、個人ブロガーがt2.microで大丈夫、的な記事が結構あったが、**ちょっと本格的なことをしようとすると全然ダメ**なのでお勧めできない、といいたい

## 経緯
顧客の依頼で、wordpressで記事コンテンツに特化したサイトを作りたいので、環境を構築してほしいと依頼があった。

不動産サービスサイトをうちで構築し提供しているが、それにドメインだけ同じようなものが欲しいとのこと。

不動産サービスサイトがAWS環境のため、同じVPC内で構築した

## 要件

- 不動産サービスサイトと同じドメインを利用（SEO対策＋地続きのサイトとしてエンドユーザーに見せたい）

- 別途既存とは全く違うec2で、wordpress環境
（不動産サービスサイトはlaravel環境）

- テーマは先方で有料のものを購入

- プラグイン＋コンテンツ等は先方でwordpressをいじれる人がいるので、その人が導入、作成

- 構築中に費用が極力掛からないように

→ まず一つec2で構築し、それを本番としてしまう。
　あとから検証系はAMIでコピー作成するよう提案

→トライ＆エラーできるように、2.microで環境を構築（無料枠が残っていたため、それを利用）で合意
　念のため、毎日AMIを取って復元できるようにする。


## 結果

t2.microでは**スペックが足りない**

## 起きた事象

- **.ico**をwp-configの内容を変更してちょっと強引に入れたら、ec2が停止。再起動しても復活せず。**環境が壊れた**のでAMIで復元
- **プラグインのAll in one SEO**を入れたら**処理が重すぎてec2が停止**。再起動しても復活せず。**環境が壊れた**のでAMIで復元

→これで壊れちゃうと、先方でのプラグイン導入、コンテンツ作成が厳しいとのことで、本番のスペック予定であったt3.mediumを利用。その後問題なし

## t3.medium選定理由

要件
- 要件の「費用を抑えて」
- 記事コンテンツのサイトであくまで静的コンテンツ表示のサイトとなる

→vcpuが二つになるt3.mediumで十分かと
（バーストタイプのt系ではなく安定したm系を使うのが一般的のようですが、m系でvcpu2つは費用が倍くらい違うので。静的サイトでそんなにvcpuのクレジット食うことはないだろうと）


## 個人ブログなどでwordpressを利用する際

**t2.microはかなり無理がある**。Lightsailも安いものはt2.microなので、AWSを個人ブログに利用するのはきつい。円安で値段も高騰中。

もったいないですね。
Optimizer(最適化)の種類について

# Optimizer(最適化)の種類について
- **Optimizer(最適化)**
    -  損失関数の最小値(とその時のパラメータ)を求めるアルゴリズム
    -  パラメータの値を変更して、lossの値を出来る限り小さくする
    -  Optimizerが使うことのできる情報は、パラメータの勾配とこれまでにパラメータを動かした記録のみ（関数の中身の構造などは見れない)
    
    <br>
- **SGD（確率的勾配降下法)**
<div style="text-align: center;">
    <img src="/attachment/62692e83ece6fa80e19ef41a" width="60%">
    
</div>

```Python
for i in range(steps):
    parameter = parameter - lr * grad
```

 パラメータを勾配×学習率だけ減らす。
 <br>学習率が小さすぎると学習が全然進まず、大きすぎるとパラメータが最適値を通り過ぎてしまいうまく学習できない
 <br>学習率：一度のパラメータの更新でどのぐらい学習を進めるかを調整する
 <br>
 
SGDはもっとも簡単で基本的なアルゴリズムで、 これ以降に紹介する最適化アルゴリズムは基本的にこれを改良していったもの


- **momentumSGD**
<div style="text-align: center;">
    <img src="/attachment/62692f82ece6fa80e19ef5a5" width="60%">

</div>

```Python
v=0 #gradと同じサイズの行列
for i in range(steps):
    v = v * momentum - lr * grad
    parameter = parameter + v
```
vは速度を表し、momentumSGDでは、速度を勾配×学習率だけ減らす。<br>
momentumは、速度の減衰であり（摩擦のようなもの）、一定の割合で速度を減らしていきます。<br>


速度の概念を導入することで、
何回も勾配が一定の方向を指す（＝最適値はまだ遠い）場合は、パラメータの更新量が大きくなり、
勾配が＋になったりーになったりを繰り返す（＝最適値付近で行ったり来たりしている）場合は、パラメータの更新量が小さくなるという効果があり、SGDと比較してパラメータの振動が減り学習が速く進みます。

パラメータとロスの関係が複雑な問題では、ロスの小さい点を慣性で生きすぎることによって探索の範囲が広がる→局所最適解に陥りにくくなる

SGDでは勾配が0になってしまい学習が止まってしまう点でも、momentumSGDでは、その点を通り過ぎてさらにlossが小さくなるポイントまで進むことができる。


- **AdaGrad**
<div style="text-align: center;">
    <img src="/attachment/62692f94ece6fa80e19ef52" width="60%">
    
</div>

```Python
h=0 #gradと同じサイズの行列
for i in range(steps):
    h = h + grad * grad
    parameter = parameter - lr * grad / (sqrt(h) + epsilon)
```

パラメータごとに固有の値hを持ち、学習のたびに勾配の2乗ずつ増加していく。<br>
そして、hの平方根でパラメータ更新量を割っているので、hが大きいほどパラメータ更新量は小さくなる。

パラメータが最適値までまだまだ遠い時（学習初期）は大きくパラメータを更新したいが、パラメータが最適値に近づいた時（学習終盤）は最適値を通り過ぎないようにパラメータの更新量を小さくしたい、という意図で学習が進むほど学習率を小さくしていくテクニックがある。

これをパラメータごとに独立して行っているのがAdaGradである。

Adagradでは、今までの更新量の大きいパラメータ（正確には今までの勾配が大きいパラメータ）ほど、更新量が小さくなります。
- **Adam**
<div style="text-align: center;">
    <img src="/attachment/62692fa0ece6fa80e19ef5e0" width="60%">
    
</div>

```Python
m=0 #gradと同じサイズの行列
v=0 #gradと同じサイズの行列
for i in range(steps):
    m = beta_1 * m + (1 - beta_1) * grad
    v = beta_2 * v + (1 - beta_2) * grad^2
    om = m / (1 - beta_1)
    ov = v / (1 - beta_2)
    parameter = parameter - lr * om / sqrt(ov + epsilon)
```
mによってmomentumSGDのようにこれまでの勾配の情報をため込む。<br>また、vによって勾配の2乗の情報をため込む。<br>それぞれ指数移動平均で昔の情報は少しずつ影響が小さくなっていく。

mでは勾配の情報をため込む前に、(1 – beta_1)がかけられてしまう(デフォルトパラメータなら0.1倍）<br>そこで、omでは、mを(1 – beta_1)で割ることで勾配の影響の大きさをもとに戻す。(ovも同様)

最適化アルゴリズムの中でも性能が良いので、まず最初に試す手法として良い。
 <br><br>
>  参考サイト
><br> https://tech-lab.sios.jp/archives/21823
> 
>画像の出典
>  <br> [https://www.acceluniverse.com/blog/developers/2019/10/deep-learningparameter-update.html]
>
外向きに負荷分散するロードバランサーのお話

## 負荷、分散してますか？

今回はちょっと特殊なロードバランサーをご紹介したいと思います。

ロードバランサーの使い方としては皆さんご存じの通り、このように
インターネットからのユーザーアクセスを受けて、Webサーバー等に
通信負荷を分散する、という用途が一般的かと思います。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921693/9aa1eb03-43c7-723a-7432-27562e76a473.png)

そう、ロードバランサーといえば
「外からの通信を内部に分散する」
という内向きの負荷分散機器ですよね。

ところが実は
「外向きに負荷分散できるロードバランサー」
というものが存在するんです。

…何言ってるかわかんないですよね。

イスラエルに本社を迎えるRadware(ラドウェア)という企業の
Alteon(アルテオン)という機器は、インターネットに向けて
ロードバランシングを可能としています。

どういう使い方をするの？という疑問が浮かびますが
これから私が経験した使い方を説明していきます。

# ユーザーからのVPN通信を負荷分散する
## VPN基本構成
まず、VPN接続の基本はこうですね。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921693/f22b193f-e558-af2f-8f05-d06efaa3a450.png)
①ユーザーがVPN接続用ドメイン(xxx.co.jp)へアクセス
②DNSが名前解決し、VPN接続先IPをユーザーに教える
③DNSから教わったIPへアクセスし、VPN接続確立
　　→社内NWへアクセスできるようになる

ユーザー数が数百人くらいであればこれで全く問題ないんですが
数千人～万人ほどになると、ルーターやインターネット回線への
通信負荷がちょっと不安になりますよね。

そんな時にAlteonを導入することで、このように負荷を分散できます。
## Alteonを使用したVPN構成
こちらの構成例でお話しします。注目すべきはこの2点です。
・Alteonへインターネット回線を複数本敷設(今回は4本)
・インターネット上のDNSだけでなく、AlteonにもDNS機能がある
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921693/7d999212-ed94-6bd8-b8ca-3d90581a9025.png)

すると、VPN接続までのフローはこうなります。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921693/f7fc078b-1d51-528b-5516-527da92ce065.png)
①ユーザーがVPN接続用ドメイン(xxx.co.jp)へアクセス
②DNSが名前解決し、AlteonのDNS用IPをユーザーに教える
③ユーザーがAlteon DNSへアクセス
④Alteonが各インターネット回線の負荷を確認し、最も余裕がある回線を判断して
　その回線のIP(bbb.bbb.bbb.bbb)をユーザーに教える
⑤ユーザーがAlteonから教わったIPへアクセスし、VPN接続確立
 　　→社内NWへアクセスできるようになる

このような構成にすることで、大規模なユーザー数でも1回線に負荷が偏ることなく
安定したトラフィックを保つことが可能となります。
(もちろん社内NWがボトルネックにならないように、LANも太くする必要はあります)
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921693/a2e21cda-e2e5-6d60-2407-72d14ec2e7e7.png)

Alteonなしで構成する場合は
①インターネット回線を10Gbps回線にする
②インターネットプロバイダに複数の1Gbps回線を束ねてもらう
③AWS Route53を使って複数回線へ分散する
などが考えられますが
①　→冗長化ができない(回線障害があったら全ユーザーがアクセス不可)
②　→たぶん分散方式の指定ができない(プロバイダ任せになるので期待通りの分散にならない)
③　→たぶんラウンドロビンでしか分散できない(回線負荷を判断して分散してくれない)
という足かせがあるはずなので、ちゃんと分散したい場合はちょっと微妙かと思います。

その点Alteonであればラウンドロビンはもちろん、LeastConnectionやWeightでの分散も
可能なので、設計がしやすいと思います。
※分散方式の説明は今回はしないので、気になる方は調べてみてください

以上、外向きに負荷分散できるロードバランサーのお話でした。
### 良いロードバランシングライフを！
HyperParameter(ハイパーパラメータ)と学習結果の違い

# HyperParameter(ハイパーパラメータ)と学習結果の違い
- **学習率**

    - 一回の学習で重みパラメータをどれくらい変化させるかという指標
    - 大きいと一気にパラメータが更新され、小さいとチビチビと進んでいくイメージ
    - 学習率が大きいと損失関数が最小となる谷を一気に通り過ぎるリスクがあり、小さいと局所解にトラップされて学習が進まなくなる可能性がある

- **バッチサイズ**
    - 複数のデータの塊（ミニバッチ）のサイズ
    - 学習では、ミニバッチに対する損失関数の微分を計算し、重みを更新する
    - ミニバッチのサイズが大きいとデータの特徴が平均化されてしまい、データの個性が失われるリスクがあるが、局所解にトラップされることが少なくなり、学習も早くなる
    - バッチサイズは機械学習の分野の慣習として2のn乗の値が使われることが多く、32, 64, 128, 256, 512, 1024, 2048辺りがよく使われる数値である

- **学習率とバッチサイズの関係**
    - 下図のようにバッチサイズと学習率は比例の関係である。
![学習率とバッチ.png](/attachment/626a59beece6fa80e1a1cc88)

- **バッチサイズと学習率の決め方**
1. 小さなバッチサイズ（１、２、４、８、１６・・・）から始め、学習時間が気になる場合や手っ取り早く精度が知りたい場合はデータ数を小さくするなどの工夫をする
1. バッチサイズが小さいとノイズの影響を受け局所解にトラップされやすい。<br>この場合は学習率を上げて対応する。
1. バッチサイズが大きくなると入力パラメータの特徴が平均化されるため、数万規模のバッチサイズではデータの個々の特徴が失われる可能性がある。<br>(画像だと多くても128や256ぐらい)
1. 一般にバッチサイズが小さいほど精度が良いとされる。<br>逆に低バッチサイズで精度が悪く、大きいほど精度が高いという場合には、入力データの表現力がそもそも高くない可能性を考慮すべきである。<br>特徴量エンジニアリングから検討し直す。
1. 自動のパラメータ決定方法として、ベイズ最適化（ＢＯ）に基づいたハイパーパラメータ探索法がある。（有名どころではOptunaなど）<br>便利だが、探索空間を適当に決めてはいけない。ＢＯで最適化する場合、探索空間を決める根拠をしっかり持つ。



>  参考サイト
>
 https://dajiro.com/entry/2020/04/15/22141４