OmniAICreator/Qiita-1.07M huggingface dataset:
この住所、読めますか？ 難読地名チャレンジ！ 近畿・中国編

# 🗾 はじめに❄️
近畿・中国地方には、日本の歴史や文化を色濃く反映した **独特の地名** が数多く存在します！✨  
近畿地方では、 **京都や奈良の古都** に由来する **由緒ある地名** が今も残り、  
中国地方では **方言や地域特有の言い回し** が地名に影響を与えています。

例えば…  
📍 **京都**：「帷子ノ辻（かたびらのつじ）」  
📍 **奈良**：「畝傍（うねび）」  
📍 **大阪**：「天満橋（てんまばし）」  
📍 **兵庫**：「舞子（まいこ）」  

一見すると **読み方が想像できない** 地名ばかり！🤔  
でも、実はその **地形や歴史、文化** が由来になっているんです！  

💡 **あなたはいくつ読める？**  
今週は、そんな **近畿・中国地方の難読地名クイズ** に挑戦！🏆  
地名を通じて、この地域の **奥深い歴史と文化** に触れてみましょう！  

📢 ぜひ挑戦した感想をコメントで教えてください！

## 🔍 住所検索で使ったAPIはこちら！ 🚀  

今回の **YomiMap** で使用したAPIはコチラ👇  
[🌍 ZENRIN Maps APIは２か月お試し無料！🚀](https://www.zenrin-datacom.net/solution/zenrin-maps-api/trial?fm_cp=6757baf3203e3a00bb118509&fm_mu=67639f7aaffc4405037dbf36&utm_campaign=6757baf3203e3a00bb118509&utm_medium=else&utm_source=Qiita48)  

## 🎯 アプリの概要
このアプリでは、以下の機能を提供します。

✅ 難読住所クイズ：複数の選択肢から正しい読み方を選ぶ
✅ 地図表示：正解すると、その住所の位置を地図上に表示
✅ ZENRIN Maps API 活用：住所検索と位置情報の取得をAPI経由で実現

## 🎯 さあ、あなたも難読地名に挑戦しよう！  
実際にクイズを楽しめます。
実際の動作は、以下のデモをご覧ください。
[YomiMap（読みマップ　近畿・中国編）](https://goldiek24.github.io/address_quiz/address_quiz_kinki_chugoku.html)
![zma_address_quiz._kinki_chugoku.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3965389/d36be365-9791-4c09-82b3-e473068e6cb4.png)

## 🛠 開発の流れ
#### 1. クイズデータの作成
まず、難読住所クイズのデータを用意しました。JavaScriptのオブジェクト配列として、住所名とその選択肢を定義しています。

```javascript
const quizData = [
    { question: "「祝園」の読み方は？", options: ["ほうその", "いわいぞの", "ほうぞの"], correctAnswer: "ほうその" },
    { question: "「太秦」の読み方は？", options: ["たいしん", "ふとはた", "うずまさ"], correctAnswer: "うずまさ" },
    ...
];
```

#### 2. クイズ画面の作成
ユーザーが選択肢をクリックできるよう、HTMLとCSSでクイズのレイアウトを作成しました。
```html
<div id="quiz-container">
    <h2>問題 1</h2>
    <p>「祝園」の読み方は？</p>
    <div class="button-group">
        <button onclick="checkAnswer('ほうその')">ほうその</button>
        <button onclick="checkAnswer('いわいぞの')">いわいぞの</button>
        <button onclick="checkAnswer('ほうぞの')">ほうぞの</button>
    </div>
</div>
```

#### 3. ZENRIN Maps API を使った地図表示
クイズに正解したら、その住所の位置を地図上に表示します。
ZENRIN Maps API を利用して、住所を検索し、緯度経度情報を取得して地図を更新します。
```javascript
async function searchAddress(address) {
    const response = await fetch('https://test-web.zmaps-api.com/search/address', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
            'x-api-key': 'YOUR_API_KEY',
            'Authorization': 'referer'
        },
        body: new URLSearchParams({ word: address, word_match_type: '3', address_level: 'SHK,OAZ', sort: 'address_read' })
    });

    const data = await response.json();
    if (data.status === "OK" && data.result.info.hit > 0) {
        const location = data.result.item[0].position;
        const latLng = new ZDC.LatLng(location[1], location[0]);
        map.setCenter(latLng);
    } else {
        alert("住所の位置情報が見つかりませんでした");
    }
}
```
## 🚀 今後の展望  
**問題の追加：** 近畿・中国地方ならではの難読地名をさらに充実！  
**エリア別モード：** 京都・奈良・山陽・山陰など地域ごとに挑戦できる機能を追加  
**ご当地ヒント機能：** その地名にまつわる歴史や名産をヒントとして表示  

ZENRIN Maps API を活用すれば、正確な地図データとともに、より楽しく学べるコンテンツが作れます！  
ぜひ皆さんも、APIを活用して面白い地図アプリを作ってみてください！  

📢 ご意見・感想をコメントでお待ちしています！
有用なサイトのリスト

プログラムや計算とはほぼ無関係ですが、自分の研究に関係していて有用なサイトをブックマーク的に以下にリストします。

# 電極電位の変換
電極電位についての説明と異なる基準での電位の変換を行ってくれるページです。

https://mcauleygroup.net/article/1/

# 電気化学に関する基礎知識

http://water-solutions.jp/tech_basic-2/
Bun でファイル入出力と S3 操作をシンプル実装

## 要約

File I/O

```js
const file = Bun.file("foo.txt");

// Write
await Bun.write(file, "foo!");

// Read
const data = await file.text();

// Delete
await file.delete();
```

S3 API

```js
const metadata = s3.file("123.json");

// Upload
await write(metadata, JSON.stringify({ name: "John", age: 30 }));

// Download
const data = await metadata.json();

// Delete
await metadata.delete();
```

ね？簡単でしょ？

詳しくは Bun 公式ドキュメントを参照してください

- [Writing files | Guides](https://bun.sh/guides/write-file)
- [File I/O – API | Bun Docs](https://bun.sh/docs/api/file-io)
- [S3 Object Storage – API | Bun Docs](https://bun.sh/docs/api/s3)

## ここが良い！便利ポイント

使用方法を羅列しても、ただの公式ドキュメント翻訳になってしまいますので、
ここでは Bun File I/O のおすすめポイントを紹介していきます。

### シンプルに書ける

ファイルに何か書き込みたい！読み出したい！

```js
const file = Bun.file("foo.txt"); // Create BunFile instance

await Bun.write(file, "foo!");    // Write
const data = await file.text();   // Read
```

はい！これだけ！
`BunFile` という instance を軸に、様々な操作を直感的に書くことができます。

さらにこの記述方法が File I/O と S3 API で共通のため、
Object Storage のファイルでも、ローカルのファイルかのように扱うことが可能です。

また、[環境変数](https://bun.sh/docs/api/s3#credentials)から自動で S3 への接続情報を取得するため、S3 クライアントを定義する必要はありません。

もちろん、従来のようにクライアントを明示することも可能です。

```js
import { S3Client } from "bun";

const client = new S3Client({
  accessKeyId: "your-access-key",
  secretAccessKey: "your-secret-key",
  bucket: "my-bucket",
});
```

### 様々なフォーマットに対応

もちろん text だけでなく、任意の形式での読み書きが可能です。

```js
const foo = Bun.file("foo.txt");

await foo.text(); // contents as a string
await foo.stream(); // contents as ReadableStream
await foo.arrayBuffer(); // contents as ArrayBuffer
await foo.bytes(); // contents as Uint8Array
```
*出典：https://bun.sh/docs/api/file-io#reading-files-bun-file*

### 依存関係を増やさない

従来では S3 互換 Object Storage の操作には、AWS SDK などを利用するのが通例でした。
ただ、毎回インポートして S3 クライアントを作成して、コマンドを送信して…とやるのは手間ですよね。

Bun runtime を使ってさえいれば、別途依存ライブラリを追加することなく、簡単に S3 への入出力を実装することができます。

## 所感

Node.js 互換の JavaScript runtime として開発が進められている Bun ですが、Bun runtime 固有の便利な機能、記法も増えてきました。

しかし、大手サーバレスサービスなどにデプロイをしたいとなると、結局 Node.js 前提で使えない…というケースが頻発するため、ぜひ Bun にはシェアを伸ばしていってもらい、対応サービスの拡大を頑張ってもらいたいですね。
#0084（2024/03/28）ARM64 / x86 / Rosetta

# ARM64アーキテクチャ、x86アーキテクチャ、Rosettaの解説

本記事では、CPUアーキテクチャである「ARM64」「x86」と、Appleが提供するエミュレーション技術「Rosetta」について、詳しく解説します。

---

## 🔹 ARM64アーキテクチャとは？

ARM64（別名：AArch64）はARM社が設計した64ビットのCPU命令セットアーキテクチャです。主にモバイルデバイス、タブレット、最近ではAppleのM1・M2などのMacでも採用されています。

### 特徴

- 低消費電力で効率的な処理が可能
- RISC（Reduced Instruction Set Computing）ベースのシンプルな命令セット
- 熱効率がよく、バッテリー持続時間が長い

### 主な採用例

- Apple Silicon（Mシリーズ：M1、M2）
- スマートフォン（iPhone、Android）
- IoTデバイス

---

## 🔹 x86アーキテクチャとは？

x86アーキテクチャは、Intelが開発したCPU命令セットで、32ビット版（x86）と64ビット版（x86_64またはAMD64）があります。Windows PCやLinuxサーバーで長年にわたり広く採用されています。

### 特徴

- CISC（Complex Instruction Set Computing）ベースで複雑かつ高機能な命令セット
- 高性能で処理能力が高いが、消費電力や発熱量が多め

### 主な採用例

- Intel Coreシリーズ
- AMD Ryzenシリーズ
- 大多数のWindows PC
- 多くのLinuxサーバー

---

## 🔹 Rosettaとは？

Rosetta（ロゼッタ）はAppleが提供するバイナリエミュレーション技術で、x86（Intel）向けに開発されたアプリケーションをARM64（Apple Silicon）上で実行可能にします。

- Rosetta 2はApple Siliconへの移行期にアプリケーション互換性を維持するため導入されました。

### Rosettaの仕組み

- Intelベースのコードを動的にARM64ベースのコードへ翻訳（JIT：Just-In-Timeコンパイル）して実行。
- ユーザーから見ると、ほぼ透過的にアプリケーションが実行可能。
- ネイティブ実行に比べると若干パフォーマンス低下があるが、十分実用的な速度を保つ。

### 使用例

- Apple Silicon搭載のMac上でIntel用アプリケーションを動かす場合

---

## 🔹 各アーキテクチャとRosettaの比較まとめ

| 項目 | ARM64 | x86 | Rosetta |
|------|--------|------|---------|
| 命令セット | RISC（単純で効率的） | CISC（複雑で高性能） | x86→ARM64へ変換 |
| 消費電力 | 低い | 高め | ARM64依存 |
| 発熱量 | 低い | 高め | ARM64依存 |
| パフォーマンス | 効率重視（高効率） | 性能重視（高性能） | やや低下（実用的） |
| 主な採用例 | Apple Silicon、スマホ | Windows PC、サーバー | Apple Silicon Mac |

---

## 🔹 まとめ

- **ARM64** は効率性、消費電力に優れたアーキテクチャ。
- **x86** は高性能・多機能だが消費電力が高めのアーキテクチャ。
- **Rosetta** はApple Silicon（ARM64）環境でx86アプリを実行可能にするエミュレーション技術。

各アーキテクチャの特徴やRosettaの仕組みを理解し、開発や運用時に適切に使い分けることが重要です。
【Googleドキュメント】ネストされた番号付きリストを「シンプルな数字」にカスタムする方法

# 前提
### 実現したいこと
Googleドキュメントにて、以下のような番号付きリストを使用したい。

1. ← リストの番号がシンプルな数字
    1. <font color="Red">**← ネストされたリストの番号がシンプルな数字**</font> 
    1. あああ
1. あああ

### 困ったこと
Googleドキュメントの番号付きリストメニューには、 **実現したいこと** のような番号付きリストは用意されていない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471657/81f5c36d-0238-e416-eb44-42b9082d7f95.png)


# 解決方法
以下の方法で実現することができた。

1. 実現したい番号付きリストに1番見た目が近い、 **数字orアルファベット（小） + ドット（.）** のリストを選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471657/cf3c5bd4-6fb5-ad09-9e78-ef413b99df60.png)

1. ネストされたリスト上にカーソルを置いた状態で、画面左上の「 **表示形式タブ > 箇条書きと番号付きリスト > リストのオプション** 」から、 **シンプルな数字** を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471657/5570390a-57ce-fb88-38a4-ab3e5050f600.png)

1. ネストされたリストの番号がシンプルな数字になっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471657/1721115c-51cc-1e54-9cb8-fd27a4a75c62.png)

# （おまけ）他のパターンも試してみた
### 括弧付きのネストされたリストを「数字」に変更
括弧部分はそのまま、アルファベットから数字に変わる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471657/e6c0c1a1-b308-4e7c-890d-6bb475c6757b.png)

### アウトライン番号のネストされたリストを「アルファベット（大）」に変更
アウトライン番号の1つ目の数字は変わらず、2つ目の数字のみ数字からアルファベット（大）に変わる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471657/98be3772-494c-4747-b581-f0830b1295ae.png)

