OmniAICreator/Qiita-1.07M huggingface dataset:
非プログラマーでもGitを触ってみよう

# はじめに

https://forest.watch.impress.co.jp/docs/news/1593848.html

今後のWindowsのアップデートでエクスプローラーからGitのコミットメッセージが見られるようになるらしいです。
この記事を読んでいる方の中にはGitってそもそも何？という方もいるかもしれません。
もしかしたら非エンジニアの方もGitを使うことが求められる時代が来るかも...？

# 注意事項

## 扱わないこと
- プッシュなどのリモートの操作 (ローカルで完結するGitの使い方を説明します)

## この資料の対象者
- PC中級者向け (数年PCを使ってきて一通りのことはできるようになってきた段階)

# なんでGitを使うの
ファイルのバージョン管理ができるからです。
この管理ができると何が起こるかというと...

- ファイルの変更履歴が残る
- 以前のバージョンに戻すせる
- だれがどこを変更したのかがわかる

などなど、ファイルを扱う上での様々なメリットがあります。

これをやらないと...

![Bad Situation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288957/a7dff59f-992c-597f-deab-604453b544de.png)

こんなふうにどれが最終版なのか分からない。間違って古いバージョンのファイルを使ってしまうかも！

# どんな仕組み？

簡単に言うとゲームのセーブポイントを作れる仕組み！
セーブポイントを作ったらいつでもその場所に戻れます。
またセーブポイントには名前をつけたりすることもできたり、差分を見れたりします。

# どうやって使うの

## 1. Gitのインストール

https://qiita.com/T-H9703EnAc/items/4fbe6593d42f9a844b1c

こちらを参考にしてGitをインストールしましょう。

## 2. 見た目をよくしよう

https://sukkiri.jp/technologies/devtools/git/sourcetree_win.html

このソフトを使うと真っ黒い画面での操作がなくなり、直感的になります！

![FirstDashBoard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288957/eec6d2e2-e994-960a-1e6c-f9e4023eddbd.png)

# コミットを体験してみよう

## 1. リポジトリを作る

右上のプラスボタンを押して、新しいリポジトリを作りましょう

管理したいフォルダを選択して、作成ボタンを押します。

![MakeRepository.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288957/5b469983-d67c-2a57-5a29-f3dfadd7ec9a.png)

## 2. ファイルを追加する

1 で追加したフォルダにファイルを追加しましょう。
![Stage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288957/68c6c873-50b6-913e-c5c4-90c50401e19e.png)

ファイルを追加したら画面のように左上に青いマークが出てくるはずです。
↑ボタンを押すと、以下のような画面になります。
![Add.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288957/c13163a3-62d1-194b-27aa-0ef3f28ce056.png)

## 3. コミットをする

最初に先ほど追加したファイルの横のプラスボタンを押しましょう。

すると以下のようにファイルが上に移動します。
![Commit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288957/8f386d39-6490-43c1-33dc-55ea66c7ab8f.png)
このときに画面下部の欄にセーブポイントの名前(コミット名)を入力しましょう。
そして右下のコミットボタンを押します。

すると元の画面に遷移して先ほどつけた名前が表示されているはずです。
![FirstCommit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288957/dcea8fd3-bc5a-57ff-fb1e-da98a9ad4e78.png)

これでコミットが完了しました！

# まとめ

Gitは難しいですが使いこなせるととても便利なツールです。
プログラマーだけでなく、様々な方に使っていただきたくこの記事を書きました。
QiitaにはGitに関する記事がたくさんあるので、ぜひ参考にしてみてください！
オブジェクトの分割代入で別名で取り出す方法

たまにド忘れしてしまうので、備忘録として記事にしました。

## 分割代入とは
分割代入 (Destructuring assignment) 構文は、配列から値を取り出して、あるいはオブジェクトからプロパティを取り出して、別個の変数に代入することを可能にする JavaScript の式です。

VueやReactで同じコンポーネントで複数のhooksからプロパティを取り出す時に、どうしても名前が被ってしまう時があると思います。

そんな時にプロパティに別名をつける方法。

```vue
// これだと名前が重複してエラーになる
const { data, fetchData } = useUserData()
const { data, fetchData } = useRankingData()

// 2つ目のhooksのプロパティに別名をつけて取り出せばOK
const { data, fetchData } = useUserData()
const { data: rankingData, fetchData: fetchRankingData } = useRankingData()
```
Discordでお手軽チーム開発

# はじめに

## Discordとは

https://discord.com/

Discordはゲーマー向けに作られたコミュニケーションツールですが、私はチーム開発でも使えると思いこの記事を書きました。
小規模から大規模まで対応できるので、ぜひ使ってみてください。

# これと合わせると便利

https://disboard.org/ja

このサイトでサーバーを見つけることができます！
プログラミングと検索するとこんなにたくさん出てきます。
プログラマーが集まっているサーバーに入ることで、ハッカソンや勉強会に参加することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288957/0d19efbe-d277-3064-1654-a62855cbaa35.png)

# Discordの便利機能

## VC

Discordはゲーマー向けということもあり、VC機能が充実しています。
Slackなどでは一部制限があったりしたりしますが、Discordは無料で使えるので気軽に使えます。

## フォーラム

フォーラム機能では、質問板を作ることができます。
ここで話題ごとに板を作ることで、情報を整理することができ質問状況も把握しやすくなります。

![フォーラム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288957/b64c9eef-0a2a-9ad7-4eb7-f6ebbe0ee9e8.png)

## Bot

Botを使うことで、自動で通知を送ったり、記録を定期的に取ったり、なんとVCの記録まで取ったりすることができます。
情報量も比較的多いのでBotも作りやすくプログラマーの方にはぜひ使っていただきたいです。

# さいごに

他のコミュニケーションアプリにある機能もほとんど網羅されていて、アップデートも頻繁に行われています。
DiscordはSlackと比べても安価に使用できるので個人開発にうってつけだと考えています。
まずは試してみて自分に合うかどうかを確認してみてください！
Gitでよく使うコマンドまとめ

個人的「質はともかく継続する」１7日目です

# よく使うコマンドまとめ

{ } …任意の値をいれる箇所

### 初期化

```bash
git init 
```

### ステージング

```bash
git add "ファイル名"
```

### コミット

```bash
git commit -m "メッセージ" "ファイル名"
```

### ログを確認

```bash
git log
```

### 状態を確認

```bash
git status {FILENAME}
```

### ステージングの取り消し

```bash
git restore --staged {FILENAME}
```

### コミットの取り消し

logでCOMMIT IDを取得後

```bash
git revert {COMMIT ID} --no-edit
```
【AWS Summit】AWS Summit Japan 2024に参加してきました

# AWS Summit Japan 2024 レポート

## はじめに
AWS Summit Japanは、Amazon Web Services (AWS)が主催するクラウドコンピューティングの最新トレンドや技術情報を学ぶことができる年次のイベントです。
2012年に日本で初のAWS summitが開催され、今年はなんと12回目の開催となります。

AWS Summit Japanの講演は7月5日までオンデマンド配信されているので、会場に足を運べなかった方や、当日オンライン視聴ができなかった方は以下のリンクより、ぜひ視聴してみてください。
※視聴には無料の会員登録が必要となります。

