OmniAICreator/Qiita-1.07M huggingface dataset:
WSL2 + Ubuntu + VSCodeでSQLiteを使い倒す！ブクログCSVを爆速インポート

## はじめに

この記事では、WSL2上のUbuntuにSQLiteをインストールし、Visual Studio Code (VSCode) から操作する手順を解説します。さらに、ブクログからエクスポートしたCSVファイルをSQLiteデータベースにインポートする方法も紹介します。

## SQLiteインストール編

### WSL2 (Ubuntu) へのインストール

```bash
sudo apt update
sudo apt install sqlite3
```

インストール確認

```bash
sqlite3 --version
```

### VSCodeの設定

VSCodeに以下の拡張機能をインストールします。

*   SQLite by alexcvzz

### データベースの操作

1.  データベースファイルの作成

    ```bash
    sqlite3 example.db
    ```
2.  VSCodeでデータベースを開く

    *   `Ctrl+Shift+P` でコマンドパレットを開き、`SQLite: Open Database` を選択
    *   作成したデータベースファイルを選択

3.  SQLITE EXPLORERで操作

    *   テーブル一覧の表示
    *   テーブル内容の表示
    *   クエリの実行

## ブクログCSVインポート編

### ブクログからCSVをエクスポート

1.  ブクログにログイン
2.  自分の本棚を開く
3.  絞り込み配列の「スパナ」ボタンをクリック
4.  「エクスポート」を選択
5.  CSVファイルをダウンロード

### 注意点

*   **文字コード:** ブクログのCSVはShift-JIS形式でエクスポートされるため、UTF-8に変換が必要です。
*   **ヘッダー行:** CSVの1行目はヘッダー行ですが、インポート時にデータとして取り込まれることがあります。

### SQLiteでデータベース作成

1.  データベースファイルの作成

    ```bash
    sqlite3 booklog.sqlite
    ```
2.  テーブル作成

    ```sql
    CREATE TABLE books (
        service_id INTEGER,
        item_id TEXT,
        isbn13 TEXT,
        category TEXT,
        rating INTEGER,
        read_status TEXT,
        review TEXT,
        tags TEXT,
        memo TEXT,
        registered_date TEXT,
        read_date TEXT,
        title TEXT,
        author TEXT,
        publisher TEXT,
        publication_year INTEGER,
        book_type TEXT,
        page_number INTEGER
    );
    ```
3.  CSVインポート

    ```sql
    .mode csv
    .import booklog.csv books
    ```

    *   **重要:**  `.import` コマンドは文字コードを直接指定できません。事前にCSVファイルをUTF-8に変換してください。
4.  データ確認

    ```sql
    .tables
    PRAGMA table_info(books);
    SELECT COUNT(*) FROM books;
    SELECT * FROM books LIMIT 5;
    ```

    *   `.tables` でテーブル一覧を確認
    *   `PRAGMA table_info(books);` でテーブル定義を確認
    *   `SELECT COUNT(*) FROM books;` でデータ件数を確認
    *   `SELECT * FROM books LIMIT 5;` でデータ内容を確認

### 便利なコマンド

```sql
.mode column
.headers on
```

*   `.mode column`: 列表示モード
*   `.headers on`: ヘッダー表示

```sql
.backup books_backup.db
```

*   `.backup`: データベースのバックアップ

## まとめ

この記事では、WSL2 + Ubuntu + VSCode環境でSQLiteを使い、ブクログのCSVデータをインポートする手順を解説しました。文字コードやヘッダー行など、注意すべき点も記載したので、ぜひ参考にしてください。

## ハッシュタグ

ハッシュタグ: #SQLite #WSL2 #Ubuntu #VSCode #ブクログ #CSV #データベース #インポート #Qiita

---

**ポイント:**

*   **シンプルさ:** 複雑な説明を避け、簡潔な文章で手順を説明しました。
*   **具体性:** コマンド例を豊富に記載し、具体的な操作をイメージできるようにしました。
*   **注意点:** 文字コードやヘッダー行など、ハマりやすいポイントを明示しました。
*   **メタ認知:** これまでのやり取りで得られた知見を元に、読者がつまずきやすい箇所を予測し、対策を盛り込みました。
*   **ハッシュタグ:** Obsidianでの検索を考慮し、記事に関連するハッシュタグを付与しました。

このQiita記事は、SQLite初心者でも理解しやすく、スムーズにデータベース構築を進めることができるでしょう。
【GitHub】リポジトリの内容のダイアグラムを生成する方法

GitDiagramを使用するとリポジトリの内容からダイアグラムを生成できます。

以下のURLにアクセスし、フォームにリポジトリのURLを入力します。

https://gitdiagram.com/

![スクリーンショット 2025-01-14 23.57.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/d7fb13b4-8b17-951d-be44-f83c3a441cdc.png)


`Diagram`ボタンをクリックすると以下のようにダイアグラムが生成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/e0462c9e-5ffe-eb79-c141-f39b3ced0638.png)
使い方　備忘録

見出しの書き方
- マークダウン方式
- プログラムの書き方
```
for i in range(10):
print(i)
```
- 表の書き方
| Left align       |       Right align |    Center align    |
|:-----------------|------------------:|:------------------:|
| This             |              This |        This        |
| column           |            column |       column       |
| will             |              will |        will        |
| be               |                be |         be         |
| left             |             right |       center       |
| aligned          |           aligned |      aligned       |
Next.jsプロジェクトで`src`ディレクトリを作成するか？比較とユースケース別推奨

# はじめに

Next.jsを使ったプロジェクト作成時に、`src`ディレクトリを作成するかどうかを問われることがあります。初学者の私は脳死でデフォルトの”利用しない”を選択しています。この記事では、`src`ディレクトリを作成する場合としない場合のメリット・デメリットを掘り下げ、ユースケース別にどちらを選ぶべきかを解説します。

## 結論

- **短期的・小規模プロジェクトや学習目的**では、シンプルな`src`なし構成を採用するのが合理的です。Next.jsのデフォルト構成で効率的に開発を進められます。
- **長期的・大規模プロジェクトやチーム開発**では、`src`ディレクトリを作成することで拡張性と保守性を確保できます。


## `src`ディレクトリを作成する場合

### メリット

1. **プロジェクト構造の明確化**
   - ソースコードが`src`以下に集約されるため、設定ファイルやテストコードなどと明確に分離できる
   - プロジェクトが大規模化してもフォルダ構造がわかりやすい

2. **スケーラビリティと保守性**
   - コンポーネントやユーティリティ、APIロジックなどを整理しやすく、長期的な運用でも保守性が高い

3. **他フレームワークとの一貫性**
   - ReactやVue、Angularなどの他フレームワークでも採用されている構造で、フロントエンド開発者にとって馴染み深い

4. **チーム開発における明確な指針**
   - 「アプリケーションの実装はすべて`src`内に配置する」というルールを定めやすく、チーム間での認識を統一しやすい

### デメリット

1. **ディレクトリ階層が深くなる**
   - `pages/`ディレクトリが`src/pages/`のように深くなるため、ファイルパスの記述が長くなる場合がある

2. **追加設定が必要なケースがある**
   - JestやESLint、Vercelの設定をカスタマイズする必要が生じる場合がある

3. **初心者にはやや複雑**
   - 小規模プロジェクトや学習目的ではフォルダ構成が過剰に感じられる可能性がある

---

## `src`ディレクトリを作成しない場合

### メリット

1. **シンプルな構造**
   - デフォルトで`pages/`や`app/`がルート直下に配置されるため、設定不要でわかりやすい

2. **学習コストが低い**
   - Next.jsを学び始めたばかりの初心者でも、公式ドキュメントに準拠した構造でスムーズに開発を進められる

3. **迅速なプロトタイピング**
   - 初期段階で迅速に開発を進めるのに最適

### デメリット

1. **スケーラビリティの限界**
   - プロジェクトが大規模化すると、ファイルがルート直下に散在し、管理が煩雑になる可能性がある

2. **チーム開発での混乱**
   - 他フレームワーク出身者にとっては`src`がない構造が不自然に感じられることがある

3. **ツールや設定との相性**
   - テストコードやStorybookなど、外部ツールの設定で`src`構造を前提とするものがある場合、後から構成を変更する必要が生じる可能性がある
---

## ユースケース別推奨構成

以下は、プロジェクト規模や開発体制に応じた推奨構成です。

| ユースケース                                | プロジェクト規模        | チーム構成人数       | 推奨構成  | 理由                                                                                           |
| ------------------------------------------ | ----------------------- | ------------------- | --------- | ---------------------------------------------------------------------------------------------- |
| **学習目的／個人検証**                     | 小規模～中規模         | 1人（少人数）       | **`src`なし** | デフォルト構成で学習コストを抑えられる。                                                       |
| **短期プロジェクト／PoC**                  | 小規模                 | 1〜数人            | **`src`なし** | 迅速な開発が求められるため、余分な設定が不要。                                                 |
| **スタートアップ／成長が見込まれる場合**   | 中規模～大規模         | チーム拡大中       | **`src`あり** | 拡張性を担保し、将来的にフォルダを増やしやすい構成を採用。                                     |
| **長期運用を前提とした企業プロジェクト**   | 大規模                 | 10人以上           | **`src`あり** | 長期的な保守性と管理のしやすさが重要。                                                         |
| **モノレポ構成 (Turborepo / Nx等)**        | 小規模〜大規模         | チーム規模問わず    | **`src`あり** | 他のアプリケーションやパッケージとの整合性を保つため。                                         |