### 前0付きの数字のリストを「ローマ数字」に変更
親リストももちろん変更できる。
前0は残らず、ローマ数字に変わる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471657/ecb2b1b6-ed74-4267-aa12-ce14ac20e163.png)
NCA-GENL（NVIDIA-Certified Associate: Generative AI and LLMs）に合格しました

NCA-GENL（NVIDIA-Certified Associate: Generative AI and LLMs）に合格しました！
試験概要やどのような準備をしたか等、共有させていただきます。

## NVIDIA-Certified Associate: Generative AI and LLMsとは
<a href="https://www.nvidia.com/en-us/learn/certification/">NVIDIA Certification</a>のひとつで、NVIDIAの生成AIやLLMを使おうとしている開発初者向けの、Associateレベルの資格となります。

試験時間は1時間、50〜60問の選択問題を解いていく形となります。
設問・選択肢とも英語です。

出題範囲は次の通りです。
- Fundamentals of machine learning and neural networks
- Prompt engineering
- Alignment
- Data analysis and visualization
- Experimentation
- Data preprocessing and feature engineering
- Experiment design
- Software development
- Python libraries for LLMs
- LLM integration and deployment

https://www.nvidia.com/en-us/learn/certification/generative-ai-llm-associate/

## 勉強方法
試験準備をしようとネット上で情報を探しても、まず情報が見つかりませんでした。
Udemyで学習しようとコースを探しても日本語のものは見つからず、以下のコース(英語)で学習しました。

https://www.udemy.com/course/nvidia-certified-associate-generative-ai-llms-nca-genl/?couponCode=CM240325

18時間のビデオ講義でボリュームがあり、コースの中では高額な方ですが90%オフのタイミングで安く購入できました。:moneybag:

マシンラーニング・ディープラーニング・自然言語処理(NLP)・大規模言語処理(LLM)を中心に、試験範囲を体系的に学べるコースとなっており、良い教材だと思います。
NCA-GENLはAssociateレベルの試験ということもあって、コースの内容をきっちり理解していないと合格できないわけではありません。
データ整形によく使われるpythonライブラリーはPandas、ディープラーニングの活性化関数の一つとしてReluやSigmoidがある、LLMのトランスフォーマーモデルの中でSoftmaxが使われる、みたいな問題は出ていたため、そのあたりのエッセンスを押さえておけば合格はできると思います。

もともと「生成AIやディープラーニングはどうやって動いているのだろう？」と興味があった自分としては、試験勉強以上に楽しんで取り組めました。大学を卒業して以来、数式から離れていたため、総和を表すシグマとか指数関数とか久しぶりに触れることができて実に興味深かったです。
講義を聞いても理解できないことは多く出てきて、そういった場合は生成AIに「〜と〜の違いは何か？」「〜の数値が1に近いと精度が高いと評価できるか？」「〜は〜の仕組みで動いているのか？」とか確認しながら把握していきました。（生成AIに、生成AIの要素技術について聞くのも不思議な感じだな:sweat_smile:と思いつつ、人間と違って「こんなこともわかっていないのか！」とか怒らずに、何でも何回でも丁寧に回答してくれるのが良いですね。）
生成AIは間違った答えを返す場合もあるため、正確に理解したい人はちゃんとした文献を読むなり、有識者に聞いた方がよいです。

あと、少し前から聞くようになったRAGとかdiffusionモデルは何か？みたいな問題も出ていて、Udemyのコースでは出てこなかったのですが、最新の生成AI界隈で聞くようになった技術も概要をおさえておくとよいと思います。

## 受験
先月、NCA-AIIO(NVIDIA-Certiried Associate: AI Infrastructure and Operations)を取得したときはCertiverseによるリモートオンライン受験を行いました。

今回は以下に書いた通り、GTC会場での受験であったため、NVIDIA Authorized Testing Partners (NATPs)での受験にあたると思います。

https://qiita.com/yuji_hashimoto/items/ea9211ef72c453d2e4b4

申し込み自体は会場で、<a href="https://www.certiverse.com/#/">Certiverse</a>から実施するよう指示があったため、そうしました。
時間になったら試験会場で受付し、受験時にUnlock Codeを入力する必要あるからスマホで写真をとるよう言われ、テストを受ける部屋に通されました。
部屋には4列ぐらい机が並んでいて、ノートPCが15台ほどあり、席に案内されました。
名前とUnlock Codeを入力したらスマホをしまい、試験の注意事項が書かれたページを読んでからテスト開始です。

あとでチェックしたい問題はフラグをつけたりメモを書いたりできるため、まずは一通り問題を解いてからフラグをつけた問題を見直すのがよいと思います。
受験後、結果はその場で数十秒後にわかり、無事合格することができました。

https://www.credly.com/badges/bf71ade4-34b8-41ce-9802-3da531ebcdad/public_url

今後、チャレンジする皆様の参考になれば幸いです。
CUDA のバージョン不整合による PyTorch の ImportError 解決法

## **1. 問題 (What)**

PyTorch をインストールして実行しようとした際に、以下のエラーが発生した。

```
ImportError: /home/user/anaconda3/envs/myenv/lib/python3.10/site-packages/torch/lib/../../nvidia/cusparse/lib/libcusparse.so.12: undefined symbol: __nvJitLinkAddData_12_1, version libnvJitLink.so.12
```

このエラーのため、`import torch` すらできない状態になった。


## **2. 原因 (Why)**

このエラーは、**CUDA のライブラリ (`libcusparse.so.12`) が PyTorch の期待するバージョンと異なっている** ことが原因。

具体的には、

1. `nvidia-smi` の出力では **CUDA 12.7** が表示されていたが
2. `nvcc --version` では **CUDA 12.0** になっており
3. PyTorch が `libcusparse.so.12` をロードしようとした際に **古いバージョン (CUDA 12.0 のライブラリ) をロードしようとしてエラーが発生** していた

さらに、Anaconda 環境内にも `libcusparse.so.12` が存在し、
**誤って Anaconda の CUDA ライブラリがロードされることでも不整合が発生する可能性があった**。

