OmniAICreator/Qiita-1.07M huggingface dataset:
【Windows向け】TortoiseGitでGitHubとSSH接続

## 環境
- Windows 10 Pro
- git 2.39.1 (scoopでインストール)
- TortoiseGit-2.14.0

## 参考記事
https://www.premium-tsubu-hero.net/howto-github-tortoisegit-ssh/

## はじめに
「既存のSSHキーを使ってTortoiseGitでGitHubと連携したい」と思い、ここに備忘録として残しておこうと思います。「①TortoiseGitのインストール」と「②GitのSSH認証」を済ませている前提で話を進めるため、まだお済みでない方は以下の記事を参照してください。①と②が住んでいる方は、先を読み進めて大丈夫です。


https://qiita.com/inakuuun/items/d8e3a04b7f7a741e2c31

https://qiita.com/inakuuun/items/3c1116027cb97135a8db


## TortoiseGitの暗号化ツールをOpenSSHに変更
TortoiseGitでデフォルトで入っている通信用のツールはPuTTY形式なので、OpenSSHに通信用のツールを変更する必要があります。

- 何もないところで右クリック→TortoiseGit→設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711955/e4cc107d-2d41-8531-8e97-b4c8da443c6a.png)

- ネットワークを選択
デフォルトだと、SSHクライアントは`C:\Program Files\TortoiseGit\bin\TortoiseGitPlink.exe`を参照しているかと。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711955/0374462c-8a00-0f57-bbb2-1226297525a2.png)

- 参照先を`C:\Windows\System32\OpenSSH\ssh.exe`に変更し、「適用」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711955/1fc0e28b-67e5-fa29-3be5-e2e5b41fb7e6.png)

- TortoiseGitを使ってリモートリポジトリからクローン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711955/3790af5c-9127-d28a-49ab-9cd9c82ff42c.png)
以下のように表示されたら成功
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711955/debbc58b-c81e-56e2-ddb1-09cb9dfdc48c.png)
PostgreSQL で 2023年のカレンダー情報を登録するSQLサンプル

# はじめに
たまに、カレンダー情報をマスタ化して、登録しておくみたいなことがあるので、SQLのサンプルでのメモ書き残し。

# 確認環境
- PostgreSQL 14.7
- Docker (24.0.6)

# 前提条件

## テーブル構成
```

postgres=# \d mst_calendar
                               Table "public.mst_calendar"
   Column    |   Type   | Collation | Nullable |                 Default
-------------+----------+-----------+----------+------------------------------------------
 id          | integer  |           | not null | nextval('mst_calendar_id_seq'::regclass)
 target_date | date     |           |          |
 date_type   | smallint |           |          |
Indexes:
    "mst_calendar_pkey" PRIMARY KEY, btree (id)
```
※結構いい加減


## 祝日の情報
こちらから拝借しました

https://excel-ubara.com/EXCEL/EXCEL910.html

## 登録ルール
- target_date には対象の日付
- date_type には
    - 平日:0
    - 土曜日:1
    - 日曜日:2
    - 祝日:3
    を設定する

# SQL
```sql
-- 休日情報定義
with holidays as (
	select
		target_date,
		date_type
	from
		(
			values
				('2023/01/01' :: date, 3),
				('2023/01/02' :: date, 3),
				('2023/01/09' :: date, 3),
				('2023/02/11' :: date, 3),
				('2023/02/23' :: date, 3),
				('2023/03/21' :: date, 3),
				('2023/04/29' :: date, 3),
				('2023/05/03' :: date, 3),
				('2023/05/04' :: date, 3),
				('2023/05/05' :: date, 3),
				('2023/07/17' :: date, 3),
				('2023/08/11' :: date, 3),
				('2023/09/18' :: date, 3),
				('2023/09/23' :: date, 3),
				('2023/10/09' :: date, 3),
				('2023/11/03' :: date, 3),
				('2023/11/23' :: date, 3)
		) as h(target_date, date_type)
)
-- 登録SQL
insert into
	mst_calendar(target_date, date_type)
-- 2023年の日付を取得(select insert の内容)
select
	generate_series as target_date,
	-- 曜日でtypeを振り分け
	case
		date_part('dow', generate_series)
		when 6 then 1
		when 0 then 2
		else 0
	end as date_type
from
	generate_series('2023-01-01' :: date, '2023-12-31' :: date, '1 day')
-- 祝日の情報は除外
where
	not exists (
		select
			'X'
		from
			holidays exh
		where
			exh.target_date = generate_series.generate_series
	)
-- 祝日の情報を登録内容に追加
union all
select
	isth.target_date,
	isth.date_type
from
	holidays isth
-- idがあるので、登録順は一応気にする
order by
	target_date

```

# 解説
登録内容＋除外で使いたいので、with の 中で values を使って、固定値を定義化している。
values と generate_series の範囲を増やせば、10年分とかもいけそう。
祝日は日付(mm/dd)だけデータ化しておいて、年だけ指定すると取得できるみたいなストアド構成とかよいかも？

# 終わりに
作ってみると、select insert、with句、valuesの応用 が混じっている練習的な良いＳＱＬなのかも、、と少し自画自賛中
コミットメッセージのプレフィックスにブランチ名とPR番号を自動挿入する

# 背景

ブランチ名をチケット番号にする運用かつスカッシュマージやリベースを行うフローでないため、各コミットメッセージからチケットやPR番号を辿れるように、コミットメッセージの自動生成をしたかった。

# 前提

`gh` コマンドで GitHub CLI を通じた PR 情報の取得ができるようになっていること

# 対応

`.git/hooks/prepare-commit-msg` を作成し、現在のブランチ名プレフィックスにする。

```bash
#!/bin/sh

BRANCH_NAME=$(git symbolic-ref --short HEAD)
PR_NUMBER=$(gh pr list --head "$BRANCH_NAME" --limit 1 --json number --jq '.[0].number')

if [ ! -z "$PR_NUMBER" ]; then
  echo " [$BRANCH_NAME #$PR_NUMBER] " > $1
else
  echo "[$BRANCH_NAME] " > $1
fi
```

パーミッションを付与する

```bash
chmod +x .git/hooks/prepare-commit-msg
```

# 動作確認

コミット時に開かれる vim 上でプレフィックスが既に入力されている

```bash
$ git commit
```

```
[feature/hogehoge #1] 
```
静的サイトの問い合わせフォーム設置が簡単すぎた話

# はじめに
静的サイトで簡単に問い合わせフォームを設置する方法がないか調べ、SSGformというサービスが思った以上に使いやすかったので備忘録も兼ねて投稿します。

# SSGform
SSGformは静的サイトでも使えるフォーム機能を提供しているサービスで、2022年サービス開始と比較的新しいサービスになります。
機能的にも必要なものがしっかりまとまっており非常にいい感じです。

https://ssgform.com/features

## 会員登録
会員登録画面はすごくシンプルなので迷うことはないと思います。登録時はフリープランしか選択できないようです。
![スクリーンショット 2023-09-30 120017.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213515/97b5837b-8b69-169f-5c12-ac68e095ae66.png)

## 管理画面
管理画面もすごくシンプルなのでまぁ迷うことはないでしょうね
![スクリーンショット 2023-09-30 000909.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213515/41bde75d-da67-3936-8c54-04dda7ac14ba.png)

## フォームの追加
フォームの追加画面です。
個人的には必須項目とreCAPTCHAだけ設定すれば良いかと思います。
![スクリーンショット 2023-09-30 001214.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213515/23205796-e097-ece1-3b6b-9ad6ba020ca0.png)
![スクリーンショット 2023-09-30 001307.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213515/542f1d92-9595-ac30-66df-ac02d9349928.png)

## フォームの設置
あとはフォーム追加画面にあった送信先を設定したformを設置するだけです。

```
<form action="[SSGformの送信先URL]">
  <p>
    <label>お名前: <input type="text" name="name" placeholder="お名前" required/></label>
  </p>
  <p>
    <label>メールアドレス: <input type="email" name="email" placeholder="example@gmail.com" required/></label>
  </p>
  <p>
    <label>お問い合わせ内容: <textarea name="message" rows="10" required></textarea></label>
  </p>
  <p>
    <button type="submit">お問い合わせ送信</button>
  </p>
</form>

```

## フォームから送信してみる
localhostで実際にフォームを設定して送信したところ問題無く動作しました。
通知先メールアドレスに以下のようなメールが送られるので、以降はメールでやり取りを進めるという流れになるかなと思います。
![スクリーンショット 2023-09-30 122755.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213515/d450427a-295b-b798-1ec9-c02114a6bc14.png)

# まとめ
ということで静的サイトに簡単にフォームを設置できるSSGformの紹介でした。
フリープランであれば月に100件までという制限はありますが、小規模なサイトであれば十分でしょう。
静的サイトでランニング費用を抑えたいが、問い合わせフォームはどうしても必要という場合非常に魅力的な選択肢となっていくかと思います。
Vue.js props 値型判定について

Vue.jsでコンポーネントへpropsとして値を送るとき、値の型チェックをわかりやすくする方法がないか調べてみました。

参考：

https://qiita.com/potato4d/items/1b92df0cbf9b0b6cf8d6

https://vuejs.org/guide/components/props.html