---

**参考:**  
- Next.js公式ドキュメント: https://nextjs.org/docs  
- Turborepo公式サイト: https://turbo.build/repo
自分用メモ：micro:bitでスイッチを使うときに利用するプルアップ・プルダウンを改めて整理した

マイコンでスイッチを使うときに利用するプルアップ・プルダウン。
micro:bitで毎度「あれ、これどうやって使うんだっけ？」となるので改めて整理しました。

## そもそもなんのためにやるのか？
単純に3Vとポートをつなぐと3V(1)、つながないと0V(0)というやり方でも動きますが、0V(0)のときにノイズなどに弱くなるようです。
より信頼性の高い回路にするためにはプルアップ・プルダウンを行う必要がある、とのこと。

## どういうときにどちらを使う？
スイッチONの時0Vにしたい場合 → プルアップ＆スイッチはGNDと該当ポートに接続
※内部的には3Vと該当ポートの間に抵抗が追加
※なにもない時3V(HIGH)なのでプルアップ

スイッチOFFの時0Vにしたい場合 → プルダウン＆スイッチは3Vと該当ポートに接続
※内部的にはGNDと該当ポートの間に抵抗が追加
※なにもない時0V(ダウン)なのでプルダウン

## サンプルプログラム

https://makecode.microbit.org/S85260-97934-63389-66901

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71746/5a69681e-3eb6-5157-0d9a-f1d46b8f84ad.png)

## 参考文献
https://voltechno.com/blog/pullup-pulldown/
SSHについて

SSH keyについての備忘録

SSHキーとは、セキュアな通信を行うための「デジタル鍵」のことです。これを使うと、インターネット上でデータを安全にやり取りできるんです。

SSHキーは2つの部分で構成されています：

公開鍵（Public Key）: これは、ネット上で自由に配布しても大丈夫な部分です。

秘密鍵（Private Key）: これは、自分だけが持っている部分で、他の人に見せちゃダメです。

これを錠と鍵の関係に例えてみましょう：

公開鍵は錠のようなもので、誰でも持っているドアの鍵穴みたいなものです。

秘密鍵はその錠にぴったり合う唯一の鍵です。この鍵を持っているのはあなただけです。

どうやって使うかというと：

サーバー（リモートコンピュータ）に公開鍵を配置します。

自分のコンピュータには秘密鍵を持ちます。

通信するとき、サーバーは「公開鍵」であなたを認識し、あなたの「秘密鍵」で通信を解読します。

つまり、秘密鍵を持っている人だけが安全に通信できる仕組みなんです。これにより、データのやり取りが安全であることが保証されます。


sshは何の略語ですか？
SSHは「Secure Shell」の略です。つまり、セキュアなシェルという意味ですね。SSHは、安全にリモートコンピュータと通信するためのプロトコルで、主にリモートログインやリモートコマンド実行に使用されます。

安全な通信を確保するために、SSHは暗号化技術を使ってデータのやり取りを保護します。これにより、ネットワーク上の盗聴や改ざんからデータを守ることができます。
tar はハードリンクを適切に扱える

## はじめに

あまり知られていないことですが、tar はハードリンクを適切に扱えます。

ハードリンクで同じ `inode` 番号を持つファイルがあったとき、tar はその `inode` 番号を持つファイルは、同じデータを参照するように格納します。

## tar と zip でハードリンクを格納してみる

tar と zip でハードリンクを格納してみて、動作をみてみます。

### 検証用のデータ作成
はじめに、適当な 100MB のランダムデータをつくり、ハードリンクを張ります。
```
$ dd if=/dev/urandom of=./test01.bin bs=1M count=100
100+0 レコード入力
100+0 レコード出力
104857600 bytes (105 MB, 100 MiB) copied, 0.234722 s, 447 MB/s
$ ln test01.bin test02.bin
```
ファイルサイズは 100MB で、同じ `inode` 番号 `102510978` を持っています。
```
$ ls -lih
合計 201M
102510978 -rw-rw-r-- 2 user user 100M  1月 14 22:25 test01.bin
102510978 -rw-rw-r-- 2 user user 100M  1月 14 22:25 test02.bin
```
### tar archive 作成

圧縮オプション無しで、tar archive を作成します。
```
$ tar cvf sample.tar *.bin
test01.bin
test02.bin
```
### zip archive 作成

比較用に zip archive も作成します。
```
$ zip sample.zip *.bin
  adding: test01.bin (deflated 0%)
  adding: test02.bin (deflated 0%)
```

### archive のサイズ確認

このとき、ファイルサイズがどうなっているかというと、
```
$ ls -lh sample.tar sample.zip 
-rw-rw-r-- 1 user user 101M  1月 14 22:27 sample.tar
-rw-rw-r-- 1 user user 201M  1月 14 22:27 sample.zip
```
tar が 101MB に対して、zip 圧縮が 201MB になっています。
これは tar が同じ `inode` 番号のファイルをまとめるのに対して、zip が個別にファイルを圧縮するためです。

## ファイルの展開と確認

### tar を展開した場合

先程の tar を展開すると、どうなるかというと、
```
$ mkdir extract-tar
$ tar xvf sample.tar -C ./extract-tar/
test01.bin
test02.bin
$ ls -lih ./extract-tar/
合計 200M
102511042 -rw-rw-r-- 2 user user 100M  1月 14 22:25 test01.bin
102511042 -rw-rw-r-- 2 user user 100M  1月 14 22:25 test02.bin
```
展開した後も同じ `inode` 番号を持つファイルとして作成されています。
つまり、ハードリンクが維持された状態で戻されたということです。

### zip を展開した場合

一方、zip の場合は、
```
$ mkdir ./extract-zip
$ unzip sample.zip -d ./extract-zip/
Archive:  sample.zip
  inflating: ./extract-zip/test01.bin  
  inflating: ./extract-zip/test02.bin  
$ ls -lih ./extract-zip/
合計 200M
102511044 -rw-rw-r-- 1 user user 100M  1月 14 22:25 test01.bin
102511045 -rw-rw-r-- 1 user user 100M  1月 14 22:25 test02.bin
```
`inode` 番号が別々のものとなっており、ハードリンクが切れた状態です。
この後は、一方を更新しても、もう一方は更新されない状態になります。

## おわりに

tar は歴史的にも Linux のファイルシステムを扱うのに、とても長けています。
tar でまとめた後に、gzip や bzip2、xz で圧縮をかけたりしますが、それは tar に Linux ファイルシステムで保持される情報の大部分を格納することができるためです。

本記事ではまとめませんが、acl や xattr、sparse も扱えます。
`/dev` 配下のスペシャルデバイスも扱えます。
root 権限でファイルシステムをまとめた場合は、owner や permission がそのままの状態で保持されます。

tar は Linux の root filesystem をそのままバックアップするのに、非常に適したツールだったのです！
[.NET] SDKとランタイムをLinuxにインストールする様々な方法

https://learn.microsoft.com/ja-jp/dotnet/core/install/linux

こちらを参考にして書きました。

# dotnet-install.shを使う
https://dot.net/v1/dotnet-install.sh
ここからスクリプトをダウンロードして実行できるようにします。
```sh
curl -LO https://dot.net/v1/dotnet-install.sh
chmod +x ./dotnet-install.sh
```
```sh
dotnet-install.sh --version latest # 最新版をインストールする
dotnet-install.sh --channel 8.0 # 特定のバージョンをインストールする
dotnet-install.sh --channel 8.0 --runtime aspnetcore # .NETランタイムをインストールする
```

# パッケージマネージャーを使う

## Arch Linux

```sh
sudo pacman -Sy dotnet-host dotnet-runtime dotnet-sdk
```
`dotnet-host`以外は`dotnet-sdk-6.0`などにするとバージョンを変更できます。
(`dotnet-runtime`, `dotnet-sdk`は.NET 8で、.NET 9は他の手段でないとインストール不可)

.NETに関連したパッケージ一覧はこちらhttps://archlinux.org/packages/?sort=&q=.NET

## Ubuntu 24.10

```sh
sudo apt update && sudo apt install dotnet-sdk-9.0 dotnet-runtime-9.0
```
`9.0`の部分を変えて他のバージョンもインストールできます。(.NET 6は使用不可)

## Fedora

```sh
sudo dnf install dotnet-sdk-9.0
sudo dnf install aspnetcore-runtime-9.0 # ASP.NETが必要ないなら dotnet-runtime-9.0
```
Ubuntuと同じく`9.0`を変えて`8.0`がインストール可能です。

# 手動でインストールする

https://dotnet.microsoft.com/download/dotnet

ここからダウンロードしてきてパスを通す...普通に遠回りなのでおすすめしません。
CIDRの計算方法について知る

業務や資格試験勉強でCIDRに触れたのですが、理解が浅かったので調べて学んだことをまとめます。

## 1. CIDRとは？
CIDR（Classless Inter-Domain Routing）は、IPアドレスを効率的に管理・割り当てる方法です。
通常のIPアドレスのようにクラス（A, B, Cなど）で分けるのではなく、ネットワーク部の長さを柔軟に指定する仕組みです。
CIDRでは、IPアドレスの先頭からどこまでがネットワーク部であるかをビット数で表します。  
例えば、`/27` は「IPアドレスの先頭27ビットがネットワーク部」という意味です。
因みに、CIDRの読み方はサイダー。飲み物のサイダーとは違うイントネーション。

