OmniAICreator/Qiita-1.07M huggingface dataset:
Amazon Q Developer CLI で MCP をサポート（AWS Diagram MCP Server で構成図を数分で作成）

# 内容

タイトル通りのため、Amazon Q Developer CLI とは？ MCP とは？はについて本記事では割愛します。

https://aws.amazon.com/jp/about-aws/whats-new/2025/04/amazon-q-developer-cli-model-context-protocol/

https://aws.amazon.com/jp/blogs/news/extend-the-amazon-q-developer-cli-with-mcp/


# 過去の参考記事

過去の MCP の記事については ↓ です。

https://qiita.com/leomaro7/items/187c2d68a384264b2b2f

Amazon Q Developer CLI の記事については ↓ です。 

https://qiita.com/leomaro7/items/916a307e43a9e0c92eef


## 設定方法

`mcp.json` に MCP サーバーを記述する

ホームディレクトリ（例：~/.aws/amazonq/mcp.json）に保存すると、マシン上のすべてのプロジェクトに適用される。
ワークスペースのルート（例：.amazonq/mcp.json）に設定を保存して、プロジェクトメンバー間で共有する。


# やってみる

今回は [AWS Diagram MCP Server](https://awslabs.github.io/mcp/servers/aws-diagram-mcp-server/) を使ってみたいと思います。

ドキュメントの通り設定します。

```~/.aws/amazonq/mcp.json
{
  "mcpServers": {
    "awslabs.aws-diagram-mcp-server": {
      "command": "uvx",
      "args": ["awslabs.aws-diagram-mcp-server"],
      "env": {
        "FASTMCP_LOG_LEVEL": "ERROR"
      },
      "autoApprove": [],
      "disabled": false
    }
  }
}
```

`a chat` 後、「どんなツールを持っていますか？」と尋ねてみると、AWS Diagram MCP Server のツールの内容を確認できます。
![スクリーンショット 2025-05-20 19.38.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/3856bb75-e765-46aa-ae94-9fd99e1a54c7.png)

サンプルとして以下の AWS CDK を git clone しておきます。

https://github.com/aws-samples/aws-cdk-examples/tree/main/typescript/lambda-api-ci

「現在のディレクトリ配下にあるAWS CDKの構成図を作成して下さい。」と尋ねてみます。
![スクリーンショット 2025-05-20 19.51.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/d573c109-7706-4078-acfb-9a00f42acc64.png)

まず、プロジェクトの構造を確認しているようです。
![スクリーンショット 2025-05-20 19.53.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/412f2b50-b7fa-49d7-8e20-d263c4215d82.png)

必要な情報が集まったので、構成図の作成が始まります。
![スクリーンショット 2025-05-20 19.53.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/2244cece-9612-4bd9-b917-204cb755aff5.png)

diagrm_565ccf0.png で構成図が作成されました。
![スクリーンショット 2025-05-20 19.54.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/b9f54958-f29e-4751-b77a-ada2e67a7c67.png)

結果はこんな感じです。
![スクリーンショット 2025-05-20 19.57.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/1cc74d77-e764-4c75-adf7-2ba7e4541765.png)


# 所管

数分でできたので、今まで数時間かけて書いていたものが、なんだったのか。。。
また、開発中に要件が変わり構成図を変更しないといけないといった場合、これに任せればよさそう。普通に drawio などで書いていると必要なリソースが増えて線をずらさないといけないとか面倒なこともなくなりますね。
REST API について

## REST API について
これから「REST API」についてまとめていきます。
「REST API」とは、RESTの原則に基づいて設計されたAPIのことです。
クライアント(PCやスマホなど)はHTTP を利用して、作成、更新、検索、削除などの操作ができます。以下の表で説明します。

|CRUD操作| メゾット | 説明 |
|:-:|:-:|:-:|
|Create|POST|作成(リソース名が未定)|
|Create|PUT|作成(リソース名が決まっている)|
|Read|GET|読み取り|
|Update|PUT|更新|
|Delete|DELETE|削除|

では、このメゾットを安全(リクエストを送信してもリソースは変更されない)と冪等（複数回行っても同じ操作）に分けていきます。

| メゾット| 安全 | 冪等 |
|:-:|:-:|:-:|
|GET|  ○| ○|
|HEAD|   ○| ○|
|POST|  × |  ×|
|PUT|  ×| ○|
|DELETE|  ×|○ |

安全な操作は読み取り専用で、データが変わるなどの副作用がなく安心して使うことができます。冪等であれば操作が決まっているので、後の処理が予測できて使いやすいです。
次にURIごとのメゾットについて見ていきましょう。

|URI|HTTP method|
|:-:|:-:|
|/movies|GET| → 動画を取得する 
|/movies|POST| → 動画を登録する 
|/movies/1|GET| → 特定の動画の取得
|/movies/1|PUT| → 特定の動画を更新する 
|/movies/1|DELETE|→ 特定の動画を削除する 

このように全体や特定のユーザ操作を指定できます。
次にURI設計で考慮することは以下の通りです。

- URIは短く入力しやすいものに。
- 人が読んで理解できる誤認識を防ぐ。英単語を使う。
- 大文字小文字が混在していない。（すべて小文字）
- 単語は_で繋げる。単語を連結するなら＼で区切るのが望ましい。
- 単語は複数形を利用する。
- ％2543536%3536のようなエンコードを必要とする文字は使わない。
- サーバ側のアーキテクチャを反映されていない。
- 意味の分からないものは含めない。
- ルールが統一されている。

また、よく使うステータスコードについて大まかに押さえておきましょう

| ステータスコード| 意味 |
|:-:|:-:|
| 100番台 |   情報|
| 200番台|  成功|
| 300番台|  リダイレクト|
| 400番台|  クライアントサイドに起因するエラー|
|500番台| サーバーサイドに起因するエラー |

エラーの番号によって原因を大まかに特定できるので覚えておきましょう。
これでREST APIの説明を終わります。
[writeup] picoCTF "13"

# 今回の問題
picoCTFより"13"を解いていきます。

# 実際に解いていく
### 1. 問題文を確認する
![13_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945501/997b3f5b-d330-4f8a-9565-0377f9562341.png)
```
cvpbPGS{abg_gbb_onq_bs_n_ceboyrz}
```
今回はこの暗号を解読すれば終わりのようです。


### 2. 暗号の特徴を書き出す
この暗号の特徴を以下に書き出します。
- アルファベットのみが使用されている
- 小文字と大文字が明確に分けられている
- FLAGの形式に似ている

そして、問題のタイトルと説明から
- **ROT13**

という、キーワードが見つけられます。

### 3. ROT13とは？
**ROT13**の特徴を要点を絞ってまとめました。
- ROT13は**文章の各文字をアルファベット順で13後の文字に置き換える**単換字式暗号の一つ
- 再度ROT13を適用すると元の文章が得られる
- 単純な暗号化手法で、強度は低い
- ネットワーク上のやりとりで冗談の落ち、パズルの解法、ネタばれ情報などを隠すのに用いられる
- 暗号化と復号の方法が同じ
参考：[ROT13(ja)](https://ja.wikipedia.org/wiki/ROT13), [ROT13(en)](https://en.wikipedia.org/wiki/ROT13)

それでは、以上を踏まえて暗号を解読していきます。

### 4. 解読する
再掲になりますが、これが今回の暗号です。
```
cvpbPGS{abg_gbb_onq_bs_n_ceboyrz}
```
まずは先頭のアルファベット「c」について考えていきます。
```
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13
　　　　　　　　　　　　↓
c, d ,e, f, g, h, i, j, k ,l , m,  n,  o,  p
```
上図は
- 上段: カウント
- 下段: アルファベット順

を表しています。
このようにして、「c」の13個後ろのアルファベットが「p」だということがわかります。

同じような手順で、今回の暗号を解読していくと
```
picoCTF{not_too_bad_of_a_problem}
```
というFLAGが獲得できました！お疲れ様です。

# もう少し考えてみる
今回は ROT13 の暗号を解読しました。
しかし、手動で一つずつ変換していくのは大変です。自動で行ってくれるサイトはないのでしょうか？

...ありますよ！
以下の便利なWebサイトを使えば一発で解けちゃいます！
[rot13.com](https://rot13.com/)
または、
[CyberChef](https://gchq.github.io/CyberChef/)(←左上の[Operations]にROT13を入力すれば出てきます)
でも解くことが可能です。

# まとめ
今回の問題では、ROT13の簡単な概要と解読手順について学びました。

# 補足
・なし
UARTハードフロー制御について

# UART通信におけるハードウェアフロー制御のすすめ
UART（Universal Asynchronous Receiver/Transmitter）は、組み込み機器をはじめとした多くの電子機器で用いられるシンプルなシリアル通信手段です。
しかし、その手軽さゆえに **「データの取りこぼし」や「バッファオーバーフロー」といった通信トラブル** に悩まされた経験がある方も多いのではないでしょうか？
こうした問題を未然に防ぐ有効な手段のひとつが、**ハードウェアフロー制御（Hardware Flow Control）** です。

# なぜUART通信にフロー制御が必要なのか？
UARTは、送信側と受信側が非同期に動作する通信方式です。つまり、送信側がどんどんデータを送っても、受信側の処理が追いつかない場合があります。このとき、受信バッファがあふれる等の**受信機がデータ受け入れ不可の時に送信機が新しいデータを送信してしまうと、データの破損やロストが発生します。**

:::note warn
**以下のようなケースで問題が起こりやすくなります**
- 高速なデータ送信（例：1Mbps以上）
- ソフトウェア処理に遅延があるMCU
- BluetoothやUSB-シリアル変換ICなど、内部バッファが制限されているデバイスとの通信
- 相手機器が一時的に処理を中断する可能性がある場面（スリープ遷移、割込み多発など）
:::

そこで、UARTのデータライン（RX,TX）に加えて、**送受信側それぞれの送信許可信号を取り扱うRTS（Request To Send）とCTS（Clear To Send）ピンを加えた通信**がハードウェアフロー制御付きのUART通信になります。

# RTSとCTSの接続と振る舞い
ノード同士のRTS/CTSの接続について、丁度よい図がSTMicroelectronics社の公開資料に掲載されていたので下図に示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1092604/36d6b8de-cec9-417b-8c16-18d81b519451.png)
> STMicroelectronics "STM32WB – USART" 11ページより
> https://www.stmcu.jp/wp/wp-content/uploads/files/presentation-ja/STM32WB/33_STM32WB-Peripheral-USART-interface-(USART)_J.pdf

この回路において、各RTS/CTSの方向・機能は以下の表に示すとおりです。
| 信号線     | 方向 | 機能                |
| ------- | -- | ----------------- |
| **RTS** | 出力 | 自機の「受信可能」状態を相手に通知 |
| **CTS** | 入力 | 相手の「受信可能」状態を自機が確認 |

通信にあたっては、受信機側のRX回路は、新しいデータを受け入れ可能な状態のときにRTSピンをLowにし、受け入れ不可の場合にはHighにすることで、受信の可否を送信機のCTSピンへ通知します。送信機側のTX回路は、CTSピンの状態を監視することでデータ送信の可否を判断し、CTSピンがLow（＝受信機のRTSがLow）のときにデータを送信します。この処理は通常、1バイト単位で行われ、送信側はCTSピンがHigh（＝受信機が受信不可）であることを検知すると、CTSピンが再びLowになるまで送信を待機します。
この一連の流れによってUARTのデータ転送を安全かつ確実に行うことができるのです。

図の通り**RTS/CTSは、送受信それぞれのTX/RX回路に対して独立して動作する**ため、片方のラインのみを使用することも可能です。たとえば、USART1のTX回路およびUSART2のRX回路間でRTS/CTSを接続し、片方向のみでハードウェアフロー制御を行うといった使い方ができます。この場合、USART1のRX回路およびUSART2のTX回路間ではハードウェアフロー制御は行われません。

また、UARTペリフェラルにRTS/CTSピンが搭載されていない場合でも、GPIOピンを使用してRTS/CTSの機能をソフトウェアで模倣することは可能です。しかし、この方法ではソフトウェアの割り込み処理やタイミングの遅延により、正常に動作しない可能性がありので、**RTS/CTS機能をハードウェア的に備えたUARTペリフェラルを使用することを推奨します。**

# ハードウェアフロー制御を採用すべき事例
UART通信を行うにあたって、ハードウェアフロー制御を積極的に採用すべき事例と、フロー制御を行わない場合のリスクを以下に列挙します。参考にしてみてください。

### 1. PCと組み込み機器間の高速通信
PCは非常に高速にデータを送信できる一方、組み込み機器側は受信処理が追いつかないことがあります。特に1Mbps以上の通信では、割込みやDMA処理の遅延が致命的になります。フロー制御による再送処理がない場合、互いに逸失したデータが存在することすら気付けないというかなり致命的な事故を起こします。

### 2. 無線通信モジュールとのUART通信（例：Xbee、RN42）
無線通信は無線特有の遅延や不安定さがあり、フロー制御による通信可能の確認を怠るとモジュール内部のバッファが簡単にあふれることがあります。バッファが溢れた場合、モジュールがデータを黙って破棄する可能性があり、通信の信頼性が著しく低下します。
また、無線が不通となった際に、送信側が気づかずにデータを送信し続けてしまい多量のデータを逸失してしまう等の惨状を引き起こす場合があります。

### 3. 受信処理に時間を要するセンサーとの接続
センサーからの連続データ出力に対して、MCU側が他の処理で応答できない時間帯が生じることがあります（逆もまた然り）。
このタイムラグの間に受信バッファがあふれ、データが破損。センサーによっては再取得が不可能となるなどの惨劇が発生します。

### 4. 複数のUARTデバイスを切り替えて使用する構成
複数のUARTデバイスをソフトウェアで切り替えながら使用する構成では、1つのデバイスに集中できないため、一時的な受信停止が避けられません。非アクティブ状態の間にデータが送られると、受信バッファのオーバーフローやデータ欠落、データラインの汚染によるやデバイス間通信の競合が発生する可能性があります。

# まとめ
高品質・安全なUART通信の確保にはハードウェアフロー制御による通信がオススメです。
無線モジュールなどのUART通信設計をする際には、是非ハードウェアフロー制御の採用をご検討ください。

# おまけ（具体的な設定例）
**STM32CubeIDEでのハードウェアフロー制御の設定**

https://qiita.com/me26003t/items/5c6f21b9e6b75c2aafe6

**Xbee(XB24C)でのハードウェアフロー制御の設定**

https://qiita.com/me26003t/items/ff91eb38e1097404a715
CloudFrontで5xxエラーが連発する場合の原因と対策まとめ

# CloudFrontで5xxエラーが連発する場合の原因と対策まとめ

Amazon CloudFront を利用していると、`502 Bad Gateway` や `504 Gateway Timeout` を中心とした **5xxエラー** が連発するケースがあります。  
これらのエラーは、オリジンサーバーの問題だけでなく、CloudFrontやその周辺構成にも原因があることがあります。

本記事では、**原因の特定ポイントとCloudFront側でできる制御・軽減策**をまとめます。

---

## 🔍 まず確認すべきポイント

| チェック項目 | 内容 |
|--------------|------|
| オリジンの種類 | S3 / ALB / API Gateway / EC2など |
| オリジンの応答状況 | CloudFrontを経由せずにオリジンへ直接アクセスしてステータス確認 |
| エラー傾向の調査 | 時間帯、リージョン、User-Agentなどに偏りがないか |
| CloudFrontログ | `sc-status`, `x-edge-result-type`, `cs-uri-stem` などを調査 |

---

## 🛠 CloudFront側での制御策

### 1. キャッシュポリシーの最適化

オリジンに頻繁にアクセスしないよう、キャッシュを活用して5xxを抑制。

```json
{
  "DefaultTTL": 60,
  "MaxTTL": 300,
  "MinTTL": 10
}
```

- APIや動的コンテンツでもTTLを短く設定してキャッシュを使う
- クエリ文字列やCookieをキャッシュキーに含めるか見直す

---

### 2. オリジングループの活用（フェイルオーバー）

CloudFrontのオリジングループを使えば、**オリジンが5xxを返した際に代替オリジンに切り替え**ることが可能。

例:  
- メイン：ALB  
- フェイルオーバー：S3の静的エラーページ

---

### 3. カスタムエラーレスポンス

CloudFront上で5xxエラー発生時に、**即座にキャッシュ済みのエラーページを返す**ことでUXを改善。

```json
{
  "HTTP Error Code": 502,
  "Response Page Path": "/custom_502.html",
  "TTL": 30
}
```

---

### 4. タイムアウト/KeepAliveの見直し

`504`などが出る場合、CloudFront⇔オリジン間のタイムアウトが影響していることが多い。

- ALB: Idle Timeout を 60秒以上に
- EC2/Nginx: KeepAlive を有効にし、タイムアウトも適切に調整

---

### 5. Lambda@Edge / CloudFront Functions によるリクエスト制御

- 明らかに攻撃的・異常なパターンのリクエストをブロック
- User-Agentが `CFNetwork`, `sqlmap`, `curl` などのパターンを検知して遮断

```js
if (request.headers['user-agent'] && request.headers['user-agent'].value.includes('sqlmap')) {
  return {
    statusCode: 403,
    statusDescription: 'Forbidden',
    body: 'Blocked by Lambda@Edge'
  };
}
```

---

### 6. AWS WAFの導入でBotやDDoSの制御

- Rate-based rule（単位時間あたりのアクセス数制御）
- CAPTCHA / Challenge
- Geo Match（地理的制御）
- Bot Control（マネージドルール）

---

## 📊 監視強化ポイント

- CloudWatch: `5xxErrorRate`, `TotalErrorRate`
- CloudFront Access Log → Athena or QuickSight で可視化
- Lambda@Edge + CloudWatch Logs による詳細追跡

---

## ✅ まとめ

| 対策 | 効果 |
|------|------|
| キャッシュ制御 | オリジン負荷低減・エラー回避 |
| フェイルオーバー構成 | サービス継続性向上 |
| エラーレスポンス設定 | UX改善、再試行負荷抑制 |
| Lambda@Edge / WAF | 攻撃・Botからの防御 |
| オリジンの調整 | タイムアウト・接続安定化 |

---

## 📎 補足：CloudFrontログ分析例（Athena）

```sql
SELECT
  date,
  time,
  sc_status,
  cs_method,
  cs_uri_stem,
  c_ip,
  cs_user_agent
FROM cloudfront_logs
WHERE sc_status LIKE '5%'
ORDER BY date DESC, time DESC
LIMIT 100;
```

---

## 🔗 関連ドキュメント

- [CloudFront 5xx errors – AWS Docs](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/http-5xx-errors.html)
- [AWS WAF Bot Control](https://docs.aws.amazon.com/waf/latest/developerguide/waf-bot-control.html)
- [Lambda@Edge – Request/Response Handling](https://docs.aws.amazon.com/lambda/latest/dg/lambda-edge.html)

---

執筆者: 檜垣慶太  
CloudFrontの5xx対策で困っている方の参考になれば幸いです！
僕が先に考えたのに！


自分が考えたアイディアが先を越された経験は誰にでもあるでしょう。

そんなときに、「これ俺が先に考えたんだよね～」と発言しても

負け惜しみ乙
後出しじゃんけん乙
コロンブスの卵って知ってる？

と思われることが容易に想像できます。
（なお、こんなアイディアを思いつくなんて天才だ！みたいにちやほやされているとさらに悶々とするでしょう）

また、自分が遅くアイディアを実現しても、
他者からはただの二番煎じであり、大して評価されません。
むしろ寒い、パクリと思われるのがオチでしょう。

だからこそ、アイディアは先に出しておいたほうがよいのでは？と思うのです。

ブログでも、SNSでも何でもいいので、適当にアイディアをまとめて公開しておけば、
自分が先に考えたという証明になります。

よって先を越されても

自分が先に考えていたもんね～（人間の屑）

と正々堂々思えることで、多少は心のモヤモヤが解消されることでしょう。

---

とはいえ、なんやかんやで先に実現させた人は偉いのです。

アイディアを形にするには、手を動かす時間も、気力も、情熱も必要であり、
「思いつくこと」と「実現すること」の間には、想像以上に大きな壁があるのです。

なので、「自分が先に考えていた」と言いたくなる気持ちはあっても、
やっぱり一番称賛されるべきは、最初に行動した人なのです。

---

https://qiita.com/search?sort=&q=user%3Amogamoga1337++title%3A%E3%82%A2%E3%82%A4%E3%83%87%E3%82%A3%E3%82%A2
Git のコミット履歴をキレイに保つ重要性

# はじめに

Git コミット、日々行っていることだと思います。
業務でシステムの保守するにあたり、過去の Git コミットメッセージを見ることがよくあるのですが、思うところがあったので まとめたものを共有します。

# Git コミットメッセージについて

<script async class="docswell-embed" src="https://www.docswell.com/assets/libs/docswell-embed/docswell-embed.min.js" data-src="https://www.docswell.com/slide/Z4V7XJ/embed" data-aspect="0.5625"></script><div class="docswell-link"><a href="https://www.docswell.com/s/rowpure/Z4V7XJ-2024-12-04-220000">キレイなコミットでプロジェクトを支える～質の高いGit履歴の作り方～ by @rowpure</a></div>

## コミットメッセージの重要性

- 分かりやすい履歴はトラブルシューティングや新規開発を効率化してくれる
    - 数年前のコミットメッセージが更新、修正などあいまいな表現ばかりだと、コミットの中身をすべて確認しないと何が行われたかわからない

# Git コミットを整理できるリベースについて

<script async class="docswell-embed" src="https://www.docswell.com/assets/libs/docswell-embed/docswell-embed.min.js" data-src="https://www.docswell.com/slide/KL1YL7/embed" data-aspect="0.5625"></script><div class="docswell-link"><a href="https://www.docswell.com/s/rowpure/KL1YL7-2025-05-20-180000">私たちは過去を変えられる〜 Git rebase のスゴさとヤバさ〜 by @rowpure</a></div>

## リベースの重要性

- シンプルな履歴を保てる
    - マージコミットが発生しない分、履歴が 1本の線となり さかのぼって読みやすくなる
- コミットを整理できる
    - 直前のコミット漏れを後追いでコミットした。等の余計なコミットをまとめられ、さかのぼってよみやすくなる

# さいごに

この記事が他のエンジニアの助けになれば幸いです。
🛒【SQL】カート機能を実装する時に知っておきたいJOINとcart_idの扱い方

# 🛒【SQL】カート機能を実装する時に知っておきたいJOINとcart\_idの扱い方

## 🌀 はじめに

ECサイトなどでよく使われる「カート機能」には、
`cart`テーブルと`product`テーブルのJOINが欠かせません。

今回の記事では、以下のポイントについてまとめます：

* `JOIN`の基本構造
* `cart_id`や`user_id`によるデータの絵切り方
* 商品タイプ数のカウント方法
* よくある落とし穴と改善方法

---

## 📅 カートと商品テーブルのJOIN基本形

```sql
SELECT
  A.product_id,
  A.name,
  A.price,
  B.quantity
FROM cart AS B
INNER JOIN product AS A ON A.product_id = B.product_id
WHERE B.user_id = :user_id;
```

このクエリで**特定ユーザーのカート内商品の詳細情報**を取得可能。

---

## ❗ JOINするだけでは「どのカートか」は分からない

例えば以下のようなケースでは、**明確に条件を指定しないと不正確な結果になります。**

### 🔍 カートの絵切り方一覧

| クエリの目的          | 必要なWHERE条件                                   |
| --------------- | -------------------------------------------- |
| ログイン中ユーザーのカート全件 | `WHERE user_id = :user_id`                   |
| 単品購入（注文確認）      | `WHERE cart_id = :cart_id`                   |
| チェック済アイテムのみ     | `WHERE user_id = :user_id AND choose = true` |

---

## 🧐 商品タイプ数をカウントするには？

商品の**種類数**（同じ商品が複数あっても一つと数える）を知りたいときはこのサブクエリ：

```sql
SELECT COUNT(DISTINCT product_id)
FROM cart
WHERE user_id = :user_id;
```

---

## 💡 よくある落とし穴

```sql
WHERE B.product_id = A.product_id
```

この条件は`JOIN`句にすでに含まれているため、**冗長**です。
正しくは`ON A.product_id = B.product_id`だけで十分です。

また、**cart\_idが存在しても条件に入れなければ「どのカートか」特定できません。**

---

## ✅ 実装のポイントまとめ

* `JOIN`しただけでは「誰の・どのカート」か分からない
* `cart_id`や`user_id`を明確にWHERE句に入れるべし
* 同じ商品でもオプションが異なると別カートになる可能性あり

---

## 🔺 おわりに

注文機能やカート表示はよく使う処理なので、**SQLのJOINと条件指定の重要性**を理解しておくことがとても大事です。

他にも関連して、以下のようなトピックも順次まとめていく予定です：

* 一括購入機能の処理ロジック
* 選択済アイテムのみの注文処理
* 注文確定後のカート削除フロー

参考になった方はLGTM・フォローよろしくお願いします 🙌
bash: uvicorn: command not found と戦う

# はじめに
windows10にてタイトルのエラーが出て苦戦しました。

# 手順

```
$ pip install uvicorn
```
でインストール。

```
$ pip show uvicorn
Name: uvicorn
Version: 0.34.2
Summary: The lightning-fast ASGI server.
Home-page: https://www.uvicorn.org/
Author:
Author-email: Tom Christie <tom@tomchristie.com>, Marcelo Trylesinski <marcelotryle@gmail.com>
License-Expression: BSD-3-Clause
Location: C:\Users\Owner\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages
Requires: click, h11
Required-by:
```
Locateを確認。
ただし、ここのLocateと実際にexeファイルがある場所は異なることに気が付かずつまずきました。

私の場合は以下にありました。
```
C:\Users\Owner\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\Scripts
```

このPATHを環境変数に追加して終わり。
RPMレポジトリからnvidia-driverをインストールする(RTX5090)

今回 FedoraでRTX5090でのGPU環境構築を行なった
かなり苦労したので今後同じ人が生まれないことを望んで記事を書いてみた。

# 注意点
・Secure Bootを無効にできない場合。
自力で署名する必要があるとのこと
[Secure Boot有効でインストールする方法](https://github.com/roworu/nvidia-fedora-secureboot)
・筆者は有効のままでもできたと思われる。

・RTX50xxシリーズを使っている場合
openカーネルを利用しないといけないらしい...???
インストール前(dnf install akmod-nvidia ...)に以下を実施
```shell
sudo sh -c 'echo "%_with_kmod_nvidia_open 1" > /etc/rpm/macros.nvidia-kmod
```

# インストール手順
```shell
#RPMレポジトリインストール
sudo dnf install \
  https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm \
  https://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm
```
```shell
#dnfをリロード
sudo dnf upgrade --refresh
```

```shell
#RTX50xxの場合(open版を)
sudo sh -c 'echo "%_with_kmod_nvidia_open 1" > /etc/rpm/macros.nvidia-kmod
```


```shell
#nvidiaドライバーインストール
sudo dnf install akmod-nvidia xorg-x11-drv-nvidia-cuda
```
```shell
#再起動
sudo reboot
```

```shell
#正常に動作しているか確認
nvidia-smi
```
# 経験したエラーなどについて
色々と血迷ったがうまくインストールは成功した
筆者が行った試行錯誤をまとめる

行っていた各エラーの確認方法(chatgpt産)
```shell
# 1. GPU が搭載されているか？
lspci | grep -i nvidia
"→全て成功(GPUは読み込まれている)"

# 2. NVIDIA モジュールが読み込まれているか？
lsmod | grep nvidia
"→全て成功(nvidia モジュールは読み込まれている)"

# 3. ドライババージョン確認（あれば）
nvidia-smi
"→ずっと(No device were found)"

# 4. ドライバが動いているかログ確認
dmesg | grep -i nvidia
"→ずっと(installed in this system requires use of the NVIDIA open kernel modules)"
```


１.通常インストール(Secure Boot有効)
❌nvidia-smi,dmesg | grep -i nvidia　でエラー

2.署名を行う(Secure Boot有効)
❌nvidia-smi,dmesg | grep -i nvidia　でエラー

3.通常インストール (Secure Boot"無効",署名維持)
❌nvidia-smi,dmesg | grep -i nvidia　でエラー

4.通常インストール (Secure Boot"無効",署名維持,openカーネル利用)
🙆‍♂️

5.4の後Secure Boot 有効化 (署名維持,openカーネル利用) 
🙆‍♂️

6.5の後署名を無効化
🙆‍♂️

# 結論
nvidia-smiやdmesgのエラーをそのままChatgptに入れて、返答を見ていたが、初心者なこともありなかなか理由が見つけれなかった。(今はそうゆうことかとなっているが...)
結局出ていたエラーの原因はインストールしたnvidiaドライバーのカーネルモジュールがオープン版になっていなかったことらしい...
Secure bootは最初から有効でもうまくいったと考えられる
同様にして、RTX4080でのインストールも行なっていたが、そちらに関しては、open版の明示指定をする必要ななかったため、RTX50xxから注意が必要。


# 参考
[カーネルモジュールのopen版をインストールする方法](https://www.reddit.com/r/Fedora/comments/1kisg23/trouble_getting_the_nvidia_drivers_to_work/)
[Secure Boot有効でインストール](https://github.com/roworu/nvidia-fedora-secureboot)
.node-versionとnodenvでNode.jsのバージョン管理をする

もともとはnodebrewがインストールしてあったのだが、プロジェクトによってnodeのバージョンが違かったため不便だった。
.node-versionに記載してあるnodeのバージョンによってnodeを使い分けたいときにはnodenvを使用すると良さそう。

https://github.com/nodenv/nodenv

## nodenvのインストールと設定

### nodenvをHomebrewでインストール
```
$ brew install nodenv
```
少し時間がかかるが待つ。

```
$ nodenv -v
nodenv 1.5.0
```
nodenvのバージョンが表示される。これでnodevnはインストールできた。

### シェル設定に追加
※ MacOS、zshrcの場合
```
$ echo 'eval "$(nodenv init -)"' >> ~/.zshrc

$ source ~/.zshrc
```

これで``.node-version``に記載してあるバージョン番号を認識してくれる。

```
$ node -v
```
意図したnodeのバージョンが表示されることを確認しよう。

## nodenvの使い方

### nodeのインストール
```
$ nodenv install 22.0.0
```
これでnode22をインストールする。

### ディレクトリで使用したnodeのバージョンを指定する
```
$ nodenv local 22.0.0
```
プロジェクトのディレクトリで使用するバージョンを指定する。
これにより``.node-version``が自動的に作成もしくは更新される。

```
$ node -v
v22.0.0
```

完了
AWS Strands Agentsを使ってAWSのシステム構成図を作成する


# AWS Strands Agentsを使ってAWSのシステム構成図を作成する

AWS Strands Agentsを使ってAWSのシステム構成図を作成する方法のご紹介です。AWSからはCloudFormationの情報を操作するためのMCP Serverが提供されています。これを利用して、AWSのシステム構成図を作成する方法を確認してみました。

## 対象とするシステム

以下のシステムを対象としています。AWS環境にデプロイした後のCloudFormationの情報を取得して、システム構成図を作成するというシナリオです。

* [discord-bot-zundamon](https://github.com/lhideki/discord-bot-zundamon)

## 前提条件

* Strands Agents: 0.1.2

## ソースコード

* agents-aws-architecture-diagram.py

```python
from strands import Agent
from strands.tools.mcp import MCPClient
from mcp import stdio_client, StdioServerParameters
from strands.models import BedrockModel

NAMING_SYSTEM_PROMPT = """
あなたはAWSリソースの情報を取得しdraw.io形式でAWSのシステム構成図を描画するアシスタントです。
ユーザが指定したStackの情報をツールを使って取得し、draw.io形式でAWSアーキテクチャ図を描画してください。

xml形式のみ出力してください。
"""

get_aws_resource_info_tools = MCPClient(
    lambda: stdio_client(
        StdioServerParameters(
            command="uvx",
            # CloudFormation MCP Serverを指定します。`--readonly`オプションを指定することでMCP ServerがAWSに書き込みを行わないようにします。
            args=["awslabs.cfn-mcp-server@latest", "--readonly"],
            # MCP ServerがAWSにアクセスできるように、ENVにAWS_PROFILEを指定します。
            env={"AWS_PROFILE": "your-aws-profile", "AWS_REGION": "ap-northeast-1"},
        )
    )
)


bedrock_model = BedrockModel(
    model_id="apac.anthropic.claude-sonnet-4-20250514-v1:0", temperature=0.0
)

with get_aws_resource_info_tools:
    tools = get_aws_resource_info_tools.list_tools_sync()
    drawing_agent = Agent(
        system_prompt=NAMING_SYSTEM_PROMPT, tools=tools, model=bedrock_model
    )

    # Agentには、リポジトリの内容をデプロイした後のStack名を指定します。
    result = str(drawing_agent("discord-bot-zundamon-test-discord-bot"))
    # Agentからのレスポンスにはdraw.io形式以外の出力が含まれる可能性があります。
    # このため、resultから<mxfileから始まり、</mxfile>で終わる部分を抽出します。
    start = result.find("<mxfile")
    end = result.find("</mxfile>") + len("</mxfile>")
    result = result[start:end]

    with open("aws_architecture_diagram.drawio", "w") as f:
        f.write(result)
```

以下のように実行します。

```bash
python -u agents-aws-architecture-diagram.py
```

## 生成されたシステム構成図

以下のようなシステム構成図が生成されました。そのままを利用するのは微妙ですがdraw.io形式で出力されているので、draw.ioで開いて修正することができます。

![](https://www.inoue-kobo.com/aws/aws-strands-agent-drawing-aws-architecture-diagram/images/generated-architecture-diagram.png)

## システム構成図の改善案

AWS MCP Serversには図を描画するためのMCP Serverもあります。これをAgentにToolとして組み込む事で、より良いシステム構成図を描画することができるかもしれません。

* [AWS Diagram MCP Server](https://github.com/awslabs/mcp?tab=readme-ov-file#aws-diagram-mcp-server)

## 参考文献

* [Strands Agents](https://github.com/strands-agents/sdk-python)
* [AWS MCP Servers](https://github.com/awslabs/mcp)
Microsoft Build 2025 Day1 サム・アルトマン対談パート感想

# はじめに
Microsoft Build Day1のKeynoteはAzure AI Foundryのスタックの絵が繰り返し繰り返し登場したのが印象的でした。Copilot（副操縦士）という位置付けはやや存在感が薄れ、今後のエージェントによる変革が既定路線となるなかで、開発者をそして世界中の人々を支援しエンパワーするためにマイクロソフトが考えるAIへの取組みについてCEOが語り倒すという贅沢な基調講演で、聞いてるこちらとしては現地のナマの熱気と興奮にワクワクさせられつつも、来たるべきエージェンティックな世界観で開発者に求められる変化と責務の大きさに武者震いが出てしまう側面もありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361516/6ce8c11a-1eb5-41fa-a369-042033cb9ebd.png)

Buildの発表内容は順次[Book of news](https://news.microsoft.com/build-2025-book-of-news/)に追加されており、[日本語ニュースサイト](https://www.itmedia.co.jp/news/articles/2505/20/news097.html)でも紹介され、[日本MS社員有志の皆さんによる最速レポート配信](https://msdevjp.connpass.com/event/353197/)もありました。また、Keynoteのみ、すでに[Youtubeでも視聴可能](https://www.youtube.com/watch?v=ceV3RsG946s)です。

# サプライズゲスト
今年はOpenAIのサム・アルトマン、Grokのイーロン・マスク、NVIDIAのジェンスン・フアンがオンラインで登場しました。サム・アルトマンは発言が聞き取れなかったのでホテルに戻って動画を見てみたところ、たった三分ほどの会話なんですが印象深い内容だったので、私なりの抄訳を記載します。

# サム・アルトマン対談パート（翻訳と強調は筆者）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361516/5c7fe8bf-7dda-47d0-90f7-4559b6ad4ca5.png)

[（サム登場箇所のYoutubeリンク）](https://www.youtube.com/watch?v=ceV3RsG946s&t=655s)

###### サティア：
わたしたちは先週金曜にリリースされたOpenAI Codexに非常に興奮しています。サム・アルトマンをオンラインでお招きすることができ、光栄です。サム、ようこそBuildへ！

###### サム：
お招きいただきありがとう。

###### サティア：
開発者がソフトウェアエンジニアリングで使う様々な規格について聞かせてください。たとえばOpenAIはCLIに対応し、先週にはコーディングエージェントを発表しました。今後ソフトウェア・エンジニアリングがどのように進化していくのか、また開発者がこういった様々な規格をどのように使っていくのか、あなたの考えを聞かせてくれますか？

###### サム：
2021年のことだったと思いますが、私があなたと一緒にCodexの最初のバージョンをGitHubで開発したとき、私たちは「いつか本当のエージェンティックなコーディング体験が実現される日が来る」と話していましたよね。今それがついに目の前にあることに感銘を受けています。これは**プログラミングに関すれば私がこれまで目にしてきた中で最大の変革**だと思います。バーチャルな同僚に仕事をアサインできて、「これやっといて」とか、もっと進んで「これこれこういう大きなことを実現したいから数日間やってみて」みたいなことを言える、しかもそうした指示を並列に多数実行できる、バグ修正や新規機能開発やコードの解説とか、これは真の意味でソフトウェアエンジニアリングのタスク委譲といえると思います。もちろんまだ発展の余地はありますが、これは本当にすばらしい瞬間です。GitHubと深く連携して、環境とリポジトリにアクセス許可を与えて、驚くべきことを達成させることができますから。

###### サティア：
そうですね。開発者がフロー状態にとどまり、AIエージェントと人間の両方を同僚としてプロセスを加速させるのを目にするのはとてもすばらしいです。サム、今後のモデルロードマップについてすこしだけ教えてくれますか？

###### サム：
モデルは既にとても賢いですし、今後もより賢くなりつづけます。しかし今後はモデルの使用がより簡単になり、自動的に適切な結果を返すようになりますし、より信頼できるようになります。マルチモーダルやtool use連携といった機能もさらに強化され、「ただ動く」という状態に近くなっていきます。会話もできるし、複雑なコーディングもできるし、エージェンティックなタスクもできて、私は信頼して任せられる、人々は進化の早さに驚くと思います。

###### サティア：
ChatGPTはいま世界で最も大規模なステートフル・エージェンティックアプリケーションです。Codexもそうですよね。Buildに参加している開発者にむけて、かれらが大規模なステートフル・エージェンティックアプリケーションを開発していくために、先駆者としてアドバイスをお願いします。

###### サム：
**最も対処が難しいのは変化のスピードだと思います。** モデルが２年前に可能だったことを思い出してみて、また２年後に可能となるだろうことを考えたとき、この驚くべき速さの進化を開発者がどのように開発計画に織り込んで、製品を開発していくのか。いかに新しいツールと新しいワークフローに全力を注ぐのか。歴史上を見てもこれほどのテクノロジーシフトは多くないですが、**早期に全力を注いだものが報われてきたことは確かです。**

###### サティア：
そのとおりですね。このBuildで強調していることのひとつも、アプリケーションサーバーによって開発者が最新のサンプルを取得しつづけるという…

###### サム：
この数か月間Codexに携わってきて非常に感銘を受けたことがあります。アーリーアダプターというのはいつも非常に少数なのですが、かれらが急速にCodexを一日中使い続けるようになり、かれらのワークフローを変革させ、同僚にくらべ驚くべき量の仕事をできるようになったんです。

###### サティア：
すばらしい。ありがとうございました。またBuildでお会いしましょう。

# 感想
**"Leaning in early and hard has been very rewarded."** 濃密なイベントですので、動画が配信されニュースサイトに記事が出てしまった後でも書きたいことは尽きません。これはBook Of Newsには載ってなかった情報ですが、近いうちにnotepad.exeでマークダウンが表示可能になるようです！
Copilot Chatで変わる！コードレビューは「読む」から「問う」時代へ 

## 差分から始めて、深く、速く、そして賢く

GitHub Copilot Chatの登場により、プルリクエスト（PR）レビューは“読解”から“対話”へ進化しました。  
本記事では、Copilot Chatの「Ask Copilot」を活用し、PRレビューの**質を保ちながら、効率を最大化する手法**を4つのユースケースに沿って紹介します。

## レビューが変わる4つのユースケース

| ユースケース | 説明 |
|-------------|------|
| 1. 修正意図の自動要約 | 差分だけで「何を」「なぜ」変更したか理解できる |
| 2. 差分からの改善提案 | リファクタの観点でAIに提案させる |
| 3. 関連コードの追跡 | 影響範囲を横断的に把握できる |
| 4. 時間短縮＋品質向上 | 人の判断力とAIの下支えでレビューの質を担保 |

## 使い方
![スクリーンショット 2025-05-20 17.34.49 - 編集済み.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852075/cfe32823-a2e9-44e5-b66c-9988fb1af2de.png)
1. PRレビュー画面にある「Ask Copilot」をクリック
2. レビュー対象のファイルにチェックをつける
3. 「Start Chat」をクリック
4. 「この変更の目的を要約してください」などの質問を投げる

すごくシンプルな例題になりますが、下記のユースケースを参考に実際に自分たちのプロジェクトで試してみてください！

## 1. 差分をAIが読み解く：修正意図の理解

PRで最も時間を取られるのが、「この変更、何のため？」の解読作業。
Copilot Chatを使えば、**差分に対して会話を行うだけで修正意図を自然言語で要約**してくれます。

```
💬 自分: この変更の目的を要約してください 
🤖 Copilot: この修正は、N+1問題を防ぐために `includes(:posts)` を追加しています。
```
💡ポイント
- 背景が複雑なPRでも、要点だけを掴めるので、読解コストが激減します。
- プロジェクト特有の情報などをプロンプトに含めると精度が上がることがあります。

## 2. 差分にフォーカスしたリファクタ提案
次に、修正されたコードを見て「もっと良くできるのでは？」と思ったとき、Copilot Chatに改善案をその場で提案させることが可能です。

```
プロンプト例：
💬 自分: このロジック、もっとシンプルにできますか？  
🤖 Copilot: 条件分岐をメソッドに切り出し、可読性とテスト容易性を高められます。
```

```
Before:
if user && user.active? && user.admin?
  perform_sensitive_operation
end

After:
def admin_user?(user)
  user&.active? && user&.admin?
end
```
💡ポイント
- 自分では気づかなかった改善案に触れることで、レビューの幅と深さが広がります
- 特定のメソッド名などに対してリファクタをお願いすると質が向上したりします

## 3. 関連コードを横断チェック：影響範囲の把握
Copilot Chatは、現在見ているコードだけでなく、プロジェクト全体の文脈をもとに、他ファイルの影響範囲も追跡できます。

```
💬 自分: このメソッドはどこから呼び出されていますか？  
🤖 Copilot: 以下のファイルで使用されています。
- app/controllers/admin/users_controller.rb
- app/services/audit_logger.rb
- app/jobs/daily_report_job.rb
```
<!-- [ここに関数の呼び出し関係の図を挿入] -->

💡ポイント
- 手作業でのgrepや探査が不要になり、安全な変更確認が即座に可能

## 4. AI×人間のハイブリッドレビュー
Copilot Chatはあくまでレビューの助手です。
最後の判断は人間が行う必要がありますが、それでも以下の点で大幅な時短が可能です。

| 作業内容 | Copilot Chatの支援内容 |
| ------- |----------------------|
| 修正の意図確認 | 自動で要約・説明 |
| コード改善提案 | その場でリファクタを提案 |
| 影響範囲の確認 | 横断的に呼び出し元を特定 |
| コメント生成 | コメント案を作成してもらう |

☝️結果
- レビューの本質的な判断に集中できるようになり、品質とスピードが両立できます。

## まとめ：レビューは「読む」から「問う」時代へ
Copilot Chatを活用すれば、プルリクエストレビューは次のように変わります。

✅ 差分を読み解く作業が質問一つで完結

✅ 改善提案をその場で得てコードの質を向上

✅ 関連ファイルの影響範囲を自動で追跡

✅ 人間の判断力をAIが強力にサポート

### 導入の一歩：おすすめプロンプト集
| 状況 | プロンプト例 |
| -------- | ---------- |
| 修正意図を知りたい | 「この変更はなぜ必要ですか？」、「どのような変更が行われていますか」 |
| 可読性を上げたい | 「このコードをもっとシンプルにできますか？」、「〇〇についてリファクタしてください」 |
| 影響を知りたい | 「この関数は他にどこで使われていますか？」 |
| コメントを書きたい | 「このコードに対してレビューコメントを生成してください」 |

### 終わりに
GitHub Copilot Chatは、レビュー作業の手間を減らすだけでなく、より深く、より正確なレビューを実現するパートナーです。
とにかく、疑問に思ったところや気になる点は、たくさん問いかけてみてください。
いつのまにか、あなたもCopilot Chatの虜になっているはずです（笑）

ぜひ、次のプルリクから活用してみてください！

一緒にPLAYLANDをつくっていく仲間を募集中です！
---
プログラミング未経験の方へ
まずは「つくる楽しさ」を体験してみませんか？
PLAYLANDプログラミングスクールで、ゼロから学べます。
▶︎ https://school.playland.co.jp/

エンジニアの方へ
私たちと一緒に、学びと成長の場を広げていきませんか？
PLAYLANDでは、仲間として加わってくれるエンジニアを募集しています。
▶︎ https://playland.co.jp/recruit
GitHub Copilot coding agentについて簡潔にまとめる

先日リリースされたGitHub Copilot coding agentについて簡潔に書いてみました！
試行回数が少ないので間違っている部分もあるかもしれません🙇‍♂️

https://github.blog/changelog/2025-05-19-github-copilot-coding-agent-in-public-preview/

# Copilot
（日本語訳）
Copilot コーディング エージェントを使用すると、GitHub Copilot は人間の開発者と同じようにバックグラウンドで独立して動作し、タスクを完了できます。
> With Copilot coding agent, GitHub Copilot can work independently in the background to complete tasks, just like a human developer.

https://docs.github.com/en/copilot/using-github-copilot/using-copilot-coding-agent-to-work-on-tasks/about-assigning-tasks-to-copilot#overview-of-copilot-coding-agent


# 使用方法
前提として、GitHub Copilot Pro+ および GitHub Copilot Enterprise プランで利用可能です

- IssueにCopilotをアサインする
- https://github.com/copilot や GitHubの右上から開けるチャットでプルリクエストの作成を依頼

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697143/8e6959a7-9eaa-47ba-8157-d0b21bb3d2be.png)


https://docs.github.com/en/copilot/using-github-copilot/using-copilot-coding-agent-to-work-on-tasks/about-assigning-tasks-to-copilot

# わかったこと
### 動作関連
- レビューコメントに反応する
  - 作ってもらったPRにコメントすると反応して修正してくれる
  - リプライにも反応
  - Copilotのレビューコメントには反応しない
    - Copilotのレビューのリプライにユーザーがコメントした場合も反応しない
  - まとめてコメントすると、コミットもまとめてくれる
- 良い結果を得るには
  - スコープが明確に設定されたタスクを割り当てる
- CopilotによるベースブランチやPRの文章の変更
  - PR作成後にはできない
  - 作成前ならChatの指示で出すことにより可能

### 設定関連
- MCPも設定可能
  - https://docs.github.com/en/enterprise-cloud@latest/copilot/customizing-copilot/extending-copilot-coding-agent-with-mcp
- 日本語対応
  - 日本語でレビューしてもらう方法と同様でPRのテンプレートを使う（以下が参考になります🙏）
    - https://zenn.dev/rescuenow/articles/55ea72023527d1
- カスタム指示
  - `.github/copilot-instructions.md` で設定
- Copilot用の事前インストール
  - `.github/workflows/copilot-setup-steps.yml` にワークフローファイルを作る
    - https://docs.github.com/en/copilot/customizing-copilot/customizing-the-development-environment-for-copilot-coding-agent#preinstalling-tools-or-dependencies-in-copilots-environment

### 料金関連
- GitHub ActionsとCopilotのプレミアムリクエストの料金が発生する
  - プレミアムリクエストは6/4から

# 感想
今のところかなり良さげです！
どれくらい複雑な実装までできるかは掴めていないので要検証
コーディングエージェント一気に出てきましたね…
kubectl で突然 “v1beta2 が無い” と怒られたら──ディスカバリーキャッシュが犯人だった話

## エラー

```
kubectl get machinepool -A
Error from server (NotFound): Unable to list "cluster.x-k8s.io/v1beta2, Resource=machinepools": the server could not find the requested resource (get machinepools.cluster.x-k8s.io)
```

使ってるのは v1beta1 なのに、なぜ v1beta2？

## 何が起きた？

1. sandbox環境で検証で v1beta2 CRD を apply
2. すぐ消して v1beta1 を apply し直し
3. **kubectl のディスカバリーキャッシュ** に v1beta2 が残存
4. kubectl「v1beta2 あるよね？」→ APIServer「知らん」→ エラー

## 対処

```bash
# キャッシュを爆破
rm -rf ~/.kube/cache/discovery/*

# 再実行
kubectl get machinepool -A
```

## 教訓

- CRD を入れ替えた後に謎エラー→まずキャッシュを疑う
C#でExcelのセルデータ型を取得する方法

Excelファイルを扱う際に、セルのデータ型を把握することは、データを正しく解析し処理するために役立ちます。[**Free Spire.XLS**](https://www.e-iceblue.com/Introduce/free-xls-component.html)は、Excelファイルを効率的に操作することができる強力で無料の.NETコンポーネントであり、セルのデータ型の読み取りもサポートしています。この記事では、Free Spire.XLSを使用して**Excelセルのデータ型を取得する方法**を詳しく解説し、開発者がデータ型を正確に識別し、データ処理の精度を確保する手助けをします。

## 環境構築
始める前に、[Free Spire.XLS](https://www.e-iceblue.com/Download/download-excel-for-net-free.html) コンポーネントをインストールする必要があります。以下の手順でインストールできます：
1.	Visual Studio を開き、新しい.NET プロジェクト（例：コンソールアプリケーション）を作成します。
2.	ソリューションエクスプローラーでプロジェクトを右クリックし、「NuGet パッケージの管理」を選択します。
3.	NuGet パッケージマネージャーで「FreeSpire.XLS」を検索し、適切なバージョンを選択してインストールします。
![2025-05-09_145621.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/d9508a0a-f32f-4386-a69d-78500ba55db5.png)


## 6 種の一般的なデータ型
Free Spire.XLS では、**`XlsWorksheet.TRangeValueType`** 列挙型がセルのデータ型を表しており、以下の 6 種類のタイプがあります：
* **`String`**：文字列型
* **`Number`**：数値型
* **`Formula`**：数式型
* **`Boolean`**：ブール型（真偽値）
* **`Error`**：エラー値
* **`Blank`**：空値

## C#を使用してExcelのセルデータ型を読み取る

1.	Excel ドキュメント（XLS または XLSX 形式）を読み込み、特定のワークシートを取得します。
1.	ワークシート内の指定したセル範囲を取得し、各セルをループで処理します。
1.	**`Worksheet.GetCellType(int row, int column, bool bNeedFormulaSubType)`** メソッドを呼び出して、現在のセルの値の型を取得します。返される **`XlsWorksheet.TRangeValueType`** は列挙型で、前述の一般的な値が含まれます。
1.	**`ToString()`** メソッドを使用して列挙値をテキスト文字列に変換し、隣接するセルに書き込みます。
5.	結果ファイルを保存します。


***C#のコード：***
```csharp
using System.Drawing;
using Spire.Xls;
using Spire.Xls.Core.Spreadsheet;

namespace GetCellType
{
    class Program
    {
        static void Main(string[] args)
        {
            // Excelドキュメントを読み込む  
            Workbook workbook = new Workbook();
            workbook.LoadFromFile("test.xlsx");

            // 最初のワークシートを取得する  
            Worksheet sheet = workbook.Worksheets[0];
            // 指定されたセル範囲を取得する
            CellRange range = sheet.Range["A2:A8"];

            // 範囲内の各セルを反復処理する
            foreach (CellRange cell in range)
            {
                // 現在のセルのデータ型を取得する
                int row = cell.Row;
                int column = cell.Column;
                XlsWorksheet.TRangeValueType cellType = sheet.GetCellType(row, column, false);

                // データ型を文字列に変換し、隣接するセルに書き込む  
                sheet[row, column + 1].Text = cellType.ToString();

                // フォントスタイルを設定する  
                sheet[row, column + 1].Style.Font.Color = Color.Red;
                sheet[row, column + 1].Style.Font.IsBold = true;
            }

            // ファイルを保存する
            workbook.SaveToFile("ExcelCellType.xlsx", ExcelVersion.Version2016);
        }
    }
}
```

***出力結果:***
![GetExcelCellType.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/1f8264a3-a151-4dde-9719-f22e4d49df22.png)

* * *
**関連リソース**
* [Free Spire.XLS オンラインチュートリアル](https://www.e-iceblue.com/Tutorials/Spire.XLS/Spire.XLS-Program-Guide/Spire.XLS-Program-Guide-Content.html)
* [API リファレンス](https://www.e-iceblue.com/apireference/net/Spire.XLS/html/6e0f229f-3721-09ac-5bbf-f093a2affbcd.htm)
How to Use Google Search Console to Supercharge Your SEO Efforts

If you’re aiming to elevate your SEO game and enhance your site’s performance, Google Search Console (GSC) is an invaluable tool in your arsenal. We’ve seen firsthand how GSC can provide deep insights and actionable data to optimize our sites effectively. In this guide, we’ll explore tips and tricks to leverage Google Search Console, turning it into a powerhouse for your SEO strategy. Let’s dive in!

Why Google Search Console is Essential for SEO
Google Search Console offers a wealth of information that can significantly impact our SEO efforts:

Gain Insights: GSC provides insights into how Google views our site, including indexing status, search performance, and potential issues.
Identify Opportunities: By analyzing data from GSC, we can uncover opportunities for improvement and optimize our site to boost visibility and rankings.
Monitor Performance: Regularly checking GSC helps us track our site’s performance, identify trends, and make data-driven decisions.
Getting Started with Google Search Console
Before we dive into advanced tips, let’s ensure we’re set up correctly:

Verify Your Site: We begin by verifying our site with GSC. This step involves proving ownership through methods such as adding a meta tag to our site’s header, uploading an HTML file, or verifying through our domain name provider.
Set Up Performance Reports: Once verified, we configure the Performance report to start gathering data on search queries, clicks, impressions, and average position.
Key Features and How to Use Them
Let’s explore some of the key features in Google Search Console and how we can utilize them to supercharge our SEO efforts:

1. Performance Report: Analyze Search Data
The Performance report is a goldmine for understanding how our site performs in search results:

Review Search Queries: We examine the queries that drive traffic to our site. By identifying high-performing queries and areas for improvement, we can refine our content and keyword strategy.
Monitor Click-Through Rate (CTR): We analyze CTR to determine how well our titles and meta descriptions are compelling users to click. Improving these elements can boost engagement and drive more traffic.
Track Impressions and Average Position: We keep an eye on impressions and average position metrics to gauge how our pages rank and identify opportunities to improve visibility.
配列と文字列の2段階アクセスでラクする！



Paizaの配列系問題にまた挑戦！
今回は「配列の中の文字列」から、さらに「その中の1文字」を抜き出すという、ちょっとだけややこしい問題。

<br>

## 🧩問題概要

「`M` 個の文字列が並んでいる配列があり、その `N` 番目の文字列の `L` 番目の文字を取り出せ」

<br>

入力例：

    3 5 2
    abc def ghi jkl mno

出力例：

    h
<br>

https://paiza.jp/works/mondai/array_primer/array_primer__string_i-thinput_step4

<br><br>

## 🔁 ループを使ったコード例

```js
const rl = require('readline').createInterface({ input: process.stdin });
const lines = [];

rl.on('line', input => lines.push(input));

rl.on('close', () => {
    const [N, M, L] = lines[0].split(' ').map(Number);
    const words = lines[1].split(' ');

    let targetWord = '';
    for (let i = 0; i < M; i++) {
        if (i === N - 1) {
            targetWord = words[i];
            break;
        }
    }

    let resultChar = '';
    for (let j = 0; j < targetWord.length; j++) {
        if (j === L - 1) {
            resultChar = targetWord[j];
            break;
        }
    }

    console.log(resultChar);
});
```

### 🔍 解説：

- 最初のループで、`N` 番目の文字列（0-indexed で `N-1`）を探す。
- 次のループで、その文字列の `L` 番目の文字（0-indexedで `L-1`）を探す。
- 両方とも `break` を使って、条件を満たしたらすぐループを抜けるようする。

<Br><br>

## 📌二重インデックスで取得バージョン
```js
const rl = require('readline').createInterface({input:process.stdin});
const lines = [];

rl.on('line',(input)=>{
    lines.push(input);
});


rl.on('close',()=>{
    const [N,M,L] = lines[0].split(' ').map(Number);
    const arr = lines[1].split(' ');
    
    console.log(arr[N-1][L-1]);
})
```
<br>

### 文字列も配列のようにインデックスでアクセス可能

JavaScriptでは、文字列も配列のようにインデックスでアクセス可能なので、以下のように直接文字を取り出せる
```js
const str = "hello";
console.log(str[1]); // => "e"
```

#### ✅ ポイントまとめ：

- 文字列`[strIndex]` でその位置の文字を取得できる（0-indexed）-
- `split'')` で配列に変換する必要はない。
- `strings[N – 1][L – 1]` のように、二重インデックスで「 `N` 番目の文字列の `L` 番目の文字」が直接取れる。


## <Br><br>気づきメモ

- `split('')` しなくても文字列はインデックスで直接アクセスできる。
- ループを使うと処理がわかりやすく見えるけど、今回は不要だった。

## <br><br>✍️まとめ

この問題、簡単だけど「どう書くか」がポイントだった！

`split'')` を使うと文字列を文字の配列に変換できるけど、文字を取得するだけなら不要みたい。
「文字の並びを変更したい」といった「操作」をする場合には配列にする必要がある！

<br><br><br>[僕の失敗談(´;ω;｀)と解決法🐈](https://paizabeginner.wordpress.com/about/)
【2025年5月】AWS SAP-C02 合格メモ｜¥2,600で786点合格

# 【2025年5月】AWS SAP-C02 合格メモ｜学習費用 ¥2,600で786点合格

## はじめに

AWSのソリューションアーキテクト　プロフェッショナル試験（AWS SAP-C02）に合格しました。点数は **786点**。
**セール活用・無料教材・AI補強**を駆使して、**トータル2,600円で合格**できました。
対策費用を抑えつつ、効率よく学習を勧められたので共有します。

---

## 🔖 目次
- [はじめに](#はじめに)
- [費用を抑えるための3つの戦略](#費用を抑えるための3つの戦略)
  - [1. 無料リソースを活用](#1-無料リソースを活用)
  - [2. Udemyセールを活用](#2-udemyセールを活用)
  - [3. 生成AIで無料の家庭教師](#3-生成aiで無料の家庭教師)
- [実際に使った教材と感想](#実際に使った教材と感想)
- [試験勉強の進め方（ステップ別）](#試験勉強の進め方ステップ別)
- [感想とまとめ](#感想とまとめ)
- [おわりに](#おわりに)

---

## 費用を抑えるための3つの戦略


### 1. 無料リソースを活用

まずはAWS公式が提供している資料で雰囲気を掴みました。
- [SAP-C02 試験ガイド（無料）](https://aws.amazon.com/certification/certified-solutions-architect-professional/)  
- [SAP-C02 サンプル問題（無料、10問）](https://d1.awsstatic.com/ja_JP/training-and-certification/docs-sa-pro/AWS-Certified-Solutions-Architect-Professional_Sample-Questions_C02.pdf)
- [SAP-C02 練習問題セット（無料、20問）](https://explore.skillbuilder.aws/learn/course/external/view/elearning/13272/AWS-Certified-Solutions-Architect-%E2%80%93-Professional-Official-Practice-Question-Set-SAP-C02-Japanese-)

まずはここに目を通すことで、どの教材を選ぶべきか、という良し悪しが分かるようになります。

---

### 2. Udemyセールを活用

Udemyの講座は定価だと1～1.5万円しますが、セール時ならかなり安く購入可能。  
**実際に購入したのは以下の2つ（合計約2,600円）**：

- [Ultimate AWS Certified Solutions Architect Professional 2025](https://www.udemy.com/course/aws-solutions-architect-professional/)
¥1,300（← セール以外だと ¥15,800）※**英語。苦手な方は日本語の教材がおすすめ。**
- [AWS SAP-C02模擬問題集｜全420問を詳細解説！ソリューションアーキテクト プロフェッショナル【2025年版】](https://www.udemy.com/course/aws-sap-c02420-2025/?referralCode=4C8D8DC34EFB099EF809)
¥1,300（← セール以外だと ¥27,800）


---

### 3. 生成AIで「無料の家庭教師」

模擬試験の選択肢に迷ったとき、**ChatGPTやClaudeなどのAIに壁打ち**を依頼。

- なぜその選択肢が正解なのか
- 他の選択肢が不正解である理由
- 公式ドキュメントへのリンクなど

今ではAI活用は常識。教材の解説は充実してましたが、**追加で気になった点を確認する手段**として非常に有効でした。

---

## 実際に使った教材と感想

| 種別 | 名称 | 金額 | 感想 |
|------|------|------|------|
| 公式教材 | 試験ガイド・サンプル問題 | 無料 | 問題文の雰囲気に慣れるのに◎ |
| Udemy講座 | Ultimate SAP-C02講座 | 1,300円 | 試験範囲を広くカバー。図解豊富で視覚的に理解しやすい |
| 模擬試験 | AWS SAP-C02模擬問題集 全420問 | 1,300円 | 解説が丁寧。最初に挑戦する模試として最適 |
| AI活用 | ChatGPT・Claude等 | 月額費用含めず | 理解を深める壁打ちとして重宝 |
| 技術情報 | AWS公式ドキュメント、DevelopersIOなど | 無料 | 新サービスやマイナーサービスの理解に役立つ |

---

## 試験勉強の進め方（ステップ別）
1. **公式ガイドで試験対象を確認**  
2. **全体像の把握**：Udemy講座で全サービスをざっくり俯瞰  
3. **模擬試験を解く→間違いをAIに質問して理解**  
4. **新サービス・知らない用語は公式ドキュメントで補完**  
5. **最後に公式サンプル問題と練習問題セットで仕上げ**

---

## 感想とまとめ

SAP-C02は「知識量」だけでなく「設計判断力」が問われる試験です。  
出題文が長く、複数の選択肢が正しそうに見える場面も多々ありました。

✔ 公式教材を最大限に活用する  
✔ Udemyセールを見逃さない、定価で買わない
✔ わからない点は生成AIで壁打ちする  

これだけでも、しっかり対策すれば **合格点に十分届きます**。

「費用をかけない＝非効率」ではありません。  
むしろ、**取捨選択しながら学習できる力**が本試験でも武器になるはずです。

---

## おわりに
必要十分の投資で合格できたかと、自分で満足しています。
AWSを実務で日々触っている方は、模擬問題集の1,300円だけで十分かもしれません。
AWS SAP-C02の受験を検討している方の参考になればと思います。
【ChatGPT活用術】SalesforceのXMLメタデータを自動で読み解く実験結果まとめ

# Workbench × ChatGPTでSalesforceの入力規則（Validation Rule）を一括抽出・CSV化する手順

Salesforceの入力規則（Validation Rule）をGUIから1件ずつ確認・転記するのは非常に非効率です。  
本記事では **Salesforce Workbench + ChatGPT** を活用し、以下のように効率よくValidation Ruleを抽出・整形する方法をご紹介します。

##  出力の手順

| ステップ | 内容 |
|----------|------|
| ① | Workbenchで `.object` XMLファイルを取得 |
| ② | `.xml` にリネームしてChatGPTにアップロード |
| ③ | ChatGPTでXML構文とタグ構造を確認 |
| ④ | `<validationRules>` を抽出して一覧化 |
| ⑤ | ChatGPTでCSV出力してダウンロード |

## ① Workbenchで `.object` を取得する

### 1. [Workbench](https://workbench.developerforce.com) にログイン  
- 環境（Production / Sandbox）を選択  
- OAuthでログイン

### 2. メニューから以下を選択

```
migration > Retrieve
```

### 3. 任意のオブジェクト（例：`Opportunity`）のValidation Ruleを含むメタデータを取得

以下のような `package.xml` を作成してアップロードします：

```xml
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
  <types>
    <members>Opportunity</members>
    <name>CustomObject</name>
  </types>
  <version>62.0</version>
</Package>
```


![スクリーンショット 2025-05-19 133221.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4080640/cf52b856-8465-4833-b9d9-27f00638ee3f.png)

Retrieveを実行すると、ZIPファイルがダウンロードされます。

---

## ② `.object` ファイルを `.xml` にリネーム

ZIPを展開すると、以下のようなファイルが生成されます：

```bash
unpackaged/objects/Opportunity.object
```

これをChatGPTに読み込ませやすいよう、拡張子を `.xml` に変更します：

```bash
mv Opportunity.object Opportunity.xml
```

---

## 🤖 ③ ChatGPTでXML構文とタグ構造を確認する

ChatGPTにこう指示します：

```
このXMLの構文とルート構造を解析してください
```

ChatGPTは次のように教えてくれます：

- ルートタグ：`<CustomObject>`
- 主な子要素：
  - `<fields>`：カスタム項目定義
  - `<validationRules>`：バリデーションルール定義
  - `<actionOverrides>`：UI関連アクション制御
  - `<enableHistory>`：履歴トラッキングなどの設定

---

## ④ `<validationRules>` を抽出する

次にChatGPTにこう依頼します：

```
validationRules タグを抽出して、ルール名・説明文・条件式・エラーメッセージを表にまとめてください
```

ChatGPTが以下のような表を生成してくれます：

| ルール名 | 説明文 | 条件式 | エラーメッセージ |
|----------|--------|--------|------------------|
| RequiredProject | プロジェクト必須 | ISBLANK(Project__c) | プロジェクトを入力してください |

こうすることで**オブジェクトに設定された入力規則のルール名・Description・条件式・エラーメッセージ等を取得**することができます。

---

## ⑤ ChatGPTにCSV出力を依頼

続けてこう依頼します：

```
この表をCSVにしてファイルで出力してください
```

すると、ChatGPTが `.csv` ファイルを生成し、**ダウンロードリンク付きで出力**してくれます（例：`Salesforce_ValidationRules_Export.csv`）。

---

## 💡 補足：複数オブジェクトの一括抽出も可能

複数の `.object` ファイル（例：`Opportunity.object`, `Project__c.object` など）を `.xml` にリネームし、まとめてChatGPTにアップロードすれば、**すべてのValidation Ruleを一括で抽出・整理**できます。

---

## 📝 まとめ

GUIで1件ずつ確認していたValidation Ruleも、**Workbench × ChatGPT** によって

- メタデータ取得  
- XML解析  
- CSV化による定義書生成  

をノーコードで完結できます。

レビュー用ドキュメントの自動生成、テスト設計、入力制御ロジックの棚卸しにぜひ活用してみてください。

---

## 🔗 関連リンク

- [Salesforce Workbench](https://workbench.developerforce.com)
- [Salesforce Metadata API Reference](https://developer.salesforce.com/docs/atlas.en-us.api_meta.meta/api_meta/meta_intro.htm)
- [ChatGPT（OpenAI）](https://chat.openai.com/)
なぜ船上ではARの位置合わせがズレまくるのか？ ARカメラマンが解説します！

# なぜ船上ではARの位置合わせがズレまくるのか？ ARカメラマンが解説します！

私は船に乗るのが大好きです。そして、船に乗ったら必ずやることがあります。
それは **スマホARでの撮影** です！

最近では、愛知県・日間賀島での船旅でAR撮影を試してみました。
そのときの様子がこちらです。

https://x.com/segur_vita/status/1923650697070891452

動画をご覧いただければわかるように、CGが桟橋に引っ張られたり、空中を漂ったりと、 **位置合わせが大暴れ** しています。

こちらは、三重県志摩市の「賢島エスパーニャクルーズ」で撮影した動画です。
上ほどではありませんが、やはり位置がズレています。

https://x.com/segur_vita/status/1863790075383091263



## どうしてこんなことが起きるのか？

理由は、スマホARが **2つのセンサーを併用して位置推定をしているから** です。

* **カメラ（Visual）**
* **IMU（Inertial Measurement Unit）**

このうちIMUは、加速度センサーとジャイロセンサーを組み合わせたもので、スマホの回転や加減速を高頻度で捉えています。

ところが、船が出港して加速したり、カーブを曲がったりすると、IMUは「スマホが動いている！」と判断します。
一方、カメラは、甲板などの視覚的な特徴点が変化しないことから、スマホが「ほぼ静止している」と推定します。

この **矛盾** がARの動作に混乱を招き、CGが暴れ出すわけです。

| センサー    | 主な役割                   | 船が動いたときの反応             | 船上ARでの影響        |
| ------- | ---------------------- | ---------------------- | --------------- |
| **IMU** | スマホの加速度・回転を検知する        | 船の加減速や揺れを「スマホの動き」として検知 | CGがズレる原因になる     |
| **カメラ** | スマホが見ている映像（特徴点）から位置を推定 | 視野内の特徴点が動かないため「静止」とみなす | CGをその場に固定しようとする |

このように、IMUとカメラで **世界の見え方** がまったく異なっていることが原因で、ARの座標系が混乱してしまいます。



## 実は、船に限らない問題です

この現象は船だけで起きるわけではありません。

* 電車やバスの中
* エレベーター
* 車内

など、あらゆる「乗り物内のAR体験」で発生しうる現象です。

ですので、もしこれから **乗り物内でのARイベントやサービス** を企画している方がいたら、
ぜひこの問題を知っておいてください。
実現にはかなりの工夫が必要です。



## 「でも、飛行機でうまくいったことあるよ？」という方へ

この話をすると、
「自分は飛行機でもちゃんとARできたよ？」
「船の上でも問題なく動いたけど？」
という声をいただくことがあります。

実はそれ、**乗り物が等速直線運動をしていたため、センサーの矛盾が起きにくかった**のかもしれません。

たとえば、以下の動画は船が安定して直進しているときに撮影したものです。

https://x.com/segur_vita/status/1901954736032714970

スマホを動かしてもCGがズレていません。

これはIMUが **加減速や回転に敏感である一方、等速直線運動には反応しにくい** 性質によるものです。

等速で進んでいる間、IMUは「動いていない」とみなすため、カメラと矛盾が生じにくくなります。
つまり、**直進中の船上は、実質的に“地面の上にいる”のに近い状態**と考えられます。
（ただし、GPSや気圧、揺れなど完全には一致しません）

また、船内の柱や柵など、**視覚的特徴が豊富な場所**で撮影したことにより、カメラによる推定が安定しやすかったとも考えられます。



## 結論：スマホARイベントは船の上では難しい！

まとめると、以下のようになります。

* 船が加速・旋回中は、IMUとカメラの認識に矛盾が生じてCGが暴れる
* 船が等速直線運動中なら、比較的安定してARが使える
* しかしその時間帯は限られていて、予測も難しい

つまり、**熟練のARカメラマン**であれば
「直進している瞬間だけ撮影する」というテクニックで対応可能ですが、
**不特定多数の人に体験させるイベントには向きません。**

「船がまっすぐ進んでいる10分間だけAR体験OK！」という運用ができれば理論上は可能ですが、現実的なイベント運営としては不可能なレベルでしょう。



## 最後に

私はこれからも、船の上でのARに挑み続けます。
そして「乗り物×AR」の課題やコツを、発信し続けていきたいと思います。

もし同じようなチャレンジをされている方がいれば、ぜひ交流しましょう！
X（旧Twitter）でも発信していますので、コメントお待ちしています。

https://x.com/segur_vita
連結子会社と完全子会社 - SESがぼやく経済

# 記事背景
みなさん、こんにちは！！
SES 6年目REIAです!
そろそろ経済をチェックしなきゃなと思い、
xTechを見まして、清水建設が日本道路を完全子会社化したのを発見しました。
そのニュースを確認しある疑問が生まれました。
# 連結子会社と完全子会社って？？
子会社や株の取得比率によって株主総会で発言権を得るくらいしか知らず、これらの違いが不明でしたので、
軽く調べたところ、違いは以下になります。

| 名称           | 株所持率 |
| ------------- | ------------- |
| 非連結子会社  | 25% - 50%  |
| 連結子会社  | 50% より多い  |
| 完全子会社 | 100% |

# 今回で何がしたかった？
記載内容からの素人予想ですが、
先に書いたように株の所持率が上がると株主総会での発言権が強くなります。
その他に役員任命にも介入できるようになります。
そのため、契約先の共有による販路拡充や
指揮命令権を持つ人に清水建設の社員を入れることができる(?)ので
情報共有、業務連携が容易になります。
また、利益相反を防ぐという目的もあるようです。

# 利益相反とは
親子関係を持つ会社同士が互いの利益を損ねる行為をいいます。
私のイメージだと、お互いがAという商品を販売し、同一クォリティなのに
親会社のほうが安く子会社の利益を損ねるというイメージです。
事業ごとで会社を分割してるはずなので
起こり得るのかはよく分からないです。。

# まとめ
経済、経営というような上位のビジネスサイドも学ばないと
エンジニアとして業務背景がより見えそうですし、シンプル楽しいので
これからも気になるのあれば書いていきます！！
間違ってる場所あれば、指摘いただけると幸いです。
ITパスポート部でサラッとやっただけじゃ覚えてないなぁ。。(9年前？）

# 参考記事
https://xtech.nikkei.com/atcl/nxt/column/18/00142/02245/
変化する CSS プロパティは全て変数化する #CSS設計

## 概要

ステートによって見た目が変化するコンポーネントが有った時、  
変化するプロパティは全て、変数化しておくとメンテナンス性が向上すると感じました。

ざっくり簡単な例を紹介します。

### CSS コードサンプル


```css
.accordion {
  .summary {
    background: var(--summary-bg);
  }
  .content {
    height: var(--content-h, 0);
  }

  /* States */
  &:is(:active, :focus-visible) {
    --summary-bg: #0001;
    --content-h: auto;
  }
}
```

CSS 変数を利用しなかった場合はこんな感じ。

```css
.accordion {
  .content {
    height: 0;
  }

  /* States */
  &:is(:active, :focus-visible) {
    .summary {
      background: #0001;
    }
    .content {
      height: auto;
    }
  }
}
```

変数は利用カ所で初めて定義する感じにしてますが、
コード量が多い場合はコンポーネントの先頭で纏めて書くと良いと思います。

```css
.accordion {
  --summary-bg: ;
  --content-h: 0;

  /* ... */
}
```

### CSS 変数化する利点

- DOM 構造の変化を気にしなくて良い
- 変化するプロパティを一覧できる  
  ≒ 構造の複雑さに関わらず変化を把握できる
  - 変化後がイメージしやすい
  - デザイン調整がしやすい

仕様変更等によって DOM 構造を書き換えたりした場合も、
ステートの中で構造の変化を追従しなくて良く、メンテナンス性が高いと感じました。

上記の例ではステートは１つですが、
ステートが複数あったり DOM 構造が複雑な場合も中々に調整困難になるかなと思います。

## 記事化の背景

怪しい挙動をするアコーディオンの実装方法を調査していた所から始まって、
以下の記事２つを参考に自分でデモを作っていました。

- [**autoなheightでもアニメーションができる**ようになる！calc-size() について - Zenn](https://zenn.dev/knowledgework/articles/84f6412ca11dcd)
- [**detailsとsummaryタグで作るアコーディオン**UI - アニメーションのより良い実装方法 - ICS MEDIA](https://ics.media/entry/220901/)

X での調査メモは ~~[この辺り](https://x.com/kaba_box/status/1920405393743675633)~~ [この辺り](https://x.com/kaba_box/status/1920713086522012059)。

**実装サンプル** (CodePen)
- [ドラッグで開くアコーディオン](https://codepen.io/k-utsumi/details/emmjQbg)
- [details タグ](https://codepen.io/k-utsumi/details/QwwRWBK)

ステート毎にプロパティを変更するため、
子要素まで細かく指定すると読みづらかったり、面倒さを感じて上記の様に CSS 変数化しました。  
結果として、  読みやすく調整もしやすくて良いなと思い記事化してみました。

余談になりますが、
details タグはブラウザの検索機能でも検出可能で自動で開いてくれるため、
アコーディオンでの利用にお勧めです。
Geminiでペンを使う魔法少女を描いてみた。

# 概要

Geminiでペンを使う魔法少女を描いてみました。

# 実装

プロンプトと実行結果は以下の通りでした。

```
光のペンを使う魔法少女を描いてください。
```

![光のペンを使う魔法少女_20250520.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/7b86ebce-14a0-42a1-bdc4-17def742c35d.png)



```
闇のペンを使う魔法少女を描いてください。
```
![闇のペンを使う魔法少女_20250520.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/ea9c9630-d147-46e3-8b4d-799e2ff5f0ec.png)



```
聖なるペンを使う魔法少女を描いてください。
```
![聖なるペンを使う魔法少女_20250520.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/d3041eb2-f12b-4520-81cb-40a305e5ff8b.png)

# まとめ

聖の子は可愛いかも。
何かの役に立てばと。
DOS窓世代｜Microsoftの新しいエディタ「edit」が復活！｜ rust から cargo build

2025年5月19日に開催されたMicrosoft Buildカンファレンスにて、Microsoftは新しいコンソールテキストエディタ「edit」を正式に発表したらしいです

ms-dos時代 懐かしいですね `edit.exe` 
その時代は、ms-dos付属の`edit.exe` がダメ過ぎて`mifes`使ってましたよね

https://mjeld.com/blog2/win_console_edit.html

editはrustで書いているらしく、現状では `git clone` から `cargo build --release`しないといけないようです

2025年夏にWindows Insider Programで利用可能になる予定とのことなのでビルドしてまで使いたくない人は Windowsにそのうちインストールされると思います。