Vue.jsの標準機能で、propsを宣言するときにtypeを指定することができます。
例えば、文字列型の値を渡すときには、以下が考えられます。

```vuejs:sample1.vue
   props: {
    testProps: {
      type: String,
    },
  },
```
このコンポーネントprops[testProps]に対して数字の「0」を代入した際には、開発者ツール(F12)で警告メッセージが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3096978/1874947c-3409-3f2c-c814-705f5678c9ac.png)

エラーメッセージ：
[Vue warn]: Invalid prop: type check failed for prop "testProps". Expected String with value "0", got Number with value 0. 


画面だけ見ていると、実行時エラーは発生しないので、数字の「0」として処理が進められます。

開発者ツールを開かずに、型判定を表示したい場合は、ブラウザ標準のアラートを使って表示することもできます。

```vuejs:sample2.vue
    if (typeof props.testProps != 'string') {
      alert('[型エラー]testProps:' + props.testProps)
    }
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3096978/c4bdba8c-c931-a2f0-4331-82389103f3f2.png)

validator - propsの宣言に独自の判定を関数で作成することができる

```vuejs:sample3.vue
   props: {
    testProps: {
      validator(value) {
        alert('[型エラー]testProps:' + value)
        return typeof value == 'string'
      },
    }
  },
```

validator関数のreturn がfalseになるとき開発者ツールに警告メッセージが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3096978/f6f6fd24-d854-32fc-d628-dd68acdd76e7.png)

エラーメッセージ：
[Vue warn]: Invalid prop: custom validator check failed for prop "testProps". 


まとめ
今後も、細かく動かしてみて機能の理解を深めたいと思います。
PythonとArduinoの通信実験

概要
=
Pythonで画像認識した結果をCANで別のツールに伝えるためにPySerialを使いたく、試しにArduinoとのシリアル通信を実験した結果をメモした。

実験１(Python2Auduino)
=
内容：Jupyterから1のbyte情報をArduinoに送り、Arduinoがそれを受け取りLEDを点灯する

■Auduino側

![スクリーンショット 2023-09-30 122230.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3181208/c2f56d59-04ac-0591-89e9-a34cb334dc10.png)

~~~~~~~~~~~~~~~~~serial.c
#define LED_PIN 8

//シリアル通信(PC⇔Arduino)
char data;

void setup() {
 Serial.begin(9600);
 pinMode(LED_PIN, OUTPUT);
 LED_ON();
 delay(1000);
 LED_OFF();
}

void loop(){
 if (Serial.available() > 0) {
   data = Serial.read();
   if(data == '1'){
     LED_ON();
   }
   else{
     LED_OFF();
   }
 }
}

void LED_ON(void){
  digitalWrite(LED_PIN, HIGH);
}

void LED_OFF(void){
  digitalWrite(LED_PIN, LOW);
}
~~~~~~~~~~~~~~~~~

■python側
~~~~~~~~~~~~~~~~~~~~serial.py
import serial
import time

num = 0
ser = serial.Serial()
ser.port = "COM4" #PortはAuduinoを挿す度に変わるから、毎回確認
ser.baudrate = 9600  
ser.setDTR(False)     
ser.open()            
while True:
    ser.write(b'1')       
    time.sleep(1)
    ser.write(b'0')       
    time.sleep(1)
    num += 1
    if num == 10:
        break
ser.close()
~~~~~~~~~~~~~~~~~~~~
■結果
LED点灯消灯を繰り返すことができた。


実験２(Auduino2Python)
=
内容:Auduinoから周期的にある情報をPythonへ送り続ける

■Auduino側
~~~~~~~~~~~~~~~~~~~~serial.c
//シリアル通信(PC⇔Arduino)
#define RX_buf_Size 24
#define TX_buf_Size 24

char RX_buffer[RX_buf_Size];
char TX_buffer[TX_buf_Size];
int RX_numdata=0;

const short int TX_IntervalTime=1000;//通信周期
unsigned long TX_PrevTime;//timeの前回実行時刻記録
unsigned long CurrTime=0;//グローバルタイム

void setup() {
 Serial.begin(9600);
 while(Serial.read() >= 0){} //clear serialbuffer
}

void loop(){
  CurrTime = millis();//システム起動時間を取得
  F_Serial_RX();
  if((CurrTime - TX_PrevTime) >= TX_IntervalTime ){
    F_Serial_TX2();
    TX_PrevTime = CurrTime;
  }
}

void F_Serial_TX2(void){
  int bytesSent = Serial.write("33");
  delay(1);
}
~~~~~~~~~~~~~~~~~~~~

■python側
~~~~~~~~~~~~~~~~~~~~serial.py
import serial
import time

num = 0
ser = serial.Serial()
ser.port = "COM4"     #デバイスマネージャでArduinoのポート確認
ser.baudrate = 9600  #Arduinoと合わせる
ser.setDTR(False)     #DTRを常にLOWにしReset阻止
ser.timeout=0     #Buffer溜まる待つ時間
ser.open()            #COMポートを開く

while True:
    if ser.in_waiting > 1: #Bufferにあるデーターサイズを確認してから読み取り
        data = ser.read_all() #読み取りと同時にBufferをクリアしてくれる
        if data:
            rec_str = data.decode('utf-8')
            print(rec_str)
~~~~~~~~~~~~~~~~~~~~

■結果
Auduino側から送られてきた33の数値が受け取れていることがわかる
![スクリーンショット 2023-10-28 204252.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3181208/0cd2b5b8-d51c-aea7-d202-9b017d37174d.png)

宿題
=
信頼度の高い送受信はまだまだこれで十分とは言えないから、通信の合図、CRCチェックなども検討しながら、作って行く必要があります。
Android Studio: Empty Views Activity を使う

テンプレート Empty Views Activity を使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/bc3dc452-8b5a-818b-a7e2-653172867186.png)

app -> res -> layout -> activity_main.xml を編集

Common Attributes

text            "こんにちは。"
textAppearance  "@style/TextAppearance.AppCompat.Display4"

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/7678e949-3ab4-3895-de75-bbce92e9b8e5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/c84e9cf7-8ba2-b560-f260-55123d7108f3.png)

## 実機で実行した結果
![android_sep3001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/036ef217-1226-0997-02e5-ddd27aa04966.png)
Windowsで覚えたショートカットキーまとめ（随時更新）


## <font color="DeepPink">目的</font>

- 業務で使用しているマウスが使いづらいので、出来るだけ右手をマウスに伸ばさず、キーボード操作だけで、完結させたいところ。
- この記事では、Windows業務における様々なショートカットキーについてまとめ、後から見返して復習し、操作を脳みそに定着させることを目的にします。


## <font color="DeepPink">ユーザー辞書登録のショートカット</font>

- `IME`は入力モードが`オン`となっていることを確認。
- `Ctrl`+`F10`でショートカットメニューを表示できる。

- メモ帳、Word、ブラウザ上の入力ボックスなどに入力している文字列を辞書に登録することもできるようだ。
- 入力した文字を範囲選択し、`Ctrl`＋`変換キー`を押して「単語の登録」を選択、もしくは文字列を選択した状態でCtrl＋F7を押すことで単語の登録画面が表示されます。

選択していた文字列が入力された状態になっているので、よみを入力すれば登録することが可能になります。

## <font color="DeepPink">ホーム画面に戻るショートカット</font>

- `Ctrl`+`D`でホーム画面に戻る事ができる。
- Windows10だと、画面右下のタスクバー右端をマウスでクリックすることでも、ホーム画面に戻ることはできる。
- だけど、ショートカットキーを叩いた方が楽だよね。
- 


## <font color="DeepPink">どこでも使えるショートカット</font>
- どこでも使えるショートカットもある。
- いいのが見つかったら随時更新する。

### ***`command`+`スペース`***
- スポットライト検索を表示
- 「terminal」などと入力すると、アプリケーションからTerminalを検索してきて、Enterを押せば即座に起動できる。
- マウスやトラックパッドに手を移動させる必要がなくなるのが良い。
- `esc`でスポットらい検索の入力バーを消す事ができる。





<br>
<br>
<br>
<br>


## <font color="DeepPink">フォント色htmlタグ</font>

`<font color="DeepPink">テキスト</font>`
React レンダリング時、useEffectが２回走る時がある

# React レンダリング時、useEffectが２回走る時がある
React レンダリング時、useEffectが２回走る時があって、
useEffectでconsole.logで確認すると分かる。

## 環境の整理
- node v18.11.0
- React 18.2.0

## 原因
React.StrictMode

## 方法
シンプルに、React.StrictModeタグを削除すればOK

変更前
![スクリーンショット 2023-09-30 114716.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676239/19f3dbc2-58a8-7858-b796-9090efea858d.png)

変更後
![スクリーンショット 2023-09-30 114740.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676239/e5e1de27-1758-ca71-ffa0-cf9f518cbf68.png)


## しかし、理由を理解した上でしよう
React では、javascriptのstrict modeと同じ文法を提供する。
名前で類推できるように特定な文法を厳格に規定し、サービスが運用する環境で安全に動作するような役割を果たしているわけだ。

React.StrictModeの代表的な機能として、Componentが生きる周期を確認し、問題がある部分を開発者に知らせる役割を果たす。まだReactを使用するに慣れていない人は理由もなく、useEffect()が2回実行されると疑問を提起する。この２回実行される原因はReact.StrictModeで開発者に該当Componentが安全ではないことを知らせる動作である。これを double-invokingと呼ばれる。

React.StrictModeのこの警告行為は開発段階だけで適用されて、リリースされたら自動的に動作しない。
しかし、開発段階で予想せぬ動作により開発者に混乱を惹起する場合がある。
混乱をさけるために、一旦React.StrictModeを削除しといて、開発をすすめていいかと。
よね？笑


OK
wslでelixir その73

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
練習問題やってみた。

# 練習問題
Livebookで、片対数グラフを表示せよ。

# 方針
- vegalite使う。


# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/a69fc66f-9f19-9cef-e613-2941cd5b7175.png)


# サンプルコード

```
Vl.new(width: 400, height: 400)
|> Vl.data_from_values(iteration: 1..100, score: 1..100)
|> Vl.mark(:line)
|> Vl.encode_field(:x, "iteration", type: :quantitative)
|> Vl.encode_field(:y, "score", type: :quantitative, scale: [type: :log])