## 2. IPアドレスの構造
IPv4アドレスは32ビット（4オクテット、8ビット×4）で構成されています。  
そのため、`/27`の場合、次のようにネットワーク部とホスト部が分かれます。

- **ネットワーク部**: 最初の27ビット  
- **ホスト部**: 残りの5ビット（32ビット - 27ビット = 5ビット）

## 3. ホスト部のビットで表せる数
ホスト部の5ビットで表現できるアドレスの数は次のように計算されます

$$
2^5 = 32
$$

つまり、ホスト部の組み合わせが32通り存在するため、1つの`/27`サブネットには**32個のIPアドレス**が含まれます。

## 4. 実際のIPアドレス範囲
たとえば、`192.168.1.0/27`というネットワークでは

- **最初のIPアドレス（ネットワークアドレス）**: `192.168.1.0`  
- **最後のIPアドレス**: `192.168.1.31`  

この範囲内には**32個のアドレス**が含まれます。

## 5. 注意点: 有効なホストアドレス数
ただし、以下の2つは特別な用途に使われるため、ホストには割り当てられません。

1. **ネットワークアドレス**: サブネット自体を示すアドレス（例: `192.168.1.0`）  
2. **ブロードキャストアドレス**: サブネット内のすべてのホストに送信するアドレス（例: `192.168.1.31`）  

その結果、`192.168.1.0/27`というネットワークの有効なホストアドレス数は次のようになります。

$$
32 - 2 = 30
$$

また、AWSやAzureではネットワークアドレスとブロードキャストアドレスに加えて内部利用のための3つのアドレス予約されています（Google Cloudは2つ）。
そのため、AWSやAzureでは有効なホストアドレス数は次のようになります。

$$
有効なホストアドレス数=総IPアドレス数−5
$$

## まとめ
- `/27`は「ネットワーク部27ビット、ホスト部5ビット」を意味する
- ホスト部5ビットが作る32通りのアドレスが含まれるため、**IPアドレスの数は32個**である 
- ただし、特別な用途に使われるため、ホストには割り当てられないアドレスが2つある
- パブリッククラウドでは内部利用のために予約されているアドレスがある
ReactプロジェクトでpropTypes関連の厳格すぎる警告を解消する設定

Reactプロジェクトで、`propTypes` に関連する警告が「厳しすぎる」と感じたことはないでしょうか。
実際にエラーではないのに警告として表示される場合や、不要なルールが適用されていることで開発の妨げになることがあります。
この記事では「`propTypes` に関連する厳密すぎるチェック」を緩和する方法を記載します。

---

## よくある例
`propTypes` に関連してよく表示される警告

- **`'onClick' is missing in props validation`**
- **`PropTypes is not defined`**

これらの警告は、`propTypes` を使用しない場合や、チェックが厳しすぎる場合に不必要と感じること多い

---

## **1. propTypes の警告を無効化する**

`propTypes` を使用しない場合（TypeScript で型チェックを行う場合など）、ESLint で `propTypes` に関連する警告やエラーを無効化できる。

### **手順**
1. プロジェクトに ESLint の設定ファイルを確認する
   - ファイル名：`.eslintrc.json` または `eslint.config.js`
   - 存在しない場合は新規作成

2. 設定ファイルに以下を追加

#### **`.eslintrc.json` の例**
```json
{
  "extends": ["eslint:recommended", "plugin:react/recommended"],
  "plugins": ["react"],
  "rules": {
    "react/prop-types": "off" // propTypes の警告を無効化
  }
}
```

#### **`eslint.config.js` の例**
```javascript
module.exports = {
  extends: ["eslint:recommended", "plugin:react/recommended"],
  plugins: ["react"],
  rules: {
    "react/prop-types": "off" // propTypes の警告を無効化
  },
};
```

---

## **2. 必要なパッケージをインストール**

ESLint の React プラグインがインストールされていない場合、以下のコマンドでインストール

```bash
npm install eslint eslint-plugin-react --save-dev
```

これにより、React 用の ESLint ルールが適用可能に

---

## **3. 設定が適用されない場合の対応**

設定後も警告が残る場合は、以下の手順を試してみる。

### **キャッシュのクリア**
ESLint のキャッシュが原因で設定が反映されないことがある。以下を実行

```bash
npx eslint --clear-cache
```

その後、再度 ESLint を実行する：

```bash
npx eslint . --fix
```

---

## **4. propTypes を使用する場合の設定例**

`propTypes` を使用する場合、適切に設定することで警告を防ぐことができる。

### **例: propTypes を定義する**
```javascript
import PropTypes from 'prop-types';

function Button({ onClick }) {
  return <button onClick={onClick}>Click Me</button>;
}

Button.propTypes = {
  onClick: PropTypes.func.isRequired, // 必須の関数型
};

export default Button;
```

### **警告が発生するケース**
以下のように `propTypes` を定義しない場合、警告が発生する：

```
'onClick' is missing in props validation
```

これを防ぐために、`propTypes` を適切に定義するか、上記のように警告を無効化する。

---

## **5. 厳密すぎるチェックが不要な場合の対処法**

### **React 17+ の場合**
React 17 以降ではJSX を使う際に `import React from 'react';` が不要になったので、このため、以下のルールを無効化しておくと良いかもです

```json
"react/react-in-jsx-scope": "off"
```

### **未使用変数の緩和**
未使用の変数に関する警告が厳しい場合は、以下のようにルールを緩和

```json
"no-unused-vars": "warn"
```

これにより、未使用の変数は警告として表示されるが、エラーとして扱われない。

---

## **6. まとめ**

React プロジェクトで `propTypes` に関連する厳格すぎる警告を解消するには、

1. **`propTypes` の警告を無効化する設定を追加する**
2. **ESLint の React プラグインをインストールする**
3. **必要に応じてルールを緩和する**

これらの手順で、開発を妨げる不要な警告を減らし、快適な環境を整えられます👏
(DAY21) 俺と学ぶRust言語~if let~

# 今日の内容
- if letの使い方

