OmniAICreator/Qiita-1.07M huggingface dataset:
信頼性工学とアレニウス


---

## 🔹 文脈：ICの信頼性と温度加速試験

半導体ICの信頼性を保証するため、**高温ストレス**を用いた\*\*加速寿命試験（温度加速試験）\*\*を実施し、短期間で長期動作を模擬します。そのときに使うのが **アレニウスの法則（Arrhenius Equation）** です。

---

## ✅ 式 ：Arrhenius式（加速係数の対数形）

$$
\ln L = A + \frac{E_a}{kT}
$$

* $L$：寿命時間（h）
* $A$：定数（ログスケールの比例係数）
* $E_a$：活性化エネルギー（eV）
* $k$：ボルツマン定数（$8.617 \times 10^{-5}\, \text{eV/K}$）
* $T$：絶対温度（K）

> 温度が高くなると、$\frac{1}{T}$ が小さくなり、結果として寿命 $L$ が短くなる（＝劣化が速く進む）ことを示す。

---

## ✅ 式 ：加速係数 $K$ の定義式（相対寿命）

$$
K = \frac{L_2}{L_1} = \exp\left[ \frac{E_a}{k} \left( \frac{1}{T_1} - \frac{1}{T_2} \right) \right]
$$

* $L_1$：温度 $T_1$ での寿命
* $L_2$：温度 $T_2$ での寿命
* $K$：加速係数（高温寿命時間が、実使用温度に対してどれだけ加速されているか）

---

## ✅ 計算例

条件：

* 試験温度 $T_2 = 125^\circ C = 398\,K$
* 実使用温度 $T_1 = 50^\circ C = 323\,K$
* 活性化エネルギー $E_a = 0.8\,eV$

$$
K = \exp\left( \frac{0.8}{8.617 \times 10^{-5}} \left( \frac{1}{323} - \frac{1}{398} \right) \right)
$$

$$
K = \exp\left( 9286 \cdot (0.003096 - 0.002513) \right)
= \exp(9286 \cdot 0.000583) \approx \exp(5.417) \approx 225
$$

### ✅ 解釈：

この加速係数 $K = 225$ は、**高温で1000時間使った結果は、実使用環境では225,000時間（約25年以上）に相当する**ことを意味します。

---

## ✅ 表：JEITA準拠の信頼性試験例

| 試験項目          | 温度条件         | 湿度条件など | 時間    |
| ------------- | ------------ | ------ | ----- |
| 高温保存試験        | 最大温度         | -      | 1000h |
| 低温保存試験        | 最小温度         | -      | 1000h |
| 高温高湿動作試験（THB） | 85°C / 85%RH | 電圧印加   | 1000h |

これらはすべて**加速試験条件**として設定され、**実使用寿命の保証に対して加速されていること**を示します。

---

## ✅ まとめ

| 項目      | 内容                              |
| ------- | ------------------------------- |
| 式 (8.1) | アレニウス則（寿命の温度依存性）                |
| 式 (8.2) | 2点間の寿命の比（加速係数）                  |
| 計算例     | $K = 225$：高温1000hは常温225,000hに相当 |
| 目的      | 少時間の試験で、長寿命の信頼性を評価する            |

---


```Python
# Program Name: arrhenius_acceleration.py
# Creation Date: 20250612
# Overview: Calculates the acceleration factor (K) of IC lifetime based on Arrhenius equation
# Usage: Estimate how temperature affects the accelerated test lifetime of ICs

# 必要なライブラリのインストールとインポート / Install and import necessary libraries
!pip install numpy

import numpy as np

# パラメータ定義（数値は一元管理）/ Define parameters centrally
Ea = 0.8                # 活性化エネルギー Activation energy [eV]
k = 8.617e-5            # ボルツマン定数 Boltzmann constant [eV/K]
T1_C = 50               # 実使用温度 Operating temperature [°C]
T2_C = 125              # 試験温度 Test temperature [°C]
L1 = 1000               # 高温側のテスト時間 Test time at T2 [h]

# 温度をK（ケルビン）に変換 / Convert °C to Kelvin
T1 = 273 + T1_C         # 実使用温度 Operating temperature [K]
T2 = 273 + T2_C         # 試験温度 Test temperature [K]

# 式(8.2)に基づく加速係数Kの計算 / Calculate acceleration factor based on Arrhenius equation
K = np.exp(Ea / k * (1/T1 - 1/T2))

# 実使用時間の見積り / Estimate equivalent real-world usage time
L2 = K * L1

# 結果出力 / Print results
print(f"Acceleration factor K: {K:.1f}")
print(f"Equivalent lifetime at T1 = {T1_C}°C for {L1}h at {T2_C}°C: {L2:.0f} h")

```
【メモ】AIエージェント関連のLT流し聞きで得たもの

# イベント概要
**参加イベント**

https://findy-tools.connpass.com/event/356879/

AI Engineering Summitのプレイベントとして開催された、AIエージェント活用に積極的な方々による2時間連続LT（18人連続、休憩なし！）でした。

# この記事について
今回聞けたお話の中でためになったことを備忘録として整理しています。私の主観（現在の業務での有用性、個人的興味等）が強く反映されているため、参考程度にご覧ください。

## 評価基準
- **★★★（すぐ実践したい）：** 即座に取り入れたい内容
- **★★（選定・改善時に活用）：** 導入検討や改善時に役立つ内容  
- **★（Tips）：** 知識として有用な内容