```

以上。
【ChatGPTアプリ有料版】音声会話を聞いてみた。


　どうも、カーブミラーです。

　今回は、ChatGPTアプリ（有料版）の音声会話について、YouTuberかわごんさんが動画にしましたので、それに乗っかりますw

:::note info
本記事は、ChatGPT（無料版）では
行なっておりません。行なえませんw
あしからずw
:::

　ChatGPTファンの中には、
　　ご存知の方も多いかと思います。

　有料版
　（Plus & Enterprise User）の
　　みなさんが、得られる特典機能！

　画像認識と音声会話という
　　マルチモーダル機能について
　　　語ります。
　　　　おいら、無料版なのに(泣)
***
　この機能は、
　　発表から二週間で、
　　　順次、開放されていきます。

　現在は、
　　まだ一部の人のみが
　　　開放されている状況です。

　ランダム、ということは
　　ないとは思いますが、
　　　その順番については、
　　　　みんな頭をひねっています。
***
　まぁ、それはともかく、
　　はじめましょう。

　まずは、
　　画像認識のことは、
　　　棚上げしますw
　　　　わからんしw

　なお、
　　開放されているかは、
　　　Settingsに、Speech
　　　　という項目ができていれば
　　　　　使えます。

　　または、
　　　画面上部に、
　　　　🎧マークがあれば
　　　　　使えます。

　なかったら、
　　開放をお待ちください。
***
　Settingsで
　　New Futuresを選択、
　　　Voice Conversionsを
　　　　オンにします。

　チャットモードになると
　　音声選択モードになります。
　　　●●●●と
　　　　名前が５個あるので
　　　　　いずれかの名前を選択。

　名前（声優さんだそうです）
　　Sky
　　Breeze
　　Juniper
　　Ember
　　Cove

　選んだら、Confirmボタンを押す。

　それで、
　　会話モードに
　　　なります。
***
　さて、
　　あとは、
　　　若いおふたりにお任せして……

　としたいが、
　　誰も若いとは言っていないし、
　　　お見合いじゃないしw

　まぁ、
　　やり取りは、
　　　YouTuberかわごんさんの
　　　　動画を確認すべきかも。
[【ChatGPT】 音声マルチモーダルAI:ス マホアプリの新機能登場!](https://youtu.be/6vKWXLWiL28?si=3gu0tOVLryC4_T3B)

　この動画の最後に
　　特典ならぬ、
　　　英会話練習Promptが
　　　　ありますよ。
***
　最後に、
　　X-Twitterにて、
　　　ツイートされた
　　　　画像認識の例を
　　　　　紹介します。

　箇条書きで
　・落書きの感想を求めたり
　・15×15のクロスワードクイズを
　　　解かせたり（✘）
　・数独を解かせたり（✘）
　・電卓を作ったり
　・図表の読み取り
　・写真撮影や絵画描写のアドバイス
　・栄養管理
　・状況説明や画像の場所推定
　・読みにくい手書きメモを読む
　・電子部品の判別
***
　あ～あ、
　　無料版なのに、
　　　なんで、こんな記事を
　　　　書いているのやら(泣)

　でも、
　　いろんな可能性を
　　　期待しているので、
　　　　OpenAIだけではなく、
　　　　　AIベンダーには、
　　　　　　頑張って欲しい
　　　　　　　ものですね。

　今回は、ここまで。
dockerの導入

#### はじめに
使用機種
Macbook Air M２チップ
macOS バージョン 14.0
iterm2使用

_______
### iterm2ダウンロード
https://iterm2.com/

### VsCodeダウンロード
https://code.visualstudio.com/

### gitダウンロード
https://git-scm.com/

#### git　のインストール
homebrew をまだインストールしていない場合は、インストールします。
```erb:iterm2ターミナル
$ brew install git

$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
インストールできているかの確認
以下のように表示されればOK
```
$ git --version
git version 2.39.3 (Apple Git-145)
```



### dockerのインストール
以下の公式サイトにログインする

https://www.docker.com/

**Docker Desktop　の　Mac版をダウンロードする**

ダウンロードできたか確認
以下のように表示されていればOK
```
docker --version
Docker version 24.0.6, build ed223bc
```





参考

https://minegishirei.hatenablog.com/entry/2023/05/04/124946

https://www.youtube.com/watch?v=OQ5m9iEbRu0
『最初にやるべきAWSセキュリティ設定10のこと』を受けて

# はじめに
個人のAWSアカウントを作成する際に、まず取り組むべきセキュリティ対策諸々を知りた公式の講座を受けてみました。

# AWS講座
https://pages.awscloud.com/JAPAN-event-OE-At-least-10-security-2023-reg-event.html

# メモ

## AWSアカウントの保護において最優先で実施すべきこと
- AWS IAM
  - ルートユーザを使わない
      - 管理者IAMユーザ・機能別ユーザ
  - 多要素認証(MFA)を利用する
      - 特にルートユーザには必ず 
  - ルートユーザのアクセスキーを使わない 
    - デフォルトでは存在していない
    - 一時的なクレデンシャルを使う

## AWSで起きた事実を記録する
- AWS Cloudtrail
  - 操作履歴はセキュリティ面で「何が起きたのか」を把握するのに役立つ
  - コンソールで過去90日間のイベントを無料で見られる
  - 1つ目の証跡ログのS3への配信は無料なので、設定推奨
  - Athenaでの分析

- AWS Config
  - 構成変更の一元管理、および構成変更管理のためのフルマネージド
  - 保持期間はデフォルトで7年
  - 「どのような構成だったのか」を過去ー現在で把握できる(タイムライン)
  - 無料期間はなし

## コスト面で「安心」を確保する
- AWS Budget & AWS Cost Anomaly Detection
  - 予算の監視とアラート通知は無料
  - 閾値をこえるとアラート
      - 普段の異なる振る舞いを検知できる 
- AWS Cost Explore
　　- コンソールから有効かして利用　※データ生成に24時間 
　　- 最大過去13か月までさかのぼってグラフ化
- AWS Cost & Usage Reports
  - 継続的にコストを分析するデータを生成
## セキュリティ驚異検知を行う
- Amazon GuardDuty
  - 機械学習を用いた脅威検出
  - すぐに使い始められる
  - 驚異検知の手法はAWS側がアップデートしつづける
  - 30日間は無料
## 継続的な改善へ取り組みをはじめる
- AWS Truted Advisor
  - AWSのべスプラに基づいての改善提案
  - アカウント作成時に自動的に有効化されている
## AWS環境におけるセキュリティの状態を一元的に把握する
- AWS SecurityHub
  - 組織内のセキュリティーデータを集約、一元的に可視化してリスクを評価
  - 30日の無料トライアルあり 
## セキュリティイベントの通知を受信できるように備える
- セキュリティー連絡用の代替アドレスの登録を忘れずに(rootとはべつ)
- Amazon EventBridge
  - イベントを受け取って、処理後に、通知ツールに配信する
## マルチアカウントによる環境分離を行う
- 本番環境と開発環境の分離は必ず守るべきスタート地点(アカウント分離)
- AWS Organizations
  - 階層化した組織構造で複数アカウントを管理
- AWS Contral Tower
  - べスプラに沿ったマルチアカウント構成を
## 人ビジネスをシームレスに統合する
- IAM Identity Center(旧SSo)
- CLIでも実現可能
## ワークロードに適した保護を施していく
- AWS WAF
  - SQLインジェクション
  - クロスサイトスクリプティング
- AWS System manager
  - AWS環境の運用管理の管理に役立つ一連の機能を提供するサービス群
  - オンプレ/AWSの両方をサポート
- Amazon Inspector
  - リソースの自動検出と継続的なスキャン
  - EC2,ECR,Lambda対応
  - EC2はSSMの管理下である必要がある


# 最後に

個人用のAWSアカウントであれば、
ひとまず、コスト管理とIAM管理ができていればよさそう。。。
GitHub リポジトリのコミット履歴をクリアする手順

# GitHub リポジトリのコミット履歴をクリアする手順