# はじめに
[前回](https://qiita.com/FUKAch/items/e13841e7d9f3ef45bba7)はOptionとResultを組み合わせたエラーハンドリングの応用について学びました。今回は **if let** について学びます。

# if let
`if let`は今までの記事で何回かでてきましたが、明確に触れたことはありませんでした。
今日しっかりと学んで、使えるようになりましょう。

`if let`は、Rustでパターンマッチングを簡潔に書ける便利な構文です。特に、OptionやResultなどの列挙型の値を扱うときに使われます。match構文よりもコードがシンプルで読みやすくなる場面に適しています。

ここで、条件分岐の「if」と変数定義の「let」を使っているわけではないことに注意してください。**「if」と「let」と『if let』は全くの別物です。**

### 基本構文
```rust
if let パターン = 式 {
    //パターンにマッチした際の処理
}
```
- 式: マッチング対象となる値（例えばOptionやResultなど）
- パターン: 取り出したい値や条件を記述


### 基本例: Optionでの記述
**matchで書いた場合**
```rust
let some_value = Some(42);

match some_value {
    Some(x) => println!("Value: {}", x),
    None => println!("No value"),
}
```

**if letで書いた場合**
```rust
let some_value = Some(42);

if let Some(x) = some_value {
    println!("Value: {}", x);
} else {
    println!("No value");
}
```
- `if let`を使うと、特定のパターンにだけ注目して簡潔に書ける
- 必要ならelseブロックで、マッチしなかった場合の処理も書ける

### Resultを使った例
```rust
let result: Result<i32, &str> = Ok(10);

if let Ok(value) = result {
    println!("Success! Value: {}", value);
} else {
    println!("Error");
}
```
- **Ok(value)** の場合に値を取り出し、Errの場合はelseで処理

# if letの利点
1. コードが簡潔になる
    - 特定のケースだけを処理したい場合に有効
    - matchのように全てのケースを網羅する必要がない
1. 可読性の向上
    - ネストが浅くなるため、可読性が上がる

# 応用例: ネストした構造体や列挙型
ネストされたOption
```rust
let nested = Some(Some(5));

if let Some(Some(x)) = nested {
    println!("Nested value: {}", x);
} else {
    println!("No value");
}
```

# if letとmatchの使い分け
- if letを使うべきケース
    - 特定のパターンだけに注目したい時
    - 他のケースは無視して良いとき
- matchを使うべきケース
    - 全てのケースを網羅して処理したい時
    - より複雑なパターンを扱う場合

# 実践例: ファイルの読み込み
以下のプログラムでは、「example.txt」という名前のファイルを開けたかどうかを示します。開くことができれば、そのファイルの中身を表示します。
```rust
use std::{fs::File, io::Read};
fn main() {
    let file_result = File::open("example.txt");

    if let Ok(mut file) = file_result {
        let mut content = String::new();
        file.read_to_string(&mut content).unwrap();
        println!("File contents:\n{}", content);
    } else {
        println!("Can't open!");
    }
}
```

プロジェクトファイル内に「example.txt」を用意して、中身を次のようにしました。
![スクリーンショット 2025-01-14 224544.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964975/3290e002-6b12-5c52-0556-013b539effb1.png)

実行結果
```
File contents:
Hello, world!

This is a pen.
これは、ペンです。
```

# おわりに
今回はif letについて学びました。
次回はコマンドライン引数の扱い方を学びます。
arduinoIDEでファイル分割をすると理由のわからんエラーがでる。

arduinoIDEでファイル分割機能がある。

いろんな人の説明を見ると分割機能は、
分かれたファイルを単純に結合して、実行できる機能と説明があったので
私も始めは以下のような感じで分けてみた

```c:Main.inc
#define VERSION 10000
 
// カメラ設定============================================================
// Pin definition for CAMERA_MODEL_ESP32S3_EYE
#define PWDN_GPIO_NUM -1
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 15
#define SIOD_GPIO_NUM 4
#define SIOC_GPIO_NUM 5

#define Y2_GPIO_NUM 11
#define Y3_GPIO_NUM 9
#define Y4_GPIO_NUM 8
#define Y5_GPIO_NUM 10
#define Y6_GPIO_NUM 12
#define Y7_GPIO_NUM 18
#define Y8_GPIO_NUM 17
#define Y9_GPIO_NUM 16

#define VSYNC_GPIO_NUM 6
#define HREF_GPIO_NUM 7
#define PCLK_GPIO_NUM 13

// Pin definition for SD MMC
#define SD_MMC_CMD 38  //Please do not modify it.
#define SD_MMC_CLK 39  //Please do not modify it.
#define SD_MMC_D0 40   //Please do not modify it.

// LoRa設定==============================================================
#define M0_M1 46  //E220のM0,M1
#define LORARXD 19
#define LORATXD 20

// ボタン、LED===========================================================
#define PUSH_SW 21
#define STS_LED 47

```

```c:a_SDCard.inc
/*----------------------------------
概要：画像の保存フォルダ作成
引数：fs=SDカードのオブジェクト  path=対象パス
戻値：なし
-----------------------------------*/
void createDir(fs::FS& fs, const char* path) {
  Serial.printf("Creating Dir: %s\n", path);
  if (fs.mkdir(path)) {
    Serial.println("Dir created");
  } else {
    Serial.println("mkdir failed");
  }
}

```

```c:b_setup.inc
void setup(){
    delay(2000);

}
```

```c:c_loop.inc
void loop(){
    delay(2000);
}
```

今回なぜこんな分け方をしたかというと、
Mainのところではピンアサインのセット
a_***では今回使用したい機能だけインポートすればすぐに使える
みたいなコンセプトでしたのだが実際にやってみると全然動かない。
エラーが出まくる。

試しにコードをすべて同じファイル（Main.inc）に書き込むと正常にコンパイルできる。

色々原因を探ってみるとMain.incで
・include処理
・setup
・loop
を宣言しないとだめみたいだった。

あくまで分けたファイルでは、関数の作り込みしかできなみたい。

残念。。。
ReClineとSourceSageとCopilotの無料Language Model APIを使用したTerraformインフラ改修の実験レポート

## 概要
本レポートでは、AWS Terraformコードの改修作業において、ClineのフォークであるReCline（Copilotの無料Language Model API、Claude 3.5 Sonnet搭載）とSourceSageを組み合わせた実験結果を報告します。

<blockquote class="twitter-tweet" data-media-max-width="800"><p lang="ja" dir="ltr">ReCline（Claude 3.5 Sonnet） ✖ SourceSage で Terraformのアーキテクチャを改修してもらった②<br>無事に有識者の方からのアドバイスのお蔭でClaude 3.5 Sonnet 使えました！<br>＊4oよりもモッサリしているので、タスクによって切り替えた方がいいかもです <a href="https://t.co/jyyETEIK2C">https://t.co/jyyETEIK2C</a> <a href="https://t.co/SPu1MX4YOu">pic.twitter.com/SPu1MX4YOu</a></p>&mdash; Maki@Sunwood AI Labs. (@hAru_mAki_ch) <a href="https://twitter.com/hAru_mAki_ch/status/1878822060031680957?ref_src=twsrc%5Etfw">January 13, 2025</a></blockquote> 

## 開発環境セットアップ

### SourceSageのインストールと設定
```bash
# SourceSageのインストール
pip install sourcesage

# リポジトリ情報の収集
sourcesage

# 生成されるドキュメントの場所
.SourceSageAssets\DOCUMIND\Repository_summary.md
```

## 実験内容

### 1. セキュリティグループの改修タスク

**前提条件:**
- SourceSageによるリポジトリ構造の文書化
- ReClineの設定

**指示内容:**
```
下記で下記の複数のセキュリティグループをアタッチするようにして

cloudfront_security_group_id: sg-03e35cd397ab91b2d
default_security_group_id: sg-07f88719c48f3c042
vpc_internal_security_group_id: sg-0097221f0bf87d747
whitelist_security_group_id: sg-0a7a8064abc5c1aee
```

**ReClineの挙動:**
1. SourceSageが生成したリポジトリ構造を基に、関連ファイルを特定
2. 既存コードの依存関係を分析
3. 変更が必要なファイルのリストを作成
4. 段階的な変更を提案：
   - common_variables.tf
   - terraform.tfvars
   - compute/variables.tf
   - compute/main.tf
   - networking関連モジュール

**結果:**
- 変数型の定義を`string`から`list(string)`に変更
- モジュール間の変数受け渡しをリスト形式に対応
- 関連するすべてのモジュールでの参照を更新

### 2. セキュリティグループの説明追加タスク

**指示内容:**
```
セキュリティグループそれぞれにdescription を付与して可読性を上げて
```

**実装プロセス:**
1. SourceSageのリポジトリ構造を参照
2. 関連するセキュリティグループ設定ファイルを特定
3. 各セキュリティグループの役割を分析
4. 説明文の追加と更新

## ツールの統合効果

### SourceSageの貢献
1. **プロジェクト構造の可視化**
   - リポジトリ全体のマークダウンドキュメント生成
   - ファイル間の依存関係の明確化
   - モジュール構造の体系的な把握

2. **LLMの制御強化**
   - プロジェクト全体のコンテキスト提供
   - 関連ファイルの特定精度向上
   - 不適切な変更の防止

### ReClineの活用
1. **コード解析と生成**
   - Terraformベストプラクティスの適用
   - 型の整合性維持
   - モジュール間の一貫性確保

2. **インタラクティブな改修**
   - エラーフィードバックの提供
   - 段階的な変更提案
   - ユーザーフィードバックへの適応

## 具体的な変更例

```hcl
# 変数定義の変更
variable "security_group_ids" {
  type        = list(string)
  description = "List of security group IDs to attach"
}

# モジュール呼び出しの更新
module "compute" {
  source = "./modules/compute"
  
  security_group_ids = [
    var.cloudfront_security_group_id,
    var.default_security_group_id,
    var.vpc_internal_security_group_id
  ]
}
```

## 結論

SourceSageとReClineの組み合わせは、以下の点で特に効果的でした：

1. **構造化された開発アプローチ**
   - リポジトリ全体の文書化
   - 改修影響範囲の正確な把握
   - 段階的な変更管理

2. **品質管理の向上**
   - コードの一貫性維持
   - エラーの早期発見
   - ベストプラクティスの適用

3. **効率的な作業プロセス**
   - 必要な変更箇所の迅速な特定
   - 自動化された文書生成
   - レビュー工数の削減

この統合アプローチにより、大規模なインフラコードの改修作業を、より安全かつ効率的に実施することができました。特に、SourceSageによるリポジトリ構造の可視化が、ReClineのコード改修精度を大きく向上させる結果となりました。


## 参考サイト

https://github.com/Sunwood-ai-labs/SourceSage

https://code.visualstudio.com/api/extension-guides/language-model

https://github.com/julesmons/recline

<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
【UiPath】2024年の暮れの技術ネタまとめました🎍 (シリーズ1)

# はじめに

- 本記事は、UiPath アドベントカレンダーを読んだ筆者の感想です。
- 今回は技術ネタを具体的に書き込んでる記事をピックアップさせていただきました。
- 記事の内容は、個人の見解または確認結果であり、UiPath の公式見解ではありません。

# webhookとAPIを活用したOC運用

OC運用で次の様な課題をお持ちの方は是非ご一読ください！
1. 通知が使えない
1. フォルダを跨いでジョブ結果が見れない
1. 開始順でトリガーが見れない
1. タイムトリガーのメンテが面倒
1. ログ検索で、日本語検索が使えない

https://note.com/miya_gis/n/n925ce53cfa34

# はじめて知った”タプル”型 - 超リッチなディクショナリって感じ(・∀・)ｲｲﾈ!!

```
# タプル型（値5つの例）
System.Tuple<T1,T2,T3,T4,T5>
```
↑ディクショナリのTValueにこの型を指定しておけば、ディクショナリ変数("フィールド名").Item3 といったかたちで対象レコードの3つ目の要素値を取得することができるんです！ディクショナリはデータテーブルより値操作が簡単なので、これは便利そうｂ

https://qiita.com/saosao885/items/d10e124d136bbe503e46

# レコーディング機能 ＆ クライアントバイナリの自動更新ポリシー

見出しで？がついた方は必読！v23.X以上のユーザーはだいたい使ってるんではないでしょうか。

https://qiita.com/Gaboz/items/7e05085f4fd1d761fdd9

# 請求書読み取りのプロンプトエンジニアリング一例

取引先だけチューニング後も100%になってませんでしたが、仕入先やベンダー名といった項目は人が見ても間違うことがあるので難しいですよね
デジタル化データは判子とか文字の太さ、サイズとかが落ちちゃうからLLMも大変だよ(＠_＠;)

https://qiita.com/shuy/items/24538e74b85134ff820d

# Autopilot for Everyone ← 略して A4E ！！

リアル秘書ロボットが手元に来る時代にまた一歩近づきました🚀

https://note.com/chuki082/n/n447209e039da?sub_rt=share_sb

# Hey You! Linux Robot つくっちゃいなよ🤖

Linux Robot のメリットと利用手順についてのご紹介。
ワークフローをクロスプラットフォームで作成する必要がありますが、
マシンのデプロイはコマンド一つで容易に実行できます！
Unattended Robot 実行環境の選択肢として検討する価値大ありです！！

https://qiita.com/hidecha/items/b78a74d82c5d0f5c24f9

# StudioWeb × Document Understanding

StudioWeb の認知度もジワリジワリと上がってきている気がしますね。
クラウドOC（Automation Cloud）じゃないからと、DUをあきらめてる方がいたら是非ご一読ください！
最初は StudioWeb で手軽にDUはじめてみるのもいいんじゃな～い(=ﾟωﾟ)ﾉ
StudioWeb で値抽出までして、デスクトップのST/RTは抽出結果を取得・加工するところからスタート

https://qiita.com/Kajiita/items/a939211fe24ec25e9bff

https://qiita.com/Kajiita/items/9ad2d6f8bcf0b1d62866

# UiPath資格取得体験記｜アソシエイト＆プロフェッショナル短期間一発合格への道

よっしーさん、すごいよ、えらいよ　これから取ろうとおもった方は是非参考にしてみてください

https://qiita.com/kyasarin/items/315f8aa335ddadf297b6

# プロジェクトノートブックの記事はじめてみたかも(＠_＠)

StudioX ユーザーの方は是非ご一読ください！
意外とつかってないって方が多いんですよね
Studio にはない便利機能なので初心者の方には是非読んで欲しい

https://qiita.com/mh_ti_fu/items/63f8e9e03b1d12664fcb

# StudioX 開発Tips

Tips目次
1. 半角を全角に、全角を半角にしたい
　例）任意の文字列を全角→半角へ変換
1. 日付の加算・減算をサクッとアクティビティ

https://note.com/kambekinu/n/ncbdea75c9322

# さいごに

いかがでしたでしょうか。
1月分（シリーズ1）でも、読むのに1時間以上かかりました。もうお腹いっぱいです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/629a4b3f-0ab7-b5a5-ec68-7aaa8af90151.png)

