OmniAICreator/Qiita-1.07M huggingface dataset:
is 演算子と == 演算子の違い


# `is` 演算子と `==` 演算子の違い

Python では、`is` 演算子と `==` 演算子が異なる目的で使用されます。
## `is` 演算子
- `is` 演算子は、**オブジェクトの同一性**を比較します。すなわち、二つのオブジェクトが**同じメモリの場所に存在するか**を確認します。
- 主に、変数が同じオブジェクトを指しているかどうかを調べるために使います。
  
### 例
```python
a = [1, 2, 3]
b = a
c = [1, 2, 3]

print(a is b)  # True - `a` と `b` は同じオブジェクトを指している
print(a is c)  # False - `a` と `c` は異なるオブジェクト
```

- ここでは、`a is b` は `True` ですが、`a is c` は `False` になります。なぜなら、`a` と `b` は同じリストオブジェクトを指しており、`a` と `c` は内容は同じですが異なるオブジェクトだからです。

## `==` 演算子
- `==` 演算子は、**オブジェクトの値**を比較します。つまり、二つのオブジェクトの**内容が等しいかどうか**を確認します。
  
### 例
```python
a = [1, 2, 3]
b = a
c = [1, 2, 3]

print(a == b)  # True - `a` と `b` は同じ内容を持つ
print(a == c)  # True - `a` と `c` は同じ内容を持つが、オブジェクトは異なる
```

- ここでは、`a == b` と `a == c` はどちらも `True` です。なぜなら、`a` と `c` は内容が同じだからです。

## 違いのまとめ
- `is` はオブジェクトの同一性を比較します（同じメモリ場所にあるか）。
- `==` はオブジェクトの値を比較します（内容が同じか）。

## いつ使うか？
- **`is`** は、変数が同じオブジェクトを指しているかどうかを確認したい場合に使用します。例えば、`None` との比較でよく使われます。
  
  ```python
  a = None
  if a is None:
      print("a は None です")
  ```
  
- **`==`** は、オブジェクトの内容が等しいかどうかを調べたい場合に使用します。

  ```python
  a = [1, 2, 3]
  b = [1, 2, 3]
  if a == b:
      print("a と b は同じ内容です")
  ```
SayoDevice 概要

# SayoDevice 概要

`SayoDevice` は、`QMKファームウェア` を搭載したキーボードの設定を行うためのソフトウェアです。