こんにちは、@studio_meowtoon です。今回は GitHub リポジトリのコミット履歴をクリアする手順を紹介します。
![github_with_ubuntu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3206449/43b7df27-dd95-d026-4d33-858cb161ce1b.png)

## 実現すること

GitHub リポジトリのコミット履歴を完全に削除します。ただし、ソースコードは現在の内容を維持します。

:::note alert
GitHub リポジトリのコミット履歴を完全に削除することは、**通常は非推奨**であり、実施することは検討すべき重大な行動です。コミット履歴を削除すると、リポジトリの歴史が全て失われます。
:::

## master ブランチのコミット履歴を削除する手順

リポジトリをチェックアウトします。

```
$ cd TO_LOCAL_GITHUB_REPOSITORY
$ git checkout --orphan orphan_branch
```

:::note info
Git コマンドを使用して新しい**孤立した**ブランチ (orphan ブランチ) を作成するコマンドです。ここで **orphan_branch** は新しいブランチの名前を表します。
:::

全てのファイルを追加・コミットします。

```
$ git commit -am "Initial commit"
```

master ブランチを削除して、現在のブランチの名前を master に変更します。

```
$ git branch -D master
$ git branch -m master
```

ローカルリポジトリをリモート(GitHub)へ強制的に更新します。

```
$ git push -f origin master
```

:::note info
ここまでの作業で、master ブランチのコミット履歴が完全にクリアされました。
:::

## develop ブランチを削除する手順

ローカルの develop をブランチを削除します。

```sh
$ git branch -D develop
```

リモート(GitHub)の develop をブランチを削除します。

```sh
$ git push origin -d develop
```

:::note info
ここまでの作業で、develop ブランチを完全に削除することができました。
:::

## まとめ

+ GitHub リポジトリの master ブランチのコミット履歴をクリアすることができました。
+ また、develop ブランチを完全に削除することができました。

どうでしたか？ Window 11 の WSL Ubuntu でも、Git を操作する環境を手軽に構築することができます、ぜひお試しください。今後も Git を操作するトピックなどを紹介していきますので、ぜひお楽しみにしてください。

## 推奨コンテンツ

https://qiita.com/studio_meowtoon/items/719e6765dd11f17a0b19
GoでWebアプリケーション

### Webサーバーの準備

以下の目的でWebサーバーを用意する

・クライアントがブラウザ上で利用するHTMLとJavaScriptを提供する
・クライアントとの間でWebSocketを使った通信を行う

### 処理の流れ

・net/httpパッケージを利用し、ルートのパスへのリクエストを待ち受ける
・リクエストを受け取ると、HTMLを返す
・ListenAndServeメソッドで、ポート番号上でWebサーバーを開始する

### ソース

```
package main

import (
	"log"
	"net/http"
)

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		w.Write([]byte(`
			<html>
				<head>
					<title>GoのWebアプリケーション</title>
				</head>
				<body>
					GoでWeb
				</body>
			</html>
		`))
	})
	//Webサーバーの開始
	if err := http.ListenAndServe(":8080", nil); err != nil {
		log.Fatal("ListenerAndServe:", err)
	}
}
```

### 文法

net/httpパッケージ　HTTPクライアントとサーバーの実装を提供してくれるパッケージ

http.HandleFunc関数　引数で受け取ったpatternにhandlerを登録する

ListenAndServe 引数で受け取ったTCPネットワークのアドレスで通信をリッスンし
　　　　　　　　来たコネクションをさばくためにServeメソッドを呼ぶ
転職活動の準備って何をすればいいの？？

僕は2023年2月~3月半ばくらいまで、転職活動をしていました！

その時、どんな風に転職活動の準備を進めていたのかを今回記事にしましたので、良ければ参考にしてみてください！

# 転職活動の準備

僕は転職活動の準備を以下のように進めていました。

1. カジュアル面談をたくさん受ける
2. 転職の軸を決める
3. 面接対策は入念な準備を

## **カジュアル面談をたくさん受ける**

実は転職活動をいきなり始めたわけではなく、**情報収集**と**アウトプットの場**として2022年12月終わり〜1月末にかけてMeetyやWantedlyなどを使い、カジュアル面談をこなしていました。全部で20~25社くらいの企業とカジュ面をこなしました。※2月に入ってからも継続。

理由としては面談や面接形式の場で「**聞かれた質問に対して的確にわかりやすく自分が意図した内容を伝える**」これの練習をする必要があると思ったからです。僕は当時SES営業をしており、150社近くの営業さんと商談・打ち合わせをこなしていた事から、コミュニケーション力には自信を持っていましたが、面接では基本、企業担当者から質問攻めを受けるので明らかに**通常の商談や打ち合わせとは異なるコミュニケーションの取り方**になります。これは業務においてはあり得ない事であり、面接という特殊な状況でしか磨く事ができません。

なので、それの疑似体験としてカジュアル面談を受けまくることで、自分の経歴を相手にうまく伝える方法や経歴において気にするポイント、求められる人材のマインドやスキルなどを把握し、**転職市場において自分という人材の価値がどこにあるのかを理解していく事**、これを理解する事で、質問に対する回答の解像度も高まりより相手にも伝わりやすくなります。

## **転職軸を決める**

転職をする上で、重要な要素なのが「**転職軸**」。この軸に関しては、フワッとしていると採用担当者に見抜かれ、選考が思うように進まないとなりかねないので、自分の確かな軸を見つけることをおすすめします。

お伝えしておきたいのは、**転職したい理由**≒**転職軸**は、同じではありません。転職したい理由は、転職軸という幹の枝葉に過ぎず、その内容を軸として話してるうちは自社開発系などの企業に受かる可能性はかなり低いかと思います。

そもそも、転職の軸というのは**転職活動における価値観**だと思っています。自分がどういう価値観のもと、企業選びをするのかこれを考える必要があります。「自分には成長意欲がある」なら成長機会を多く得られるスタートアップを選ぶとか、「自分はとりあえず、なんでもやってみようの精神」であるなら、職種を超えた役割を任せてくれるような企業を選ぶとか、これが価値観だと思います。これを踏まえると、先ほどの転職したい理由が価値観からの派生でしかないことがわかると思います。

ちなみに、僕の場合は**個人の軸**と**企業の軸**の2軸で転職活動を進めていました。

aが個人の軸で、bが企業の軸になります。この2本の軸が1本に繋がるような企業が自分にマッチした会社であるなと思っていたので、この2つの軸を据えた感じです。

## a.バリューフィットしているか
自身の価値観として、「**とりあえずやってみようの精神**」だったり「**成長への貪欲さ**」みたいなものがあったので、これらの価値観とマッチする企業を選ぶことにしていました。「とりあえずやってみよう精神」を推奨してくれる企業なら、失敗やうまくいかなかった事に対してポジティブに捉え次の行動に繋げていこうという企業文化を持っているだろうし、「成長への貪欲さ」を持っている企業は、一人一人の業務意識が高いので、それだけユーザーへの熱量も高く、結果として企業としての成長度合いも早いだろうなと考えていました。

## b.企業がビジョンに対して、コミットしているか

こちらについては、企業である以上起業した理由が何かしらあるはずなので、そこに対して組織的にコミットしているのかを面接の逆質問で投げたり、記事を読んだりしてみていました。ビジョンがないと、メンバー自体の士気が下がり、何をすればいいのかわからないという現象が起き、モチベーションも落ちたりする事を今までの経験からわかっていたので、1の個人の軸と同じくらい重要な軸でした。

ワンピースで例えるとわかりやすいのですが、ルフィが海賊王になるというビジョンを掲げて、それを成し遂げるためにラフテルに辿り着く事を1つの目標とし、そのビジョンを実現するために各クルーが自分のなすべき事を見つけ、確実に実行していく。このビジョンがあるからこそ、そこまでの道のりにおいて、何が必要かメンバーも自身で考える事ができ、結果として組織の生産性も向上し、ビジョン実現に向けて前を向いて進むこともできるのではないかと考えていました。

## 面接対策は入念な準備を


これは正直、自己分析をひたすらしてどんな質問が来ても答えられる状態を作っておくという事がベストですが、僕はよく3を聞かれたら3→2→1という流れで3に至るまでのストーリーを簡潔に話し**意図的に質問されやすい部分だけ抽象的に話す**といった事をしてました。まず、「3→2→1とは何」って感じなので、下記を使って説明します。

=====================================

1 2 3 4 5 6 7 8 9 10

① ② ③ 4 5 6 7 8 9 10

=====================================

こんな感じで、数字が羅列してるとして、１つ１つの数字は自身の経歴における**伝えるべきポイント**だと解釈してください。例えば、僕の場合で行くと3が42東京だとすると、2はIT・Web業界を選んだ理由、1はWebライターみたいな感じで、「エンジニアを目指すきっかけはなんですか？」という質問があれば、それは3に関連のある質問なので、「実は42東京という試験を受ける前からIT・Web業界に興味あり…」みたいな感じで、3→2→1といったストーリーの辻褄が合うように伝えるようにしてました。そうすると、そこまでの流れに一貫性があるかなど面接官も評価しやすいので、1次面接などは通りやすくなります。また、上記例を使うと3を聞かれた時に2までしかあえて答えないと、「IT・Webに興味を持ったきっかけはありましたか？」と質問がくるので、そこで1を話せばより信憑性を増す事ができます。