最後までお読みいただきありがとうございます(・ω・)ノ
ページネーションの検討

大量のデータをスクロール毎に取得するページネーションAPI設計を検討

ページネーションの検討
```YAML
openapi: 3.0.0
info:
  title: Credit Card Transaction API
  version: 1.0.0
paths:
  /transactions:
    get:
      summary: Retrieve credit card transactions
      description: |
        Retrieves credit card transactions. The initial request returns 50 transactions, and subsequent requests return 30 transactions each.
      parameters:
        - name: userId
          in: query
          required: true
          description: The ID of the user
          schema:
            type: string
            example: 'user123'
        - name: offset
          in: query
          required: false
          description: The offset for pagination
          schema:
            type: integer
            example: 0
      responses:
        '200':
          description: Successfully retrieved transactions
          content:
            application/json:
              schema:
                type: object
                properties:
                  transactions:
                    type: array
                    items:
                      type: object
                      properties:
                        transactionId:
                          type: string
                          description: The ID of the transaction
                          example: 'txn12345'
                        date:
                          type: string
                          format: date-time
                          description: The date of the transaction
                          example: '2023-10-01T12:34:56Z'
                        amount:
                          type: number
                          format: float
                          description: The amount of the transaction
                          example: 123.45
                        description:
                          type: string
                          description: The description of the transaction
                          example: 'Grocery Store'
                  nextOffset:
                    type: integer
                    description: The offset for the next set of transactions
                    example: 50
        '400':
          description: Bad Request - Invalid input data
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    example: 'Invalid input data'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    example: 'Internal Server Error'
```
在庫管理アプリの作成備忘録 C# WPFアプリ開発

## 経緯
在庫管理したいものがある。
WPFでおしゃれなアプリを作りたい。
システム開発の知見をつけたい。
visual stugioに触れたい。

## デモ
◎在庫一覧画面
在庫管理ライフサイクル：入荷後→研磨後→研磨後→入荷後　
入荷後から次の入荷までを1周期30日として2周期目は何本在庫があれば足りるか？を考えます。
今期の減り具合から30日後何本になっているかを予測します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/b2454ee3-ab34-4369-a03c-7d8854e682db.png)

◎在庫登録画面(本日)
本日登録した明細を閲覧できます。
ラジオボタンで画面を切り替えます。
グラフで直感的に在庫の減り具合を確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/d922c1bb-4708-3181-6eba-f169aadf3062.png)

◎在庫登録画面(入荷後～本日)
入荷後～本日登録した明細を閲覧できます。
ラジオボタンで画面を切り替えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/612b8721-d3d1-17b2-2bbe-e58f0c59d9c8.png)

◎在庫削除画面
変更画面を押すと、削除扱いとなります。削除したものは予測から除外されます。グラフからも表示されません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/a45ba03b-85a2-0a56-e0c9-fd73ff272eba.png)

◎グループ番号とは
在庫管理ライフサイクル：入荷後→研磨後→研磨後→入荷後　
在庫ライフサイクルを管理するためのフラグです。入荷後登録を行うと、グループ番号が+1されて、以降グループ番号+1の在庫しか見れなくなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/6cae82ad-14c0-8824-55b9-edb0d4dfdace.png)



## インストール＆ダウンロードするもの

ポスグレSQL バージョン17をインストールすること。↓私が用意したグーグルドライブの中にインストーラーおいてます。
DBインストール時に聞かれるパスワードは admin71994 にしてください。

https://drive.google.com/file/d/1_iy9lVYqk2J51K0Nt7CCB_Bxk8vz8NWK/view?usp=sharing

アプリケーション git cloneすること。

https://github.com/arisaEN/squeegeeZaiko_App_2

## 仕組み
アプリケーションからポスグレDBに在庫が記録されていきます。
初回起動時にDB、ユーザ、関数、テーブルがbatによって初期化処理(作成)されます。

squeegeeZaiko_App_2\zaiko\zaiko\bin\Release\net8.0-windows\postgresBackup\postgresRes.bat
このbatです。

<font color="red">**作成する前にリストア対象のSqueegeeManagementテーブルに関するオブジェクトを全て削除しています。DBのバックをとってから実行を推奨します。**</font>


DB、ユーザはコード内で初期化処理されて、関数、テーブルがbatによって初期化処理されています。


## 実行方法
DBインストール→アプリダウンロード→

squeegeeZaiko_App_2\zaiko\zaiko\bin\Release\net8.0-windows\zaiko.exe
実行。

## 感想
MVVMという設計思想があるそうですがそれに基づいて作っていません。これからもどんどん入っていく分野であるならば勉強します。
このアプリはMとVMがくっついているかな。という感じです。

DB初期化処理について、batを使っていますが、コードで記述したほうがいいと思いますので次回はコードで初期化処理をします。

git cloneしないでZipダウンロードすると、batがunix形式(LF)で返ってきます。この形式だとwindowsで実行できないので初期化処理できずアプリケーションが立ち上がりません。
ここで半日悩みました。
やはりコードでDB初期化しようと身に沁みました。

おしゃれさ：VBAのユーザーフォームと比べるとおしゃれですが、youtubeに上がっているようなプロのおしゃれには程遠い。ユーザーに気持ちよく使ってもらうために精進する必要があります。

参考

https://qiita.com/tera1707/items/f97f90fc10053becf765
動的SOQLのバインド変数に関する考慮事項

# この記事について

Apexの動的SOQLのバインド変数では、通常の静的SOQLのバインド変数と異なる仕様があったため記録する。

## オブジェクトのプロパティは使用できない

例えば以下の`acc.Id`のような、オブジェクトのプロパティを参照するバインド変数だと例外が発生する。
※Apexクラスのインスタンスのプロパティも同様

```apex
Account acc = new Account(Name = 'ABC株式会社');
insert acc;

String query = 'SELECT Id FROM Account WHERE Id = :acc.Id'; // "acc.Id"はダメ
List<Account> accounts = Database.query(query); // ここで例外発生：System.QueryException: Variable does not exist: acc.Id
```

この問題を回避するには、オブジェクトのプロパティを参照しなければよいので、プリミティブ型の変数を作成して使用するとよい。

```apex
Account acc = new Account(Name = 'ABC株式会社');
insert acc;

Id accountId = acc.Id; // プリミティブ型の変数を作成し "acc.Id" を代入

String query = 'SELECT Id FROM Account WHERE Id = :accountId'; // オブジェクトのプロパティを参照しないため例外が発生しない
List<Account> accounts = Database.query(query);
```

## `Database.query`メソッドの実行時点のスコープ内にある変数名である必要がある。

動的SOQLだとしばしば別のメソッドや`QueryBuilder`などのカスタムApexクラスを用いてSOQLを作成することがあるが、バインド変数が`Database.query`メソッドを実行する際のスコープ内に存在している必要がある。

例えば、以下のような動的SOQLクエリを作成する`buildQuery`メソッドがあったとする。

```apex
public class SampleQueryBuilder {
    public static String buildQuery(String accountId) {
        return 'SELECT Id FROM Account WHERE Id = :accountId';
    }
}
```

このメソッドを使用して以下のようなコードを実行した場合、`accountId`という変数が`Database.query`メソッド実行時のスコープ内に存在しないため、例外が発生する。

