OmniAICreator/Qiita-1.07M huggingface dataset:
「手探りでCUI OS作成に挑む」連載目次

## 始めに
本連載では、0からCUIの16ビットOSを、アセンブリ言語のみを使って実装していきます。
x86の仕組みを深く理解することを目的としており、C言語などの高級言語は使用しません。

## 近況
2025-06-02 画面表示がうまくいかなくなりスタック周りを調査中。
2025-06-07 番外篇として初めたBIOS作成の方が楽しくなりOS作成は何もしていません。

## 実装篇
実装に関わる部分を載せます。
5月13日[ブートローダー作成](https://qiita.com/earthen94/items/fd72a34da31507fd8ef8)
5月14日[シェルの原型を実装](https://qiita.com/earthen94/items/26e6cff3082eb0935372)
5月15日[ソース分割](https://qiita.com/earthen94/items/df215200c03349e50947)
5月15日[開発日記](https://qiita.com/earthen94/items/abd79352ff2212b61185)
5月18日[FAT12　ファイル一覧表示](https://qiita.com/earthen94/items/cc6cd3afa2f672b429e3)

[2025-06-12 MS-DOSのMBRの処理を追う](https://qiita.com/earthen94/items/9b5773ccaac1cd5008ec)
[2025-06-16 MBR・VBR自作でFAT16として認識させる](https://qiita.com/earthen94/items/958fbd1a52031123bc0b)
[2025-06-17 FAT16ファイルシステムを手書きで作る](https://qiita.com/earthen94/items/d227367cd6cb84f86e70)
[2025-06-18 MBR→VBR→カーネルの順に起動する雛形（自作OS）](https://qiita.com/earthen94/items/19487698ae29aea71177)
[2025-06-19 自作OS　簡単なコマンドの実装](https://qiita.com/earthen94/items/f0f56bd46babffce8eda)


## 処理説明篇
汎用的な関数の説明を載せます。
[関数呼び出し時に PUSHA / POPA を使う理由](https://qiita.com/earthen94/items/e188474d7d1d410e6596)
[x86スタックの初期化](https://qiita.com/earthen94/items/221a31df94a96bbc5f7f)
[clear_screen（画面クリア）](https://qiita.com/earthen94/items/39638d696d764e4608f6)
[print_string（文字列表示）](https://qiita.com/earthen94/items/03eed11c7144626dcc5a)
[to_upper（小文字→大文字変換）](https://qiita.com/earthen94/items/564becdb2446085f6275)

## 問題解決篇
[2025-06-01 文字列表示がうまく行かない](https://qiita.com/earthen94/items/1232b2c6ce1f2ab793ae)
[2025-06-02 文字列表示前後のスタックが破壊されていないか確認](https://qiita.com/earthen94/items/4f0ae3047a4bd3b67930)
[2025-06-02 文字列表示がうまく行かなかった理由](https://qiita.com/earthen94/items/f29b3e5b2241596d32b2)
[2025-06-22 自作OS　VGA　VRAM直書き出力のデバッグ](https://qiita.com/earthen94/items/414d632c6ddefa40191c)
[2025-06-22 自作OS　VGA　VRAM直書き出力のデバッグ2](https://qiita.com/earthen94/items/c20bd60a45022db9e845)

## 手稿篇
処理説明篇と被っている気もしますが、手書きのものはこちらに載せます。
[2025-06-02 DSの初期化](https://qiita.com/earthen94/items/1bfda9c08d45333ee45a)
[2025-06-02 SS:SPの変化とスタックの中身](https://qiita.com/earthen94/items/a46ff2d0b518223189b3)

## BIOS実装(番外篇)
[2025-06-03 BIOS開発1日目　予備知識をつける(完全備忘録！)](https://qiita.com/earthen94/items/49b61b75a8df861a36a3)
[2025-06-04 BIOSの入口を探す](https://qiita.com/earthen94/items/233ba967a95229d6d9a9)
[2025-06-04 BIOS割り込み ( INT 0x10 AH=0x0E ) を再現する](https://qiita.com/earthen94/items/ddac440981c88755ee46)
[2025-06-05 INT 16H風のキーボード割り込みを自作](https://qiita.com/earthen94/items/aa633f2bc22ef0e65d71)
[2025-06-06 IRQ1（キーボード割り込み）によるHLT復帰の検証](https://qiita.com/earthen94/items/407571afb763264c987b)
[2025-06-07 8086実機 × QEMUで検証　 0x1F7ポートを使った起動装置判定法](https://qiita.com/earthen94/items/6f53064943eb4ffc0cca)
[2025-06-07 VGAレジスタの初期値ダンプと解析](https://qiita.com/earthen94/items/a9305a290ac62c75fea6)
[2025-06-08 IDEセクタ読み込み実行結果](https://qiita.com/earthen94/items/1009feeecb852ddef7ec)
[2025-06-08 BIOSを使わないブートローダ](https://qiita.com/earthen94/items/edb134dbbe5c632266fc)
VSCodeのスニペットで曜日つき日付を自動入力する

月日が必ず２桁になる方法しか見つからなかったけど正規表現置換で対処できたので、残しておきます
※[Visual Studio Codeのプラグイン「Insert Date String」で挿入される日付のフォーマットを変更する #VSCode - Qiita](https://qiita.com/kakukakupori/items/65d7795dc1c303960465#comment-5bad3883441010e85688) の内容に正規表現置換を追加しただけです
## コード

```json
{
	"insert Date": {
		"prefix": "today",
		"body": [
			// CURRENT_DAY_NAME_SHORTをCURRENT_DAY_NAMEに置き換えることで、「曜日」も含めることが出来る
			"${CURRENT_MONTH/^0//}/${CURRENT_DATE/^0//}(${CURRENT_DAY_NAME_SHORT})"
		],
		"description": "日付と曜日名を挿入"
	}
}
```

## 動作イメージ

![無題の動画 ‐ Clipchampで作成 (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3360664/13b57b44-13f1-4d83-b79b-375eee76e12c.gif)

## 参考

- [Visual Studio Codeのプラグイン「Insert Date String」で挿入される日付のフォーマットを変更する #VSCode - Qiita](https://qiita.com/kakukakupori/items/65d7795dc1c303960465#comment-5bad3883441010e85688)
- [Visual Studio Code - 設定 - 補完（スニペット）- 概要](https://freebsd.sing.ne.jp/tool/19/10/08/02.html)
- [Snippets in Visual Studio Code](https://code.visualstudio.com/docs/editing/userdefinedsnippets#_variable-transforms)
【未経験PM向け】未経験PMの実務と本質を一気に掴む ─ 人・もの・金で読み解く役割と判断

この記事では
PM(プロジェクトマネージャー)とは具体的にどのような役割なのかというテーマで抽象概念から具体的な内容まで実体験を元に解説します。

# 対象読者
- IT業界未経験でPM、PMOへのジョブチェンジを検討している方
- IT 3年目未満の方
- 情シス経験のみで請負・SES業界に興味のある方

# PMの役割とは
## 抽象的な定義
最大に抽象化すると
**「プロジェクトの成功に責任を持つ人」** です。

:::note info
プロジェクトとは（PMBOKより）

一時的：開始と終了がある
独自性：毎回異なる成果物を生み出す（繰り返しの作業ではない）
目的志向：何かしらの成果（プロダクト・サービス・結果）を出すために行われる
制約がある：スコープ（範囲）、時間、コスト、品質などが制限されている
:::

では、**プロジェクトが成功する** とはどういう状態かというと以下を満たすことだと私は考えています。

- 人・もの・金の観点でバランスが取れている状態を常に維持し続けること

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2646082/01b5fc68-fe74-4856-a3e3-9d523ca3c5a0.png)


では、バランスをとるために何をするのかという点を次の章で解説します。

## 具体的な役割
### 人 の観点
人の観点を大別すると以下の2種類に分けられます。

- **クライアント**
- **現場**

一般的にクライアントのバランスをとるために定期的なミーティングを事前に設定し必要に応じて以下のことを話し合い合意形成を行います。

- 作るものの明確化(要件定義)
- 進捗報告
- 課題報告と解決策提案

:::note alert
クライアントに余計な手間を取らせないことが鉄則です。そのうえで、最小限のコミュニケーションコストで合意形成することがPMの腕の見せ所です。
:::

現場のバランスをとるために日々以下のことを行います。

- 労務管理
- メンバーの体調、モチベーションの管理
- 進捗管理(タスクが予定通り終わっているか)

:::note alert
現場のバランスを報告・発生ベースで調整し始めるマネージャーをよく見ますが、事前に検知しておけば防げるケースが圧倒的に多いです。
そういったマネージャーは、どんなにクライアントから評価されていようが良いマネージャーとは言えないです。
:::

### もの の観点

ものの観点では、システム開発全体の5W1Hが常時明確になっている状態を維持することをバランスが取れていると言えます。

- **WHAT:** 何を作るのか(要件定義)、何が問題なのか(問題解決)
- **WHO:** 誰がやるのか(アサイン)
- **WHEN:** いつまでにやるのか(タスク設定)
- **WHERE:** どこに配置するか(アーキテクト)
- **WHY:** なぜ作るのか(要件定義)、なぜこの問題は起きるのか(問題解決) etc...
- **HOW:** どうやって作るのか(設計)、どうやって解決するか(問題解決)

また、システム開発(特にweb)は建設プロジェクト等と比較すると作ってる最中や作り終わってから改修が容易にできるという特徴があります。

よって、要件定義期間という"作るものを明確に定義する期間"中に決めきれなかった部分を後ろ回しにして作り始めるということがよく発生します。

乱暴に表現すると、"作るものがよくわからない状態で、とりあえず作り始める"という状態です。

このカオスな状態で常に5W1Hをアップデートし続け関係者に過不足なく伝えていくというのがプロジェクトマネージャーの肝の業務です。

:::note alert
当然ですがIT専門知識が要求される上、更に判断速度も要求されるので慣れるまでゲシュタルト崩壊をよく起こしますw
:::

## 金 の観点

金の観点は、主に人件費のことを指します。

バランスが取れている状態とは、
作るものに対して人が足りている、かつ充分な利益が出ている状態を維持している状態です。

具体的にどういうことを考えるのかという例を次に解説します。

#### 例
人件費：100万円【人/月】
お客さんの予算：1000万円

という状態で簡易的な**2ちゃんねる**のような掲示板サイトを作成するという要件です。

十分作れるので4人アサインして2ヶ月で作る計画を立てました。
(人件費は800万円、利益が200万円)

途中でお客さんから**youtube**みたいに動画アップロードできてストリーミングできるようにしたいと追加要望を頂きました。

どう考えても4人で2ヶ月では終わらないので以下を検討します。
- 現実的に何人で何ヶ月かかるのか
- 予算内で終わらせる代替案

結果として、以下をお客さんに伝えました。
『要望通りの機能を付与すると工期をもう一ヶ月延長する必要があり追加予算500万円が必要になります。もし、動画アップロード・ダウンロード機能付与のみで、ストリーミングには対応しなければ予算内期間内に収めることが可能です』

お客さんは、予算内に収める案で合意できました。

:::note warn
このようなケースもあります

・メンバーが突然交通事故にあって入院した
・3日で終わると思っていたタスクが実は2週間かかるレベルであった
etc..
:::

## まとめ
PMとはプロジェクト全体の全ての結果に対して責任を負う役割です。

成功率を上げるための手段として、常に全体を俯瞰して【人・もの・金】のバランスを調整し続けることが具体的な業務になります。

---
この記事を書いた背景には、かつて自分自身も“PMとは何をすればいいのか”が分からず苦しんだ経験があります。  
同じように迷う人にとって、この記事が羅針盤のような役割を果たせれば嬉しいです。
#0132（2025/05/13）クッキー同意バナーが表示されるようになった背景

## クッキー同意バナーが表示されるようになった背景とその歴史

最近、ウェブサイトを訪れるたびに「クッキーの使用に同意してください」と表示されるバナーを目にする人は多いでしょう。これは単なる流行ではなく、明確な法律的背景と技術的進化を経て世界中に広まったものです。この記事では、クッキー同意バナーが登場した背景とその歴史をわかりやすく解説します。

---

### 技術とプライバシーの背景

クッキー（Cookie）は、もともとユーザーがログイン状態を維持したり、ショッピングカートの中身を保存したりするために開発された技術です。しかし、やがて広告業界が「サードパーティークッキー」を活用してユーザーの行動を追跡するようになり、これがプライバシー侵害として問題視されるようになりました。

EUのGDPR（一般データ保護規則）でも、「クッキー識別子」は個人を識別できるオンライン識別子であり、保護すべき個人データの一種とされています。

---

### 欧州における規制の始まり：ePrivacy 指令

| 年          | 出来事                      | 概要                                    |
| ---------- | ------------------------ | ------------------------------------- |
| 2002年      | ePrivacy指令 2002/58/EC    | 通信の秘密やスパム対策を規定。当初はクッキー利用に明確な同意義務はなかった |
| 2009年      | 改正ePrivacy指令 2009/136/EC | 「ユーザーの明確な同意」がクッキー利用の前提とされた            |
| 2011年      | EU各国が国内法化                | 英国はPECRを改正し、企業に猶予期間を与えた               |
| 2012年5月26日 | 実質施行開始                   | 多くのウェブサイトで同意バナーが表示されるように              |

この改正が、現在の「クッキー同意バナー」の始まりとなりました。

---

### GDPRによる国際的な波及

2018年5月25日に施行されたGDPRでは、ユーザーの「自由意思に基づく、明示的かつ容易に撤回可能な同意」が求められるようになり、バナーのデザインや文言も厳格に規制されるようになりました。

これにより、クッキー同意バナーはEU圏内にとどまらず、世界中のウェブサイトが対応するようになっていきます。

---

### 世界への広がり

GDPRに続き、他国でも同様の法律が整備されました：

* **アメリカ・カリフォルニア州（CCPA）**：2020年施行。クッキーを含む個人情報の「販売」に関するオプトアウト権を導入。
* **日本（改正個人情報保護法）**：2022年施行。広告用クッキーなどの「個人関連情報」の第三者提供には、原則としてユーザーの同意が必要に。
* **その他（ブラジル、韓国など）**：GDPRをモデルに法整備を進め、同意取得の仕組みが国際標準に。

---

### 「いつから同意を求められるようになったのか？」のまとめ

* **2009年11月**：EUで改正ePrivacy指令が成立
* **2012年5月26日**：EU/UKで同意義務が実質施行。バナーが急増
* **2018年5月25日**：GDPR施行。国際的な標準へ
* **2020年1月以降**：CCPAなど米州でも導入が進む
* **2022年4月以降**：日本でもバナー表示が一般化

---

### 今後の展望

クッキー同意は、今後さらに進化していくと予想されます。EUでは「ePrivacy規則（EPR案）」が検討中で、ブラウザ組み込みの同意管理機能や、指紋認証のようなクッキー以外の技術への対応も議論されています。また、「ダークパターン」への規制強化や、より簡潔でユーザーに優しい同意の形が模索されていくでしょう。

---

### 結論

クッキー同意バナーは、2009年のEU規制から始まり、2012年に一気に普及、2018年以降は国際標準となりました。背景には広告による追跡行動の拡大と、それに伴うプライバシー保護意識の高まりがあります。技術と法律が交差する領域であり、今後も変化が続く重要なトピックといえるでしょう。
元々のエンジニアに戻りました

とある研究者が政治がああだこうだとこっちに火を焚き付けて騒いでいるものだから、組織で政経部門を立てて応援していたら、なにか逃げたようで。何がGHQ占領政策研究の世界的権威なんだか。彼こそ組織抜きで何ができるのかと思いますけど。  

筆者はPythonを使えといって、組織でも使っている人は多いでしょうけど、それでもMatzさんとの親交でRubyを使っているという変な数学おじさんです。
GitHub.com と GitHub Enterprise Server 併用環境で GitHub CLI を使う


# 概要

GitHub では GitHub CLI という GitHub上のリポジトリをCLIで操作できるコマンドが提供されています。このコマンドは GitHub Enterprise版でも利用することが可能であり、セルフホスト型の GitHub Enterprise Server でも同様に動作します。

複数のプラットフォームを併用した環境で GitHub CLI を利用し、アカウントを切り替える際に発生する問題とその解決策について記載します。

# 問題

GitHub CLI は複数のアカウントでのログインをサポートしており、 `gh auth switch` コマンドでアカウントを切り替えることが可能です。このとき、GitHub.com または、GitHub Enterprise Server のどちらか一方のプラットフォームだけを利用している場合は特に問題はありません。しかし、複数のプラットフォームでアカウントを切り替えて利用しようとすると問題が発生します。

GitHub CLI に複数のプラットフォームのアカウントが設定されているとき、GitHub CLI はデフォルトで GitHub.com の情報を参照するようになっています。つまりこの状況の時、GitHub Enterprise Server 上のリポジトリを参照したいにもかかわらず、GitHub CLI は GitHub.com 上のリポジトリしか参照しない。ということです。

そのため、複数のプラットフォームを併用している場合、GitHub CLI のターゲットホストを切り替える必要があります。しかし、現状の GitHub CLI にはそのようにターゲットホストを切り替える機能を持ちません。

このように `gh auth status` でアカウント情報は確認できますが `gh auth switch` ではターゲットホストを切り替えることはできません。

```
$ gh auth status
github.com
  ✓ Logged in to github.com account example_user (/home/example_user/.config/gh/hosts.yml)
  - Active account: true
  - Git operations protocol: https
  - Token: gho_************************************
  - Token scopes: 'gist', 'read:org', 'repo', 'workflow'

git.example.com
  ✓ Logged in to git.example.com account example_user (/home/example_user/.config/gh/hosts.yml)
  - Active account: true
  - Git operations protocol: https
  - Token: gho_************************************
  - Token scopes: 'gist', 'read:org', 'repo', 'workflow'
```

この件に関してISSUEも上がっており、想定通りの動作であるとコメントされています。

https://github.com/cli/cli/issues/10058

> 原文
What you're describing is the expected behaviour, as far as I can tell from your explanation. Logging in to a host doesn't switch the targeted host, it only stores a token. If you have authenticated against more than one host, `gh` will default to targeting github.com.

> 日本語訳（Google翻訳）
ご説明いただいた内容は、ご説明から判断する限り、想定通りの動作です。ホストにログインしても、ターゲットホストは切り替わらず、トークンが保存されるだけです。複数のホストで認証している場合、gh はデフォルトで [github.com](http://github.com/) をターゲットとします。

ここまでの話をまとめます。

- GitHub CLI にはターゲットホストを切り替える機能がない
- GitHub.com と GitHub Enterprise Server を設定するとGitHub CLI はデフォルトで GitHub.com だけを参照するようになっている。


# 解決策

GitHub CLI は環境変数 `GH_HOST` が設定されている場合、そのエンドポイントを参照する仕様になっています。

そのため、環境変数を設定することでターゲットホストを切り替えることができます。

```
export GH_HOST="git.example.com"
```

より切り替えを簡単にするために、つぎのようにエイリアスを設定し、 `~/.bashrc` などに登録する方法もあります。こうすることで既存の環境を汚さずにエイリアスを用いた GitHub CLI の実行時にのみ変数をセットすることができます。

```
alilas ghe="GH_HOST=git.example.com gh"
```

# あとがき

最近、弊社でも AI コーディングの波を受け、GitHub.com を利用することが推奨されるようになりました。私の所属するチームでは主に GitHub Enterprise Server を利用していましたが、現在移行作業を進めています。そのため、二つのプラットフォームを並行して運用する中でアカウント切り替えでこの問題に遭遇したため、その際に調べたことを記事にまとめてみました。

# 参考情報

GitHub, GitHub Docs, GitHub プラットフォーム間での GitHub CLI の使用(2025-05-13)
https://docs.github.com/ja/enterprise-cloud@latest/github-cli/github-cli/using-multiple-accounts
再帰処理まとめ[競プロ][算法命名]

### はじめる前に
灰色である筆者の知識は限定されています。編集リクエスト通しますので、是非知見を共有していただけると幸いです！
また、名称は二次創作です。

## はじめに
再帰処理は美しいです。無限大の可能性を秘めています。
ということで用途別にまとめてみます。
評価項目は以下のとおりです
>名称
>説明 + 一般用途
>コード
>総評

では参りましょう。

## 目次
・自己詠唱
・永久尾


### 自己詠唱

~~~cpp
void solve(int value) {
    if (value == limit)
        return;
    cout << "haha";
    return seek(++value);
}
~~~
一定の条件を満たすまで同じ関数を呼び続けるやつです。
用途：[マージソート](https://qiita.com/yp2211/items/db34480c64249ddd41e5)など
総評：普通すぎてダサい; オーバーヘッドがきつい...

### 永久尾
~~~cpp
void solve(queue<int> q) {
    while(!q.isEmpty()) {
        auto fr = q.front();
        q.pop();
        if(!conditionMet(fr)) q.enqueue(randFromPool());
    }
}
~~~
Queueを起点に探索します。直近の処理が直近の指令なのが独特です。
用途：[BFS](https://qiita.com/drken/items/996d80bcae64649a6580)など
総評：とても芸術的です。


## まとめ
ただの座学がさらに楽しく感じます。まるで恋愛ゲームを攻略してるかのごとく...
というわけで、ハッシュタグ #算法命名 で沢山考案しちゃいましょう！
ここまでお疲れ様でした。
Next.jsにでハイドレーションエラーが起きちゃった

## はじめに

案件でNext.jsを用いたフロントエンド開発をしていますが、実装中にハイドレーションマッチエラーが起きて少し詰まったので備忘録として執筆します！ :memo:

## ハイドレーションって？

Next.jsでは、初回アクセス時にサーバー側でHTMLを生成し、それをクライアントに送信します（SSR）。その後、クライアント側ではJavaScriptがロードされ、このHTMLに命を吹き込むプロセス（onClickなどのインタラクティブな動作をできるようにする）が発生します。これをハイドレーションと言います。

ハイドレーションでは、以下のことが行われます：
1. サーバーで生成されたHTMLが素早くブラウザに表示される
2. クライアント側でJavaScriptがロードされる
3. Reactがこの静的なHTMLに対して、イベントリスナーの追加などの処理を行い、インタラクティブな状態にする

このハイドレーションでは、HTMLをインタラクティブにするだけではなく、**サーバーサイドでレンダリングされたコンテンツ**と、**クライアントサイドでレンダリングされたコンテンツ**が**同一かどうか確認**します

## uuid v4によるハイドレーションミスマッチ

案件ではformライブラリに「conform」を採用していて、フォームのリセットする際にformのidを更新する処理を行います。
このformのidを更新する際に使用するのが[uuid](https://github.com/uuidjs/uuid)のv4という**実行されるたびに異なる値を返す**関数なのですが、このUUID生成君の扱い方の問題でハイドレーションミスマッチが起きていました。

サーバーサイドレンダリング時にuuid v4を呼び出すと、サーバー上でIDが生成されます。その後、クライアント側の初回レンダリング時に再度uuid v4が呼び出されると、異なるIDが生成されます。この結果、サーバーとクライアントで異なるHTMLが生成され、Reactはこの不一致を検出してハイドレーションエラーを発生させます。

具体的なエラーメッセージは次のようになります：
```text
Warning: Text content did not match.
Server: "123e4567-e89b-12d3-a456-426614174000" 
Client: "98765432-abcd-4321-efgh-987654321000"
Error: Hydration failed because the initial UI does not match what was rendered on the server.
```

## コード例と解決策

以下のようなコードでこの問題が起きてました

```tsx
"use client";

import { useForm } from "@conform-to/react";
import { useState } from "react";
import { v4 } from "uuid";
...

export const ExampleContainer = ({
  initialValues,
  onSearch,
}: ExampleContainerProps) => {
  // 問題のある実装
  const [formInstanceKey, setFormInstanceKey] = useState(V4()); // サーバーとクライアントで異なる値が生成される
  
  const [form, fields] = useForm<Example>({
    id: `example-form-${formInstanceKey}`,
    defaultValue: {
      keyword: "",
      // 他のフォームフィールド...
    },
  });
  
  // 以下、コンポーネントの残りの部分...
};
```

この実装では、コンポーネントのレンダリング時に毎回 `v4()` が呼び出されてサーバーとクライアントで異なるIDが生成されていました。

### 解決策：useEffectでクライアント側のみで生成する

この問題を解決するために、`useEffect`フックを使用してクライアント側でのみUUIDを生成するように変更しました：

```tsx
"use client";

import { useForm } from "@conform-to/react";
import { useState } from "react";
import { v4 } from "uuid";
...

export const ExampleContainer = ({
  initialValues,
  onSearch,
}: ExampleContainerProps) => {
  // 空の文字列で初期化
  const [formInstanceKey, setFormInstanceKey] = useState("");

  useEffect(() => {
    setFormInstanceKey(v4());    // client 側でフォームのインスタンスキーを生成させる
  }, []);

  const [form, fields] = useForm<Example>({
    id: `example-form-${formInstanceKey}`,
    defaultValue: {
      keyword: "",
      // 他のフォームフィールド...
    },
  });
  
  // 以下、コンポーネントの残りの部分...
};
```

このアプローチでは：

1. 初期レンダリング時（サーバーとクライアント両方）では、`formInstanceKey`は空の文字列になります
2. クライアント側でのみ`useEffect`が実行され、そこで`v4()`を呼び出してUUIDを生成します
3. これにより、サーバーとクライアントの初期レンダリングで同じHTMLが生成されるため、ハイドレーションミスマッチが発生しなくなります

この解決法がベストなのかは分かりませんが、一旦ハイドレーションミスマッチエラーは解消されます。
uuidの他にも時間依存のAPI使用でも同じようなエラーが起こります（Date()とか）
## 参考リンク

- [Next.js公式ドキュメント: React Hydration Error](https://nextjs.org/docs/messages/react-hydration-error)
- [React公式ドキュメント: ハイドレーション](https://ja.react.dev/reference/react-dom/client/hydrateRoot)
一からバックエンドエンジニアへ　【第０回】

初めまして！もちです。
Qiita初投稿なので自己紹介でもやろうと思います
## 自己紹介
* 高専の3年
* Node.jsを勉強中
* バックエンドは全くの未経験
* 趣味はポータブルオーディオと映像制作

***
備忘録を兼ねて始めてみました。
これから毎週進捗や気付きをここで投稿していこうと思います。
これからよろしくお願いします。
【2025/05/13】AWS編：重要キーワード8選【クラウド×インフラ勉強メモ】

# 【2025/05/13】AWS編：重要キーワード8選【クラウド×インフラ勉強メモ】

## はじめに

こんにちは。インフラ／クラウドの勉強を毎日コツコツ進めている筆者です。

今日は、**AWS**に関する重要なキーワード8つをピックアップしてまとめました。

---

### 1. **Amazon Translate**
> 高精度な多言語対応の機械翻訳サービス。

- 深層学習モデルベース
- アプリケーションに組み込みやすい
- グローバル対応アプリ開発に最適

---

### 2. **AWS Transit Gateway**
> VPCを効率よく一元接続できるハブ的存在。

- 複数VPC・オンプレミス環境との接続が可能
- セキュリティの集中管理がしやすくなる
- 大規模ネットワーク構成に有効

---

### 3. **リザーブドインスタンスの種類**
| 種類              | 特徴                       | 割引率       |
|-------------------|----------------------------|--------------|
| スタンダード       | 柔軟性低い・割引高い         | ◎（最大75%） |
| コンバーティブル   | 柔軟性高い・割引やや低め     | ○（最大54%） |

---

### 4. **ターミネーションポリシー**
> Auto Scaling Groupでインスタンスを終了させるルール。

- `OldestInstance`: 一番古いインスタンスから削除
- `OldestLaunchConfiguration`: 古い起動設定を使っているインスタンスから削除

---

### 5. **スティッキーセッション（Sticky Session）**
> 同じユーザーのリクエストは同じインスタンスへ！

- セッション情報を保持しやすくなる
- 状態を持つアプリに便利（例：ショッピングカート）

---

### 6. **Amazon RDSの制限**
> ファイルシステムへのアクセスは不可！

- OSやファイル構成への直接アクセスは制限
- 運用はAWS側で管理されるマネージドサービス
- 自由度は少ないが、保守性は高い

---

### 7. **EBSボリュームの暗号化**
> セキュリティ対策の基本！

- 起動時や後からでも暗号化可能
- KMS（Key Management Service）と連携
- 情報漏洩対策やコンプライアンス対応に必須

---

### 8. **EBS汎用SSDの接続制限**
> AZ（アベイラビリティゾーン）をまたげない！

- 同一AZ内のインスタンスにのみアタッチ可能
- AZが異なるとコピーなど別の手段が必要
【2025/05/13】基本情報編：重要キーワード8選【試験対策メモ】

# 【2025/05/13】基本情報編：重要キーワード8選【試験対策メモ】

## はじめに

こんにちは。基本情報技術者試験の勉強を進めている筆者です。

今日は、**基本情報技術者試験**で役立つ重要なキーワード8つをピックアップしてまとめました。

---

### 1. **ガントチャート**
> 作業とスケジュールを視覚化！

- プロジェクト管理に必須
- タスクの進捗を「横棒」で表現

---

### 2. **アローダイアグラム**
> 矢印で表す作業工程図。

- タスクの順序と依存関係を明示
- クリティカルパス（遅れられない工程）がわかる

---

### 3. **シーケンス図**
> システムのやり取りを時系列で見える化！

- ユーザー⇔システム、システム⇔APIの動作確認に便利
- UML図の一種

---

### 4. **WBS（Work Breakdown Structure）**
> 作業の「見える化と分割」で管理しやすく！

- タスクを階層的に整理
- 抜け漏れを防ぎ、スケジュール作成に役立つ

---

### 5. **ファジング（Fuzzing）**
> バグを炙り出す「予測不能な入力」テスト。

- 想定外のデータで脆弱性を発見
- セキュリティ系の試験でもよく登場

---

### 6. **WPA3**
> 次世代Wi-Fiのセキュリティ標準！

- WPA2より強力な暗号化と認証
- パブリックWi-Fiなどで重要

---

### 7. **SIEM**
> セキュリティイベントの「見える化」と「自動対応」。

- 複数システムのログを一括収集・分析
- インシデント検知・対応を効率化

---

### 8. **RTO（Recovery Time Objective）**
> 復旧までに許容される時間。

- 災害・障害が起きたときに「いつまでに戻すか」
- RPO（どこまで戻すか）と合わせて重要な概念
ブラウザとUSBだけでPicoと通信？Web Serial APIの基本  

## 今回の内容

さて、[第0回](https://qiita.com/asd_m/items/7ecf9ba27909e7bfa844)では自己紹介、[第1回](https://qiita.com/asd_m/items/1b470de5ded46f6d8336)では開発動機と使用技術についてまとめてみました。  
第2回の今回は、使用技術の中で皆さんに最も馴染みのないであろう「Web Serial API」の概要と、基本的な使い方について、ごく簡単なサンプルとともに解説してみたいと思います。

---

## Web Serial APIとは？

正確な情報は [mozilla.orgのWeb Serial APIに関するドキュメント](https://developer.mozilla.org/ja/docs/Web/API/Web_Serial_API) をご確認ください。  
ごく簡単にまとめると、「**操作者が許可したシリアルポートへ、ブラウザを通じてJavaScriptから読み書きを行うAPI**」です。

基本的には**ChromiumベースのPCブラウザ**で利用可能です。AndroidやiOS上のブラウザ、あるいはFirefoxでは使用できませんが、WindowsだけでなくmacOSでも動作します。  
私自身は未確認ですが、ARMで動作するLinuxでも使用できるという情報もあります。
ただし以下のような制限があります。

- 実行元が `localhost`、または**正しい証明書を持つ**HTTPSサイトである必要がある
- `file://` で開いたローカルHTMLファイルや、いわゆる「オレオレ証明書」のHTTPSサイトでは動作しない

私は、ローカル環境でのテストには VSCode の [Live Server 拡張機能](https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer) を使っています。

---

## Web Serial APIの基礎の基礎

ごく簡単なコード（HTML+JavaScript）を [GitHub](https://github.com/DBA-Z21A/raspico_wifi_set_repl/blob/main/web/frontend/web_serial_test.html) に置いてありますので、そちらも確認しながらお読みください。

まず、Web Serial API を使用可能なブラウザでは、`navigator.serial` というオブジェクトが存在します。以下のようにして、APIの利用可否を確認できます。

```javascript:web_serial_test.html
if (!navigator.serial) {
    alert("Web Serial APIはこのブラウザでサポートされていません。");
    return;
}
```

次に、
```javascript:web_serial_test.html
const port = await navigator.serial.requestPort();
```
とすると、ブラウザが利用者に対して「**このWebページのJavaScriptにどのシリアルポートの使用を許可するか？**」と尋ねるダイアログを表示します。

![screenshot2025051201.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485833/2cb1619f-2075-43bd-9bac-af65ce931430.png)
※「COM11」は環境によって変化します。

このダイアログで許可を出すと、そのポートに関する情報を持つ`SerialPort`インスタンスが、変数`port`に格納されます。
※非同期処理なので`await`を忘れないようにしましょう！

この`SerialPort`インスタンスを用いて、ボーレートを指定しながら[シリアルポートを開いたり](https://developer.mozilla.org/ja/docs/Web/API/SerialPort/open)、データの読み取り用に[Readerオブジェクト](https://developer.mozilla.org/ja/docs/Web/API/ReadableStream/getReader)、データの書き込み用に[Writerオブジェクト](https://developer.mozilla.org/ja/docs/Web/API/WritableStream/getWriter)を生成したりします。

今回のサンプルコードでは、ポートの情報を取得する[getInfo()メソッド](https://developer.mozilla.org/ja/docs/Web/API/SerialPort/getInfo)を呼び出し、Web Serial API が正常に動作していることのみを確認しています。


## 次回の予定
次回は、実際に Web Serial API からシリアルポートを介して、REPL に対して読み書きを行ってみる予定です。
アプリ開発100本ノックDay 4: 円周率チェッカー - あなたの誕生日、円周率に隠れてる？🔍

# 100個のアプリ作るぞ！生成AIと一緒の大冒険🎉 -



**ミッション:** 4桁の数字を入力すると、それが円周率の何桁目に出現するのか教えてくれるアプリを作る！

**開発ストーリー:**

円周率って、無限に続く数字じゃないですか…🤔 そこに自分の誕生日とか、好きな数字とかが含まれてたら、なんかロマンチックじゃないですか？💖 ということで、4桁の数字を入力すると、それが円周率の何桁目にあるのか教えてくれるアプリを作ってみました！✨  円周率のデータはテキストファイルで用意して、Pythonで検索するシンプルな仕組みです。

**コードはこちら！ (Python):**

```python
from flask import Flask, render_template, request

app = Flask(__name__, template_folder='pi')

with open("pi.txt","r") as f:
    pi = f.read().replace(".", "")

@app.route("/", methods=["GET", "POST"])
def index():
    # 以下略 (コードは前と同じ)

if __name__ == "__main__":
    app.run(debug=True, port=5006)
Use code with caution.
Markdown
HTMLで結果を表示！:
<!DOCTYPE html>
<html>
<head>
    <title>円周率検索</title>
</head>
<body>
    <h1>4桁の数字を入力してください</h1>
    <form method="post">
        <input type="text" name="number" value="{{ input_number }}" maxlength="4">
        <button type="submit">検索</button>
    </form>

    {% if position != -1 %}
        <p>「{{ input_number }}」は、円周率の小数点以下{{ position }}桁目にあります。</p>
    {% elif input_number != "" %}
        <p>「{{ input_number }}」は見つかりませんでした。</p>
    {% endif %}
</body>
</html>


工夫ポイント:
円周率のデータはテキストファイルで管理！
FlaskでWebアプリ化！
HTMLで結果を見やすく表示！

今日の学び:
円周率って奥が深い…🤔
ファイル読み込み、意外と簡単！👍
文字列検索、便利！✨
未来への野望！:
もっと桁数を増やしたい！ (自分の電話番号とかも検索できるように！📞)
検索速度をもっと速くしたい！🚀
見つかった位置を円周率のビジュアライザーで表示できたら面白そう！👀
100個アプリ開発の旅、順調に進んでます！😄
手を動かして“形にする”：エコクラフトで実用的なかごを作ろう

## はじめに

普段はC#や自然言語処理などの業務寄りの開発を行っていますが、  
今回は少し毛色の違う趣味の話──エコクラフト作品の紹介をします。

エコクラフトとは、再生紙を原料にした紙バンドを使った手芸です。  
立体的な構造物を編む中で、設計や素材の特性を意識する点が技術職にも通じるものがあり、  
僕にとってはとても面白い試みでした。

## 作品紹介1

![PXL_20230717_051509016.MP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4082367/565d9d7c-ca83-452a-b589-c2bed7dba1a1.jpeg)

書籍のレシピをベースにして制作した、実用的なかごです。  
色の組み合わせをシンプルにし、素材の曲線が映えるように設計しています。

整形精度を保つため、編みのテンション管理と端部の始末に特に気を配りました。  
編んでいて“手に馴染む感覚”があり、作っていて気持ちのいい作品でした。

## 作品紹介2

![1746545012704.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4082367/6a4d9a72-cb99-4676-a5d6-c082823ed932.jpeg)

こちらは白と茶の2色を交互に編み込んだかごで、  
視認性が高く、パターンのリズムが作業中にもはっきり感じられる作品でした。

側面には控えめな緑のワンポイントを入れていて、  
単調になりがちな配色にアクセントを加えるとともに、  
底部との結合部を視覚的に引き締める効果を狙っています。

仕上げの口巻きの編み込みが複雑で、形が歪まないように整えるのが難しかったですが、  
完成後のシルエットは非常に満足のいくものになりました。

## 作品紹介3

![PXL_20240120_121045741.MP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4082367/42f381b3-8661-4d36-906c-d3fc0b1dead6.jpeg)

こちらは装飾に重きを置いた作品で、黒のクラフトバンドを使用しています。  
黒色は視認性が非常に低く、途中で間違えたとしても中々気付けずに大変でした。
花結びと呼ばれる手法です。

構造もかなり複雑で、見た目以上に工程管理が難しい作品です。  
同じ物をもう作れる気がしません。

## 技術職の自分にとっての“手作り”

プログラムにおけるロジックや構造設計と同様に、  
クラフトでも素材の特性や張力、構造バランスを見ながら“工程”を組み立てていきます。

つまり、こうした手芸作品にも「設計」「段取り」「再現性」という思考が求められ、  
それらは業務で培ってきた技術的視点と地続きであることに気づかされました。

## おわりに

今回紹介したエコクラフト作品は、どれも単なる趣味以上に「構造的思考」を刺激するものでした。

ソフトウェア開発の合間に、手を動かして“形になるもの”を作る。  
それは新鮮な感覚でありながら、自分の得意分野にも自然につながっていました。

ここまで読んでいただき、ありがとうございました。

> それはそれとして、単純に無心で作業できるので楽しいです。
> 安価で始められるので、興味がある方は是非お試しください。
原神：Xアカウントでログインしていてログインできなくなった時の対処法

# 原神：Xアカウントでログインしていてログインできなくなった時の対処法
---
## はじめに

原神をX（旧Twitter）アカウントだけでプレイしている場合、X側の仕様変更や連携エラーでログインできなくなるリスクがあります。  
上記の場合にログインできなくなった場合のログインする方法です。

---

## 手順：HoYoversをXアカウントでログイン→メールアドレス連携（HoYoverse通行証作成）

1. **XアカウントでHoYoversにログイン**  
   https://account.hoyoverse.com/passport/index.html#/login

2. **Xアカウント連携を行う**  
   アカウント情報からアカウントの紐付けを行う

3. **メールアドレスを入力して認証コードを取得**  
   新しく連携したいメールアドレスを入力し、「認証コード獲得」を押します。  
   ※他のHoYoverse通行証で使っているメールアドレスは利用できません。

4. **メールで届いた認証コードを入力**  
   入力したメールアドレス宛に認証コードが届くので入力します。

5. **連携完了**  
   これでXアカウントとメールアドレス（HoYoverse通行証）が連携されます。  
   今後はメールアドレス＋パスワードでもログイン可能になります。

---

## 注意点

- 一度設定したHoYoverse通行証のユーザー名は変更できません。
- 連携に使うメールアドレスは、他のHoYoverse通行証で使われていないものを用意しましょう。
- メールアドレスはエイリアスでも可能

---

## まとめ

Xアカウントのみで原神をプレイしている方は、必ずメールアドレス連携（HoYoverse通行証作成）を行いましょう。  
これでアカウント保護と今後の安全なログインが可能になります。

---
ああ

import streamlit as st
import pdfplumber
import camelot
import tempfile

st.title("PDFデータ仕様書メタ情報抽出ツール")

uploaded_file = st.file_uploader("PDFファイルをアップロードしてください", type="pdf")

if uploaded_file:
    with tempfile.NamedTemporaryFile(delete=False, suffix=".pdf") as tmp_file:
        tmp_file.write(uploaded_file.read())
        pdf_path = tmp_file.name

    st.subheader("抽出されたテキスト")
    with pdfplumber.open(pdf_path) as pdf:
        for i, page in enumerate(pdf.pages):
            text = page.extract_text()
            st.text(f"--- Page {i + 1} ---")
            st.text(text)

    st.subheader("抽出されたテーブル")
    tables = camelot.read_pdf(pdf_path, pages="all", flavor="stream")
    for i, table in enumerate(tables):
        st.text(f"--- Table {i + 1} ---")
        st.dataframe(table.df)
MacBook M4 proでStableDiffusionの機械学習をやってみる

## はじめに
- 課題と目的
MacBook M4proでStableDiffusionのHypernetworkを動かして機械学習を実行してみるよ
ネット上ではMacBook M4proで動かしている例がないので、自分が実際に試した内容を書いてみます

- 本記事でできること
MacBook M4proでStableDiffusionのHypernetworkで絵柄の機械学習ができるようになります

## 前提条件
- 技術スタック
StableDiffuionのWebUIを使えるようにしてください

- 動作環境
MacBook M4pro　CPU14コア、GPU16コア、メモリ24G

## 実行手順
### Step 1: WebUIの起動
起動オプションに必ず
`--no-half --precision full `
を指定して下さい（重要！）
このコマンドを指定しないと浮動小数点演算の精度が低くなって画像学習に失敗してしまいます
コマンド全体は以下のような感じです
`./webui.sh  --no-half --precision full --skip-torch-cuda-test  --disable-safe-unpickle`

### Step 2: Hypernetworkでの機械学習実行
https://qiita.com/takada-at/items/89e08c7a252b7e714f2e
あたりの記事を参考に設定すればOK！

ちなみに、機械学習に要した時間は10000ステップで３時間程度、ApplieCliconでも割と現実的な時間で学習できるようですね

### Step 3: 画像生成
Step 2で作成した学習データはSettingタブ→Extra Networksから設定できます
![アートボード 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136860/8d21533e-e708-4b0b-a8f0-f46b1993604e.png)
後はtxt2imgやimg2imgを実行すれば、Hypernetworkで生成したモデルが適用されます。

自分の絵柄を学習した結果をTwitterにも上げています
https://x.com/fQBJZWizNB0xwSL/status/1922070199563366902
素数を爆速で探すアルゴリズム[競プロ]

## コード
~~~cpp:エラトステネスの篩 ~ Sieve of Eratosthenes
const int N = 1e6;
vector<bool> isPrime(N+1, true);
isPrime[0] = isPrime[1] = false;
for(int i=2; i<N; ++i) {
    if (isPrime[i]) for (int j = i*i; j <= N; j+=i) isPrime[j] = false;
}
~~~

### 素数篩の解説
「そすうふるい」と読むそうです。
これは素数の原則に基づくものです。
はじめに例外処理をしています。0はdummyで、1は定義上素数ではないので。
そして、その他全ての数が素数だと見做して始まります。

1. 数字を倍率に含むものはアウト
1. 重複参照を防ぐ

その意図が込められたforループです。

## まとめ
こちらのコードはchatgpt先生に出力してもらいました。
AIでの学習って効率よくて知識欲求が満たされて最高ですよね？
それでは！
IBM Cloudの無償プロモーションを使ってみた

# 0. はじめに

エッジAIセンシングプラットフォームである[AITRIOS](https://www.aitrios.sony-semicon.com/)の公式ガイドにIBM Cloudは出てこないのですが、特別な仕掛けがある感じではないので、IBM Cloudとの接続や活用を目指してテストをしていきたいと思っています。

そこで、知人より紹介されたIBM cloud VPCの無償オファーを活用して進めてみることにしました。このオファーは、期限が2025年末までの連続した4ヶ月間で累計US$1,000分のクレジットが利用可能というものです。今回のようなテストにはうってつけの特別なオファリングです。2025年末までとなっていますが、延長の可能性もありますので、期限後も要チェックですが、当然のことながら一人一回しか使えません。

# 1. 使えるもの

このクレジットが適用されるのは、VPC(Virtual Private Cloud)をプロモーションする目的で提供されていますので、基本的にVPC向けのリソースになります。[詳細は公式の説明ページ](https://www.ibm.com/products/blog/5-ways-to-use-ibm-cloud-vpc-credits)でご確認いただくとして、おおまかには、下記のような感じです。高価なものから安価なものまでありますので、たとえばBareMetalサーバーをDeployすると一瞬でクレジットを使い切ると思いますが、小さい構成の仮想サーバーであれば4ヶ月の有効期間内でかなり色々な使いかができると思います。Floating IPも含まれていますので、外部からの接続もできますし、他の無償枠があるオファリングなどと組みわせることでもかなり面白いことができそうです。

    2nd Gen Intel® Xeon® processor-based
    4th Gen Intel® Xeon® processor-based IBM Cloud Virtual and Bare Metal Servers for VPC
    Confidential Computing with IBM Cloud Virtual Servers for VPC
    4th Gen Intel® Xeon® processor-based
    Intel® SGX® confidential computing  
    IBM Cloud VPC+ Disaster Recovery as a Service
    IBM Cloud Virtual Private Endpoint for VPC
    IBM Cloud Image Service for VPC
    IBM Cloud Backup for VPC
    IBM Cloud Flow Logs for VPC
    IBM Cloud Dedicated Host for VPC
    IBM Cloud Direct Link Dedicated for VPC
    IBM Cloud Floating IP for VPC
    IBM Cloud Load Balancers for VPC
    IBM Cloud Block Storage for VPC
    IBM Cloud File Storage for VPC
    
## 2. 実際に使ってみる
このオファーを使うのは至って簡単で、IBM Cloudにクレジットカードを登録するアカウントを作成して、プロモーションコードを登録するだけです。使えないオファリングもありますので、注意しながら使うリソースなどを選択しましょう。プロモーションコードは、[公式のページ](https://www.ibm.com/products/blog/5-ways-to-use-ibm-cloud-vpc-credits)でご確認ください。
また、組み合わせて使うこのプロモーションの対象外となっているオファリングでも無償枠があるものは、[IBM Cloud無料利用枠というページ](https://www.ibm.com/jp-ja/cloud/free)で紹介されていますので、そちらの参照をお勧めします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314541/60338b1b-3139-4803-b5d9-250851226806.png)
上記の画像は、仮想サーバーのオーダー画面ですが、緑で囲われた部分にプロモーションコードを入力して適用ボタンを押すだけで適用されます。

私は、実際に仮想サーバーをVPC内に3台建てて、使っています。別の記事にこの仮想サーバーを使い、AITRIOSのデバイスからの[推論結果を転送する方法の記事](https://qiita.com/Shibu-Shin/items/e09fe3d778dcc21b8ae7)も公開していますので、ご興味がある方はご参照ください。
[Siren Error] Error parsing App Store JSON data でハマった話

Sirenは現在積極的なアップデートが停止され、read-onlyとしてメンテナンスはしばらく続けるという状態になっている。iOSネイティブの iTunes API を使ったアップデート通知の受け取り方法もあるが、現状まだSirenを使いたい。

表題のエラーがいつからか出るようになったので、Sirenを最新の6.1.3にアップデートするも以前治らない。

原因は　Debug と Release で Bundle Identifier を分けるように変わったこと。

![スクリーンショット 2025-05-13 20.43.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242610/922a85e2-ee1e-46fb-b167-3e6e80d22e79.png)

そのため、APIManagerの初期化時に明示的に `bundleID` を引数で指定しないといけないということだった。

```swift
class AppDelegate: NSObject, UIApplicationDelegate {
    func application(_ application: UIApplication,
                     didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool {
        // https://github.com/ArtSabintsev/Siren/blob/master/Example/Example/AppDelegate.swift
        // Production の App Store 最新リリースから1日以上経っていないと通知されない仕様
        // App Store の段階的なリリースを使用する場合はカスタマイズが必要
        let siren = Siren.shared
        siren.apiManager = APIManager(country: .japan, language: "ja_jp", bundleID: "reright.yachogo") // デフォルトでは local は .debug になるため
        siren.rulesManager = RulesManager(globalRules: .persistent)
        siren.presentationManager = PresentationManager(
            updateButtonTitle: "今すぐアップデート",
            nextTimeButtonTitle: "後で"
        )

        siren.wail { results in
            print("Siren results: \(results)")
            switch results {
            case .success(let updateResults):
                print("AlertAction ", updateResults.alertAction)
                print("Localization ", updateResults.localization)
                print("Model ", updateResults.model)
                print("UpdateType ", updateResults.updateType)
            case .failure(let error):
                print(error.localizedDescription)
            }
        }
    }
```

なお、5系では

```swift
siren.apiManager = APIManager(countryCode: "JP")
```

を使用していたが、bundleIDを指定する初期化関すは `APIManager(country:, language?:, bundleID?:)` しかないようで、READMEやリポジトリ内に記載がないが language コードはデフォルトが `en_us` なので `ja_jp` が正しい模様。

## 余談

> The app has been released for 0 days, but Siren cannot prompt the user until 1 days have passed.

ローカルでテストしようとすると上記エラーが出ることがあるが、エラー文の通り Siren は最新アプリの App Store 上のリリースから1日経ってないと通知されないので、1日待つ必要がある（最近英語がなんか読めない）。
30代転職エンジニア2年目が考えるキャリアプラン

１．現状
SESエンジニアとして他業界から転職し、2年目を迎える30代未経験のエンジニアです。1年目は様々な技術に触れたものの、浅く広い知識を身に着け、何者でもないエンジニアになりつつあります。Webアプリ作成で触れた技術としてはJava,MySQL,Azureを少しずつ…。今後どのようなキャリアを歩むべきか悩み中です。

２．行動
今後のキャリア戦略を考えるために以下のような行動をしてみました。
　・気になる技術（AI）について求人検索。
　・現状のスキルセットで将来目指すキャリアプランをCnatGPTなどに作ってもらう。
　・会社の上司にキャリアプランを相談してみる。

３．結果
　・気になる技術（AI）について求人検索。
 　　AIを開発することよりも、AIをどのように活用するか、連携するかが現状求められているようす。市場価値ってやつを調査。

　・現状のスキルセットで将来目指すキャリアプランをCnatGPTなどに作ってもらう。
 　　現状のスキルセット（Java,MySQL,Azure）と気になる技術（AI）を含めて「データ分析エンジニア、インフラエンジニア、フルスタックエンジニア」などの回答を出してくれた。さすがだね。
   
　・会社の上司にキャリアプランを相談してみる。
 　　自分の性格と合いそうな仕事や業界を考えるといいとのこと。

４．考察
　今後キャリアプランは変更してもいいという前提で次のように考えました。自分は学ぶのが好きという性格を踏まえつつ、Webアプリ作成という領域でフルスタックを目指して継続学習。さらに、余力があれば、AIとの連携方法なども学習していこうと思います。欲張りエンジニアと思われてしまいそうですが、現状はまだまだ2年目なので、色々手を出して楽しみながらキャリアを定めていこうと思います。
curlコマンドのレスポンスタイムを手軽に計測する方法3選

## はじめに

`curl`コマンドのレスポンスタイムを計測する方法を備忘録としてまとめます。

## curlコマンドのレスポンスタイムを手軽に計測する方法3選

この記事では[httpbin](https://httpbin.org/)へのリクエストを例にします。

[httpbin](https://httpbin.org/)は下記のようなレスポンスを返してくれるサービスです。

```bash
% curl https://httpbin.org/get
{
  "args": {}, 
  "headers": {
    "Accept": "*/*", 
    "Host": "httpbin.org", 
    "User-Agent": "curl/8.7.1", 
    "X-Amzn-Trace-Id": "Root=1-68232dac-309e4610759c1c0914dc0226"
  }, 
  "origin": "54.92.97.215", 
  "url": "https://httpbin.org/get"
}
```

※`origin`にはアクセス元のIPアドレスが返されるため、マスクしています。


### ①`-w`(`--write-out`)オプション

次のように`%{time_total}`を渡して使います。

```bash
% curl https://httpbin.org/get -w "%{time_total}秒\n"  
{
  "args": {}, 
  "headers": {
    "Accept": "*/*", 
    "Host": "httpbin.org", 
    "User-Agent": "curl/8.7.1", 
    "X-Amzn-Trace-Id": "Root=1-68232e03-0dc9b4544b4fde143c620665"
  }, 
  "origin": "52.193.217.102", 
  "url": "https://httpbin.org/get"
}
0.699421秒
```

レスポンスタイムに関わる変数は`time_total`以外にもいくつか用意されています。

以下は一例です。

- `time_connect`: TCPコネクションの確立にかかった時間
- `time_namelookup`: DNSの名前解決の完了にかかった時間


他にもたくさんあるため、気になる方は[公式ドキュメント](https://curl.se/docs/manpage.html#-w)をご確認ください。

### ②`time`コマンド

`time`コマンドは単純に先頭に記述するだけでOKです。

```bash
% time curl https://httpbin.org/get  
{
  "args": {}, 
  "headers": {
    "Accept": "*/*", 
    "Host": "httpbin.org", 
    "User-Agent": "curl/8.7.1", 
    "X-Amzn-Trace-Id": "Root=1-68232e1d-204d8fd0628c515b5719548c"
  }, 
  "origin": "52.193.217.102", 
  "url": "https://httpbin.org/get"
}
curl https://httpbin.org/get  0.02s user 0.01s system 4% cpu 0.774 total
```

`time`はOSに標準搭載されているコマンドなので、`curl`以外にも使えます。

CPUやシステムリソースの使用状況も確認可能なのが特徴です。

### ③`httpstat`コマンド

`curl`の機能を拡張したツールとして、`httpstat`を使う方法もあります。

ただし`brew install httpstat`でインストールが必要です。

```bash
% httpstat https://httpbin.org/get 
Connected to 54.236.92.255:443 from 172.16.0.2:52164

HTTP/2 200 
date: Tue, 13 May 2025 11:34:32 GMT
content-type: application/json
content-length: 255
server: gunicorn/19.9.0
access-control-allow-origin: *
access-control-allow-credentials: true

Body stored in: /var/folders/qf/klw8c2194mz14ybjr3n7q6680000gn/T/tmpka77l8fi

  DNS Lookup   TCP Connection   TLS Handshake   Server Processing   Content Transfer
[     1ms    |      179ms     |     331ms     |       245ms       |        1ms       ]
             |                |               |                   |                  |
    namelookup:1ms            |               |                   |                  |
                        connect:180ms         |                   |                  |
                                    pretransfer:511ms             |                  |
                                                      starttransfer:756ms            |
                                                                                 total:757ms   
```

HTTPリクエストの各ステップを視覚的に表示してくれるため見やすいのが特徴です。

## おわりに

- 雑に計測したい時: `time`コマンド
- スクリプト内で使ったり文字列として整形して出力したい時: `-w`オプション
- ボトルネックを視覚的に可視化したい時: `httpstat`

こんな感じの使い分けになるのかなと思いました。
whenever は設定ファイルのパス名に注意

# はじめに

決まった時刻に何かをやらせたいとき cron を使うが，cron の設定（crontab）を書くのは非常にめんどくさい。
Ruby の [whenever](https://rubygems.org/gems/whenever) という gem を使えば，いつ何をやらせたいかが Ruby で記述でき，簡単なコマンドでそれを crontab に反映させることができる。

Rails と組み合わせることも多いが，Rails とは無関係に使うこともできる。

本記事は，whenever の設定を置いたディレクトリー名が妥当でなかったために不可解な現象が起こった，という話。

# whenever の手順

まず最初に whenever の使い方を振り返ってみる。
本節ではトラブルは起こらない。

## 準備

まずは gem のインストール：

```shell
gem install whenever
```

設定を置くディレクトリーが /Users/nemo/hoge であるとする：

```shell
cd /Users/nemo/hoge
```

whenever 設定ファイルの雛形を作る：

```shell
wheneverize
```

べつに手作業でファイルを置いてもいいのだが，このコマンドを使えば簡便。
/Users/nemo/hoge/config/schedule.rb というファイルができる（config ディレクトリーも自動的に作られる）。

このファイルに「いつ何をやらせるか」を書く。
書き方の例が入っているがコメントアウトされているので，実質は空だ。

## タスクを記述

試しに schedule.rb に何か書いてみよう。

Linux や macOS ではコマンドラインで

```shell
date +%R
```

と打てば現在時刻を 18:24 といった形式で表示してくれる。これをファイル now.txt に書き出す，ということを 1 分ごとにやらせてみよう。
以下のように書く：

```rb:schedule.rb
every 1.minutes do
  command "date +%R > /Users/nemo/hoge/now.txt"
end
```

## crontab に

カレントディレクトリーが /users/nemo/hoge であることを確認のうえ，

```shell
whenever -i
```

と打つ。

そうすると毎分，now.txt が更新される。


crontab の内容を確認するため

```shell
crontab -l
```

と打つと，以下のように表示される：

```text
# Begin Whenever generated tasks for: /Users/nemo/hoge/config/schedule.rb at: 2025-05-13 18:32:18 +0900
* * * * * /bin/bash -l -c 'date +\%R > /Users/nemo/hoge/now.txt'

# End Whenever generated tasks for: /Users/nemo/hoge/config/schedule.rb at: 2025-05-13 18:32:18 +0900
```

コメントの `# Begin ...` と `# End ...` で挟まれた中に実質的な内容が書かれている。

このコメントに，whenever の設定ファイルの絶対パス

```text
/Users/nemo/hoge/config/schedule.rb
```

が書かれているが，これが重要だ。

パス名の書かれたコメントで囲まれていることにより，複数の whenever 設定を crontab に突っ込むこともできるし，あとで特定の whenever 設定を更新する，削除する，といったことが可能になる。パス名が識別子になっているわけだ。

この仕様が本記事の核心に関わってくる。

## 止める

さて，止めるには

```shell
whenever -c
```

と打つ。
この状態で 

```shell
crontab -l
```

と打つと，crontab が空になったことが分かる。

now.txt はもはや更新されない。

## パスを指定

whenever コマンドのオプション `-i` や `-c` には，設定ファイルの絶対パスを渡すこともできる。

デフォルトはカレントディレクトリーの config/schedule.rb である。

# トラブル

ここから本題に入る。

私は，さる事情で whenever の設定ファイルを置くディレクトリーを一時的に hoge+ という名前にした。

設定ファイルのパスは

> /Users/nemo/hoge+/config/schedule.rb

のようになる。

このようにしても，`whenever -i` で crontab を更新することはできる。

ところが，`whenever -c` で消すことができない。
また，`whenever -i` で更新しようとしても，更新ではなく追記になってしまう。

まさか設定ファイルのパスに問題があるとは思わず，数時間を溶かした。

どうやらパス名の中に `+` が入っていると crontab の中から当該の設定を見つけ出すことができないようなのだ。

whenever のコードを調べてはいないが，こういうケースを想定してないのだろう。
おおかた `+` が正規表現のメタ文字と解釈されちゃって……といったところではないだろうか。

# 蛇足

whenever は最新版（1.0.0）のリリースが 2019 年 6 月であり，まもなく 6 年が経つ。
Issues も Pull requests も溜まっている。

大丈夫なんだろうか。
三重積分「立方体の体積を計算するために、3重積分のmathjaxと立方体の領域を定義するmathjaxのコードを教えて下さい。」をAI先生に聞きました。  

・「みえ せきぶん」でありません。タイトル「重積分」又は「多重積分」がよかったかも。
# (本日の)ChatGPT先生へ(1回目)
#### 質問リスト
```
# 質問リスト
1. 立方体の体積を計算するために、3重積分のmathjaxと立方体の領域を定義するmathjaxのコードを教えて下さい。
2. 上記の3重積分の過程をsympyのソースコードで教えて下さい。
3. 四角錐についても、3重積分を使ったsympyのソースコードで教えて下さい。
```

#### (以下回答抜粋)
```math
V = \iiint\limits_{0 \leq x \leq a,\ 0 \leq y \leq a,\ 0 \leq z \leq a} 1\ \mathrm{d}z\,\mathrm{d}y\,\mathrm{d}x
```
```math
V = \int_0^a \int_0^a \int_0^a 1\ \mathrm{d}z\,\mathrm{d}y\,\mathrm{d}x
```
```python
import sympy as sp

# 変数の定義
x, y, z = sp.symbols('x y z')
a = sp.Symbol('a', positive=True)  # aは正の定数とする

# 積分の設定：積分する関数は1（体積を表す）
integrand = 1

# zについて積分（内側）
int_z = sp.integrate(integrand, (z, 0, a))

# yについて積分（中間）
int_y = sp.integrate(int_z, (y, 0, a))

# xについて積分（外側）
int_x = sp.integrate(int_y, (x, 0, a))

# 結果を表示
print("立方体の体積 =", int_x)
```
出力結果：
```
立方体の体積 = a**3
```
```python
import sympy as sp

# 記号の定義
x, y, z = sp.symbols('x y z')
a, h = sp.symbols('a h', positive=True)

# xとyの積分範囲（zに依存）
x_min = -(a / 2) * (h - z) / h
x_max =  (a / 2) * (h - z) / h
y_min = -(a / 2) * (h - z) / h
y_max =  (a / 2) * (h - z) / h

# 積分
volume = sp.integrate(
    1,
    (z, 0, h),
    (y, y_min, y_max),
    (x, x_min, x_max)
)

# 結果表示
print("四角錐の体積 =", volume)
```
出力結果：
```
四角錐の体積 = a**2*h/3
```
・以下省略

# Gemini先生へ

# copilot先生へ

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

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

# いつもと違うおすすめです。
#### wikipedia内

https://en.wikipedia.org/wiki/Multiple_integral

https://ja.wikipedia.org/wiki/多重積分


#### Qiita内

https://qiita.com/kota9/items/ddb549892c8c7d186d72
BigQueryでUUIDv7形式の文字列をTIMESTAMP型に変換する方法

IETFの資料によると、UUIDv7の先頭48bitがUnix timestampをミリ秒で表したもの

```
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           unix_ts_ms                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          unix_ts_ms           |  ver  |       rand_a          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|var|                        rand_b                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                            rand_b                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
```

出展:

https://www.ietf.org/archive/id/draft-peabody-dispatch-new-uuid-format-04.html#name-uuidv7-field-and-bit-layout

なので、雑に実装するならその部分を取り出してTIMESTAMP型に変換すればOKで、こんな感じ。

```sql
timestamp_millis(cast('0x' || left(replace(uuid, '-', ''), 12) as int64))
```

しかし、この方法ではUUIDv7以外のものを入れた場合にエラーになることがあるので、最初に有効なUUIDv7かどうかを正規表現でチェックする。

またIETFの資料に立ち返ると、verの部分の二進数表示は `0111`　で、varの部分は `10` であることが分かるので、UUIDv7かどうかを判断する正規表現はこうなる。

```
^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
```

あとは、組み合わせてこうなる。

```sql
create temporary function convert_uuidv7_to_timestamp(uuid string) as (
  if(
    regexp_contains(uuid, r'^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$'),
    timestamp_millis(cast('0x' || left(replace(uuid, '-', ''), 12) as int64)),
    null
  )
);
```
Excel VBA 連想配列 1つのKey に対して2つ以上 Item を追加する

## 前回記事の続き

https://qiita.com/Yuki-N-1016/items/3943a8940c0a54125ea8
## いろいろ調べて見つけたいちばん楽そうな書き方

### シートの構成
実行前の状態です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/80f699a7-a510-4cae-aa8d-bf822f8f593e.png)

### コード
Enum を使用して、列番号がマジックナンバーになることを回避しています。
```vb
Option Explicit

Enum category
  enName = 1
  enScore = 2
  enPower = 3
End Enum

Sub test()
  
  Dim dic As New Dictionary
  Dim i As Long
  
  Dim shData As Worksheet: Set shData = ThisWorkbook.Sheets("データベース")
  Dim shSum As Worksheet: Set shSum = ThisWorkbook.Sheets("集計")
  
  For i = 2 To shData.Cells(Rows.Count, 1).End(xlUp).row
  
    Dim dickey As String
    dickey = shData.Cells(i, enName).Value
    
    If dic.Exists(dickey) Then
    
      Dim score As Long
      Dim power As Long
      
      score = dic(dickey)(0) + shData.Cells(i, enScore)
      power = dic(dickey)(1) + shData.Cells(i, enPower)
      
      dic(dickey) = Array(score, power)
      
    Else
    
      dic.Add dickey, Array(shData.Cells(i, enScore), shData.Cells(i, enPower))
    
    End If
    
  Next i
  
  i = 2
  
  Dim buf As Variant
  
  For Each buf In dic.keys
  
    shSum.Cells(i, enName).Value = buf
    shSum.Cells(i, enScore).Value = dic(buf)(0)
    shSum.Cells(i, enPower).Value = dic(buf)(1)
    
    i = i + 1

  Next buf
      
End Sub
```
### Enum について

A列(1)をenName、B列(2)をenScore、C列(3)をenPower としています。

```vb
Enum category
  enName = 1
  enScore = 2
  enPower = 3
End Enum
```
値を省略する書き方
```vb
Enum category
  enName = 1
  enScore
  enPower
End Enum
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/a82abc4c-bfc5-47ff-b208-5bcd2dcd0c53.png)


### 実行後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/0f96b6b0-90f5-4c9b-aedd-46a7d4bdc403.png)
## 参考文献
https://koroko.hatenablog.com/entry/2021/04/06/214413

https://www.youtube.com/watch?v=pt7oWxL9W7Y
【Next.js】サイト上で画像をズームさせる機能を実装する時の備忘録


## はじめに

今回モザイクアートを実装する上で、ユーザーがマスに使われている画像を確認できるようにするため、画像をズームできる機能を実装する必要がありました。今回は、Reactで簡単にズーム機能を実装できるライブラリ [`react-zoom-pan-pinch`](https://github.com/prc5/react-zoom-pan-pinch) を使って、画像を拡大縮小・ドラッグ移動できるようにする方法を紹介します。


## 1. ライブラリのインストール

まずは、プロジェクトにライブラリを追加します。

```bash
npm install react-zoom-pan-pinch
```


## 2. 基本的な使い方

ライブラリが提供する `TransformWrapper` と `TransformComponent` を使って、ズーム可能な領域を定義します。

```tsx
'use client'

import { TransformWrapper, TransformComponent } from 'react-zoom-pan-pinch'

export default function ZoomImage() {
  return (
    <TransformWrapper
      initialScale={1}
      minScale={1}
      maxScale={5}
      wheel={{ step: 0.2 }}
      doubleClick={{ disabled: true }}
    >
      <TransformComponent>
        <img
          src="/path/to/image.jpg"
          style={{ width: '100%', height: 'auto' }}
        />
      </TransformComponent>
    </TransformWrapper>
  )
}
```


## 3. 使う頻度が高そうだったオプション

| オプション           | 説明                           |
| --------------- | ---------------------------- |
| `initialScale`  | 初期ズーム倍率（デフォルトは1）             |
| `minScale`     | 最小ズーム倍率（0.1〜など）              |
| `maxScale`      | 最大ズーム倍率（例: 5）                |
| `wheel.step`    | ホイールスクロール時の拡大率               |
| `doubleClick`   | ダブルクリックによるズームの有効/無効          |
| `limitToBounds` | ズーム後の移動範囲制限（falseにすると自由移動可能） |


## 4. 応用：ズーム倍率の状態管理

ズーム倍率を取得・表示したい場合は、`onZoomStop`イベントを使います。

```tsx
import { useState } from 'react'
import { TransformWrapper, TransformComponent } from 'react-zoom-pan-pinch'

export default function ZoomImageWithScale() {
  const [zoomLevel, setZoomLevel] = useState(1)

  return (
    <div>
      <p>現在のズーム倍率: {zoomLevel.toFixed(2)}x</p>
      <TransformWrapper
        initialScale={1}
        minScale={1}
        maxScale={5}
        onZoomStop={({ state }) => setZoomLevel(state.scale)}
      >
        <TransformComponent>
          <img src="/path/to/image.jpg" alt="Zoomable" />
        </TransformComponent>
      </TransformWrapper>
    </div>
  )
}
```

今回モザイクアートに使われているマスの画像をユーザーが確認できるようにする上でサーバー費も極力抑える必要がありました。

超高画質の画像を一気に読み込ませるわけにはいかないのでいくつかのエリアに分割し

ズームした後に、指定範囲内に見えてるエリアの高画質の画像を表示するといった実装をする必要がありました。今回はその実装のためこの`onZoomStop`イベントと`IntersectionObserver`を使いました。

## 5. 注意点

画像が例えば横幅1000pxだった場合枠はそれ以上大きくならなかったです。pcいっぱいに枠を置きたい場合はそのサイズの画像を用意する必要がありそうでした。

以上です
参考になれば幸いです
42 Tokyo の入学試験 "Piscine" に参加してきた...

# 42 Tokyo とは
https://42tokyo.jp/

協賛企業が出資してくれるおかげで、学生は学費完全無償でカリキュラムに臨むことができます。
あまり詳細を見るとハードルが上がる感じがしたので、下調べはほぼしていませんでした。

# Piscine とは
https://42tokyo.jp/requirements/#about-piscine

約1ヶ月間 実際の校舎へ赴き、同じ受験生同士で共通の課題に取り組みながら色々するものです。
同じ受験生といってもその肩書は千差万別で、ITベンチャーを立ち上げていて かなり充実してそうな若手実業家の方もいらっしゃれば、僕と境遇の似た ふらふらしてる人も居たりします。
ただ取り組む課題に肩書によるハンデは一切ないため、良くも悪くも平等です。わからない部分はひたすら質問を繰り返し、逆に自分の知識が役立ちそうなケースではそれを共有する。なので、実際コーディング面の技術よりもコミュニケーション力のほうが大事かもしれません。僕は一切自信なかったですが、いざPiscineを迎えてみれば何とかなりました。謙虚な姿勢を頑張って維持してれば大丈夫だと感じます。

# ながれ
- 初日から課題に取り組む
   入館証が配られ一通りの説明が終わると、早速課題に取り組みます。最初のともだちは隣の席の人です。 
- 毎週金曜にある、"Exam" と呼ばれる試験をこなす
    PiscineにはExamと呼ばれる試験が存在します。次々出てくる課題をクリアしたり周りに質問して培った力を、週1回のExamで発揮します。
- 4週間を経て、満を持して試験終了
    最後のExamが終わるとそのまま帰れるはずです。

# 課題の採点者は？
同じ受験生です。42のシステムが示す基準と要項を元に、相手の課題を採点します。
けんか（論理）になることもあるかもしれませんが、相手のコードに不審点や気になる箇所があれば指摘は憚らず、率直なレビューを行う事が大切です。

# Rushもあるんだ
通常の課題は、一人でコードを書き上げますが、"Rush"と呼ばれる、チームで取り組む課題もあります。やってもいいし、やらなくても良いです。色々手を出して自己課題がおざなりになるのが一番悲しいオチです。

# さいごに
僕が受験した時、校舎は六本木にありました。上京したての僕にとって、キビキビした六本木の空気感になかなか馴染めず、一日をあんまり綺麗じゃない空を見上げながらマンスリーマンションで過ごすこともありましたが、何とか合格できました。この記事は、本科に存在するある魔物から逃れるために書いたものです。
Piscineを通じて42 Tokyoの学風を肌で感じ、無事に4週間を突破できることを願っています。
【Vue3】AI部分再描画/オブジェクト除去のための高機能なマスク描画コンポーネントを探しています！

皆さん、こんにちは！

現在、AIを活用した画像の部分再描画（インペインティング）やオブジェクト除去機能をWebアプリケーションに実装しようと計画しています。具体的には、https://magiceraser.org/?ref=qiita のような、ユーザーが画像上で不要な部分を手動でマスク（ブラシで塗りつぶすなど）すると、AIがその部分を自然に補完・除去してくれる機能を目指しています。

この核心機能である「手動でのマスク描画」を実現するために、Vue3に対応した、以下のような特徴を持つカプセル化されたコンポーネントを探しています。

- 直感的な描画ツール: ブラシツール（サイズ変更可能）、消しゴムツールなど、ユーザーが容易にマスク領域を指定できる機能。
- 柔軟なカスタマイズ性: マスクの色や透明度などを調整できると嬉しいです。
- パフォーマンス: 大きな画像に対してもスムーズに動作すること。
- 導入の容易さ: 既存のVue3プロジェクトに簡単に組み込めること。
- 出力: マスク情報を扱いやすい形式（例: Base64エンコードされた画像、座標データなど）で取得できること。

もし、このようなVue3コンポーネントやライブラリ、あるいは実装に関する良いアイデアやリソースをご存知の方がいらっしゃいましたら、ぜひ情報をお寄せいただけると大変助かります。自作の経験がある方のアドバイスも大歓迎です。

## 私のAI関連プロジェクトについて

ちなみに、私はこれまでにAIを活用した画像処理サイトをいくつか開発・運営しています。

### imgupscaler.ai:

AIによる画像高解像度化（アップスケーリング）サービスです。
無料での利用回数が多く設定されており、日常的な利用には十分対応できるかと思います。
URL: https://imgupscaler.ai/?ref=qiita

### unblurimage.ai:

特に手ブレやピンボケなどで不鮮明になった画像の鮮明化に特化したAIアルゴリズムを採用しています。
こちらは毎日6回まで無料でご利用いただけます。
URL: https://unblurimage.ai//?ref=qiita

これらのサイト運営で得た知見を活かし、次はよりインタラクティブなAI画像編集機能に挑戦したいと考えています。

皆さんの知恵をお借りして、素晴らしい機能を開発できれば幸いです。
どうぞよろしくお願いいたします！
FizzBuzz問題を解く（変則）

FizzBuzz問題出ると、みんな「if文使ってあまり0なら～」って解き方ばっかりで、捻くれてる私はこうしてるっていう。
（学生の時、課題で出た時に、講師ですら理解してくれなくて悲しい思い出）

サクッと手元で組めるのがPowerShellだったので。
```powershell
 $start = 1　 #初期値
 $end   = 100

 $x03 = 3 #倍数３
 $x05 = 5 #倍数５

 for ($i = $start; $i -le $end; $i++){
    $result = 0             #結果を記録
    if($i -eq $x03){
        $result += 1
        $x03 += 3
    }
    if($i -eq $x05){
        $result += 2
        $x05 += 5
    }

    # 結果を表示
    switch ($result) {
        1 {write-host "Fizz"; break}
        2 {write-host "Buzz"; break}
        3 {write-host "Fizz Buzz"; break}
        default {write-host $i; break}
    }

 }
 ```
 「`$result`は何してるの？」って人は2進に置き換えたら分かるかも。

 - 余りを求めない
 - if祭りにならないから分かりやすい（はず

 処理的にもこっちのが負担少ないはず（しらんけど
 もうちょっと弄ったら、対象の倍数が変わったりとか、増減したりとか、対応しやすいように書けるはず。