そしてこれが最も、大事なことですが**直感を信じること**。
面接官と少しでも「合わないな〜」と感じたら、多分入社してからも合わないので、やめた方がいいです。面接と言えど、人との対話になってくるので、「この人と友達になれなそうだな〜」という感覚で、その直感を大事にした方がいいです。友達になれないというのは、価値観やものの考え方が自分とは違うということ。これが面接の場であれば、会社との価値観が合わないという事なので、入社することはお勧めはできません。

---

こんな感じで進めていましたが、転職活動は自分のキャリア設計をする上で大きな分岐点であると思います。この分岐点に、どれだけ頑張れるかがその先のキャリアに繋がると思うので、転職活動では事前準備を徹底的にしておいた方がいいです。たぶん..ぜったい..マチガイナク…

これをするかしないかの差が未経験エンジニア転職成功させてる人と思うようにうまくいかなった人の差になっている気がします。
15年前のスマホ "BlackBerry Storm 9530"を入手した

## きっかけ
国際線の飛行機内で"Blackberry"シリーズを製造する会社"RIM"社の栄枯盛衰を描いた映画「[BlackBerry](https://www.techno-edge.net/article/2023/03/16/1022.html)」を鑑賞したことがきっかけ。

## 映画での立ち位置
iPhoneの登場に対抗しRIM社が発売した、タッチパネル搭載+BlackBerryで人気のクリック感を組み合わせたもの。
時間と人的リソースが足りず、発注を中国にしたため、不良品が大量発生。リコールにより５億ドルの損失を計上した曰くつきのスマホ。日本未発売
[ブラックベリーの嵐 Blackberry Storm](https://academic-accelerator.com/encyclopedia/jp/blackberry-storm)

## 売っている人がいた
なんとメルカリで売っている人がいた（奇跡）
![IMG_3552.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179263/76f13e6b-c66a-a965-2278-c6d0e33b1e35.jpeg)

## 起動まで
コメントで「10年前は普通に使ってました」とあり、一抹の不安を抱えながら起動…
![IMG_3553.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179263/5be0bec3-0363-f043-19f3-edfd60744ebd.jpeg)

しかし「App Error 200」の文字。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179263/02010c18-775e-0b69-e1f4-a953eeca8d5d.png)

調べてみると、「BlackBerry Desktop Manager」からのOS再インストールで行けるらしい
[How to fix BlackBerry App Error 200
](https://www.mobilefun.co.uk/blog/2009/09/how-to-fix-blackberry-app-error-200/)

ということで、このソフトをインストールし、端末とUSBで接続して再起動。
端末のパスワードを入力する必要があるみたいなのだが
当然わからず１０回わざと間違え、デバイスを初期化することにした

すると


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179263/0a3ad708-de98-e024-613e-890ddc457922.png)

つながった！(ん？9520? まあいいか...)

そして

![IMG_3551.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179263/5a7a9195-795b-17b5-5cd2-63c8aac3e349.jpeg)

初期化したら「App Error 200」もなぜか解消し、起動した

## 動作確認
タッチパネルなのに画面が押し込め、クリックできる感覚が新鮮。結構力がいるが、10年の劣化なのか素なのかは分からない。
（まあ、当時はタッチパネルの方が新鮮だったわけだが。）
タッチだけではクリックはできず、スクロールと画面が反応する（マウスを置くイメージ）だけ。

北米版のためか、Simをどう改造しようにも日本では接続できないらしい。
Wi-Fiからは接続できたのでブラウザを起動。


最近のサイトは接続できないよう。
![IMG_3554.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179263/1829b723-7387-2733-6e1e-108e3b395c51.jpeg)


なお、某俳優の方のHPは表示できた。
北米版の機種のため、日本語対応していないので文字がバグってるが。。

## 感想
クリック感は面白いが、iPhoneの後追い感が否めない。
焦って後追い商品を発売することは悪手だが、どうしようもなかったのだろうなぁ。
iPhoneの栄光の陰には、いろいろな物語があったのだなぁ。。

ちなみに、冒頭で紹介した映画はとてもおすすめ。
スタートアップのわくわく感から、大企業の上役になった気分が味わえる。
【Tkinter】ファイルダイアログから選択したファイルをファイル名でリストに追加する

### 実現したいこと
Tkinterにて、ファイルダイアログから<INS>一括選択した複数のファイル</INS>を<INS>ファイル名で</INS>リストに<INS>1行ずつ</INS>追加していく

### 環境
OS:Windows 10
Python Version:3.11.1

### コード
```ruby:Filename_list.py
import tkinter as tk #tkinterのことをtkと略して書きたい場合に記述。
import os #OS機能を使用するライブラリ。今回はファイル名の取得を行うために使用。
from tkinter import * #tkinterモジュール内で定義されているメソッドや変数をまとめてインポート
from tkinter import filedialog #tkinter内のfiledialogを使用するために記述。


#ウィンドウの作成
window = Tk() #メインウィンドウ"window"を作成
window.title("PDF") #"window"のタイトルを定義
window.geometry("850x650") #ウィンドウサイズを定義
window.resizable(width=False, height=False) #ウィンドウサイズを固定。

#開くボタンイベント
def open_click():

    #ファイルダイアログを開く(今回は.pdfファイルのみを選択できるようにする)
	filename = filedialog.askopenfilenames(filetypes=[('','*.pdf')])　

    add_list=list(filename)
	for x in add_list:
        #ファイル名を取得してリストに1行ずつ追加する
		listbox.insert(END,os.path.basename(x)) #絶対パスを取得したい場合は単にxのみ記述。
	
#リスト選択イベント
def listbox_selected(self):
	
	select = listbox.curselection() #現在選択している項目を取得
	selected_module = listbox.get(select)
	print(selected_module) #コマンドプロンプトに選択している項目を表示
	
	
#オブジェクトの定義

#"開く"ボタンを作成し、イベント"open_click"と紐づける
open = tk.Button(window,text="開く",width=5,height=3,command=open_click) 
#リストボックスを作成し、イベント"listbox_selected"と紐づける
listbox = tk.Listbox(window,width=60,height=35)
listbox.bind('<<ListboxSelect>>',listbox_selected)

#オブジェクトの配置
open.pack(anchor=tk.NW) #N:北/S:南/E:東/W:西
listbox.pack(anchor=tk.NW)

#ウィンドウの表示
window.mainloop()
```
AtCoder Beginners Selection 個人メモ

https://atcoder.jp/contests/abs/tasks
# Welcome to AtCoder
```python
a = int(input())
b, c = map(int, input().split())
s = input()
print(sum([a, b, c]), s)
```
```python
print(int(input()) + sum(map(int, input().split())), input())
```
# ABC086A	Product
```python
a, b = map(int, input().split())
if a * b % 2:
  print('Odd')
else:
  print('Even')
```
```python
a, b = map(int, input().split())
print('Odd' if a * b % 2 else 'Even')
```
# ABC081A	Placing Marbles
```python
s = input()
print(sum(map(int, s)))
```
```python
s = input()
print(s.count('1'))
```
# ABC081B	Shift only
```python
n = int(input())
arr = list(map(int, input().split()))

count = 0
while all(i % 2 == 0 for i in arr):
  arr = list(map(lambda x: x // 2, arr))
  count += 1

print(count)
```
```python
n = int(input())
arr = list(map(int,input().split()))

count = 0

while all(i % 2 == 0 for i in arr):
  arr = [i // 2 for i in arr]
  count += 1

print(count)
```
# ABC087B	Coins
```python
a = int(input())
b = int(input())
c = int(input())
x = int(input())

count = 0
for i in range(a + 1):
  for j in range(b + 1):
    k = x - (500 * i + 100 * j)
    if 0 <= k // 50 <= c and k % 50 == 0:
      count += 1
print(count)
```
# ABC083B	Some Sums
```python
n, a, b = map(int, input().split())
ans = 0
for i in range(1, n + 1):
  i_sum = sum(map(int, str(i)))
  if a <= i_sum <= b:
    ans += i
print(ans)
```
# ABC088B	Card Game for Two
```python
n = int(input())
nums = sorted(list(map(int, input().split())), reverse=True)

if n > 1:
  a_point = sum(nums[::2])
  b_point = sum(nums[1::2])
  print(a_point - b_point)
else:
  print(nums[0])
```
# ABC085B	Kagami Mochi
```python
n = int(input())
d_set = set([int(input()) for _ in range(n)])
print(len(d_set))
```
# ABC085C	Otoshidama
```python
n, y = map(int, input().split())

for i in range(n + 1):
  for j in range(n + 1 - i):
    k = n - i - j
    if 10000 * i + 5000 * j + 1000 * k == y:
      print(i, j, k)
      exit()
print(-1, -1, -1)
```
# ABC049C	白昼夢
```python
s = input().replace('eraser', '').replace('erase', '').replace('dreamer', '').replace('dream', '')
print('YES' if s == '' else 'NO')
```
```python
import re
s = input()
if re.compile(r'^(?:dream(?:er)?|eraser?)+$').search(s):
  print('YES')
else:
  print('NO')
```
正規表現
`^`は文字列の先頭、`$`は文字列の末尾を示す
`(?: ... )`は非キャプチャグループ
`(?:er)`はerを非キャプチャグループとして、
`(?:er)?`の後ろの`?`は0回か1回の繰り返し
`|`はorを示す
`eraser?`の`?`は手前の`r`が0回か1回繰り返す
`+`は1回以上の繰り返し
つまり、deramかdreamerかeraseかeraserが1回以上繰り返された文字列が先頭から末尾まで続いているかどうか判定することができる
# ABC086C	Traveling
```python
n = int(input())
count = 0
st, sx, sy = 0, 0, 0
for i in range(n):
  t, x, y = map(int, input().split())
  if abs(x - sx) + abs(y - sy) <= t - st and (abs(x - sx) + abs(y - sy) - (t - st)) % 2 == 0:
    count += 1
  st, sx, sy = t, x, y
print('Yes' if count == n else 'No')
```
salesforce フローで作成時から何日後に処理をする

どうもフリーランスエンジニアのTABEです。

salesforceで対象のレコードが
ある一定の日付から何日後かにメールを送信したい要望があると思います

その実装をしていきたいと思います。

まずは「フローを新規作成」をすると時に「レコードトリガフロー」を選択します。
![スクリーンショット 2023-09-30 10.32.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/904276/d5abd62d-96be-df15-4e22-a8b99836cfa8.png)


今回は取引先のオブジェクトが作成された時の設定で、トリガーを起動します。
![スクリーンショット 2023-09-30 10.34.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/904276/1898dd7a-63b9-e753-09a7-8a30d86664ee.png)


スケジュール済みパスを追加（省略可能）を選択します。

![スクリーンショット 2023-09-30 10.35.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/904276/870104d5-cb32-3ebf-1b04-c732d006bfbc.png)


スケジュール済みパスの設定で「作成日」を起点に、15日後と設定します。
![スクリーンショット 2023-09-30 10.48.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/904276/72799222-79c4-a6e3-c67d-72061ae43be1.png)



この設定をすることで取引先が作成された時に
作成日の15日後にこの先の処理が実行されます。


上記の設定をすると、レコードトリガーフローの開始の部分から「即時実行」と時間を設定した部分の分岐が増えます。
今回でいうと「作成日の15日後に送信」の部分が分岐として増えています。
![スクリーンショット 2023-09-30 10.48.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/904276/16f31ea8-a7bd-c345-f112-a1259a81d2cb.png)

今回は１５日後に「取引先の更新」を設定していますが
メールを送信したり、アラートを設定したりもできます。
何かを通知する要望はかなり多いと思うので、是非設定してみてください。


ちなみに、このフローが起動したかどうか？をテストで確認する場合
クイック検索で「時間ベースのワークフロー」を確認することでフローが起動しているか？確認することができます。

![スクリーンショット 2023-09-30 10.53.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/904276/9c84f79a-5ed8-8091-b46c-361b5ba181e6.png)

このレコードをsalesforceが見て１５日後に処理を後続の処理を実行する仕組みです。

処理された後は、この「時間ベースのワークフロー」のレコードは削除されます。
テストする際はまずは5分後などで簡単にテストしてから、実際の日付を入れてテストしてみてください！

salesforceの解説用動画をUdemyで作っています。
興味のある方は見てもらえたら嬉しいです。
よろしくお願いします！

https://www.udemy.com/course/salesforce-basics-j/?referralCode=4200CF5D86BBE3ABF2D4
Preferred NetworksのPLaMo-13BをDatabricksで動かしてみる

週末の趣味みたいになってますが。

https://www.preferred.jp/ja/news/pr20230928/

https://tech.preferred.jp/ja/blog/llm-plamo/

https://huggingface.co/pfnet/plamo-13b

```py
%pip install numpy safetensors sentencepiece torch transformers
```

```py
import transformers
pipeline = transformers.pipeline("text-generation", model="pfnet/plamo-13b", trust_remote_code=True)
print(pipeline("The future of artificial intelligence technology is ", max_new_tokens=32))
```

最初はこれで以下のエラーになりました。

```
AttributeError: module 'torch.nn.functional' has no attribute 'scaled_dot_product_attention'
```

こちらを参考に`torch`のバージョンを上げたら解消しました。

https://huggingface.co/tiiuae/falcon-40b/discussions/12

```py
%pip install --upgrade torch
dbutils.library.restartPython()
```

再度実行。

```py
import transformers
pipeline = transformers.pipeline("text-generation", model="pfnet/plamo-13b", trust_remote_code=True)
print(pipeline("The future of artificial intelligence technology is ", max_new_tokens=32))
```

動きました。

```
[{'generated_text': 'The future of artificial intelligence technology is fascinating, but it’s also scary. There are many scenarios that could play out, and there’s'}]
```

日本語でも。

```py
from transformers import AutoTokenizer, AutoModelForCausalLM
tokenizer = AutoTokenizer.from_pretrained("pfnet/plamo-13b", trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained("pfnet/plamo-13b", trust_remote_code=True)
text = "これからの人工知能技術は"
input_ids = tokenizer(text, return_tensors="pt").input_ids
generated_tokens = model.generate(
    inputs=input_ids,
    max_new_tokens=32,
    do_sample=True,
    top_k=50,
    top_p=0.95,
    temperature=1.0,
)[0]
generated_text = tokenizer.decode(generated_tokens)
print(generated_text)
```

```
これからの人工知能技術は、その発展が見込まれます。しかしそれだけではなく、人工知能が進化することによって、社会のシステムを根本から変えてしまうようなことも起こり得ると、筆者は
```

恒例の。

```py
def gen_text(text):
  input_ids = tokenizer(text, return_tensors="pt").input_ids
  generated_tokens = model.generate(
    inputs=input_ids,
    max_new_tokens=32,
    do_sample=True,
    top_k=50,
    top_p=0.95,
    temperature=1.0,
  )[0]
  generated_text = tokenizer.decode(generated_tokens)
  return generated_text
```

```py
print(gen_text("Databricksとは"))
```

> Databricksとは、AIと分析を、ビジネスの最前線で活用するためのソフトウェアとサポートを提供する企業である。Databricksは、世界をリードするテクノロジーとデータ・プロバイダ

```py
print(gen_text("What is Databricks?"))
```

> Databricks is a privately held software company which was founded in 2013 by the creators of Apache Spark, and is based in

日英対応というのはいいですね。活用の幅が広がりそうです。

### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
VeeamとSimplivityを一緒に使う場合の注意点

# 近況
久しぶりの投稿となりました、~~コンニャクン~~しゅうペーです。
※改名しました。
先日、AWSの認定資格試験[AWS Certified Security - Specialty](https://aws.amazon.com/jp/certification/certified-security-specialty/)に落ちました。
原因は単純な勉強不足でした。2週間後に受けられるようになるので、再挑戦します。
やっぱり触ったことないサービスは特にイメージがつかず、理解しきれていないなあと実感しました。
頑張ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494465/08920a02-4dde-e1c3-c299-2a5005f4eab3.png)


# 今回の経緯
業務の中で、お客さん先の現行環境のHWサポートが切れるとのことなので、現行Simplivityから新規Simplivityにサーバ移行するプロジェクトに参画しました。
移行に使う製品として、Veeamが採用されました。（Veeamのレプリケーション機能を使用しての移行）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494465/d3ac33dc-eb83-0657-8863-9cf5268e16c5.png)