[AWS Summit Japan公式ページ](https://aws.amazon.com/jp/summits/japan/)
![IMG_4311 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/76ca78f2-8313-493c-d082-d2a0f060be57.jpeg)




## 講演レポート
AWS Summit Japanでは、様々な講演が行われました。
以下に、特に印象に残った講演をまとめます。

### 基調公演
今年はAIと機械学習の分野でのAWSの進展が注目されました。
環境問題や、医療の分野でのAI活用シーンが紹介されました。

また、Anthropic社のスピーチでは生成AIの変革的な可能性を安全かつ、
いかに責任ある形で解放できるかということについて言及していました。
非常に興味が引かれる内容でした。
よくAIが人間を超えるということが言われていますが、
Anthropic社ではそうならないように事前に管理と検知を行うそうです。

### 自社データを用いた生成 AI の活用事例
コチラの講演は、生成AI活用におけるデータの重要性とデータの適用方式についてのものとなります。

生成AI利用には、データ品質が一番の課題とされているそうです。
確かに、せっかく生成AIを利用してチャットボットを開発しても
回答が正確でなければそれは活用できているとは言えませんよね。

また、AWSからは新しい生成AIよりも既存の生成AIを利用して、
カスタマイズすることをおすすめしているそうです。

カスタマイズには以下の3つの方式があり、
それぞれにメリットデメリットがあるので
気になる方はぜひご自身でも調べてみてくださいね。
　・検索拡張生成（RAG）
　・FINE-TUNING
　・事前学習


## ノベルティの紹介
ノベルティはAWS Summit Japanの醍醐味の一つですよね。
私がもらったノベルティの中で印象的なものをご紹介します。

### クッション
1日目と2日目それぞれで先着5000名にクッションが配布されています。
基調公演は先着指定席なのですが、指定席にクッションがおかれていました。
椅子にずっと座っているとお尻や腰が痛くなるので、このクッションに救われました。
![IMG_4384.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/2b0470fa-a6ec-52e4-99ef-fca099b5a879.jpeg)


### 入浴剤
new relicさんのブースで入浴剤をいただきました。
![IMG_4386.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/8b66493c-46b6-0da6-eac9-68c6f0e01de0.jpeg)

ルーレットを回して、景品がもらえるシステムでした。
パジャマやTシャツ、扇子などもあり、どれも魅力的なものばかりでした。
ルーレット待ちで長蛇の列だったのですが、回転がよくすぐに自分の番になりました。

### ステッカー
AWS認定資格を保有している人が利用できるAWS認定者ラウンジでは、
保有している認定に応じたステッカーが配布されました。
私はCLFとSAAを持っていたので2枚ステッカーをもらいました。
![IMG_4385.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/14d3c380-8357-5195-17e7-a0f5e6ce52ac.jpeg)

すべての認定資格を保有している場合は、
追加のステッカーとボトルがもらえたようで、
デザインはスタイリッシュでかっこいいものでした。
ボトルは大人気で1日目でなくなったようです。

また、今年の8月より、以下の認定がベータ版で追加されます。
また一歩All Certから遠のきましたね。頑張りましょう。
・AWS Certified AI Practitioner
・AWS Certified Machine Learning Engineer - Associate

---

今回のレポートレポートにまとめ切れていない内容はたくさんありますが、
今後AWS Summit Japanへ参加を検討している方やAWSに興味がある方の参考になれば幸いです。
楽天ポイントの履歴をCSV形式でエクスポートする拡張機能作った

# 拡張機能の概要
楽天ポイントの履歴をCSV形式で保存するだけのChrome拡張機能

![アセット 5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677129/17b045ab-1da7-acaa-8333-a24c3f542dc3.png)

https://chromewebstore.google.com/detail/%E6%A5%BD%E5%A4%A9%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E5%B1%A5%E6%AD%B4%E4%B8%80%E6%8B%AC%E4%BF%9D%E5%AD%98/fdancdeohoaopohmjfnbpddgndlkcaip

https://github.com/kouheisatou/PointHistoryScraper

# 制作の動機

現状の楽天ポイント履歴のサイトの使いにくい点
- 楽天ポイントはCSV形式のエクスポートを提供していない  
- 履歴は最大で１年前のものしか参照できない  
![スクリーンショット 2024-01-23 16.53.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677129/e6f49a3c-fa4b-fa33-14f2-bbbb56e8c57d.png)

- 楽天カードの明細では"楽天キャッシュ チャージ"としてまとめて表示されてしまう  
![スクリーンショット 2024-01-23 16.52.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677129/6b01ab0c-0cad-7309-4c2a-a5c248b6923e.png)


### 改善案
- ポイント履歴のサイトをスクレイピングすれば保存できそう
- 拡張機能にすればいつでも呼び出せて使いやすそう

# 内部処理  
`history-table`を取得し適当に文字列を整える  
```javascript
var tableBodyContent = document.querySelector('.history-table tbody')
for (var i = 0; i < tableBodyContent.children.length; i++) {
	var row = tableBodyContent.children[i]
	try {
		let date = row.querySelector(".date").innerText.replaceAll("\n", "/").replaceAll(",", "")
		let service = row.querySelector(".service").innerText.trim().replaceAll("\n", " ").replaceAll(",", "")
		let title = row.querySelector(".detail").innerText.trim().split("\n")[0].replaceAll(",", "")
		let action = row.querySelector(".action").innerText.trim().replaceAll("\n", ".").replaceAll(",", "")
		let point = row.querySelector(".point").innerText.trim().replaceAll("\n", "").replaceAll(",", "")
		let note = row.querySelector(".note").innerText.trim().replaceAll("\n", "\\n").replaceAll(",", "").replaceAll("\r", "")

		csv += date + "," + service + "," + title + "," + action + "," + point + "," + note + "\n"
	} catch (e) {
	}
}
```

スクレイピング&保存が終了した3秒後に、次の履歴ページのタブを開き、今のタブを閉じる  
```javascript
if (nextButton.innerText == "NEXT") {
	var nextUrl = nextButton.querySelector("a").href.replace("#point_history", "") + "&export=1#point_history"
	setTimeout(() => {
		window.open(nextUrl)
		window.close()
	}, 3000);
} else {
	window.alert("全履歴の保存が完了しました")
	window.close()
}
```

# まとめ
- 複数ページにわたるスクレイピングは面倒  
- 楽天ポイント履歴のCSVエクスポート機能を公式で実装してほしい
MockMvcで擬似的なForwardのテストをする

そんなん出来ないですけどね

# なぜ出来ない

MockMvcで使ってるMockRequestDispatcher.javaのforwardを見るとMockHttpServletResponseのsetForwardedUrlに渡してるわけ。
ちなみにWebTestClientもMockRequestDispatcher使ってる。

https://github.com/spring-projects/spring-framework/blob/main/spring-test/src/main/java/org/springframework/mock/web/MockRequestDispatcher.java#L55-L64
```
	@Override
	public void forward(ServletRequest request, ServletResponse response) {
		Assert.notNull(request, "Request must not be null");
		Assert.notNull(response, "Response must not be null");
		Assert.state(!response.isCommitted(), "Cannot perform forward - response is already committed");
		getMockHttpServletResponse(response).setForwardedUrl(this.resource);
		if (logger.isDebugEnabled()) {
			logger.debug("MockRequestDispatcher: forwarding to [" + this.resource + "]");
		}
	}
```

じゃあsetForwardedUrlで何してるかって言うと、URIをStringとして対比してるだけでした。

https://github.com/spring-projects/spring-framework/blob/main/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java#L816-L818

```
	public void setForwardedUrl(@Nullable String forwardedUrl) {
		this.forwardedUrl = forwardedUrl;
	}
```

文字列を持っているだけだからforwardはしないんでしょうねきっと。

# 仕方ないので擬似的にforwardする
JUnitクラスの親クラスにしょうもないメソッドを作った。
```
    protected MvcResult forwardTest(String url, HttpMethod m) throws Exception {
        // フォワード元URL実行
        MvcResult r = mockMvc.perform(this.getBuilder(url, m)
               .andExpect(status().isOk())
               .andReturn();

        // フォワードパスを取得する
        String forwardUrl = r.getResponce().getForwardUrl();

        // HTTPメソッドを取得する
        Method method = r.getResponce().getMethod();

        // フォワード先URL実行
        return forwardReturn = mockMvc.perform(this.getBuilder(forwardUrl, method) //実際はflashAttrなどでフォワード元で設定されたパラメータを渡す
               .andExpect(status().isOk())
               .andReturn();

        
    }

    private MockHttpServletRequestBuilder getBuilder(String url, HttpMethod m) {
        // HTTPメソッドごとにビルダーを作って返すような部品

    }
```

あとは好きにAssertions使ってテストを作る。
HTTPのRFCに沿ったつくりなどは意識していないのでその辺りはこのあと投稿する人がやってくれる多分。
tcconfigを使って、ネットワークの帯域制限や遅延を再現する方法

# はじめに
　tcconfigを使ってネットワーク帯域制限や遅延をソフト的に再現する方法。デバッグなどに役立つ。tcやtrickleを使う方法もあるが、tcconfigが簡単で扱いやすいためおすすめ。

# 動作確認環境
* Ubuntu 22.04

# インストール方法

　pipをインストールしていない場合は先にインストールしておく。  下記コマンドでtcconfigをインストールする。

```bash
pip install tcconfig
```

# 使い方

　各種コマンドの後に、NICデバイス名とオプションを指定する。

## 設定 (tcset)

　tcsetコマンドを使う。

```bash
tcset {nic_device}
```

### 帯域制限 (--rate)

#### 例：eth0 帯域1Mbps (アップロードのみ)

```bash
tcset eth0 --rate 1Mbps
```

#### 例：eth0 帯域1Mbps (アップロード+ダウンロード)

```bash
tcset eth0 --rate 1Mbps --direction incoming
```

:::note info
Dockerコンテナ内で、ダウンロード制限するにはコンテナ起動時に以下の設定が必要。

```bash
sudo docker run --rm -it --cap-add NET_ADMIN --net=host -v /lib/modules:/lib/modules:ro tc 
```
詳細は、[こちらの記事](https://qiita.com/_-_-_-_-_/items/dfa542bc2976ebfd5b3c)を参照。

デフォルト状態でコンテナを起動した場合、以下のエラーでダウンロードの帯域制限ができない。

```bash
[ERROR] modprobe: FATAL: Module ifb not found in directory /lib/modules/x.x.x-xx-generic
```
:::


### 遅延 (--delay)

#### 例：eth0 遅延500ms ジッター100ms(正規分布)

```bash
tcset eth0 --delay 500ms --delay-distro 100 --delay-distribution normal
```

* --delay-distro
  * 遅延の揺らぎ(ジッター)
* --delay-distribution
  * 遅延の分布
    * normal: 正規分布    

### パケットロス (--loss)

#### 例：eth0 パケットロス10%

```bash
tcset eth0 --loss 10
```

### パケット順番入れ替え (--reordering)

#### 例：eth0 パケット順序入れ替え10%

```bash
tcset eth0 --reordering 10
```

### 設定例

* NIC: eth0
* 帯域：500Kbps (アップロードのみ)
* 遅延：800ms
* 正規分布:50ms
* パケットロス：10%
* パケット順序入れ替え：10%

```bash
tcset eth0 --rate 500Kbps --delay 800ms --delay-distro 50 --delay-distribution normal --loss 10 --reordering 10
```

## 設定内容の確認 (tcshow)

```bash
tcshow {nic_device}
```

### 例：eth0

```bash
tcshow eth0
```

結果は、json形式で出力される。

```json
{
    "eth0": {
        "outgoing": {
            "protocol=ip": {
                "filter_id": "800::800",
                "delay": "800.0ms",
                "loss": "10%",
                "reorder": "10%",
                "rate": "500Kbps"
            }
        },
        "incoming": {}
    }
}
```

## 解除 (tcdel)

```bash
tcdel {nic_device}
```

### 全て解除 (--all)

#### 例：eth0 全て解除

```bash
tcdel eth0 --all
```

# まとめ
　tcconfigコマンドで、ネットワーク評価のために、帯域制御、遅延などを再現することができた。ネットワーク負荷の評価を疑似的に再現できるのでデバッグ時などに使える。

# 参考

https://github.com/thombashi/tcconfig

https://qiita.com/_-_-_-_-_/items/dfa542bc2976ebfd5b3c

https://note.com/hitoshiarakawa/n/n8c8e5f8a5bba

https://tcconfig.readthedocs.io/en/latest/pages/introduction/
Claude Artifactsの惜しいところ

## はじめに

◆この記事は何？
Calaude Artifactsを紹介する記事です

◆対象は？
Calaude Artifactsをまだ使っていない人

https://claude.ai/chats

## 先に結論
- ClaudeのArtifact機能はとても便利
    - プレビュー機能により、生成AIと一緒に成果物をつくる感覚になる
    - 改善サイクルが回るのが速い
- その上で、Pythonが実行できないのは惜しすぎる

## Claude Artifactsにできること

Artifactsはリアルタイムのプレビュー機能です。

例えば、Claudeに指示して、Reactのコードを生成しながら、画面をプレビューできます。

![スクリーンショット 2024-06-24 22.38.45.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616496/66352d02-3db6-3a55-6e0d-f92b746122e6.jpeg)

画像はToDoリストアプリを作成してみた結果ですが、画面上で実際に動かすことができます。

![スクリーンショット 2024-06-24 22.46.03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616496/76aad0a9-4207-d8a2-fdf5-e44a3104a245.jpeg)

コードの表示に切り替えることも可能です。

![スクリーンショット 2024-06-24 22.39.00.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616496/d00221db-89b5-017a-ff59-736488ccf8de.jpeg)

気に入らなければ、再び指示を出すことができます。
使ってみて感じたのは次の三つです。

1. 可視化に強い
1. 改善サイクルが回るのが速い
1. 生成AIのUXが変わった感覚

例えば、業務フローの作成などもmermaidでできます。
文章を図で表現することもできます。
とにかく可視化に強いサービスだと感じました。

次に、すぐにプレビューできるので、改善サイクルが回るスピードが速いです。
気に入らなければ、すぐに指示を出すことで再生成や改善が可能です。
次の成果物を確認する時間間隔も短く、高速で成果物が出来上がります。

結果的に、これまでの生成AIで主流だったチャットUIの体験が変わりました。
共に成果物を作成するような体験です。

## 惜しいと思ったこと

上記のように、とても良いサービスだと思ったのですが、「Pythonが実行できない」のは、とても惜しいです。

セキュリティ上、やむを得ないとは思うのですが、もしPythonが実行できて可視化できるのであれば、データ分析の体験が大きく変わると思います。

## おわりに
この記事ではClaude Artifactsを紹介しました。

参考になれば幸いです。
Azure: Azure Samples での料金節約術メモ

# 背景

Azure Samples はとても便利です。

便利なんですが、お財布には優しくなかったりします。

ってことで、節約術の記録

# 英語版デモでの　low cost 対応

以下の英語版のデモでは、お財布も気にして以下のように無償枠を利用できるようにしてくれてたりもします。
ってことで、

https://github.com/Azure-Samples/azure-search-openai-demo/blob/main/docs/deploy_lowcost.md

上記の場合、以下三点を Free で使えるようにしてくれてる。
ってことで、この辺を取り組むのも有り

- App Service
- Azure AI Search
- Azure Document Intelligence

:::note 
日本語版デモからはだいぶ乖離があるので、日本語版で Free にするのは手間かも（未調査
:::


# 日本語デモ

- Basic にするだけでも節約になります

以下のデモで、実際に変更する箇所を記録

https://github.com/Azure-Samples/jp-azureopenai-samples/tree/main

## App Service の例

```bicep: App Serivce を Basic へ @ main.bicep 
module appServicePlan 'core/host/appserviceplan.bicep' = {
  name: 'appserviceplan'
  scope: resourceGroup
  params: {
    name: !empty(appServicePlanName) ? appServicePlanName : '${abbrs.webServerFarms}${resourceToken}'
    location: location
    tags: tags
    sku: {
      name: 'S1' # ここを、'B1' で Basic 
      capacity: 1
    }
    kind: 'linux'
  }
}
```
https://github.com/Azure-Samples/jp-azureopenai-samples/blob/main/5.internal-document-search/infra/main.bicep#L122C1-L135C2


## AI Search の例

```bicep: AI Search を Basic へ @main.bicep
module searchService 'core/search/search-services.bicep' = {
  name: 'search-service'
  scope: searchServiceResourceGroup
  params: {
    name: !empty(searchServiceName) ? searchServiceName : 'gptkb-${resourceToken}'
    location: searchServiceResourceGroupLocation
    tags: tags
    authOptions: {
      aadOrApiKey: {
        aadAuthFailureMode: 'http401WithBearerChallenge'
      }
    }
    sku: {
      name: searchServiceSkuName # 'basic' へ
    }
    semanticSearch: 'free'
  }
}
```

https://github.com/Azure-Samples/jp-azureopenai-samples/blob/main/5.internal-document-search/infra/main.bicep#L237C1-L254C2

## Cosmos DB 

分けて書いてしまった・・

https://qiita.com/baku2san/items/2fd60cdc699942ea3059

# あとがき

Visual Studio Subscription Benefits の Azure 無償枠でデモを起ち上げようとしたけど、何故かデプロイが上手くいかない。
無償枠での制限なのか・・ :thinking:
forwardRefってなに？どんな時に使うの？

これどうやって使うの？どんな場面で使うのか全くわからなかったので調べました。

:::note
`forwardRef`使う場面かも？が明日からわかるようになることを目的にした記事です！
:::

## `forwardRef`ってなに？
端的に表現すると…

親コンポーネントから子コンポーネントのDOM要素やReactコンポーネントインスタンスに直接アクセスできるようになるやつ。

:::note warn
なんとなくわかった感じはするけど、いまいちピンときませんでした…
:::

Reactのドキュメントを確認しましたが…うーんという感じです…。

https://ja.react.dev/reference/react/forwardRef

### なぜ`forwardRef`が必要になるのか？

Reactの仕様で親コンポーネントから子コンポーネントにrefをpropsで渡して、props経由で受け取ったrefを子供で参照できないようになっているため`forwardRef`でを使って参照できるようにしてあげる必要があるとのことです！

この記事が一番わかりやすかったです！

https://zenn.dev/k_kazukiiiiii/articles/fa2aaab07235bb

## `forwardRef`のユースケースは？
`forwardRef`は子コンポーネントをラップすることで利用できます！

```javascript
import React, { forwardRef } from 'react';

const MyInput = forwardRef((props, ref) => {
  return <input ref={ref} {...props} />;
});

function ParentComponent() {
  const inputRef = React.useRef(null);

  const focusInput = () => {
    inputRef.current.focus();
  };

  return (
    <div>
      <MyInput ref={inputRef} placeholder="Enter text" />
      <button onClick={focusInput}>Focus Input</button>
    </div>
  );
}
```

具体的には下記のようなシーンで利用できるとのこと

- フォーム要素のカスタマイズ
    - 入力コンポーネントを作成し、親コンポーネントから直接フォーカスや値の操作したい場合
- アニメーションやトランジション
    - 子コンポーネントのDOM要素に直接アクセスして、アニメーションやトランジションを適用する場合
- 外部ライブラリとの統合
    - React以外のライブラリと統合する際に、特定のDOM要素への参照が必要な場合


## 【まとめ】`forwardRef`ってなに？

forwardRefを使用することで、より柔軟な設計が可能になりそうです！
一方で、過度に使用するとコンポーネント間の結合度が高くなる可能性あるため利用には注意が必要です…。

公式のドキュメントにも下記のように書かれています。

>refの過度な使用に注意してください。refは、propsとして表現できない、命令型の動作にのみ使用するべきです。例えば、ノードへのスクロール、ノードへのフォーカス、アニメーションのトリガ、テキストの選択などです。

>何かをpropsとして表現できる場合は、refを使用すべきではありません。例えば、Modalコンポーネントから { open, close } のような命令型のハンドルを公開するのではなく、<Modal isOpen={isOpen} /> のように、isOpen をpropsとして受け取る方が良いでしょう。命令型の動作をpropsとして公開する際にはエフェクトが役立ちます。

ユースケースから考えるとユーザビリティを改善するために利用するシーンもありそうです。
利用シーンは選んだ方が良さそうですが、このような方法があることはソリューションとして覚えておかないといけないと感じました。
C++でのポインタと参照渡しの違い

### はじめに
C++におけるポインタと参照は、どちらも他の変数（オブジェクト）を指し示すためのものであり、関数に対してデータを渡す際などに用いられます。しかし、ポインタと参照にはいくつかの重要な違いがあります。ポインタと参照渡しの違いについてまとめていきます。

### ポインタ（Pointer）

ポインタは、メモリ上の特定のアドレスを保持する変数です。ポインタを使うと、間接的にデータを操作することができます。

#### 宣言と使用

```cpp
int value = 42;
int* ptr = &value;  // ポインタ ptr は value のアドレスを保持する

std::cout << *ptr << std::endl;  // 42: ポインタを使って値を間接的に取得
```

#### 主な特徴

1. **値の変更**: ポインタが指すアドレスを変更することができます。
   ```cpp
   int value1 = 42;
   int value2 = 100;
   int* ptr = &value1;
   ptr = &value2;  // ptr は別の変数を指すようになる
   ```

2. **NULLポインタ**: ポインタはNULLまたはnullptrに設定することができ、どのオブジェクトも指さないことを示します。
   ```cpp
   int* ptr = nullptr;  // ptr は何も指していない
   ```

3. **演算**: ポインタに対して算術演算（アドレスの増減）が可能です。
   ```cpp
   int arr[3] = {1, 2, 3};
   int* ptr = arr;
   ptr++;  // ptr は次の配列要素を指すようになる
   ```

### 参照（Reference）

参照は、既存の変数の別名（エイリアス）を提供するためのものです。参照を使うと、その変数を直接操作することができます。

#### 宣言と使用

```cpp
int value = 42;
int& ref = value;  // 参照 ref は value の別名

std::cout << ref << std::endl;  // 42: 参照を使って値を取得
```

#### 主な特徴

1. **初期化の必要性**: 参照は宣言時に初期化する必要があり、後で別の変数を指すように変更することはできません。
   ```cpp
   int value1 = 42;
   int& ref = value1;
   // int& ref;  // エラー: 参照は初期化が必要
   ```

2. **NULL参照**: 参照はNULLに設定することができず、必ず有効なオブジェクトを指していなければなりません。

3. **演算不可**: 参照には算術演算を適用することができません。

### 比較

| 特徴               | ポインタ                               | 参照                               |
|--------------------|----------------------------------------|------------------------------------|
| 初期化             | 後で初期化可能                         | 宣言時に初期化が必要               |
| NULL               | NULLまたはnullptrに設定可能            | NULLに設定不可                    |
| アドレスの変更     | ポインタが指すアドレスを変更可能       | 一度初期化されたら変更不可        |
| 演算               | 算術演算が可能                         | 演算不可                          |
| 使用例             | 動的メモリアロケーション、配列操作     | 関数引数のエイリアス、返り値       |
| シンタックス       | `*` 演算子でデリファレンス            | 直接アクセス                      |

### 例

#### ポインタを使った関数

```cpp
void increment(int* ptr) {
    (*ptr)++;
}

int main() {
    int value = 42;
    increment(&value);
    std::cout << value << std::endl;  // 43
    return 0;
}
```

#### 参照を使った関数

```cpp
void increment(int& ref) {
    ref++;
}

int main() {
    int value = 42;
    increment(value);
    std::cout << value << std::endl;  // 43
    return 0;
}
```

### まとめ

ポインタと参照はどちらも他の変数を指し示すために使われますが、使い方や特性に違いがあります。ポインタはより柔軟であり、アドレス操作や動的メモリ管理に適しています。一方、参照は簡潔で安全性が高く、関数の引数や返り値として使うのに適しています。それぞれの特徴を理解し、適切な場面で使い分けることが重要です。
SSH接続と操作ログ記録を自動化するteratermマクロテンプレート

sshを自動化したかったのと、コンソール(画面)の内容をテキストで勝手に保存されておいてほしかったので、マクロテンプレートを作成しました。
コードの冒頭5箇所に値を設定すれば、あとはコピペで使えるようにしてあります。

# 参考
参考にしたのは以下のページです。

https://qiita.com/clustfe/items/e873f2216724fd7b96fc

http://ttm.jimba.ddo.jp/teraterm/030#%e3%82%b3%e3%83%bc%e3%83%89

# マクロ実装
コードをコピペして「====」で囲まれている部分(`HOSTADDR`,`PORTNUMBER`,`USERNAME`,`PASSWORD`,`LOG_DIR`)を設定すればそのまま使用できます。
`LOG_DIR`に指定した出力先へ`ttl_user_20240401-103059.log`といった名前のログファイルが生成されます。

ssh認証方式がパスワード認証である場合を想定して作成してあります。
パスワード認証以外の認証方法が必要な場合、コードを使う前に編集する必要があります。

サーバログイン(ssh接続成功)後に自動化したい処理がある場合、コード中盤の`;コマンド送信処理 ここから`の下に記入してください。良く使うディレクトリに移動したり、シェル実行をしたりすることも可能です。

```bat:ssh接続.ttl
;=====================================================================
; 接続情報を設定する
HOSTADDR = '127.0.0.1'
PORTNUMBER = '10000'
USERNAME = 'user'
PASSWORD = 'password'
; ログ出力先を指定する。末尾に\は不要
LOG_DIR = 'C:\Users\user\Documents'
;=====================================================================

; コマンドオプション組立て
COMMAND = HOSTADDR
strconcat COMMAND ':'
strconcat COMMAND PORTNUMBER
strconcat COMMAND ' /ssh /2 /auth=password /user='
strconcat COMMAND USERNAME
strconcat COMMAND ' /passwd='
strconcat COMMAND PASSWORD

; 接続
connect COMMAND
wait USERNAME

; コマンド送信処理 ここから
; ここに自動化したい初期処理を記入
;cd /opt

; コマンド送信処理 ここまで

; 日時を取得
gettime CURRENT_TIME "%Y%m%d-%H%M%S"
; ログファイル名生成とパス結合
sprintf2 FILE_NAME '%s\ttl_%s_%s.log' LOG_DIR USERNAME CURRENT_TIME

loginfo logfilename
if result == -1 then
   ; ログ取得開始
   logopen FILE_NAME 0 1 0 1 1
else
   ; ログ取得中であるため一度クローズしてからログ取得開始
   logclose
   logopen FILE_NAME 0 1 0 1 1
endif

end
```


自動化する内容やテンプレート化に向けて改良を重ねて今の形に落ち着きました。
地味に面倒だった作業を自動化できてすっきりした気持ちです。
C++の定数メンバ関数

### はじめに
定数メンバ関数（constメンバ関数）は、C++においてオブジェクトの状態を変更しないことを保証する関数です。これにより、オブジェクトの不変性を保ちながら、そのオブジェクトに関する情報を取得するための関数を提供できます。
これから定数メンバ関数について解説します。

### 基本構文

定数メンバ関数は、関数宣言の末尾に`const`キーワードを付けることで定義されます。

```cpp
class MyClass {
public:
    int getValue() const {
        return value;
    }

private:
    int value;
};
```

### 特徴と利点

1. **オブジェクトの状態を変更しない**:
    - 定数メンバ関数内では、メンバ変数の値を変更することができません。
    - 他の非constメンバ関数を呼び出すこともできません（非constメンバ関数はオブジェクトの状態を変更する可能性があるため）。

2. **constオブジェクトでの使用**:
    - 定数メンバ関数は、constオブジェクトやconst参照を通じて呼び出すことができます。非constメンバ関数はこれができません。

```cpp
void printValue(const MyClass& obj) {
    std::cout << obj.getValue() << std::endl;  // getValue()はconstメンバ関数である必要がある
}

int main() {
    MyClass obj;
    printValue(obj);
    return 0;
}
```

### メンバ変数へのアクセス

定数メンバ関数内では、メンバ変数を変更することができませんが、読み取り専用でアクセスすることは可能です。

```cpp
class MyClass {
public:
    int getValue() const {
        // valueを変更することはできない
        return value;
    }

    void setValue(int v) {
        value = v;
    }

private:
    int value;
};
```

### メンバ関数のオーバーロード

定数メンバ関数と非constメンバ関数をオーバーロードすることもできます。これにより、constオブジェクトと非constオブジェクトに対して異なる処理を提供できます。

```cpp
class MyClass {
public:
    void print() const {
        std::cout << "const print" << std::endl;
    }

    void print() {
        std::cout << "non-const print" << std::endl;
    }
};

int main() {
    MyClass obj;
    const MyClass constObj;

    obj.print();       // "non-const print" が出力される
    constObj.print();  // "const print" が出力される

    return 0;
}
```

### ミュータブル変数（mutable）

特定のメンバ変数が定数メンバ関数内でも変更可能である必要がある場合、`mutable`キーワードを使ってその変数を宣言できます。これにより、その変数はconstの制約を受けません。

```cpp
class MyClass {
public:
    int getValue() const {
        counter++;  // mutableなので変更可能
        return value;
    }

private:
    int value;
    mutable int counter;
};
```

### まとめ

定数メンバ関数は、オブジェクトの状態を変更しないことを保証する関数です。これにより、オブジェクトの不変性を保ちながら情報を取得するための手段を提供し、constオブジェクトやconst参照を通じて呼び出すことができます。また、`mutable`キーワードを使用することで、特定のメンバ変数に対する変更を許可することも可能です。定数メンバ関数は、クラス設計において安全性と柔軟性を向上させるための重要なツールです。
Unity学習記録 #002 比較演算子

# 演算子
どの言語でも比較的頻繁に使われる代表的な演算子は大きく3つ
・算術演算子（ +, -, *, /, % ... ）
・比較演算子（<, >, <=, >=, ==, !=, ...）
・論理演算子（&&, ||, !, ...）
<br>

他にも演算子があるのか軽く調べてみたところ、結構たくさんあるみたいです。
・ビット演算子（データ圧縮、暗号化などで使用される演算子）
・アドレス演算子（メモリ上のアドレスを取得するための演算子）
・参照演算子（参照型変数の値を取得するための演算子）
・キャスト演算子（型を一時的に別の型に変換するための演算子）
・他にも、スコープ演算子、アサーション演算子などなど...。

初学者がまず身に着けたい演算子は最初に記述している3つ。それぞれ中身を見てみます。
<br>

## 算術演算子
```csharp
int a = 10;
int b = 3;

Debug.log(a + b);  // 加算(plus)
Debug.log(a - b);  // 減算(minus)
Debug.log(a * b);  // 乗算(multiply)
Debug.log(a / b);  // 除算(divide)
Debug.log(a % b);  // 剰余演算(modulo)

a++;  // 前置インクリメント（aの値に1を足す）
b--;  // 前置デクリメント (bの値から1を引く)
Debug.Log(a);
Debug.Log(b);

Debug.Log(a += 1);  // 加算代入(a = a + 1 と同じ計算)
Debug.Log(b -= 3);  // 減算代入(b = b - 3 と同じ計算)

Debug.Log(-a);  //　単項マイナス（符号の反転）
```
コードで表記してみましたが、どれもよく使われる書き方です。
たくさんコードを書いているうちに、書き方は自然と身についてくると思います。
<br>

少し余談なのですが、次のコードの出力結果はどのようになると思いますか？
```csharp
int a = 4;
Debug.Log(a++);
```
実際にコードを書いていく中で、上記のようなコードを書くことはまずないと思いますが、出力結果は "4" になります。
a++ の式以降の行では 元の値に1を足した値として扱われますが、数式全体としては1が足される前の値で評価されるようです。参考までに記述しておきます。
<br>

## 比較演算子
```csharp
int a = 4;
int b = 12;

Debug.log(a == b);  // aとbが等しい → True
Debug.log(a != b);  // aとbが等しくない → True
Debug.log(a < b);  // aがbより小さい → True
Debug.log(a <= b);  // aがb以下 → True
Debug.log(a > b);  // aがbより大きい → True
Debug.log(a >= b);  // aがb以上 → True
```
比較演算子の出力結果は "True" "False" の２つです。比較した数式が正しいか、間違っているかを "True" "False" で出力します。「真偽値」や、「論理値」と表現されます。

サンプルコードでは数値を扱いましたが、比較演算子の "==" は文字列の比較でも使用できます。

この論理値は "1" と "0" で表現されることもありますが、"1" と "0" は数値です。論理値と数値は異なる型となるため、お互いを比較することはできません。（true == 1 のような比較はできないです。）ただし、if文の条件式に理論値を使用する場合は暗黙的に、true は 1 に変換され、false は 0 に変換されているようです。
<br>

## 論理演算子
```csharp
//論理積（AND）
if ("条件式１" && "条件式２")
{
    //条件式１と条件式２の両方が条件を満たした時の処理
}

//論理和（OR）
if ("条件式１" || "条件式２")
{
    //条件式１と条件式２のどちらか１つでも条件を満たした時の処理
}

//論理演算子は複数組み合わせることもできる
if ("条件式１" || "条件式２" && "条件式3")
{
    //条件式１を満たすか、または条件式２と条件式３が同時に条件を満たした時の処理
}

//論理否定
bool a = true;
bool b = !a;
```
論理演算子は条件式でよく使われる演算子です。複数の論理演算子を組み合わせることも可能ですが、条件式が長く複雑になりそうな場合は、条件を分けたほうがいい場合もあります。

論理否定は条件を反転させる場合などに使用されます。例えば、bool型の変数aの初期値を "true" とします。別途用意した変数bにaの否定を代入した場合、bの値は "true"の否定なので、"false"が代入されたことになります。
C++での純粋仮装関数

### 初めに
純粋仮想関数（pure virtual function）は、C++の抽象クラス（abstract class）を定義するために使用されます。純粋仮想関数を持つクラスはインスタンス化できず、そのクラスを基底クラスとして派生クラスで具体的な実装を提供することを期待します。
これから純粋仮装関数について解説します。

### 純粋仮想関数の定義

純粋仮想関数は次のように定義されます。関数宣言の末尾に `= 0` を付けることで、その関数が純粋仮想関数であることを示します。

```cpp
class Base {
public:
    virtual void pureVirtualFunction() = 0;  // 純粋仮想関数
};
```

### 抽象クラス

純粋仮想関数を1つ以上持つクラスは抽象クラスと呼ばれ、このクラスのオブジェクトを直接作成することはできません。派生クラスで純粋仮想関数をオーバーライドしない限り、派生クラスもまた抽象クラスになります。

### 具体的な例

以下に純粋仮想関数を使った例を示します。

```cpp
#include <iostream>

class Shape {
public:
    // 純粋仮想関数の定義
    virtual void draw() = 0;

    // 通常のメンバ関数
    void info() {
        std::cout << "This is a shape." << std::endl;
    }
};

class Circle : public Shape {
public:
    // 純粋仮想関数をオーバーライド
    void draw() override {
        std::cout << "Drawing a circle." << std::endl;
    }
};

class Square : public Shape {
public:
    // 純粋仮想関数をオーバーライド
    void draw() override {
        std::cout << "Drawing a square." << std::endl;
    }
};

int main() {
    // Shape shape; // エラー：抽象クラスのインスタンス化はできない

    Circle circle;
    Square square;

    Shape* shapes[] = { &circle, &square };

    for (Shape* shape : shapes) {
        shape->draw();  // ポリモーフィズムの使用
    }

    return 0;
}
```

### ポイント

1. **抽象クラスのインスタンス化は不可**: 抽象クラスそのもののインスタンスを作成することはできません。上記の例で `Shape shape;` としようとするとコンパイルエラーになります。

2. **派生クラスでのオーバーライド**: 派生クラスは純粋仮想関数をオーバーライドして具体的な実装を提供する必要があります。派生クラスが純粋仮想関数をオーバーライドしない場合、その派生クラスも抽象クラスとなり、インスタンス化できません。

3. **ポリモーフィズムの使用**: 基底クラスのポインタまたは参照を使って、派生クラスのオーバーライドされた関数を呼び出すことができます。上記の例では、 `Shape* shapes[]` 配列を使って `Circle` と `Square` オブジェクトの `draw` メソッドを呼び出しています。

### まとめ

純粋仮想関数は、抽象クラスを作成し、ポリモーフィズムをサポートするための重要な機能です。これにより、共通のインターフェースを定義し、派生クラスで具体的な実装を提供することができます。抽象クラスを使うことで、設計上の一貫性を保ちながら、柔軟なクラス階層を構築することが可能になります。
コマンドラインの編集に使う便利なキーコンビネーション(Ctrl + *)

# この記事を書いたきっかけ
ターミナルの操作には慣れたはずなのに、全然スマートに操作できている気がしていません。Linuxの基本コマンドを覚えるのと同時に、ターミナル操作のときに便利なショートカットキーも覚えたいと思い、今回勉強してみました。
覚えやすくするために、なぜそのショートカットキーなのかという理由の部分も併せて載せました。一回では覚えられないと思うので、忘れたときに何度も戻ってきて見直す用にまとめました。

# よく使うキーコンビネーション
## カーソルを移動させたいとき
### Ctrl + B

操作: カーソルを1文字**左**に移動
理由: "B"は"Backward"の略で、後方に移動することを示しています。

### Ctrl + F

操作: カーソルを1文字**右**に移動
理由: "F"は"Forward"の略で、前方に移動することを示しています。


## カーソル付近の文字を削除したいとき
### Ctrl + H

操作: カーソルの**左側**にある文字を削除
理由: "H"は"Hello"の"H"に由来し、"Backspace"キーと同様の動作をします。
### Ctrl + D

操作: カーソル位置にある文字を削除
理由: "D"は"Delete"の略で、削除することを示しています。

## カーソルをいっきに移動させたいとき
### Ctrl + A

操作: カーソルを行の**先頭**に移動
理由: "A"は"Beginning"の"A"に由来し、行の先頭に移動することを示しています。

### Ctrl + E

操作: カーソルを行の**末尾**に移動
理由: "E"は"End"の略で、行の末尾に移動することを示しています。

## カーソル位置からいっきに削除したいとき
### Ctrl + U

操作: カーソルから**行頭**までのテキストを削除
理由: "U"を使うのは"Unix"の慣習的な理由に由来し、行の先頭までのテキストを削除することを示しています。

### Ctrl + K

操作: カーソルから**行末**までのテキストを削除
理由: "K"は"Kill"の略で、テキストを削除することを示しています。
### Ctrl + Y

操作: 直前に削除したテキストを貼り付け
理由: "Y"は"Yank"(ひっぱる、回収する)の略で、削除したテキストを再度挿入することを示しています。
## カーソルを単語単位で移動させたいとき
### Esc(Alt) + B

操作: カーソルを単語単位で**左**に移動
理由: "B"は"Backward"の略で、単語単位で後方に移動することを示しています。
### Esc(Alt) + F


操作: カーソルを単語単位で**右**に移動
理由: "F"は"Forward"の略で、単語単位で前方に移動することを示しています。
## カーソルを単語単位で削除したいとき
### Ctrl + W

操作: カーソルの**左側**にある単語を削除
理由: "W"は"Word"の略で、単語を削除することを示しています。
### Esc(Alt) + D

操作: カーソルの**右側**にある単語を削除
理由: "D"は"Delete"の略で、単語単位で削除することを示しています。

## コマンドの履歴を表示したいとき
### Ctrl + P

操作: **前**のコマンド履歴を表示
理由: "P"は"Previous"の略で、以前のコマンドに移動することを示しています。
### Ctrl + N

操作: **次**のコマンド履歴を表示
理由: "N"は"Next"の略で、次のコマンドに移動することを示しています。
### Ctrl + R

操作: コマンド履歴を**逆検索**
理由: "R"は"Reverse search"の略で、過去のコマンドを逆方向に検索することを示しています。
## 画面をスッキリさせたいとき
### Ctrl + L

操作: 画面をクリア
理由: "L"は"Clear"の"L"に由来し、画面をクリアにすることを示しています。

## 文字を入れ替えたいとき
### Ctrl + T
操作: カーソルの前の文字とカーソルの位置の文字を入れ替え
理由: "T"は"Transpose"の略で、文字の入れ替えを示しています。

# まとめ
キーコンビネーションをたくさん書きましたが、操作自体は①移動②削除③その他の３パターンですね。
それにプラスして、方向（左右、前後）と単位（１文字、１単語、カーソル位置から全て）を意識すれば覚えやすくなると思います
正直、「Ctrl + D」しか使ったことないですが、これを機に少しずつ覚えて、快適なコマンドライン操作を実現したいです。
C++でのオーバーライド

## はじめに
C++のオーバーライド（override）は、基底クラスの仮想関数を派生クラスで再定義する際に使われる重要な概念です。オーバーライドを正しく理解し使うことで、ポリモーフィズム（多態性）を効果的に活用できます。
基本的なオーバーライドの使い方について下記に記します。

## オーバーライドの基本
オーバーライドは、基底クラスに定義された仮想関数を派生クラスで再定義することです。これにより、基底クラスのポインタや参照を使っても、実際には派生クラスの関数が呼び出されます。

#### 基本的な例

```cpp
#include <iostream>

class Base {
public:
    virtual void show() {
        std::cout << "Base class show function" << std::endl;
    }
};

class Derived : public Base {
public:
    void show() override {  // オーバーライド
        std::cout << "Derived class show function" << std::endl;
    }
};

int main() {
    Base* basePtr;
    Derived derivedObj;

    basePtr = &derivedObj;

    basePtr->show();  // "Derived class show function" が出力される

    return 0;
}
```

## オーバーライドのポイント

1. **virtualキーワード**: 基底クラスの関数には`virtual`キーワードをつけます。これにより、その関数が仮想関数であることを明示します。
2. **override指定子**: 派生クラスで関数をオーバーライドする際には、`override`指定子を使います。これにより、コンパイラはその関数が基底クラスの仮想関数を正しくオーバーライドしていることをチェックできます。
3. **関数のシグネチャ**: オーバーライドする関数は、基底クラスの関数と同じシグネチャ（引数の型や数、戻り値の型）を持つ必要があります。

#### 関数のシグネチャの一致

基底クラスと派生クラスで関数のシグネチャが一致しない場合、オーバーライドではなくオーバーロード（関数の多重定義）と見なされることがあります。例えば、引数の型や数が異なると、別の関数として扱われます。

```cpp
class Base {
public:
    virtual void show(int x) {
        std::cout << "Base class show function with int" << std::endl;
    }
};

class Derived : public Base {
public:
    void show(int x) override {  // これで正しくオーバーライドされる
        std::cout << "Derived class show function with int" << std::endl;
    }

    // void show(double x) {  // これはオーバーライドではなく、オーバーロードになる
    //     std::cout << "Derived class show function with double" << std::endl;
    // }
};
```

## その他の注意点

- **アクセス指定子**: オーバーライドする関数のアクセス指定子（public, protected, private）は基底クラスとは異なっても構いません。
- **デストラクタのオーバーライド**: 仮想デストラクタを持つことが推奨されます。これにより、基底クラスのポインタで動的に確保された派生クラスのオブジェクトが正しく解放されます。

```cpp
class Base {
public:
    virtual ~Base() {
        std::cout << "Base destructor" << std::endl;
    }
};

class Derived : public Base {
public:
    ~Derived() override {
        std::cout << "Derived destructor" << std::endl;
    }
};
```

## まとめ
オーバーライドは、C++でポリモーフィズムを実現するための重要な機能です。基底クラスの仮想関数を派生クラスで再定義することで、基底クラスのポインタや参照を通じて派生クラスの機能を呼び出すことができます。正しくオーバーライドするためには、関数のシグネチャが一致すること、`override`指定子を使うことが重要です。
Salesforceで数式（日付）を作成しよう～生年月日から今年の誕生日を表示させる方法

本橋孝昭です

今回はSalesforceの日付項目から今年の誕生日を表示させる方法を解説します


この数式項目を作成すると　日付項目から今年の誕生日を表示させることが出来るので便利です


今回は取引先責任者のBirthdate項目を使います

数式はこちら


DATE(YEAR(TODAY()),MONTH( Birthdate ),DAY(Birthdate))

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/d4c4dc9f-baa6-31f3-c7b1-0fd745e42406.png)

この数式であれば Birthdate項目に1999年6月1日と記載されていれば（今は2024年なので）数式項目には2024/6/1 と表示されます

なお、上記数式はうるう年は加味してません

うるう年を加味した数式はこちら

ADDMONTHS( Birthdate , ( YEAR( TODAY() ) - YEAR( Birthdate ) ) * 12 )

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/d14cc5da-ad43-f75a-e497-4423da57cb41.png)