```apex
Account acc = new Account(Name = 'ABC株式会社');
insert acc;

String query = SampleQueryBuilder.buildQuery(acc.Id);

List<Account> accounts = Database.query(query); // ここで例外発生：System.QueryException: Variable does not exist: accountId
```

この問題を回避するには、バインド変数で使用する変数を`Database.query`メソッド実行時のスコープ内（`Database.query`メソッドを呼び出しているメソッド内）に作成する必要がある。

```apex
Account acc = new Account(Name = 'ABC株式会社');
insert acc;

String query = SampleQueryBuilder.buildQuery(acc.Id);

Id accountId = acc.Id; // スコープ内に"accountId"がある状態。クエリの実行時にこの変数が使用される

List<Account> accounts = Database.query(query);
```
【Vscode】Gitが表示されない問題を解決する方法ついて

# はじめに
会社のPCが新しいものに変わったため、環境構築をやり直す必要がありました。その際に、`VSCode`のアクティブバーに`Git`が表示されないという問題が発生しました。本記事では、この問題を解決した方法を共有します。

# 問題点
`VSCode`のアクティブバーに`Git`のアイコンが表示されない状態になっていました。
もちろん、コマンドラインで`Git`を使うことは可能ですが、`GUI`の方が便利なので、これを使用できるようにしたいと思いました。

![スクリーンショット 2025-01-14 22.04.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835217/f670a3f9-1aba-d9a3-87a5-401fb7c894e2.png)


# 解決策
以下の手順で解決しました

1. ***アクティブバーを右クリックします。***
※アクティブバーは、`VSCode`の左側にあるアイコンが並んだ部分のことです。
2. ***表示されたメニューの中から、「ソース管理」にチェックを入れる。***

![スクリーンショット 2025-01-14 22.04.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835217/b63d334c-cd88-02cc-b94b-f7efcdf2ebd7.png)

これで、アクティブバーに`Git`のアイコンが表示されるようになります。以下のような画面になります。

![スクリーンショット 2025-01-14 22.04.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835217/4b130b50-bfc6-d910-11c4-75ce7683cd5c.png)

# 終わりに
簡単な設定変更で解決できる問題でしたが、普段あまり気にしない部分だったため少し手間取りました。同じような状況になった方の参考になれば幸いです！
SQLアンチパターン読書メモ

# はじめに
[『SQLアンチパターン』](https://www.oreilly.co.jp/books/9784873115894/ "SQLアンチパターン")を読んで学んだことをメモしていきます。
<img width="300px" src="https://www.oreilly.co.jp/books/images/picture_large978-4-87311-589-4.jpeg" >

# 全体の感想
技術書として非常に読みやすく、内容がスムーズに頭に入ってきます。約8割は既に知っている内容でしたが、「知っている」と「実践できる」は別物です。この本を通じて頭の中を整理することで、自分のSQLスキルが一段階向上したと感じました。
若干古い内容もありますが、おすすめできる本です。

# メモ
以下の内容は自分で下書きしたものをChatGTPに清書してもらいました。

## ツリー構造の格設計メリデメ
ツリー構造の各設計手法とそのメリット・デメリット
コメントに対するコメント、さらにそのコメントに対するコメント、といった形でデータがツリー構造になる場合、ユースケースに応じていくつかの設計手法が考えられます。
中には普段使う機会が少ない方法もありますが、知識として持っておくことで、必要な場面で役立つでしょう。特に「閉包テーブル」方式は、現時点でのベストプラクティスとされています。
(P30)

## とりあえずIDはNG
例えば、commentsテーブルの主キーを「id」とするか「comment_id」とするか、という議論があります。
一般的にはテーブルの主キーを単に「id」とするケースが多いですが、これにはアンチパターンとされる側面もあるとのこと。こういった命名ルールについては、組織全体で認識を合わせることが重要です。

私自身は「comment_id」のように具体的な名前を使用する方が好ましいと考えています。ただし、これまでの経験上、「id」を用いる方が一般的だと感じます。

また、「comment_id」のように主キーに具体的な名前を付けると、テーブルを結合する際に USING 句が使用できるようになる点は確かにメリットです。ちなみに、USING 句については、本書で初めてその存在を知りましたが、シンプルで読みやすいクエリを書く上で有用な機能だと感じました。

## 外部キー嫌い
「外部キー制約を省略すれば、データーベース設計がシンプルになり、柔軟性が高まり、実行速度が速くなると思っている読者もいるかもしれません。しかし、そこには代償があり、代償は別の形で支払わなくてはならないのです。つまり、開発者であるあなたに、参照整合性を保証するためのコードを書く責任が生じるのです。」
（引用:アンチパターン 第4章)

この指摘には私自身も考えさせられます。私の現場でも、外部キー制約を付けないことが多いです。これは、少し前までPostgreSQLではパーティションテーブルに外部キー制約を設定できなかったため、その名残が影響しているのかもしれません。（現バージョンでは外部キー制約がサポートされています。）今一度、設計を見直す必要性を感じています。

##　ラウンディングエラー（丸め誤差）

FLOAT型では、実測値と理論値の間に誤差が生じる場合があります。
例えば、x = 59.95 のとき、x * 100000000 の結果が 59950000762.939 となるケースがあります。
これは、FLOAT型が内部で2進数を用いて小数を表現する仕組みによるものです。2進数では少数の正確な表現が難しく、1/2, 1/4, 1/8, 1/16,... のような組み合わせで近似を行うため、丸め誤差が発生します。

本書では、こうした特性によって利子の計算などの金融処理に支障をきたす可能性がある点を指摘しています。正確な計算が必要な場面では、NUMERIC や DECIMAL 型を使用することが推奨されています。

この知識は、データ型選択の際に慎重さが求められる重要なポイントだと感じました。

## WHERE A = NULLがNGな理由
WHERE A = NULL がなぜNGなのか、これまで理解していませんでしたが、本書の説明は非常にわかりやすいものでした。

### NULL = A の例
オリバーの年齢が不明だとします。
Q: オリバーは10歳ですか？
A: わかりません。
→ 結果は NULL となります。

### NULL = NULL の例
オリバーの年齢とケイシーの年齢がどちらも不明だとします。
Q: オリバーの年齢はケイシーの年齢と同じですか？
A: わかりません。
→ 結果は NULL となります。

このように、NULL は「不明」を表すため、WHERE A = NULL のような比較では真偽を確定できず、条件として使用することは適切ではありません。その代わりに、IS NULL を使用して明示的に確認する必要があります。
この説明を読んで、NULL の扱いについて理解が深まりました。

## グルーピング
group byやjoinを利用した集計処理の方法が列挙されている。(P162)
これは別の機会に手元で実行計画を確認したいところです。