自社のvSphere環境や他のお客さんの環境でも何度か経験したのでそれほど気にしてませんでしたが、
実際の移行試験でレプリケーションやフェールオーバーをやってみると、**なぜか遅い。**
差分がほとんどない状況でもレプリケーションジョブやフェールオーバーに時間が異様にかかってる。。。
誤差といえないほどの時間差だったので、いくつか調査をしたところ、Simplivity特有の現象だったようで、記事にしてみました。

# そもそもSimplivityとは
HPEから出ているHCI(ハイパーコンバージドインフラ)です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494465/b935a74a-3844-051c-2cb4-72bb8b98aa26.png)

HCIとはサーバー機器、SANスイッチ、ストレージの3tier構成を一台の機器にまとめたものです。
Dellからも[VxRail](https://www.dell.com/ja-jp/dt/converged-infrastructure/vxrail/index.htm#tab0=0&tab1=0)が出ています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494465/20c6d9d6-1f1a-8d81-60e2-65c33f973703.png)

# 今回の原因
原因はSimplivityのボリュームがNFS v3だったことにありました。
[VMware社のkb](https://kb.vmware.com/s/article/2010953)のよると、以下の現象が確認されているようです。
「NFSv3 を使用して NFS データストアをマウントし、ホットアド方式を使用する VADP 対応バックアップ ソリューションを使用すると、次の症状が発生します。」

【症状】
・スナップショットの作成または削除操作中に、NFS ストレージ上に存在する仮想マシンが応答しなくなり、同時に ESXi ホストも応答しなくなることが観察されます。
・バックアップ アプリケーションを使用して NFS データストアに存在する仮想マシンをバックアップした後にスナップショットを削除すると、仮想マシンが約 30 秒間応答しなくなります。
・NFS データストア上にある仮想マシンをバックアップした後にスナップショットを削除すると、完了までに時間がかかります。
※この問題は、ターゲット仮想マシンのディスクがバックアップ/リストア操作のためにホットアドされた場合に発生します。


VeeamはVADPを使用していろいろな処理をしているので、これですね。
同じような内容が[Veeam社のkb](https://www.veeam.com/kb1681)からも出てました。
詳しくはkbを参考にして下さい。

# 対処法
SimplivityではいまだにNFS v4に対応していないようなので、Veeam側で対応します。

**対処法①**
Veeamには転送モードをVeeam Backup Proxyの設定で変更することができますが、そこを変更します。
デフォルトの設定で、Veeam社推奨の「仮想アプライアンス（ホットアド）」から「ネットワークモード」に変更します。
(よく見たらVeeamドキュメント内の要件に「NFS v3の場合」と記載ありました、気づかなかった)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494465/84a32a1f-870c-3dba-0af9-4644596e1ce2.png)


**対処法②**
移行元マシンが乗っているホストそれぞれにVeeam Backup Proxyを立てて、それぞれに以下のレジストリ値を作成する。

Key Location: HKLM\Software\Veeam\Veeam Backup and Replication\
Value Name: EnableSameHostHotaddMode
Value Type: DWORD (32-Bit) Value
Value Data:

Value Dataは1か2を指定します。値による差は以下の画像の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494465/29cbc357-6cf7-368d-ec6f-3259efabecc2.png)

# さいごに
製品の特性や組み合わせで、思った通りに動作しないといったことはよくありますが、何とか原因がわかってよかったです。
質問があればコメントしていただければと思います。
それではまたどこかで。
JavaScript基礎学習①JavaScriptとは？

JavaScript学習中。
復習・備忘録のために記述していきます。

◆学習内容
書籍：[『確かな力が身につくJavaScript「超」入門』](https://amzn.asia/d/9wYTExP "『確かな力が身につくJavaScript「超」入門』")
参考サイト：[JavaScriptができることとは？よく使われる処理、分野を徹底解説](https://career.levtech.jp/guide/knowhow/article/700/ "JavaScriptができることとは？よく使われる処理、分野を徹底解説")

- JavaScriptとは？？
ブラウザを操作するためのプログラミング言語。
HTML＆CSSだけではできない事をする。
（HTML＆CSSは一度ブラウザに読み込まれたら変化せず静止したデータである。JavaScriptを使用する事でその場でリアルタイムに書き換えて一部コンテンツを入れ替えたり、画像スライドショーのように動きをつける事が可能に。）
＜書き換えの例＞
①タグに囲まれたテキストの書き換え。
②HTML要素への新たな要素の追加や削除。
③タグの属性の値を変更。（class,id,hrefなど）
④CSSの値を変更。


- 動作の仕組み
プログラムの処理の流れ（データのインプット→加工→データのアウトプット）にイベント（いつ動作を始めるか決めるきっかけ）を付け加える。

- JavaScriptがアウトプットできる場所
①コンソールへのアウトプット。
（ブラウザの開発ツール内のコンソールにテキストや数字を表示）
②ダイアログボックスへアウトプット。
（ダイアログボックス（ブラウザ上に表示されるポップアップ）に出力）
③HTML&CSSへアウトプット。
テキストを書き換えたり要素を挿入したり。


- JavaScriptが使われているフレームワークについて
①jQuery
JavaScriptの記述をシンプルにできるライブラリ。開発が簡易化される。
②React
WEBサイトなどのUIを開発する際に使用されるMetaが開発したライブラリ。
コンポーネント思考と呼ばれる作成したパーツを再利用しやすい設計手法が採用されている。
③Vue.js
アプリケーションのフロント部分の開発に使用されるフレームワーク。
SPA（ページ遷移のないWEBアプリ）開発に使用される事が多い。
④Next.js
Reactを基に開発されたフレームワーク。フロントエンドだけでなくサーバーとして動かす事もできる。
⑤Node.js
JavaScriptをサーバー側（バックエンド処理）で動作させるフレームワーク。
大量アクセスに強く、処理をリアルタイムで実行可能であり、タイムラグが大きく影響するチャットサービスや負荷の大きいチケットサイトの開発に適している。
【Rails】renderで独自ドメインを公開する手順

# はじめに
お疲れさまです。
おおくまです。

以前にRailsで実装したアプリをrenderでデプロイしました。
以下は、独自ドメインを公開した手順になります。
備忘録として残したいと思います。

# 環境
Ruby 3.2.2
Rails 7.0.8
Webアプリケーションサーバ render
データベース PostgreSQL
**renderにてデプロイ済み**
**お名前.comにて独自ドメイン取得済み**

# 注意点
:::note warn
私はプログラミング学習中で、初学者です。
内容に誤りがある場合があります。
コメント等で教えていただけると幸甚です。
:::

# 手順

まず、renderにログインします。
ダッシュボードからデプロイしたアプリを選択します。
左のタブから「Settings」をクリックします。
下の方にスクロールすると「Custom Domains」という項目があります。
そこの「Add Custom Domain」というボタンをクリックします。
![スクリーンショット 2023-09-30 9.03.24（2）.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348444/82bd7f7e-f977-0d14-8fb5-241edde7aea0.jpeg)

<br>

次に、取得したドメインを入力し、「Save」をクリックします。
![スクリーンショット 2023-09-30 9.04.38（2）.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348444/436b7fc7-773f-e323-7475-be94f57da06a.jpeg)

<br>

するとこのような画面になると思います。
赤丸で囲ったところを控えておいてください。
![スクリーンショット 2023-09-30 9.05.26（2）.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348444/d0617816-4800-c4ab-26df-224fdbe7f0e4.jpeg)

<br>

次に、お名前.comにログインします。
取得したドメインの詳細ページにアクセスします。
下にスクロールすると、このような画面があると思います。
DNSレコードの「設定」をクリックします。
![スクリーンショット 2023-09-30 9.06.43.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348444/17ebb0da-79f5-f498-97c6-165bbce82098.jpeg)

<br>

「次へ」をクリックします。
赤丸で囲っている「設定する」をクリックします。
![スクリーンショット 2023-09-30 9.07.26.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348444/a6f96938-e282-1726-0e8c-b4ed2bf4c4c7.jpeg)

<br>

下の方にスクロールしていくと、このような画面があると思います。
ここに情報を記入していきます。
![スクリーンショット 2023-09-30 9.46.05（2）.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348444/68d458c5-4744-0fb4-cbff-1122e7497a4e.jpeg)

<br>

まず、先ほどのrenderの設定画面で控えた**数字**の方を記入します。
このように入力し、「追加」をクリックしてください。
![スクリーンショット 2023-09-30 9.09.08 2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348444/7f1b14fb-6a6c-7479-ff38-1dc994fbc35c.jpeg)

<br>

次に、先ほどのrenderの設定画面で控えた**URL**の方を記入します。
**ホスト名のところは「*」を入力します。**
**VALUEは「https://」は不要なので、注意してください。**
このように入力し、「追加」をクリックしてください。
![スクリーンショット 2023-09-30 9.10.11.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348444/75f1bb94-100c-dff2-fc06-af2fbe466363.jpeg)

<br>

次に、一番下までスクロールし、「確認画面へ進む」をクリックします。
ポップアップが出る場合は、「設定しない」をクリックします。
次に、一番下までスクロールし、「設定する」をクリックします。
お名前.comの設定は以上です。

<br>

最後にアプリケーション側でホストの許可をします。
```ruby:config/environments/production.rb
Rails.application.configure do
  config.hosts << 'www.example.com'
end
```

<br>

設定は以上になります。
お疲れさまでした。
あとは独自ドメインでアクセスできるようになるまで気長に待ちます。
**私は反映されるまで2時間ほどかかりました。**
**長い方で1日かかった方もいるみたいです。**

<br>

アクセスできるようになったら、renderのダッシュボードにアクセスします。
「Settings」の「Custom Domains」の画面がおそらくこのままだと思います。
赤丸で囲った「Verify」というボタンをそれぞれクリックします。
![スクリーンショット 2023-09-30 9.05.26（2） 3.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348444/a7d68301-798c-4405-fa8e-7a146e63ef89.jpeg)

<br>

このような画面になればOKです。
![スクリーンショット 2023-09-30 9.11.11（2）.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348444/b17e5bca-0fa6-3623-0edd-83770b78e337.jpeg)

<br>

最後まで読んでいただきありがとうございました。
Rails + DockerでRails7を爆速環境構築する

# はじめに

- エンジニア歴半年 + αの備忘録
- 多分また使うからメモ
- 環境はMac Appleシリコン
- 今回はチームでの開発なので、各PCの環境に依存せずに開発できるように構築する〜

# やりたいこと

- Rails APIモード + Dockerでの環境構築

# 早速やっていく

### 今回作るディレクトリ構造

```
app-name
├── // ここにRailsの各ディレクトリが生成されます（appなど）
├── Dockerfile
├── docker-compose.yml
├── Gemfile
└── Gemfile.lock
```

これだけ〜〜〜超楽だわ

### Gemfileを編集

```yaml
source "https://rubygems.org"
gem "rails"
```

railsのバージョンは今回は指定しない。Gemfile.lockで固定していきます。

### Gemfile.lockを編集

Gemfile.lockは空でおけ

### Dockerfileを編集

```yaml
FROM ruby:3.2

WORKDIR /app

COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock

RUN bundle install

CMD ["rails", "server", "-b", "0.0.0.0"]
```

rubyのバージョンはお好みで

### docker-compose.yml

```yaml
version: '3'
services:
  db:
    image: mysql:8.0.33
    volumes:
      - data-volume:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
    ports:
      - 3306:3306
  back:
    build: .
    volumes:
      - .:/app
    ports:
      - 3000:3000
    depends_on:
      - db

volumes:
  data-volume:
```

データベースはmysqlを使用、back側のポートは3000にしてみました。

### Dockerで環境をビルドする

ターミナル開いてディレクトリに移動、環境をビルドします。

注：Docker desktopを使っている方は起動しとかないとコマンド使えません（当たり前）

```
> docker-compose build
```

### Rails newする

ここでデータベースとapiモードを指定します。

今回はバックエンドとフロントエンドを分離して開発を行うのでフロント部分は要らないって感じですね

```
> docker-compose run --rm back rails new . --force --database=mysql --api
```

Rails newはしっかりできましたか？

ここでしっかりRails newが行われない場合は、マウントされているボリュームのディレクトリが違うなどの可能性があります。Dockerfileとdocker-compose.ymlを見直してみましょう

### database.ymlを編集

config/database.ymlを編集します。

パスワードとホストを設定したものに変更するだけ

```yaml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password
  host: db

development:
  <<: *default
  database: app_development

test:
  <<: *default
  database: app_test

production:
  <<: *default
  database: app_production
  username: app
  password: <%= ENV["APP_DATABASE_PASSWORD"] %>
```

### ビルドし直す

`bundle install`を実行するために一度リビルドして、立ち上げ直しましょう

```
> docker-compose build
```

```
> docker-compose up -d
```

### DBを作る

最後にDBを作ります

```
> docker-compose run back rails db:create
```

ここまできたら

http://localhost:3000/

にアクセスしてみましょう！！

Railsのアイコンが表示されたら完了です！お疲れ様でした。

# 備忘録

Rails newすると`.git`ファイルが作られ、非常に~~だるい~~便利です。

クローンしてきて、そこに環境を作る人が大多数だと思いますので、消すのが無難です。

ディレクトリに移動して手動で消すか、

```
> rm -rf .git
```

これで消えます。

# 参考
https://zenn.dev/wakkunn/articles/33c84147608078

https://kiyobl.com/rails-docker-basic/
ReactアプリケーションをbuildしてGithub Pagesにデプロイする方法

## **前提条件**

- Node.jsとnpmがインストールされていること。
- GitHubアカウントがあること。
- Gitがインストールされていること。

## Reactアプリ開発手順

### **1. リポジトリを作成**
GitHubで新しいリポジトリを作成します。
### **2. ローカルにクローン**

 リポジトリをローカルにクローンします。
    
```terminal
  git clone [リポジトリのURL]
```
    

### 3. Reactアプリ初期セットアップ
```bash
 npx create-react-app .
```
### 4.初期セットアップ後、リモートリポジトリへPush
```bash
git add .
git commit -m "Reactアプリセットアップ"
git push　origin main
```
### 5.初期セットアップ後、差分をわかりやすくするためブランチを切ってアプリ開発

## Github Pagesにデプロイする手順
### **4. `gh-pages` パッケージのインストール**

- **`gh-pages`** パッケージを開発依存関係としてインストールします。Github Pages用の公開ディレクトリを別ブランチ上にコマンド一つで生成してくれるパッケージです。
- `gh-pages`という名前のブランチが作成されます。
- gh-pagesはビルドしたファイルを自動的に`gh-pages`ブランチにデプロイすることができます。
    
    ```bash
    npm install gh-pages --save-dev
    ```

### **5. `package.json` の編集**

- **`package.json`** ファイルに以下のフィールドを追加します。
    
    ```Package.json
    "homepage": "http://GitHubユーザー名.github.io/リポジトリ名"
    ```
    
- 先程ど同様の`pacage.json` の`scripts`セクションに以下を追加します。
これらは`npm run deploy` を実行する前に自動的に呼び出されるスクリプトです。
    ```pacakge.json
    "scripts": {
      "predeploy": "npm run build",
      "deploy": "gh-pages -d build",
    //省略
    }
    ```
- `"predeploy": "npm run build"` は、React アプリケーションをビルドして build/ ディレクトリに出力します。  
- `"deploy": "gh-pages -d build"` は`gh-pages` パッケージを使用して、ビルドされたアプリケーション（build/ ディレクトリ内）を GitHub Pages にデプロイします。
### **6. GitHubにコードをプッシュ**

```bash
git add .
git commit -m "ReactアプリをGitHub Pagesにデプロイするための設定"
git push origin [Reaｃｔアプリ実装したブランチ名 ]
```

### **7. デプロイ**
 以下のコマンドを実行してデプロイします。
```bash
  npm run deploy
```

    

これで、**`http://GitHubユーザー名.github.io/リポジトリ名`** にアクセスするとReactアプリが表示されるはずです。

注意: このURLは、GitHubリポジトリの設定にも依存します。**`gh-pages`** ブランチが正しく設定されているか確認してください。また、反映には数分かかる場合があります。


以上が基本的な手順です。
Azure AD が Microsoft Entra ID になり始めた（新旧画面の魚拓）

2023/9/30 の時点で記事を記載しています。
Azure Portal の画面をみていたら Microsoft Entra ID への名称変更に気づいたので、魚拓を取っておきました。

左側が 新画面（Microsoft Entra ID）
右側が 旧画面（Azure AD）

公式に案内されている 新旧用語比較は、以下の公開情報を参照ください。

https://learn.microsoft.com/ja-jp/azure/active-directory/fundamentals/new-name#glossary-of-updated-terminology

# ホーム画面のアイコン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/8c942e92-ad6e-8904-8ca0-1257f35c3618.png)

# テナントの概要ページ
ライセンス名や Connect のところも変わっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/bd1eb564-0b6a-3408-f267-f05de47faac2.png)

# エンタープライズアプリ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/11191c77-864e-4e9c-4de0-6d0e663eb2a3.png)

# ロールと管理者
赤下線部は変わっていますが、緑枠部分は 旧名称のままですね・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/c749d43d-2883-d851-610f-219efdb0c98f.png)

# External Identities（テナント間アクセス設定）
ココは、新名称「Microsoft Entra テナント」に対して、旧名称「Azure AD 組織」になっていて、組織がテナントという表現に変えられている点が興味深いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/e8a0cd10-3777-5ed8-c7cd-66adab105b57.png)