- **QMKファームウェア (Quantum Mechanical Keyboard Firmware)**  
  オープンソースのキーボードファームウェア。詳細はこちら: [QMK Firmware GitHub](https://github.com/qmk/qmk_firmware)

SayoDevice 対応ハードウェアは、SayoDevice を用いて設定が可能です。

## SayoDevice ソフトウェアの種類

SayoDevice には以下の種類があります：  

- **Web版**（推奨）  
  - [SayoDevice Web版](https://app.sayodevice.com/home)  
  - 推奨ブラウザ: Chrome または Edge  

- **オフライン版** (V3, V2)
  
  - オフライン版は「Desktop App」とも呼ばれます
  - 基本的に新しいバージョンである V3 を利用

参考: 詳細な利用ガイド: [SayoDevice マニュアル](https://manual.sayodevice.com/#/en/docs/std/README)

**注意:** 一部の高度な設定にはオフライン版の利用が必要です。

## SayoDevice Web版

最も簡単な利用方法は、[SayoDevice Web版](https://app.sayodevice.com/home) サイトにChromeでアクセスして利用する方法です。

- この SayoDevice Web版のソースコードは次の GitHub リポジトリのようです: [SayoDevice Web版ソースコード(v1ブランチ)](https://github.com/Sayobot/sayo-device-web-hid/tree/v1)
- [このソースコード](https://github.com/Sayobot/sayo-device-web-hid/tree/v1)はビルドしてローカルで実行させることが可能なようです
    - `main` ブランチではなく `v1` ブランチが対象である点に注意

### 参考: 2024/12/30時点のWebとGitHubブランチのタイムスタンプ比較

- v1ブランチの最終コミット: 2023/10/06
- sayodevice.com サイトのコンテンツの最終更新: 2023/11/08

## SayoDevice 対応ハードウェアを利用する利点

- 専用ソフトウェアをローカル PC にインストールする必要がない
    - Webブラウザの `WebHID` 仕様により実現される
- QMK ファームウェアにより、追加ドライバが不要
    - ハードウェアは OS からは `HID キーボードデバイス` などとして認識される
- 簡単かつ柔軟なキーボード設定が可能

### SayoDevice 対応ハードウェアの例

![SD_2x6F_RGB_8_32905_92.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105739/1bbcdda6-0fe6-d59c-0775-e91bb22e376a.jpeg)

- BTXETUEL 12キーメカニカルゲーミングキーボード

## SayoDevice の実際の利用例

SayoDevice 対応ハードウェアを SayoDevice Web版 から確認した時のメモ。

- [SayoDevice 2x6F RGB, PID:8, VID:32905](https://qiita.com/igapyon/items/f0e0437e47527a846740)
- [SayoDevice O2L RGB, PID:3, VID:32905](https://qiita.com/igapyon/items/605f98b60e63998243b9)
出力したCSVがExcelで文字化けバグ！検証と対処法との備忘録

csvファイルを出力して、Excelで見ると文字化けしてしまった🥲

## 先に結論
csvファイルの文字コードを
- Macなら `UTF-8 with BOM` にする！
- Windowsなら `Shift JIS` にする！
- （少なくともMacユーザー→Macユーザーへ）Slackで`UTF-8 with BOM`を送付すると、`BOM`が消滅して`UTF-8`に変換される

## 原因と解決法の調査

まず、作成しているアプリでは、データをcsvファイルとしてダウンロードする機能を実装していたが、そのファイルをExcelで開くと文字化けしてしまっていた。ガビーン

調べると、Excelでは文字コードが`UTF-8 with BOM`か`Shift JIS`ではないと文字化けすることがわかった！

（アプリで出力するcsvファイルの文字コードは `UTF-8` だった）

### MacでBOM付きファイルを生成する

上記の調査が正しいか検証するために、試しに`UTF-8 with BOM`のファイルを生成したかったが、MacのVSCodeではできなかった。おそらくWindowsならできるのかも。

Macだと「[CotEditor](https://coteditor.com)」で`UTF-8 with BOM`に変換できた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2275224/783bd804-a4a0-00b1-ba2a-899f74214bee.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2275224/92bcf2a4-c5f2-4f13-b6da-be75ae91e508.png)

BOM付きに変換したcsvファイルでweb版のExcelを開くと、文字化けが直っていた！🎉

### BOM付きファイルの罠

web版での検証だったので、念のためMacユーザーだけどdesktop版のExcelアプリを持っている人BOM付きCSVファイルをSlackで送付して確認してもらった。

すると、なんとまだ文字化けしたままだった🥲

さらに原因を特定するために、

1. UTF-8のcsvファイル
1. CotEditorでBOM付きに変換したファイル
1. 自作したアプリ上でBOM付きに変換したファイル
1. Shift JIS に変換したファイル

を用意して、Windowsユーザーの方にweb版とdesktop版のエクセルそれぞれで見てもらった。

結果は、「Shift JIS に変換したファイル」のみ文字化けが直っていた。

---

さらにさらに原因を特定するために、

windowsユーザーの方に上記の4つのファイルの文字コードをVSCodeで確認してもらったところ、

1. UTF-8のcsvファイル: `UTF-8`
1. CotEditorでBOM付きに変換したファイル: `UTF-8` ←❗️
1. 自作したアプリ上でBOM付きに変換したファイル: `UTF-8` ←❗️
1. Shift JIS に変換したファイル: `Shift JIS`

となっていた...!!

なんで、2と3も`UTF-8`なんじゃ...？？？

---

そこで、相手のPC上で`UTF-8 with BOM`のcsvファイルを作成してもらって、VSCodeで文字コードを確認すると、`UTF-8 with BOM`にちゃんとなっていた！

その`UTF-8 with BOM`のcsvファイルをweb版とdesktop版のExcelで開くと、文字化けが直っていた！！

## もしや、Slackで`UTF-8 with BOM`ファイルを送信すると`BOM`が消える？？

上記の検証結果から推測するに、`UTF-8 with BOM`ファイルならちゃんと文字化けは直るが、スSlackで送付してダウンロードしたファイルは`BOM`が消失する（少なくともMacユーザーの場合）。

2人のMacユーザーにSlackで`UTF-8 with BOM`ファイルを送信して、文字コードを確認するとやはり`UTF-8`の`BOM`無しになっていた！

## 結論：BOMは消えることがある

上記の検証から、少なくともMacユーザー→MacユーザーへSlackでファイルを送付し、ダウンロードしてもらうとBOMが消えることが判明しました。

アプリをデプロイし、Windowsユーザーの人にアプリ上からBOM付き変換処理をしたCSVファイルをダウンロードしてもらうと、ちゃんとExcelでの文字化けは直っていました🎊

## ヌギーのSNS（連絡先など）
- [Twitterのアカウント](https://twitter.com/ask_nugey)
- [ブログ（Ask Nuegy）](https://ask-nugey.com)
- [GitHubのアカウント](https://github.com/ask-nugey)
- [Zennのアカウント](https://zenn.dev/ask_nugey)
- [マシュマロ（ヌギーに質問があれば匿名でなんでも聞けるよ）](marshmallow-qa.com/bw99ezhmow42xg9)
クロージャ

## はじめに
初見で```{ $0.count }```とか出てきて驚いた。
```引数の型```、```戻り値の型```、```return```、```引数名```が徐々に省略されていって、```{ $0.count }```になるらしい。
## クロージャ（≒名前のない処理のまとまり）
```swift
{ (引数名1: 型, 引数名2: 型...) -> 戻り値の型 in
     クロージャの実行時に実行される文
     必要に応じてreturn文で戻り値を返却する
 }
```
>石川 洋資; 西山 勇世. ［増補改訂第3版］Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 WEB+DB PRESS plus (Japanese Edition) (pp. 255-256). 株式会社技術評論社. Kindle Edition. 

### 省略前
```swift
var closure: (String) -> Int

closure = { (str: String) -> Int in  
    return str.count
}

closure("abc") // 結果: 3
```

### 戻り値の型```-> Int```を省略
```swift
closure = { (str: String) in  
    return str.count
}

closure("abc") // 結果: 3
```

### 引数の型```: String```を省略
```swift
closure = { str in  
    return str.count
}

closure("abc") // 結果: 3
```

### ```return```を省略
```swift
closure = { str in  
    str.count
}

closure("abc") // 結果: 3
```

### 引数名```str```を省略（簡略引数名を使用）
```swift
closure = { $0.count }

closure("abc") // 結果: 3
```
:::note info
簡素引数名
#### 簡素引数名を使わない場合
・引数 a と b に名前を付けています。
・名前を使うことで、クロージャ内で引数を扱います。
```swift
let add = { (a: Int, b: Int) -> Int in
    return a + b
}

let result = add(3, 5) // 結果は8
```
#### 簡素引数名を使う場合
・変更点
引数名 (a: Int, b: Int) を削除。
代わりに $0（最初の引数）と $1（2番目の引数）を使っています。
```swift
let add = { $0 + $1 }

let result = add(3, 5) // 結果は8
```
:::
ゲームボーイ RGBDS 開発メモ 第5回 チュートリアルを読んでいく パート2

### Getting started

パート２ではアルカノイドのようなゲームをつくっていくみたいですが、チュートリアルが未完成のようです（笑）とりあえずできるところまで読んでいきます。また、ソースファイルはなく、記事から自分でファイルを作成していくようです。

最初のタイルとタイルマップのデータをコピーして表示させるところは、パート1のHello worldと全く同じなのですんなりかけました。

```
WaitVBlank:
    ld a, [rLY]
    cp 144
    jp c, WaitVBlank
```

こちらのコードもHello worldにありましたが、調べてみると LYレジスタに現在表示している行番号が入っており、終了すると144になるようです。ゲームボーイの解像度が縦144ドットで、0 から 143 のときは表示中とのことで、納得です。LCDの表示が終了してからLCDをオフにし、VRAMに表示すべきものをコピーしてからオンにするという流れのようです。

ためしに永久ループへ入る前に

```
    ld a, 0
    ld [rLCDC], a
```

を入れてみると非表示となりました（これが自分で書いたアセンブラ初コードです！）

データをdbではなくdwで表現する方法も記載されていました。

タイルマップやタイルのデータを外部ファイルにする方法もあるのでしょうか（あとでしらべる）

![スクリーンショット 2024-12-30 15.19.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733735/927a0f65-2bac-fc48-fad3-2330b25640a3.png)



### 次回

次回はいよいよスプライト（オブジェクトというらしい）です。ゲーム開発といったらスプライトのイメージがありましたので、楽しみです！
AWS Amplify が Next.js 15、React 19 に対応

## はじめに

Amplify Hosting は以前から Next.js 15 をサポートしていましたが、Amplify JS ライブラリや Amplify UI を利用できませんでした。

そのため、実質的には Amplify で Next.js 15 は使えない状況でした。

Amplify JS が Next.js 15 をサポートし、 Amplify UI も React 19 をサポートしたため、ようやく本格的に Amplify で Next.js 15 が利用できるようになりました。

## Next.js 15 への移行の利点

分かりやすい利点は以下でしょう。

### React 19 のサポート
個人的には `use` `useActionState` などを使えるのがありがたいです。
React 19 の新機能については、以下の記事などですでにまとめられています。

https://qiita.com/tsuyuni/items/751558b646a5c98bbaf0

### ESLint 9 のサポート
ESLint 8 がすでに EOL を迎えているため、9 のサポートを要望する声が、以前から多かったです。

### Form コンポーネントの登場
簡単に言うと従来の `<form>` コンポーネントまわりの実装が簡単になります。
以下の記事が分かりやすいです。

https://dev.classmethod.jp/articles/nextjs-v15-next-form/

### その他の変更点
他にも Next.js 15 では以下のような変更点があります。

- **@next/codemod CLI**: 最新のNext.jsおよびReactバージョンへのアップグレードを簡単にするCLIツール。
- **非同期リクエストAPI**（破壊的変更）: 簡素化されたレンダリングとキャッシュモデルへの段階的な移行。
- **キャッシュのセマンティクス**（破壊的変更）: fetchリクエスト、GETルートハンドラー、およびクライアント- ナビゲーションがデフォルトでキャッシュされなくなりました。
- **Turbopack開発（安定版）**: パフォーマンスと安定性の向上。
- **静的インジケーター**: 開発中に静的ルートを表示する新しいビジュアルインジケーター。
- **unstable_after API（実験的）**: レスポンスのストリーミングが完了した後にコードを実行するAPI。
- **instrumentation.js API（安定版）**: サーバーライフサイクルの可観測性を提供する新しいAPI。
- **next.config.ts**: next.config.tsでのTypeScriptサポート。
- **セルフホスティングの改善**: Cache-Controlヘッダーの制御を強化。
- **サーバーアクションのセキュリティ**: 推測不可能なエンドポイントと未使用アクションの削除。
- **外部パッケージのバンドル（安定版）**: AppおよびPages Router用の新しい設定オプション。
- **開発およびビルドのパフォーマンス**: ビルド時間の短縮および高速なFast Refreshを実現。

## まとめ
Amplify JS と Amplify UI が最新の React 19 と Next.js 15 に対応したことで、ようやく Amplify 環境で Next.js 15 をフル活用できるようになりました。

Next.js 15 への移行は、プロジェクトの効率と生産性を上げる絶好の機会です。
新機能を活用し、モダンな開発体験を楽しみましょう！

## 追記
### 2025/1/1
FileUploader など、一部のコンポーネントを使用するとエラーが発生します。
下記の issue に報告したところ、バグとして修正対応してくれるようです。

https://github.com/aws-amplify/amplify-ui/issues/6275

その他にもバグが残っている可能性があるため、使用の際はご注意ください。

### 2025/1/7
残念ながら上記のバグ等が原因で、[React 19 のサポートがロールバックされました](https://github.com/aws-amplify/amplify-ui/issues/6275#issuecomment-2569944644)。
再サポートがいつになるかは現時点で不明ですが、バグの原因を見る限りそう遠くはないと思います。

### 2025/1/19
v6.9.0 で[再度サポートされました](https://github.com/aws-amplify/amplify-ui/pull/6296)。
qiskitで量子もつれ 

# 概要
量子もつれが、分からないので、copilotに聞いてみた。
qiskitで実験してみた。

# 環境
windows11
wsl1
ubuntu22
qiskit                 1.3.1
qiskit-aer             0.15.1
qiskit-ibm-runtime     0.34.0




# 巷のqiskitコード
シミュレータを準備する際に、シミュレータオブジェクト(Aer)からバックエンドオブジェクトを得る。構築回路の実行時、実行関数(execute)にバックエンドオブジェクトを伝える。
```
from qiskit import QuantumCircuit, Aer, execute <- これは、動かん。
	backend = Aer.get_backend('qasm_simulator')
	job = execute(qc, backend, shots = 1024)
	result = job.result()
```


# 新qiskitでは、こうする。
providerオブジェクトからシミュレータを指定してproviderオブジェクトを得て、このproviderオブジェクトからバックエンド情報を得る。バックエンドオブジェクトを使ってシミュレータを動かす。
```
from qiskit import QuantumCircuit
from qiskit_aer import AerSimulator
	backend = AerSimulator()
	job = backend.run([qc], shots = 1024)
	result = job.result()
```



# サンプルコード
量子もつれ
```
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
from qiskit_aer import AerSimulator
from qiskit.circuit.library import UnitaryGate

qc = QuantumCircuit(2, 2)
qc.h(0)
qc.cx(0, 1)
qc.measure([0, 1], [0, 1])
#qc.draw('mpl')

#simulator = AerSimulator()
#result = execute(qc, simulator, shots=1024).result()
#counts = result.get_counts(qc)
#print(counts)
#plot_histogram(counts)

from qiskit.primitives import StatevectorSampler as Sampler
sampler = Sampler()
job = sampler.run([qc], shots=100)
result = job.result()
#pub_result = result[0]
#print(f" > Counts: {pub_result.data.meas.get_counts()}")

counts = result[0].data.c.get_counts()
print(f" > Counts: {counts}")



```

# 実行結果

```
$ python3 test0.py
 > Counts: {'11': 58, '00': 42}
$ python3 test0.py
 > Counts: {'11': 56, '00': 44}
```

以上。
相手に伝わりやすい質問をするためのフォーマット

### フォーマット1：シンプルで直観的な形式

```
**質問内容:** 〇〇について教えてください。

**私の状況:**
* 私は今、〇〇をしています。
* 具体的には、〇〇を行っています。

**困っていること:**
* 〇〇がうまくいきません。
* 〇〇というエラーが出ています。

**調べてみたこと:**
* 〇〇を調べてみましたが、〇〇が分かりません。
* 〇〇という資料も参考にしました。

**知りたいこと:**
* 〇〇について詳しく教えてください。
* 〇〇を行うには、どうすればよいでしょうか。
```

### フォーマット2：詳細な情報提供を促す形式
```
1. 〇〇について教えてほしいのですが、よろしいでしょうか？
2. 現在の状況は、〇〇です。（具体的に）
3. 困っている点は、〇〇です。（具体的に）
4. これまで、〇〇を調べて〇〇という情報を得ました。
5. しかし、〇〇の部分が理解できません。
6. 〇〇について、より詳しく教えていただけますでしょうか？

**補足情報:**
* 関係するエラーメッセージ：〇〇
* 使用しているツールや環境：〇〇
* 既に試したこと：〇〇
```

### フォーマット3：問題解決に焦点を当てた形式

```
**問題:**
〇〇という問題に直面しています。

**状況:**
* 〇〇を行っている際、〇〇という状況が発生しました。
* 〇〇というエラーメッセージが表示されます。

**試したこと:**
* 〇〇を試しましたが、解決しませんでした。

**質問:**
* この問題を解決するには、どうすればよいでしょうか？
* 〇〇という可能性はありますか？
```

### フォーマットを活用する際のポイント


具体的に説明する: なるべく具体的な言葉で説明することで、より的確な回答が得られます。
エラーメッセージを提示する: エラーメッセージは、問題解決のヒントになります。
試したことを伝える: 既に試したことを伝えることで、重複した回答を防ぎます。
質問を簡潔にする: 複数の質問をまとめてしまうと、回答が分散してしまう可能性があります。
データベースのきほん #5-DBMS を操作するときの基本知識

こんにちは、4年目エンジニアの nakaSay です。

本記事では「データベースのきほん」という書籍の内容をかい摘み、いくつかのパートに分けて記事を投稿しています。
本書籍は入門書であり、記事では以下のような内容を取り上げる予定です。気になった方は是非気軽にお立ち寄りください。

1. [データベースの全体像](https://qiita.com/nakaSay/items/2bfec4e0b56e2032db40)
1. [リレーショナルデータベースとは](https://qiita.com/nakaSay/items/a154bc026a13b2f9e256)
1. [データベースに関わるお金の話](https://qiita.com/nakaSay/items/d065b52c6fe55ba3070a)
1. [データベースとアーキテクチャ構成](https://qiita.com/nakaSay/items/a96293ce85f7e92766f0)
1. [DBMS を操作するときの基本知識](#mysqlとコネクションを作る)
1. [SQL文の基本](https://qiita.com/nakaSay/items/86c49eec04e6e6748c9e)
1. [トランザクションと同時実行制御](https://qiita.com/nakaSay/items/df1073b0ed73d5389e60)
1. [テーブル設計の基礎](https://qiita.com/nakaSay/items/5b157c24f2237981592a)
1. [バックアップとリカバリ](https://qiita.com/nakaSay/items/cd6239ae500594b0784e)

# MySQLとコネクションを作る
ここでは、MySQL を例に DBMS を操作する際の基本知識について説明をしていきます。

まず、DBMSに対してコマンド入力をして操作するためには、ログインが必要です。
MySQL ではログインに成功すると「mysql>」という文字列が表示されますが、これは「プロンプト（prompt）」と言われ、ユーザーからのコマンド入力を受付可能な状態であることを示しています。

上記のように、ログインによる接続を「コネクション（connection）」と呼びます。
コネクションが確立されてから様々なやりとりをするわけですが、このやりとりの開始から終了までを「セッション（session）」と呼びます。
コネクションとセッションは似た概念ですが、コネクションが確立した上にセッションが作られる、という関係があります。

# SQLと管理コマンドの違い

RDBのデータを操作するためにSQLという言語が用意されていますが、実はDBMSはSQL以外の様々な用途のコマンドを用意しています。
MySQLを例に挙げると、
```
show status like 'Threads_connected'
- コネクションの数

show status like 'Uptime'
- MySQLが起動してからの経過時間

show status like 'Queries'
- MySQLが実行したSQL分の数
```

上記のように、データを操作する以外にDBMSの情報を取得したりするようなコマンドをここでは管理コマンドと表現します。

# RDBの階層

ユーザーはDBMSを通じてデータベース内のテーブルを操作することができますが、実は内部的にはいくつか階層に分かれてデータが管理されています。

1. インスタンス
    1. DBMSが動く単位で、物理的な概念。OSからはプロセスとしてん見えており、メモリやCPUを消費する実体として捉えられる
1. データベース
    1. インスタンス配下の階層
1. スキーマ
    1. データベース配下の階層。テーブルを格納するフォルダのようなもの
1. テーブル

少しややこしい点として、MySQL など一部が省略されている DBMS も存在しています。
例えば MySQL ではデータベース階層が存在しておらず、インスタンス配下にスキーマが属しています。
なので、Postgress に慣れ親しんだ人が MySQL に触れると、その階層構造に違和感を感じるということも珍しくありません。

## まとめ
- データベースを操作するためには、「ログイン」が必要
- ログインに成功すると、コネクションが確立されセッションが作られる
- データベースの操作するコマンドに、SQL以外の管理コマンドがある
- DBMSの階層は上からインスタン、データベース、スキーマ、テーブルとなっている
- MySQLなど一部の階層が省略されているものもある

## 参考

https://www.shoeisha.co.jp/book/detail/9784798135168
nandgameでOS作ってみよう　#1

# サイト
https://nandgame.com/

# 前回とか
https://qiita.com/yamina-Tjatmg-Gui-Creater/items/d21d7ab2065663d9dde2

# OSでは何を作る？
まずは数を二倍にするものを作っていきたいので、関数の作り方を定めます。

```
init.stack

#引数
push.value 5
#処理
goto numx2
#リターン後の場所
numx2_return:

goto end

numx2:

goto numx2_return

end:
```

これで関数を作れました

## 二倍する関数を作る
後は二倍する関数を作ります

```math
2x=x+x
```
なので、
こんなものを作りました
```
init.stack

push.value 5
goto numx2
numx2_return:

goto end

numx2:
pop.d
push.d
push.d
add
goto numx2_return

end:
```

numx2の所に引数を増やして足すコードを書くことで二倍できるようになりました！


# 次回とかまとめ
https://qiita.com/yamina-Tjatmg-Gui-Creater/items/d21d7ab2065663d9dde2
緑によるABC386振り返り


# 初めに

最近愛用していた、manajaro linuxを間違えて壊してしまいました(なーにをやっているんだか)
理由は、最強のパッケージマネージャnixでpypyがビルドできなかったので壊れたと勘違いし、パーティションを消し去ってしまいました。

でこの記事を書いている環境は、linuxをインストールし直してarchlinuxで書いています(インストールの難しさ、No.1で草)

archlinuxのインストールの難しさは、[こちら](https://wiki.archlinux.jp/index.php/%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%AC%E3%82%A4%E3%83%89)を見ていただくとよくわかるはずです。

別の話してすみません

えーはい、3完、茶パフォ、-17でした。
原因は、Cで手こずったのと(3ペナ)、Dの考察ミスってこのような結果になりました。
でD飛ばして、EやればギリACできたかなーと思うと、今年最後のコンテストなのに、情けないです。

さて一問ずつ振り返り書きますか

**使っているライブラリ**

trie木のライブラリを追加しました。
あとは、変更ありません。

[レポジトリ](https://github.com/hidehic0/library)

**筆者のdotfiles(宣伝)**
[レポジトリ](https://github.com/hidehic0/dotfiles)

# [A問題](https://atcoder.jp/contests/abc386/tasks/abc386_a)
4枚のカードが与えられるので、好きな一枚を追加した、フルハウスになるか答えてください
的な問題だったから、普通に出てきた回数を求めてそれで、フルハウスになるか判定すればいい

少しコードが長くなってしまいました

ACコード(ライブラリ抜粋)
```py
L = il()

d = defaultdict(int)

for i in L:
    d[i] += 1

if not len(d.values()) == 2:
    print("No")
    exit()

if (min(d.values()) == 1 and max(d.values()) == 3) or (
    min(d.values()) == 2 and min(d.values()) == 2
):
    print("Yes")
else:
    print("No")
```

# [B問題](https://atcoder.jp/contests/abc386/tasks/abc386_b)
00、1~9のボタンがあるから、目的の文字列にするために、最小の入力回数を求めてください
って感じだった。
個人的にAより簡単だった気がする
特にpython勢にとっては、やりやすかったかも
replaseメソッドを使って0を0に置き換えればOK
そしてその長さを出力すればいい。

コードゴルフできそう、結果37byte

ACコード(コードゴルフver)
```py
print(len(input().replace("00","0")))
```

# [C問題](https://atcoder.jp/contests/abc386/tasks/abc386_c)
一文字、置き換えか、削除か、任意の場所に挿入して、SとTが一緒になればいい

とりあえず、文字数の差が、2以上だったら、打ち切る
文字数が同じ場合は、差が1以下だったらYes、それ以外だったらNoで打ち切る
そして、削除と追加どちらも書くと、めんどくさいので、削除だけやる。

Sの文字数が、Tの文字数より大きい場合は、SとTを入れ替える
SとTのTの文字数-1までが同じだったら、Yesで打ち切り、RE対策
であとは普通に削除動作のシミュレーションをすればいい

実装をバグらせたりして3ペナ食らって、レートの被害が増大した

ACコード(ライブラリ抜粋)
```py
ii()
S = s()
T = s()

if abs(len(S) - len(T)) >= 2:
    print("No")
    exit()


if len(S) == len(T):
    count = 0
    for i in range(len(S)):
        if S[i] != T[i]:
            count += 1

    if count <= 1:
        print("Yes")
    else:
        print("No")

    exit()

if len(S) > len(T):
    S, T = T, S

if S == T[:-1]:
    print("Yes")
    exit()

flag = False
i = 0

for cur in range(len(T)):
    if T[cur] != S[i]:
        if flag:
            print("No")
            exit()

        flag = True
    else:
        i += 1

print("Yes")
```

# [D問題](https://atcoder.jp/contests/abc386/tasks/abc386_d)
白のa,bが黒のc,dが$a<=c$と$b<=d$が一つでも成り立てばNo、それ以外ならYesと終了5分ぐらい前に気づいたけど、実装方法がよくわからずACできなかった
公式解説を見てなるほどって思った

# [E問題](https://atcoder.jp/contests/abc386/tasks/abc386_d)
$K <= N-K$の場合は、普通に選ぶで、$K >= N-K$の場合は、除外するのを選ぶ
なるほど

# 最後に
ここ2週間の精進方法を間違っていたと痛感しました。
ピンポイントで水diffの問題を解くんじゃなくて、安定して緑diffが解けるようになるのがいいと、思いました。
まだ僕は水diffの問題の解ける知識はdpぐらいしか持ってないのです

最後まで見ていただきありがとうございました。
React : プロジェクト作成

# はじめに
最近Reactの学習を行っています。
そのため、プロジェクトを作成することが多いですが、意外と忘れがちなので作成方法を備忘録がわりに記載します。

# 方法1
プロジェクトを作成したいディレクトリをカレントディレクトリにして、以下コマンドを実行します。
```
npx create-react-app <プロジェクト名>
```

上記コマンドを実行すると、package.jsonというファイルが作成されます。このファイルはプロジェクト内のライブラリなどをインストールした際に情報が書き込まれていくファイルです。package.jsonこそがプロジェクトの核となるファイルといえます。そして、package,jsonのファイルがある階層をカレントディレクトリに設定して以下コマンドを実行していください。

```
npm start
```

これでlocalhostとしてwebアプリが実行されます。

エラーとして以下が出力されかもしれません。
```
Module not found: Error: Can't resolve 'web-vitals' in 'xxxx\src'
```
以下に解決方法が記載されています。

[Module not found: Error: Can't resolve 'web-vitals' in '/app/src'](https://stackoverflow.com/questions/72545201/module-not-found-error-cant-resolve-web-vitals-in-app-src)

以下コマンドを実行すれば解決します。
```
npm install --save-dev web-vitals
```

要はweb-vitalsというライブラリをインストールしていないことが問題なのです。

# 方法2
方法2では、``Vite``というビルドツールを使った方法を紹介します。方法1の`create-react-app`は少し古く、現在は`Vite`を用いた方法が一般的です。

下記コマンドを実行することでプロジェクトを作成することができます。
```
npm create vite@latest <プロジェクト名>
```

また、package.jsonの`scripts`プロパティに記載されていると思いますが、開発用のサーバを立てるには以下コマンドを実行します。
```
npm run dev
```

[Vite](https://ja.vite.dev/guide/)
CDKのハンズオンやってみた

## はじめに
CDK触ったことがなかったのでハンズオンをやってみました。
備忘録も兼ねて投稿します。
使用したハンズオン教材（古いのでバージョンやコードに注意）
[HOL-10：コードでAWS環境を管理しよう！ AWS CDKハンズオン ](https://resources.awscloud.com/aws-summit-online-japan-2020-on-demand-self-paced-hands-on-85234/hol-10-aws-summit-online-2020-management-720p#main-content)

## CDKの概念
1時間くらいのハンズオンの動画である程度理解できると思います。
CloudFormationを触ったことがある方であればstackの概念にConstructを組み合わせるイメージです。

### ディレクトリの作成
- stackを作成、反映させるための空ディレクトリを作成しておく。

### 初期化コードの生成

```
cdk init sample-app --language=typescript
```

### 初期設定（初回時）
```
cdk bootstrap
```
#### 具体的に何をしてくれるコマンド？
- S3バケットの作成
- IAMロールの作成
- CFnスタックの作成
リソースを作成するためのバックエンドを作ってくれる
### lambdaコード
- lambdaのフォルダを作成して、jsファイルを入れておく（下記参照）
[Hello Lambda](https://catalog.us-east-1.prod.workshops.aws/workshops/10141411-0192-4021-afa8-2436f3c66bd8/ja-JP/2000-typescript-workshop/300-create-hello-cdk-app/320-lambda)
### lib配下のtest_cdk-stackを変更する
- SQSとSNSっぽいものは不要なため削除してok
- 作成したいサービスのコンストラクトライブラリを指定する(lambdaとapi gateway)
- aws-cdk-libから全リソースはインポートできる

```
import { Duration, Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as apigw from 'aws-cdk-lib/aws-apigateway';

export class TestCdkStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);
  const hello = new lambda.Function(this, 'HelloHandler', {
    runtime: lambda.Runtime.NODEJS_18_X,
    code: lambda.Code.fromAsset('lambda'),
    handler: 'hello.handler',
  });

  const api = new apigw.LambdaRestApi(this, 'Endpoint', {
    handler: hello,
  });  
  }
}
```
エラーが出た場合
公式のハンズオンは古いのでコードの修正が必要です。
- CDKのバージョンを確認
```
cdk --version
```
CDK v2の場合、aws-cdk-lib をインストールしてコードを上のように修正
```
npm install aws-cdk-lib
```

- ランタイムのバージョンを確認

### デプロイ
```
cdk deploy
```
### 結果
![スクリーンショット 2024-12-30 113931.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812406/c5e867d7-251b-7794-15d8-4c2961b4e76c.png)

- 出力結果で返ってきたURLを指定してcurlを実行
```
C:\test_cdk>curl https://xxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/prod/
Hello, CDK! You've hit 
```

## 最後に
High-level Constructsのおかげでコード量がほかのIaCに比べて圧倒的に少ないのが魅力的
他のリソースを作成して応用していきたい
【AWS】Amplifyホスティングの上限に達していないのにアプリを作成できない

# 発生事象

Amplify ホスティングのアプリ数の上限は 25 です。

https://docs.aws.amazon.com/amplify/latest/userguide/quotas-chapter.html

以下のようにサービスクォータからも確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/febe3251-3dc6-b913-60e2-2b7fb4621f0a.png)

まだアプリ数は 10 個なのに以下のようにデプロイに失敗しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/a7547814-841a-09ee-ecfc-2ccbb9c57ce8.png)

原因がまったくわかりません。

# re:Post で調べたが結局わからなかった

同じような状況に直面しているユーザーは複数いるようです。それに対する回答は「アカウント開始したばかりは上限が 25 よりも少ない」というものでした。しかし私の最も古いアプリは最終更新日が 3 年前であり、開始したばかりとは言えないと思います。したがって結局原因はわかりません。

もう一つの原因は、アプリ数は 25 に達していないがほかのクォータに引っかかっている可能性があると思います。何かわかったらこの記事に追記します。

https://repost.aws/questions/QUw01jhrW_TSumPZtpo8RLOA/what-are-the-limitations-applied-to-aws-amplify-apps-for-new-accounts

> AWS Amplify アプリの標準クォータは確かにリージョンあたり 25 ですが、新しいアカウントではクォータが削減されることが多く、使用状況に基づいて時間の経過とともに自動的に増加します。

https://repost.aws/questions/QUrFKZXKNeRd6ffquI8khy9g/aws-amplify-max-apps-reached-1

> 理由としては、アカウントが新規であるか、侵害されたとみなされて「ソフトブロック」されている可能性があります。

# 代替案

CloudFront と S3 を使ってデプロイすることにしました。Amplify ホスティングは裏側では CloudFront を使っているようなので、Amplify ホスティングが構築してくれていた部分を手動でやるのはどうも気が進みませんでした。しかも CI/CD も組まないといけない。Amplify ホスティングは gitHub のリポジトリを指定するだけでプッシュを検知して自動デプロイをしてくれていました。こんなにも不便なのかと思い知らされました。

四苦八苦しながらなんとかデプロイしました。Amplify ホスティングなら数分のところを数時間かかりました。以下参考記事です。

https://qiita.com/y_inoue15/items/c637dd2e269f7ab50e38

https://zenn.dev/hamo/articles/0a96c4d27097bd

https://dev.classmethod.jp/articles/nextjs-static-cache/

手順をざっくりまとめると以下の通りです。

1．ローカルでビルドする
2．ビルド出力ファイルを S3 にアップロードする
3．CloudFront ディストリビューションを作成する
4．バケットポリシーを編集する
5．CloudFront Functions を作成する
6．カスタムドメインを設定する

カスタムドメインの設定方法は以前記事を書いたのでこちらを参考にしました。

https://qiita.com/oizumi-yuta/items/9ad105cb63b2c9459b48

Amplify の Next.js アプリのビルドログを見るともっと簡単にやっているようなのですが、詳しいことはわかりません。

とりあえずデプロイできてよかったです。

https://todo.oizumi-yuta.com/
Github検索で大文字・小文字を区別する正規表現 (?-i) 

この記事は、[岩手の人とか、岩手県立大学の人とか Advent Calendar 2024 Advent Calendar 2024](https://qiita.com/advent-calendar/2024/ipu) の1日目の記事です(空いてたからもらっちゃった)。


## まとめ(?-i)を使うとサクッとできる

Github の検索にて大文字・小文字の判定をこだわりたいんだよなって時があると思います。

そんなときに利用できるのが、`(?-i)`という記法。
これを使うことで大文字・小文字の判定ができちゃいます。

利用する例としては `/(?-i)〇〇/`のような感じで入力するだけ。`〇〇`に任意の文字が入ります。

イメージ↓

![Githubの検索にて(?-i)を利用する例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103667/ac24ca2d-8a57-9424-eb47-6f02d750dcd1.png)

- https://github.com/search?q=%2F%28%3F-i%29foo%2F&type=code 

## 余談

`(?i)`だと大文字・小文字を区別しなくなります。通常の検索と同じですね。

気になるのが、この`(?i)`はなんて名前・グループとしての総称なの？というところ。

MDNだと`Modifier`。日本語にすると修飾子とかになるんでしょうか。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Regular_expressions/Modifier

`i`という部分については、`flag`、`Regex Flags`と呼んでそうですね。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Regular_expressions#regex_flags

regular-expressions.info も`Modifier`と呼んでいそう。しかし、`Mode modifiers`とも呼んでいそうでした。モード修飾子という日本語になりそう。

https://www.regular-expressions.info/modifiers.html

ググってみると、PHP ではモード修飾子、もしくはパターン修飾子と呼んでいそうですね。このうちパターン修飾子と呼んでいる勢力の方が大きそうです。

https://www.google.com/search?q=%22%E3%83%A2%E3%83%BC%E3%83%89%E4%BF%AE%E9%A3%BE%E5%AD%90%22&oq=%22%E3%83%A2%E3%83%BC%E3%83%89%E4%BF%AE%E9%A3%BE%E5%AD%90%22


https://www.php.net/manual/en/reference.pcre.pattern.modifiers.php

Ruby だと `Modes`になっているので、モード修飾子になるのでしょうか。

https://ruby-doc.org/3.4.1/Regexp.html#:~:text=Extended%20Mode.-,Modes,-%C2%B6%20%E2%86%91

Go や Rust だと`Grouping`という括りみたいですね。
 https://pkg.go.dev/regexp/syntax#:~:text=to%20this%20restriction.-,Grouping,-%3A

https://docs.rs/regex/latest/regex/#grouping-and-flags

## 余談のまとめ

結局のところはっきりとした名前はないみたいです(自分調べ)。
これ`(?i)`について調べるときは、`case sensitive`、`case insensitive` といったワードと`regex`とかのワードと合わせて調べると良さそうですね。
GitHubでマージしたブランチを自動で削除する設定にする

GitHubのリポジトリルールでマージ済みブランチを自動で消せるらしいと聞いたのでやってみた

# GitHubの設定
SettingsのGeneralの中に、PullRequest関連の設定項目がある。

ここの設定項目にチェックを入れると自動削除になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754443/89aae3c2-c4cb-be53-4086-240d6ffac8bb.png)

思った以上に簡単だった。

とはいえこの作業を毎回やるのは面倒くさいので手立てがないか探したが、リポジトリのルールセットの設定はJSON形式でエクスポートできるらしい。

https://dev.classmethod.jp/articles/github-repository-rule-set-can-now-be-exported-and-imported/

今回のユースケースではないのでまた今後試す。

# 参考
https://docs.github.com/ja/repositories/configuring-branches-and-merges-in-your-repository/configuring-pull-request-merges/managing-the-automatic-deletion-of-branches
GCP PGWA合格記(2024/12/30投稿)

# はじめに
この度GCP認定のGoogle Cloud Certified - Professional Google Workspace Administratorを受験してきましたので、勉強した内容と受験した感想を書いておきます。


※
Professional Google Workspace Administrator試験は2024年12月31日で廃止されます。([詳細](https://cloud.google.com/learn/certification/google-workspace-administrator/))
その代わりに2025年1月にAssociate Google Workspace Administrator試験が開始される予定になっています。([詳細](https://cloud.google.com/certification/associate-google-workspace-administrator))


# 前提
* Google CloudはSkill Boostなどで少し触った程度
* Google Workspaceは触ったことなし
* AWS認定は全て取っています(15資格)
* AWSの実務経験あり(一部Azureも)
* MS Azure認定は9個取っています
* Google Cloud認定は10個目になります

# 学習内容
今回は年末が近いということで勉強時間があまり確保できなかったので、最小限の学習だけ行いました。
具体的には問題を解いて間違えたところの深掘り学習を行って、後はひたすら問題を解きました。

* 1．[公式模擬問題](https://cloud.google.com/learn/certification/google-workspace-administrator?hl=ja)を解いて、間違えたところを深掘り
* 2．練習問題([Udemy](https://www.udemy.com/share/10arYK3@RvfS7J-wlg-_0HXf2dH94FfM2047uDF_md4bNxhunnrfZRdnnqA83XK7t7CHsg18/))を解いて問題に慣れる

## 公式模擬問題
公式の[試験ページ](https://cloud.google.com/learn/certification/google-workspace-administrator?hl=ja)には試験を受験するにあたってどのような流れで学習をしたらよいかが書かれており、その中で模擬問題へのリンクも記載されています。
模擬問題はあくまで試験の形式と内容を把握するためのものなので、全く同じ問題は出てこないですが傾向をつかむのには役立ちました。

* [模擬問題](https://docs.google.com/forms/d/e/1FAIpQLSfjO0tdoBiwvmmy-fcJVtKVwEavDoupVsUSJSw1cDqT2Zoj7Q/viewform?hl=ja)

全問回答すると最後に正答と参考ドキュメントのURLが出るので、参考ドキュメントとその中で出てくるワードや概念についてよくわかっていないものに絞ってドキュメントを見漁りました。

## 練習問題
模擬問題のあとはUdemyで公開されている[練習問題](https://www.udemy.com/share/10arYK3@RvfS7J-wlg-_0HXf2dH94FfM2047uDF_md4bNxhunnrfZRdnnqA83XK7t7CHsg18/)を購入して勉強しました。

1つ目のセクションが15問、2つ目のセクションが50問と若干少なめにはなりますが、解説含めて日本語だったので読みやすかったです。
しいて言うなら解説に公式のドキュメントを貼ってもらえると調べる手間が若干減って良かったかなと思いました。

# 受験した感想
解いた模擬問題、練習問題の一致度という観点だとそこまでではないですが、傾向はほぼ同じだと思います。
選択肢に聞いたことがない機能などが出てきても、問題文で問われている内容についてちゃんと理解して、消去法で減らしていけば割と絞り込みやすかったです。

最近受験した資格が大体問題文と回答が長い文章のものばかりだったので、1時間ぐらいで解きおわって見直し込みで1時間半ぐらいでした。

今思うと個人的にGoogleグループ作って運用していたりしたのが地味に役に立った気がします。

# 受験結果
無事合格でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/79ef65c3-4584-315a-3cc2-cdff3cd218a8.png)

# おわりに
残るGoogle Cloud試験は英語試験のMachine Learningだけですが、英語＋機械学習の組み合わせが自分にとって相性最悪で既に2回落ちているので、日本語試験を待つかしっかり勉強して臨むことにします。。
何はともあれ2024年最後に合格できて良かったです。

この記事がどなたかの参考になれば幸いです。
Flutterでの.envの管理やクレデンシャルの記載場所について

## よくある誤解
1. **.envにクレデンシャルを記載すれば安全**
2. **.envはコミットすべきではない**

これらの認識には注意が必要だ。それぞれの誤解を正し、適切な対応方法を以下に説明する。

---

## クレデンシャルを.envに記載すべきではない理由
`.env`ファイルにクレデンシャルを隔離してソースコードと分離しても、安全とは言えない。理由は以下の通りだ。

- **公開アプリへの含有リスク**  
  `.env`に記述されたクレデンシャルは、ソースツリーにコミットしなくても、アプリをビルドしてリリースする際にアプリのパッケージに含まれる。その結果、リバースエンジニアリングされて漏洩するリスクが高い。

- **サーバーサイドとモバイルアプリの違い**  
  `.env`を利用した分離は、主にサーバーサイドでの安全性を高めるための手法だ。サーバーでは、誤ってクレデンシャルを共有しないために有効だが、Flutterのようなクライアントサイドアプリでは、パッケージの解析による情報漏洩を防ぐことはできない。

### クレデンシャルの適切な保存方法
クレデンシャルはアプリ内に直接保存するのではなく、**サーバー側から付与する**のがベストだ。以下の仕組みを活用すれば、アプリの正当性を検証した上で必要なクレデンシャルを安全に渡すことができる。

- **iOSの場合**  
  [App Attest](https://developer.apple.com/documentation/devicecheck/validating-apps-that-connect-to-your-server)を利用して、サーバー側でアプリの正当性を検証する。

- **Androidの場合**  
  [Play Integrity API](https://developer.android.com/google/play/integrity?hl=ja)や、古いバージョンでは[SafetyNet Attestation API](https://developer.android.com/privacy-and-security/safetynet/attestation?hl=ja)を用いて、アプリが正規のものであるかを確認する。

サーバー側でアプリの検証が完了した後に、必要なクレデンシャルを提供する仕組みを構築するのが安全だ。
（とはいえ、それも工数がかかる対応なので、リスクが低いものに対してまで必要かどうかは疑問でもある。クレデンシャルが漏洩した際にそれがどれだけのリスクになるか次第で、どこまで厳重にするか判断すれば良い。）

---

## .envファイルをコミットするべきケースと避けるべきケース
`.env`ファイルのコミットについては、用途次第で判断する必要がある。

- **コミットすべき場合**  
  本番やテスト環境の設定値を含む`.env`ファイルは、誤った設定でビルドするリスクを防ぐため、コミットして管理すべきだ。これにより、一貫性のある環境構築が可能になる。

- **コミットすべきでない場合**  
  開発者ごとのローカル設定を記載した`.env`ファイルは、開発者ごとに変更が発生し、チームでの管理が煩雑になるため、コミットを避けるべきだ。

---

## 結論
.envの利用意義は、クライアントアプリとサーバサイドでは異なることを理解し、思い込みで誤用して事故になったり不要に非効率な運用をしないようにしたいものだ。
クレデンシャルに関しては、できればサーバサイドから渡すようにし、.envをコミットするかどうかは必要性を考えて判断すれば良い。
Flutter v3.19から非推奨になったAPIをまとめてみました

## 概要
Flutterのバージョンアップ対応で、v3.19からTextThemeクラスのTextStyleが非推奨になっていたので、まとめました。
bodyText1や、headline1、subtitile1は非推奨になり他のプロパティ名へ移行されています。

## 警告コード
```
The getter 'bodyText1' is isn't defined for the type TextTheme. Try importing the library that defined 'bodyText1', correcting the name to the name of an .....
```
## 新旧API対応表

| 非推奨 | 新API        |
|-------------|----------------|
| headline1   | displayLarge   |
| headline2   | displayMedium  |
| headline3   | displaySmall   |
| headline4   | headlineMedium |
| headline5   | headlineSmall  |
| headline6   | titleLarge     |
| subtitle1   | titleMedium    |
| subtitle2   | titleSmall     |
| bodyText1   | bodyLarge      |
| bodyText2   | bodyMedium     |
| caption     | bodySmall      |
| button      | labelLarge     |
| overline    | labelSmall     |

- Themedataに関しても変更があるので公式ページを参考にしてください

## 参考
https://docs.flutter.dev/release/breaking-changes/3-19-deprecations
Azure SDK for JavaでBlobを操作する

## 概要
Azure SDK for Javaを使って、Blobストレージへファイルをアップロードした際の備忘録です。

## 全体
```sample.java
String container = <<containerName>>;
String accountUri = "https://" + <<storageAccountName>> + ".blob.core.windows.net";

DefaultAzureCredential defaultCredential = new DefaultAzureCredentialBuilder().build();

//認証・Blobクライアント取得
BlobServiceClient blobServiceClient = new BlobServiceClientBuilder()
    .endpoint(accountUri)
    .credential(defaultCredential)
    .buildClient();
BlobContainerClient blobContainerClient = blobServiceClient.getBlobContainerClient(container);
BlobClient blobClient = blobContainerClient.getBlobClient("sample.txt");

//ファイル操作//

//ファイルアップロード
blobClient.uploadFromFile(<<fileFullPath>>);
```
## 要素の解説
### 全体の認証
```DefaultAzureCredential.java
DefaultAzureCredential defaultCredential = new DefaultAzureCredentialBuilder().build();
```
Azure全体の認証です。
詳しくはこちら
https://learn.microsoft.com/ja-jp/azure/developer/java/sdk/authentication/credential-chains#defaultazurecredential-overview


### Blob用クライアントの取得
```BlobClient.java
BlobServiceClient blobServiceClient = new BlobServiceClientBuilder()
    .endpoint(accountUri)
    .credential(defaultCredential)
    .buildClient();
BlobContainerClient blobContainerClient = blobServiceClient.getBlobContainerClient(container);
BlobClient blobClient = blobContainerClient.getBlobClient("sample.txt");
```
Blobクライアントは3段階に分かれているようです。
1. ストレージアカウント　⇒　BlobServiceClient
1. コンテナ　　　　　　　⇒　BlobContainerClient
1. Blobオブジェクト　　　⇒　BlobClient  

操作のレベルに応じたクライアントが必要です。
今回は、Blobレベルの操作を行うので、それ以上のクライアントも必要になります。

### ファイルのアップロード
```UploadBolb.java
blobClient.uploadFromFile(<<fileFullPath>>);
```
ファイルのフルパスを指定して、Blobをアップロードします。

### 参考
https://learn.microsoft.com/ja-jp/azure/storage/blobs/storage-quickstart-blobs-java?tabs=powershell%2Cmanaged-identity%2Croles-azure-portal%2Csign-in-azure-cli&pivots=blob-storage-quickstart-scratch

https://github.com/yfakariya/azure-content-jajp/blob/master/articles/storage/storage-java-how-to-use-blob-storage.md
【Next.js】動的ルーティング設定してみたv15.1.2【router】

# 参考にしたドキュメント
- Next.js公式ドキュメント
    - [Project structure and organization](https://nextjs.org/docs/app/getting-started/project-structure)
    - [Dynamic Routes](https://nextjs.org/docs/app/building-your-application/routing/dynamic-routes)
# 概要
`/hoge/[slug]`のように複数のページを動的ルーティング設定したい。

# 結論
Next.js(v15.1.2)のディレクトリ構造やファイル構成を理解することで解決できた。

# Next.jsの構成
```text
src
└　app
　　├　page.tsx "/"
　　└　hoge
　　　　└　[slug]
　　　　　　└　page.tsx "/hoge/[slug]"
```

# まとめ
公式ドキュメントを参考に、ディレクトリ構造を理解することで開発がスムーズに進んだ。
Linuxでよく使うコマンド10選

# はじめに
Linuxはパソコンやサーバーで広く使われる便利なオペレーティングシステムです。特に初心者にとって、基本的なコマンドを覚えることで効率的に操作できるようになります。本記事では、これからLinuxを使い始める方に役立つ基本的なコマンド10個を使用例や出力例とともにわかりやすく紹介します。
※この記事はChatGPT-4o with canvasを使用しています。

## 1. ls
用途: ディレクトリの内容を表示

使用例:
```
ls -l
```
出力例:
```
drwxr-xr-x 2 user user 4096 Dec 30 12:00 Documents
-rw-r--r-- 1 user user 1024 Dec 30 11:59 file.txt
```
## 2. cd
用途: ディレクトリを移動

使用例:
```
cd /var/log
```
出力例: 特に出力なし。現在のディレクトリが変更される。
## 3. pwd
用途: 現在のディレクトリを表示

使用例:
```
pwd
```
出力例:
```
/home/user
```
## 4. touch

用途: 空のファイルを作成

使用例:
```
touch newfile.txt
```
出力例: 特に出力なし。指定したファイルが作成される。

##  5. rm

用途: ファイルやディレクトリを削除

使用例:
```
rm oldfile.txt
rm -r olddir
```
出力例:
特に出力なし。`rm` で指定したファイルが削除され、`rm -r` で指定したディレクトリとその中身が削除される。

注意: `rm -r`を使うとディレクトリ全体が削除されます。重要なデータの削除には十分注意してください。

##  6. mkdir

用途: ディレクトリを作成

使用例:
```
mkdir mydir
```
出力例: 特に出力なし。指定したディレクトリが作成される。

##  7. cp

用途: ファイルやディレクトリをコピー

使用例:
``
cp source.txt dest.txt
``
出力例: 特に出力なし。ファイルがコピーされる。

## 8. mv

用途: ファイルやディレクトリを移動または名前を変更

使用例:
```
mv mydir /home/user/Documents/
mv oldname.txt newname.txt
```
出力例: 特に出力なし。`mv mydir /home/user/Documents/`でディレクトリが指定した場所に移動され、`mv oldname.txt newname.txt`でファイル名が変更される。

## 9. cat

用途: ファイルの内容を表示

使用例:
```
cat file.txt
```
出力例:
```
Hello, World!
This is a test file.
```

## 10. grep

用途: テキスト検索

使用例:
```
grep "error" logfile.txt
```
出力例:
```
[2024-12-30 12:34:56] error: File not found
```

# まとめ
以上がLinuxでよく使うコマンド10選でした。初心者にとって最初は難しく感じるかもしれませんが、少しずつ練習することで効率的に操作できるようになります。これらのコマンドを日常的に試してみて、Linux環境での作業をスムーズに進めましょう！
ゲームボーイ RGBDS 開発メモ 第4回 デバッガ

### デバッガ

デバッガはチュートリアルと同じ、Emuliciousを使っています。

![スクリーンショット 2024-12-30 13.21.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733735/2a9838c1-960b-2464-e9b5-200fe1803ae3.png)

ブレークポイントやレジスタ、メモリ内容などを確認しながら実行することができます。これは、PHPなどのIDEでのデバッグとかわらないですね。指定のアドレスが変更されたら止まるとかも、内藤さんの動画でやっていたので、できるのでしょう（あとで調べる）。

### 次回以降

チュートリアルのパート２では、実際にアルカノイドのようなブロック崩しをつくっていくようです。こちらも、手は動かさず、読んでいく形になりそうです。

### 余談

ゲームボーイカラーの実機、我慢できずにメルカリで買ってしまいました。
command prompt　の　ls の使い方

linuxで作業が多く、WINODWSのcommand promptを使う時、```ls```は使えないのが知っているものの、ついに入力してしまいます。あ、```dir```を使わんと。と毎回ちょいストレス。

そこで、ls使える方法がないかを調べたら、、、知っている人は知っているとおもいますが、私みたいの素人は、できるやあとの感じ。

①一時的なものなら、

```command prompt
doskey ls=dir
```

を入力すればよいみたいです。

②　```ls.bat```を作って、windowsフォルダに管理者権限で放り投げる

```ls.bat
dir %1
```
自分の場合、毎回入力はめんどいので、②をしました。

因みに、conda環境のactivateを毎回入力するのもめんどいので、
```LLM.bat
conda activate LLM
```

そうしたら、
```LLM```入力するだけで済むから、ちょい便利。


参考サイト、
https://otona-life.com/book/103302/

---
**日々の発見に感動中です。今日は良い一日を。**

---
Power Query へそのゴマ　チャレンジ

### 問題 1
次のクエリは、Power QueryでExcelファイルからデータを読み込んでいます。このクエリを最適化するには、どの手順が必要ですか？

```M
let
    Source = Excel.Workbook(File.Contents("C:\Data.xlsx")),
    Sheet = Source{[Item="SalesData", Kind="Sheet"]}[Data],
    #"Changed Type" = 
        Table.TransformColumnTypes(
            Sheet, 
            {
                {"Date", type text}, 
                {"Amount", type number}
            }
        )
in
    #"Changed Type"
```

A. 「Date」列のデータ型を `type date` に変更  
B. 「Amount」列のデータ型を `type text` に変更  
C. ファイルのサイズを小さくする  
D. クエリの手順を減らす

---

### 問題 2
次のクエリで「High」または「Low」を割り当てる新しい列を追加するには、どの操作を使用しますか？

```M
let
    Source = Table.FromRows({
        {"John", 500},
        {"Mary", 200},
        {"Paul", 300}
    }, {"Name", "Sales"})
in
    Source
```

A. フィルタリング  
B. 条件付き列の追加  
C. 列の結合  
D. 行の削除

---

### 問題 3
次のシナリオで適切な結合の種類を選んでください。  
2つのテーブルがあります：
- テーブルA（すべての製品IDを含む）  
- テーブルB（販売データを含む）

すべての製品と対応する販売データを表示する必要がありますが、販売データがない製品もリストに含めたいです。どの結合の種類を使用すべきですか？

A. 内部結合  
B. 左外部結合  
C. 右外部結合  
D. フル外部結合


---

### 問題 4
次のデータ処理を実行する必要があります：  
「C:\SalesReports」フォルダ内のすべてのCSVファイルを読み込み、1つのテーブルに結合します。これを達成するために最適なデータソースの選択肢はどれですか？

A. データベース  
B. フォルダ  
C. Webデータソース  
D. Excelファイル

---

### 問題 5
以下のコードは、データが存在しない場合にエラーが発生します。この問題を解決するために最適なアプローチは何ですか？

```M
let
    Source = Table.SelectRows(#"Previous Step", each [Value] > 100)
in
    Source
```

A. エラーを無視する  
B. try...otherwise を使用する  
C. フィルタ条件を変更する  
D. エラーを置換する

---


### 問題 6
2つのテーブルを結合する際、以下のエラーが発生しました：  
「キー列のデータ型が一致していません」。この問題を解決する最善の方法は何ですか？

A. データ型を一致させる  
B. 列を削除する  
C. テーブルをピボット化する  
D. 条件付き列を追加する


---

### 問題 7
以下のデータがあります：

|Product|2022|2023|
|-------|----|----|
| A     | 100| 150|
| B     | 200| 250|

このデータを以下の形式に変換するには、どの操作を使用すべきですか？

| Year | Product | Sales |
|------|---------|-------|
| 2022 | A       | 100   |
| 2022 | B       | 200   |
| 2023 | A       | 150   |
| 2023 | B       | 250   |

A. 列の分割  
B. ピボット解除  
C. 行の削除  
D. 条件付き列  

---

### 問題 8
次のクエリで動的に変化する値を使用するには、どの手法を使用しますか？

```M
let
    Source = Table.SelectRows(#"Previous Step", each [Category] = "A")
in
    Source
```

A. ハードコーディング  
B. パラメータ  
C. 列の結合  
D. マージクエリ

---

### 問題 9
以下のような複数ステップのクエリがありますが、特定のステップを無効にするにはどうしますか？

```M
Step1 = Source,
Step2 = Table.RemoveColumns(Step1, {"Column1"}),
Step3 = Table.Sort(Step2, {"Column2"})
```

A. ステップの名前を変更する  
B. ステップを削除する  
C. ステップを無効化する  
D. クエリ全体を削除する


---

### 問題 10
Power BIレポートでデータを自動更新するには、どの設定が必要ですか？

A. クエリのステップを追加する  
B. スケジュール更新を設定する  
C. フォルダ内のファイルを削除する  
D. データ型を変更する
npm installの結果がDocker環境に反映されない

## 事象

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769595/2060383d-7204-e145-5121-10bee74aa5d3.png)

Docker環境で、Reactを使ったWebアプリケーションを作成していた際、`npm install react-router-dom`が成功したはずなのに`[plugin:vite:import-analysis] Failed to resolve import "react-router-dom" from "src/App.tsx". Does the file exist?`が出ている。

## 原因
ローカル環境で行った`npm install react-router-dom`が、Docker環境に反映されていなかったことが原因。
Viteの古いキャッシュが使われているのではと思い、Docker環境内で、`npm run dev -- -force`を実行しようとしたところ、以下のようにErrorが出ていた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769595/37cb9520-62e5-eb65-78eb-00a43bf98838.png)

ローカルのファイルをDocker環境にマウントしているが、node_modulesは、ローカルと同期しないように、名前付きボリュームに格納していた。このため、ローカルホストで`npm install react-router-dom`を実行しても、Docker環境内のnode_modulesにはそれが反映されず、上記エラーが発生した。

```docker-compose.yaml
services:
    frontend:
        build: ./frontend
        container_name: react-frontend
        volumes:
          - ./frontend:/react-frontend
          - node_modules:/react-frontend/node_modules
        ports:
          - "5173:5173"

volumes:
  node_modules:
```

## 解決策
Docker環境内のnode_modulesに、ローカルでインストールしたライブラリの情報を反映させれば解決する。具体的な方法は以下の2つ。

:::note warn
ただしこれらの解決策は、あくまで上記原因に対して有効なのであって、他の原因の場合は別の対応が必要。
:::

### その1. Docker環境内で、ローカルと同じライブラリを`npm install`する
1. `docker exec -it ${CONTAINER_NAME}`で、Docker環境内のBashに入る
2. ローカルと同様のライブラリをインストールする
3. ローカルの`node_modules`と`package-lock.json`を削除し、**ローカル環境**で`npm install`を実行する

3ステップ目について、`node_modules`と`package-lock.json`を削除することで、依存関係を整理しなおしている。

### その2. 名前付きボリュームを削除して、再度Buildする
Docker環境内の`node_modules`を削除してBuildすると、`package.json`をもとに再度`node_modules`が生成される。ローカル環境の`package.json`には既にライブラリへインストールした情報が反映されているため、再生成された`node_modules`にも、それが反映される。

```bash
# Volumeを消す前にコンテナを停止
docker-compose down
# 名前付きボリュームを削除
docker volume rm node_modules
# 再度Buildを実行
docker-compose build
```

名前付きVolumeを同時にすべて削除してしまっても問題ない場合は、以下の手順でも同様に動作する。

```bash
# コンテナ停止時に、名前付きボリュームをすべて削除
docker-compose down -v
# 再度Buildを実行
docker-compose build
```

## 最後に
今回は、Docker-composeの名前付きボリュームに、ローカルでの操作が、うまく反映されないことが原因でした。
対応策を2つ提示しましたが、ライブラリをインストールするたびに同様の手順が必要なことを考えると、少し手間になる作業であるため、より良い方法を知っている方がいれば教えていただきたいです。
【Ruby】OptionParserを使ってRubyスクリプトにカスタムオプションを渡す！

どうもこんにちは。

今回は、「**Rubyスクリプトを実行するときに、`OptionParser`を使用してカスタムオプションを渡す**」方法をメモとして残しておこうと思います。

# 経緯

`OptionParser`を使用する経緯としては、「**試験仕様書を作成するのめんどくさ!!**」というところから始まりました。（なんとも不純な動機...）

作成したかったRubyスクリプトは、**「ある機能」の「ある画面」の「ユーザの種類によるアクセス可否」の試験仕様書**を作成するスクリプトでした。

```txt:例
「顧客管理機能」の「一覧画面」の「すべてのユーザのアクセス可否」の試験
```

試験を実施する対象のアプリケーションは、Ruby on Railsで開発していて、`config/settings.yml`に記載しています。このファイルを今回作成するRubyスクリプトから参照して、試験手順と期待する結果を変えています。

```rb
yml_path = '/Users/testuser/code/test_create_tools/'
data = YAML.load_file(yml_path)
```

あとはごちゃごちゃ書いて、`require 'csv'`でCSVモジュールを使って試験仕様書を作成していくのですが、このコードを実行するときに、以下の手順を踏まなきゃ行けなかったんです。

1. コード内の`function_name`と`display_name`に代入する値を直接変更する
1. `ruby /Users/testuser/code/test_create_tools/test_create_tool.rb`を実行する

上記のように、コードを直接編集するのはなんとも使い勝手が悪い...

なので、コマンドを実行するときに渡せないかと考えたときに、**`OptionParser`** という存在を発見！

# OptionParserで何をした？

`ruby`コマンドでRubyスクリプトを実行すると同時に、コードに「機能名」「画面名」をパラメータとして渡すということをしました。

## 使い方

```rb
require 'optparse'

options = {}
OptionParser.new do |opts|
  opts.banner = "使い方: test_create_tool.rb [options]"
  opts.on("-fVAL", "--f=VAL", "テストを作成する機能名") do |f|
    options[:f] = f
  end
  opts.on("-sVAL", "--d=VAL", "テストを作成する画面名") do |d|
    options[:d] = d
  end

  # ヘルプの表示
  opts.on_tail("-h", "--help", "ヘルプを表示") do
    puts opts
    exit
  end
end.parse!

# テスト対象となる機能名
function_name = options[:f]

if function_name.nil?
  puts '機能名を指定してください。'
  exit
end

# テスト対象となる画面名
display_name = options[:d]

if display_name.nil?
  puts '画面名を指定してください。'
  exit
end
```

# まとめ

これでコードを直接編集することなく、パラメータとして「機能名」「画面名」を渡すことで、試験仕様書の作成を行うことができました。

2025年からは、試験仕様書の作成での工数消費を抑えて、開発業務に時間を使えるようにしたいなぁと思います！

以上
command prompt と miniforge promptのパスエラー問題

久しぶり、WINODWSで作業することになり、ANACONDAのlicense変更で、license違反のおそれがあるので、
急遽、miniforgeに変更した。古い、ANACONDAの全てを削除したいうえで、miniforgeをいれました。
ところで、
## パスエラー ##
```miniforge prompt
Microsoft Windows [Version 10.0.22631.4602]
(c) Microsoft Corporation. All rights reserved.
指定されたパスが見つかりません。
```
何か、**指定されたパス**はよくわからなく、```%PATH%```も見て、
comand promptやminiforge promptの 作業フォルダも指定しましたが、
改善できませんでした。
```ChatGPT```に聞いても、色々言われましたが、どれもイマイチでした。

**解決策**

何も影響しないが、気持ち悪いので、その後調べた結果、どうやらAnaconda3関連は、レジストリにpathが残っているようで、削除したら無事になりました。

```
レジストリエディタを開いて、
`HKEY_CURRENT_USER\Software\Microsoft\Command Processor\AutoRun`
の値を削除する。
```
この解決策は、このサイトに記載している通りでした。
https://harist.hatenablog.jp/entry/2020/01/20/212403

ここで、メモを残します。

---
**日々の発見に感動中です。今日は良い一日を。**

---
artisan tinkerコマンドと、nohupコマンドについてまとめてみた

PMとして様々な案件を進めていくにあたって、実装されたコードが正しく動いているかを確認することはとても重要なことです。
しかし、全体の機能ではなく一部分だけを確認したいこともままあります。
そんなときに、`artisan tinker `を使うと、確認したいクラスの挙動のみ取り出してチェックすることができます。
また、処理に時間がかかる場合は、`nohup`コマンドによってバックグラウンドで動かすことも可能となります。
今回は、いつも私が使っているこの二つのコマンドについて簡単ながらまとめてみました。

# 1. artisan tinker の基本
`artisan tinker`は、「アルチザン　ティンカー」と読むそうです。
簡単にいうと「お試しツール」みたいなものになります。
たとえば、料理を作るときにちょっと味見することってありますよね？「この量でちょうどいいかな？」みたいに。その感じで、「このコードでちゃんと動くかな？」と確認できるのが`artisan tinker`です。

# 2. artisan tinker コマンド
```
$ php artisan tinker
Psy Shell v0.11.4 (PHP 8.1.3 — cli) by Justin Hileman
>>> 
```
`>>>`になったら準備完了です。
例えば、ユーザ情報を取得するクラスがあったとしたら、以下のようにコマンドを打つことでユーザ情報が取得できます。
```
>>> app(App\{中略}\GetUserInfo::class)->execute('{取得したいユーザID}');
```
実装内容によって使えるコマンドは変わりますが、サクッと確認したい時にはとても便利です。

※tinkerで使えるコマンドを確認したい場合は
```
$ php artisan list
```
で、使えるコマンド一覧が表示されます。

# 3. 長時間実行スクリプトの課題
`artisan tinker` は便利ですが、長時間実行されるスクリプトでは次のような問題があります。

- セッションが切れるとスクリプトが中断される
- コマンドの実行中にターミナルを閉じられない
- 実行ログが保存されない

これを解決するために、`nohup` コマンドを利用します。

# 4. nohup コマンドの活用
`nohup` コマンドは、シェルセッション終了後もプロセスを継続して実行できるLinuxコマンドです。Laravelのスクリプト実行にも有効です。
`nohup` コマンドは以下の形式で使用します。
```
$ nohup <コマンド> &
```
`nohup` を利用することで、ターミナルを閉じてもスクリプトがバックグラウンドで実行され続けます。

こうすることで、ターミナルを閉じても、処理が終わるまで実行し続けてくれます。
ちなみに、`nohup`コマンドを使った時は、通常ホームディレクトリに`nohup.out`というログファイルが出力されます。
これは`tail`コマンドでリアルタイムに確認することができます。
```
$ tail -f nohup.out
```

# まとめ
以上で`artisan tinker`と`nohup`コマンドについての紹介でした。
処理の確認だけでなく、ピンポイントで取得したい情報がある場合にも使えるので、活用できる方は参考にしてください。
今一度基礎からアウトプットしていこう。AWSサービス【IAM・KMS】編

### Identity and Access Management(IAM)
![Arch_AWS-Identity-and-Access-Management_64.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332976/1dfe192a-3c59-4313-109b-ea1be2b04b47.png)

- AWSリソースへのアクセスを安全に管理することが出来るサービス。
 **誰が何を実行できるかを定義する**。
 ここで**IAMユーザ、グループ、ロール、ポリシー**を作成する。

#### 以下重要な単語
- 認証（Authentication）
・・・サービスの利用者が本人であるか
- 認可（Authorization）
・・・サービスの利用者が適切な権限を持っているか
　
- グループ
IAMユーザの集まり。IAMユーザをグループに割り当てる。
さらにグループにポリシーを適用することでグループ内ユーザに権限が付与
される。一応ユーザ単体にポリシー付は可能だが、あまり推奨されていない。
一つのIAMユーザは、最大10種類のグループに入ることが可能。
　
- ポリシー
 JSON式のドキュメントであり、アイデンティティ（IAMユーザ、グループ、ロール）またはAWSリソース(S3,EC2)にアタッチ
⚪︎アイデンティティベースポリシー（IAMユーザ、グループ、ロール）
⚪︎リソースベースポリシー
　　　→例：S3パケットポリシー、lamdaポリシー、KMSポリシー等
　　　
- ロール
複数のポリシーによって構成される。ロールの役割はAWSサービス(EC2,Lamda等)にアクセス権限を付与してそのサービスがIAMユーザのように行動できるようにするもの。ポリシーを直接サービスにアタッチすることが出来ないので、ポリシーをロールにアタッチし、ロールをサービスにアタッチする。
　

- 簡単な仕組みと説明
・・・IAMによる**認証はユーザ・グループ・ロール**で行われ、**認可はポリシー**で行われる。ルートユーザはAWSアカウントを作成する際に最初に生まれるアカウントで、全権限を持つ。通常ルートユーザで管理者権限（AdministratorAccessポリシー）の付けたIAMユーザを作成する。

---
### Key Management Service (KMS)
![Arch_AWS-Key-Management-Service_64.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332976/810923b1-447a-ab52-161b-314a292cb3af.png)

- データを暗号化/復号化のためのキーを一元管理するフルマネージドサービス。KMS上で暗号化/復号化のためのキーを簡単に生成・保管でき、リージョンごとに管理される。カスタマーマスターキー(CMK)と呼ばれるキーを用いて暗号化する。
Postgresqlの接続方法

環境設定は以下
************************
ruby 4.3.1
Rails 8.0.1  
Homebrew 4.4.13
*************************


ライブラリをインストール
    
    $ bundle install

Gemはパッケージ管理ツール
postgreSQLに接続するパッケージ'pg'

    $ gem 'pg'

rubyのプログラムを実行したり、DB接続操作行うコマンド

    $ rails console

接続の確認

    $ ctiveRecord::Base.connection

テーブルの接続確認

    $ ActiveRecord::Base.connection.tables
【Route53】プライベートホストゾーンを利用してみる

# 概要
AWSのRoute53を使用する際、プライベートホストゾーンを作成することでプライベートIPアドレスを返却することができます。
これにより、特定のVPC内からの通信がネットワーク内で完結するようになり、効率的でセキュアな通信が可能になります。
本記事ではプライベートホストゾーンの導入方法および概要についてまとめたいと思います。

# パブリックホストゾーンの場合
まずはパブリックホストゾーンを使用した名前解決の例を見てみましょう。
テスト用のパブリックホストゾーンとして`taka_2525.jp`を作成してみます。

![スクリーンショット 2024-12-30 11.35.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576260/c4985faf-d81f-24a5-f366-291ee32b7d03.png)

さらに、とあるALBへのAレコード(エイリアス)として`service.taka_2525.jp`のレコードを作成してみます。
この状態で名前解決を行うとALBのグローバルIPアドレスが返却されます。

```shell
dig 'service.taka_2525.jp'
# => ALBのグローバルIPアドレスを返却
```

この結果は、VPC内外を問わず同じものです。
(VPC内で実行したとしてもグローバルIPアドレスが返却される)

# プライベートホストゾーンを追加してみる
ここからが本題です。
上記の設定に追加して、プライベートホストゾーンの`taka_2525.jp`を作成します。
今回はテストなので`test_vpc`というVPCに紐づけることとします。
VPCの選択があること以外は、パブリックホストゾーンの時と同じ手順です。

![スクリーンショット 2024-12-30 11.45.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576260/d617f2c5-70da-e8cc-b892-ddb4991eb48b.png)

左上にプライベートと表示されていますね。

パブリックホストゾーンの時と同じように、ALBへのAレコード`service.taka_2525.jp`を作成します。
この状態で名前解決を行うとどうなるのでしょうか。

## VPC外からのアクセス
今回テスト用に用意した`test_vpc`の外からのアクセスを考えてみます。
この場合は、パブリックホストゾーンのレコードが参照されるため、名前解決の結果は前回と同じです。

```shell
dig 'service.taka_2525.jp'
# => ALBのグローバルIPアドレスを返却(さっきと一緒)
```

## VPC内からのアクセス
では、`test_vpc`内のリソースからのアクセスの場合はどうなるでしょうか。
VPC内の踏み台サーバー等から同様のコマンドを実行してみます。

```shell
# VPC内のリソースで実行
dig 'service.taka_2525.jp'
# => ALBのプライベートIPアドレスを返却
```

先ほどとはうってかわり、プライベートIPアドレスが返却されるようになりました。

# 注意点！
プライベートホストゾーンを作成したことにより、`test_vpc`内からの名前解決はパブリックホストゾーンの`taka_2525.jp`ではなくプライベートホストゾーンの`taka_2525.jp`で行われるようになりました。
**プライベートホストゾーンにレコードがない時にパブリックホストゾーンのレコードにフォールバックするわけではない**ので注意が必要です(自分はここで失敗しました)。
わかりづらいと思うので以下の例を考えてみます。

## 私の失敗を再現してみる
今までの設定は一旦忘れて、以下のような状況を想定してみます。

**パブリックホストゾーン`taka_2525.jp`**
- Aレコード: `service_a.taka_2525.jp` → ALB_aへのエイリアス
- Aレコード: `service_b.taka_2525.jp` → ALB_bへのエイリアス


**プライベートホストゾーン`taka_2525.jp`**
- Aレコード: `service_a.taka_2525.jp` → ALB_aへのエイリアス
(ALB_bへのレコードは作成していない)

パブリックホストゾーンにはALB_aとALB_bへのエイリアスが設定されていますが、プライベートホストゾーンにはALB_aへのみのエイリアスを設定しました。

この状態で`service_b.taka_2525.jp`の名前解決を行ってみます。

### VPC外からのアクセス
```shell
dig 'service_b.taka_2525.jp'
# => ALB_bのグローバルIPアドレスを返却
```

問題なく名前解決できています。

### VPC内からのアクセス
VPC内からアクセスしてみます。
```shell
# VPC内のリソースで実行
dig 'service_b.taka_2525.jp'
# => NODOMAIN（レコードが見つからない）
```

あれ、名前解決できないですね...
プライベートホストゾーンを作成する前は名前解決できていたのに...

それもそのはずで、AWS公式には以下のように書かれています。
https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/hosted-zone-private-considerations.html
>一致するプライベートホストゾーンがあるが、リクエストのドメイン名とタイプに一致するレコードがない場合、Resolver はリクエストをパブリック DNS リゾルバーに転送しません。代わりに、NXDOMAIN (存在しないドメイン) をクライアントに返します。

つまり、プライベートホストゾーンで名前解決が完了するようにレコードを用意しておく、もしくは名前空間が競合しないようにホストゾーンを作成しておく必要があります。

# 最後に
プライベートホストゾーンを作成したら名前解決ができなくなってめちゃくちゃ焦りました(検証環境なので大きな問題はありませんでしたが)。
プライベートホストゾーンで名前解決できない時はパブリックホストゾーンのレコードを参照してくれるのではないかと勝手に希望的観測を持っていましたが、きちんと公式を読むのが肝要だと再確認させられました。

それでは、良いお年を。