OmniAICreator/Qiita-1.07M huggingface dataset:
【SadServers学習メモ #3】使ったコマンドまとめ（awk, grep, view）

# 初めに
Linuxの学習目的で`SadServers`を始めました。
備忘のために使用したコマンドをアウトプットします。

# SadServersとは
Linuxの学習サイト。
架空のサーバを題材とし、その管理者となって与えられた依頼をこなしていく。
実際にコマンドを使って作業をすることで、実践的なスキルが身につくことが期待できる。

https://sadservers.com/

# 今回のお題
## タイトル
["The Command Line Murders"](https://sadservers.com/scenario/command-line-murders)

## 詳細
* 以下で公開されている課題を解く
  * ある町の事件に関する資料
  * 資料を見て犯人を特定する

https://github.com/veltman/clmystery


## 作業の流れ
各種コマンドを使用し、犯人を特定する
※ネタバレになるので詳しい手順は割愛します。

# 使ったコマンド
## awkコマンド
ファイルから文字列を抽出するコマンド。

```sh
$ awk 'パターン { アクション }'
```

* パターンには抽出する行の条件を記載する。
* アクションには抽出した行に対してどんな処理を行うかを記載する。

※前回の記事でも解説したので良ければご覧ください。

https://qiita.com/nnhkrnk/items/41a09121a279d7da4a9d#awk%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89


### 例）
以下のファイルから女性の名前を抽出したい
```txt: 抽出元ファイル
NAME	GENDER	AGE	ADDRESS
Alicia Fuentes	F	48	Walton Street, line 433
Jo-Ting Losev	F	46	Hemenway Street, line 390
Elena Edmonds	F	58	Elmwood Avenue, line 123
Naydene Cabral	F	46	Winthrop Street, line 454
Dato Rosengren	M	22	Mystic Street, line 477
Fernanda Serrano	F	37	Redlands Road, line 392
Emiliano Wenk	M	90	Paulding Street, line 490
Larry Lapin	M	71	Atwill Road, line 298
```

```sh: 抽出結果
$ awk '$3 ~ F {print $1, $2}' file
Alicia Fuentes
Jo-Ting Losev
Elena Edmonds
```
* パターンには抽出する行の条件を記載
  * `~`は等しいという意味
* `print`ではカンマ区切りをすることで間にスペースを入れることができる

## grepコマンド
ファイルから特定の文字が含まれる行を抽出するコマンド

```sh
$ grep 検索文字列 検索対象ファイル
```

※以前こちらの記事で解説したので良ければご覧ください

https://qiita.com/nnhkrnk/items/a37317938ef155f734f2

### 例1）二つのファイルに共通する行を抽出したい

```txt: ファイル1
Jo-Ting Losev
Dato Rosengren
```

```txt: ファイル2
NAME	GENDER	AGE	ADDRESS
Alicia Fuentes	F	48	Walton Street, line 433
Jo-Ting Losev	F	46	Hemenway Street, line 390
Elena Edmonds	F	58	Elmwood Avenue, line 123
Naydene Cabral	F	46	Winthrop Street, line 454
Dato Rosengren	M	22	Mystic Street, line 477
Fernanda Serrano	F	37	Redlands Road, line 392
Emiliano Wenk	M	90	Paulding Street, line 490
Larry Lapin	M	71	Atwill Road, line 298
```

```sh: 実行結果
$ grep -Ff file1 file2
Jo-Ting Losev	F	46	Hemenway Street, line 390
Dato Rosengren	M	22	Mystic Street, line 477
```
* 検索文字列にファイルを指定する場合は`-f`を用いる
* `-F`を用いることで、固定文字列で検索することができる（正規表現を使用しない）
  * 今回は空白を含むため`-F`を用いた
* 検索結果の文字列は第二引数のファイルになる

### 例2）標準入出力（`|`）で送られてきた文字列で検索する

```
$ grep -Ff file1 file2 | grep -F - file3
```

* 標準入出力の値を指定する時は`-`を使用する


### 例3）検索結果の周辺の行を表示する

```txt: 検索元ファイル
License Plate T3YUHF6
Make: Toyota
Color: Yellow
Owner: Jianbo Megannem
Height: 5'6"
Weight: 246 lbs

License Plate EZ21ECE
Make: BMW
Color: Gold
Owner: Norbert Feldwehr
Height: 5'3"
Weight: 205 lbs
```


```
$ grep 'Toyota' -A 4 -B 1
License Plate T3YUHF6
Make: Toyota
Color: Yellow
Owner: Jianbo Megannem
Height: 5'6"
Weight: 246 lbs
```

* `-A`と`-B`と`-C`で抽出結果の前後も表示することができる
  * `-A`：検索結果の後n行
  * `-B`：検索結果の前n行
  * `-C`：検索結果の前後n行


## viewコマンド
ファイルを読み込み専用で開く
viの読み込み専用版

```
$ view ファイル名
```

* `:set number`で行数を表示する
* `/文字列`で文字列を検索する
  * 検索後は`n`で検索箇所を移動できる

# 回答
※ネタばれになってしまうので割愛します。

# 終わりに
今までの問題とは違いましたが、謎解きしながらコマンドが学べるのは面白かったです。
全部英語なので苦労しましたが、なんとか雰囲気でクリアすることができました。

ここまでご覧いただきありがとうございました！
はじめての OpenAI Codex #1 ― APIキー取得から「Hello, World」生成まで①

# はじめての OpenAI Codex #1 ― APIキー取得から「Hello, World」生成まで

## 1. Codexって何者？
- GPT‑3 系列の **コード特化モデル**  
- **入力**：自然文＋途中までのコード  
- **出力**：続きを自動生成  

## 2. OpenAI アカウント＆APIキー
1. OpenAI公式サイトでアカウント作成 → <https://platform.openai.com/signup>  
2. Dashboard → **API keys** → “Create new secret key” をクリックし、キーをコピー  
3. `.env` に保存して安全に管理します  
```env
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxx
```

## 3. Python から呼び出す
### 3‑1. ライブラリをインストール
```bash
pip install openai python-dotenv
```

### 3‑2. サンプルコード
```python
# codex_hello.py
import os, openai
from dotenv import load_dotenv
load_dotenv()

openai.api_key = os.getenv("OPENAI_API_KEY")

prompt = "Write a Python function that prints 'Hello, World!'"

resp = openai.Completion.create(
    model="code-davinci-002",
    prompt=prompt,
    max_tokens=60,
    temperature=0
)

print(resp.choices[0].text.strip())
```

## 4. 実行結果
```python
def hello():
    print("Hello, World!")
```

## 5. パラメータ解説
| 引数 | 意味 | 推奨値 |
|------|------|--------|
| `model` | 使用モデル | `code-davinci-002` など |
| `prompt` | 入力プロンプト | 自然文＋コード | 
| `max_tokens` | 生成トークン上限 | 60〜200 |
| `temperature` | 出力の多様性 (0＝決定的) | 0〜0.3 |

## 6. よくあるエラー
| エラー | 対処 |
|-------|------|
| `InvalidRequestError: You must provide an api_key.` | `.env` のキー名とコード側が一致しているか確認 |
| `RateLimitError` | 無料枠超過。ダッシュボードで残高を確認するか課金設定を行う |

## 7. 次回予告
> **Day 2：VSCode拡張 “GitHub Copilot” でリアルタイム補完を体験**  
> コードを書くたびに Tab 一発で AI が続きを提案！お楽しみに。
PHP：ビルトイン関数と自作関数の違い、ざっくりまとめてみた

## はじめに

この記事では、PHPの関数について、基礎的な部分を簡単に整理してまとめています。特に「ビルトイン関数」と「ユーザー定義関数」の違いを中心に解説します。

## 書こうと思ったきっかけ

個人的にPHPのキャッチアップをしたくて、勉強している初学者による備忘録として記録しています。

:::note info
**個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**
:::

日々の学習の中で「***あれ？この関数ってどこから来てるの？***」と思うことが多く、整理しておくと理解が深まると感じたためです。

## 内容

### 関数とは？

関数は「何かの処理をまとめて名前をつけたもの」です。何度も使いたい処理を再利用しやすくするために使います。

### ビルトイン関数（組み込み関数）

PHPには最初から使える関数がたくさん用意されています。これらを「ビルトイン関数」といいます。

https://www.php.net/manual/ja/functions.internal.php

#### 関数の例（※個人的な備忘録です）

* `var_dump($value)`：変数の中身や型を詳しく表示する。

  ```php
  $x = [1, "apple", true];
  var_dump($x);
  ```

**実際の画面**

![スクリーンショット 2025-05-18 9.55.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/90107c14-bf86-461b-8092-6feb40f2675f.png)

**参考文献**

https://www.php.net/manual/ja/function.var-dump.php

https://online.dhw.co.jp/kuritama/function-tools-be-used-for-debugging-php/

* `strlen($text)`：文字列の長さを取得する。

  ```php
  $text = "こんにちは";
  echo strlen($text);  // マルチバイト文字に注意（日本語は1文字=3バイト）
  ```

**実際の画面**

![スクリーンショット 2025-05-18 9.57.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/29777f11-156b-4e4a-9199-4dcd4cfca8ac.png)

**参考文献**

https://www.php.net/manual/ja/function.strlen.php

https://qiita.com/nagao-koyanagi/items/282a9f00acd4944b363d

* `isset($var)`：変数が定義されているか、nullでないかを確認する。

  ```php
  $name = "たろう";
  if (isset($name)) {
      echo "定義されています";
  }
  ```

**実際の画面**

![スクリーンショット 2025-05-18 9.59.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/5bd5f460-827c-4d5e-a6d6-14dc246fd1ba.png)

**参考文献**

https://www.php.net/manual/ja/function.isset.php

* `array_merge($a, $b)`：配列を結合する。

  ```php
  $a = ["赤", "青"];
  $b = ["緑"];
  $result = array_merge($a, $b);
  ```

**実際の画面**

![スクリーンショット 2025-05-18 10.02.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/e7e18835-1470-4077-aeaf-0ff8d03b6c00.png)

**参考文献**

https://www.php.net/manual/ja/function.array-merge.php

### ユーザー定義関数（自分で作る関数）

自分で作成する関数のことを「ユーザー定義関数」といいます。

```php
<?php
function sayHello($name) {
  echo "こんにちは、" . $name . "さん！";
}

sayHello("たろう");
?>
```

**実際の画面**

![スクリーンショット 2025-05-18 9.47.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/285a3b9a-3ee3-4f1f-a5ad-0f1a20ba6a66.png)


引数を使って値を受け取り、`echo` や `return` で処理の結果を返すことができます。

## まとめ

PHPには最初から用意された「ビルトイン関数」と、自分で作れる「ユーザー定義関数」があります。

:::note info
それぞれの役割を理解しておくと、より効率的にコードを書くことができると感じました...！
:::

内容はあくまで自分用の備忘録ですが、今後は無名関数やクロージャ、型指定など、より応用的な関数の使い方も学んでいく予定です。
【初手】サ〇ーウォーズの誕生日当てで分かるFastAPIとVSCodeなど_4.その後

## これは何の記事
サ〇ーウォーズの誕生日当て Web アプリを通して，
以下のことを学んでいく記事です

- VSCode で FastAPI を使った開発をする方法
- フロントからバックまでの開発方法をざっくり

## 今回の内容
一旦作り終えたので，その後何を学習したら良さそうかを書いていきます

## Python の学習

### 基礎試験の学習をしてみる
資格試験に沿って学習するのが効率よいと思います
目標を見失ったりしないので
基礎試験のレベルであればお金をかけなくてもなんとかなると思います

- [試験の公式サイト](https://cbt.odyssey-com.co.jp/pythonic-exam/python3basic.html)
- [無料の問題演習サイト](https://python-basic.com/)
- [Python 公式のチュートリアル](https://docs.python.org/ja/3.13/tutorial/index.html)

### 簡単に試せる Google Colab
`VSCode` を入れるのが面倒，
`Python` インストールとか面倒...

そんなあなたにこれです
Google アカウントがあれば Web 上ですぐ `Python` がかけます

https://colab.research.google.com/?hl=ja


## FastAPI
公式のチュートリアルを見て，
もっと `FastAPI` を知っていくと，
色々とできることが増えていきます

https://fastapi.tiangolo.com/ja/learn/

## SQL
データベースを使わないことはあまりなく，
まだまだ `RDS` は健在です

`SQL` がわかる，`Python` からデータベースを操作する術を身につけましょう

https://qiita.com/kojiro513/items/f3e6302d4d3e286633c3

https://qiita.com/soiSource/items/1ebbce5acae411c6956b

https://reffect.co.jp/python/python-sqlite-database

https://qiita.com/soiSource/items/7e02ceb5e15abca88968

## その他の Python Web アプリフレームワーク
以下が有名どころです
それぞれ得意不得意ありますので，
自分がやりたいことに合わせて選べると良いですね

- Django
- Flask
- Bottle

## フロントエンド
今回は簡単のため，生の `JavaScript` を使いました
因みに，生の `JavaScript` を `Vanila JS` と言ったりします

http://vanilla-js.com/

話がそれましたが，
フロントエンドで `Vanila JS` だけを使う何てことはないと思います
フロントエンドにも言語，ライブラリやフレームワークがあり，
効率的に開発ができます

有名どころはここら辺です

- TypeScript (現代の JavaScript です(?))
- React
- Vue
- Next.JS
- Nuxt.JS
- Lit
- Astro

## Markdown
書きやすくて読みやすいテキストの書き方です
使えると簡単に分かりやすい見た目のテキストを書けるようになります
`Python` の学習より簡単です

この記事も `Markdown` で書かれています
他にも色々なところで使える記法です
エンジニアなら `Markdown` を使って書けｔ欲しいという意見が
あったりなかったりです

https://qiita.com/Qiita/items/c686397e4a0f4f11683d

https://www.sejuku.net/blog/78156#index_id1
HHKBを使ってわかったエンジニア視点のリアルなメリット・デメリット

 “プログラマーが理想とするキー配列のキーボード”——HHKB（Happy Hacking Keyboard）。
 
 Qiita をご覧のみなさんの中にも、気になっている方は多いのではないでしょうか。

## なぜこの記事を書くのか
エンジニアにとって**キーボードは最重要クラスの仕事道具**です。

Mac のトラックパッド派という方もいるかもしれませんが、ノート PC に備え付けのキーボードを長時間使うと、どうしても猫背になりがち。

外付けキーボードを導入すれば、姿勢改善だけでなく作業効率も向上します。

「外付けとかめんどいし、ましてやHHKBとか高くない？」

私もそう思っていた時期がありました。

若いときはいいですが、年取ってからのほうが人生長いです。
長く戦えるエンジニアになるためには、日々使うデバイスにはお金をかけるべきと私自身は思っています。

そこで今回は、私が HHKB を 1 年以上使って感じたメリットとデメリットを、**エンジニア視点に絞って**まとめます。購入を迷っている方の参考になれば幸いです。

---

## HHKB を使って良かったところ

### 1. キー割り当てを柔軟に変更できる
複数の端末（会社では Mac、自宅では Windows など）を併用しているエンジニアは少なくありません。

OS が変わるとショートカットの位置が微妙に異なり、ストレスの原因になります。

HHKB Professional Hybrid なら専用ツールで**キーマップを本体に書き込める**ため、どの端末につないでも同じ配列で使えます。

かな変換の位置はさすがに合わせづらいですが、Karabiner-Elementsを併用すれば macOS でもほぼストレスフリー。

https://karabiner-elements.pqrs.org/

Windows の PrintScreen、macOS のスクリーンショットもワンキーで統一できました。

### 2. 掃除がしやすい
エンジニアは PC の前で食事をしたり、エラーが解決できないときに頭をポリポリしたり……

とにかく**キーボードにゴミが溜まりがち**。

HHKBはキーキャップを簡単に外せるので、定期的に水洗いできます。

![Something went wrong]()


PCやパンタグラフ式と違い、掃除が「やろうと思えばすぐできる」点は大きなメリットです。

### 3. 壊れにくい & 乾電池式で長寿命
安価なキーボードは半年〜1 年でチャタリングが発生することも珍しくありませんが、HHKB は静電容量無接点方式で **物理接点がないため極めてタフ**。

しかも乾電池駆動なので内蔵バッテリーの劣化を気にせず、エネループ運用なら半永久的に使えます。

### 4. ~~かっこいいのでモチベが上がる~~
デザインは好みの問題ですが、色違いのキーキャップや無刻印モデルも選べるので、デスク周りのテンションが確実に上がります。

---

## 使ってみて感じたイマイチなところ

### 1. Fn キーがない（左小指酷使問題）

HHKB には専用の Fn キーがありません。数字列をファンクションキーとして使う設計なので、`Fn + 数字` の同時押しが必須。

エディタのショートカットキーもファイル名の変更やSQLの実行などFnキー使うこと多いです。

特に**日本語入力で F10（全角→半角）**を多用する場合、左小指でFnを押しながらキーを叩くため、長時間作業すると小指がつりそうになります。

### 2. 持ち運ぶと意外とかさばる

リモートと出社を行き来する人にとって、HHKB をカバンに入れると**まあまあ厚みと重量**があります。

専用ケースに入れるとさらに嵩張るので、モバイル用途だけなら軽量 65% キーボードのほうが快適かもしれません。

### 3. 高さと深いストロークで腱鞘炎リスク
HHKB はキーの **高さがある上にストロークも深い**です。

パームレストなしで使うと手首が反り返り、腱鞘炎のリスクが高まります。

HHKB 純正または薄型のウッドパームレストはほぼ必須アイテムと考えておきましょう。

---

## お金をかけるべき周辺アイテム
- **パームレスト** : 手首の角度をフラットに保ち、腱鞘炎を予防  
- **良い椅子** : 姿勢の悪さは生産性を直撃。キーボードと同等以上に投資価値あり  
- **エネループ充電池** : 乾電池運用コストを削減しつつ、環境にもお財布にも優しい  

---

## まとめ
- HHKB はキー配列のカスタマイズ性と耐久性が抜群。複数OSを行き来するエンジニアには特におすすめ  
- 一方で Fn 同時押しや本体の高さなど、人によっては合わないポイントもある  
- パームレストや椅子など周辺環境を整えれば、投資額に見合う快適さを得られる  

> **結論** : \"自分の体に合わせた環境づくり\" という意味でも、キーボード選びは惜しまず時間とお金をかけよう。

HHKBの購入を検討している方、すでに使っている方の参考になれば幸いです！

コメントやフィードバックもお待ちしています🤗
社会保険労務士試験ふりかえり

社会保険労務士
https://kakomonn.com/sharoushi/list

IT業界における育児休業、介護休業 医(104)
https://qiita.com/kaizen_nagoya/items/1fc2318036a7c78bc2b6

【社労士試験+ChatGPT】社労士過去問をChatGPT-4に解かせて解説させ、現役社労士が補足質問してみた(労働基準法)
https://qiita.com/hattori-sr/items/834c0357282dd31f627b

元プログラマーがQAの世界に入るまで
https://qiita.com/hambow/items/19f3d76344a40066b5e0

【開発ログ②】有給休暇を管理するアプリを作ろうと思うので、思いついた仕様を載せる
https://qiita.com/iczo3/items/97ad7d4baa985b3b99ca

A型事業所を利用する前にしたこと
https://qiita.com/toivokitahara/items/5986c5d559da2a916de8

残業は安全配慮義務の上で成り立つ(追記希望)
https://qiita.com/tukiyo3/items/be926693f86463e76eb4

裁量労働制のSEも残業代請求可能！違法な5つの手口を弁護士が解説
https://www.gladiator.jp/labor/overtime-pay-se-system-engineering/

フリーランスエンジニアのための税ハック 〜個人事業税編〜
https://qiita.com/moroi/items/08b79d976cb45a4d0fa6
>各都道府県ごとに微妙に実態が異なるようなので必ず都道府県税事務所にお問い合わせください。

>区分	税率	事業の種類
第1種事業（37業種）		
周旋業	
代理業	
広告業	
請負業	
印刷業	
電気供給業	
出版業
写真業	
電気通信事業	
第2種事業（3業種）	4%	
畜産業	水産業	薪炭製造業	－
第3種事業（30業種）
デザイン業
コンサルタント業
印刷製版業

IT関連では、コンサル業が半分近いかも。印刷業、出版業、電気通信事業、デザイ業ン、印刷製版業が半分近くの仕事をしている方もいるかも。斡旋業、代理業、請負業をしている方もいるかも。
自分では、広告業、写真業もちょっと手がけている感じかも。

# 社会保険労務士
社会保険労務士試験ふりかえり
https://qiita.com/kaizen_nagoya/items/14b256f89381aaee83e4

社会保険労務士関連法規・資料
https://qiita.com/kaizen_nagoya/items/699549fc9fca897b33f3

社会保険労務士法　
https://qiita.com/kaizen_nagoya/items/5e8cea8adcaa3fa6be1f

社会保険労務士試験 2024 択一 労働基準法及び労働安全衛生法
https://qiita.com/kaizen_nagoya/items/32a6860b0c1a681113e0

社会保険労務士試験 2024 択一 労働災害補償保険法
https://qiita.com/kaizen_nagoya/items/e165627f3b172715ee21

社会保険労務士試験 2024 択一 雇用保険法
https://qiita.com/kaizen_nagoya/items/2395d53af7a77933b590
【インフラテンプレートを自動配布】Amazon Protonとは？

# 【インフラテンプレートを自動配布】Amazon Protonとは？

「インフラをテンプレート化して、自動で展開したい」  
「デベロッパーがセルフサービスで環境を作れるようにしたい」  
そんなときに役立つのが、**Amazon Proton** です。

---

## 🔸 Amazon Protonとは？

**Amazon Proton** は、**インフラとアプリケーションのテンプレートを自動でデプロイ・管理できるマネージドサービス**です。

特に以下のようなシーンに最適です：

- サーバーレスアプリケーションの標準構成を配布したい  
- コンテナベースのマイクロサービスを自動展開したい  
- セキュリティガードレールを保ちながらセルフサービスを実現したい

---

## 🔸 どんな仕組み？

Protonは、**「インフラ担当者」と「アプリ開発者」**の役割を明確に分けて支援します。

### インフラ担当者がやること
- CloudFormationやTerraformで**インフラテンプレート**を作成  
- GitHubなどのコードリポジトリと連携し、テンプレートを管理  
- 承認済みテンプレートとしてProtonに登録

### アプリ開発者がやること
- ProtonのUIやCLIからテンプレートを選んで**新しいサービス/環境を作成**  
- デプロイは自動化済み、インフラの詳細を知らなくても使える

---

## 🔸 ユースケース

| ユースケース                   | 説明                                                       |
|----------------------------|------------------------------------------------------------|
| サーバーレスAPIの標準化           | Lambda + API Gateway + CloudWatch の構成をテンプレート化         |
| EKSクラスタ上のマイクロサービス構築 | EKS + ALB + IAM設定を含んだテンプレートを開発チームに展開         |
| セキュリティの統制               | Infrastructure as Code によって、ポリシー違反のない構成を強制可能 |

---

## 🔸 Protonのメリット

- ✅ **再利用可能なテンプレート**で標準化が進む  
- ✅ 開発者にとって**セルフサービスでインフラが作れる**  
- ✅ **GitOpsベース**で継続的にテンプレートを改善可能  
- ✅ マイクロサービスやサーバーレスに特化した構成が得意

---

## 🔸 他のサービスとの違い

| 比較対象      | Protonとの違い                                     |
|-------------|--------------------------------------------------|
| CloudFormation | プロトンはテンプレートの**配布・更新管理**まで含めてサポート |
| Service Catalog | より**マイクロサービス指向**で、継続的アップデートも前提に設計 |
| CodePipeline | Protonは**CI/CDだけでなく、IaC管理**も包含          |

---

## 🔸 まとめ

Amazon Protonは、**標準化されたインフラテンプレートを複数チームに安全かつ簡単に展開したい組織**にとって非常に有効です。

DevOpsやPlatform Engineeringの実践において、**「再現性」「自動化」「開発者体験の向上」**を実現できるサービスです。  
マイクロサービスやサーバーレスアーキテクチャを採用している組織では、特に導入効果が高いでしょう。

---

## 🔗 公式リンク

- [Amazon Proton – AWS公式サイト](https://aws.amazon.com/jp/proton/)  
- [Proton Developer Guide](https://docs.aws.amazon.com/proton/latest/adminguide/)

---

📘 AWS関連のQiita投稿を今後も予定しています。興味があればぜひフォロー＆いいねお願いします！
ポリイアモンドのピースの数

[ヘプタモンド・パズルを解く（DLX package 使用）](https://qiita.com/masa0599/items/ea8d23b6687620bc11e6)では色々なヘプタモンド・パズルの解を求めました。でもそのピースのデータは手入力だったので、これがなんとか自動で求められないか考えてみました。

### ポリイアモンドの種類と数
[ポリアモンド（Wikipedia）](https://ja.wikipedia.org/wiki/%E3%83%9D%E3%83%AA%E3%82%A4%E3%82%A2%E3%83%A2%E3%83%B3%E3%83%89)によると種類は$N=10$まで紹介されてます。この数のポリイアモンドを求められるか挑戦したいと思います。

### ポリイアモンドの種類を求めるアルゴリズム

以下の方針で考えました、要は考えられるすべてを作ってみて回転・鏡映で同じにならないものをリストするという力技です。

* $n=1$は正三角形一つ
* $n-1$のポリイアモンドの一つの辺に正三角形を一つ足す
* それらをを12通りに回転・鏡映したものが既になければ集合に加える
* それをすべての辺について行う

### n=8 オクタモンドのピース 66個

既にn=7までは前回の投稿で分かっているので、n=8 の66個を表示します。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1922159/d5772834-1cb7-4000-a9d1-29b337a3c02a.png) |
|:---:|
| |

### n=9 ノニアモンドのピース 160個

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1922159/28016fc6-2a02-4254-9dc9-d31679500c59.png) |
|:---:|
| |

### n=10 デシアモンドのピース 448個

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1922159/7e37937d-49ad-45f3-a7a4-14da0d1419aa.png)|
|:---:|
| |

### n=11 ピース 1186個

| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1922159/88766434-cffd-4e6e-93bb-b63c757da2ce.png)|
|:---:|
| |

### n=12 ピース 3334個

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1922159/ad7456c1-5b12-42b3-9164-fc030134ca24.png)|
|:---:|
| |

### n=18までのピースの数

さすがにこれ以上は表示してもいみがないので、数だけを以下のように求めました。値は[OEIS000577](https://oeis.org/A000577)と同じになっていることが確認出来ました。

| n | ピースの数|
|:---:|---:|
| 2 | 1 |
| 3 | 1 |
| 4 | 3 |
| 5 | 4 |
| 6 | 12 |
| 7 | 24 |
| 8 | 66 |
| 9 | 160 |
| 10 | 448 |
| 11 | 1186 |
| 12 | 3334 |
| 13 | 9235 |
| 14 | 26166 |
| 15 | 73983 |
| 16 | 211297 |
| 17 | 604107 |
| 18 | 1736324 |
TimedRotatingFileHandler のログ消失バグについて

## 初めに
Clone で 20分おきに起動している `Python` のスクリプトがあった。
ログは `TimedRotatingFileHandler` で　`when` パラメータを `'MIDNIGHT'` にして使っていた。つまり、日付が変わるとログが切り替わる。[python の TimedRotatingFileHandler での日次ログ切り替え](https://qiita.com/KAZAMAI_NaruTo/items/a1dc89e4ae0ecab56c77)

実行時間は当初 17分くらいだったが、永く稼働していているうちに ときどき20分を超えるようになっていた。あるとき、前日のログファイルが妙にサイズが小さいことがあることに気が付いた。中身を確認するとログがなかった。
「`TimedRotatingFileHandler`、なんかバグっているな」と思い、検索したら Stackoverflow とかに「そんなもんだ」みたいなやりとりがあったりもした。

さて、別件で新しくシステムを作る際、本来 daemon化するべきところを「(Clone での 1分ごとの起動 + 自己再起動) with 排他制御」という手抜きでスクリプトを運用する方針にした・・・が、ここで「`TimedRotatingFileHandler` のバグ、致命的になるな。今も治ってないのか？」と調べた。

## バグの無いバージョンについて
このバグ、知っている人は知っている知られていたバグではあるようだが、修正されたのは 2024年4月である。
https://github.com/python/cpython/issues/88352

その時点でまだ出ていなかった
* Python 3.13 以降

及び BugFix対応の対象である
* Python 3.12.3 以降
* Python 3.11.9 以降

でバグは修正されている。

一方 Security Fix のみになっていた Python3.10 以前では 2024年4月以降に出ていてもこのバグは修正されていない。
https://devguide.python.org/versions/

## バグの内容
バグの内容は「ログを切り替える(Rolloverする)際、現在のログファイルの新しい名前と同じファイルが名のファイルがあった場合は消す」というもの。おそらく`RotatingFileHandler` のコードを引き継いでしまったために発生したバグだろう。

https://github.com/python/cpython/commit/fee86fd9a422612b39e5aabf2571b8fe4abac770
の Lib/logging/handlers.py の変更前の 439行目の `os.remove(dfn)` が実際にファイルを削除している箇所である。

## バグの発現する状況

このバグが発現するのは同一のスクリプトが二重起動されるなど、TimeRotatingFileHandler で同一のログファイルに書き込みを行っている状態でログ切替(Rollover)が発生したときである。
パラメータ `when` を `MIDNIGHT` にしている場合、
1. 先のプロセスがログを書き込む際、日が変わっていたら(前日のログ(XXX.log.YYYY-MM-DD)のファイルが無いことをチェックしてから) 現在の File を Rename して XXX.log.YYYY-MM-DD としてから新しいファイルに書き始める

1. 後のプロセスがログを書き込む際、日が変わっていたら、前日のログ(XXX.log.YYYY-MM-DD)のファイルがあるので削除を行ってから現在の File を Rename して　XXX.log.YYYY-MM-DD とし、新しいファイルに書き始める

となる。
その結果、先のプロセスが切り替えてから後のプロセスが切り替えるまでに先のプロセスが書き込んだログのみが前日のログ(XXX.log.YYYY-MM-DD)として残るのである。

## 対策案(まだやってない)
バグが治っていないバージョンの Python で対策するなら TimedRotatingFileHandler を wrap するクラス作って `doRollover`メソッドを新しいバージョンのコードを参考にして Overrideする形になるかと思います。(丸写しするなら一緒に変更されている `computeRollover` も　Overrideすることになるかと。丸写しで大丈夫かはわからないが。)

そのうちやろう・・・と思ってるがそろそろシステム更新時期なんだよねぇ。。。
efax-gtk + Grandstream HT801でFAX受信ができないときの対処法

この記事は`efax-gtk`でFAX送受信、特に受信をする際に行き詰まった人向けの記事である。

`efax-gtk`を使用する前提である`modprobe`やユーザーグループ、パーミッション設定は既によしなに済んでいると仮定する。

ちなみに`modprobe`は`/usr/sbin/modprobe`に居ることもあるらしい。

## 材料

Debian
Grandstream HT801
Brastelのアカウント
Conexant CX93010チップの謎USBモデム



## efax-gtk で送信はできるのに受信ができない

この問題で数ヶ月悩んでいたのだが、昨日急に思ったことがあった。


**「Grandstream HT801のFXS PORTの設定って本当に日本向けでいいの？？？」**

そう思った理由として「Conexant CX93010チップの謎USBモデム」が日本向けに最適化してあるとは限らないと気付いたからだ。

ここで一言：

:::note warn
FXS PORTの設定は潜在的な危険性を孕むので自己責任でお願いします
:::

仕様が分からないのでなんとも言えないですが結構高電圧とかが出てる可能性がありますので。

そして私はおもむろに自己責任でHT801のFXS PORT設定を次のように変えてみた。

```
SLIC Setting : USA 1 (BELLCORE 600 ohms)
Caller ID Scheme : Bellcore/Telcordia
```
すると、`efax-gtk`で送信はできていたのに受信をすると落ちる問題が解消された。
モデムの設定はClass 1を使用している。


## 帰結
「Conexant CX93010チップの謎USBモデム」が日本語を喋るとは限らない。ていうかよく送信できてたな。

めでたしめでたし
8ビットの並びを逆転して遊ぶ (テーブルを作る)


いろいろ注意
----

- 過去ログを見よ!!!
- Arduinoでの予定は、未定
- 親切な人から教えて貰ったアルゴリズムをそのまま、使用


プログラム
----

オンラインコンパイラpaiza

```c++



#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    
    printf("unsigned char rev[] = {\n");
    
    
    for(int i=0;i<(0xff+1);i++){
    
        int a = i;
        a = (a & 0b10000000) >> 7 |
            (a & 0b01000000) >> 5 |
            (a & 0b00100000) >> 3 |
            (a & 0b00010000) >> 1 |
            (a & 0b00001000) << 1 |
            (a & 0b00000100) << 3 |
            (a & 0b00000010) << 5 |
            (a & 0b00000001) << 7;
            
        printf("0x%02x%c\n",a,(i == 255) ? ' ' : ',');
    
    }//for
    
    printf("};\n");
    
}



```


```

unsigned char rev[] = {
0x00,
0x80,
0x40,
0xc0,
0x20,
0xa0,
0x60,
0xe0,
0x10,
0x90,
0x50,
0xd0,
0x30,
0xb0,
0x70,
0xf0,
0x08,
0x88,
0x48,
0xc8,
0x28,
0xa8,
0x68,
0xe8,
0x18,
0x98,
0x58,
0xd8,
0x38,
0xb8,
0x78,
0xf8,
0x04,
0x84,
0x44,
0xc4,
0x24,
0xa4,
0x64,
0xe4,
0x14,
0x94,
0x54,
0xd4,
0x34,
0xb4,
0x74,
0xf4,
0x0c,
0x8c,
0x4c,
0xcc,
0x2c,
0xac,
0x6c,
0xec,
0x1c,
0x9c,
0x5c,
0xdc,
0x3c,
0xbc,
0x7c,
0xfc,
0x02,
0x82,
0x42,
0xc2,
0x22,
0xa2,
0x62,
0xe2,
0x12,
0x92,
0x52,
0xd2,
0x32,
0xb2,
0x72,
0xf2,
0x0a,
0x8a,
0x4a,
0xca,
0x2a,
0xaa,
0x6a,
0xea,
0x1a,
0x9a,
0x5a,
0xda,
0x3a,
0xba,
0x7a,
0xfa,
0x06,
0x86,
0x46,
0xc6,
0x26,
0xa6,
0x66,
0xe6,
0x16,
0x96,
0x56,
0xd6,
0x36,
0xb6,
0x76,
0xf6,
0x0e,
0x8e,
0x4e,
0xce,
0x2e,
0xae,
0x6e,
0xee,
0x1e,
0x9e,
0x5e,
0xde,
0x3e,
0xbe,
0x7e,
0xfe,
0x01,
0x81,
0x41,
0xc1,
0x21,
0xa1,
0x61,
0xe1,
0x11,
0x91,
0x51,
0xd1,
0x31,
0xb1,
0x71,
0xf1,
0x09,
0x89,
0x49,
0xc9,
0x29,
0xa9,
0x69,
0xe9,
0x19,
0x99,
0x59,
0xd9,
0x39,
0xb9,
0x79,
0xf9,
0x05,
0x85,
0x45,
0xc5,
0x25,
0xa5,
0x65,
0xe5,
0x15,
0x95,
0x55,
0xd5,
0x35,
0xb5,
0x75,
0xf5,
0x0d,
0x8d,
0x4d,
0xcd,
0x2d,
0xad,
0x6d,
0xed,
0x1d,
0x9d,
0x5d,
0xdd,
0x3d,
0xbd,
0x7d,
0xfd,
0x03,
0x83,
0x43,
0xc3,
0x23,
0xa3,
0x63,
0xe3,
0x13,
0x93,
0x53,
0xd3,
0x33,
0xb3,
0x73,
0xf3,
0x0b,
0x8b,
0x4b,
0xcb,
0x2b,
0xab,
0x6b,
0xeb,
0x1b,
0x9b,
0x5b,
0xdb,
0x3b,
0xbb,
0x7b,
0xfb,
0x07,
0x87,
0x47,
0xc7,
0x27,
0xa7,
0x67,
0xe7,
0x17,
0x97,
0x57,
0xd7,
0x37,
0xb7,
0x77,
0xf7,
0x0f,
0x8f,
0x4f,
0xcf,
0x2f,
0xaf,
0x6f,
0xef,
0x1f,
0x9f,
0x5f,
0xdf,
0x3f,
0xbf,
0x7f,
0xff 
};

```
Google Cloud認定Professional Cloud Architect受験談＆学習方法

## 概要
2025年5月17日にGoogle Cloud認定Professional Cloud Architectの試験を受けて合格しましたので、学習したこと等を情報共有として書いていきます。

## 前提の知識と経験
パブリッククラウドとしてはAWSをメインに扱い、SAPやDOPの試験に合格しているということ、1ヶ月前のAssociate Cloud Engineerへの合格が、私の前提になっています。
Google Cloudには少しだけ触ったことがある程度です。

## 学習期間
今回は大体1ヶ月くらいで、平日は1日2〜3時間、休日は5〜6時間くらいです。
他のGoogle Cloud認定試験も並行して勉強していました。

## 学習教材
### 1. Google Cloud公式サンプル問題
Professional Cloud Architectのサンプル問題が20問あり、レベル感も本番と近いので、繰り返しになりますが100％解答できるようにしておきましょう。

https://docs.google.com/forms/d/e/1FAIpQLScpVCxsKSrqMBmqJ4fiYrJfCSlMhJVIFaW_v3MD4xEd6NW0Bw/viewform?hl=ja

### 2. PCA（Google Professional Cloud Architect）が”ざっくり”「スッキリ」分かる講座

Udemyの動画講義と模擬試験2回分が付いてきています。動画で試験範囲のサービスを把握しつつ、模擬試験で力試ししていくのが良いかなと思います。
同じ講師の別の動画は合わなかったですが、この講座の構成は合っていたのか受講して良かったと思います。

https://www.udemy.com/course/googlepca


### 3. 【最短攻略】Google Cloud 認定 Professional Cloud Architect 模擬問題集
Udemyの模擬試験です。本番のレベル感と近かったので、これを90％の正答率まで上げることができれば本番も大丈夫かと思います。

https://www.udemy.com/course/google-cloud-professional-cloud-architect-i

### 4. ケーススタディ
ここは教材ではないですが、試験では架空の会社の要件をベースに解答する問題があります。
試験中も会社の概要、要件、課題を確認できますが、事前に確認しておけば、試験時間の短縮になるので、お薦めします。
下記がそのケーススタディの4社になります。

EHR Healthcare

https://services.google.com/fh/files/misc/master_case_study_ehr_healthcare_ja.pdf?hl=ja

Helicopter Racing League

https://services.google.com/fh/files/misc/master_case_study_helicopter_racing_league_ja.pdf?hl=ja

Mountkirk Games

https://services.google.com/fh/files/misc/master_case_study_mountkirk_games_ja.pdf?hl=ja

TerramEarth

https://services.google.com/fh/files/misc/master_case_study_terramearth_ja.pdf?hl=ja

## 本番試験
120分の試験時間で50問出題されました。今回は見直し含めて80分ほどで終了。終了後、「合格」の表示があったので良かったです。
上記で勉強した教材は古いものもあり、現在のサービス名と若干違い、一瞬解答に迷うことがありました。ただ問題文の文脈をしっかり読めば解答できるので、焦らなれけば大丈夫かと思います。

## 最後に
AWSもそうですが、試験のレベルが上位になるにつれ、問題文および解答が抽象的なところから具体性が上がってくるので、答えやすくはなります。
その分、サービスの内容をしっかりと覚えたり、問題文を理解しておく必要があるので、それはそれとして、しっかりと勉強しておかなければならないなぁと感じます。

あと、今回、Professional Cloud Architectを取得したことで、会社としてGoogle Cloudに力を入れている現在、少しでも力になれればと思います。
ABC406振り返り

## はじめに

パナソニックグループ プログラミングコンテスト2025(AtCoder Beginner Contest 406/ABC406)に参加しましたので報告します。

## 概要

- 今回はA問題とB問題を解いた
- B問題は結果試行錯誤(4回WA/誤答)になってしまい、boost C++ライブラリの力を借りて何とかクリアした
- B問題の難度は高めで、ランキング・パフォーマンス共に大幅にアップした

## 結果

- パフォーマンス348
- レート変動：86→113(+27)

long longで対処できない問題がB問題に来たためか、順位は大幅にアップ、パフォーマンスは350近くまで跳ね上がりました。
ただし、それでも茶色の領域ではありません。やはり最低限C問題は解けないと入茶は厳しい、と。
今回はたまたまboost C++ライブラリのことを存じていたためどうにかなりましたが、次回もうまく行くとは限りません。

## A - Not Acceptable

[問題](https://atcoder.jp/contests/abc406/tasks/abc406_a "A - Not Acceptable")

レポート提出時間の締切に間に合ったか否かを判定する(簡単な)問題です。
今回は分単位に変換した提出時間と締切時間を愚直に変数に入れてますが、省略することも可能です。

```cpp:A.cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
  int a, b, c, d;
  cin >> a >> b >> c >> d;
  int dl = a * 60 + b;
  int sb = c * 60 + d;
  if (sb <= dl) cout << "Yes" << endl;
  else cout << "No" << endl;
  return 0;
}
```

## B - Product Calculator

[問題](https://atcoder.jp/contests/abc406/tasks/abc406_b "B - Product Calculator")

かけ算しか行えない、しかし表示桁数上限が非常に大きい電卓を再現する問題です。
long long(64ビット整数型)では入り切らないほど桁数が多いため、何かしらの工夫が必要です。

それを知らずに4回提出、WA(誤答)となってしまいました。

結局はboost C++ライブラリのmultiprecisionが利用できることを活用して、それを使ってクリアーしました。
(AtCoderではboost C++ライブラリが利用できることを思い出しました)

```cpp:B.cpp
#include <bits/stdc++.h>
#include <boost/multiprecision/cpp_int.hpp>

using namespace std;
using ll = unsigned long long;
#define rep(i,n) for (ll i = 0; i < (n); i++)

int main() {
  ll n, k;
  cin >> n >> k;
  boost::multiprecision::cpp_int d = 1;
  boost::multiprecision::cpp_int lim = 1;
  rep(i, k) lim *= 10;
  for (ll i = 0; i < n; i++) {
    ll a;
    cin >> a;
    d *= a;
    if (d >= lim) {
      d = 1;
    }
  }
  cout << d << endl;
  return 0;
}
```

## 今後の課題

- やはり数理素養が低い(忘れている)ので、その辺をどうにかする
  - [アルゴ式](https://algo-method.com/ "アルゴ式")を進める(数理素養が学べる)
  - アルゴ数学本を進める
  - 高校数学の書籍で学習する
- 鉄則本を読む

なおAtCoder Daily Trainingはちょっと精神的余裕が無くなったことから一時休止しています。

## その他

アルゴ式、学習記録回りで不具合出てますが、直らないかなあ、と。モチベーション的に。
windows11で、sketchup6 その108

# 概要
windows11に、sketchup6を入れてみた。
rubyで、3Dを書く。
練習問題やってみた。

# 練習問題
アートな、作品を作れ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/da56254a-6795-4ecf-8d1b-29a62cee6cba.png)

# サンプルコード

```
class Kame2
	def fmod(a, b)
		x = (a / b).floor
		return a - b * x
	end
	def turn(a)
		@ANGLE = fmod(@ANGLE + a, 360.0)
	end
	def gmove(l)
		p = []
		rd = Math::PI / 180.0
		x = l * Math::cos(rd * @ANGLE)
		y = -l * Math::sin(rd * @ANGLE)
		px = @LX
		py = @LY
		p[p.length] = [px, py, 0]
		@LX += x
		@LY += y
		p[p.length] = [@LX, @LY, 0]
		p[p.length] = p[0]
		@entities.add_curve(p)
	end
	def koch(i)
		if (i <= 1)
			gmove(5)
			return
		end
		koch(i - 1)
		turn(-30)
		koch(i - 1)
		turn(120)
		koch(i - 1)
		turn(-30)
		koch(i - 1)
	end
	def initialize
		@ANGLE = 0;
		@LX = 10;
		@LY = 10;
		model = Sketchup.active_model
		@entities = model.active_entities
		koch(6)
	end
end







```

以上。
ChatGPTを使用したアプリ開発記【Tailwindによるログイン画面の改修】

## コード
最上位DivにTailwindのclassNameを追加。
```login.js
    <div className="min-h-screen flex items-center justify-center bg-gradient-to-r from-blue-100 to-blue-300 p-4">
      <div className="w-full max-w-md bg-white rounded-xl shadow-xl p-6">
        <h2 className="text-2xl font-bold mb-6 text-center text-blue-600" >Tomomitsu Keruma SNS</h2>
```
## UI
- 修正前
![スクリーンショット 2025-05-15 6.57.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058366/595a3fb9-2b38-43d1-9f99-ebdea6d39818.png)

- 修正後
![スクリーンショット 2025-05-15 7.12.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058366/13f86104-ae27-41e9-aabd-2679af779712.png)
Obsidianの活用について(2)


**＜本記事のターゲット層＞**

- Obsidian をもっと使いこなしたい人
- Obsidian の設定が多すぎて困っている人
- Obsidian の設定から便利機能だけかいつまんで知りたい人

本記事は[前回](https://qiita.com/ochtum/items/ab18bde07cebb5140bb0)の続きになります。
次回の記事は[こちら](https://qiita.com/ochtum/items/90c72ac6c0251326a26a)

前回の記事を書いたあと、さらに便利な機能を見つけたため、追加でご紹介いたします。

## 🟣 4. 内部リンクの候補表示

Obsidian を活用するにあたり、思いませんでしたか？

「メモが増えてきて内部リンク作るのめんどくなってきた」

私も OneNote からメモを移行してきて思いました。Web Clipper を活用して、Web ページが貯まってきて思いました。

そこで今回ご紹介するのが`Various Complements`というコミュニティプラグインです。

- (1)設定 -> コミュニティプラグインの`閲覧` -> 「プラグインを検索･･･」に`Various Complements`と入力すると「Various Complements」が表示されるので選択
- (2) インストールを選択
- (3) 有効化を選択
- (4) オプションを選択
- (5) 一番上の Strategy で`japanese`を選択

以後、入力中にファイル名が表示されるようになります。ファイル名がカード形式で候補として表示されるため、それを選択するだけで内部リンクが作成できます。
![675a36e469e8e3840f9b6cb51c450d7c.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755626/a6d7ab4f-024f-434d-ae6d-b8f4e15a9408.gif)

## 🟠 5. プロパティ

[前回](https://qiita.com/ochtum/items/ab18bde07cebb5140bb0)、[フォントについて](https://qiita.com/ochtum/items/ab18bde07cebb5140bb0#2-%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)でモノスペースフォントは「開発者」と言われている人たちしか使わないものになります。とかいってましたが、すいません。ここにモノスペースフォントが使われるところがありました。

任意のプロパティを作成することができ、検索に活用することができます。

なぜそれがいいのか？

ファイルはフォルダ別に分けることもできますし、タグをつけて分類することもできます。それだけで十分に思えますが、プロパティをつけることで、プロパティ名別に検索をかけることができるから便利なのです。

ファイルが多くなればなるほど、ファイル名やタグだけでは検索が大変になります。Web Clipper を活用すればなおさら気軽にファイルが増えることでしょう。
（Web Clipper が自動でプロパティを追加できます）

そういうときに活用できるのがプロパティというわけです。プロパティのよいところは折り畳めるので、メモの邪魔にならないということです。プロパティにタグを埋め込むこともできるため、タグを仕舞うときにも便利です。

タグは[YAML フロントマター](https://publish.obsidian.md/help-ja/%E9%AB%98%E5%BA%A6%E3%81%AA%E3%83%88%E3%83%94%E3%83%83%E3%82%AF/YAML%E3%83%95%E3%83%AD%E3%83%B3%E3%83%88%E3%83%9E%E3%82%BF%E3%83%BC)という形式で記述しますが、それほど難しくありません。

以下のような形式で書くだけです。

```yaml
---
key: value
key2: value2
key3: [one, two, three]
key4:
  - four
  - five
  - six
---
```

例を上げると以下のような形です。

```yaml
---
title: {{title}}
published: 2023-11-30
created: {{date}}{{time}}
description: "テストメモ"
tags:
  - "タグテスト"
---
```

検索をするときには`[`を入力するだけでプロパティの候補が表示されるので、プロパティ名を覚えている必要はありません。

## 🟡 6. テンプレート

Obsidian Web Clipper を使う場合には、自動でプロパティを追加できますし、追加したいプロパティを設定できるので問題ないのですが、毎回メモを書くたびにプロパティを設定するときには大変でしょう。

そういうときに便利なのがテンプレートです。

- (1) テンプレートファイルを格納するフォルダを作成する
- (2) テンプレートファイルを作成する
- (3) 設定 -> テンプレート -> テンプレートフォルダの場所で(1)で作成したフォルダを指定する

以上でテンプレートを使う準備は完了です。

使うときにはテンプレートを使いたいファイルを開き、サイドバーからテンプレートを挿入で、テンプレートファイル名を選択するだけです。

人によっては運動を記録したり、会議メモに使ったりと様々な用途があるようです。
【公ド読】無効な JSON のデバッグ

【公式ドキュメントを読もうシリーズ】無効な JSON のデバッグ

## シリーズ概要

[https://qiita.com/yasu_programming/items/cec66f9e8d5d571e9ce3](https://qiita.com/yasu_programming/items/cec66f9e8d5d571e9ce3)

## URL

[https://docs.github.com/ja/copilot/copilot-chat-cookbook/debugging-errors/debugging-invalid-json](https://docs.github.com/ja/copilot/copilot-chat-cookbook/debugging-errors/debugging-invalid-json)

## 説明

JSONデータの構文エラーなどの具体的なプロンプトなどが書かれている。
これは確かに助かるものが多い。

> ```
> Error: Parse error
> ----------------------^
> Expecting 'STRING', 'NUMBER', 'NULL', 'TRUE', 'FALSE', '{', '[', got 'undefined' 
> ```

上記のようなエラーがあったときのJSONデータが下記である。

> ```
> {
>   "location": "San Francisco",
>   "current_weather": {
>     "temperature": 18,
>     "unit": "Celsius",
>     "conditions": "Cloudy
>   },
>   "forecast": {
>     "day": "Monday",
>     "high": 22,
>     "low": 15,
>     "precipitation": 10
>   }
> }
> ```

`Why is my JSON object invalid and how can I fix it?` のプロンプトを入れると修正したJSONを出力してくれる。

Cloudyの箇所でダブルクオーテーションが抜けていることに関してのエラーだった。

## 所感

人間で確認するよりもAIに任せるほうが断然楽になる作業なので、助かる。
UFOコードとは？

# UFOコードとは？

## ― voodoo・legacy・magicでもない、未確認構造物の正体 ―



### 1. 導入: なぜこの言葉が必要か

開発現場では、時折こんなコードに出くわすことがある。

* 「このコード、意味わからんけど消すと壊れる」
* 「誰が書いたのかわからない。でもなぜか動いてる」

コメントもなければ設計資料にも載っていない。バージョン履歴を遡っても「なんでこんなコードが必要だったのか」が全くわからない。にもかかわらず、消すと不具合が起きる。そんな「謎のコード」が、静かにプロジェクトのどこかに潜んでいる。

今まで私たちはそれに名前を与えなかった。

→ そこで我々はこれを「**UFOコード（Unidentifiable Functioning Object）**」と呼ぶことにした。

---

### 2. 定義: UFOコードとは

```markdown
UFOコード（Unidentifiable Functioning Object）

- 設計的に意味が不明
- 副作用や責務が説明できない
- コメントやドキュメントもない
- 削除すると不具合が出るが、誰も理由を説明できない
- 結果としてコードベース中に“漂い続けている”
```

UFOコードの本質は「意図不明だけど必須」という矛盾にある。設計として正当化できないが、実装として無視できない。その宙ぶらりんな存在感が、まさに「未確認構造物」なのだ。

---

### 3. 類似ミームとの違い

これまでにも「よくわからないコード」にはいくつかの呼び名があった。だが、どれもUFOコードとは似て非なるものだ。

| 用語               | 概要              | UFOコードとの違い            |
| ---------------- | --------------- | --------------------- |
| **Legacy code**  | 古くなったが意味はある     | 意図や文脈があるため、読み解けば理解可能  |
| **Magic number** | 意味不明な固定値        | 単一値の話であり、構造の問題ではない    |
| **Voodoo code**  | よくわからんが入れておくと安心 | 開発者の“信仰”があり、儀式的な意味を持つ |
| **UFO code**     | 意図なし、でも削除不可     | 信念も意識もない。構造から孤立した生き残り |

UFOコードは、意図や信仰すら存在しないという点で、他のどのカテゴリにも属さない新種の構造だ。

---

### 4. よくあるUFOコード例

* `Thread.Sleep(1);` → なぜかタイミングがうまくいく。消すと微妙なバグが出る。
* 空の `catch` → 削除すると例外が報告されて爆発するが、空catchの理由は書かれていない。
* `dummyList.Add()` → 使われていないようで、実はこの行がないと初期化順が崩れる。
* 謎の `InitMagic();` → 呼ばないと描画が乱れる。なぜかは不明。
* 使用されていないように見えるグローバル初期化処理。だが消すと「なぜか」壊れる。

どれも「実害が出て初めて必要だったと気づく」コードたちだ。

---

### 5. なぜ怖いのか

UFOコードの恐ろしさは、その“削除できなさ”にある。

* テストされていない（されていてもカバーされていない）
* 設計資料に存在しない
* 削除後に不具合が発覚しても、再現が難しい
* 誰も「このコードの正体」を説明できない

つまり、「それがなぜ存在しているのかを説明できる人がいない」のに、「消すと何かが壊れる」状態。これは技術的負債というより、構造的リスクそのものだ。

---

### 6. AIリファクタ時代の危機

今後ますます増えるであろう「AIによる自動リファクタリング」。
このとき、UFOコードは真っ先にターゲットになる。

* 意味がない
* 呼び出し回数が少ない
* コメントもない
  → AIにとっては「削除候補」でしかない

だが、実際にはこの“構造外の1行”が、ある種の整合性を保っていることもある。
AIが意味を理解しない以上、**設計者だけがその存在理由をかすかに記憶している**状態が、最後の命綱となる。

---

### 7. 設計者の向き合い方

UFOコードを見つけたとき、設計者ができることは以下のような「構造的封じ込め」だ：

* `// UFO CODE: Do not remove. Reason unknown.` とコメントを残す
* `UfoCode.Protect(() => ...)` のようなラッパー構造で区切る
* `CompatibilityLayer`, `LegacyGlue.cs` に物理的に隔離する
* TODOコメントで「将来の自分や他人への警告」として明示しておく

UFOコードは完全に排除すべき対象ではない。設計者の役割は、**それを理解しようとすること、そして封じ込める構造を作ること**である。

---

### 8. 終わりに

UFOコードは、敗北ではない。
それは、設計の枠を超えてなお生き残ってしまった構造である。

削除すべきか、残すべきか。
その判断をできるのは、コメントでもAIでもなく、**設計者だけ**だ。

この言葉が、あなたのコードの“未確認構造物”に名前を与えるきっかけになれば幸いです。
競プロ日記#25/05/17

# アルゴ式
[2 つのサイコロ (3)](https://algo-method.com/tasks/760)
- 同様に確からしいことについての記憶があいまいであった。
```
int main() {
    int X;
    cin >> X;
    int pattern = 0;
    for (int i = 1;i <= 6;i++){
        for (int j = 1;j <= 6;j++){
            if (i + j == X){
                pattern++;
            }
        }
    }

    cout << fixed << setprecision(10);
    cout << (long double)pattern / 36.0 << endl;
}
```

[くじ引き (3)](https://algo-method.com/tasks/766)
- 楽しようとして「(long double)(N\*N - (N - 1)\*(N - 1)) / N*N」で余事象の計算をしようとしたら一生数値が合わなくて事故った。
- 横着せずに模範解答みたいにそれぞれ変数に定義してあげるべきだった様子
```
#include <bits/stdc++.h>
using namespace std;

int main() {
    int N; cin >> N;
    long double off = (long double)(N - 1) / N;
    long double ans = 1 - off * off;

    cout << fixed << setprecision(10);
    cout << ans << endl;

	return 0;
}
```

[くじ引き (4)](https://algo-method.com/tasks/771)
- 小数計算に標準入力の値を用いる場合は変数宣言の時点でdoubleなりlong doubleにしちゃってよさそう
```
int main() {
    long double N;
    cin >> N;
    cout << fixed << setprecision(10);
    long double ans = 1.0;
    long double p = (N - 1) / N;
    ans = ans - pow(p, N);
    cout << ans << endl;
}
```

[同じ誕生日 (2)](https://algo-method.com/tasks/764)
- 余事象を使って（1 - 364 / 365 * 363 / 365 * ...）をやる解法はヒントからも考え付いたがまさかそれが解説の解法だとは思わなかった

# 余談
ABCについて
- サンプルがあまりにも53過ぎる
- B問題とかでかましてくんのやめてくれ、マジですべってるしおもんないし、何よりしょうもない
.NET 9のユニットテストプロジェクトでDbContextを差し替える

こんにちは。

テックリードのTerukiです。

今回は軽めの記事ですが、.NET 8から.NET 9にアップデートする際にハマったことがあるのでその紹介です。

# DbContextを差し替える

ユニットテストをASP.NET Coreなどのプロジェクトに対して実行したい場合、データベースをテスト用のものに差し替えたくなります。

リポジトリパターンとかでガチガチに作っておけばそのリポジトリ自体をモックしてしまえばこのようなことはする必要もありませんが、毎回メソッドを書くのはまあまあ面倒で悩みどころです。

DbContextをテスト用のものに差し替えればモックせずにテストデータを注入できるので差し替えたいわけですね。

## .NET 8の場合

ASP.NET Coreにはテスト用にWebApplicationFactoryという便利なものがあります。

公式ドキュメント的にはここにあります。

https://learn.microsoft.com/ja-jp/aspnet/core/test/integration-tests?view=aspnetcore-8.0&pivots=xunit#customize-webapplicationfactory

```cs
builder.ConfigureServices(services => {
    // DbContextをインメモリDBに変更する
    services.Remove(services.SingleOrDefault(d => d.ServiceType == typeof(DbContextOptions<ApplicationDbContext>))!);
    services.AddDbContext<OhmyteethDbContext>(options => {
        options.UseInMemoryDatabase("TestingDatabase");
    });
});
```

本当はSQLiteのものが良いですが、訳あってInMemoryDatabaseにしています。

SQLiteでも問題ないプロジェクトではSQLiteのほうが良いかと思います。

## .NET 9の場合

.NET 9にすると、DIコンテナからRemoveしないといけないインターフェースが増えます。

```cs
builder.ConfigureServices(services => {
    // DbContextをインメモリDBに変更する
    services.Remove(services.SingleOrDefault(d => d.ServiceType == typeof(DbContextOptions<ApplicationDbContext>))!);
    services.Remove(services.SingleOrDefault(d => d.ServiceType == typeof(IDbContextOptionsConfiguration<OhmyteethDbContext>))!); // これを追加
    services.AddDbContext<OhmyteethDbContext>(options => {
        options.UseInMemoryDatabase("TestingDatabase");
    });
});
```

これで.NET 9でも問題なく動きます。

---

これを書いた当時はエラー内容から頑張って特定したのですが、今はもうドキュメントに記載がありました:sob:

https://learn.microsoft.com/ja-jp/aspnet/core/test/integration-tests?view=aspnetcore-9.0&pivots=xunit#customize-webapplicationfactory

今更気づいてしまってちょっとショックですが、誰かの役に立てば良いなと。
go1.24に上げたらnon-constant format string in call toがでた

# エラー内容
Goで1.21から1.24にあげようとした時に下のようなエラーが出るようになりました。

```zsh
Error: ./main.go:98:11: non-constant format string in call to (****).Infof
```

# 原因
エラーが出ていた箇所は以下のような感じにに書かれていました。

```golang
fmt.Printf(`test-{data}`)
```

TypeScript等でよくみる変数を文字列として入れて表示する処理です。

この部分でエラーが起きていました。

# 解決方法

本来printfは下のようにフォーマット修飾子とセットで使います。

```golang
fmt.Printf("test-%v",data)
```

Go1.24からはPrintfでgo vetを使った静的解析が強化されており、エラーのように文字列に変数を入れ込む形ではなく、第二引数に変数を入れたり、フォーマット修飾子で表さないといけないようになりました。

>https://arc.net/l/quote/skcwyjvy

ある意味複数の書き方ができるとメソッドの利用用途がわからなくなるので、初学者にとってはありがたいかもしれないなと感じました。

:::note
### go vetとは
静的解析パッケージで、バグが起きそうなところをコードを解析して指摘してくれます。
:::
【spring-batch + MyBatis】外部フォルダに格納されたmapper XMLを読み込む

# 環境
spring-batch：4.3.1
Mybatis：3.5.6
Mybatis-Spring：2.0.6

# 【spring-batch + MyBatis】SqlSessionFactoryBeanのmapperLocations

外部フォルダに格納されたmapper XMLを読み込む方法。
下記のように、SqlSessionFactoryBeanの「mapperLocations」でXMLファイルのロケーションが指定できる。

```xml:context.xml
<bean id="reader" class="org.mybatis.spring.batch.MyBatisCursorItemReader"
      p:queryId="org.terasoluna.batch.functionaltest.app.repository.mst.CustomerRepository.findAll" />
    <property name="sqlSessionFactory">
        <bean parent="jobSqlSessionFactory"
            p:dataSource-ref="STATEMENT"
            p:mapperLocations="classpath*:/mapper/**/*.xml" />
    </property>
</bean>

<bean id="jobSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
      p:dataSource-ref="jobDataSource">
    <property name="configuration">
        <!-- 省略 -->
    </property>
</bean>
}
```

spring-batch + MyBatisでは、Mapper XMLとMapperクラスのパスが同じ場合、上記の指定をしなくてもMybatisがMapper XMLを読み込んでくれる。
そのため、任意のフォルダにMapper XMLを格納したい要件がでた際に指定の仕方がわからず、ちょっと苦労した。
deliの中学生計算器、DL-1728

前回の[小数表現が表、分数表現が裏…見習うべき人教社PEP-290学生計算器（関数電卓）](https://qiita.com/harycurl/items/55bb4b30ceacfa2162d3)に続き、中国の中学生向け計算器、deli DL-1728を取り上げる。

## 搭載機能の違う2機種を同一型番で販売
[通分や素数判定ができる小学生計算器、deli DL-1726旧版](https://qiita.com/harycurl/items/b2b48d27eacfdfcd1c40)の記事で小学生計算器のDL-1726が新旧2機種あると紹介したが、中学生計算器のDL-1728も2機種存在する。
![dl1728-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/26e2524b-2bce-411d-99f3-bd1a18cd7f03.jpeg)
左が高级款（上級モデル）、右が基础款（ベーシックモデル）の名称で販売されている。

ただしDL-1726とカラーリングを対応させると、左が旧版、右が新版と考えてもよさそうである。
背面のシールを見ると、左が2017年7月製造、右が2021年8月製造のようだ。

搭載機能が違うため、起動時のメニューも違う。
上級モデルが複素数、統計、方程式、表、行列とfx-375ES Aに近い機能が搭載されているのに対し、ベーシックモデルは統計機能しかない。
![dl1728-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/6849c37a-6b1b-4590-b32e-3c7a7fc4c019.jpeg)
キー配列は上級モデルとベーシックモデルで若干位置の異なるものがあり、ベーシックモデルには複素数関連と積分・微分キーがない。[2ndF][MODE]が上級モデルはFUNCTIONになっているが、ベーシックモデルはSETUPになっている。

## 上級モデルの概要
Baidu Tiebaに上級モデルに関する投稿があった（なぜかメニューが8項目ある）。

https://tieba.baidu.com/p/9623762512

機械翻訳を使ってざっと読んでほしいが、概ねここに書かれている通りである。

微積分機能が付いているものの、積分の演算速度はかなり遅い（あるいは精度が悪い）。
いくつか例を挙げると、
- $2\int_{-1}^{1}\sqrt{1-x^2} dx$ … DL-1728：約1分30秒、fx-375ESA：約1分、deli D991CN（EXクローン）：約14秒
- $\int_{0}^{π}\sin^2(x)+\sqrt{x} dx$ … DL-1728：約56秒（誤差約8.4E-5）、fx-375ESA：約1分58秒（小数9桁まで誤差なし）、deli D991CN：約12秒（小数9桁まで誤差なし）

fx-375ESAと比べると性能の差は歴然である。

その他、搭載されているものに関しては概ねカシオES機と同様に機能する。

FUNCTIONメニューは複素数・統計・方程式・行列モードの時のみ表示される。
![dl1728-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/52dee774-ca47-492b-978f-2feb3dbc289a.jpeg)

分数入力は分子→分母の順、先に帯分数の整数部や分子を入力してから分数キーを押すことは不可。結果は帯分数表示。
ルートやπも表示可能な範囲であればそのままの形で表示される（自然表示出力）。
![dl1728-4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/f0b9a5be-bac8-4b90-b872-cbaeeb176b97.jpeg)

度分秒入力はDL-1726やEX・CWクローン機と違い、全て ° の記号で表示される（結果表示は °, ′, ″ ）。
![dl1728-7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/60848fbd-f5cb-4dca-a46d-18a5c97bf0ff.jpeg)


[DR]キーでDeg/Rad切り替えメニュー、[F/S]キー（[2ndF][(]）でFix/Sci/Norm切り替えメニュー（Norm1とNorm2はESシリーズと同じ）が表示される。
![dl1728-6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/317eaa16-aed4-410e-a023-2f4f02174a12.jpeg)

上級モデルは小数出力モードがないため、自然表示（分数やルート表示）を小数表示にする際は一々[2ndF][(-)]（[S↔D]）と操作する必要がある。

## ベーシックモデルのみの機能
ベーシックモデルはSETUPメニューが用意されている。
![dl1728-5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/afb7f35e-6c41-4c55-88ae-7c61ada9af6a.jpeg)
DL-1726新版と全く同じであるが、関数電卓としてはDecimal（小数出力）モードの存在がDL-1726より重要となるだろう。
順番は 1:Decimal（小数出力） 2:Math（自然表示出力） となっているが、Mathがデフォルトなのが惜しい。

分数入力は上級モデルと違い分母→分子の順、先に帯分数の整数部や分母を入力してから分数キーを押すことは不可。分数結果のデフォルトは帯分数表示（SETUPで仮分数に切り替え可）。

## 特筆すべき点はないが…
DL-1728の2機種を見たが、カシオES機等と比較して特筆すべき点はほとんどない。
強いてあげれば、統計モードの統計変数がALPHAキー入力に割り振られていること位か（ベースがカシオES機でありながら、この点はシャープの2行機に近い）。

演算速度が遅いため、上級モデルはカシオES・EXのクローン機で代替可能と考え、機能を削ったベーシックモデルを作ったとも考えられる。 

ただし、deliが[ClassWiz CWクローンで機能を追加できた](https://qiita.com/harycurl/items/c3f7f6b759fbb1ebf191)のは、こうしたカスタマイズモデル製造によるノウハウ蓄積もあったからではないだろうか。
deliの関数電卓の系譜という点でマニアは注目すべきモデルなのかもしれない。
[C++] キョウプロ用メモ

## 呪文
入出力の同期を削除することで速くなる
```cpp
#include<iostream>
using namespace std;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
}
```

## 入力、出力
```c++
#include<iostream>
using namespace std;
int main()
{
    int s;
    cin >> s;
    cout << s << endl;
}
```

## vector
[vectorのリファレンス](https://cpprefjp.github.io/reference/vector/vector.html)

```cpp
#include<iostream>
#include<vector>
using namespace std;
int main()
{
    int N = 5;
    // 定義
    vector<int> V(N);
    // 入力
    for(int i=0; i<N; i++)
    {
        cin >> V[i];
    }
    // 確認
    for(int i=0; i<V.size(); i++)
    {
        cout << V[i] << endl;
    }
}
```
亜種
```cpp
#include<iostream>
#include<vector>
using namespace std;
int main()
{
    int N = 5;
    vector<int> V(N);
    for(auto& v : V)
    {
        cin >> v;
    }
    
    for(const auto& v : V)
    {
        cout << v << endl;
    }
}
```

## sort
[sortのリファレンス](https://cpprefjp.github.io/reference/algorithm/sort.html)
```cpp
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    vector<int> V = {4, 3, 2, 1, 0};
    for(int v:V)cout << v << endl;
    
    sort(V.begin(), V.end());
    
    cout << "sort" << endl;
    for(int v:V)cout << v << endl;
}
```
```
4
3
2
1
0
sort
0
1
2
3
4
```
逆順は`r`をつける
```cpp
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    vector<int> V = {0, 1, 2, 3, 4};
    for(int v:V)cout << v << endl;
    
    sort(V.rbegin(), V.rend());
    
    cout << "sort" << endl;
    for(int v:V)cout << v << endl;
}
```
```
0
1
2
3
4
sort
4
3
2
1
0
```

## INT_MAX
[climits](https://cpprefjp.github.io/reference/climits.html)
```cpp
#include<iostream>
#include<climits>
using namespace std;
int main()
{
    cout << INT_MAX << endl;
    
    cout << INT_MIN << endl;
}
```
```cpp
2147483647
-2147483648
```

## deque
[dequeリファレンス](https://cpprefjp.github.io/reference/deque/deque.html)
```cpp
#include<iostream>
#include<deque>
using namespace std;
int main()
{
    // 定義
    deque<int> deq;
    
    // 追加
    deq.push_back(1);
    deq.push_back(2);
    deq.push_back(3);
    // 1
    // 2
    // 3
    
    // 先頭確認
    cout << deq.front() << endl;
    // 1
    
    // 先頭取り出す
    deq.pop_front();
    cout << deq.front() << endl;
    // 2
}
```

## `endl;`
個人開発 × AI活用の落とし穴と反省点

## はじめに：なぜAIを活用したのか
- 個人開発で時間的制約があった
- ChatGPTを活用すれば、特にUI部分の開発を効率化できると考えた
- 結果的に開発は大幅にスピードアップした
## フロントエンドに感じた「依存の危うさ」
- UIコードは「とりあえず動けばOK」で済ませがち
- 「デザインだけだし」と油断すると、後で機能追加やバグ修正時に苦しむことになる
## エラー対応での“思考停止”の罠
- エラーが出たとき、すぐにエラーメッセージをAIに貼って聞いてしまうクセがついた
- AIの返答が微妙だったり、全然的外れだったりすることもかなりある
- 実際は自分でログを読み直せばすぐ気づけるような単純なエラーも多かった
- AIの活用は便利だが、まずは自分の頭で考えてみるべきだった
## AIと共存するために気をつけたいこと
- 「AI = 完成したコードをくれる道具」ではない
　→ 理解できないならそれは危険信号
 - 自分で1度試して失敗してから聞くと、AIの回答の意味もよく分かる
## 今後の開発でのスタンス
- 完全に任せきりにしない、理解できないコードは使わない
- 書いてもらったコードは、自分で必ず読んで咀嚼するクセをつけていく
## おわりに
AIの力で開発スピードは確実に上がる
　→ ただし、その便利さに流されず、エンジニアとしての思考力・調査力を持ち続けることが大切だとおもった。
 
 また、近年「エンジニアの価値が二極化してきている」という声もよく耳にします。
誰でもAIを使ってそれなりのものが作れる時代だからこそ、
「本当に理解している人」と「ただ使っているだけの人」の差は今後ますます大きくなると感じています。

そういった流れの中で、自分も時代に流される側ではなく、飲み込まれずに主体的に技術を扱える側でいたいと思いました。
AIはあくまで強力な相棒であって、自分の技術力や考える力を手放す理由にはならない、ということを今回の開発を通じて実感しています。
## 作ったサービスの紹介
[こちら](https://qiita.com/zakusec/items/0852e6d2914152de1f3b)
管理者権限なしでローカル LLM を動かす（Qwen3・llama.cpp・Windows）

### 前提
社用PCでは管理者権限が必要な操作を行うたびに申請が必要で、ローカルLLMを導入するハードルが高い状況です。
同じ悩みを持つ方の参考になればと思い、今回は **管理者権限なし** で環境構築から利用までできた手順をメモとしてまとめました。

### テスト環境

| 項目 | 内容 |
|------|------|
| CPU  | AMD Ryzen 7 5825U |
| RAM  | 24 GB |
| OS   | Windows 11（標準 PowerShell 5.1 使用） |

### 準備

| ツール | 入手先 | ポイント |
|--------|--------|----------|
| **llama.cpp (バイナリ ZIP)** | <https://github.com/ggml-org/llama.cpp/releases> | `llama-run.exe` などが入った ZIP を解凍してそのまま使用します<br>※ `pip install llama-cpp-python` は Visual Studio BuildTools が必要になるため今回は不使用 |
| **GGUF** | <https://huggingface.co/Qwen/Qwen3-1.7B-GGUF/tree/main> | 今話題の **Qwen3 1.7 B** をテスト用に取得 |
| **PowerShell** | Windows 標準 | スクリプトではなく 「対話入力」 で実行します。 |

### 実践手順

#### 1. 文字化け対策(UTF-8 切り替え)

PowerShell の入力・出力のエンコーディングを明示的に UTF-8 に設定する。  

```powershell
[Console]::InputEncoding  = [Text.Encoding]::UTF8;[Console]::OutputEncoding = [Text.Encoding]::UTF8
```

実行コマンド
```
.\llama-run.exe .\Qwen3-1.7B-Q8_0.gguf
```
**>** が表示されたら準備完了。質問を入力する。


### オプション
思考モードの切り替えは、 **/no_think**

#### 思考モード ON (デフォルト)

```
PS > .\llama-run.exe .\Qwen3-1.7B-Q8_0.gguf
> こんにちは!
<think>
Okay, the user said "こんにちは!" which is Japanese for "Hello!" I need to respond in Japanese. Let me make sure to use a friendly and polite tone. Maybe say "こんにちは!" back. But wait, should I add something else? Like a greeting or a question? Maybe ask how I can help them. Let me check the guidelines. The user wants a response in Japanese, so I'll go with a simple hello and offer assistance. Yeah, that should work.
</think>

こんにちは！おはようございます。どうもあたし、AIアシスタントです。何かお手伝いできますか？
>
```
#### 思考モード OFF
```
PS > .\llama-run.exe .\Qwen3-1.7B-Q8_0.gguf
> こんにちは！ /no_think
<think>

</think>

こんにちは！はじめまして。何かお気軽にお知らせくださいね。😊
>
```
### ファイルを指定して実行
長文で指示したりするときのやり方です。
以下は、PowerShell 7.5.1で動作確認しました。
(PowerShell 5.Xでは上手くいきませんでした...)

ChatMLサンプル
```prompt.txt

system
あなたは優秀な日本語のアシスタントです。全ての回答は日本語で答えてください。



user
人間が快適に過ごせる室温は？ /no_think



assistant

```
実行コマンド
```
PS > [Console]::OutputEncoding = [Text.Encoding]::UTF8
PS > [Console]::InputEncoding  = [Text.Encoding]::UTF8
PS > type .\prompt.txt | .\llama-run.exe .\Qwen3-1.7B-Q8_0.gguf
<think>

</think>

人間が快適に過ごせる室温は、一般的に **20℃〜25℃** とされています。ただし、個人の体質や使用目的（例えば、寝室、ワークスペースなど）によっても異なります。

- **20℃〜22℃**：多くの人にとって「涼しい」温度です。
- **22℃〜25℃**：最も快適な温度範囲とされています。
- **25℃以上**：暑く感じる場合があります。
- **18℃以下**：冷たいと感じることがあります。

また、湿度も影響します。湿度が高ければ、25℃でも暑く感じられることがあります。逆に湿度が低ければ、20℃でも冷たいと感じる場合もあります。

ご自身の体感温度や用途に合わせて調整してください。
```

### まとめ
- ZIP 配布ツールだけ を使えば **管理者権限不要 ** でWindowsにローカルLLM環境を構築できる
- PowerShellはInput／OutputEncodingをUTF-8 にすると文字化けしない
- Qwen3では、思考モードと非思考モードを **/no_think** で切り替えることができる
- ファイルを指定して指示することもできる
Magic TrackpadをWindows11で使いたい Part2

# 元記事
[Magic TrackpadをWindows11で使いたい](https://qiita.com/nakashima_bike/items/df1e5f6f7855317a408a)
# あれからいろいろ試したり探したり
結論として、新しいMagicTrackpadは[こちら](https://github.com/imbushuo/mac-precision-touchpad/releases)のドライバでは使えないことが判明しました。
[こちら](https://mlabo.org/11600/)の記事がとても参考になりました。
# どうしたか
せっかく買ったデバイスですもの。お蔵入りさせるのはもったいない。
ということで、[Magic Utilities](https://magicutilities.net/)をお試し利用する運びとなりました。
そろそろ還暦のおじいちゃんが、その操作を覚えられるか、それとも召されるのが先か。
面白い勝負が始まりましたわい。