# ライセンスされた機能
「Microsoft Entra Connect 同期」や「Microsoft Entra Join」という表記が確認できます。
Microsoft Entra ID Join じゃないのかぁ・・・

いままで、Azure AD Connect は AADC／Azure AD Join は AADJ って略していたけど、今後はどうすれば・・・
MECとか、MEJ って、ちょっと微妙。何のことを指しているのかわからない💦
MEIDC や MEIDJ だったら 違和感あるけど、慣れれば 何を意図しているのかわかるのに・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/2616c5bb-34d1-f9e6-0d7f-8d2b914d725b.png)

# セキュリティ
ココは、ドキュメントへのリンク先なのですが、新旧で差がでています。遷移先のページは同じなのですが・・・・
下部を見ると 新名称（展開計画）と、旧名称（デプロイ計画）で 呼び名が変わっています。、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/6ea7e0aa-c15b-fe3f-3215-ba204a807d5b.png)

# ココは、変わっていない
なぜか Microsoft Entra Connect（Azure AD Connect）のページは 旧名称のままでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/770814f4-9986-2f0b-025f-29090919cd73.png)

# （ネタ）公開情報に誤字を発見
下図の下線部は、"Microsoft Entra AD パスワード保護" になっていますが、正しくは "Microsoft Entra パスワード保護" であり、"AD" の文字を消し忘れですね。
まさか、手動でサイトのメンテナンスをしているのでしょうか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/7cf615ca-3b5d-e74b-c6b2-5859f89c2888.png)
（該当箇所へのリンク）
https://learn.microsoft.com/ja-jp/azure/active-directory/authentication/concept-password-ban-bad-on-premises#download

英語サイトは、そんなことない。ちゃんと修正されています。この英文からの機械翻訳であれば、"Microsoft Entra AD パスワード保護" なんかに訳されるわけがないです！
やっぱり、日本語サイトは 人手で編集しているのかなぁ・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/3f4f5918-579a-83cf-1727-f4b0a90ad431.png)

# ご参考
こちらの記事にも 名称変更の件を記載しています。

https://qiita.com/carol0226/items/2a767e3d9e114b66c562

# ちょっと宣伝を・・・
現在は、Azure Virtual Desktop (AVD) で、ホストプールと仮想マシンを作成する際に、どれだけシンプルな画面からデプロイさせられるか？ を研究しています。
その際には、いくつかのハードルがあったのですが、そこで得られたノウハウを記事にしています。
以下のリンク先で シリーズ化 していますので併せて参照ください。

https://qiita.com/carol0226/items/7318fdd7aff780f5177c