# ★★★(すぐ実践したい)
## Figma MCP による UI 開発効率化
- **Figma MCP で UI スタイルを自動取り込み**
  - Figmaデザインが既に存在する場合、フロント開発が飛躍的に効率化
  - Stitchで作成したUIと組み合わせると更なる効率化が期待できる
  - 参考：[Figma Dev Mode MCP Server](https://www.figma.com/blog/introducing-figmas-dev-mode-mcp-server/)

## AIエージェント活用時の注意点
- **思考停止での利用リスク**
  - AIエージェントを考えずに使うと思考力が低下する可能性
  - 便利だが、自身の成長に繋がっているかを常に意識する必要がある
- **「Devinでできないんだっけ？」思考の重要性**
  - AIエージェント（Devinに限らず）にできるかどうかを最初に考える習慣の大切さ

## AIエージェントの効果的な使い方  
- **ルール管理の分散化**
  - `.clinerules`等に全ルールを集約せず、`xxxx-rule-memories`等のディレクトリに役割別に格納
  - ルールファイル内では読み込みファイルの選定のみを行う
- **コンテキストの充実**
  - 要件定義や設計時に、会社・エンジニアチームの背景情報やガイドラインを提供することが重要

## その他のツール
- **Super Whisper**
  - カーソル位置への音声入力が可能
  - 以前から話題だが、実際に便利との評価
  - 残念ながらWindows未対応

https://superwhisper.com/


# ★★( 選定・改善時に活用)

## 新卒エンジニア向けドキュメント整備
- 新卒向けドキュメント（要件定義、設計、ガントチャート等）の型化による効率化

## キャッチアップ支援
- 既存コードの把握をAIに任せ、問答形式でキャッチアップ時間を短縮

## 開発ツールの多様化
- **複数ツールの併用検討**
  - Devin、Cursor、Claude Code等を組み合わせた活用
  - 理想的だが、会社の制約により実現が困難な場合も
  - 従量課金での利用でもランニングコスト計算の難しさが課題

## インフラ自動化との連携
- **Atlantis との組み合わせ**
  - Atlassian（BitBucket）環境でのTerraform運用
  - `atlantis plan`/`atlantis apply`をDevinで自動実行
  - AIエージェントとの互換性が開発効率に大きく影響

https://www.runatlantis.io/

# ★ (Tips)

## MCP（Model Context Protocol）
- **GitHub MCP のCursor連携**
  - Issue取得・書き込みの自動化
  - ローカルエージェントとGitHubリソースの連携に有用
  - 現時点では使いこなせていないため優先度は低め
 
https://github.com/github/github-mcp-server

 

## AIエージェント選定指針
- 会社の規約が厳しい場合：自社開発 or OSS利用を検討

## 具体的な活用場面
- **コード品質向上**
  - リファクタリング
  - SQL生成
  - ユニットテスト作成
  - 長期間コメントアウトされたコードの削除
- **コミュニケーション支援**
  - RealTime API での自然な会話
  - Slack上でのメンション対応AIチャットボット


# まとめ

今回のウェビナーを通じて、以下の点を改めて実感しました：

- **相互補完の関係性**
  - AIエージェントが取得しやすいコンテキストは教えてもらい、人間が取得しやすいコンテキストは教えてあげる
  - この相互補完を繰り返すことが効果的な活用の鍵

- **意識的な活用の重要性**
  - 楽をするためにAIエージェントをどう使うかを考えるのは良い
  - しかし、何も考えずに使うのは成長を阻害する可能性がある

- **若手エンジニアに厳しい世界**
  - 一見若手に優しい世界に見えるが、勘違いしたら全く成長できない危険性もある
  - 適切な距離感を保った活用が重要


# おわりに

本イベントの本編である AI Engineering Summit にも参加予定です。気が向いたら感想を投稿します。

https://ai-engineering-summit.findy-tools.io/?utm_source=preevent&utm_medium=connpass

皆さんもAIエージェントのお勉強（もちろん実用も含め）、気楽に頑張りましょう！
【GitHub】プロジェクトボードについて

# 記事概要
プロジェクトボードというGitHubの機能について、まとめる

# 前提
- アプリケーションはGitHubに登録済みである

# プロジェクトボードとは
タスクを整理・優先順位づけて取り組む際に役立つツール

# 手順(プロジェクトボード作成)
1. GitHubのリモートリポジトリをクリックする
1. 「Projects」のタブをクリックする
1. プルダウンから「New project」を選択し、「New project」ボタンをクリックする
1. 「Board」を選択し、「Create」をクリックする
1. プロジェクト名をクリックすると直接編集することができるので、任意のプロジェクト名に変更する

# 手順(カラム作成)
1. プロジェクトボードにて、「＋」をクリックする
1. 任意のカラム名を入力し、`returnキー(Enter)`を押す

※カラム上部をドラッグすると移動させることができる

# 手順(カラム設定)
## 作成したissueが、自動的に特定のカラムに追加されるように設定する
1. プロジェクト画面右上にある横三点リーダー（･･･）をクリックする
1. 「Workflows」をクリックする
1. 「Item added to project」を選択し、「Edit」をクリックする
1. 「When」の設定を「issue」のみに変更する
1. 「Set」の設定に、任意のカラムが表示されているか確認する
    違うカラムが表示されている場合は「Set」内の水色の部分をクリックすると変更できる
1. 「Save and turn on workflow」をクリックし、変更した内容を保存する

## 公開範囲を変更
1. 画面左上にあるプロジェクトボード名の横に、アイコンが表示されていることを確認する
    1. 地球アイコンの場合、パブリック設定なので作業終了
    1. 鍵アイコンの場合、プライベートなので作業継続
1. プロジェクト画面右上にある横三点リーダー（･･･）をクリックし、「Settings」をクリックする
1. 「Visibility」の設定を「Public」に変更する
1. プロジェクトボードがパブリックになっていることを確認する

# 手順(タスク管理)
1. タスクの実装状況が変わるたびに、各issueを適切なカラムへ移動させる

# 備考
- プロジェクトボードに登録するIssueの作成方法は、[こちら](https://qiita.com/likapantrip/items/70d5dc53b20d3a0c92be)を参照
【無料でできる！】MTGの議事録を生成AIを使って実装するやり方

この記事では、AI議事録ツールを作ってみる。
↓のブログで画像付きで解説しているので是非！
https://life-asst.com/?p=458
## 今回の構築方法の概要
今回の構築方法でできることは以下の通り。

1. 会議の録音データを用意する。
2. その録音データをGoogleDriveにアップする。
3. GoogleColaboratory上でOpenAIのWhisperを使って文字起こしをする。
4. 文字起こしされたテキストをGoogle AI StudioでGemini 2.5 proに渡して議事録化する。

今回の手法だと、無料で議事録作成をAIに任せることができる。

また、実際にこの方法で議事録を作成しているんだけど、1時間を超えるMTGも問題なく議事録化できるのでおすすめ。
## 実際の構築方法
### まずは録音データを用意する
会議やMTGを録音した音声データを用意する。

今回はダミーデータとして以下のサイトにあるアナウンス音声を使用する。
https://choimitena.com/Audio/Sample
### GoogleDrive上で環境を構築
Googleドライブで「マイドライブ>YouTube_test」の中にこんな感じでファイルを作っていく。
```
マイドライブ/
└── YouTube_test/
    ├── 録音データ/
    │   └── sampleTokyo.wav
    └── Untitled0.ipynb
```
- ipynbっていうのが、GoogleColaboratoryのファイルになっている。
- 録音データの中には録音した音声ファイルを入れる。
### Google Colaboratory上でPythonコードを書いていく
ファイルを開いたらPythonのコードを記述していく。

まず、1個目のコードブロックに以下を追加。
```
テキスト_string = "sampleTokyo.wav"
```
その次に、GoogleDriveとGoogleColaboratoryを繋げる
```
# google driveにアクセスして動画ファイルを取得
import os
from google.colab import drive
drive.mount('/content/drive')
```
GitHubで公開されているWhisperのソースコードを利用する
https://github.com/openai/whisper
```
!pip install git+https://github.com/openai/whisper.git
```
ここまでできたら、いよいよWhisperを実行する。実は3行のコードでWhisperを実行できる。
```
import whisper
# 以下の部分は、ご自身のファイル構造と一致するように変更する。
path_video = "/content/drive/MyDrive/YouTube_test/録音データ/"+テキスト_string

model = whisper.load_model("medium")
result = model.transcribe(path_video)
print(result["text"])
```
これだけでさらに、プロンプトを自動生成するためのPythonコードを追加していく
```
import os

# ① ヘッダー文を用意
header = """以下のメモをの要点をまとめてほしい
・会議の内容
・内容は全体をさらってほしい
・何が話されているかだけではなく、どのような結論になったかがわかるように記述してほしい
・わかりやすい文章を心がけてほしい
"""

# ② ヘッダーと文字起こし結果を連結
full_text = f"{header}\n{result['text']}"

# ③ ファイルに保存
def save_text_to_file(text: str, folder_path: str, file_name: str) -> str:
    os.makedirs(folder_path, exist_ok=True)
    file_path = os.path.join(folder_path, file_name)
    with open(file_path, "w", encoding="utf-8") as fp:
        fp.write(text)
    print(f"✅ Saved to: {file_path}")
    return file_path

# 実行用のコード
save_text_to_file(
    text=full_text,
    folder_path="/content/output",  # 好きなパスに変更
    file_name="sample.txt"          # 好きなファイル名に変更
)
```
これを実行してから、左側のフォルダマークを押すと、Outputというフォルダが出てきて、「プロンプト＋文字起こし」のテキストファイルが格納される。
```
以下のメモをの要点をまとめてほしい
・会議の内容
・内容は全体をさらってほしい
・何が話されているかだけではなく、どのような結論になったかがわかるように記述してほしい
・わかりやすい文章を心がけてほしい

朝野ともみです。今日の東京株式市場で日経平均株価は小幅俗進となっています。終り値は昨日に比べ22円72千高の11,088円58銭でした。当初一部の値上がり名柄数は1,146、対して値下がりは368、変わらずは104名柄となっています。ここでプレゼントのお知らせです。この番組では毎月発行のマンスリーレポート4月号を抽選で10名様にプレゼントいたします。お申し込みはお電話で東京030107-8373、030107-8373まで。以上番組からのお知らせでした。
```
### 完成したテキストデータをGemini 2.5 proに渡す＝完成！
さっきの行程で作成したテキストをGemini 2.5 proに渡して議事録化する。

なんでこのモデルを使うのかというと、読み取れる文章量が非常に多いから。

なんと、このモデルをGoogle AI Studioからなら無料で使える。
https://aistudio.google.com/
## まとめ
今回は無料で音声データから議事録を作成する方法を紹介した。
自分に合ったやり方を見つけるとAIで議事録を作るのは結構クセになるので、ぜひ試してみてほしい。
私の「得意」と「不得意」を振り返ってみた

## はじめに
いろんな現場でシステム運用保守11年目となりました。
仕事をしていると、得意なことや不得意なことに日々ぶつかります。
最近、心理検査（WAIS）を受ける機会があり、自分の特性を見つめ直すヒントになりました。

ここではその結果を踏まえて、私が得意なこと・苦手なこと、そしてそれに合わせた工夫や働き方についてまとめてみました。

**特性：目に見える情報に強く、感情的な会話は苦手**
規則的な情報（文字・記号・手順など）を「順番に」「可視化」して扱うのが得意です。

一方で、部分から全体を考えることや、感情のやりとりが多い会話は混乱しやすく、一呼吸置くことを意識しています。


ストレングスファインダー
**調和性　異なる意見でも一致している点を探ります。**
**達成欲  日々学習して達成しています**
**公平性　平等を大切にしています**


## 得意なこと:sunny:不得意なこと:umbrella:

### 1. タスクを一つずつ丁寧にこなす
朝は「本日対応するタスク」をリストにし、完了したらチェック。

マルチタスクは苦手ですが、一つずつ順番に処理することなら着実に進められます。

カレンダーへの登録も習慣化しており、依頼が重なっても作業漏れなく管理できています。

### 2. 手順化・パターン化が得意
手順書に沿った定型業務や、あらかじめ準備したコマンドを使う構築作業など、準備型の運用保守に強みがあります。

実際、一つの案件で3年以上システム運用保守を担当していますが、大きなミスはありません。
現行環境で20台サーバを構築しましたが、ミスが許されないデータ移行でミスをしたことはありません。
事前にコマンドテキストを作成してレビューをしていました。

### 3. 正確性と慎重さを大切に
速度よりも正確性を重視。
慌てて作業して失敗するよりも、1分立ち止まって確認する方が結果的にスムーズです。

### 4. 理解してから行動する
システム運用では、作業内容の理解と検証を大切にしています。
本番環境での作業前には必ず、30分前に手順の振り返り・頭の中でのシミュレーションをしています。

## まとめ
ざっくりした指示や臨機応変な対応は、私にとっては少し難しいことがあります。
一方で、事前準備をしっかり行い、手順に沿って丁寧に進めることで、高い精度と安定した成果を出すことができます。

**職場には「ざっくりでもすぐ動ける人」もいますし、私のように「準備と手順で確実に進める人」もいます。**
それぞれ強みは違いますが、補い合うことでチームとしての成果が高まるのだと感じています。

自分の特性を理解したうえで、それを活かす方法を探っていけば、仕事のストレスも減り、安心して長く働くことができると思います。
GithubでPushするアカウントをリポジトリごとに切り替える個人的なメモ

# はじめに
GithubでPushするアカウントをリポジトリごとに切り替えたいです。
例えば`~/github/repo1`というリポジトリで作業したときrepo1の中ではuser1でpushしますが、`~/github/repo2`というリポジトリではuser2でpushしたいということです。

# やり方
[【2021/7/6 追記】ディレクトリごとに GitHub アカウントを自動的に切り替える設定](https://zenn.dev/taichifukumoto/articles/how-to-use-multiple-github-accounts#%E3%80%902021%2F7%2F6-%E8%BF%BD%E8%A8%98%E3%80%91%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%94%E3%81%A8%E3%81%AB-github-%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%82%92%E8%87%AA%E5%8B%95%E7%9A%84%E3%81%AB%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%82%8B%E8%A8%AD%E5%AE%9A)の手順通りに進める。
`~/.gitconfig_sub`のファイルでは以下のようにする。
```.gitconfig_sub
[core]
        sshCommand = ssh -i ~/.ssh/user2
[user]
        name  = user2
        email = user2@users.noreply.github.com
```
`sshCommand`は使用する鍵を指定してます。

# 参考
[【2021/7/6 追記】ディレクトリごとに GitHub アカウントを自動的に切り替える設定](https://zenn.dev/taichifukumoto/articles/how-to-use-multiple-github-accounts#%E3%80%902021%2F7%2F6-%E8%BF%BD%E8%A8%98%E3%80%91%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%94%E3%81%A8%E3%81%AB-github-%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%82%92%E8%87%AA%E5%8B%95%E7%9A%84%E3%81%AB%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%82%8B%E8%A8%AD%E5%AE%9A)
[coresshcommand-設定を使う方法](https://qiita.com/ryounagaoka/items/b661f96f599e26a04589#coresshcommand-%E8%A8%AD%E5%AE%9A%E3%82%92%E4%BD%BF%E3%81%86%E6%96%B9%E6%B3%95)
【GitHub】Slackへの連携について

# 記事概要
GitHubをSlackに連携する方法について、まとめる
通知をSlackで受け取ることができるようになる

# 前提
- アプリケーションはGitHubに登録済みである

# 手順(GitHubを連携)
1. チャネルにて、下記を実行
    `/invite @GitHub`
1. GitHubから、連携成功した旨の連絡を受領する

# 手順(特定のリポジトリを連携)
1. チャネルにて、下記を実行
    `/github subscribe GitHubのユーザー名/リポジトリ名`
1. 「Connect Github account」をクリックする
1. ブラウザ画面にて、「Connect Github account」をクリックする
1. Slackとの連携について許可が求められるので、「Authorize Slack」をクリックする
1. 連携のための認証コードが表示されるので、コード右横のアイコンをクリックしてコードをコピーする
1. Slackアプリへ戻り、「Enter code」をクリックする
1. 認証コードの入力欄に、先ほどコピーしたコードを入力する
1. 送信ボタンをクリックする
1. Slackのチャンネルに届いたメッセージに含まれる「Install GitHub App」をクリックする
1. 連携させたいuserを選択する
1. 連携させたいリポジトリを選択する
1. Installをクリックする
1. GitHubのパスワードを入力する
1. チャネルにて下記を実行すると、連携済みのリポジトリが表示される
    `/github subscribe list`

# 通知内容を変更
## 通知内容
デフォルトでは、下記の機能には通知がチャンネルに届く
- issues(イシュー)
- pulls(プル)
- commits(コミット)
- releases(リリース)

デフォルトで通知されない機能は、下記
- reviews(レビュー)
- comments(コメント)
- branches(ブランチ)

## 通知を追加
チャネルにて、下記を実行する
`/github subscribe GitHubのユーザー名/リポジトリ名 追加したい機能`

## 通知を削除
チャネルにて、下記を実行する
`/github unsubscribe GitHubのユーザー名/リポジトリ名 非通知にしたい機能`
最も小さな圧縮ファイルを作れる圧縮形式はなにか？（ネタ）

## はじめに

世の中には様々な圧縮形式があります。小さな圧縮ファイルを作るために一番重要なことは何でしょうか？ 圧縮率の高い優れたアルゴリズムを使う？ いいえ、違います。**小さな圧縮ファイルを作るのにもっとも重要なことはデータサイズを 0 バイトにすること**です。

## 調査

ということで調べてみました。

```txt
$ gzip -cf </dev/null | od -Ad -tx1z
0000000 1f 8b 08 00 00 00 00 00 00 03 03 00 00 00 00 00  >................<
0000016 00 00 00 00                                      >....<
0000020
```

```txt
$ lz4 -cf </dev/null | od -Ad -tx1z
0000000 04 22 4d 18 64 40 a7 00 00 00 00 05 5d cc 02     >."M.d@......]..<
0000015
```

```txt
$ bzip2 -cf </dev/null | od -Ad -tx1z
0000000 42 5a 68 39 17 72 45 38 50 90 00 00 00 00        >BZh9.rE8P.....<
0000014
```

```txt
$ lzip -cf </dev/null | od -Ad -tx1z
0000000 4c 5a 49 50 01 0c 00 83 ff fb ff ff c0 00 00 00  >LZIP............<
0000016 00 00 00 00 00 00 00 00 00 00 00 00 24 00 00 00  >............$...<
0000032 00 00 00 00                                      >....<
0000036
```

```txt
$ xz -cf </dev/null | od -Ad -tx1z
0000000 fd 37 7a 58 5a 00 00 04 e6 d6 b4 46 00 00 00 00  >.7zXZ......F....<
0000016 1c df 44 21 1f b6 f3 7d 01 00 00 00 00 04 59 5a  >..D!...}......YZ<
0000032
```

```txt
$ compress -cf </dev/null | od -Ad -tx1z
0000000 1f 9d 90                                         >...<
0000003
```

## 結論

ということで、最も小さな圧縮ファイルを作れる圧縮形式は伝統の compress 形式（.Z形式）で、わずか 3 バイトでした。他にも圧縮形式はありますが、これが最小な気がします。

ちなみにここで出力されたバイナリをファイルに保存すれば、ちゃんと伸張できるはずです。次の例は空の gzip ファイルを作る例です。

```console:圧縮ファイルの作成と伸張
$ gzip -cf </dev/null > null.gz

$ ls -l
total 4
-rw-rw-r-- 1 koichi koichi 20 Jun 11 23:52 null.gz

$ gunzip null.gz

$ ls -l
total 0
-rw-rw-r-- 1 koichi koichi 0 Jun 11 23:52 null
```

圧縮ファイルがどのようなバイナリであるかもわかっているので、圧縮コマンドがない環境でも空の圧縮ファイルが作れます。

```console:圧縮ファイルの作成と伸張
$ printf '\37\213\10\0\0\0\0\0\0\3\3\0\0\0\0\0\0\0\0\0' > null.gz

$ ls -l
total 4
-rw-rw-r-- 1 koichi koichi 20 Jun 11 23:57 null.gz

$ gunzip null.gz

$ ls -l
total 0
-rw-rw-r-- 1 koichi koichi 0 Jun 11 23:57 null
```

なお、このテクニックがなんの役に立つのかは知りません。

---

**ネタ元**: Shell、ShellScriptで空のZIPファイルを作成する方法

https://qiita.com/Sakurai-Shinya/items/0e99f02387fc4d29c4f8

```console:22バイトの空のzipを作る方法
$ printf 'PK\5\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0' > empty.zip
```
【GitHub】Issueについて

# 記事概要
IssueというGitHubの機能について、まとめる

# 前提
- アプリケーションはGitHubに登録済みである

# Issueとは
アプリケーションの課題を、GitHubで管理するための機能のこと

## 目的
アプリケーションの課題の詳細やコードの変更履歴などの情報を1つにまとめることで、現状把握をしやすくすること

# 手順(作成)
1. GitHubのリモートリポジトリをクリックする
1. 「Issues」を選択する
1. 管理ページにある「New issue」というボタンをクリックする
1. タイトルを入力する
1. 本文はマークダウン形式で記述する
    ```
    # 課題概要
    [概要を記載]
    
    # ToDo
    - [ ] ブランチを作成する
    - [ ] XXを実装する
    - [ ] 単体テストコードを記述し、単体テストを実施する
    - [ ] 結合テストコードを記述し、結合テストを実施する
    - [ ] マージする
    - [ ] 本番環境へデプロイする
    ```
1. プロジェクトボードへの追加
    - プロジェクトボードに追加しない場合
        7.へスキップ
    - プロジェクトボードに追加する場合
        1. 「projects」横の歯車マークをクリックし、プロジェクトボード名を選択する
1. 「Submit new issue」をクリックする

# 手順(クローズ)
1. 「Close issue」をクリックし、issueをクローズする
トリミング抵抗



## 🔶 背景と目的

* 対象は：**トリミング回路による基準電流 $I_{\text{REF}}$** の調整
* 目標： $I_{\text{REF}} = 2\,\mu\text{A} \pm 12.5\%$ の範囲で調整可能とする

---

## 🔶 条件

* $\Delta V_{GS} = 80\,\text{mV}$：VGS変化の最大値
* $R_X = \frac{\Delta V_{GS}}{I_{\text{REF}}} = \frac{80 \times 10^{-3}}{2 \times 10^{-6}} = 40\,k\Omega$
  ただし、最小値 $= 0.75 R_X$（-25%）とするため：

$$
R_X = \frac{80\,\text{mV}}{0.75 \times 2\,\mu\text{A}} = 53.4\,k\Omega
$$

---

## 🔶 トリミング抵抗 Rtr の設計

回路的には、抵抗 $R_X = R_{\text{tr}} + R_1$ となっており、
固定抵抗 $R_1 = 13.5\,k\Omega$ のため：

$$
R_{\text{tr}} = R_X - R_1 = 53.4\,k\Omega - 13.5\,k\Omega = 39.9\,k\Omega
$$

---

## 🔶 トリミング抵抗の分解能（デジタル的設計）

トリミング幅 $n$ ビットで分割された抵抗の合成抵抗は、
**バイナリ加重合成**による合成抵抗として以下の式が使われます：

$$
R_{\text{tr}} = \left( \frac{2^n}{2^n - 1} \right) \cdot R_{\text{unit}}
$$

ここで以下のように近似（ページではより実用的に以下を使用）：

$$
R_{\text{tr}} = (2^{-1} + 2^{-2} + \cdots + 2^{-n}) \cdot R_{\text{unit}} = 1.688 \times 10^3 (2^{-1} + \cdots + 2^{-n})
$$

---

## 🔶 $n = 4$ の場合：

$$
R_{\text{tr}} = 1.688 \times (0.5 + 0.25 + 0.125 + 0.0625) \approx 25.32\,k\Omega
$$

→ 上限 $39.9k\Omega$ に届かない

---

## 🔶 $n = 5$ の場合：

$$
R_{\text{tr}} = 1.688 \times (0.5 + 0.25 + 0.125 + 0.0625 + 0.03125) \approx 52.33\,k\Omega
$$

→ 上限 $39.9k\Omega$ をカバーできる

---

## ✅ 結論

* **トリミング幅 $n = 5$** が必要（＝5ビット分解能）
* トリミングにより、電流 $I_{\text{REF}} = 2\,\mu\text{A} \pm 12.5\%$ を達成可能

---

## 📝 用語補足

| 用語               | 意味                |
| ---------------- | ----------------- |
| トリミング            | 製造後に微調整すること（精度向上） |
| $R_{\text{tr}}$  | 可変（調整）抵抗          |
| $I_{\text{REF}}$ | 基準電流（リファレンス）      |
| $n$              | トリミングビット幅（分解能）    |

---
Typescript と OpenAPI はなぜ相性がいいのか

# はじめに
先週の5月23日（金）〜5月24日（土）にかけてTSKaigi 2025が、ベルサール神田で行われました。
その中のセッション内の多くで OpenAPI と Typescript が同時に触れられており、その理由が同時に語られている理由がしっかり理解できていないままセッションを聞いてしまっていました。

そもそも Rails 畑の僕はいい感じに Rails がやってくれていたので、ぼんやりは型について考えてはいるけど、そこまで厳密に意識せずに開発してしまっている現状があります。
このままでフルスタック Typescript や Golang などで本格的に静的型付け言語で開発をやろうとすると、恥ずかしい思いをしそうな気がするので、そうならないように知識を整理するがてら、この記事を書こうと思いました。

# OpenAPI とはなんなのか
まずその辺りから整理するのですが、この記事が非常にわかりやすくまとめてくれていたので、詳しくはこちらを参照してください。

https://zenn.dev/peraichi_blog/articles/01ges56ak79g2rket9wm27w9pc

つまり、OpenAPI っていうのは**API の仕様書を機械でも人間でも読めるように書くためのフォーマット**なんやな〜という認識になりました。
データ型 (string, number など) も一緒に書けるところがポイントですね。ここが TypeScript への橋渡しになります。

# Typescript とはなんなのか
JavaScript に「型」の仕組みを足した言語です。

コードを書いている段階で「ここは数値なのに文字列を入れてるよ！」と教えてくれるので、実行前にバグを潰せる のが最大のメリットです。

次に実際なぜ一緒に語られるのかというトピックに突入します。

## なぜ相性がいいのか
共通言語としての「型」という面です。
ここでようやく Typescript の最大のメリットである*型安全性*という言葉が出てきます。

1. OpenAPI に「型」を書く
1. その型情報を TypeScript がそのまま使う
1. フロントエンドのコードに「静的チェック」が入る

つまり 「API の約束」=「コードの型」 となり、ドキュメントと実装が自動で一致するわけです。

OpenAPIはAPIの**契約書**として、エンドポイント、リクエストのパラメータ、レスポンスの形式、そしてそれらのデータ型（例: `string`, `number`, `boolean`やカスタムオブジェクト）を定義します。

## 具体例
OpenAPI に定義されているものを TypeScript の型に変換してくれる openapi-typescript というライブラリを用いて以下のYAMLのような定義をしたとしましょう。

```yaml
components:
  schemas:
    User:
      type: object
      properties:
        id:
          type: integer
          format: int64
        name:
          type: string
        email:
          type: string
          format: email
        createdAt:
          type: string
          format: date-time
      required:
        - id
        - name
        - email
```
これが、
```typescript
export interface components {
  schemas: {
    User: {
      id: number;           
      name: string;         
      email: string;        
      createdAt?: string; // required に含まれていないため ? が付く
    }
  }
}
```
のようになります。
この User 型を使うと、
```ts
import { User } from './types'; // 型定義ファイルへのパス

// APIから取得したデータを安全に扱える
async function fetchUsers(): Promise<User[]> {
  const res = await fetch('/api/users');
  if (!res.ok) throw new Error('Network error');
  // コンパイル時に型チェックが入る
  const data: User[] = await res.json();
  return data;
}
```

こういう形で、型が保証された状態でデータを扱うことができます。

# まとめ
- OpenAPI は API の約束ごと（型含む）を 1 か所にまとめる仕組み
- TypeScript は その型を **実装側でチェックできる** 仕組み
- 2つを組み合わせると、書いた仕様書がそのままコンパイルエラーで保証される ので、とても相性が良い

以上がお互いの相性がいい理由です。ぜひ、小さいプロジェクトから両者を活用したTS開発に入門してみましょう！
VRMAファイルをコマンド1行で作成しよう！

## はじめに
VRMアバターに豊富なアニメーションをつけたいけど、VRMAファイルが少ない...
このような悩みを抱えている方も多いのではないでしょうか？

**[Mixamo](https://www.mixamo.com/#/?page=1&type=Motion%2CMotionPack)**には数千種類の高品質なアニメーションがありますが、FBX形式でしかダウンロードできません。一方、VRMアバターで使うには**VRMA形式**が必要です。

この記事では、私が主にClaude Codeを用いて開発した**FBXアニメーションをVRMA形式に簡単に変換するツール**の使用方法をご紹介します。

↓ Miximoからダウンロードしたアニメーションを再生する様子 ↓

![Day028_Qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4110467/250c10c8-df78-4fa6-a4f7-692173ef9a96.png)

## ⚠️ 注意事項
ここで作成されるVRMAファイルは、**VRoid Studioで再生できない**ことを確認しております。
[Three.js VRM](https://github.com/pixiv/three-vrm)を用いた再生を前提としており、Vroid Studioなど一部のソフトウェアでは対応していない可能性があります。ご注意ください。
Three.js VRMを用いたサンプルコードは[こちらのリポジトリ](https://github.com/tk256ailab/vrm-viewer)に用意しています。
※本記事やツールの使用により発生した不具合・損害について、筆者は責任を負いかねます。ご利用は自己責任でお願いいたします。

## fbx2vrma-converterのセットアップ
### 1. ツールのインストール
以下を実行してfbx2vrma-converterをダウンロードしてください：
```bash
git clone https://github.com/tk256ailab/fbx2vrma-converter
cd fbx-to-vrma-converter
npm install
```

### 2. FBX2glTFバイナリの配置
Meta社が開発したFBX2glTFを使用します：
```bash
# macOS用バイナリをダウンロード
curl -L -o FBX2glTF-darwin-x64 \
  https://github.com/facebookincubator/FBX2glTF/releases/download/v0.9.7/FBX2glTF-darwin-x64

# 実行権限を付与
chmod +x FBX2glTF-darwin-x64
```
環境に合わせて[FBX2glTF](https://github.com/facebookincubator/FBX2glTF)をダウンロードしてください。

## 使用方法
以下のコマンドを実行するだけでVRMA形式への変換が完了します！
```bash
# 単一ファイルの変換
node fbx2vrma-converter.js -i path-to-your-fbx-file.fbx -o path-to-your-vrma-file.vrma

# フレームレート指定(デフォルトは30)
node fbx2vrma-converter.js -i path-to-your-fbx-file.fbx -o path-to-your-vrma-file.vrma --framerate 60

# 複数ファイルの一括変換
for file in animations/*.fbx; do
  filename=$(basename "$file" .fbx)
  node fbx2vrma-converter.js -i "$file" -o "output/${filename}.vrma"
done
```

## 正常に実行されない時の対処法
最も簡単な方法は、**[Claude Code](https://docs.anthropic.com/ja/docs/claude-code/overview)に変換処理を依頼する**ことだと思います。
Claude Codeにお願いすれば、手作業でやらずとも自然言語の指示でまとめて複数のFBXファイルを変換してくれます。

Claudeの有料プランを利用していない方は、以下の点をご確認ください。

### 1. ディレクトリ構成
以下のような構成になっていることを確認してください。
```bash
fbx2vrma-converter
├── FBX2glTF-darwin-x64
├── fbx2vrma-converter.js
├── LICENSE
├── package.json
├── README-jp.md
├── README.md
├── setup.bat
└── setup.sh
```

### 2. FBX2glTFが正しくダウンロードできているか
おそらくこれが原因でエラーが起こる場合が多いと思います。
ご使用のOSやFBX2glTFのバージョンを確認してください。

### 3. 実行権限の付与(MacOSの場合)
以下のコマンドで実行権限を付与してください。
```bash
chmod +x FBX2glTF-darwin-x64
```

## 🔗 関連リンク

- [FBX to VRMA Converter GitHub](https://github.com/yourusername/fbx-to-vrma-converter)
- [VRM Specification](https://vrm.dev/)
- [Three.js VRM](https://github.com/pixiv/three-vrm)
- [Mixamo](https://www.mixamo.com/)
- [FBX2glTF](https://github.com/facebookincubator/FBX2glTF)
【React】aタグをクリックした際に画面遷移しないようにする方法


## `event.preventDefault()` を使用する

`onClick`ハンドラに渡されるイベントオブジェクトで `preventDefault()` を呼び出すと画面遷移しないようにできます。

```jsx
function NoNavLink() {
  const handleClick = (event) => {
    // 画面遷移を無効化
    event.preventDefault()
    console.log('画面遷移をキャンセル')
    // 任意の処理
  }

  return (
    <a href="https://example.com" onClick={handleClick}>
      画面遷移をしないリンク
    </a>
  )
}

export default NoNavLink
```

## `javascript:void(0)` を使用する

`href`属性に `javascript:void(0)` を指定すると、ブラウザが「何も起こさないURL」として扱うため、画面遷移を発生させません。

```jsx
function VoidLink() {
  const handleClick = () => {
    console.log('javascript:void(0)で遷移しない')
    // 任意の処理
  }

  return (
    <a href="javascript:void(0)" onClick={handleClick}>
      遷移しないリンク (void)
    </a>
  )
}

export default VoidLink
```
UnityのBuildProfileの設定をスクリプトから変更する方法

## 初めに

BuildProfileの設定をエディタスクリプトから変更する方法がわかりづらかったので共有です。

## 実装手順

### BuildProfileアセットの読み込みとPlayerSettings取得

BuildProfileアセットを読み込み、リフレクションでPlayerSettingsを取得します。PlayerSettingsはinternalフィールドのため、リフレクションが必要です。

```csharp
var profile = AssetDatabase.LoadAssetAtPath<BuildProfile>("path");
var playerSettingsField = profile.GetType().GetField("playerSettings", BindingFlags.NonPublic | BindingFlags.Instance);
var playerSettings = (UnityEngine.Object)playerSettingsField.GetValue(profile);
var serializedSettings = new SerializedObject(playerSettings);
```

### 設定値の変更

SerializedPropertyを使って、目的のプロパティを変更します。今回の場合はproductNameを変更しています。
プロパティ名はBuild Profileの設定ファイルのInspectorのCopy Property Pathから確認できます

```csharp
var productNameProperty = serializedSettings.FindProperty("productName");
if (productNameProperty != null)
{
    productNameProperty.stringValue = newProductName;
}
```

### 変更の適用と保存

変更をSerializedObjectに適用し、内部メソッドを呼び出してアセットを保存します。`ApplyModifiedProperties()` だけでは設定が保存されないため、`BuildProfileModuleUtil.SerializePlayerSettings()` の呼び出しが必要です。
https://github.com/Unity-Technologies/UnityCsReference/blob/4b463aa72c78ec7490b7f03176bd012399881768/Editor/Mono/BuildProfile/BuildProfileModuleUtil.cs#L448-L451

```csharp
// メモリ上で変更を適用
serializedSettings.ApplyModifiedProperties();

// BuildProfileModuleUtil.SerializePlayerSettings()を呼び出し
var coreModuleAssembly = Assembly.Load("UnityEditor.CoreModule");
var buildProfileModuleUtilType = coreModuleAssembly.GetType("UnityEditor.Build.Profile.BuildProfileModuleUtil");
var serializePlayerSettingsMethod = buildProfileModuleUtilType.GetMethod(
    "SerializePlayerSettings",
    BindingFlags.Public | BindingFlags.Static
);
serializePlayerSettingsMethod.Invoke(null, new object[] { profile });

// アセットを保存
EditorUtility.SetDirty(profile);
AssetDatabase.SaveAssets();
``` 

## 最後に

BuildProfileは使いながら学んでいるので、もっといい方法があれば知りたいです。
AIでも探してくれなかったので、AIの糧になればなと思います。
AWS copilot を用いたECSのデプロイでハマったこと4選

# 目次
1. 前提条件
1. [ハマりポイント1] デプロイ後にドメインの紐付けができない
1. [ハマりポイント2] 環境ごとにインフラの構成を変えることが難しい
1. [ハマりポイント3] アプリケーションからRDSにコネクションが確立できない
1. [ハマりポイント4] デプロイに失敗するとロールバックの時間が長い
1. まとめ

# 前提
- バックエンドとフロントエンドは別のALB配下に配置する(別のドメインでデプロイ)
    - そのため、環境ごとにRDSの作成の有無を分岐する必要があった


# [ハマりポイント1] デプロイ後にドメインの紐付けができない
とりあえず、httpでデプロイして後でドメインの取得や証明書の配置をしよう、と思うのがエンジニアの性だと思いますが、残念ながらそれはできません(仕様的に)。
既存の証明書の紐付けなどは、環境の初期化時に以下のように行わなければなりません。
```
copilot env init --import-cert-arns <証明書のarn>
```

すでに環境を作っている方は、諦めて環境を削除して環境の再構築が必要です。
直感的には、これくらいは環境構築後でもできても良いかなとは思っています


# [ハマりポイント2] 環境ごとにインフラの構成を変えることが難しい
はじめに述べておきますと、あくまで**インフラの構成**を変えるのが難しいだけで、インスタンスのスペックなどは環境ごとに簡単に変えることができます。

インスタンスのスペックを変える場合(copilot/addons/db.yml)
```yaml
Mappings:
  dbEnvScalingConfigurationMap:
    # 環境別のAurora Serverless v2 clusterのスケーリング設定
    All:
      "DBMinCapacity": 0.5
      "DBMaxCapacity": 8
...[省略]

ServerlessV2ScalingConfiguration:
        MinCapacity:
          !FindInMap [dbEnvScalingConfigurationMap, !Ref Env, DBMinCapacity]
        MaxCapacity:
          !FindInMap [dbEnvScalingConfigurationMap, !Ref Env, DBMaxCapacity]
```


今回は、バックエンド用の環境にはRDSのインスタンスを作るが、フロントエンド用の環境には作らないという使い分けをしたいので、環境ごとにインフラの構成を変える必要がありました。
直感的には、copilot/environments/<環境名>/addons/hogehoge.yml というファイルを作って、環境ごとにaddonを定義するというのができてほしいところ。しかし、この機能は実装されてなさそう。
各LLMに聞いてみると、「実装済みです！」と元気な回答が返ってきますが、こちら、試してもうまく行きません。
実は、同じようなことを議論しているissueが上がっています
https://github.com/aws/copilot-cli/issues/3112
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4080005/432eb344-08b6-4702-b335-8752dc68a247.png)

「環境レベル」のaddonsなら実装されていますが、特定の環境固有のaddonsを定義するのはできなさそうです。

実現するにはどうしたらいいだろうか...

結論、issueの中でも議論されていますが、CloudFormationテンプレートのConditionsを用いて、分岐させるのが良さそうです。
私は、「環境名が"-be"で終わっている場合」のみRDSクラスターを作るという条件をConditionsに記述することで実現しました。


# [ハマりポイント3] アプリケーションからRDSにコネクションが確立できない
`copilot svc deploy` が成功して、アプリケーションからマイグレーションをしようとコマンドを実行したところ、コネクションが確立できずタイムアウト。
よくよくコンソールを探検してみると、RDSのセキュリティグループのインバウンドルールがECSタスクによるアクセスを許可するようになっていませんでした。
便利ツールというからには、これくらい自動でやってほしいところ。
結論としてはデプロイ後に手動でインバウンドルールを作成するのが良いと思います。

**参考程度のメモ**
addonsのdbのテンプレートにcopilotのサービスのセキュリティグループからのアクセスを許可するように、記載すればいい！と考えますが、この方法では、2回目以降なら問題ないのですが、初回のデプロイがうまく行きません。
なぜなら、copilotのデプロイは、env deploy(環境のデプロイ) → svc deploy(サービスのデプロイ)の手順で行いますが、RDS等のaddonsはenv deploy 時に作成されるものであり、その時にはまだサービスのセキュリティグループは作られておらず参照することができないからです。


# [ハマりポイント4] デプロイに失敗するとロールバックの時間が長い
これは、ハマりポイントというより愚痴です（笑）。
リリースが迫る中、試行錯誤をしているという時に、エラーメッセージと共に15分待たされた苦い思い出があります。デフォルトでロールバックしてくれるのは非常に便利ですが、時間が長すぎるので余裕を持ってデプロイのスケジュールは取っておきましょう。


# まとめ
結論、AWS copilot はとりあえず動かしたい時には便利ですが、カスタマイズをしようとするとなかなか難しいです。
正確には、「カスタマイズができないことはないが、実現しようとしても正解に辿り着くのには時間がかかる」という感じです。
実際には「プロトタイプをcopilotで作成→安定運用の必要性が出てきたらCDKなどに移行」という形がいいのではないでしょうか。

# 補足
色々、AWS copilot について書きましたが、AWS についてあまり詳しくないという方にはAWSでのインフラ構築の勉強法としてcopilot を使ってみるというのはおすすめです。
copilotの出力はCloudFormationのテンプレートだったりするので、CloudFormationについての理解が深まりますし、copilotはAWSでのベストプラクティスで構築してくれるので、それらについても学習することができます。
開発用メールサーバ MailDev を Amazon Linux 2 に導入する手順

Amazon Linux 2 上で [MailDev](https://github.com/maildev/maildev) を使いたいけれど、Node.js のバージョン周りや永続化などで少し工夫が必要だったので、セットアップ手順をまとめました。

> ⚠️ **注意**  
> glibc などの依存関係の問題で、Node.js v18 以降は Amazon Linux 2 にインストールできません。  
> 本記事では Node.js v17 を使用します。

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

まずは Node.js のバージョン管理ツール `nvm` を導入します。

```
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
. ~/.nvm/nvm.sh
```

## 2. Node.js v17 のインストールと使用

```
nvm install 17
nvm use 17
nvm current # バージョンが 17 になっているかを確認
```

## 3. 必要なパッケージをグローバルインストール

MailDev 本体と永続化のために `forever` をインストールします。

```
npm install -g maildev
npm install -g forever
```

## 4. MailDev を永続化して起動する

`forever` を使って MailDev をバックグラウンドで起動します。

```
forever start "$(which maildev)"
```

> ⚠️ **注意**  
> `forever maildev` のようにコマンド名だけを渡すと、カレントディレクトリを見に行ってしまい起動できません。

```
$ forever maildev
warn:    --minUptime not set. Defaulting to: 1000ms
warn:    --spinSleepTime not set. Your script will exit if it does not stay up for at least 1000ms
(node:26299) Warning: Accessing non-existent property 'padLevels' of module exports inside circular dependency
error:   Cannot start forever
error:   script /home/kuroneko/maildev does not exist.
```

## 5. プロセスが起動しているか確認

MailDev と `forever` の監視プロセスが表示されていれば OK です。

```
ps aux | grep maildev
```

## 6. ポートが LISTEN 状態になっているか確認

MailDev は HTTP インターフェースをポート 1080、SMTP をポート 1025 で提供します。

```
netstat -ant | grep LISTEN | grep -e 1080 -e 1025
```

```
tcp6       0      0 :::1080                 :::*                    LISTEN     
tcp6       0      0 :::1025                 :::*                    LISTEN   
```

## 7. Web UI にアクセス

ブラウザで以下にアクセスし、MailDev の UI が開ければセットアップ完了です：

📬 http://doma.in:1080/

## 8. 再起動時の自動起動設定（cron）

サーバ再起動時にも MailDev を自動起動するために、`crontab` を使って登録します。

```
crontab -e
```

以下を追記します（パスは環境に合わせて調整）：

```
SHELL=/bin/bash
BASH_ENV=~/.bashrc
@reboot /root/.nvm/versions/node/v17.9.1/bin/forever start /root/.nvm/versions/node/v17.9.1/bin/maildev
```

反映されたか確認：

```
crontab -l
```

## まとめ

Amazon Linux 2 では Node.js のバージョン制約に注意しつつ、MailDev を起動できます。起動時は `forever` を活用し、明示的にバイナリパスを指定するのがポイントです。ぜひローカル開発やテスト用途で使ってみてください！
【イベントレポート】Interop25に参加し、通信に思いを馳せた夜

# はじめに
Interop1日目に参加してきました。簡単ではありますが、そのレポートを残しておきたいと思います。

:::note
今回お話を聞いた具体的な企業様のお話については省略しております。その点ご了承ください。
:::

# Interop とは？
公式ページには以下のような説明がされていました。

>What is “Interop”?
Interop Tokyoはインターネットテクノロジーのイベントです。
1994年の日本初開催以来、毎年国内外から約500の企業・団体が参加し、技術動向とビジネス活用のトレンドを、会場でのデモンストレーションやセミナーを通じてお伝えしてきました。国内のインターネットや技術革新の歴史と共に歩んできたこのInterop Tokyoをご覧いただくことで、インターネット分野のトレンドをいち早く体感いただくことができます。

https://www.interop.jp/

一言でいうと「**日本最大級のネットワーク・IT技術展示会**」と言えると思います。

ちなみに今年は「**社会に浸透するAIとインターネット**」がテーマだそうです。


# 行くことになったきっかけ
AWS Summitにいくことを上司に伝えた際に、「都合がつけば、ぜひInteropも行ってみてください！」と言っていただいたのがきっかけです。

私はインフラエンジニアで、「**保守運用×AI**」に興味関心があったので参加することにしました。そういったサービスの話を聞いて、自分たちでもできることはないかという情報を集めることが目的です。（サービスの説明というより、仕組みの部分のお話をいろいろ聞こうと思っていました）


# 当日について
幕張メッセの最寄駅である、海浜幕張駅についた時点で多くの人でごった返していました。

![IMG_2269.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921802/def0643b-ce66-4d71-9a35-14184612217b.jpeg)

開場とほぼ同時に入場して、「ブースをいくつか回り、休憩スペースで聞いたことを後述のように整理して共有する」というのを2セット程度して、合間合間に基調講演を聞くといった過ごし方をしました。（あっという間に1日が過ぎました...）

### 部門への情報共有について
今回、**業務として行かせていただいた**のでちゃんと得た情報を共有しようと意識していきました。そのために、部内のTeamsに**メモ用のスレッドを作り**そこに情報を書き込んでいきました。自由記述すぎると情報の粒度がバラバラになってしまったり、残しておきたいことが不明瞭になってしまったりしてしまうと思い、以下のような**テンプレを作って共有**していきました。

```md:templete
- 企業名
- 話を聞いた理由
- やっていること
- 感想
- その他メモ
```

### ShowNet について
開場に行って一番インパクトのあった展示です。

公式ページには以下のような説明がありました。

>Interop Tokyoでは、会場内にネットワークを構築する「ShowNet」というプロジェクトを実施しています。
会場内に構築されるこのネットワークは、出展社から提供された約2000の製品・サービスと、約700名ものトップエンジニア達が幕張メッセに集結して構築されます。
幕張メッセの会場全体をインターネットに接続している実稼働ネットワークでありながら、各種の相互接続実証やチャレンジを実施するという巨大プロジェクトです。

https://www.interop.jp/2025/shownet/

一言でいうと、「**会場全体を使った巨大なネットワーク実験場**」といったところでしょうか。実際に動いている実機の様子などを見ることができ、かなり見ごたえがありました。

# 反省点
ブースを回っている際、いろいろな企業の方に声をかけていただきましたが、**自分が話を聞きたいと思ったところに絞って**回りました。しかし、そこで聞いた話が聞きたかった話ではない場合もあり、とりあえず**いろいろなお話を聞くスタイルでもよかった**かなと思っています。


# おわりに
いろいろ通信のお話を聞いたり、実際に機器にたくさんの線がつながれているような様子を見たりすると、こういうもののおかげで通信できているんだろうなあと思ったり、通信の仕組み全然わかってないのにつかえているのすごいなあと感じました。（同時に、あんまりわかってないのやばいか？とも思いました...）

時間があるときに、例えばBedrockからLLMを利用するときの通信について整理すると面白いかもしれないなと思いました。

**通信について考えなすきっかけ**になってよかったです。**通信屋ではなくても一度は行ってみてもよい**と思います。
ありがとうございました。
Rustの基礎(1) - 文字列出力・プレースホルダー・変数・定数

本記事は、Rustの学習メモとして書いたものです。  
初心者の方や、「あれどう書くんだっけ？」というときの**チェック用リファレンス**としてもご活用ください。

---

## 文字列の出力

```rust
print!("Hello, world");      // 改行なし
println!("Hello, world ln"); // 改行あり
```
- print! は文字列をそのまま表示
- println! は表示後に改行を追加
- ! はマクロであることを示しています

## プレースホルダー（{}）
```rust
println!("Hello, {}!", "Rust");
```
- "{}" に値を差し込むことができます（プレースホルダー）
- 変数を使うことも可能です。

```rust
let name = "Rust";
println!("Hello, {}!", name);
```

## 変数の宣言
```rust
let x: i32 = 42;
```
- let を使って変数を宣言します
- 型は明示できますが、Rustには型推論があるため省略も可能です

```rust
let y = 3.14; // f64として推論される
```

## ミュータブル（可変）変数
```rust
let mut count = 1;
count = 2; // OK
```
- Rustの変数はデフォルトで不変（immutable）
- mut をつけることで再代入が可能になります

## シャドーイング（再束縛）
```rust
let z = 5;
let z = z + 1;
```
- 同じ変数名で**再宣言（上書き）**することができます
- 型の変更も可能

## 定数（const）
```rust
const MAX_SCORE: u32 = 100;
```
- 定数は const を使って宣言します
- 型の指定が必須
- 慣例としてすべて大文字＋アンダースコアで記述します
- const はグローバルスコープでも使用可能

## まとめ
今回はRustの基本である以下の構文について学びました

- 文字列の出力（print / println）
- プレースホルダー（{}）
- 変数の宣言と型推論
- ミュータブル変数
- シャドーイング
- 定数の定義

次回は、データ型（数値型・論理型など）についてまとめる予定です。

お気づきの点があれば、ぜひコメントで教えてください！
MOSトランジスタの基本特性とキャリア移動度



## 📘 概要

MOSトランジスタの**キャリア移動度**、**I-V特性**、**動作領域**、および**微分パラメータ**（gm, gd, ro）を中心に、**線形領域・飽和領域**の電流式も交えて整理します。

---

## 🔧 キャリア移動度の定義式

```math
\mu = \frac{L}{W} \cdot \frac{I_D}{C_{\text{ox}} (V_{\text{GS}} - V_T) V_{\text{DS}}}
```

* **μ**：キャリア移動度（Mobility）
* **L/W**：チャネル長 / チャネル幅
* **Cox**：ゲート酸化膜容量（Oxide Capacitance）
* **VGS − VT**：ゲート-ソース電圧からしきい値電圧を引いた値
* **VDS**：ドレイン-ソース電圧

> この式は、**線形領域**（VDSが小さい）で測定された電流から**μ**を逆算するために用います。

---

## 📉 MOSトランジスタの I-V 特性と動作領域

### 🔷 リニア領域（Linear region）

```math
I_D = \mu \frac{W}{L} C_{\text{ox}} \left[ (V_{\text{GS}} - V_T) V_{\text{DS}} - \frac{1}{2} V_{\text{DS}}^2 \right]
```

* 適用条件：
  $V_{DS} < V_{GS} - V_T$

### 🔷 飽和領域（Saturation region）

```math
I_D = \frac{1}{2} \mu \frac{W}{L} C_{\text{ox}} (V_{\text{GS}} - V_T)^2
```

* 適用条件：
  $V_{DS} \geq V_{GS} - V_T$

> これら2つの式は、\*\*アナログ回路設計（CMOSアンプ）\*\*において基本中の基本です。

---

## 📐 微分パラメータ（Small-signal Parameters）

### 📏 トランスコンダクタンス $g_m$

```math
g_m = \frac{\partial I_D}{\partial V_{GS}} = \mu \frac{W}{L} C_{\text{ox}} (V_{\text{GS}} - V_T)
```

* ゲート電圧の微小変化に対するドレイン電流の変化率
* 増幅器の\*\*利得（Gain）\*\*を決める重要な値

### 📏 ドレインコンダクタンス $g_d$

```math
g_d = \frac{\partial I_D}{\partial V_{DS}} = \lambda I_D
```

* 飽和領域での電流変化感度
* λ：**チャネル長変調（Channel length modulation）係数**

### 📏 出力抵抗 $r_o$

```math
r_o = \frac{1}{g_d}
```

* λ ≈ 0 の場合、理想的には rₒ → ∞
* **高い出力抵抗 = 高い電圧利得**

---

## 🧠 用語と英語対訳一覧

| 日本語                   | 英語訳               | 説明                |
| --------------------- | ----------------- | ----------------- |
| ドレイン電流 $I_D$          | Drain current     | 出力側の電流            |
| トランスコンダクタンス $g_m$     | Transconductance  | ゲート電圧による電流変化の利得   |
| ドレインコンダクタンス $g_d$     | Drain conductance | ドレイン電圧による電流変化の感度  |
| 出力抵抗 $r_o$            | Output resistance | 出力の変化しにくさ         |
| 酸化膜容量 $C_{\text{ox}}$ | Oxide capacitance | ゲート酸化膜の単位面積あたりの容量 |

---
手作業のトンネリングはもう終わり：ローカル開発環境を公開する決定版ガイド

![截屏2025-06-11 21.35.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4107514/0a6445db-f453-4a56-b3f0-ad681272eb6c.png)
開発者の皆さん、よくあるシーンについて話しましょう。

金曜日の午後4時。あなたは重要な機能の実装を終え、すぐにクライアントにデモを見せる必要があります。あるいは、最終的な連携テストのためにStripeやGitHubからのWebhookを受信する必要があるとします。あなたのコードはローカルホストで完璧に動作していますが、今、localhost:3000を指す公開URLが必要です。

すると、私たち全員が暗記している「儀式」が始まります。

ターミナルを開き、ngrok http 3000と打ち込み、エンターキーを押す。出力の中から.ngrok-free.appで終わるURLを見つけ、慎重にコピーし、管理画面に貼り付ける。そして気づくのです...ポート番号が間違っていたことに。8080であるべきだったと。Ctrl+Cでプロセスを強制終了し、上矢印キーでコマンドを呼び出し、ポートを修正し、エンター、再度コピー、再度貼り付け...

もし2つのプロジェクトで同時にトンネルが必要になったら？ターミナルウィンドウがもう一つ増えます。それらを管理するのは、まるで混沌とした手作業の工房のようです。

誤解しないでください。ngrokは素晴らしいツールです。frpのようなアプリと共に、これまで何度も危機的な状況で私たちを救ってくれました。それらは私たちの商売道具であるスイスアーミーナイフのように、パワフルで信頼性があります。しかし、問題はワークフローにあります。それは分断されています。公開URLが必要になるたびに、私たちは洗練されたIDEから離れ、無味乾燥なコマンドラインに飛び込み、この「手作業」をこなさなければなりません。

私たちは開発者であり、創造者です。トンネルの配管工ではありません。私たちはもっとエレガントで、統合されたツールを使うべきです。

私はこの「コマンドライン体操」が当たり前のことだと思っていました。先週、私が日常的に使っているmacOSのローカル開発環境、Servbayがバージョン1.13.0のアップデートをリリースするまでは 。

いくつかの定期的な修正を期待していましたが、リリースノートのあるセクションが私の目を引きました：強力なサードパーティ製リバースプロキシの統合 。

それは単にngrokをバンドルしただけではありませんでした。いいえ、それ以上に踏み込んでいました。それは**ngrok、frp、cloudflare tunnel、そしてpinggy.io**という4つの主要なトンネリングツールを統合し、それらすべてを単一のグラフィカルインターフェースで統一していたのです 。

![截屏2025-06-11 21.19.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4107514/e383b9d2-7316-440d-8176-6eb81637111c.png)


私の現在のワークフローはこうなりました：

Servbayのインターフェースで「Tunnel」オプションをクリックします。
公開したいサイトをローカルサイトのリストから選択します。
ngrokまたはfrpの隣にあるトグルスイッチをクリックします。
安定的で即座に利用可能な公開URLが、「コピー」ボタンと共に画面に表示されます。
全プロセスは2クリック以内、3秒もかかりません。コマンドラインも、タイプミスも、ポートの混同もありません。すべてが非常に論理的で、この機能は最初からそこにあるべきだったと感じさせます。

これこそが一流ツールの魔法です。それはあなたの目標を変えるのではなく、あなたが目標を達成する方法を革命的に変えるのです。Servbayのアップデートは、かつて断片的で手作業だったトンネリングのタスクを、統一されたローカル開発プロセスにシームレスに統合します。PHPのバージョン管理、データベースの切り替え、SSLの設定、そして今や公開URLの公開まで、すべてが一つにまとまったエレガントなプラットフォーム内で行われます 。

![截屏2025-06-11 21.35.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4107514/4c53f883-e32f-4d5a-889a-a60683828609.png)


これは単なる効率の向上以上のものであり、開発体験における飛躍的な進歩です。それは私たちの貴重な精神的エネルギーを退屈な「配管作業」から解放し、本当に重要なこと、つまりコードと創造に集中させてくれます。

もしあなたがコマンドラインでの「トンネリング・タンゴ」にうんざりしているMac開発者なら、新しいServbayを試してみることを強くお勧めします。公式サイトから直接、最新バージョンをダウンロードできます 。これは「もっと早くこうなっていれば」とあなたを感嘆させる、生活の質を向上させる年間クラスのアップデートです。
AWS Shield

AWS Shieldは、AWSリソースに対するDDoS攻撃への防御を提供するサービスである。AWS Shieldには、AWS Shield StandardとAWS Shield Advancedのオプションがあり、後者を使用することでより大規模で高度なDDoS攻撃に対する防御を提供でき、さらに準リアルタイムでの緩和を行うことができる。
【Rails】Basic認証の導入

# 記事概要
Ruby on RailsにBasic認証を導入する方法について、まとめる

# 前提
- Ruby on Railsでアプリケーションを作成している

# 使用するメソッド
https://qiita.com/likapantrip/items/6ff3ef0bd562e6fb961a#authenticate_or_request_with_http_basicメソッド

# コードに直接ユーザー情報を記述
コードを読めるとログインできるため、セキュリティ対策できていない

## 手順
1. `application_controller.rb`を編集する
    ```application_controller.rb
    class ApplicationController < ActionController::Base
    	before_action :basic_auth
    	
    	private
    	
    	def basic_auth
    	  authenticate_or_request_with_http_basic do |username, password|
    	    # ユーザー名'admin'のパスワード'1111'のみ利用できる
    	    username == 'admin' && password == '1111'
    	  end
    	end
    end
    ```

# シェルを使用して、zshに環境変数を定義
## 手順(開発環境)
1. 環境変数を設定する
    1. ターミナル.appで下記を実行する
        ```
        # アプリのディレクトリに移動
        % cd ~/[アプリ名]
        
        % vim ~/.zshrc
        ```
    1. 「iキー」を押して、インサートモードに移行する
        ターミナルの左下に「INSERT」と表示されたら成功
    1. zshの内部に、以下の記述を追加する
        ※既存の記述がある場合、最下部に追記
        ```
        export BASIC_AUTH_USER='admin'
        export BASIC_AUTH_PASSWORD='1111'
        ```
    1. 記述を追加後、「escキー」を押す
        ターミナル左下の「INSERT」が消える
    1. 「INSERT」が消えたことを確認後、`:wq`と入力する
    1. 「Enterキー」を押して終了する
    1. 「sourceコマンド」を実行する
        ```
        % source ~/.zshrc
        ```
1. 環境変数をRailsアプリケーション側で読み込む設定
    1. `application_controller.rb`を修正する
        ```application_controller.rb
        class ApplicationController < ActionController::Base
          before_action :basic_auth
          
          private
        
          def basic_auth
            authenticate_or_request_with_http_basic do |username, password|
              username == ENV["BASIC_AUTH_USER"] && password == ENV["BASIC_AUTH_PASSWORD"]  # 環境変数を読み込む記述に変更
            end
          end
        end
        ```
1. サーバーを再起動する

## 手順(本番環境)※Renderでデプロイ
1. Renderのダッシュボードを開く
1. リストから、アプリ名をクリックする
    TYPEが「Web Service」になっていることを確認
1. 環境変数の設定
    1. メニューの中の「Environment」をクリックする
    1. 下記内容で環境変数の設定を行う
        |Key|Value|
        |-|-|
        |BASIC_AUTH_PASSWORD|1111|
        |BASIC_AUTH_USER|admin|
    1. 「Save Change」をクリックする
1. 環境変数をRailsアプリケーション側で読み込む設定
    1. `application_controller.rb`を修正する
    ```application_controller.rb
    class ApplicationController < ActionController::Base
      before_action :basic_auth
    
      private
    
      def basic_auth
        authenticate_or_request_with_http_basic do |username, password|
          username == ENV["BASIC_AUTH_USER"] && password == ENV["BASIC_AUTH_PASSWORD"]  # 環境変数を読み込む記述に変更
        end
      end
    end
    ```
1. GitHub Desktopを使ってコードをプッシュする
1. mainブランチが更新されるとrenderでのデプロイが自動的にスタートされる
1. デプロイ後、render上に公開したアプリへアクセスし、Basic認証をパスできるか確認する

# 動作確認
1. サーバーを起動する
1. アプリを起動する
1. ユーザー名とパスワードの入力が求められることを確認する
1. 設定したユーザー名とパスワード以外ではログインできないことを確認する
1. 設定したユーザー名とパスワードでサイトにログインできることを確認する

# Basic認証が現れない場合
Basic認証が現れない場合、下記どちらかを実行する
一定期間「Basic認証を通過した」という情報が保持され、その期間はBasic認証が現れなくなるため

- シークレットウィンドウにて確認する
- ブラウザのキャッシュをすべて削除する

# Ruby on Railsまとめ
https://qiita.com/likapantrip/items/46b43c9d1309b6633f0a
【OCVS】VMware HCX 4.10.3 以前におけるVMware HCX コネクタのダウンロード方法変更について

# 1.問題の概要
Oracle Cloud Infrastructure（OCI）のOracle Cloud VMware Solution（OCVS）で利用されている VMware HCX のダウンロード・アップグレード手順が大きく変更されました。（他クラウドも同様）

これまでHCXは、OCVS上のHCXマネージャからBroadcomの外部イメージデポサーバー（hybridity-depot.broadcom.com）を通じて、HCXコネクタのOVAファイルやアップグレードバンドルを取得していました。しかし、**このデポサーバーは廃止され、今後はBroadcomサポート/クラウドベンダーポータル経由での手動ダウンロードが必要になります。**


現在（2025/6時点）、OCVS環境で展開されるHCXのバージョン（4.10.3.0.XXX）で試そうとすると、以下の通り、「REQUEST DOWNLOAD LINK」がクリックできない状態になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3691986/135b4fbb-cc4b-4ce0-9874-2edc84fc636a.png)
※2025/3時点にOCVS環境で試した際はHCXマネージャからダウンロードできたのですが、2025/6に再度実施してみるとできなくなっており、少々焦りました。。。


:::note warn
Oracle社が公開している構築手順資料上もまだHCXマネージャからHCXコネクタのOVFファイルをダウンロードする手順のままなので、注意が必要です。

※Oracle社が公開しているOCVSを使用したHCX構成の資料
https://docs.oracle.com/ja/learn/oci-ocvs-hcx/index.html#introduction
:::


# 2.解決策
**① Broadcom サポートポータルからの手動ダウンロード**

対象: Broadcomサポート契約をお持ちのユーザー

■手順:
* Broadcom サポートポータル にアクセス
* アカウントでログイン
* 「VMware HCX」製品ページに進む
* 必要な HCX OVA ファイルおよびアップグレードバンドルをダウンロード

**②サービス提供会社のサポート窓口からダウンロード**

対象: OCIや他のハイパースケーラー経由でHCXを利用しているユーザー

■手順:
* 各ハイパースケーラーのサポート窓口に連絡し、HCX OVAファイルおよびアップグレードバンドルの提供を依頼してください。

※筆者はOCIサポートにHCXバージョンを連携し、このバージョンにあうHCXコネクタのOVFファイルをくれと頼んで連携してもらいました。

### 参考
https://knowledge.broadcom.com/external/article/395372
Surface Go2にLinux Mintをインストール

### USBドライブからのブートがうまくいかない。
1. vol-長押し＋電源ボタンON→電源ボタンのみOFF（vol-押しっぱなし）
1. USBドライブ読み込み時に（？）エラー：Checking Medea [fail]
1. Windowsが起動してしまう

### 回避方法
1. USBハブでWindows回復ディスクとLinuxインストールメディアを接続
1. Windows回復ディスクから起動(vol-長押し＋電源ボタンON・・・)
1. オプションの選択→デバイスの使用
![20250611_181311.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232903/a1f8f47d-6709-4138-8e35-2a3163ad16d2.jpeg)
1. Linpus Lite（linuxのインストールメディアは全部これ？）を起動
![20250611_180448.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232903/ffeca5e6-901b-42e6-a5ba-7f8c2a2ac1f2.jpeg)
1. GRUBが立ち上がったらWindows回復ディスクを抜いてからインストーラを起動
Excel関数に定数的な概念を導入するための2種のアイデア

Excel関数でも入れ子構造が深くなったり、構造が複雑になると可読性が下がりますよね
Excel関数にプログラミング言語の定数みたいな挙動をさせて、よりシンプルなセルにするアイデアを場合別に2つご紹介します。

# 1.LET関数を使う（Excel 2021～）
**LET関数**はExcel2021から登場した比較的新しい関数で、その名の通り、セルに変数（のようなもの）を設定することができます。
1つのセルに同じExcel関数が複数回登場するときなどに使えます。

例えば、XLOOKUP関数の結果が0の場合ある関数で処理、1の場合また別の関数で処理……みたいな関数を考える時、IF関数の引数としてXLOOKUP関数（←1関数が長い）が何度も登場すると、<b>可読性</b>が大きく下がりますよね。
可読性とはすなわち保守性。侮ってはいけません。

そこでLET関数を使うことで、セルの中身をシンプルにすることができます。
LET関数はこんな関数です。

<b>LET (name1、name_value1、calculation_or_name2、[name_value2、calculation_or_name3...])</b>

https://support.microsoft.com/ja-jp/office/let-%E9%96%A2%E6%95%B0-34842dd8-b92b-4d3f-b325-b8b8f9908999

要は、<b>1番目の引数で名前を宣言、2番目の引数にその値を代入する</b>と覚えていただければOKです。そして<b>後続の処理は3番目以降の引数に書きます</b>。

つまり、さっきのXLOOKUP関数の例をとると

```LET関数を使わない例.xlsx
=IF(XLOOKUP(何かの引数・・・)=0,"値は0だよ！",IF(XLOOKUP(何かの引数・・・)=1,"値は1だよ！",CONCAT("値は",XLOOKUP(何かの引数・・・),"だよ")))
```
と、えらく長くなるわけですが、LET関数を使って、XLOOKUP関数の値にvalueという変数名を与えると、

```LET関数を使う例.xlsx
=LET(value,XLOOKUP(何かの引数・・・),IF(value=0,"値は0だよ！",IF(value=1,"値は1だよ！",CONCAT("値は",value,"だよ")))
```

と、だいぶ見やすくなります。
※CONCAT関数……CONCATENATE関数の後続です（Excel 2019～）。セル範囲での結合等もできるので使いやすいです。

LET関数は、特にプログラミング言語に親しんでいる方からするとかなり使い勝手のいい関数だと思いますので、是非色々試していただければと思います。

# 2.非表示のセルを変数代わりにする
こちらは、同一の計算結果等の値を複数のセルで参照する場合のアイデア。
例えばCONCAT関数などで成形した文字列をベースに、複数のセルでそれぞれ違う値を結合したりする場合などに、いちいちCONCAT関数をセルごとに記載するのではなく、親となる計算結果は1つのセルにまとめ、そのセルを非表示にしたうえで、子のセルは親のセルの値を参照する、というやり方です。

例えば

||A|B|C|D|E|F|
|---|---|---|---|---|---|---|
|*1*|名字|*名前*|*社員番号*|*様付け*|*さん付け*|*社員番号つき*|
|*2*|柳田|悠岐|19881009|||

1列目をヘッダ行とするこんなExcelがあったとします。
A～C列は別のファイルからコピペしてきた、みたいな想定です。

上記を例に、D2に「柳田悠岐様」、E2に「柳田悠岐さん」、F2「柳田悠岐(19881009)」と入力したい場合、特に工夫しないでやるとしたら、

```
D2：CONCAT(A2,B2,"様")
E2：CONCAT(A2,B2,"さん")
F2：CONCAT(A2,B2,"(",C2,")")
```
と書くことになろうと思います。

いちいちA2,B2と参照するのは、ちょっと面倒。
そういう表を次のように成形してみます。

||A|B|C|D|E|F|G|
|---|---|---|---|---|---|---|---|
|*1*|名字|名前|社員番号|様付け|さん付け|社員番号つき|(隠し行)|
|*2*|柳田|悠岐|19881009||||<b>=CONCAT(A2,B2)

G2の結果は「柳田悠岐」となり、それぞれ以下のような記載になります。
またこの時、<b>G列を非表示設定</b>しておくと、見栄えも綺麗なままです。

```
D2：CONCAT(G2,"様")
E2：CONCAT(G,"さん")
F2：CONCAT(G2,"(",C2,")")
```

……多少可読性上がりましたよね？
もしD～F列の結果が想定外になったら、G列を見に行けば一度で修正できるので、<b>保守性も高くなります</b>。
今回の例はシンプルですが、応用すると結構使えるはず。

ちなみに今回は2つの表で列番号を変えたくなかったのでG列に追加いていますが、C列あたりに挿入した方がわかりやすいかもしれません。

## まとめ
今回は、Excelで定数っぽいことをする方法を2種類ご紹介しました。
関数が複雑化すると、特に複数人で管理するファイルなどでは悲しい事故が起こりがち。
保守性も考えたファイルづくりを意識しておくと、あとあと助かるのは自分です（笑）
競プロ日記#25/06/09

# AtCoder
## AtCoder Beginner Contest 381
[C - 11/22 Substring](https://atcoder.jp/contests/abc381/editorial/11413)
- 「/」を探索してその両端がそれぞれ左が「1」右が「2」であり続ける限り条件を満たし続けるとして調べる
- 今回は「/」を基準にして左右に展開される文字が1か2で異なるので基準がスライドしていく際に走査範囲が重複せずO(N)の計算量で突破できる
Amazon Q CLIとpygameを使ってゲーム作成してみた

Amazon Qに興味があり、Amazon Qを使ったオンラインイベントがあったので参加しました

https://jawsug-saga.connpass.com/event/358376/

AWSで以下のキャンペーン実施されており、それに沿った内容でした

https://aws.amazon.com/jp/blogs/news/build-games-with-amazon-q-cli-and-score-a-t-shirt/

### 事前準備

* AWS Builder IDの登録

https://community.aws/builderid?trk=b085178b-f0cb-447b-b32d-bd0641720467&sc_channel=el

* Amazon Q CLIのインストール

macの場合は公式の以下の参考に

https://docs.aws.amazon.com/ja_jp/amazonq/latest/qdeveloper-ug/command-line-installing.html

winの場合はwsl経由になるようです、参考記事は以下

https://business.ntt-east.co.jp/content/cloudsolution/ih_column-191.html

* pygameのインストール

```
python3 -m pip install -U pygame
```

### 作成

コマンドラインから以下を実行しamazonQのチャットを起動

```
q /chat
```

対話を始めます

```
ゲームを作りたいです。インベーダーのようなシューティングゲームを作りたいです。
```

送信すると、AmazonQが考えゲームを作成してくれました

```
インベーダー風シューティングゲームを 
/Users/XXXX/amzon_q/invaders_game.py に
作成しました！

このゲームには以下の機能が含まれています：

### 基本機能
• プレイヤーの宇宙船（緑色の長方形）
• 敵のインベーダー（赤色の四角形）が5行8列で配置
• プレイヤーの弾（青色）と敵の弾（白色）

### 操作方法
• 左右矢印キー：プレイヤーの移動
• スペースキー：弾の発射
• Rキー：ゲームオーバー時のリスタート

### ゲームシステム
• 敵を倒すとスコアが増加（1体につき100点）
• 敵が全滅すると次のレベルに進み、難易度が上昇
  • 敵の移動速度が速くなる
  • 敵の弾の発射頻度が上がる
• ゲームオーバー条件：
  • 敵の弾に当たる
  • 敵と接触する
  • 敵が画面下部に到達する

### 実行方法
ターミナルで以下のコマンドを実行してください：
python /Users/XXXX/amzon_q/invaders_game.py


このゲームをさらに発展させたい場合は、以下のような機能を追加す
ることができます：

1. グラフィックの改善（画像の使用）
2. 効果音やBGM
3. シールド（バリア）の追加
4. 特殊な敵（UFOなど）の追加
5. パワーアップアイテム
6. ハイスコアの保存

何か特定の機能を追加したい、またはコードについて質問があればお
知らせください！
```

提案いただいた内容は、以下の質問が届き、yを押すとファイルに保存してくれます

```
Allow this action? Use 't' to trust (always allow) this tool for the session. [y/n/t]:
```

最初文字化けしていたものもありましたが、何を直して欲しいのかなど送ることですぐ改善してくれました。
何より作成がはやい・・・

### 実際にできたもの

ランダムに落ちてくる攻撃を左右に避けながら。スペースキーで発射し、ブロックを消していくシンプルなゲームですが、簡単に作成することができました！

![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276326/a964fae3-738d-454a-9977-cd50fa74ca59.png)


実際にできたコードは以下に配置しております。
別で対話して作成したテトリスも置いてます。

https://github.com/merika427/q-cli-games/

### 感想

AmazonQとpygameさえあれば、プログラミング知識がない方でも、簡単にゲームを作成できると感じました。
普段遊ぶにはちょうどいいかもしれません。

簡単な対話で作成し、間違いもすぐ修正してくれるので凄かったです。

実際業務で使うには、セキュリティ設定などまだ色々調べた上になるかと思いますが、取り込んでいけたらと思いました
【公式ドキュメントから学ぶPythonチュートリアル】#1 Pythonインタプリタを使う

# 今回の内容
https://docs.python.org/ja/3.13/tutorial/interpreter.html

## インタプリタの起動
```
python3
```
- 終了: Ctr + D, quit()
- ファイルからスクリプトを読み込んで実行: `python3 <ファイル名>`, `python3 < <ファイル名>`
- `-i`をつけると、スクリプト実行後、そのまま対話モードに入る
- その他の起動: `python3 -c '<command>'` → `<command>`を実行する, `python3 -m <module>` → `<module>`を実行する

## 対話モード
- 対話モード: インタプリタが命令を端末(tty)やコマンドプロンプトから読み取っているとき。ターミナルから入力しているときもこれに含まれる
- 一次プロンプト(primary prompt): `>>>`
- 二次プロンプト(secondary prompt): `...`, 継続行は`if文`などの複数行の構文を入力するときに使用する

```terminal
>>> flag = True
>>> if flag:
...    print("Hello, World!")
...
Hello, World!
```

## 補足
「引数の受け渡し」「ソースコードの文字コード」について今回は省略させていただきました。理由は、今の時点ではわかりずらいからです（あと、僕がうまく説明できないので。申し訳ない...）
また、今後取り扱う予定です。