---

## **3. 解決策 (How)**

### **ステップ 1: 実際にどの CUDA バージョンが使われているか確認**

まず、CUDA のバージョンをチェックする。2つのバージョンが異なっている場合は、問題が発生しているので次に進む。

```bash
nvcc --version
nvidia-smi
```

以下からは、CUDAのバージョンが12.7で、PyTorchが12.0を参照しているケースで考える。次に、`libcusparse.so.12` がどこにあるのかを確認する。

```bash
find /usr/local -name "libcusparse.so.12"
find ~/anaconda3 -name "libcusparse.so.12"
```

さらに、PyTorch がどの `libcusparse.so.12` を使おうとしているかを調査。

```bash
ldd ~/anaconda3/envs/myenv/lib/python3.10/site-packages/torch/lib/libtorch_cuda.so | grep cusparse
```

この出力を見て、**間違った CUDA ライブラリがロードされているかを特定** する。筆者の場合、CUDA Toolkit のライブラリ（通常 /usr/local/cuda/lib64/ にある）を参照するべきとこを、anacondaのライブラリを参照しようとしていることがわかった。

---

### **ステップ 2: 正しい CUDA ライブラリをロードするように設定**

正しい CUDA のパス (`/usr/local/cuda-12.0/lib64`) を **環境変数 `LD_LIBRARY_PATH` に指定** する。

```bash
export LD_LIBRARY_PATH=/usr/local/cuda-12.0/lib64
```

この状態で `import torch` を試してみる。

```bash
python -c "import torch; print(torch.version.cuda)"
```

問題が解決すれば、この設定を永続化する。

```bash
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-12.0/lib64' >> ~/.bashrc
source ~/.bashrc
```

---

### **ステップ 3: PyTorch の CUDA バージョンを確認 & 修正**

もし `torch.version.cuda` の出力が期待するバージョンでない場合、適切なバージョンの PyTorch をインストールし直す。

```bash
pip uninstall torch
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu120
```

再び `import torch` を試して、エラーが消えていることを確認する。

---

## **4. まとめ**

✅ **CUDA のバージョン不整合** がエラーの原因だった。
✅ `find` と `ldd` で **誤った `libcusparse.so.12` を特定** した。
✅ `LD_LIBRARY_PATH` を修正して、**正しい CUDA ライブラリを使用するようにした。**
✅ 必要なら、PyTorch を **CUDA の適切なバージョンに再インストール** した。
Aspire下でWebアプリ起動時にポートがランダムにならないようにする

# 背景
Aspireを使いWebAPIでBlazor WASMをホスティングしています。
この場合、WebAPIは指定のポートで起動しますが、その先のBlazor WASMはランダムなポートが割り振られ起動します。
通常の開発ではこのポートでも構いませんが、認証を行う場合都合がよろしくありません。

認証にはAzure Active Directory B2Cを利用しているため、リダイレクト先を予め設定しておく必要があるからです。

# 解消

AspireでWebAPIを設定している個所

``` csharp
var api = builder.AddProject<Projects.WebAPI_Server>("api")
    .WithReference(db);
```

ここにWithEndpointを追加
``` csharp
var api = builder.AddProject<Projects.WebAPI_Server>("api")
    .WithEndpoint("https", endpoint => endpoint.IsProxied = false)
    .WithReference(db);
```
この設定によりlaunchSettings.jsonで指定したポートでブラウザが立ち上がり
デバックが出来るようになりました


