OmniAICreator/Qiita-1.07M huggingface dataset:
【RassberryPi4】Opencvを入れるのに苦労した話

# 陥った状況
RassberryPi4のセットアップをしていた時のこと。
32bit版のOSをインストールして、Python環境を立ち上げていると恐ろしいことに **「Opencvがインストールできない」** のです。
頭を抱えること実に3週間。様々試しましたが空振りの山。
その試行回数、会長vsメルエムの如し。
この記事は、今後時間を無駄にしないための備忘録です。

# 解決策
**64bit版OSを使用してください！**
上記環境下では、`pip install opencv-python`でインストール可能です。
32bit版での解決策は現状見つかっていません...😭

# 試してダメだったこと
32bit版のOSがインストールされた環境で下記のことを試しました。
**結論、全敗でした。** もし成功例をお持ちの方がいたらぜひ教えてください。
また、venvで仮想環境を立ち上げた中で今回の環境を構築しています。
※ ChatGPTの返答結果も含みます

### 単純にpipでinstallを試みる
* 最も単純な`pip install opencv-python`を実行
* しかし、metadata-generation-failedのエラーが発生してしまいました。
* これは、pip がソースからパッケージをインストールしようとした際に、その準備段階（通常 pyproject.toml や setup.py を使う）でエラーが発生したことを意味します。
* そこで下記を実行した上で再度pipコマンドを実行しましたがこれもダメでした。
    ```bash
    sudo apt update
    sudo apt install python3-dev python3-pip build-essential
    pip install --upgrade pip setuptools wheel
    ```
### プリビルド版(piwheels)を使う
* 単純にpipでインストールするだけだと、以下の順序でパッケージを探します
    1. PyPI（https://pypi.org/simple/）からパッケージを探す
	2. 適合する wheel (バイナリ) パッケージ があればそれを使う
	3. なければソース（tar.gz など）をダウンロードして ビルドする
* これに対して下記のオプションを指定することが可能です
    * --prefer-binary: ソースでなくバイナリ（.whl）を優先的に使う
    * --extra-index-url [URL]: PyPI 以外のパッケージインデックス（リポジトリ）も検索対象に含める
* 以上を合わせて下記のコマンドでプリビルド版のインストールが可能なはずでしたが、`subprocess-exited-with-error`が発生し失敗に終わりました。

    ```bash
    pip install opencv-python --prefer-binary --extra-index-url https://www.piwheels.org/simple/
    ```

### headless版をインストール
* 画面表示などの機能が落とされた軽量版としてopencv-python-headlessが存在するらしい
* 下記を試すもこの策も無惨に散る

    ```bash
    pip install opencv-python-headless==4.5.1.48
    ```

### aptでOpencvをインストール
* venvで動作することを諦めてaptでインストールすると`import cv2`が通るという記事を見つけて試してみました。
* しかし、これも失敗。
* インストールまではできるも、pythonスクリプト内で`import cv2`が通りませんでした。

    ```bash
    sudo apt update
    sudo apt install python3-opencv
    ```

### pythonのバージョンを下げる
* デフォルトでPython3.11系で動いていたので3.9系にダウングレードし上記を再度試しました
* これも振るわず(ここから先はPython3.9系の環境で試した結果になります)

### 己でビルドを試みる
* pipで落としてくる際に、どうもビルドで詰まっていそうだったので、ビルド前の状態で取得して自分の環境でビルドしてみることにしました。
* 下記を実行してみましたが、最後は~~.oがないだの、バージョンが合っていないだの完全に沼にハマっていったのでここで諦めました
* 一応、ビルドツールのインストールから備忘録として残します
    ```bash
    sudo apt install cmake g++ python3-dev python3-pip \
                 libtiff5-dev libjpeg-dev libpng-dev libavcodec-dev \
                 libavformat-dev libswscale-dev libv4l-dev \
                 libxvidcore-dev libx264-dev libgtk-3-dev \
                 libatlas-base-dev gfortran
    git clone https://github.com/opencv/opencv.git
    cd opencv
    mkdir build
    cd build
    cmake ..
    make -j4
    sudo make install
    ```
Active StorageにCloudflare R2を使おうとした時に発生したAws::S3::Errors::InvalidRequest (You can only specify one non-default checksum at a time.)エラーの解決策

# はじめに
RailsのActive Storageを使ってCloudflare R2に画像をアップロードしようとした際に、***Aws::S3::Errors::InvalidRequest (You can only specify one non-default checksum at a time.)*** というエラーに遭遇しました。
このエラーの原因と、その解決策について共有します。