※参考リンク

https://trailhead.salesforce.com/es/trailblazer-community/feed/0D54V00007KG7VySAL
正規表現について軽くまとめた

## そもそも正規表現とは
メタ文字とよばれる記号群を利用し、文字、数字などを検索・置換に特化した表現方法
（英語ではregular expressionで、regexと略される）

## メタ文字とは
正規表現で特殊な意味を持つ非アルファベット文字
[こちら](https://www.megasoft.co.jp/mifes/seiki/meta.html)に一覧があります

`\d` 半角数字1文字
`{n,m}` 直前の文字が n 文字以上、m 文字以下
`{n}` 直前の文字がちょうど n 文字
`[AB]` AまたはBが1文字
`[a-z]` aからzまでの文字

## 実例
正規表現を編集できる[オンラインエディタ](https://scriptular.com/)が便利 

必ず開始と終了に`/`（バックスラッシュ）が入ります

**電話番号**（あくまで03-0000-0000など２桁-4桁-４桁の場合）
`/\d\d-\d\d\d\d-\d\d\d\d/`

**郵便番号**
`/^[0-9]{3}-[0-9]{4}$/`

`^` は文字列の先頭であること
`[0-9]{3}` は、0-9までの数字がちょうど３文字
つまり、**0〜9の数字3桁から始まることを表す**

`[0-9]{4}$`の`$`は文字列の末尾であることを表す。
つまり、**0〜9の数字4桁で終わることを表す**

**前方一致**
`^ANNUAL`
ANNUALという文字列で始まる

**後方一致**
`RECORD$`
RECORDという文字列で終わる

余談ですが、Eメールアドレスともなるとこんな複雑な正規表現になるみたいです。
こんな正規表現を自力で書くのは現実的ではないので、既にあるもので信用できるものを利用しましょう。[ここ](https://emailregex.com/)から引用

```
(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
```

## 正規表現を使って文字列を判定する例
```
const str = "JAPAN_FOOTBALL_ASSOCIATION"
// 前方一致でJAPAN_という文字列で始まるかを判定する
const matchResult = str.match(/^JAPAN_/)

// 判定した結果、一致する場合に以下のようなデータが返ってくる
0: "JAPAN_"
groups: undefined
index: 0
input: "JAPAN_FOOTBALL_ASSOCIATION"
length: 1

// 存在しない場合は null が返ってくる
```

## まとめ
正規表現を使うときは、検索対象文字列の 「法則（パターン）」 をうまく見つけだすのが大切だそうです。
また学びがあれば追記していきます。

参考サイト
https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_expressions
https://qiita.com/jnchito/items/893c887fbf19e17d3ff9
【リハビリJS学習】瞑想アプリを作る③

JS学習のため、瞑想アプリ作成をする第三回。

↓前回はこちら

https://qiita.com/sakuc47/items/cd2f1918b674190eb5ac


### 12. CSSを調整する

```scss
// 〜中略〜
.sound-picker {
  button {
    width: 120px;
    height: 120px;
    padding: 30px;
    border: none;
    border-radius: 50%;
    &:nth-child(1) {
      background-color: #4972a1;
    }
    &:nth-child(2) {
      background-color: #a14f49;
    }
    img {
      height: 100%;
    }
  }
}
```

### 13.　`app.js`で関数を作成する
```js
// 
const app = () => {
  const song = document.querySelector('.song');
  const play = document.querySelector('.play');

  // 再生ボタンのアウトラインをアニメーション化
  const outline = document.querySelector('.moving-outline circle');
  const video = document.querySelector('.vid-container video');
  // サウンドを選択 全てのボタンを取得したいのでquerySelectorAll
  const sounds = document.querySelectorAll('.sound-picker button');
  // 時間表示
  const timeDisplay =document.querySelector('.time-display');
  // 再生ボタンの輪郭の長さを取得
  const outlineLength = outline.getTotalLength();
  console.log(outlineLength);
    // 継続時間（実際には曲全体の長さを取得するのではないので fake とする
  let fakeDuration = 600;
}
app();
```
:::note info
  const outlineLength = outline.getTotalLength();
  SVGのパスの長さを取得することができる
:::


再生ボタンの輪郭を取得できているか確認できたら`console.log`は消してOK。
![スクリーンショット 2024-06-24 21.29.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524465/5bd8e96a-a3fe-fb41-9ba4-cda294c1b2e6.png)

### 1４.　`app.js`でアニメーション化する部分の関数を作成する

``` js
    // 〜中略〜
  /* アニメーション化 */
  // stroke-dasharrayとstroke-dashoffsetを取得し、
  // それらのプロパティをアニメーション化してゼロから開始しているように見せる

  outline.style.strokeDasharray = outlineLength;
  outline.style.strokeDashoffset = outlineLength;
}

app();
```

![スクリーンショット 2024-06-24 22.10.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524465/2ea417cb-28a8-20a2-ab9c-333150ff595d.png)

このアウトラインの全長から瞑想時間に合わせてカウントダウン（長さを減らしていく？）していくイメージ💡

:::note info
strokeDasharray
  図形の輪郭線を描くのに用いるダッシュとすき間のパターンを定義する
  
    // 100pxの線・100pxのすき間の点線になる
    outline.style.strokeDasharray = 100;
:::

![スクリーンショット 2024-06-24 21.59.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524465/779a425c-49b8-0510-7cd6-2e4df0a7fe30.png)

:::note info
strokeDashoffset
  関連する破線をレンダリングするうえで、オフセットを定義する
  
    // 200pxのすき間ができる
    outline.style.strokeDashoffset = 200;

:::

![スクリーンショット 2024-06-24 22.08.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524465/355b42d9-7bae-188f-2cca-20d1b70c55e2.png)


参考：

https://developer.mozilla.org/ja/docs/Web/SVG/Attribute/stroke-dasharray

https://developer.mozilla.org/ja/docs/Web/SVG/Attribute/stroke-dashoffset


===
jsでsvgを操作したのは初めてだった！
C_TS4FI_2021 SAP Certified Associate - SAP S/4HANA 2021 for Financial Accounting対策（3/100）

【3日目】トピック 1：組織割当およびプロセス統合（3/15）

≪問題3≫
伝票タイプによって何が制御されますか。
正しい答えを3つ選択してください。
□どの勘定タイプを転記で使用できるか
□どの転記キーを転記で使用できるか
□特別会計期間への転記が許可されるか
□マイナス転記が許可されるか
□二次原価勘定への転記が許可されるか

≪解答≫
■どの勘定タイプを転記で使用できるか
□どの転記キーを転記で使用できるか
□特別会計期間への転記が許可されるか
■マイナス転記が許可されるか
■二次原価勘定への転記が許可されるか

≪解説≫
◆伝票タイプの主な設定項目には、伝票の番号範囲、転記可能な勘定タイプ、マイナス転記が可能かどうかのフラグ、参照番号とヘッダテキストの必須入力化フラグなどがあります。
◆転記可能な勘定タイプには、資産、得意先、仕入先、品目コード、総勘定元帳、二次原価の6種類がありますが、二次原価が個別に記述されている選択肢も正解と判断されます。
GitHub CodespacesでKubernetesクラスタをつくって、壊して

## はじめに

この記事は[GitHub Codespaces](https://docs.github.com/ja/codespaces/overview)を使って、「つくって、壊して、直して学ぶ Kubernetes入門」にある内容を実践する内容となっています。

参考：[つくって、壊して、直して学ぶ Kubernetes入門](https://www.shoeisha.co.jp/book/detail/9784798183961)

主な内容としては実践したときのメモを中心に書きます。（忘れやすいことなど）誤りなどがあれば書き直していく予定です。

## 環境を構築

### GitHub CodespacesでKubernetes環境を構築する

今回は以下のツールをインストールしてk8sのクラスタを作って壊します。

- 必要なツール
    - kubectl
    - kind v0.20.0 go1.22.3 linux/amd64

## GitHub Codespacesでkindをセットする

[codespaces](https://github.com/codespaces)を開きます。

Blankにある`Use this template`をクリックします。

![Screenshot 2024-06-19 at 19.20.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527543/93f2af5d-e5bc-68e5-0a59-5775b1da1240.png)

ターミナルで以下のコマンドを実行します。

```bash
go install sigs.k8s.io/kind@v0.20.0
```

実行結果

```text
go: downloading sigs.k8s.io/kind v0.20.0
go: downloading github.com/spf13/pflag v1.0.5
go: downloading github.com/spf13/cobra v1.4.0
go: downloading github.com/pkg/errors v0.9.1
go: downloading github.com/alessio/shellescape v1.4.1
go: downloading github.com/mattn/go-isatty v0.0.14
go: downloading golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c
go: downloading github.com/pelletier/go-toml v1.9.4
go: downloading github.com/BurntSushi/toml v1.0.0
go: downloading github.com/evanphx/json-patch/v5 v5.6.0
go: downloading gopkg.in/yaml.v3 v3.0.1
go: downloading sigs.k8s.io/yaml v1.3.0
go: downloading gopkg.in/yaml.v2 v2.4.0
go: downloading github.com/google/safetext v0.0.0-20220905092116-b49f7bc46da2
```

### kubectl

Codespacesにはインストールされているのでインストールされているかどうかを確認します。

```bash
kubectl version
```

実行結果

```text
Client Version: v1.30.1
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
The connection to the server localhost:8080 was refused - did you specify the right host or port?
```

## ハンズオン

セットアップが完了したので実際に実行してみましょう。

### クラスタを構築する

まずはk8sクラスタを構築します。

```bash
kind create cluster --image=kindest/node:v1.29.0
```

構築したクラスタとkubectlの接続を確認します。

```bash
kubectl cluster-info --context kind-kind
```

実行結果

```
Kubernetes control plane is running at https://127.0.0.1:43123
CoreDNS is running at https://127.0.0.1:43123/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
```

### クラスタを消す

接続確認ができたのでクラスタを消します。

```bash
kind delete cluster
```

実行結果

```text
Deleting cluster "kind" ...
Deleted nodes: ["kind-control-plane"]
```

## まとめ

今回はGitHub CodespacesでKubernetesクラスタを作成してみました。
kindが最初からインストールされていることは知らなかったので新発見でした。

次はアプリケーションを載せていきたいと思います。

## おわり
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（16/100）

【16日目】
トピック 3：SAPS/4HANAのマスタデータ（5/22）

≪問題16≫
品目BOMにおいて、選択できる明細ステータスはどれですか。
（２つ選択）
□設計
□サービス
□品質管理
□販売

≪解答≫
■設計
□サービス
□品質管理
■販売

≪解説≫
◆品目BOMの明細には、いくつかのステータス設定項目があり、以下の制御に使用されます。
（1）関連するアプリケーションエリアにおける継続処理
（2）BOM展開における明細の選択
◆明細ステータス区分が有効かどうかは、第一画面で選択したBOM用途によって決まります。
◆明細ステータス区分の内訳は以下の通りです。
（1）区分:設計関連明細
この明細が生産の機能設計を行う担当エリアに関連していることを示します。
（2）区分:生産関連明細
この明細が製造プロセスに関連していることを示します。この区分が付いた明細は計画手配にコピーされ、その後これらに対する従属所要量が計算されます。計画手配を製造指図に変換する際、これらの明細は自動的に製造指図へとコピーされます。
（3）区分:プラント保全関連明細
この明細がプラント保全手続きに関連していることを示します。プラント保全に関連した明細は、保全BOMで使用されます。
（4）区分:予備部品
予備部品としての明細を定義するためのキーです。
（5）区分:販売関連の明細
この明細が会社の販売管理エリアに関連していることを示します。例えば、選定可能品目の受注処理においては、受注に関連する明細がヘッダ品目の指図明細として表示されます。
（6）原価計算関連フラグ
作業手順内のBOM明細、作業、副作業を原価計算に算入する程度を制御します。作業指図の標準原価見積および計画原価の計算では、このフラグによって明細を原価計算に算入するかどうかが指定されます。
dockerを使ったrails環境でのletter_opnerのtimezoneの設定


# letter_opner でテスト送信をした際に

letter_opner でテスト送信をした際に送られてくるメールの
送信日時が UTC（協定世界時）でした。

## 早速プロジェクトの imtezone を日本時間に設定する

```config/application.rb

config.time_zone = 'Tokyo'
#Railsアプリケーション内部でのデフォルトのタイムゾーンを設定
config.i18n.default_locale = :ja
#Railsはデータベースに保存される時刻を日本時間で保存
```

としてコンソールで確認すると
きちんと日本時間になっています。

```
Time.now  #出力結果 =>2024-05-22 14:16:09.609170085 +0900
```

再度 letter_opner でテスト送信をしてみると
なぜか送信時間は UTC のままです。
Docker コンテナのタイムゾーンを確認して見ます。

```
docker-compose exec web date #出力結果=>Thu Jun 20 00:51:34 UTC 2024
```

"docker コンテナのシステムタイムゾーンが UTC に設定されてしまっている”

# Docker コンテナのタイムゾーン設定と letter_opener でのメール表示における問題の解決

Docker を使用してアプリケーションを開発していると、コンテナ内のシステムタイムゾーンがデフォルトで UTC（協定世界時）に設定されていることがあります。
これにより、letter_opener などのツールで表示されるメールのタイムスタンプが、日本の標準時（JST、Japan Standard Time、Tokyo タイムゾーン）とは異なることがあります。

# タイムゾーンの設定を Tokyo に変更する

## Dockerfile でタイムゾーンを設定する

下記のコマンドを dockerfile に追記します

```Dockerfile

RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
    echo "Asia/Tokyo" > /etc/timezone
```

### 補足

下記の方法を最初は試していましたが、docker のシステムタイムゾーンは変わりませんでした。

```docker-compose.yml
version: '3'
services:
  web:
    image: myapp_image
    environment:
      - TZ=Asia/Tokyo #追記


```

# letter_opener でのメール時間表示の確認

タイムゾーンの設定を変更したら、letter_opener で表示されるメールのタイムスタンプが日本時間に合わせて表示されるか確認します。
再度コンテナを起動し、メールを送信して letter_opener で確認すると、
タイムスタンプが期待通り JST になりました。

```sh
docker-compose up -d --build
```

# まとめ

Docker を使った rails 環境での timezone には、コンテナ内のシステムタイムゾーンと application 内部での timezone(config.time_zone, config.active_record.default_timezone)があることがわかりました。
Docker コンテナ内のタイムゾーンが UTC に設定されていると、letter_opener などのツールでの時間表示がずれてしまうことがあります。この記事では、Dockerfile または docker-compose.yml でタイムゾーンを Asia/Tokyo に変更する方法を紹介しました。

この設定を行うことで、開発中のコンテナ内での時間表示の不一致を解消することができました。

参考記事

[Rails のタイムゾーン設定について](https://zenn.dev/ryouzi/articles/dda18594f2dbd3)
【Azure IoTHub】primaryKeyを指定してデバイスIDを発行する方法

IoTHubにデバイスを登録する[サンプル記事](https://qiita.com/papeMK2/items/15ce4b38bb8bb4a3ab12)はいくつもあるのですが、任意のprimaryKeyを指定して生成する方法が全然見付けられなかったので記しておきます。


```cs
RegistryManager registryManager = RegistryManager.CreateFromConnectionString(connectionString);

Device device = new("デバイスID");
device.Authentication = new AuthenticationMechanism {
    SymmetricKey = new SymmetricKey {
        PrimaryKey = "プライマリキー",
        SecondaryKey = "セカンダリキー"
    }
};

Device device2 = await registryManager.AddDeviceAsync(device);
```

たったこれだけです。

これだけなのですが、なかなか見つけられずに苦労しました。
しかし一度見つけられたらそのキーワードでいくらでも検索に出てくるというね。

注意事項として、プライマリキー・セカンダリキーは必ずセットで指定する必要があります。
片方だけ指定するとエラーになります。

またキーは正しくBASE64エンコードしておく必要があります。
正しくなかったらBASE64になってないぞエラーを出してきます。

まあ、通常であればわざわざキーを指定したりせず、自動生成されたキーを使った方が安全でしょう。
【stackblitz】簡単にフロントの環境を共有できるオンラインIDE

フロント向けにオンラインIDEというものを初めて触って感動したので共有したいと思います。

# 対象

本記事は私のようなフロントエンドの開発初心者、プログラミング初心者の方を対象にしています。
（内容に間違い等あればご容赦ください）

# 本記事で紹介するオンラインIDEについて

本記事では**stackblitz**というサービスについて紹介します。

https://stackblitz.com/

無料プランでも結構利用することができ、Githubアカウントがあればログインすることが出来ます。

編集画面はこんな感じです。

![stasckblitz.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3815580/21785f14-cdcb-6060-ddb8-5b21f713491c.png)

おなじみVSCodeに雰囲気が似ているのですぐ馴染めます。

スクショはHTMLとCSSだけのプロジェクトのものですが、javascriptやTypeScript、ReactやVue.jsなど様々なフロント環境を作成できるようです。

# メリットについて

VSCodeなどのPC上で動作するものに比べ、オンラインIDEの優れている所を解説します。

## 環境構築が不要

プログラミング初心者の私にとって最も大きい壁は環境構築でした。

「コマンドプロンプトってどれ？」「環境変数って何？」「WSLって？」といった次から次へと新しい概念と戦わなくてはいけません。

フロントエンドにも長い環境構築があるとのことですが、それをスキップして試せるのは大きいです。

## 簡単にソースを共有可能

フロントのGUIはQiita等では試せないです。（方法が他に有るかもですが…）
その点、stackblitzは画面上部の「Share」からURLを貼り付けるだけで簡単に共有できます。共有ソースを見る・試すだけならログインも不要です。

### コードレビューが簡単

私のような初心者は、ソースのコードレビューをしていただくのが上達の一つの近道だと考えています。
stackblitzではGitでローカルへのcloneすら不要なので、レビュワーの負担も減りそう…と思います。

# 最後に

今後Qiitaにアウトプットしていく上で、コーディング面の学びがあれば適宜このサービスを使ってサンプルを作ってみたいなと思えました！
無料プランだったらもしかしたら今後上限等が追加されるかもしれません。フロントはこういったサイクルが早いイメージあります…
[AWS SUMMIT2024 セッションレポート] 成功する基幹システムの刷新：AWS でＺ会の迅速・柔軟な教育サービス提供を実現

# はじめに
受講セッションの個人的な所感と、メモです。
メモの内容は、誤字脱字などあるやもしれませんが、ご了承ください。

# 概要
> Ｚ会では質の⾼い教育サービスの迅速、柔軟な提供という近年の需要により、データを活⽤した個々の学習者への最適な対応が急務となりました。現在 IBM との共創を通じた基幹システムの刷新を進めています。コンテナ基盤として実績のある AWS によりスリムでクラウドネイティブな基幹システムを構築し IT とビジネス両⽅の柔軟性を向上させ、将来の成⻑に向けてシステム規模の拡⼤やデータ量の増加に備えることが AWS 選定の理由です。本講演ではＺ会と IBM の取り組み事例を通して、成功する基幹システム刷新⽅法のコツを解説します。

# 所感
教育分野、とりわけ子供たちへの、DXというのは多分我々大人社会のDXとは違ったものがあるんだろうなと、漠然と思っていました。
多分、子供達よりも、この今の環境で、どんな体制で、どんなデバイスで、どんな教育をするのか、大人の方が戸惑うことの方が多いんだろうな。

小学校でも、GIGA端末を用いて自宅学習とか行われていますが、
話に出ていたAISpeakingのような、中々自宅では実施しづらい充実した英会話など、まさに適しているなと感じました、

そういった教育現場のDXに伴い、それを支える基幹システムが耐えられなくなっていく。
そういった中で、AWSの利用へ進んでいく、変化をしていく選択は必然だったんだろうなぁ。

# 聴講メモ

## 教育の分野においても DX が進み変化している

- 1人一台の PC、タブレットなど。
- GIGA から Next GIGA へ。

### AISpeaking
- AIとの対話学習。

---

## 基幹システムの課題
- オペレーション志向。
- モノリシックなアーキテクチャ。
- サービスごとにサイロ化したシステムが乱立。
  - 導入、拡張、最新技術へのアップデートが困難。
  - リソースとコストの増大。

### 解決策
- 10−20年戦える柔軟なシステム。
- 活用を見据えたデータモデリング。
- マイクロサービス。
  - **AWS**に移行。
  - OpenShiftを採用。

### なぜ AWS を選択したか
- 継続性。
- 経済性。
- リーディングカンパニーの知見。

### システム移行の目的
システム移行が目的ではなく、それによるビジネス促進が目的。

# 関連
- [AWS SUMMIT2024 参加レポート](https://qiita.com/yukiMiyoshi_fcafe/items/220bf886aa94ea552d3e)