## 全文検索のアンチパターン
実務で検索機能を作った記憶はないが、SQLのLIKE句と%を利用した検索は遅いのは間違いないでしょう。SQLだけで高速な検索エンジンを作るのは難しいのでサードパーティやキャッシュなどの工夫が必要。この辺は[『システム設計の面接試験』](https://www.amazon.co.jp/%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E8%A8%AD%E8%A8%88%E3%81%AE%E9%9D%A2%E6%8E%A5%E8%A9%A6%E9%A8%93-%E3%82%A2%E3%83%AC%E3%83%83%E3%82%AF%E3%82%B9%E3%83%BB%E3%82%B7%E3%83%A5%E3%82%A6/dp/4802614063)も参考になる。

# 最後に
この本はタイトルもキャッチーで以前から読みたかった本でした。
内容も理解できたし、知っている内容も多かったので自信がつきました。
今後はリファクタリングとかコードのお作法的な本が積んであるので読み進めたいです。
Web素人がVueのtutorialをやってみる その2 (Step5/15 ～ Step6/15 まで)

# 概要
[前回](https://qiita.com/tak_y07/items/e9e056a888831caa3e17)に引き続きVueのチュートリアルをやってみます。今回はStep5からの続きです。
今回はポモドーロを試しているので変なところで終わるかも…

# Step5
双方向バインディングについて

### データバインディング
[参考](https://zenn.dev/harper/articles/7d0d7208ea753a)
UIの変更とデータを同期させる仕組み。
データからUIへの反映を認めるが逆は認めないのが**単方向バインディング**、
両方向の反映を認めるのが**双方向バインディング**。
後者はシンプルだが拡張性に乏しく、前者がその逆。
Vueは前回の`v-bind`と`v-on`を併用することで双方向バインディングが実装できる。

双方向バインディングの構文は下記の通り。単体のタグの中に`v-bind`と`v-on`が同居している。

`<input :value="text" @input="onInput">`

上記のシンタックスシュガーとして`v-model`ディレクティブが用意されている。

`<input v-model="text">`

これを使った場合、HTML要素ごとに規定のイベントがハンドルされる。
テキストのinputなら`@input`, `<input type="checkbox">`なら`@change`など。

## Step5 実践
以下を`v-model`を使ってリファクタする。
```Step5.vue
<script>
export default {
  data() {
    return {
      text: ''
    }
  },
  methods: {
    onInput(e) {
      this.text = e.target.value
    }
  }
}
</script>

<template>
  <input :value="text" @input="onInput" placeholder="Type here">
  <p>{{ text }}</p>
</template>
```

リファクタ後は下記
onInputメソッドまで省略されているところがポイント！
```Step5-Ans.vue
<script>
export default {
  data() {
    return {
      text: ''
    }
  }
}
</script>

<template>
  <input v-model="text" placeholder="Type here">
  <p>{{ text }}</p>
</template>
```

# Step6
条件付きレンダリングについて

### v-ifディレクティブ
`v-if`ディレクティブで条件付きレンダリングが可能。

`<h1 v-if="awesome">Vue is awesome!</h1>`

awesomeプロパティがTruthyなら描画される。

:::note 
Truthy : 真値とみなせる値のこと。Falsyな値を除く全ての値はTruty
Falsy : JSで偽値として定義されている値。0, "", null など
:::

`v-else-if` や `v-else` の条件も作成できる。

`<h1 v-else>Oh no 😢</h1>`

# Step6実践
```Step6.vue
<script>
export default {
  data() {
    return {
      awesome: true
    }
  },
  methods: {
    toggle() {
      this.awesome = !(this.awesome)
    }
  }
}
</script>

<template>
  <button @click="toggle">Toggle</button>
  <h1 v-if="awesome">Vue is awesome!</h1>
  <h1 v-else>Oh no 😱</h1>
</template>
```

結果は下図。ボタンをクリックするごとに表示が変わる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759711/dc72dd39-8b9b-91c9-0a13-ae0e0ea3a475.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759711/85020647-8b21-5963-5464-831ffc1a054a.png)

## 番外 FizzBuzz
作れる気がしたのでやってみます。
```FizzBuzz.vue
<script>
export default {
  data() {
    return {
      count: 0
    }
  },
  methods: {
    increment() {
      this.count++
    },
		reset() {
      this.count = 0
    }
  }
}
</script>

<template>
  <button @click="increment">Count : {{count}}</button>
  <button @click="reset">Reset</button>
  <h1 v-if="count % 15 == 0">FizzBuzz</h1>
  <h1 v-else-if="count % 3 == 0">Fizz</h1>
  <h1 v-else-if="count % 5 == 0">Buzz</h1>
  <h1 v-else>{{count}}</h1>
</template>
```

結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759711/6e4521f6-4a4a-3dce-708f-637eeef32716.png)
動きました。ちょっとおもしろい。

## 続く
ちょうどポモドーロのタイマーが鳴ったので今回はここまで😊
次回に続きます。多分…。
ChatGPT O-1 にエンジニアとして生産性を上げるには？と質問してみた

なるほどな、と思わされたのでキータのアカウントを作成してアウトプットしていくことにしました

<details>
  <summary>GPTの回答</summary>
  プログラマとして業務生産性を上げるためには、「質の高いアウトプットをいかに少ない時間で出せるか」が大きなテーマです。とくに独学で大量の知識を習得していくには、学びと実践を効率よく回すことが欠かせません。以下、いくつか具体的なコツを紹介します。

### 1. 学習計画を立てる・優先度をつける
学ぶべき範囲を明確にする: 新技術やフレームワークは数多く存在しますが、闇雲に学び始めると時間がいくらあっても足りません。「今の業務にすぐ必要なもの」「将来的に業務をより効率化できそうなもの」のように、優先度をつけてから取り組むだけでも無駄を削減できます。
目標を設定する: 「この技術を使って○○を作れるようになる」「この分野の基礎を2週間で身につける」といった具体的な目標を定めましょう。短いスパンで達成感を味わうことで学習モチベーションも維持しやすくなります。
### 2. インプットとアウトプットをセットにする
本やドキュメントは丁寧に読む: 独学では書籍や公式ドキュメントが基本的な学習手段となります。特に公式ドキュメントは最新版の情報が載っていることが多いので、まずはざっと内容を掴むように読み込みましょう。
すぐに手を動かす: 新しい言語やフレームワークは、読んだだけでは身につきません。サンプルコードやチュートリアルをできる限り早く試し、「動かしてわかる」を繰り返すのが最短ルートです。
小さなプログラム・サンプル作成: 書籍や記事を読みながら、簡単なプログラムを自分で書き写してみる、少し改変して動かしてみることを繰り返します。習得スピードや理解度が大きく違ってきます。
### 3. “わかったつもり”をなくすための工夫
学習ノートやブログでの記録: 学習した内容を人に教えるように整理して記述することは、深い理解につながります。「この原理は○○だから、××という処理をする」というように一貫した説明ができるまで落とし込んでおくと、仕事での応用が早くなります。
コーチングやペアプロの機会を活用: 同僚やコミュニティ、オンライン学習サービスなどで教え合い、質問し合うことで客観的な視点を得ることができます。「自分の説明を理解してもらえるか」という観点は独学では得にくいですが、大きな学びに繋がります。
### 4. 環境整備・効率化ツールの活用
エディタ・IDEの使いこなし: ショートカットの活用やプラグインの導入などで、コーディングスピードは大幅に向上します。初期投資（設定時間）を惜しまず、使いやすい開発環境を整えましょう。
タスク自動化: ビルドやテストの自動化、デプロイの自動化など、繰り返し作業はできるだけツール化・スクリプト化することで本来の開発時間を増やせます。
知識管理ツールの活用: Qiita、Notion、Obsidian、Evernoteなどを使ってコードスニペットやメモを整理・共有すると、調べ直す時間を削減できます。
### 5. アウトプットに直結する練習方法
業務の延長上にある個人プロジェクト: 勉強だけではなく、現在や今後の業務で役立ちそうな個人開発をしてみることで、学習と実務のブリッジをかけられます。
OSS（オープンソース・ソフトウェア）へのコントリビュート: GitHubなどでプロジェクトに参加すると、他の人のコードやプルリクエストに触れられ、実践的な知識が身につきます。周囲からのフィードバックは学習を加速させます。
定期的な振り返りと改善: 「一定期間でどれだけ学んだか」「何がわからなかったか」「次の課題は何か」を定期的に振り返るサイクルを回しましょう。これだけでも学習効果が大きく変わります。
### 6. 時間管理とモチベーション維持
ポモドーロ・テクニックの導入: 25分作業＋5分休憩のように区切って学習やコーディングを行うと、集中力が持続しやすくなります。
学習コミュニティへの参加: 一人だとモチベーションが下がりがちなときにも、コミュニティや勉強会に定期的に参加することで刺激を得られます。
こまめなセルフケア: 体調やメンタルを崩すといくら効率化のツールがあっても成果が出ません。睡眠・食事・運動など、基礎的な健康管理にも気を配りましょう。
### まとめ
学習計画と優先度づけ
インプットとアウトプットをセットに
“わかったつもり”をなくす工夫（ノート化・ペアプロなど）
開発環境の整備・自動化の徹底
実践的なアウトプットを増やす（OSS貢献など）
時間管理とモチベーション維持
これらのコツを意識して独学を進めると、大量の知識を身につけつつ、実務にも直結する形で成長することができます。学びを継続しつつ、知識をすぐに実務や個人プロジェクトに落とし込み、どんどん経験を蓄積していきましょう。

  
</details>

昔から言われていそうな、当たり前のことと思われるかもしれませんが、
自分は全然できていませんでした、、、

これまで大体で使ってきたgithub,typescriptなど
未だに基礎がしっかりしていない

今日からでも少しずつ、丁寧に、優先順位をつけて、効率的にインプットとアウトプットを繰り返していこうと、
そういう決意を芽生えさせられました
【Splunk】MaxMind を使用した IP GeoLocation の設定方法

Splunk で MaxMind を活用して IP GeoLocation の設定を行う方法をご紹介します。IPアドレスから地理情報を取得し、分析や可視化に役立てたい方には参考になるかもしれません。

※本記事で示す手順は、筆者が定めた最低限の可動要件を満たす設定と動作確認のみを目的として、自身の備忘用のレベルで記しています。運用性やセキュリティ上の細かな考慮等は省いている場合があります。もし各手順を試される場合には自己責任でお願い致します。

# MaxMindのライセンス取得
まず、MaxMind の GeoLite2データベースを取得するため、ライセンス登録が必要です。MaxMindのライセンス取得手順については、サーバーワークス社のブログ（[【GeoLite2】MaxMindの無料ライセンスキー取得手順](https://blog.serverworks.co.jp/2022/03/09/161620)）を参考にしましたので、詳細はそちらを確認してください。

ライセンス登録後に提供されるアカウントを利用して、後続の設定を行います。

# Appの導入
SplunkのAppで "MaxMind" と検索して、該当のApp（[Auto Update MaxMind Database](https://splunkbase.splunk.com/app/5482)）があるのでありがたく利用させていただく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507379/edb12a11-c250-655f-a7c5-239fb16a9acb.png)

MaxMind で取得したライセンス情報（Account ID & License Key）を入力し、[Save]ボタンを押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507379/e7483d31-8a8f-a105-f7c9-3cb3089bdd23.png)

画面上に以下の表示が出たら、地味だがSaveされたと信じてこちらの設定は完了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507379/5a6fffd3-993f-78a2-7609-3ec4a426af71.png)

設定が完了したら、そのまま"サーチ"画面に遷移し、``` | maxminddbupdate ``` コマンドを実行し、データベースを更新する。「Max Mind Database updated successfully.」と出力されれば OK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507379/4d03afae-a1f7-f606-5011-ec4181649172.png)

動作ログの確認が必要な場合は、``` index=_internal sourcetype="auto_update_maxmind_db:logs" ``` を発行すれば確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507379/65fe8545-f94b-48d2-7d34-b9c22c49161a.png)

さらに気になる場合は、＄SPLUNK_HOME/share/ に以下のファイルが作成されていることを確認する。
```
$ sudo ls -lh $SPLUNK_HOME/share/
total 97M
-r--r--r-- 1 splunk splunk  97M Dec  7 15:10 dbip-city-lite.mmdb
-r--r--r-- 1 splunk splunk 4.3K Dec  7 15:10 iso3166.csv
```