[参考ページ](https://learn.microsoft.com/ja-jp/dotnet/aspire/fundamentals/networking-overview)
Laravel Breeze（Vue）導入時に Ubuntu（Sail）で npm install が権限エラー → Windowsでは成功した話と原因・対策まとめ【環境差トラブル備忘録】

# はじめに

Laravel Breeze で Vue を使った認証機能を導入しようとした際、Ubuntu（Laravel Sail）上で `npm install` を実行すると、**謎の権限エラーが発生**。

ところが、**同じコマンドを Windows 環境で実行すると何の問題もなく成功**。

この体験から、**ホストOSとDockerコンテナ間のファイル・権限の違い**について学んだことが多かったので、備忘録としてまとめておきます。

---

# 実行したコマンド一覧

```bash
# Breezeパッケージのインストール
./vendor/bin/sail composer require laravel/breeze --dev

# Vue版の Breeze をインストール
./vendor/bin/sail artisan breeze:install vue

# フロントエンドの依存パッケージインストール
./vendor/bin/sail npm install

# 開発用ビルド
./vendor/bin/sail npm run dev
```

# ①Ubuntu（Sail）環境で発生したエラー

npm install 実行時に、以下のようなエラーが大量に表示されました。

```plaintext
npm ERR! code EPERM
npm ERR! syscall chmod
npm ERR! path /var/www/html/node_modules/◯◯
npm ERR! Error: EPERM: operation not permitted, chmod ...
npm WARN cleanup EACCES: permission denied, rmdir ...
```

# ②しかしWindows環境では成功
同じプロジェクトフォルダを Windows 側で開いて、VSCodeのターミナルで以下を実行：

```bash
npm install
npm run dev
```

→エラーなしで成功

# ③原因の考察：ホストOSとDockerの権限の違い

**結論:**

- node_modules がホスト（Windows）と Docker（Ubuntu）間で共有され、権限エラーが発生していた

**詳細:**
![IMG_7733.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246240/b52bdb15-9288-4a90-a724-cbd1c98e7308.jpeg)

**対策1: dockerignore に node_modules を追加する（推奨）**

```bash
# .dockerignore に追記
node_modules
```

これにより、ホストとコンテナの間でnode_modules が共有されなくなり、**Docker内でのみ管理される**ようになる。

```bash
# 再実行
rm -rf node_modules package-lock.json
./vendor/bin/sail npm install
./vendor/bin/sail npm run dev
```

**対策2:ファイル所有者の修正（応急処置）**

```bash
./vendor/bin/sail shell

# コンテナ内で実行
chown -R sail:sail /var/www/html
```

権限が root などになっていると npm install 時に書き込めないため、**sailユーザーに所有権を戻す。**

**対策3:npm install をホスト側（Windows）で行う**

```bash
npm install
npm run dev
```

Vue側のビルドは、Laravel本体とは別にホストOS上で完結させる方法もあり。

# ④教訓：Sail（Docker）＋npm は環境差に要注意！

![IMG_7734.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246240/f24dceec-d503-4ee8-86fa-f427c92a8c8a.jpeg)


# ⑤まとめ

- npm install は意外と**OSとファイルシステムの影響を受けやすい**
- Laravel Breeze + Vue を Docker（Sail）で使うなら、**権限・マウント・ignore設定をしっかり意識する**
- .dockerignoreに **node_modules** を入れるのは地味だけど超重要！
ユーザー中心設計と参加型設計によるユーザー満足度向上の戦略的考察

## 要旨  
本稿では、ユーザー満足度向上に寄与する手法として、ユーザー中心設計（UCD）や参加型設計（PD）を中心とした開発アプローチに焦点を当てる。これらの手法は、ユーザーの声を積極的に取り入れることで、システムの使いやすさや受け入れやすさを高める効果が期待される。さらに、アジャイル開発やデザイン思考といったフレームワークとの関連性にも言及し、ユーザー満足度の向上に向けた文献との関係性およびその実践的適用可能性について論じる。

## 1. はじめに  
情報システム開発において、ユーザー満足度はシステムの品質や成功を左右する重要な指標である。近年の研究では、ユーザーの参加を重視する手法―ユーザー中心設計（UCD）、参加型設計（PD）、さらにはアジャイル開発やデザイン思考―が、ユーザーのニーズを的確に反映し、満足度向上に寄与することが示唆されている。本稿では、これらの手法に基づく開発アプローチと、それに関連する主要文献の内容を整理し、ユーザー満足度向上のための戦略的視点を明らかにする。

## 2. ユーザー満足度と開発アプローチの関係  
### 2.1 ユーザー中心設計（UCD）および参加型設計（PD）の意義  
文献によれば、UCDおよびPDは、ユーザーのニーズや意見を設計段階から反映することにより、システムの使い勝手や受容性を向上させる手法として評価されている。たとえば、書籍『ユーザー中心設計の基礎』（仮題）では、ユーザーリサーチ、プロトタイピング、ユーザーテストを通じて、設計プロセスにおけるユーザーの関与が満足度向上に直結すると主張されている。また、参加型設計を取り入れた事例研究では、ユーザーが開発プロセスに直接参加することで、システムの受け入れやすさが向上するという結果が得られている。

### 2.2 アジャイル開発とデザイン思考の寄与  
『アジャイル開発とスクラム』といった文献は、イテレーションを重ねながらユーザーのフィードバックを取り入れるプロセスが、システム改善およびユーザー満足度の向上に寄与することを示している。加えて、デザイン思考はユーザーの共感に基づく問題解決手法として、ユーザーの視点を重視したソリューション創出に有効であることが複数の資料で指摘されている。

### 2.3 情報システム開発におけるユーザー参加の効果  
『情報システム開発のプロセスと技術』（仮題）などの文献は、ユーザーの参加が少ない従来のウォーターフォール型開発と比較して、ユーザー満足度が低くなる可能性を示唆している。一方、ユーザーが主体的に関与する開発プロセスは、システム品質の向上や使用率の改善にも寄与することが明らかにされている。

## 3. フレームワークおよび手法との連携  
### 3.1 UCDガイドライン（ISO 9241-210）の活用  
ISO 9241-210などのUCDガイドラインは、ユーザーのニーズを設計プロセスに体系的に取り込むための枠組みを提供する。これにより、ユーザーテストやフィードバックの実施率が向上し、システムがユーザーの期待に沿ったものとなる可能性が高まる。

### 3.2 デザイン思考による共感重視のアプローチ  
『デザイン思考が世界を変える』といった資料は、ユーザーとの共感を深めることがシステム開発における新たな価値創造につながると説いている。ユーザーの具体的な声を反映したプロトタイピングは、満足度向上のみならず、イノベーション促進にも寄与する。

## 4. 議論  
ユーザー満足度向上に向けたアプローチは、多様な手法や文献が支持する共通テーマに基づいている。すなわち、ユーザーの関与を強化することで、システムが実際の利用シーンにおいてより効果的に機能し、結果として満足度が向上する。しかしながら、ユーザー参加の測定方法や効果には文脈依存性が存在し、プロジェクトごとの複雑性や組織文化がその成果に影響を及ぼす点も留意する必要がある。

また、書籍や論文を通じて示される具体的な数値（例：ユーザー満足度スコアの向上、インタビュー実施率など）は、実践における効果検証の一助となる。しかし、ユーザーの声を反映するプロセス自体が時間やコストの面で負担となる可能性もあるため、実際の開発現場では適切なバランスの取り方が求められる。

## 5. 結論  
本稿で検討した文献および事例研究は、ユーザー中心設計や参加型設計、さらにはアジャイル開発・デザイン思考といった手法を通じ、ユーザーの満足度を向上させるための効果的なアプローチを示している。これらの手法を社内受託のシステム開発部門に適用することで、ユーザーの声を的確に反映したシステム開発が実現し、結果としてユーザー満足度の向上につながると考えられる。

今後は、各種手法の効果検証を定量的に実施することや、組織ごとの文脈に合わせた最適なアプローチの選択が、さらなる研究および実践上の課題として挙げられる。

---

【主要引用文献】  
- 『ユーザー中心設計の基礎』（仮題）  
- 『アジャイル開発とスクラム』  
- 『情報システム開発のプロセスと技術』（仮題）  
- 「ユーザ参加型設計を用いた情報システム開発の事例研究」（仮題）  
- "User-Driven Information System Development: A Case Study"  
- ISO 9241-210:2010  
- 『デザイン思考が世界を変える』

---

以上が、ユーザーの満足度と文献の関係についての整理・考察を踏まえた論文風清書例です。必要に応じて、引用文献や具体的なデータを追記することで、さらに充実した内容に仕上げることが可能です。
AIと共に働く。新人エンジニアがテストを通じて成長した考え方

こんにちは！先日、先輩エンジニアに「もうすぐ新卒じゃなくなるね」と言われ、思わずゾッとした長江です。

今回は、新卒研修を経て案件配属後に感じた課題を振り返り、特にテストについて学習したことが私の考え方に与えた影響や、AI時代を生きるエンジニアとしての考え方の変化について詳しくお伝えします。

エンジニアを目指している方やこれからエンジニアになる方に、リアルな1年目を知ってもらい、何かしら気づきを得てもらえれば幸いです。

---

## 入社前の考え方：直感的で行動重視

入社前の私は、「論理的に深く考えること」が苦手で、直感的に行動するタイプでした。

例えば、なぜその方法を選んだか問われても「なんとなく、直感っす！」という回答が多く、深く考えるのをめんどくさがり避けていました。そのため卒論や修論には苦労しましたが、行動力だけはそこそこあったので、UberEatsの配達員をしていた頃には、自分で荷物管理アプリを作ることを思いつき、アプリ開発経験もないのに即座に開発を始めていました。

当時の考え方は
• 興味のあることにだけ積極的
• 論理的思考よりも直感的行動
• 自分が面白いと思うものを作りたい

という感じでした。

こうした性格から、大学院を卒業しさえすればエンジニアになって「深く考えずにコードを書くだけでいい」という甘い考えを持っていました。

---

## 研修で変わった考え方：ユーザー目線へのシフト

入社後の研修で特に影響を受けたのは、スクラムを用いたアプリ開発研修でした。

チーム内でバックログの優先順位づけで意見が対立し、ユーザーが本当に求める価値を深く議論したことで、今までの「自分が面白ければいい」という考えが変わりました。

ユーザー目線で価値を考えることの重要性を知り、「ユーザーに本当に価値のあるものを提供したい」という強い意識を持つようになりました。

また、アプリの機能が少しずつ増えたり画面が増える過程を見守る中で、自分たちが頑張った分だけアプリが成長する様子が視覚的にわかり、すごくワクワクしました。この経験がきっかけでバックエンドよりもフロントエンドに特化していきたいと考えるようになりました。

研修終了後の考え方の変化は
• ユーザーが求める価値を追求する意欲が高まる
• 視覚的に成果が見えるフロントエンド技術に特化したい
• 個人で深く考えるのはまだ苦手だけど、チームで協力して考えるのは好き

というように変化していきました。

---

## 配属後に変化した考え方：考えることの重要性とテストへの深い気づき

実際に案件に配属されて、私は大きな壁に直面しました。それは、フロントエンドだけではなくバックエンドやインフラ、テスト、仕様書作成まで、多岐にわたるタスクを担当する必要性です。

はじめは領域の広さに絶望を感じましたが、先輩から「江戸時代しか知らない歴史の先生はいないでしょ？」とアドバイスをいただいて「幅広く知識を持つことがプロのエンジニアとして必要だ」と納得し、広く学ぶことを受け入れるようになりました。

また、業務を進める中で「コードを書く時間」よりも「考える時間」が圧倒的に長いことに気づきました。曖昧な仕様を明確にするプロセスや、仕様書をテストベースとして考える作業が多く、エンジニアとは技術力だけではなく思考力が不可欠だと実感しました。

### テストが私にもたらした変化

特に私に大きな影響を与えたのが「テスト」です。正直なところ、最初はテストの価値をあまり理解しておらず、「なぜテストをするのか？」という問いにも答えられませんでした。

しかし、ある日先輩から「テストは大きな費用対効果が期待できるし、開発者のレベルを高めるためにも行うんだよ」と教えていただいたことをきっかけに、初めてテストの重要性に気づきました。

テストを強く意識して業務を行うようになってから、曖昧だった仕様を明確にしようとする姿勢が自然と身につきました。以前は主語や目的語を省いたり、なんとなく仕様を書いてしまう癖がありましたが、「これは誰のための機能か？」「何を目的にしているのか？」を常に意識するようになり、結果として要求仕様書を書く力や、きれいなコードを書く力が向上したと実感しています。

また、以前は「AIがコードを書けてしまうから、自分の仕事が奪われるのでは？」という漠然とした恐怖感がありました。しかし、テストを通じて『価値や目的、振る舞いを考える力』の重要性に気づき、それはAIではなく人間が担うべき大切な役割だと感じるようになりました。そのため、今ではAIに対する不安が減り、AIと共存してエンジニアとして活躍していきたい！と前向きな考え方に変わりました。

---

## 現在の考え方とこれからの目標

### 現在の考え方
• 幅広い知識を持つ重要性を認識
• 技術力だけでなく考える力やコミュニケーション力が重要
• AI時代に必要な「価値を抽出し仕様化する力」をテストから学ぶことができる
• AIは友達怖くない

### 2年目の目標

今後は要求仕様を書く訓練と並行して、それを元に作成されるAIの成果物に品質的な問題がないか確認できるレベルのエンジニアを目指していきます。そうすることで、ユーザーの求める価値あるプロダクトをこれまでより迅速に提供していきたいです。

この記事を読んでいただいたエンジニアを目指す皆さんも、「コードを書く」以上にプロダクトでユーザーにどんな価値を与えたいのかや、なぜ作るのかといった目的について「考える」ことの重要性をぜひ意識してみてください。これからもお互い頑張りましょう🔥
windows11で、sketchup6 その8

# 概要
windows11に、sketchup6を入れてみた。
rubyで、3Dを書く。

# 問題見つけた。

## sketchup v6 には、geomクラスが無い。



# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/c66f72f6-0751-40b3-ba34-3ffdaf53b2e0.png)


# サンプルコード

```

class Geom::Point3d
	def dot(v)
		self.x * v.x + self.y * v.y + self.z * v.z
	end
end

class Geom::Vector3d
	def scale_by(n)
		self.x *= n
		self.y *= n
		self.z *= n
		self
	end
	def to_point3d
		Geom::Point3d.new(*self.to_a)
	end
end

class Geom::PolygonMesh
	def add_revolved_points(pts, axis, numsegments)
		numpts = pts.length
		if (numpts < 2)
			raise ArgumentError, "At least two points required", caller
		end
		planar = true
		angle = Math::PI * 2
		da = angle / numsegments
		t = Geom::Transformation.rotation(axis[0], axis[1], da)
		index_array = []
		for pt in pts do
			if (pt.on_line?(axis))
				index_array.push([self.add_point(pt)])
			else
				indices = []
				for i in 0...numsegments do
					indices.push(self.add_point(pt))
					pt.transform!(t)
				end
				index_array.push indices
			end
		end
		i1 = index_array[0]
		for i in 1...numpts do
			i2 = index_array[i]
			n1 = i1.length
			n2 = i2.length
			nest if (n1 < numsegments && n2 < numsegments)
			for j in 0...numsegments do
				jp1 = (j + 1) % numsegments
				if (n1 < numsegments)
					self.add_polygon i1[0], i2[jp1], i2[j]
				elsif (n2 < numsegments)
					self.add_polygon i1[j], i1[jp1], i2[0]
				else
					if (planar)
						self.add_polygon i1[j], i1[jp1], i2[jp1], i2[j]
					else
						self.add_polygon i1[j], i1[jp1], i2[jp1]
						self.add_polygon i1[j], i2[jp1], i2[j]
					end
				end
			end
			i1 = i2
		end
	end
	def add_extruded_points(pts, center, dir, angle, numsegments)
		numpts = pts.length
		if (numpts < 2)
			raise ArgumentError, "At least two points required", caller
		end
		vec = Geom::Vector3d.new dir
		distance = vec.length
		dz = distance / numsegments
		da = angle / numsegments
		vec.length = dz
		t = Geom::Transformation.translation vec
		r = Geom::Transformation.rotation center, dir, da
		tform = t * r
		index_array = []
		for i in 0...numsegments do
			indices = []
			for pt in pts do
				indices.push(self.add_point(pt))
				pt.transform!(tform)
			end
			index_array.push indices
		end
		i1 = index_array[0]
		for i in 1...numsegments do
			i2 = index_array[i]
			for j in 0...numpts do
				k = (j + 1) % numpts
				self.add_polygon -i1[j], i2[k], -i1[k]
				self.add_polygon i1[j], -i2[j], -i2[k]
			end
			i1 = i2
		end
	end
end

def create_dome
	model = Sketchup.active_model
	entities = model.active_entities
	r = 5
	n90 = 5
	smooth = 12
	arcpts = [] 
	delta = Math::PI / (2 * n90)
	for i in 0..n90 do
		angle = delta * i
		cosa = Math.cos(angle)
		sina = Math.sin(angle)
		arcpts.push([r * cosa, 0, r * sina])
	end
	numpoly = n90 * n90 * 4
	numpts = numpoly + 1
	mesh = Geom::PolygonMesh.new(numpts, numpoly)
	mesh.add_revolved_points(arcpts, [ORIGIN, Z_AXIS], n90 * 4)
	entities.add_faces_from_mesh(mesh, smooth)
end

```


以上。
WSLで同バージョンのディストリビューション作成


# 背景
WSLのUbuntuを開発環境として使用していた。
Ubuntuの設定に依存する機構があり、まっさらなUbuntuで動作確認をしたいとなった時に、既存の環境を残したまま、新しく同バージョンのUbuntuをWSLとしてインストールしたくなった。
現在の環境を複製(エクスポートして別名でインポート)する方法は、検索してすぐに見つかったが、まっさらな環境をインストールする方法はすぐに分からなかったのメモしておく。


# 前提環境
- Windows 11 Pro
- WSL バージョン: 2.4.13.0
- インストール済みのWSLディストリビューション
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404547/9a382a88-14e4-4db8-ac87-d2308eb5e98b.png)