[こちら](https://github.com/rails/rails/issues/54374)のisuueを参考にしたので、気になる方は参照ください。

# エラーの原因
このエラーは、S3互換ストレージサービス（この場合はCloudflare R2）へのアップロード時に、AWS SDKがデフォルト以外の複数のチェックサム（checksum）を同時に指定しようとすることで発生します。

[こちら](https://github.com/aws/aws-sdk-ruby/issues/3174#issuecomment-2614450940)のaws-sdk-rubyのissueで解説してくれてます。

# 解決策
この問題を解決するには、***config/storage.yml*** ファイル内のCloudflare R2の設定に、***request_checksum_calculation*** と ***response_checksum_validation*** の2つのオプションを追加し、それぞれ"when_required"に設定します。

具体的には以下のように変更します。

```config/storage.yml
cloudflare:
  service: S3
  access_key_id: <%= Rails.application.credentials.dig(:cloudflare, :access_key_id) %>
  secret_access_key: <%= Rails.application.credentials.dig(:cloudflare, :secret_access_key) %>
  region: auto
  bucket: <%= Rails.application.credentials.dig(:cloudflare, :bucket_name) %>
  endpoint: https://<%= Rails.application.credentials.dig(:cloudflare, :account_id) %>.r2.cloudflarestorage.com
  public: true
  request_checksum_calculation: "when_required" # <- この行を追加
  response_checksum_validation: "when_required" # <- この行を追加
```

# まとめ
issueを読むとすぐに分かることではありますが、日本語で参考にできるものがあると便利だと思ったので、この記事を書いてみました！
Ubuntu に主要言語をインストールする

Ubuntu 24.04に主要言語をコマンドラインからインストールしたい
ついでにファイル拡張子、実行方法も覚えたい

# 言語一覧
1. C
1. C++
1. Go
1. Python
1. Perl
1. PHP
1. Java
1. Node.js
1. Ruby
1. rust

# インストール方法


## 1. C

```bash
sudo apt install gcc
```
拡張子　.c 

実行方法
```bash
gcc ファイル名.c -o 実行ファイル
./実行ファイル
```


## 2. C++
```bash
sudo apt install g++
```
拡張子　.cpp

実行方法
```bash
g++ ファイル名.c -o 実行ファイル
./実行ファイル
```


## 3. Go
```bash
sudo apt install golang
```
拡張子　.go

実行方法
```bash
go ru ファイル名.go
```
    

## 4. Python
```bash
sudo apt install python3
sudo apt install python3-pip 
```
拡張子　.py

実行方法
```bash
python3 ファイル名.py
```


## 5. Perl

```bash
sudo apt install perl
```
拡張子　.perl

実行方法
```bash
perl .perl
```


## 6. PHP

```bash
sudo apt install php
```
拡張子　.php
実行方法
```bash
php ファイル名.php
```


## 7. Java

```bash
apt-cache search openjdk
sudo apt update
sudo apt install openjdk-17-jdk
```

拡張子 .java

実行方法
```bash
javac ファイル名.java
javac ファイル名
```


## 8. Node.js
```bash
sudo apt install node.js
sudo apt install npm
```

拡張子　.js

実行方法
```bash
node ファイル名.js
```


## 9. Ruby
```bash
sudo apt install ruby
```

拡張子　.rb

実行方法
```bash
ruby ファイル名.rb
```


## 10.rust
```bash
curl https://sh.rustup.rs -sSf | sh
```

拡張子　.rs

実行方法
```bash
rustc ファイル名rs
```

--- 

Ubunut 24.04 で機能します
使い始めたら随時追加していきます.

~ Thank you for reading ~
公式配布停止系のprogram

圧縮fileを作るために、今なお現役として活躍し続けまくっている`bzip2`というprogramがあります。まあそれはどうでもいいとして、本題はその前身の`bzip`についてです。
`bzip`は`bzip2`を上回る圧縮性能を誇っているのですが、遥か昔に算術圧縮に関する特許問題で配布が停止されました。

## 現在
* bzip2が開発された背景には、元のbzipの算術符号に関する特許問題を回避する目的もありました。bzip2ではhuffman符号化を使用しており、算術符号と比較して約1%圧縮効率が劣るものの、解凍速度は約50%高速化されているッポイ
* 算術符号に関するIBMの主要特許は1980年代に出願されたものが多く、現在(2025年)では期限が切れているため、算術符号の実装に関する特許上の制約は基本的に解消されています

ちなみに1995年6月8日より前に出願されたAmerica特許は、発行日から17年、または最も早い関連出願日から20年のいずれか遅い方で期限切れとなるという規則があるんだとか…([参考文献](https://www.finnegan.com/a/web/190392/Patent-Terms-in-the-US.pdf))。
という訳で、もはや使い放題かもしれない`bzip`さん。肝心の入手先は[この辺](http://aminet.net/package/util/arc/Bzip-0.21)。手当たり次第物色してみて下さい。ただし全く普及していないと思われるので、配布目的にfile圧縮するのは薦められたものではありません。
ついでに言うと、現在では`bzip`より高速高圧縮のprogramが山ほどあるので、わざわざ利用する価値はほぼ皆無。技術屋さんは中身から色々学べる事はあるかもしれません
Claude Pro($20)プランでClaude Code並列バイブコーディングをやってみた

# 概要
6/5、**ClaudeのProプランでClaude Codeが使用可能になりました！**
やってみたかった並列VibeCodingを試してみました！

https://x.com/_catwu/status/1930307574387363948

## 前提

* Claude
    * Anthropic Claude Pro プラン
* コード管理
    * Git / GitHub
* IDE
    * Cursor + Git Worktree Manager(拡張機能)


## Git worktree とは

Git worktree は 1 つの Git リポジトリから複数のディレクトリ (並列仕様)を生成し、各「実行中ブランチ」を切り分けて開発できる Git 機能です。
**Anthoropicの公式チュートリアルでも、Git Worktreeでの並列開発が推奨されています！**

https://docs.anthropic.com/ja/docs/claude-code/tutorials#git%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%84%E3%83%AA%E3%83%BC%E3%81%A7%E4%B8%A6%E5%88%97claude-code%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B


### 1. worktree の作成 (コマンドまたは Git Worktree Manager)

``` bash 
# 1つ目ののworktreeを作成
$ git worktree add -b feature-a ../myapp-feature-a main

# 2つ目ののworktreeを作成  
$ git worktree add -b feature-b ../myapp-feature-b main

```


### 2. Git Worktree Manager 拡張を利用してワークツリーを複数起動

拡張機能から、ツリーを選択して別ウィンドウでIDEを立ち上げます。
各ウィンドウでターミナルを開き、Claude Code を起動します。



### 3. Claude Codeの起動

Claude Codeを起動します。
```bash
claude
```

はじめにテーマを選択します。どれでも良いです。

![スクリーンショット 2025-06-08 21.33.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116193/24d5a6a8-b787-4c37-93b1-caa54feb2b3b.png)

続いて、アカウントの認証を行います。
1. Claude account with subscriptionを選択します。
:::note warn
2. Anthoropic Console accountはAPI Keyを使用した従量課金モデルでの認証です。
:::

![スクリーンショット 2025-06-08 21.34.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116193/618b94ec-6df5-4ec1-b903-004a5fe13d94.png)

![スクリーンショット 2025-06-08 21.38.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116193/67feacb4-c132-4b44-a970-94d51da035e6.png)

ログインが完了しました。
その後、
* セキュリティの注意事項
* ターミナル設定

について聞かれます。内容を確認し先に進みます。

セットアップが完了しました！
ここまでくれば、あとは複数のウィンドウでclaudeから開発を実行します！
![スクリーンショット 2025-06-08 21.39.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116193/b3ce54c5-1454-4ba7-ba35-74d2d1b927ab.png)


:::note info
**複数のウィンドウでclaudeを立ち上げ、同時に複数の機能開発を実施することができます！！**
:::

## おわりに

Claude Code + Git worktree + Git Worktree Manager を組み合わせて、並列バイブコーディングを試して見ました。
出力されるコードもエラーが少なく、動く状態で出てくることがほとんどで驚きました…
今後は、
* GithubのIssueを参照し、複数のチケットに並行で着手する
* ルールを定義して異なるワークツリー間でも安定したコードを書く

ことにチャレンジしていきたいです！
ありがとうございました！

### 参考記事

https://support.anthropic.com/ja/articles/11145838-pro%E3%81%BE%E3%81%9F%E3%81%AFmax%E3%83%97%E3%83%A9%E3%83%B3%E3%81%A7claude-code%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B

https://zenn.dev/siu_issiki/articles/git_worktree
Meta Quest 3でスペースコロニーXRを体験してみた

# はじめに

Software Designに連載中の「万能IT技術研究所」で、2025年5月号に掲載されている「過去も未来も星座も超えるスペースコロニーXR体験」をMeta Quest 3で試してみた時の備忘メモです。


## 環境

MacOS M1 Sequoia 15.5
Meta Quest 3

# Jupyter Notebookを起動する

サンプルコードをダウンロードする。

```bash
git clone https://github.com/Mong-Kok/SD202505
cd SD202505
```

Jupyter Notebookの実行環境を構築する。

```bash
pip3 install jupyter folium pyppeteer pillow matplotlib opencv-python flask
```

ローカルでウェブサーバ(HTTPS)を動かすため、秘密鍵(key.pem)とSSL証明書(cert.pem)を作成する。

```bash
openssl genrsa -out key.pem 2048
openssl req -new -key key.pem -out csr.pem
openssl x509 -in csr.pem -days 365 -req -signkey key.pem -out cert.pem
```

Jupyter Notebookを起動します。

```bash
jupyter notebook sample4upload.ipynb
```


# スペースコロニーへ移植する地図データを作成する

動作させる場合、2つ問題が発生しました。

- Chromiumのヘッドレスモードがクラッシュする
- スクリーンショットのカラープロファイルがおかしい

1つ目の問題はヘッドレスモードをFalseにしてブラウザを表示します。(headless=True→False)

2つ目の問題はプログラムがエラーになり、最初は原因が分かりませんでした。
画像(地図データのスクリーンショット)から指定した色の矩形を切り出す際に、指定した色が見つからないというエラーが出ました。

①foliumで地図上に指定した色の矩形を表示
　↓
②スクリーンショットを取得(PNG画像を保存)
　↓
③PNG画像から指定した色の矩形を切り出す

PNG画像を表示して、スポイトツール(Digital Color Meter)を使用すると、矩形の色が指定した色とは異なっていました。
GIMPでPNG画像を表示すると、カラープロファイルが埋め込まれているというアラートが表示されました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/dd268f50-ad41-4840-b03e-c19111f3b1be.jpeg" width="50%">

矩形の色が指定した色と異なっています。

![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/e8158ba6-ad46-42f5-ba9d-ba99b038ff63.jpeg)

調べてみると、MacOSとChromeでキャプチャ画像が変色する事例が見つかりました。

https://www.wakatta-blog.com/mac-book-air2013chrome-capture.html

結果的に、カラープロファイルをsRGBに固定するオプションを見つけ、問題を回避できました。('--force-color-profile=srgb')

https://github.com/puppeteer/puppeteer/issues/1699

![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/889b4f22-f090-4b1d-b119-5636f4a2ca13.jpeg)

最終的には以下のとおりに修正して、正常に動作するようになりました。

```python
(修正箇所)
    browser = await launch(
        headless=False, # ブラウザを表示する
        args=["--disable-gpu", '--disable-web-security', # CORS無効化
        '--allow-file-access-from-files', # ローカルファイルアクセス許可
        '--force-color-profile=srgb'])  # カラープロファイルをsRGBに固定
```             


## 緯度・経度の指定

好きな場所の緯度・経度を指定して地図データを作成します。(サンプルコードは京都と尾道の例が使用されています)

```python
lat = 34.98686175788536;lon = 135.75880365485335 # 中心緯度経度を設定（京都の例）
lat = 34.40734340318606;lon = 133.19512024987176 # 中心緯度経度を設定（尾道の例）
```


# さいごに

無事にiPhoneとMeta Quest 3(標準ブラウザ)でコロニーを表示できました。

## iPhone

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/b7bcf7f5-cdb6-44b3-a942-1d178828d2bf.jpeg" width="33%">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/3ceadd17-2f0b-4085-a919-1bf52423aa3f.jpeg" width="33%">

## Meta Quest 3

![IMG_0669.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/974c9e57-6ba1-4dae-9886-af97abc5c683.png)
![IMG_0668.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/f0497b0e-4334-45a4-9fcb-a20c0ad74db0.png)
![IMG_0670.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/7439af12-bb1c-46b2-a2db-2ec7df8df8d9.png)
大域最適解（global optimum）ってなに？AIがめざす「いちばんいい答え」！中学生でも分かるようにわかりやすく解説！

こんにちは！

今日はAIや機械学習の世界でよく出てくる「**大域最適解（global optimum）**」という言葉について、中学生でもわかりやすく説明します！

実はこれは、AIが「いちばんいい答え」を探すときの目標なんです 🌟

---

## 🤔 AIは「いちばんいい答え」を探している！

AIや機械学習は、「**どんなときに、どう行動すればよいか**」や「**どうすれば正解に近づけるか**」を学ぶ技術です。

たとえば：

- **天気予報のAI** → 明日の天気をいちばん正確に予測したい  
- **自動運転のAI** → 事故が起きないルートを見つけたい  
- **ゲームをプレイするAI** → 勝率がいちばん高い方法を知りたい  

どの場合も、**「なるべく正しい・良い結果」を目指している**のです。

---

## 🏞️ 山や谷でイメージしてみよう！

### 🎮 たとえ話 → 山登り・谷探しゲーム

AIが「いちばんいい答え」を探すことは、**山や谷の中で「いちばん高い山のてっぺん」や「いちばん深い谷底」を探す**ことに似ています。

- **大域最適解（global optimum）**  
  → **全部の中でいちばんいい場所（最高の山 or 最深の谷）**  
- **局所最適解（local optimum）**  
  → **近くでは良さそうに見えるけど、もっと良い場所が他にある**

---

## 🧗 例：AIが「谷底」を探しているとき

### ▼ AIの目標 → **エラー（間違い）をなるべく小さくしたい**

学習中のAIは、「今の自分の予測はどれくらい間違っているかな？」と考えながら、**間違いを小さくする（谷底に向かう）**ように調整します。

でも…

- 途中で「お、ここがいちばん深いかも！」と思って止まってしまう → **局所最適解（local optimum）**  
- がんばってもっと探して、「ここがほんとうの一番深い場所だ！」にたどり着く → **大域最適解（global optimum）**

---

## 🚧 大域最適解を見つけるのはむずかしい！

現実の問題は、**山や谷がすごく複雑**です

- 山がたくさんあったり  
- 谷が入り組んでいたり  
- 広すぎて全部見るのがたいへんだったり  

そのため、AIが **うっかり途中で止まって「ここがベストだ」と思いこんでしまう（局所最適解にハマる）** ことがよくあります。

---

## 🛠️ AIはどうやって工夫しているの？

AIの学習方法（たとえば「**確率的勾配降下法（SGD）**」など）では、次のような工夫をします：

| 工夫 | 内容 |
|------|------|
| 少しランダムに動く | 偶然、他の良い場所を見つけるチャンスがある |
| 学習のスピードを調整する | 最初は大胆に動き、後半は慎重にする |
| 繰り返し試してみる | 何度も学習させて、より良い結果を目指す |

---

## ✅ まとめ

| 用語 | 意味 |
|------|------|
| 大域最適解（global optimum） | ぜんぶの中で「いちばんいい答え」 |
| 局所最適解（local optimum） | 近くではよさそうに見えても、もっと良い答えが他にある |
| なぜ大事？ | AIがほんとうに役立つ結果を出すためには、「大域最適解」に近づきたい |
CloudFormationでエクスポートした値をTerraformから参照する

## はじめに
[前回の記事](https://qiita.com/Snooze1229/items/13db9d701b91665baa4e)でCloudFormaitonのStackSetsを使用して以下のような構成を構築し、リソース情報をエクスポートしました。

結果だけ知りたい方は[こちら](https://qiita.com/Snooze1229/items/7c1cd6cc7fc0efebef14#%E6%A7%8B%E6%96%87)から

![MakeNetwork (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686037/f97805c2-8783-4e0c-b701-a76656cbf093.png)

今回はTerraformを使用してエクスポートされたAWSリソース情報を参照し、以下の様に構築をやっていきたいと思います。
![Trraform1.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686037/75a9f451-d36a-4b20-9c82-00103ac36fd3.png)

## 前提
・Terraform実行環境を用意
　→筆者はCloud9(実態はEC2)から実行しております。この場合EC2にアタッチされ
 　たロールの権限を使用する形になるので、RDSとSecretsManagerの権限がある事。

## 構築
コードは以下のものを使用します。
README1.mdに記載されている手順を使用しています。
https://github.com/Snooze2929/auto-maintenance

## 構文
TerraformからCloudformationのエクスポートされた値を参照するには以下のようになります。

```
data "aws_cloudformation_export" "任意のterraform上での名前" {
  name = "cloudformationのコンソールの出力タブの「エクスポート名」を入力"
}
```

以下、コンソールからの確認方法です。
![スクリーンショット 2025-06-08 21.18.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686037/e3f0e446-b2ab-4b2e-8e6e-3fe695fe6e6d.png)

以上です、お疲れ様でした。
pythonでwindowsトースト通知

- 内容

pythonでデスクトップ通知を送る方法

- 環境
    - os
        - win11
    - python
        - miniconda 23.5.2, python 3.11.13, pip 25.1
    - ライブラリ
        - plyer 2.1.0
        - win11toast 0.35

- 通知種類
- トースト通知
    - os標準の通知
    - トーストマシンみたいに飛び出してくるやつ

- コード

plyer

```python
from plyer import notification

notification.notify(    
title="タイトル",    
message="メッセージ",    
timeout=10
)
```

win11toast

```python
from win11toast import toast
import time

toast('Hello')
```

- 結果

![image(13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289989/4cccf9b0-5d54-4cd5-8c61-3bbcbaf14fd3.png)


- win11toastの機能

公式ドキュメント

https://pypi.org/project/win11toast/

ボタンの追加と返り値の取得ができる

```python
# コールバック関数：ボタンが押された時に呼ばれる
def on_button_click(args):    
print("✅ ボタンが押されました:", args)

# ボタン付きトースト通知を表示
toast(    
title="確認してください",    
body="今なにをしたいですか？",    
buttons=["食事する", "あとで", "無視する"],    
on_click=on_button_click
)

```

結果

![image(14).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289989/b8fac055-5a72-46c0-9fa4-4dce59654f88.png)


「食事する」を押すと、

![image(15).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289989/2e8121c7-7a1e-4f58-9f96-43c6e64a2439.png)

- 他の機能
    - テキストボックスでの入力
    - 音の再生
    - 画像表示
    - etc

- 課題
- トースト通知だとゲーム中に気付かない
    - 別のオーバーレイなど試したい
        - PyQt5を触ったがゲーム中は見えなかった
- 定期実行と組み合わせたい
    - 19:00に夕食の通知
        - 特定条件で再通知し続ける
            - 「食事する」ボタンを押すまで
            - パソコンを触り続けたら
            - など
    - 長時間パソコンを続けない, 適度な休憩・スタンディングに変えるなど知らせられるとうれしいかも？

- まとめ

定期実行, カレンダー連携などと組み合わせて理想の通知プログラムを作ろう！
マクロ　図形挿入

```
Sub sbAddRedRectangle()
    Call sbAddRedShape(msoShapeRectangle)    'shapeType：角が丸い四角
End Sub
 
Sub sbAddRedeRectangularCallout()
    Call sbAddRedShape(msoShapeRectangularCallout)      'shapeType：長方形の吹き出し
End Sub
 
Private Sub sbAddRedShape(shapeType As MsoAutoShapeType)
'MsoAutoShapeTypeはオートシェイプの形状を示す定数
'マニュアル作成作業でよく使用する赤枠・背景透明の図形を挿入する（図形の種類は引数で指定）
   With ActiveCell
        ActiveSheet.Shapes.AddShape _
             (Type:=shapeType, _
              Left:=.Left, Top:=.Top, Width:=100, Height:=50).Select
   End With
   Selection.ShapeRange.Fill.Visible = msoFalse
   With Selection.ShapeRange.Line
         .Visible = msoTrue
         .ForeColor.RGB = RGB(255, 0, 0)
         .Weight = 2.5  '太さ
         .Transparency = 0.3  '透明度
    End With
End Sub
今まで時間を取れず形にできなかったアプリをClaude Codeで爆速で作成する

# 概要
- とにかくClaude Codeがすごいと聞くので、とりあえず触ってみた
- 今までもCursorとかOpenrouterでAPIを叩いてみるものの、そもそも自分のコーディング能力が低くので、いまいち形にできずに終わっていた
- とりあえず、login methodをAPIモードで、10ドルくらい課金して使ってみることに...

# 作ってみたもの・・・ 「マネーフォワードMEのcsvファイルを元に折半するアプリ」
## 前提
- 普段、夫婦の家計管理はマネーフォワードMEで行なっています
- 基本、私の収入・支出を連携しており、一部妻のクレカで支払ったものは手動登録しておき、食費などは折半しています（全部、夫が支払えない。情けない...）
- マネーフォワードMEは、個人向けにはAPI提供していないため、1月分のcsvをダウンロードして、それを計算用のマスターとなるスプシに読み込み、関数にはめて、一部折半しています
  - イメージ
    ![Notification_Center.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2019425/f59fe0b5-a6c2-4772-95c4-a54a258cffdc.png)

## いつもやってる手順
1. csvダウンロード
2. ドライブに入れる
2. csvをスプシで開く
2. マスターになるスプシへ一部インポート

**※5分くらいでできますが、csvをアップロードするだけでパッと計算してくれないかなと思っていました**

## 実際にアプリっぽく作ってみる
- なんとなく自分が実務で使ったことがない技術スタック（GoやReact）で作るとどんな感じなのか知りたくて、その辺りで作成してみてもらいました
- まず、要件定義を適当にclaude appの方で作成してみた後に、それを元に作成してもらうように指示しました
- [要件定義書](https://github.com/SUKE2-ZUKIN/csv-seppan/blob/main/requirements_document.md)

    ```markdown
    # 共働きコスト折半ツール 要件定義書
    
    ## 1. プロジェクト概要
    
    ### 1.1 目的
    マネーフォワードMEのCSVエクスポート機能を活用し、夫婦間での家計支出の折半計算を自動化するWebアプリケーションを開発する。
    
    ### 1.2 背景
    - 家族代表者（夫または妻）のマネーフォワードMEアカウント1つで家計を一元管理
    - 代表者のカードで大部分の支払いを実施
    - 片方が個人カードで支払った分については差し引きして折半精算
    - マネーフォワードMEの中項目やメモ欄に識別文字列を設定して支払者を判別
    
    ## 2. 機能要件
    
    ### 2.1 データ入力機能
    **2.1.1 CSVファイルアップロード**
    - マネーフォワードMEから出力されたCSV形式のファイルを受け付ける
    - 対応フォーマット：「収入・支出詳細」形式
    - 文字エンコーディング：Shift_JIS対応
    - ファイルサイズ制限：10MB以下
    
    ...
    ### 3.1 技術仕様
    **3.1.1 アーキテクチャ**
    - フロントエンド：React (TypeScript)
    - バックエンド：Go
    - 開発環境：Docker
    - 実行環境：localhost（開発段階）
    ```

## やりとりを15分くらいすると...
- とりあえずローカルで、csvをアップロードするだけで、パパっと計算することに成功しました

    ![画面収録 2025-06-08 20.37.46.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2019425/19864135-52fe-44fc-b7cf-2710b1c0db3b.gif)
  - ±の計算がうまくいかず、何度かラリーをしました

- 一応、リポジトリは以下のような感じになりました（計算に使っているcsvは適当です）

https://github.com/SUKE2-ZUKIN/csv-seppan

## 感想
- 正直、生成されるコード全てを理解はできていませんが、こんなに素早く、クオリティの高いプロトタイプを作成できるとは驚きました
- この後すぐに、Maxプランにしました
- やはり作成されたものが適切かどうかn判断はできるようにならないといけないなと思い、引き続き自己研鑽は続けていきたいです
GitLab Pagesで「Artifacts for pages are too large: XXXXXXXXXXXXXXXXX」エラーの対応

## エラー

GitLab CIでコンテンツ生成時にpagesのジョブ後に`Artifacts for pages are too large: 119459220`のエラーが発生してGitLab Pagesへのデプロイに失敗しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284278/0c6965dd-c5a0-4514-b909-bac65da58615.png)

## 原因

デフォルトでは、GitLab Pagesでデプロイできるサイズは100MBになっています

今回、GitLab CIで生成したアーティファクトの内容を確認したところ10MB未満の圧縮されたファイルでしたが、展開したら100MBを少し超えていたので、これが原因でした。

※GitLab CIのアーティファクトも別に設定があるので、必要に応じて設定を変更しておくのが良さそうです。

## 対応

管理者エリアで「設定」→「環境設定」→「Pages」→「ページの最大サイズ(MiB)」の設定値を変更することで対応できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284278/72b2279e-8399-4611-b0bc-0d55a33d571f.png)

## 参考

https://forum.gitlab.com/t/artifacts-for-pages-are-too-large-although-max-size-is-much-higher/21055/3
TryHackMe Tutorial

# Kaliの環境作成
OpenVPNが使えれば、Kaliでなくても問題ないとは思いますが、そんなに面倒でないと思うので。
Hyper-Vでインストールするときはセキュアブートはオフにしてから起動。

# VPN接続
https://tryhackme.com/access?o=vpn
右側で接続VPNサーバを選んで.ovpnファイルをダウンロード
sudo openvpn <ダウンロードしたovpnファイルパス>

コマンド'ip route'を実行して、プライベートIPアドレスに対して正しくルーティング設定が構成されていることを確認

サイト左側のOpenVPN Access Detailsは気にしない。

# はじめてのFlag獲得
チュートリアルルームで緑色の'Start Machine'ボタンを押し、1min待つ。
IPアドレスをコピーしてFirefoxでアクセスするとFlag。
https://tryhackme.com/room/tutorial
Supabaseの確認メールのリダイレクト先を環境に合わせて変更する

NEXT.js+Supabaseで認証機能を作ることを前提とします。
# 事前準備
事前準備として、URL Configurationを以下の通り設定。

https://qiita.com/tkms13/items/be9943d0fd797fa319e6

また、確認メールのテンプレートを以下のドキュメント通りに変更します。

https://supabase.com/docs/guides/auth/redirect-urls



# リダイレクト先の設定方法
以下のドキュメントに記載のapp/login/actions.tsに以下のようにdataにoptionsと付け加えます変更します。

https://supabase.com/docs/guides/auth/server-side/nextjs?queryGroups=router&router=app
```js

  'use server'

import { revalidatePath } from 'next/cache'
import { redirect } from 'next/navigation'

import { createClient } from '@/utils/supabase/server'


const getURL = () => {
  let url =
    process?.env?.NEXT_PUBLIC_SITE_URL ?? // Set this to your site URL in production env.
    process?.env?.NEXT_PUBLIC_VERCEL_URL ?? // Automatically set by Vercel.
    'http://localhost:3000/'
  // Make sure to include `https://` when not localhost.
  url = url.startsWith('http') ? url : `https://${url}`
  // Make sure to include a trailing `/`.
  url = url.endsWith('/') ? url : `${url}/`
  return url
}

const { data, error } = await supabase.auth.signInWithOAuth({
  provider: 'github',
  options: {
    redirectTo: getURL(),
  },
})
export async function signup(formData: FormData) {
  const supabase = await createClient()

  // type-casting here for convenience
  // in practice, you should validate your inputs
  const data = {
    email: formData.get('email') as string,
    password: formData.get('password') as string,
    // 以下を追記
    options: {
      emailRedirectTo: `${getURL()}`,
    },
  }

  const { error } = await supabase.auth.signUp(data)

  if (error) {
    redirect('/error')
  }

  revalidatePath('/', 'layout')
  redirect('/')
}
  ```
  これによりローカル環境と本番環境で適切に確認メールのリダイレクト先が変更できます。
  なお、getURL()は上記Redirect URLsのページに記載の関数です。
RISC-Vの命令を適当に読んだ

このウィキ読んだ

https://github.com/TheThirdOne/rars/wiki

レジスタはx0からx31まであってリナックスのABIで言うとzeroとかs0とかa0とかがある。なんかすごい特徴だなと思ったやつは比較演算とかによりセットするフラグがないことであって、bgeやbltによりなんやかんや。なんだこの感想文。
【Django】HTMLテンプレートのsrc属性内で変数を使う方法（get_static_prefix テンプレートタグ）

## はじめに
- 個人の学習時の備忘録目的のため、シンプルな記事です
- コード例は実際のコードから必要と思われる部分を抜粋しています

## 背景
- Django5.2を使ってアプリを作成中

## 問題
DjangoのHTMLテンプレートでstaticファイル(CSS, JavaScript, Images)を読み込む場合は、static テンプレートタグ`{% static %}`を使用します。
```html:example.html（通常）
{% load static %}
<img src="{% static 'images/category_icons/category_1.png' %}"  class="category-icon">
```
この時に、「category_1.png」の数字の部分にviews.pyから渡された変数（item.category_id）を使用することで、値によって表示するimageを切り替えたかったのですが、以下のように単純に置き換えただけでは動作しませんでした。
```html:example.html（失敗例）
{% load static %}
<img src="{% static 'images/category_icons/category_{{ item.category_id }}.png' %}"  class="category-icon">
```

## 原因
static テンプレートタグ内ではテンプレート変数が使用できず、{{ item.category_id }}がそのまま文字列として認識されるため。

## 解決方法
 static テンプレートタグではなく、get_static_prefix テンプレートタグを使って以下のように書くと狙い通りに動作しました。
```html:example.html（成功例）
{% load static %}
<img src="{% get_static_prefix %}images/category_icons/category_{{ item.category_id }}.png"  class="category-icon">
```

> **get_static_prefix**
通常は static テンプレートタグの使用を推奨しますが、 STATIC_URL がテンプレートに挿入される場所と方法をより厳密に制御する必要がある場合は、get_static_prefix テンプレートタグが使用できます

https://docs.djangoproject.com/ja/5.2/ref/templates/builtins/#get-static-prefix

## 補足メモ
chatGPTに聞いたり過去の記事を参考にして、static テンプレートタグのまま変数を使う書き方も試しましたが、うまくいきませんでした。参考までに、試したコード例を以下に記載します。

#### 【失敗例１】テンプレートフィルター`add`を使って変数をセットする
```html:example.html（失敗例１）
{% load static %}
<img src="{% static 'images/category_icon'|add:item.category_id|add:'.png' %}"   class="category-icon">
```

#### 【失敗例２】with テンプレートタグとテンプレートフィルター`add`を使って変数を事前にセットする
```html:example.html（失敗例２）
{% load static %}
{% with icon_url="images/category_icon" | add:item.category_id | add:'.png' %}
  <img src="{% static icon_url %}"  class="category-icon">
{% endwith %}
```

## おわりに
get_static_prefix テンプレートタグについては、自分はchatGPTやネット検索では見つけられず、Djangoの公式ドキュメントを読んで存在を知りました。やはり公式ドキュメントを見るのが大事だなと改めて思いました。

## 参考

https://docs.djangoproject.com/ja/5.2/ref/templates/builtins/#get-static-prefix
SwiftUI時代のURLの開き方。君はまだUIApplicationを使っているのか！？

## はじめに
```SwiftUI```で開発していると、つい```UIKit```の癖で```UIApplication.shared.open(url)```と書いてしまいがちですが、実は```SwiftUI```には ```SwiftUI```流のやり方があったのです。

## 基本形

```Swift
@Environment(\.openURL) private var openURL

let url = URL(string: "https://www.yahoo.co.jp")!
openURL(url)
```
```dismiss```と同じ感覚ですね。

## openURLの結果を知りたい

```Swift
@Environment(\.openURL) private var openURL

let url = URL(string: "https://www.yahoo.co.jp")!
openURL(url) { accepted in
    if !accepted {
        print("could not open url = \(url)")
    }
}
```
クロージャを追加すると結果が分かります。

## Markdown中のリンクを開く

```Swift
Text("Visit [Yahoo](https://www.yahoo.co.jp) for details.")
```
<img width="256" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/edc016ec-ca08-4db2-acf2-13b162fd0155.png"><br>
たった1行でこれができるとは！:heart_eyes:

### リンクの開き方を差し替えたい

```Swift
Text("Visit [Yahoo](https://www.yahoo.co.jp) for details.")
    .environment(\.openURL, .init { url in
        your_URL_Processor(url) // ここで独自のURL処理ができる.
        return .handled
    })
```

#### 最後の```return .handled```って何？ :thinking:

```openURLAction.Result```です。
以下のバリエーションがあります。

- ```return .handled```
URLは自前で処理したので、OSは何もしない。

- ```return .systemAction```
URLを開く処理をOSに依頼する。
何も指定しなければ```url```をそのまま開く。
:point_down_tone2:のようにカスタマイズしたURLを渡すこともできる。

```Swift
let customizedURL = URL(string: "https://www.youtube.com")!
return .systemAction(customizedURL)
```

- ```return .discarded```
エラー発生など、URLを開く処理を破棄する。(何もしない)

### MarkdownをAttributedStringに変換してから使う

```Swift
// 改行するためには行末にスペース2個、そして改行。 または空行を入れる。
let markdown = """
Visit for details.  
[Yahoo](https://www.yahoo.co.jp).  
[Google](https://www.google.co.jp).
"""
let attributedString = try! AttributedString(markdown: markdown)
Text(attributedString)
```

![スクリーンショット 2025-06-08 18.01.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/e7831f15-a374-4feb-ae90-dbdd89cf8837.png)

## まとめ
```SwiftUI```でURLを開くなら、```openURL``` でスマートに！ :sunglasses:

## 開発環境
Xcode 16.4

## 参考文献
[openURL](https://developer.apple.com/documentation/swiftui/environmentvalues/openurl)  
[openURLAction](https://developer.apple.com/documentation/swiftui/openurlaction  )
[openURLAction.Result](https://developer.apple.com/documentation/swiftui/openurlaction/init(handler:))
Android36対応　予測型「戻る」の対応


# 概要

https://developer.android.com/guide/navigation/custom-back/predictive-back-gesture?hl=ja

Android公式からの引用です。

>予測型「戻る」ジェスチャーをサポートするには、下位互換性がある OnBackPressedCallback AppCompat 1.6.0-alpha05（AndroidX）以上の API、または新しい OnBackInvokedCallback プラットフォーム API を使用して、アプリを更新する必要があります。ほとんどのアプリでは、下位互換性のある AndroidX API を使用します。

>この更新は、「戻る」ナビゲーションを正しくインターセプトするための移行パスを提供するもので、KeyEvent.KEYCODE_BACK からの「戻る」インターセプトや、onBackPressed メソッドを含むクラス（Activity、Dialog など）を、新しいシステムの「戻る」API で置き換えるためのものです。


# 実践

**onBackPressed**を使っていた場合に

**OnBackPressed** または **KeyEvent.KEYCODE_BACK**を使って戻る処理をしていた場合に、**OnBackPressedDispatcher** に移行しましょうということです。

```
     // バックキー押下時の制御
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            getOnBackInvokedDispatcher().registerOnBackInvokedCallback(
                OnBackInvokedDispatcher.PRIORITY_DEFAULT,
                this::onBackPressed
            );
        }
```


Android16以降ならOnBackInvokedCallbackをカスタムして、onBackInvokedDispatcherを登録し、
今まで使用していた、onBackPressedの処理を渡すためにthis::onBackPressedを引数に渡します。

これで予測型「戻る」の対応をしつつ、今までどうりの動きになるようです。

詳しくは公式を見てください。
ティラノスクリプト解析

## TYRANOとtyrano(tyrano.js, kag.js)
TYRANO = object(tyrano.core);
TYRANO.kag = object(tyrano.plugin.kag);
TYRANO.kag.tyrano = TYRANO;
　←kagからTYRANOを参照するため

TYRANOとtyranoは別物
tyranoとTYRANO.kag.tyranoは別物
TYRANOとTYRANO.kag.tyranoは同じもの

## kag.js
### init
「コンフィグファイルの読み込み」、「ゲームの初期化」、「first.ks読み込み」などを行う。

### parseScenario
シナリオファイルをタグ配列にパース。

### loadScenario
parseScenarioでタグ配列を取得し、実行していく。

## kag.tag.js
### nextOrder
master_tagとmacroに対して、その処理を実行する。
また、kag.trigger("nextorder")によって、開発ツールにタグの実行を通知したりもしている。

### タグの記述
vital: 必須パラメータ
pm: 任意パラメータ（デフォルト値つき）
start関数に処理を記述

### [chara_show]
デフォルトでは、div.0_fore(page: "fore", layer: "0")下にdiv.tyrano_charaを追加し、キャラ画像を表示。

## tyrano.base.js
body直下のdiv#tyrano_baseの設定。

## kag.layer.js
tyrano_base下のdiv#root_layer_gameとdiv#root_layer_systemの設定。
root_layer_gameは背景、キャラクターなど。
root_layer_systemはメッセージウィンドウ、UI、メニューなど。

## kag.menu.js
メニューボタンをクリックすると、showMenu関数が呼ばれ、div.layer_menu -> div#menu_menu_wrapper -> div.display_menuに各種コンフィグボタンを表示
DiscordをRAG検索して部活動の技術継承に応用した話

## 🔥開発動機
僕はとある普通科高校の「科学部Robotics班」の部長兼「Noa.h」というこの部活動に所属する3年生によるチームのプログラマとしてロボットサッカーの大会に出場していました。この部活動の創設者でもある元顧問の先生が今年度他校へ異動となり、他にロボットに関する技術を指導できる先生がいなくなってしまったため、技術継承をどう行うかが課題となりました。これを受けて部活動継承のためのAIバーチャルマネージャーによるチャットアプリを作成することになり、このプロジェクトにおいて僕が担当するタスクの一つとしてRAG検索システムを担当しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923761/964d37f8-c3c2-47d1-9381-f507a1f3c16f.png)
なお、プロジェクトのフロントエンドなど他の要素については同じくNoa.hの[milktear](https://qiita.com/milktear)が記事にしており、本人の気が向けば今後も更新されると思いますので良ければどうぞ。

## 💡基礎情報
### ⚪︎使用モデル
ベクトル計算には[cl-nagoya/ruri-small-v2](https://huggingface.co/cl-nagoya/ruri-small-v2)を採用しました。このモデルの採用理由としては
・比較的モデルサイズが小さく、手元の開発環境(Mac mini M2 Pro 16GB RAM)で実行可能
・日本語の検索能力が高い
といったことが挙げられます。

### ⚪︎ベクトル検索
ベクトル検索にはfaissを用いました。RAG検索においておそらく定番であろう高速な検索が可能な検索システムです。

## 🔍Discordを検索対象にした理由
今回のプロジェクトは部活動の技術継承を目的と設定していたので最初は部活動に関する技術をドキュメントにまとめてそれを参照する形を考えていました。しかしながらこの手法には
・ドキュメントを書くのが手間である
・2年間かけて培った技術を全てドキュメントに起こすことは無理がある
・新しい情報を追加するためにドキュメントを追加し続けなければならない
といった問題がありました。そこで「普段開発のやりとりに使ってるDiscordの情報を参照すれば良いのでは」と考えました。Discordは僕たちが入部して約1ヶ月後から運用を行なっており、部活動に関するすべての連絡や自宅で開発する際のやりとり、他チームを分析する際の議論などをすべて一つのdiscordサーバーで行っていたのでそれを参照することで
・ドキュメントを書く手間が省ける
・Discordでやり取りを続ける限り情報が更新され続ける
というメリットが期待できると考え、この方法を取ることにしました。

## ⚠️チャットアプリをRAG検索する際の問題点
ドキュメントではなくDiscordといったチャットアプリの履歴をRAG検索する際の最大の問題点として「メッセージ単体の情報量が少ない」という問題があります。例えばチャット履歴の一部として以下のようなものがあったとします。
A : UARTを正しく設定してるはずなのに通信結果が文字化けしてる
B : なんでだろ
A : 2時間格闘してる😭
C : 通信レート合ってる？
A : あ...😇
A : 私の2時間はなんだったんだろう
B : 草
これをそれぞれのメッセージごとに言語ベクトルを計算して「UARTの不具合」というクエリでRAG検索を実行した場合、最初の「UARTを正しく設定...」のメッセージは検索結果の上位になることが考えられますが、それ以降の解決策を示す直接の情報源になるはずの「通信レート合ってる?」や本当にそれが原因であったことを示す「 あ...😇」はヒットせず、代わりに他のチャンネルのUARTについてのメッセージがより上位にヒットすることが考えられます。これではDiscord内に問題解決の方法が存在するにも関わらず、それを参照して解答を生成できないという非常に勿体無い現象が起きてしまいます。このようにチャットアプリのメッセージ単体 を関連度に基づいて検索し、参照するだけでは問題解決のための十分な情報を提供できない可能性があるという問題点があります。

## 🗣️前後の文脈を踏まえるために
チャットアプリの会話内容は前後の文脈を踏まえて参照することで初めて情報として有用なものになると考えます。そこで僕は次の方法を取りました。
・メッセージをチャンネル、スレッドごとに分割
・その上で送信された日付ごとに分割
このように分割したメッセージのブロックに対して言語ベクトルを計算し、RAG検索を行うことで前後の文脈を踏まえた検索を実現しました。

## ✅最後に
今回は部活動の技術継承のためのAIバーチャルマネージャープロジェクトの一環としてDiscordのRAG検索を行いましたが、今回の手法はDiscord以外であってもチャットアプリの履歴を用いたアプリケーション作りなどでも有用かと思いますので一つの実装例として参考になれば幸いです。
Jetpack ComposeとSwiftUIのSpacerの違い

# はじめに
今回は両OSで実装経験のあるフルスタックエンジニア視点でみたSpacerの違いを紹介していきます
### 本文
SwiftUIのSpacerは空気のクッションを配置しているイメージです。
逆にJetpackComposeは空箱を配置してるイメージが適していると思います。
SwiftUI の Spacerは下記の特徴を持ちます
* 柔軟性が高い：空きスペースを「埋める」ように振る舞い、周囲のビューに応じてサイズが「自動調整」する
* 空気入りクッションのような動きをし、隣接するビューのレイアウトによって伸びたり縮んだりする


Jetpack Compose の Spacerは下記の特徴を持ちます
* 明示的な制御が必要：サイズや weight を明確に指定しない限り、ただの「透明な箱」で、柔軟な調整はしない
* Modifier.weight() を使ったときに初めて「柔らかく膨らむ」ような動作をするが、それも Column/Row の Arrangement や他の要素の重みとの兼ね合いによります

### 最後に
一長一短が多くお互いいいところもあるのですが、Spacerに関しては圧倒的にSwiftUIのほうが好みです
静力学と材料力学 応用例題1.24 P18「材料力学演習(20221021)」をsympyでやってみた。 

# オリジナル
[応用例題1.24 P18 (pdf)](http://zairikiweb.starfree.jp/zai_enshuh/zai_enshuh_ver.3.3.pdf#page=24)＜[「材料力学演習(20221021)一括(ver.3.3)」を勉強したい。#sympy](https://qiita.com/mrrclb48z/items/c3274daf5f7a99cfe027#%E4%BD%9C%E6%A5%AD%E4%B8%AD%E7%A7%81%E3%81%AE%E8%A7%A3%E7%AD%94sympy)
　　　　　　　　？？？タブレット等で、pdfを開く事ができないかも。？？？　
# sympyで
```python
#　ver0.1  
from sympy import *
var('RAH,RAV,RBH,RBV')
print("#",round(sqrt(RAH**2+RAV**2).subs({RAH:292,RAV:-83})))
print("#",round(sqrt(RBH**2+RBV**2).subs({RBH:292,RBV:583})))
# 304
# 652
```
曖昧なものをどう評価するか？LLMと人間に対する科学的手法の話

## はじめに

ChatGPTやClaudeなど、最近のLLM（大規模言語モデル）を触ったことのある人なら、一度はこう思ったことがあるはずです。

> 「同じプロンプトなのに、なんか出力が違うな……」

LLMの出力には非決定論的な要素があります。トークンごとに確率的に出力されるし、GPU計算や温度パラメータの微妙な差もあります。

では、こういった「あいまいで一貫しない対象」を**どうやって“科学的に”評価するのか？**

この記事では、この問いに対して、 **自然科学・統計学の方法論
とくに「RCT（ランダム化比較試験）」** を軸に考察してみます。LLMだけでなく、人間や教育、社会実験などにも共通する話です。

## 「同じ条件で比較する」がどれほど難しいか

たとえば、以下のような比較を考えます：

- ChatGPTとClaudeに同じ質問をして、回答の質を比べたい
- あるUI改善を導入して、ユーザーの反応が良くなるかを確かめたい
- 研修Aと研修Bで、どちらが人材の成長に効果があるか調べたい

ここで多くの人が直感的にやろうとするのが、「同じ条件にして比べる」ことです。プロンプトも固定、状況も固定、できるだけブレをなくす。

ただ、問題があります。

### LLMは出力が揺らぐ

- モデルは確率的にトークンを選ぶ（非決定論的）
- サーバー状態やランタイム、GPU計算の微細な違いが出力に影響
- 同じプロンプトでも何回か生成させると答えが変わる

### 人間も一貫していない

- 同じ質問でも、そのときの気分や文脈で答えが変わる
- 「同じ条件にする」こと自体がほぼ不可能
- 人間はステートフルで純粋関数ではない


## だからこそRCTが効く 曖昧さを前提にした科学的手法

「同じ条件で比較できないなら、科学的じゃない」と思う人もいますが、それは科学の一側面にすぎません。

自然科学、特に医学や心理学では、人間というノイズまみれの存在を扱うために、別のアプローチを使っています。

その代表が **RCT（ランダム化比較試験）** です。

### RCT

- 被験者を**無作為（ランダム）に**複数のグループに分ける
- 各グループに異なる処置（例：薬Aと薬B）を与える
- 結果を比較し、**統計的に意味のある差があるか**を見る

ポイントは「すべてを統一する」のではなく、**ランダム化によって交絡因子（＝結果に影響する余計な変数）を平均化**することです。


## LLM評価における“疑似RCT”的手法

この考え方は、LLMの評価にも応用できます。たとえば

プロンプト改善の効果検証では

1. 被験者（ユーザー or 評価者）をランダムにA群・B群に分ける
2. A群には旧プロンプト、B群には改善後のプロンプトで回答を生成
3. 回答をブラインド化して提示
4. 評価者にスコアをつけてもらい、統計的に差を検定

このように、**一貫性を無理に求めず、ばらつきを前提にした実験設計**によって、科学的な比較が可能になります。


## 「双子研究」と「現実の実験」

余談ですが、人間対象の研究で「条件を完全に揃えるべきだ」と主張する人は、よく「双子研究」のような理想ケースを引き合いに出します。

たしかに、遺伝的に同一な双子を使えば、いろんな条件を統制できます。でも現実には

- 双子であるという因子が偏りを生む可能性(←重要！)
- 双子を集めるのは非現実的
- 完全に同じ環境・経験というわけではない
- サンプルサイズも小さい

RCTは**不確実な世界のなかでも比較可能な設計**を提供する、科学的に正しい方法論です。


## あいまいなものを評価するということ

「あいまいだから評価できない」のではなく、  
「あいまいだからこそ“科学的な設計”が必要になる」のです。

LLMに限らず、人間、教育、政策、UX、あらゆる分野でこの問題はつきまといます。

完璧な条件統制を諦めて、**ランダム化・統計・設計**の力で乗り切る。  
それが現代科学の“戦い方”なのだと思います。


## まとめ・科学的とはどういうことか

「科学的な比較」とは、単に条件を揃えることではありません。  
条件を揃えきれない**曖昧で複雑な世界において、それでも信頼できる方法を設計できること**です。

LLMの評価、教育の効果、行動変容の検証
あらゆる「あいまいな対象」こそ、科学的手法の真価が問われる分野です。
【Rails8】heroku postgresのdatabase.ymlの書き方

https://devcenter.heroku.com/ja/articles/getting-started-with-rails8

herokuのドキュメントには以下のように書いてますが...

```
# PostgreSQL. Versions 9.3 and up are supported.
#
(中略)
production:
  primary: &primary_production
    <<: *default
    database: myapp_production
    username: myapp
    password: <%= ENV["MYAPP_DATABASE_PASSWORD"] %>
  cache:
    <<: *primary_production
    database: myapp_production_cache
    migrations_paths: db/cache_migrate
  queue:
    <<: *primary_production
    database: myapp_production_queue
    migrations_paths: db/queue_migrate
  cable:
    <<: *primary_production
    database: myapp_production_cable
    migrations_paths: db/cable_migrate
```

これだと自分はうまくいかず、以下にするとうまくいきました
（user_name, passwordではなく`url: <%= ENV['DATABASE_URL'] %>`に）

```
# PostgreSQL. Versions 9.3 and up are supported.
#
(中略)
production:
  primary: &primary_production
    <<: *default
    database: myapp_production
    url: <%= ENV['DATABASE_URL'] %>
  cache:
    <<: *primary_production
    database: myapp_production_cache
    migrations_paths: db/cache_migrate
  queue:
    <<: *primary_production
    database: myapp_production_queue
    migrations_paths: db/queue_migrate
  cable:
    <<: *primary_production
    database: myapp_production_cable
    migrations_paths: db/cable_migrate
```
webアプリ my-favorite-list リレーション

# リレーションとは

データ同士の関連性を表す
通常classが違うと別のデータ扱い

# たとえ

### excel

- classが違う=sheetが違う
- なので、データ同士の関係性を作るための特別な関数を使う

# 今回の場合

### SQliteを使用

アニメの情報と声優の情報を分ける

- アニメ：タイトル：リゼロ、放送開始年：2016年、放送時期：春
- 声優：小林裕典、高橋李依、内山夕実、水瀬いのり、村川梨衣、新井里美、子安武人...

フォームで評価等

- 評価：ss, s, a, b, c
- ジャンル：ファンタジー、SFなど

### **1. `ForeignKey` のオプション**

`ForeignKey` には、関連付けの動作を細かく制御するオプションがあります。

### **主なオプション**

- `on_delete`
    - `models.CASCADE` : 親オブジェクトが削除されたら、関連するオブジェクトも削除される（デフォルト）
    - `models.PROTECT` : 親オブジェクトが削除されるのを防ぐ
    - `models.SET_NULL` : 親オブジェクトが削除されたら、関連するフィールドを `NULL` にする
    - `models.SET_DEFAULT` : 親オブジェクト削除時に、デフォルト値に設定
    - `models.SET()` : 指定した値をセットする
    - `models.DO_NOTHING` : 何もしない（データ整合性が崩れる可能性があるため推奨されない）
- `related_name`
    - 逆参照時に使う名前を指定（例: `author.books.all()`）
- `related_query_name`
    - 逆参照時のフィルタ名（例: `Book.objects.filter(author__books__title="Python")`）
- `db_index`
    - データベースインデックスを追加 (`True` にすると検索速度が向上)

---

### **2. `ManyToManyField` のオプション**

`ManyToManyField` には、中間テーブルの動作やリレーションの管理を制御するオプションがあります。

### **主なオプション**

- `related_name`
    - 逆参照時の名前を設定（例: `course.students.all()`）
- `related_query_name`
    - 逆参照時のフィルタ名を設定（例: `Student.objects.filter(course__students__name="John")`）
- `through`
    - 中間テーブルを指定（例: `Enrollment` モデルを使ってカスタム中間テーブルを定義）
- `symmetrical`
    - 自動的に双方向の関係になるかどうか（デフォルトは `True`）
- `db_index`
    - インデックスを追加 (`True` にすると検索速度向上)

---

### **簡単なまとめ**

| オプション | `ForeignKey` | `ManyToManyField` |
| --- | --- | --- |
| `on_delete` | ✅ | ❌ |
| `related_name` | ✅ | ✅ |
| `related_query_name` | ✅ | ✅ |
| `db_index` | ✅ | ✅ |
| `through` | ❌ | ✅ |
| `symmetrical` | ❌ | ✅ |

# 流れ

models.py → scripts.py

# 役割

dbの基礎 （リレーション）→ 選択肢

### models.py

- ManyToManyField - フォーム、検索用
- ForeignKey - インポート、詳細用

```python
# アニメモデル
class Anime(models.Model):
    anime_id = models.CharField(max_length=200, unique=True, verbose_name='アニメID')
    value = models.ManyToManyField(Value, verbose_name='評価', blank=True, related_name='animes_value')
    
    def __str__(self):
        return self.title if self.title else "不明なアニメ"
```

```python
#評価(全クラス共通)モデル
class Value(models.Model):
    name = models.CharField(max_length=200, unique=True, verbose_name='評価')
    
    def __str__(self):
        return self.name
```

```python
# キャストモデル リレーション多対多
class Cast(models.Model):
    anime = models.ForeignKey(Anime, on_delete=models.CASCADE,
                                 related_name='casts', verbose_name="アニメ")
    name = models.CharField(max_length=200, blank=True, null=True, verbose_name='声優名')  # 空のデータを許容

    def __str__(self):
        return self.name if self.name else "不明なキャスト"
```

### scripts.py

- 選択肢

```python
# Valueのデータ登録
for name in ['SS', 'S', 'A', 'B', 'C', 'D']:
    Value.objects.get_or_create(name=name)
    
```
めざせ爆速LaTeX入力（VSCode標準ショートカット備忘録）

# VSCode(LaTeX Workshop) 標準スニペット

スニペットとはよく使うコードや記述の「テンプレート」のことです。VSCodeの拡張機能、LaTeX Workshopには標準で使えるスニペットが用意されています。これを使えば\alhpaなどと打たなくても@aで\alphaが出るようになります。以下VSCode の LaTeX Workshop に標準で入っているスニペットの一覧です。

## ギリシャ文字（小文字）
\thetaが@q、\psiが@yなどがトリッキーですが、基本的にはアルファベットとの対応関係になっていて直感的です。

| 入力 | 出力         |
|------|--------------|
| `@a` | `\alpha`     |
| `@b` | `\beta`      |
| `@g` | `\gamma`     |
| `@d` | `\delta`     |
| `@e` | `\epsilon`   |
| `@ve`| `\varepsilon`|
| `@z` | `\zeta`      |
| `@h` | `\eta`       |
| `@q`| `\theta`     |
| `@k` | `\kappa`     |
| `@l` | `\lambda`    |
| `@m` | `\mu`        |
| `@n` | `\nu`        |
| `@x` | `\xi`        |
| `@p`| `\pi`         |
| `@vp`| `\varpi`    |
| `@r` | `\rho`       |
| `@vr`| `\varrho`    |
| `@s` | `\sigma`     |
| `@vs`| `\varsigma`  |
| `@t` | `\tau`       |
| `@u` | `\upsilon`   |
| `@f`| `\phi`       |
| `@vf`| `\varphi`   |
| `@c` | `\chi`       |
| `@y`| `\psi`       |
| `@o` | `\omega`     |





## ギリシャ文字（大文字）
基本的には小文字の時のスニペットを大文字にすればいいですが、\Omegaは例外的に、@Wです。

| 入力 | 出力         |
|------|--------------|
| `@G` | `\Gamma`     |
| `@D` | `\Delta`     |
| `@L` | `\Lambda`    |
| `@X` | `\Xi`        |
| `@P`| `\Pi`        |
| `@S` | `\Sigma`     |
| `@U` | `\Upsilon`   |
| `@F`| `\Phi`       |
| `@Y`| `\Psi`       |
| `@W` | `\Omega`     |



## 記号、数式系
@8で\inftyがおしゃれですね。\leqや\geqは混乱しがちですが、@<や@>で覚えれば間違えようがありません。

| 入力 | 出力             |
|------|-----------------|
| `@` | `\frac{}{}`     |
| `@2` | `\sqrt{}`       |
| `@6` | `\partial`      |
| `@8` | `\infty`        |
| `@;` | `\dot{}`          |
| `@:` | `\ddot{}`       |
| `@=` | `\equiv`        |
| `@<` | `\leq`          |
| `@>` | `\geq`          |
| `@.` | `\cdot`         | 
| `@^` | `\hat{}`        |
| `@_` | `\bar{}`        |
| `__`   | `_{}`         |
| `**`   | `^{}`         |

## かっこ系
これをショートカットなしで打つのはもはや考えられません。絶対にショートカットを使うべきです。ちなみに、すでにある文をかっこ系で囲みたい場合は囲みたいテキストを選択し@(を打てば自動で入ってくれます。

| 入力 | 出力            |
|------|-----------------|
| `@(` | `\left(  \right)`    |
| `@{` | `\left\{  \right\}`  |
| `@[` | `\left[  \right]`   |


## フォント系
| 入力 | 出力            |
|------|-----------------|
| `FBF` | `\textbf{}`    |
| `MCA` | `\mathcal{}`   |
| `MRM` | `\mathrm{}`    |


##　セクション系
| 入力  | 出力              |
|---------|-------------------|
| `SSE`  | `\section{}`      |
| `SSS`  | `\subsection{}`   |
| `SS2`  | `\subsubsection{}`|

## 環境系

| 入力  | 出力              |
|----------|--------------------------|
| `BEQ`   | `\begin{equation}`       |
| `BSEQ`  | `\begin{equation*}`      |
| `BAL`   | `\begin{align}`          |
| `BSAL`  | `\begin{align*}`         |




## 補足
- タブまたはエンターキーで展開される。
- 展開後に `Tab` でプレースホルダ(カーソルの待機場所)を移動可能
- 数式環境はBALしか使わないことにすれば予測でB＋(Enter or Tab)だけで出るようになります。



## 参考文献
- 公式ドキュメント


https://github.com/James-Yu/LaTeX-Workshop/wiki/Snippets


https://github.com/James-Yu/latex-workshop/wiki/Intellisense#-suggestions

---
材料力学「クレモナ図から計算した反力の値と、外力のつり合いから計算した反力の値が、異なる事はありますか。」をAI先生ヘ。  


・難しくなりました。

# (本日の)ChatGPT先生へ
```
# 質問リスト
1. クレモナ図から計算した反力の値と、外力のつり合いから計算した反力の値が、異なる事はありますか。
2. 私の質問をMarkdown形式でリスト化して出力して。Markdown形式でリストからアスタリスクは削除して。1行目に、# 質問リスト の文字を出力して。最後の質問も追加して下さい。追番を追加して下さい。Markdown形式で。
```
#### (以下回答抜粋)
>...したがって、正しく描かれたクレモナ図から得られた反力は、数式による釣り合い（∑Fx=0, ∑Fy=0, ∑M=0）から得られた反力と一致するのが原則です。
⚠ 異なる結果になる主な原因
>1. クレモナ図の描画ミス...	
>2. 外力の誤認識...	
>3. 静定ではない構造（静不定）...	
>4. 小数・単位の扱い...
>5. コンピュータでの作図誤差	
>...
>もし具体的なクレモナ図や反力計算を見せていただければ、どこにずれがあるか一緒に確認することも可能です。

・私が、はずかしいので、中断しました。

# Gemini先生へ

# copilot先生へ

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

https://qiita.com/mrrclb48z/items/b6351b48e47bcf6265c0

# いつもと違うおすすめです。
#### Qiita内
Code Pipeline向けバケットファイル削除用Lambda関数(python)

「S3+API Gateway+Lambdaを利用した簡易Webアプリケーション自動化」の内容について、
静的ウェブサイトホスティングを設定したバケットにlambda用のpythonファイルが残っていた

なので以下lambda関数を作成して、Code Pipelineの最後にlambdaを呼び出すことで対応

~~~python
import boto3

def lambda_handler(event, context):
    s3 = boto3.client('s3')
    codepipeline = boto3.client('codepipeline')

    bucket_name = 'cc-source-bucket-0531'
    key_to_delete = 'lambda_function.py'

    try:
        s3.delete_object(Bucket=bucket_name, Key=key_to_delete)

        # Pipeline に成功を通知
        job_id = event['CodePipeline.job']['id']
        codepipeline.put_job_success_result(jobId=job_id)

    except Exception as e:
        # 失敗時は明示的にエラー通知
        job_id = event['CodePipeline.job']['id']
        codepipeline.put_job_failure_result(
            jobId=job_id,
            failureDetails={
                'message': str(e),
                'type': 'JobFailed',
                'externalExecutionId': context.aws_request_id
            }
        )
        raise
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936824/da0c7030-c5bc-4624-ade4-e27fc1c074d4.png)


関数は単に削除処理をするだけだと、Code Pipeline側の処理がいつまで待っても完了にならないので
上記のようにCode Pipelineの処理に対してjobの成功を通知する必要がある。

Code Pipeline側に通知をする必要がある関係上、関数のIAMに以下の許可も必要
今回はAWS管理ポリシーのAWSCodePipelineCustomActionAccessをアタッチして対応した

~~~
                "codepipeline:PutJobFailureResult",
                "codepipeline:PutJobSuccessResult"
~~~

なお、codebuildのbuildspec.ymlに以下のようにsecondary-artifactsを設定すれば
アーティファクトを複数出力させられる

~~~
secondary-artifacts:
  LambdaArtifact:
    files:
      - lambda_function.py
  S3Artifact:
    files:
      - index.html

~~~

そのため、S3用とlambda用でアーティファクトを分ければ削除処理は不要ではと思い検証したが、
2つ目に設定した出力アーティファクトのみうまく出力されず

※ 以下の様にするとLambdaArtifactの分だけがパイプラインが作成するバケットに出力されない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936824/361b1c8e-b41c-4333-81bc-53805d5746af.png)

設定不足があったのか調べたがすぐには特定できなさそうなので一旦削除用のlambdaを作成して対応
シェルにおける情報の受け渡し方

私が他の言語からシェルスクリプトに入ったときに最初に躓いたのが、題名の通り情報の受け渡し方でした（たとえば標準出力を別のコマンドの標準入力として使う等）。逆引き辞典としてこの記事を残します。


# 概要

この記事では、シェルスクリプトにおける情報の受け取り方・渡し方を逆引きできる構成をとります。

基本的には以下のことを前提としているつもりです。

- Linux 上で実行すること
- bash を使用すること


# 標準出力 -> 標準入力

あるコマンドの標準出力を別のコマンドの標準入力として入力する方法。

## 基本

パイプ `|` を使用する。

```bash
# 例。tac コマンドの標準出力を、sed コマンドの標準入力として入力。
# tac は ./list.txt を逆順で（下の行から上の行へ）読み込んだ内容を標準出力として出力する。
# それが sed へ標準入力として入り、そこから空行を削除した内容を標準出力として出力する。
tac ./list.txt | sed -e '/^$/d'
```

# 標準出力 -> 変数

あるコマンドの標準出力の内容を変数に入れて保持する方法。

## 基本

`$()` かバッククォート `` ` `` を使用する。

```bash
# 例。cat コマンドの標準出力の内容をシェル変数 content に入れる。
# cat はファイルの内容をそのまま標準出力として出力するので、ファイル ./list.txt の内容がそのまま変数 content に入る。
content=$(cat ./list.txt)
content=`cat ./list.txt`  # 上と同じように content にファイルの内容が入る。
```

:::note info
`$()` とバッククォートの動作に大きな違いはありません。`$()` はネストしやすく使い勝手が良いため基本的にはこちらを使います。ただし、極端に古い環境では `$()` を使えない場合があるため必要に応じてバッククォートも使用します。
:::

# 変数 -> 標準入力

変数に入っている文字列をそのまま標準入力として入力する方法。

## 基本

ヒアストリング `<<<` を使用する。

```bash
content="foo"

# 例。変数 content の内容を sed の標準入力として入力する。
# sed が標準入力中の f を b に変えたものを標準出力として出力するので、「boo」が出力される。
sed -e 's/f/b/g' <<< $content
```


# 標準出力 -> ファイル

あるコマンドの標準出力をテキストファイルとして出力する。

## 基本

リダイレクト `>`, `>>` を使用する。この2つは出力先のファイルが存在する場合の挙動が異なり、`>` なら上書き、`>>` なら末尾に追記となる。

```bash
# 例。ls コマンドの標準出力をファイル list.txt に書き込む。
# すでに list.txt が存在する場合、その内容は失われる。
ls > list.txt
```


# ファイル -> 標準入力

テキストファイルの内容をあるコマンドの標準入力として入力する。

## 基本

リダイレクト `<` を使用する。

```bash
# 例。テキストファイル list.txt の内容を tac コマンドに標準入力として入力
# tac は標準入力を逆順で（下の行から上の行へ）読み込んだ内容を標準出力として出力する。 
tac < list.txt
```

# 標準入力 -> コマンド引数

標準入力をコマンド引数にするコマンドです。先述の『標準出力 -> 標準入力』などと組み合わせることで、さまざまな情報を引数にできます。

## 基本

コマンド `xargs` を使用する。

```bash
# 例。catの標準出力をパイプで標準入力にし、それを xargs で ls コマンドの引数にしている
cat list.txt | xargs ls
```
Reactを学習して、1ヶ月半で名刺アプリを作った話。

# 自己紹介
はじめまして。ともぼーです！
私は組み込みエンジニア4年目で、Web開発経験に関しては仕事で少しHTML/CSS, JavaScriptを使用して画面を作った程度です。
プログラミングの基礎は割と出来ている状態で今はReactを勉強しています！

# 作ったもの
デジタル名刺アプリを作りました。
Github, Qiita, Xのアカウントと個人の情報を登録できる名刺アプリです。
新規で名刺を登録でき、登録した名刺を見ることが出来ます。

![無題の動画 (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779353/58f13d74-e287-43c7-a307-050df21d2594.gif)



# 苦労したこと
### ■ChakraUIの仕様を理解すること
今回はChakraUI v3を使用して作成しました。前回の学習アプリではv2を使用していたので分からないことがあれば公式ドキュメントに網羅されていました。ただ、今回のv3は**色々仕様が変わっている箇所**があり、公式ドキュメントだけでは仕様が不明なコンポーネントが多く、**使い方を理解するのに苦労しました**。
※多くの変更は公式の ```Migration to v3``` に記載されていました

「こんな使い方いけるのかな？」といったように、試しで色々使ってみることで理解を深めていきました✨
また、```npx @chakra-ui/cli snippet add``` で CLIをインストールするとエラーが多く出たので、その時はインストールしたChakraUIのソースコードを追いかけることで、なぜエラーが起きているのかの原因を探しました。
**ネットで検索しても出てこないエラーについては、ソースコードを見ることが大事だと学びました！**

### ■Jest(Testing-Library)でのテスト実装
前回の学習アプリも同様にTesting-Libarayを使用していましたが、今回はテストパターンも前回より多く、ユーザーイベントを使用して分かりやすい・無駄のないテスト設計を心掛けました。

```beforeEach``` を使用して各テストで同じような処理を事前に実施するように実装した際には、```state``` の更新を考慮できていなかったことに気づき、```act```関数の仕組みや、```beforeEach``` と ```test``` の実行タイミングなどを改めて理解することで、テストを修正することができました。

一部曖昧に理解するのではなく、使い方を全て理解した上で関数を使用することが重要だと学びました🙌
↑ここについては、焦らず積み上げていくことを意識したいと思います！

# 出来るようになっていたこと
- #### 事前にコンポーネントとして分離できるようになったこと
今までは、一旦殴り書きで全て書き終わってからリファクタリングでコンポーネント分割をしていましたが、今回の開発では事前にコンポーネント化すべき箇所を実施してから再利用する形を取れるようになっていました。
- #### アトミックデザインを意識したファイル構成
https://zenn.dev/bizlink/articles/b5c8985af8407a

最小単位は ```atoms``` フォルダに、```atoms```単位を組み合わせたUIコンポーネントは別のフォルダにと、まだ少し理解が浅いですが構成も考えられるようになってきました。

学習アプリで実施したfirebaseのデプロイやサーバーの立て方、supbaseへのAPI作成など同じような手順を踏むことでしっかりと知識として定着してきた実感があります。
**一回だけでなく、何回も繰り返すことが大事ですねっ！！**

# 工夫した点
昔から試行錯誤で1つ1つ思いついたことを試していく癖があり、なんでバグが起きたか？の原因をよく考えずに色々な記事を見て試しては失敗してを繰り返していました。

今回は、なぜ動かないのかを一旦考えてから自分なりに推測した理由で記事を探したり、AIに聞くなどをしました。
これが本当にうまくハマり、最初から答えに辿り着くなど原因を見つけるスピードが上がったと感じています。

その際、**過去に開発した方の記事に本当に助けられました。**「うわ、こんなエラー見たことないぞ..」となった時も、エラー文を検索すると1番上に解決策の記事が出てあっさりと次に進むことができました笑

**これがなかったら1ヶ月はかかっていたかもしれません...**
自分もエラーの記事はなるべく投稿するようにしているのですが、**助けてもらう側に立ってようやく意義のある事なんだと実感できています**。先人の方々のおかげでスムーズに開発を進めることができ、**気持ちよく個人開発が出来ているということは素晴らしい事だと今回しみじみと感じました！！**

そのおかげでこの名刺アプリに関しては2週間と少しで完成させることが出来ました！

# おわりに
最近は、できることが増えてきて嬉しいです。
このまま頑張り続けたいと思います！！

ただ！焦らずちゃんと理解してから進むことを意識したいと思います。
本当に、焦る癖があるので...（笑）

# JISOUのメンバー募集中！
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？
興味のある方は、ぜひホームページをのぞいてみてくださ！
▼▼▼

https://projisou.jp