# 動作確認

適当に、Firewallのログ（何等かグローバルIPを含むログデータを収集している前提）などで iplocation を使ってみる。RegionやCityが読み込めていれば、意図通りに IP GeoLocation の情報と紐づけられていると思われる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507379/5f7a500d-e22e-accf-8e49-12bebcfde9fc.png)


```bash:参考：動確に使用したSPL文
index=main "dstip=<ログ収集に使っているFirewallなどのIP>" "action=deny" earliest=-86400s@s latest=now 
| top 10 srcip
| iplocation srcip
| table srcip, Country, Region, City, count
```

# まとめ
Splunkで収集したログデータに対して、MaxMind を使用して IP GeoLocation を設定することで、IPアドレスから都市や国情報を取得し、より詳細な分析が可能になります。

- MaxMindのライセンス（GeoLite2 Free Geolocation Data）の入手
- Splunk上での MaxMind の設定
- Splunk上での IP GeoLocation の利用

ぜひ、セキュリティ分析のニーズに合わせ、IP GeoLocation の活用をご検討くださいませ。

# 参考
- [MaxMind](https://www.maxmind.com/en/home)
- [Splunk Search Reference: iplocation](https://docs.splunk.com/Documentation/Splunk/9.4.0/SearchReference/Iplocation)
swapについて

# swapとは
メモリ内の非アクティブな内容をハードディスクに保存することで、メモリに余裕を持たせること。

- swap領域：メモリが逼迫した時に、ハードディスク上にメモリを保存する領域。

# なぜswapを作成するのか
サーバをメモリ不足で停止されないようにするため。


# swap領域の作成と有効化（4GB）
### 1.メモリ情報を確認
```
free -h
```
※swapはまだ0B。

### 2.swap領域確保（4GB）
```
sudo dd if=/dev/zero of=/swapfile bs=1M count=4096
```

### 3.権限変更
```
sudo chmod 600 /swapfile
```

### 4.swap領域として設定
```
sudo mkswap /swapfile
```

### 5.swapの有効化
```
sudo swapon /swapfile
```
※sudo swapoff /swapfileで無効

### 6.再度メモリ情報を確認
```
free -h
```
※swapが4.0Giになっていることを確認。

### 7.再起動後もswapが有効化されるように設定
```
sudo vi /etc/fstab
/swapfile swap swap defaults 00
```
fstabに上記の記載をしないと、再起動した時にswapが無効になる。（再起動するたびに手動で有効化することになる。）

以上
【PL-200 合格体験記】Microsoft Power Platform 業務コンサルタント

## 概要
今更ですが、Power Platform の資格の一つ、`PL-200: Microsoft Power Platform 業務コンサルタント`に合格したので誰かの役に立てばと思い情報を残しておきます。

### 受験の動機
- 業務で携わる際に都度調べていた知識を、体系的に学ぶため
- 学習の結果が目にみえる形で残ることで、個人的に嬉しくなるため

### 所感・結果
業務で必要知識は得られたが、使わない（と思われる）知識も学習する必要がありました。非エンジニア（あるいは非開発者）でも取得することが可能ですが、資格自体が必要かどうかは一考の余地があると思います。　
Score: 722点/1000点（ぎりぎり）
受験回数: 1回
総勉強時間: 30h（1日1hで1ヶ月ほど）

## PL-200とは
[こちら](https://learn.microsoft.com/ja-jp/credentials/certifications/exams/pl-200/)に詳細がまとまっています。
これまでの学習や試験の内容を踏まえてまとめると、`PowerPlatfom Solution（PowerBIは除く）を設計書に基づいて実装するひと向けの資格`と言えます。対象のスコープは、PowerPlatformの環境管理からDataverseを活用したモデル駆動アプリの実装、また要件の実現のためのテーブル・UIの設計と実装、ビジネスロジック設計の理解も必要となります。

## 学習方法
大きく4点を利用しました。
1. Udemy: PL-200:Microsoft Power Platform Functional Consultant Part 1
1. MS Learn
1. [MS Learn Practice Assessment](https://learn.microsoft.com/en-us/credentials/certifications/exams/pl-200/practice/assessment?assessment-type=practice&assessmentId=64)
1. LLM（gpt, geminiなど）による関連知識の解説（*どうしても理解できない箇所で仮の知識として使う。仮の知識を持ってドキュメントに戻るとなんか理解できる気がする）

1は必須ではないと思います。実務や個人で手を動かしたことがない方にとって通して学べる教材です（ただ、そもそも手を動かしたことがない人にとってこの試験が役立つのかはわかりません）。日本語訳が80%ほどの精度なので参考程度の教材です。今はYoutubeが充実していますのでそちらでも間に合わせることが可能だと思います。

2, 3は他の先駆者の方々もおっしゃる通り学習することが良いと思います。MS Learnでは`3のscoreが80%を超える`ことを一つの基準としていますが、幾度も繰り返すと正解を覚え始めるので理解度の指標として信用ができなくなっていきます。ベタな学習方法ですが、理解できているかどうかの判断は`正解である理由を説明できること`とすることが無難です。

また、理解度に自信がない状態であればPracticeではすぐに回答を確認し、referenceとなるMS（Microsoft）のdocumentを確認する方法をおすすめします。後述しますが、試験ではMS Learnが閲覧できますので、記憶よりもMS Learnのどこに回答となるdocumentがあるかを知っておくことが大切となります。

一応、必要な知識カテゴリが以下の通りと記載されていますが、個別の解説は他の方の記事がわかりやすい（私もお世話になりました）のでここではお譲りします。

- Microsoft Dataverse
- Microsoft Power Apps
- Microsoft Power Automate クラウド フロー
- Microsoft Power Pages
- Microsoft Power Platform 環境
- データ モデリング
- ユーザー エクスペリエンスの設計
- 要件分析

## 試験について
試験時間: 100分（時間はほぼ使い切った）
問題数: 凡そ40問（ケース問題も含む）
受験方法: テストセンター（自宅受験も可能）

幾つかのMS試験を受けて個人的なTips
- AZ-104で自宅受験をしたがテスト用のソフトの影響があったのか、ラップトップの動作がとても重くなった。MS Learn検索や通常のページ遷移でも1分ほどロスしとても焦ったため、その後はできるだけテストセンターで受験している
- 先述の通り本番でもMS Learnが使える。学習時からdocumentのサイトマップや記載内容の粒度（概要のみか具体的なソースも含まれるかなど）をある程度理解しておくと焦らない
- 他の方々もおっしゃるように試験問題の言語をときどき切り替える。試験内容の翻訳が完璧でないので選択肢を絞れない時や意味がわからない時は、使ってみると答えがわかることがある（これは学習時にも使うとよい）
- 休憩は可能。ただし、休憩をすると前の問題に戻ることができなくなる。（前の問題の答え合わせはできない）
#0014（2024/01/14）エクセルの拡張子のまとめ

# モチベーション
- エクセルデータの拡張子について気になったので調べてみた

# エクセルデータの拡張子一覧

| **拡張子** | **名前**                    | **説明**                                                                                              |
|------------|-----------------------------|------------------------------------------------------------------------------------------------------|
| `.xlsx`    | Excel Workbook              | 現行の標準形式。XMLベースで保存され、データ圧縮が行われています。マクロは含まない。                     |
| `.xlsm`    | Excel Macro-Enabled Workbook | マクロを含むことができる形式。マクロ付きのスプレッドシートを保存する際に使用されます。                   |
| `.xls`     | Excel 97-2003 Workbook       | 古いバイナリ形式。互換性のために使用されることがあるが、現在では非推奨。                               |
| `.csv`     | Comma-Separated Values      | カンマ区切りのデータ形式。フォーマットや計算式は保存されないが、軽量で他のアプリケーションと互換性が高い。 |
| `.xlsb`    | Excel Binary Workbook       | バイナリ形式で保存される高速・軽量なファイル形式。大容量データに向いている。                           |
| `.xltx`    | Excel Template              | 標準テンプレート形式。新しいワークブックをこの形式から作成することができます。                          |
| `.xltm`    | Excel Macro-Enabled Template | マクロを含むテンプレート形式。                                                                     |
| `.xml`     | Excel 2003 XML              | XMLベースの形式。旧バージョンとの互換性を保つために使用されることがあります。                           |
| `.txt`     | Plain Text                  | テキストデータのみを保存。データの区切り文字をカスタマイズできます（例: タブ区切り）。                 |
| `.prn`     | Formatted Text (Space Delimited) | スペースで区切られたテキスト形式。古いプリンタ用のデータ出力に使用されることがあります。               |


# .xlsx を解凍すると...

- .xlsxファイル自体は、実際には複数のXMLファイルがZIP形式で圧縮されたもの
- ファイルを解凍すると、
    - xl/: データ、スタイル、数式、マクロを格納
    - _rels/: ファイル間の関係情報を格納
    - docProps/: ドキュメントプロパティを格納

```
root/
├── [Content_Types].xml
├── _rels/
│   └── .rels
├── xl/
│   ├── workbook.xml
│   ├── worksheets/
│   │   ├── sheet1.xml
│   │   └── sheet2.xml
│   ├── styles.xml
│   ├── sharedStrings.xml
│   └── theme/
│       └── theme1.xml
└── docProps/
    ├── app.xml
    ├── core.xml
```

# 参考
- chatgptの回答を参考に