# インストール
既にインストール済みのUbuntu-24.04とは別に、もう一つUbuntu-24.04を追加インストールする。

コマンド
```
wsl --install Ubuntu-24.04 --name Ubuntu-24.04-20250328
```


コマンド内容

wsl --install <取得するディストリビューション名> --name <ローカル環境のディストリビューション名>


:::note warn 
ローカル環境のディストリビューション名

既存の名称を指定すると下記のエラーになる。

    指定された名前のディストリビューションは既に存在します。--name を使用して別の名前を選択してください。
    エラー コード: Wsl/InstallDistro/Service/RegisterDistro/ERROR_ALREADY_EXISTS
:::

# 実行結果
無事に追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404547/894b75f1-386f-417f-93d8-52d77b2b3099.png)
BloggerでSearchConsoleでクロール済み - インデックス未登録

Bloggerサイトのインデックスが「クロール済み - インデックス未登録」を理由に全て登録除外されている

## 状況

- 2024/10~くらいから 徐々にインデックスが外れだす
- 2025/1/8 インデックス全滅
- 2025/01/22 再登録申請して開始ステータスに遷移
- 2025/03/25 引き続き開始ステータスでインデックス登録されず進捗も不明
- URL検査でインデックス登録をリクエストしてもクロール済み - インデックス未登録で瞬殺される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417736/68324cc9-f6e3-4fbb-9ca0-1299037e5afc.png)


### クロール済み - インデックス未登録 ってどんな状況

コンテンツ価値がないからインデックス登録しませんという状況

> GoogleにクロールされてHTMLやJavaScriptが解析されたが、その結果、Googleがインデックスしないと判断したということになります。
> ![image 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417736/3fa67bb8-e3ed-4a8b-b5e0-205b1d1c099d.png)

[【永久保存版】クロール済みインデックス未登録問題解決策 | LANY竹内氏 × 世界へボカン徳田 | 越境EC特化の海外Webマーケティングカンパニー](https://www.s-bokan.com/interview/post-37945/)

## 調査

一般的に推定される原因例。どれも当てはまらないんだが。

### 一般的な見解

> * 低品質なコンテンツ
>   ~→ 内容・ボリューム的は十分かつ専門的だと思う。~
> * 重複コンテンツになっている
>   ~→ 重複要素はないと思う~
> * RSSフィード
>   ~→ RSSフィードではない~
> * ページネーションの2ページ目以降
> * 誤検知
[「クロール済み - インデックス未登録」の原因と解決方法3つを解説！](https://digitalidentity.co.jp/blog/seo/google-search-console/crawled-not-indexed.html)

### 専門家の見解

> ①サイト内/外で重複している、ページのユニーク性が低い
> ~→ ユニーク性は高いと思う。サイト外重複だとQiitaと重複？と思ったがそもそもQiita開始(**2025/1/20**)以前からの事象なので影響ないと思う。~ ②ひとつひとつのコンテンツの内容が薄いというもの
> ~→ 内容・ボリューム的は十分かつ専門的だと思う。~ ③コンテンツは頑張っていてもそもそも検索需要がない
> ~→ テック系の検索需要はある。~
[【永久保存版】クロール済みインデックス未登録問題解決策 | LANY竹内氏 × 世界へボカン徳田 | 越境EC特化の海外Webマーケティングカンパニー](https://www.s-bokan.com/interview/post-37945/)

### lighthouseで確認する

そもそもクローラーをブロックしてたりしないか、lighthouseでモバイルとPCビューを確認してみたが、SEO対策は100点で問題はなさそうだった。
[Lighthouseとは？Google公式SEOツールの機能と改善法を解説！](https://blog.microcms.io/what-is-lighthouse/)

![image 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417736/d232f89b-2e65-49fb-8b73-5a54de0bb0c4.png)

### 　Bloggerプラットフォーム問題

Bloggerではインデックス登録にまつわる問題が多く、Bloggerプラットフォームに由来していそう。
モバイルリダイレクトエラー(m=1問題)はCloudFrontを噛ませて改善したものの、`クロール済み - インデックス未登録`については原因不明で対策困難な状況。

Bloggerの`クロール済み - インデックス未登録`問題について網羅された記事で良くまとめられているが、結論は対策不可。
[bloggerの記事がインデックスされない！情報が少なく解決策もないのか-ぱち・すろ情報発信基地](https://pachisurotjouhoukyoku.blogspot.com/2025/02/blogger.html?m=1)

## 結論

異なるブログプラットフォームに移管する。

Bloggerでは広告無し・アドセンス広告を付けられる、js/cssの実装が開かれているのが個人的に気に入っていたが、コミュニティ機能がなくBlogger内の往来には期待出来ない分、オーガニックサーチが要なので、ここを断たれると致命的である。Googleがメンテナンスしないということは、サービス位置づけとしても低いと思われ、今後も期待できそうにない。
【バッチ】取得ログファイル名を年月日時にする

```
set yyyy=%date:~0,4%
set mm=%date:~5,2%
set dd=%date:~,2%

set time2=%time: =0%

set hh=%time2:~0,2%
set mn=%time2:~3,2%
set ss=%time2:~6,2%

set filename=%yyyy%%mm%%dd%-%hh%%mn%%ss%
```
filenameを任意の個所に%filename%で入力
【チーム開発】Git開発の基本


# 手順：リモート dev の更新を feature に反映する
## 1. リモートの最新情報を取得

git fetch origin

origin/dev にリモートの最新の dev ブランチの状態が入ります。

## 2. 作業中の feature ブランチにチェックアウト

git checkout feature

## 3. origin/dev を feature にマージ（またはリベース）

マージする場合：

git merge origin/dev


きれいな履歴を保ちたい場合（リベース）：


git rebase origin/dev



git fetch origin	リモートの更新を取得
git merge origin/dev	featureブランチにdevの更新を取り込む（マージ方式）
git rebase origin/dev	featureブランチにdevの更新を取り込む（リベース方式）

ちなみに

origin は、**リモートリポジトリのデフォルトの名前**です。
つまり、Gitで最初にリポジトリを clone すると、自動的にクローン元（GitHubなど）に origin という名前が付きます。

## プルリクエストについて
　プルリクエストは、VS Code上からでもGithub上からでも実施可能。
猫のマークのGitHub pull Request部分から「pull Request作成」をクリックすると、pull Requestの画面に遷移。ここでBaseやMERGEしたいブランチを指定する。
　Github上でも、Pullリクエストの作成からリクエストは作成できるので、臨機応変にプルリクエストを作るのがよい

一度、プルリクエストしたブランチに対しては、すでにプルリクエストがありますというエラーになる。

### 一度レビュー対応したプルリクエストに対して
　一度プルリクエストして、レビュー対応を実施するには、ローカルで修正して
 - ステージ
 - コミット
 - プッシュ　(git push origin "開発ブランチ")

こうすると自動的にgithubのリモート側のブランチが更新されて、前回との差分や更新されたファイルなどが表示されるようになる。

　また、削除したいファイルがあれば **ローカルで削除して、削除したものをステージしてコミット/プッシュ** すればそのファイルはリモート先でも削除される。

### Github上でMergeについて
　Github上では、プルリクエストに対して承認されれば、マージ先のブランチに対してマージのコミットが可能である。
 
　下記の画面で、(種類が何種類かありますが)緑色のボタンを押下すれば、コミットされて元のブランチにマージされる。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381629/23d3a600-6181-47d0-8689-2d26c259d273.png)
Grok3 + lumaAIでゲーム制作

# はじめに

AIを活用したゲームが続々と登場しています。
個人的に発表からずっと気になっているのは、CaseClosedというゲーム。
主人公は探偵となって様々な人を調査して、事件を解決するそうですが、こうした会話などに生成AIが活用されるのはとても面白いと思います。

https://store.steampowered.com/app/2532160/Case_Closed/?l=japanese

さて、Grok3などを活用することで、ゲームのシスステムの作成などが可能で、さらにはlumaAIなどの活用によってアセットの作成などが可能です。


今回こうしたものを参考にしながら、アドベンチャーゲームのプロトタイプを作成ています。

Twitterに投稿したものだとこういう感じ。

https://x.com/oggata/status/1904098258076791177?s=61

HuggingFaceで運用していこうと考えています。

https://huggingface.co/spaces/oggata/AIDetective_ShadowOfLatchford

# 手順を考える

生成AIを活用して、ゲームを作成する場合には、生成AIの使い方としては複数の方法が考えられます。

1　プログラムソースコード自体を生成する
2　アセットを生成する
3　あらかじめ、物語などの進行を考える
4  ユーザーの進行度などを把握し、状況に応じて判断を行う

などが考えられるかと思います。
以下に順を追って、作り方をまとめていきます。


## ゲームシステムの作成

Grok3にゲームのシステムを作成するように伝えます。

![IMG_0433.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/786a79e6-185a-4c79-bca6-1f713ab47c77.jpeg)

##  3Dアセットの生成

現状、アセットなどは個別に作成して、人間の目によって入れていく作業が現実的かと考えられます。今回利用したのはGenieと呼ばれる簡単な文字から3Dモデルを起こしてくれるようなサービスを活用しました。

https://lumalabs.ai/genie?view=create

横たわる体。青いテクスチャ。
![IMG_0419.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/4894456e-6b38-4d4b-a9bd-2b0dae6bdf07.jpeg)

フードを被った男
![IMG_0421.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/56f279f7-8d95-45d5-82af-8daf06238f03.jpeg)

# 物語の進行を考える


# リアルタイムでNPCのレスポンスを生成する
Expoを使う

# シンプルな構成で環境構築する
Expoの公式を見るとインストールするコマンドがあるが、複数のファイルがあってどうしたらいいかわからなかった？

https://docs.expo.dev/get-started/create-a-project/

シンプルな構成で使いたい。以下のコマンドを実行すると、必要最小限のファイルだけあるプロジェクトがインストールされる。

```shell
npx create-expo-app -t expo-template-blank-typescript
```

プロジェクト名を聞かれるので、`myapp`で作成した。　

ビルドするときは、iOS/Android/Webを選択することができる。

![スクリーンショット 2025-03-28 8.14.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4036518/e1b243fd-1b7a-4706-9649-a8677808a9c4.png)

Androidの場合は罠があって、Android Studioを起動してエミュレーターを立ち上げておかないとうまくいかない。

```shell
npm run android
npm run ios
npm run web
```

このような感じで使えます。

![スクリーンショット 2025-03-28 8.16.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4036518/6b6a4d87-c98d-4cc4-a84a-1bf831fcb5e7.png)

## まとめ
シンプルな構成で環境構築するのを今回はやってみました。学習方法ですが、公式のサイトと動画以外に、Udemyを活用すればアプリ開発の知識は学べました。JavaScriptでクロスプラットフォームの開発に興味がある方は試してみてください。

https://www.youtube.com/@ExpoDevelopers
windows11で、sketchup6 その7

# 概要
windows11に、sketchup6を入れてみた。
rubyで、3Dを書く。

# 練習問題
プリミティブを作れ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/c435e53b-0762-4414-8e2f-0fce911acb35.png)

# サンプルコード

```

require 'sketchup.rb'

def create_cube
	model = Sketchup.active_model
	entities = model.active_entities
	unit = 5
	p = Array.new
	p[0] = ORIGIN
	p[1] = [unit, 0, 0]
	p[2] = [unit, unit, 0]
	p[3] = [0, unit, 0]
	face = entities.add_face p
	face.reverse! if face.normal.z < 0
	face.pushpull unit
end

def create_cylinder
	model = Sketchup.active_model
	entities = model.active_entities
	h = 5
	r = 5
	n = 24
	circleBase = entities.add_circle(ORIGIN, Z_AXIS, r, n)
	base = entities.add_face(circleBase)
	base.pushpull h
end

def create_sphere
	model = Sketchup.active_model
	entities = model.active_entities
	r = 5
	n = 24
	circleBase1 = entities.add_circle(ORIGIN, Z_AXIS, r, n)
	circleBase2 = entities.add_circle(ORIGIN, X_AXIS, r, n)
	base = entities.add_face(circleBase1)
	status = base.followme(circleBase2)
end

def create_torus
	model = Sketchup.active_model
	entities = model.active_entities
	num_segments = 24
	center_radius = 5
	thickness = 1
	origin = [0, center_radius, 0]
	circle = entities.add_circle(origin, X_AXIS, thickness, num_segments)
	face = entities.add_face(circle)
	path = entities.add_circle(ORIGIN, Z_AXIS, center_radius, num_segments)
	face.followme(path)
end

def shapes
	puts "create_cube"
	puts "create_cylinder"
	puts "create_sphere"
	puts "create_torus"
end



```


以上。
windows11で、sketchup6 その6

# 概要
windows11に、sketchup6を入れてみた。
rubyで、3Dを書く。

# 練習問題
classテストを書け。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/28803f93-5f1d-40c5-ab11-e929672b5266.png)


# サンプルコード

```


require 'sketchup.rb'

def activeModelTest
	model = Sketchup.active_model
	if (model)
		UI.messagebox "Success"
	else
		UI.messagebox "Failure"
	end
end
def findSupportFileTest
	help_file = Sketchup.find_support_file "index.html", "Ruby/Docs/"
	if (help_file)
		UI.messagebox help_file
		UI.openURL "file://" + help_file
	else
		UI.messagebox "Failure"
	end
end
def formatAngleTest
	angle = Sketchup.format_angle 10
	if (angle)
		UI.messagebox angle
	else
		UI.messagebox "Failure"
	end
end
def formatAreaTest
	area = Sketchup.format_area 10
	if (area)
		UI.messagebox area
	else
		UI.messagebox "Failure"
	end
end
def formatDegreesTest
	degrees = Sketchup.format_degrees 10
	if (degrees)
		UI.messagebox degrees
	else
		UI.messagebox "Failure"
	end
end
def formatLengthTest
	length = Sketchup.format_length 10
	if (length)
		UI.messagebox length
	else
		UI.messagebox "Failure"
	end
end
def getLocaleSketchupTest
	locale = Sketchup.get_locale
	if (locale)
		UI.messagebox locale
	else
		UI.messagebox "Failure"
	end
end
def getShortcutsSketchupTest
	sc = Sketchup.get_shortcuts
	if (sc)
		UI.messagebox sc
	else
		UI.messagebox "Failure"
	end
end
def parseLengthTest
	length = Sketchup.parse_length "200"
	if (length)
		UI.messagebox length
	else
		UI.messagebox "Failure"
	end
end
def readDefaultTest
	Sketchup.write_default "Test", "TesterName", "Ohisama"
	value = Sketchup.read_default "Test", "TesterName" , "Ohisama"
	if (value)
		UI.messagebox value
	else
	   UI.messagebox "Failure"
	end
end
def sendActionTest
	result = Sketchup.send_action("selectMoveTool:")
	if (result)
		UI.messagebox result
		UI.messagebox "Success"
	else
		UI.messagebox "Failure"
	end
end
def setStatusTextTest
	UI.messagebox "Clearing the Status Line"
	Sketchup.set_status_text
	UI.messagebox "Setting the text in the Prompt Panel of the Status Line"
	Sketchup.set_status_text "This is a Test"
	UI.messagebox "Setting the text at a specific location: The VCB Label"
	Sketchup.set_status_text "Test:", SB_VCB_LABEL
end
def versionTest
	version = Sketchup.version
	if (version)
		UI.messagebox version
	else
		UI.messagebox "Failure"
	end
end
def versionNumberTest
	version = Sketchup.version_number
	if (version)
		UI.messagebox version
	else
		UI.messagebox "Failure"
	end
end
def writeDefaultTest
	value = Sketchup.write_default "Test", "TesterName", "Ohisama"
	if (value)
		UI.messagebox "Value Written:" + value
	else
	   UI.messagebox "Failure"
	end
end

def classtest
	puts "activeModelTest"
	puts "findSupportFileTest"
	puts "formatAngleTest"
	puts "formatAreaTest"
	puts "formatDegreesTest"
	puts "formatLengthTest"
	puts "getLocaleSketchupTest"
	puts "getShortcutsSketchupTest"
	puts "parseLengthTest"
	puts "readDefaultTest"
	puts "sendActionTest"
	puts "setStatusTextTest"
	puts "versionTest"
	puts "versionNumberTest"
	puts "writeDefaultTest"
end


```


以上。
Deno on GitHub Workspace


```sh
curl -fsSL https://deno.land/x/install/install.sh | sh

# Edit shell configs to add deno to the PATH? (Y/n) █
## Y

# Set up completions?
# [x] bash
# [ ] zsh
# [ ] fish
```

```sh
deno -v
# deno 2.2.5
```

.vscode/settings.json
```json
{
  "deno.enable": true,
  "deno.lint": true,
  "editor.tabSize": 2,
  "editor.formatOnSave": true
}
```

deno.json
```json
  "nodeModulesDir": "auto"
```
RailsデフォルトのDevcontainer でBundlerキャッシュを使う


Rails newする時、`--devcontainer` オプションを指定することで、Devcontainer を使った開発環境を構築することができます。

この時構築されるDevcontainer の環境はbundle install されたgem のキャッシュが使われていません。
そのため、bundle install が走るたびにgem のダウンロードが発生するため、Devcontainer 立ち上げの度に時間がかかります。

`compose.yml` のvolume の設定を追加することで、bundle install されたgem のキャッシュをすることができますが、Devcontainer の場合は、Rails 公式から、features として提供されています。

```json:.devcontainer/devcontainer.json
{
  "name": "rails_sample",
  "dockerComposeFile": "compose.yaml",
  "service": "rails-app",
  "workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}",
  "features": {
    // ここに追加する
    "ghcr.io/rails/devcontainer/features/bundler-cache:1": {},
  },
  "forwardPorts": [
    3000,
    3306
  ],
  "postCreateCommand": "bin/setup --skip-server",
  "postStartCommand": "bundle check || bundle install"
}
```

実際にDevcontainer を立ち上げると、postCreateCommand で設定したbundler-cache のfeatures がなんか実行されていることがわかります。

```shell
Running the postCreateCommand from Feature 'ghcr.io/rails/devcontainer/features/bundler-cache:1'...

[45943 ms] Start: Run in container: /bin/sh -c sudo chown -R ${USER} /bundle
```

https://github.com/rails/devcontainer/tree/main/features/bundler-cache

`features/bundler-cache/devcontainer-feature.json` を見るに、volumes を設定、インストール先のディレクトリの権限変更をfeatures を呼ぶことで実現してくれているようです。

Dockerfile でディレクトリ作って権限設定したり、volume を設定する手間が省けるので、便利だなというtipsでした。

Rails 公式で提供されているfeaturesなので、のちにデフォルトで入りそうな気もしますね :eyes:

また、Rails 公式のfeatures は他にもあるので、興味があれば見てみると良いかもしれません。
競プロ日記#25/03/28

# アルゴ式-[積の総和 (1)](https://algo-method.com/tasks/9371And)
- 単純にfor文を二重で回せば答えは出せるがその場合は最大(10⁵)² = (10)¹⁰回の計算が必要になる
- AiもAjも結局は0~N-1まで回す以上は∑計算の最終的な結果は同じで和をSとすると総和はS²となる

# アルゴ式-[積の総和 (2)](https://algo-method.com/tasks/16834Gvw)
- 結構難しかった。恥ずかしながらChatGPT先生に方針を聞いた。
- 組み合わせ（Combination）と∑の関係について紐づける力が足りなかった。総和の2乗と二重和から求めるという発想
タイトル M3GNETとQuantum ESPRESSOにおける計算精度および計算時間の比較 Comparison of Computational Accuracy and Computational Time between M3GNET and Quantum ESPRESSO

# １．はじめに

　マテリアルズインフォマティクス（MI）は、材料科学における新たなアプローチとして注目されており、第一原理計算や分子動力学（MD）計算を活用しながら、機械学習を用いた予測モデルの構築が進められてきました。しかし、MIの実用化にはいくつかの大きな課題が存在します。第一原理計算（DFT）は非常に高精度ですが、計算コストが極めて高く、大規模な材料探索には適していません。また、分子動力学（MD）計算では適切な力場が必要であり、新しい材料系には適用が難しいことが多いです。その解決策として、機械学習を用いたニューラルネットワークポテンシャル（NNP）が注目されています。本記事では、M3GNET（Materials Graph Neural Network）がどの程度の精度で実用的に使えるのかを評価することを目的とします。特に、第一原理計算ソフトウェアであるQuantum　ESPRESSO（QE）と比較しながら、M3GNETの利点と限界を明確にし、どのような場面で活用できるのかを探ります。

 # ２．比較条件および概要
 
本研究では、白金（Pt）スラブ表面における水（H₂O）の吸着挙動を評価するために、吸着エネルギーおよび原子間距離の変化を解析し、QEとM3GNETの計算精度と計算時間を比較しました。
使用したモデル
Ptスラブ
H₂O分子（吸着種）
Pt-H₂O吸着モデル（Pt表面上の水分子の分離シミュレーション）

![unnamed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4022238/056f02da-9706-4c40-a24f-f2cf41cf8b60.png)
*Figure 1: Structure of Pt slab, H₂O molecule, and Pt-H₂O adsorption model*

使用した計算環境
- Quantum ESPRESSO（QE）: 32 vCPUs @ Intel Xeon Platinum 8473C
- M3GNET: NVIDIA A100 1GPU

シミュレーションに用いたソルバー
- Quantum ESPRESSO（QE）: バージョン7.3を使用し、k点はガンマ点、カットオフエネルギーは適切に設定。使用した擬ポテンシャルは標準的なPBE-GGAに基づくものを採用。
- M3GNET: NanoLaboが提供するLAMMPS連携のM3GNETを利用し
ポテンシャルにはM3GNet-MP-2021.2.8-PESを使用した。

# ３．比較結果

本研究では、Ptスラブ上における水の吸着エネルギーを評価することで、M3GNETとQEの精度を比較しました。具体的には、スラブPt、単体H₂O、そしてPtスラブ上にH₂Oを配置したPt-H₂Oモデルのエネルギー値を計算し、それらの差分を求めました。以下の表は、QEとM3GNETにおけるエネルギー値（eV）を比較したものです。ΔEは式（１）から算出しています。
ΔE = E（Pt-H₂O） - E（スラブPt） - E（H₂O)（1）

![figure1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4022238/6590f0e9-7638-4e59-8ae9-536be5c4144d.png)

これらの結果から、M3GNETは定性的な傾向を再現できるものの、エネルギー値の精度には若干の差があることが分かりました。ΔEには小さな差異が見られたものの、その符号は一致していました。Ptスラブ上にH₂Oを配置したPt-OH-Hモデルの最適化結果を比較したところ、OHとHの分離後に付着するPtの位置が異なるため、視点によって構造の見え方が異なりますが、最適化された構造自体は類似しており、M3GNETの最適化構造はQEとよく一致していました（Figure 2）。

![unnamed (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4022238/2b44a277-ecca-4327-8122-947fbc61be52.png)
*Figure 2: Optimized Structures of Pt-H₂O Model Using QE and M3GNET*

計算時間では、顕著な差が見られました。以下の図は、QEとM3GNETにおける計算時間（Wall Time）の比較を示しています。

![unnamed (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4022238/498df1c2-037e-4822-b237-77d68fe4a387.png)
*Figure 3: Speedup Comparison of QE and M3GNET in Wall Time*

このグラフからも明らかなように、M3GNETはQEと比較して大幅に短い時間でエネルギー計算を実行できることが確認されました。
- Ptモデルでは約 356倍 の高速化
- H₂Oモデルでは約 23倍 の高速化
- Pt-OH-Hモデルでは約 610倍 の高速化

このように、M3GNETは第一原理計算と比較して数百倍の計算速度向上を実現しており、大規模な材料探索や分子動力学（MD）シミュレーションにおいて極めて有用であると考えられます。

# ４．まとめ

本記事では、M3GNETの精度と計算時間の観点から、DFTと比較しました。その結果、M3GNETは大規模な材料探索において非常に有用である。
ΔEには若干の差が見られたものの、M3GNETの結果はQEと定性的に一致しており、最適化構造も類似していることが確認されました。特に、計算時間に関してはM3GNETが圧倒的に高速であり、Ptモデルで約356倍、H₂Oモデルで約23倍、Pt-OH-Hモデルでは約610倍の高速であったことから、電子構造やバンド計算などの詳細な物性解析には依然としてDFTが必要ですが、大規模な分子動力学シミュレーションやスクリーニングにはM3GNETが大いに役立つことが確認されました。M3GNETを用いることで、これまで時間的・計算資源的に不可能だった大規模シミュレーションが可能となる。
さらに、M3GNETはMIにおいても有用であり、材料候補のスクリーニングや特性予測を迅速に行うための強力なツールとなり得ます。従来の第一原理計算では時間がかかる大規模な材料探索を効率的に進めることで、新しい材料の発見や設計を加速する可能性を持っています。
次回の記事では、M3GNETを用いたスクリーニングや材料予測の具体的な活用方法について紹介します。

キーワード：
#M3GNET #GNN #QuantumESPRESSO #LAMMPS #MaterialsInformatics #MI
node 管理ツール: Volta, Proto

# Volta
## 概要
https://volta.sh/

Node (npm, pnpm, yarn) のバージョン管理ができる、javaScript ツールマネージャー。

## 導入・削除方法
### install
https://docs.volta.sh/advanced/installers

公式の方法で良さそう。

※ 予めローカルの node は削除しておくこと。

※ homebrew でのインストールは非推奨ぽそう。やはり公式が最大手。

https://zenn.dev/protoout/articles/17-how-to-nodejs-install

### uninstall
https://docs.volta.sh/advanced/uninstall

こちらも公式の方法で。

# Proto
## 概要
https://moonrepo.dev/proto

Bun, Deno, Node (npm, pnpm, yarn), Rust, Go などのバージョン管理ができる、javascript ツールチェーン。

## 導入・削除方法
下記サイトが一番わかりやすそう。

https://zenn.dev/asip2k25/articles/d8962abf6333f3

### install
https://moonrepo.dev/docs/proto/install

公式で良さそう。
公式が自動で環境変数設定してくれるので、mac は `~/.zshrc` を選択すること。設定後、`source ~/.zshrc` で更新する。

### uninstall
`rm -rf ~/.proto` して削除。
mac なら、`~/.zshrc` から自動で設定された下記環境変数を削除する。
```shell
# proto
export PROTO_HOME="$HOME/.proto";
export PATH="$PROTO_HOME/shims:$PROTO_HOME/bin:$PATH";
```

## 使い方
下記サイトが一番わかりやすそう。

https://zenn.dev/smartcamp/articles/d185f46f603858


### [ツールのインストール](https://moonrepo.dev/docs/proto/tools)
```shell
$ proto install node
```

### [ツールの実行方法](https://moonrepo.dev/docs/proto/workflows)
```shell
# 下記どちらも同一
$ proto run node -- --version
20.0.0

$ node --version
20.0.0

# ツールの場所
$ which node
~/.proto/shims/node
```

### [ディレクトリごとにバージョンの固定](https://moonrepo.dev/docs/proto/detection)
※ [`./.prototools` に記録](https://moonrepo.dev/docs/proto/commands/pin)される
```shell
proto pin node 18.0.0
```

### [ツールのアンインストール]()
```shell
$ proto uninstall node 18.0.0

# 該当ツールの全バージョン削除
$ proto uninstall node
```
JavaScript、TypeScript、jQueryの違いを解説


Web開発を学び始めるとよく聞く「JavaScript」「TypeScript」「jQuery」。
これらはすべてWebアプリケーションの開発に関連する技術ですが、それぞれ役割や特徴が異なります。

この記事では、初心者の方にも理解しやすいように、それぞれの技術についての解説と違いを整理して紹介します。



## JavaScriptとは？

JavaScriptは、Webブラウザ上で動作するプログラミング言語で、HTML・CSSと並ぶWeb開発の三大要素の一つです。

### 特徴
- ユーザーの操作に応じてWebページの見た目や動作を動的に変えることができる
- ブラウザ上で直接実行可能
- サーバーサイド開発（例：Node.js）やモバイルアプリ開発（例：React Native）などにも応用される

### コード例
```javascript
function greet(name) {
  alert("Hello, " + name);
}
```



## TypeScriptとは？

TypeScriptは、JavaScriptに型の概念を加えた拡張言語で、Microsoftによって開発されました。

### 特徴
- 静的型付けにより、コードの誤りを実行前に検出できる
- JavaScriptにコンパイルして実行する
- エディタでの補完機能や文法チェックが強化される

### メリット
- 大規模開発やチーム開発に適している
- 保守性・可読性が高い
- エラーが事前にわかるため、バグの混入を防ぎやすい

### コード例
```typescript
function greet(name: string): string {
  return "Hello, " + name;
}
```



## jQueryとは？

jQueryは、JavaScriptで行う処理を簡潔に記述できるようにしたライブラリで、2006年に登場しました。当時はブラウザ間の互換性の違いが大きく、それを吸収する役割として多くの支持を集めました。

### 特徴
- HTML要素の取得・操作が簡単にできる
- Ajax通信やアニメーション処理が簡潔に書ける
- ブラウザ間の動作差を気にせずコードが書ける

### コード例
```javascript
$("#my-button").click(function() {
  alert("ボタンがクリックされました！");
});
```

### 現在の立ち位置
- モダンブラウザの標準機能が充実してきたため、新規開発での使用は減少傾向
- ただし、既存のシステムや保守案件では今なお多く利用されている



## ３つの違いを比較表で整理

| 技術名 | 種類 | 主な特徴 | 主な用途 |
|--------|------|------------------|-------------------------------|
| JavaScript | プログラミング言語 | Webの基本言語 | フロントエンド、サーバーサイド、モバイルアプリなど |
| TypeScript | JavaScriptの拡張言語 | 型安全・エラー検出 | 中〜大規模アプリ開発、保守性重視の案件 |
| jQuery | JavaScriptライブラリ | 簡潔な記述、互換性の吸収 | レガシーシステムの保守、軽微なUI操作の実装 |



## 初心者はどれから学べばよい？

まずは**JavaScriptの基礎**をしっかり学ぶのが最優先です。Webの基本を理解したうえで、保守性や開発効率を高めたい場合には**TypeScript**を学び始めると良いでしょう。

**jQuery**については、現在では新規開発で使われることは少なくなってきましたが、過去の資産を扱う場面や、簡単な操作を素早く実装したい場合に役立つことがあります。



## まとめ

- **JavaScript**：Web開発の基礎となる言語。必ず学ぶべき。
- **TypeScript**：型によるエラーチェックが可能な拡張言語。中〜大規模開発に最適。
- **jQuery**：JavaScriptの処理を簡潔に書くためのライブラリ。現在は保守案件向け。

これらの違いを理解することで、自分が学ぶべき技術や、プロジェクトに適した選択ができるようになります。
SwiftUIにおける @Environment(\.displayScale) の更新タイミング

`EnvironmentObject` が便利なので、App全体で使うような変数を `environmentObject` として `App` でセットしてどこからでも参照できるようにしようとしてみたが、これは期待通り動かない。端末問わず常に `displayScale = 1.0` となってしまう。

```swift
@main
struct SampleApp: App {
    @Environment(\.displayScale) var displayScale

    var body: some Scene {
        WindowGroup {
            RootScreen()
                .environmentObject(
                    AppEnv(
                        displayScale: displayScale // NG: 常に 1.0
                    )
                )
                .onAppeer {
                    print(displayScale)  // NG: 常に 1.0
                }
        }
    }
```

正しくは、各Viewで都度 `displayScale` を定義して `body` の中で参照してやる必要がある。

```swift
struct TopView: View {
    @Environment(\.displayScale) var displayScale

    var body: some View {
        MainView()
            .onAppeer {
                print(displayScale)  // 👌 iPhone16なら "3.0" 
            }
    }
}
```

それにしても久しぶりにQiita書いたな
最近はZennとか個人ブログに書くのが流行ってるのかな
アパレル系小売企業の情シス

# アパレル系小売の情シス、やってます

服装自由だからという軽率な理由で、アパレル系小売企業の情シス（情報システム部門）をやっています。
機密保持に関わらない範囲で、業務内容をざっくりご紹介します。

## 自己紹介

**私**：30代情シス平社員。
昇進の気配が全然ないので、仕事をしながら就活中。
新卒で働いてた会社を辞めて、次の会社で情シスになってからずっと情シス畑。
コミュニケーション能力は高いらしい。でも社員からの評判はいいと自負。
趣味はオタク趣味全般。同人活動やそれに伴う企画運営もやったりしています。

## 会社の規模感

- **従業員数**：多分500人くらい
- **PC台数**：350台くらい
- **サーバー台数**：10台くらい

## 業務内容

ざっくり思いつくだけでもこんな感じ。

1. **ヘルプデスク業務**
2. **ストレージの容量管理**
3. **アカウント関連の管理（棚卸し含む）**
4. **サーバー類の保守管理**
5. **PC・モバイル端末のキッティングや管理**
6. **催事・ポップアップストアの設営撤収**


思いついただけでこれなんだけど、これと並行して支払い依頼作業とか、備品の管理とか
本当にまじでPCに関することは何でもやってる自覚はある
本当にデジタルお助け屋さんみたいな感じ


---

### 1. オフィス・店舗のヘルプデスク
この業務が全体の7割くらいを占めます。いやマジで。
PCやExcelの操作、基幹システムの使い方、時には専門外の相談まで、何でもかんでも聞かれます。
何度も同じ質問を受けるので、自分が自動応答Botなんじゃないかと錯覚することも。
まあ、聞いてもらえるうちが華だし、愛想だけは5億点満点なので評判は◎。
社内人気投票みたいなので賞をもらったこともあります。
ただし、この業務に時間を取られすぎて自分の業務が全く進まないのが悩み。
将来的には社内Wikiや自動応答Botを導入できればな～。
あと、最近「チケット制で対応してる会社がある」って知ったんだけど、めちゃくちゃ気になる。
チケット制に近いことを後輩を唆してやろうとしてるんだけど、最近は年度末だから追いついてないね～

### 2. 棚卸作業

- **アカウント棚卸し（4ヶ月に1回）**
- **情報資産の棚卸し（年1回）**

四半期ごとにやってるやつ。
引き継いだ時はかなり力ずくな感じでチェックしてたけど、ローコード開発と私の関数レベルアップにより、かなり効率化されたはず……。
もっと楽になりたい。

### 3. GPO保守管理
ADのポリシー制御をもっとちゃんとやりたい。
win11になるから色々整理したいんだけどその他の雑務がまじで多くて追いついてないよお～ん

### 4. サーバー類の保守管理
とはいえ、実態はベンダー任せ。これを「保守管理」と呼んでいいのか……？という気持ちが日々湧く。
って思ってたんですけどWSUS用の鯖とかなんやかんや自社で建ててる鯖の管理を最近してます

### 5. PC・モバイル端末のキッティングや管理
マスターイメージを作って展開しています。
自作PC好きなので、こういう作業はわりと楽しめます。数年前にPCを全台リプレースしたおかげで修理案件が減り、業務量も減少。

しかし、現在はWindows 11への全社移行作業がメイン。これがほぼ主業務。

### 6. 催事・ポップアップストアの設営撤収
肉体労働＋休日出勤で本当にキツい。
会場にLANケーブルを配線したりと、IT業務とはいえ物理作業が発生。
最近は後輩に引き継ぎ完了。今までありがとう。

---

## 最近の取り組み

これを最初に書いた時から結構時間が経ちましたが、今はこれにプラスして**GPTを活用したローコード開発**を行い、勝手に業務効率化を進めています。

## なお、給料は……

全然少ないので、絶賛求職中です。

備忘録程度に色々書いていくつもりです
よろしくお願いいたします。