OmniAICreator/Qiita-1.07M huggingface dataset:
【Command】機能・実装要件から選択するデザインパターン：「処理の分離」「取り消し処理」「非同期」

# 実現したい機能・実装要件

- 動作を分離・抽象化したい  
    - 機能内のある動作について、今後、追加・拡張・改修が予想され、疎結合にすることで、柔軟に対応したい
    - 単一責任の原則（SRP）を守り、処理の呼び出しと実装を独立させたい

- 取り消し・再実行をしたい  
    - 実行に対するリバート処理（undo）や再実行（redo）機能を実装したい  
    - 実行履歴を保持し、過去の状態にしたい

- 処理の実行順を柔軟に制御したい  
    - 処理をキューイングしたり、スケジューリングで順序を制御したい  
    - バッチ実行や非同期処理など、柔軟な実行モデルに対応したい

# Commandパターン

```mermaid
classDiagram
    class Command {
        +execute()
    }

    class ConcreteCommand {
        -receiver: Receiver
        +execute()
    }

    class Receiver {
        +action()
    }

    class Invoker {
        -command: Command
        +setCommand(cmd: Command)
        +invoke()
    }

    class Client

    Command <|-- ConcreteCommand
    ConcreteCommand --> Receiver
    Invoker --> Command
    Client --> ConcreteCommand
    Client --> Invoker
    Client --> Receiver
```

- Client
    - 全体の制御処理を担う
    - Invokerに、ConcreateCommandを依存性注入で渡すことで、Invokerから任意のコマンド処理を実行することが可能
- Invoker
    - Commandの呼び出し役
- Command
    - コマンド処理を抽象化するインターフェイス
    - Invokerと、ConcreateCommandを疎結合にしている
- ConcreateCommand
    - コマンド処理の本体
- Receiver
    - コマンド処理の事後処理や、処理結果をClientに渡す役割を担う
    - クリーンアーキテクチャのPresenter的な立ち位置

## サンプル

### [undo_redo](https://github.com/OrangeJuice652/AwesomeDesignPatterns/tree/main/command_pattern)
- socket通信で受け取ったメッセージに対応した[Commandクラス](https://github.com/OrangeJuice652/AwesomeDesignPatterns/tree/main/command_pattern/undo_redo/commands)を実行する

### 動作の分離

- [i_command](https://github.com/OrangeJuice652/AwesomeDesignPatterns/blob/main/command_pattern/undo_redo/commands/i_command.py)インターフェイスを、継承することで、4種類のCommandクラスを作成
    - Up
    - Down
    - Undo
    - Redo
- 依存関係の末端であるCommandクラス郡は、柔軟にCommandの追加・拡張・修正ができるようになった

### 取り消し・再実行

- Commandクラスを使った取り消し・再実行は、下記により実現させる
    - 直前の実行の打ち消し
    - 直前処理を確認し同じものを実行する
    - [Historyクラス](https://github.com/OrangeJuice652/AwesomeDesignPatterns/blob/main/command_pattern/undo_redo/history.py)に履歴を持たせることで、undo・redoのイベントをトリガーした際に、対応したCommandクラスを特定できる

### 処理の実行順を制御する

- [Clientクラス](https://github.com/OrangeJuice652/AwesomeDesignPatterns/blob/main/command_pattern/undo_redo/client.py)がこの役割を担う
    - 新たな動作が追加された場合も、[invoke_command()](https://github.com/OrangeJuice652/AwesomeDesignPatterns/blob/main/command_pattern/undo_redo/client.py#L56)の処理を追加するだけで対応できる


# 参考

- [Refactoring.Guru](https://refactoring.guru/ja/design-patterns/command)
【図解】git mergeとrebaseの違いを完全理解！どっちを使えばいいの？


# はじめに

Gitを使っていると必ず出会うこのエラーメッセージ：

```
fatal: Need to specify how to reconcile divergent branches.
```

「`--rebase`か`--no-rebase`を選べ」と言われても、どっちを選べばいいの？🤔

この記事では、**merge**と**rebase**の違いを図解でわかりやすく解説します！

# そもそも何が起きているの？

まず、このエラーが出る状況を理解しましょう。

```
あなた：    A---B---C（ローカルで新しいコミット）
               \
リモート：      D---E（他の人がpushしたコミット）
```

つまり、**あなたのローカル**と**リモート**で別々の作業が進んでしまった状態です。

# Merge（マージ）とは？

## 図で理解するMerge

```
Before:
main:     A---B（共通の履歴）
               \
あなた：        C（あなたのコミット）
               \
リモート：      D---E（他の人のコミット）

After merge:
main:     A---B-------M（マージコミット）
               \     / \
                C   /   \
                 \ /     \
                  D-------E
```

### Mergeの特徴

✅ **新しい「マージコミット」（M）が作られる**
✅ **履歴が枝分かれして合流する形になる**
✅ **元のコミット（C、D、E）はそのまま残る**

## 実際のコマンド

```bash
git pull --no-rebase origin main
# または
git pull origin main  # デフォルトはmerge
```

# Rebase（リベース）とは？

## 図で理解するRebase

```
Before:
main:     A---B（共通の履歴）
               \
あなた：        C（あなたのコミット）
               \
リモート：      D---E（他の人のコミット）

After rebase:
main:     A---B---D---E---C'（あなたのコミットが移動）
```

### Rebaseの特徴

✅ **コミットが「移植」される（C → C'）**
✅ **一直線のきれいな履歴になる**
✅ **元のコミットCは新しいC'に置き換わる**

## 実際のコマンド

```bash
git pull --rebase origin main
```

# どっちを使えばいいの？

## 🟢 Merge を使うべき場面

### 1. **mainブランチ、masterブランチの場合**
```bash
# mainブランチでは基本的にmerge！
git pull --no-rebase origin main
```

### 2. **すでにpushしたブランチの場合**
```bash
# 他の人と共有しているなら merge
git pull --no-rebase origin feature/shared-branch
```

### 3. **チーム開発の場合**
- 履歴の追跡が重要
- 誰がいつ何をしたか明確にしたい

## 🟡 Rebase を使ってもいい場面

### 1. **まだpushしていないローカルの作業**
```bash
# ローカルだけの作業ならrebase OK
git pull --rebase origin main
```

### 2. **個人の機能ブランチ**
```bash
# 自分だけが使うブランチ
git pull --rebase origin feature/my-private-branch
```

### 3. **プルリクエスト前の整理**
- コミット履歴をきれいにしたい
- レビュアーに見やすくしたい

# 実践的な使い分けガイド

## ケース1: メインブランチで作業中

```bash
# ❌ 危険！mainでrebaseは避ける
git pull --rebase origin main

# ✅ 安全！mergeを使う
git pull --no-rebase origin main
```

## ケース2: 機能ブランチで一人で作業中

```bash
# ✅ OK！履歴をきれいに保てる
git pull --rebase origin main
```

## ケース3: 複数人で同じブランチを使用

```bash
# ✅ 安全！mergeで履歴を保持
git pull --no-rebase origin feature/team-branch
```

# よくある質問

## Q: rebaseって危険なの？

A: **すでに共有したコミットをrebaseすると危険**です。なぜなら：

1. コミットIDが変わる
2. 他の人の作業に影響する
3. 履歴の不整合が起きる

## Q: mergeだと履歴が汚くなる？

A: 確かにマージコミットが増えますが、**実際の開発の流れが正確に記録される**メリットがあります。

## Q: 会社やチームではどっちが多い？

A: 多くのチームでは：
- **mainブランチ**: merge（安全性重視）
- **個人の機能ブランチ**: rebase OK（きれいな履歴）

# まとめ

## 迷ったらこれ！

```bash
# mainブランチなら merge
git pull --no-rebase origin main

# 個人のローカル作業なら rebase OK
git pull --rebase origin main
```

## 覚えておくべきポイント

1. **Merge**: 安全だけど履歴が複雑
2. **Rebase**: きれいだけど履歴を書き換える
3. **mainブランチではmergeが基本**
4. **共有前ならrebaseもOK**

最初は**merge**を使って慣れてきたら、適切な場面で**rebase**を使い分けていきましょう！

# 参考リンク

- [Git公式ドキュメント - merge](https://git-scm.com/docs/git-merge)
- [Git公式ドキュメント - rebase](https://git-scm.com/docs/git-rebase)
- [GitHub - About merge methods](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/configuring-pull-request-merges/about-merge-methods-on-github)
初心者による自分のためメモ ~HTML_構成編~

 ## はじめに
 こんにちは。プログラミング学習中の大学生です。
今回は、HTMLの学習がひと段落したので、まとめておこうと考え書いています。

## HTMLとは
・正式名称：HyperText Markup Language
・ウェブページの構造を定義し、テキスト、画像、リンクなどを配置して表示するために使用される。

## HTML要素
HTMLは、標準化された要素を組み合わせて書く。
要素は「タグ」を使って作成する。
ここでは、一部抜粋して紹介する。

### 「タグ」とは
・`<>`や、`</>`のことを指す。
・`<>`を開始タグ、`</>`を終了タグという。
・ほとんどの要素（全てではない）は、開始タグと終了タグで構成される。

このタグで要素を囲み、要素を作成する。

### `<p>`:段落要素
この要素は、テキストの段落を表す。
HTMLの段落は画像やフォーム欄などの関連するコンテンツを構造的にまとめることができる。
```html
<p>
    ここにテキストや、段落としてまとめたいコンテンツを書く。
</p>
```
また、この要素はブロックレベル要素である。


### `<h1>-<h6>`見出し要素
HTMLの見出し要素は、セクションの見出しを6段階で表す。
数字が大きくなればなるほど「大見出し＞中見出し＞小見出し」と見出しが小さくなっていく。
```html
<h1>大見出し</h1>

<h2>中見出し</h2>

<h3>小見出し</h3
```

## HTMLスケルトン
HTMLには、はじめに書かなければいけない言わばお約束のようなものがあり、それがHTMLスケルトンである。
```html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
</html>
```
これである。
vscodeであれば、「!」を入力しTabを押すことによって、呼び出せるので便利。
ただし、「lang」（言語設定）がenになっていたりと、場合に応じて変更をする必要がある。

### `<!DOCTYPE html>`
HTMLドキュメントの先頭に記述される「DOCTYPE宣言」であり、HTML5のドキュメントであることをブラウザに伝えるためのものである。﻿

### `<html>`HTML文書/ルート要素
HTMLのルート(基点)であり、他の全ての要素はこの要素の中に配置しなければならない。
この中に配置できるのは、ひとつの`<head>`要素と、それに続くひとつの`<body>`要素である。

### `<head>`文書メタデータ(ヘッダー)要素
この要素の中には、文書自体の情報(タイトルなど)を含む。


### `<body>`文書の本文要素
HTMLのコンテンツを示す要素。
`<body>`要素は文書中にひとつだけ配置できる。
分子構造をSMILESにするのに困った時の対処法

# SMILESとは
まずSMILESはsimplified molecular input line entry systemの略称で、分子を文字列化したものです。文字列として計算機に入力できるのでケモインフォマティクスの分野でよく用いられています。[他の記事](https://qiita.com/chemweb000/items/4e7777df4fbc4665f298)でも解説している通り、後述のルールに則って分子を文字列に書き下すことができるのですが、如何せん、分子が大きくなると書き換えるのも一苦労です。

そんな時に活躍する[WEBアプリ](https://app.molview.com/)を見つけたので、備忘録として残しておきます。

# MolView
https://app.molview.com/

これを使うと分子構造からSMILESにしてくれます。

### 分子構造からSMILESの出し方

(1) [MolView](https://app.molview.com/)にアクセスして分子構造を描く

![fig1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2804113/966f4900-c2fa-4026-88a3-d5ff56372fa1.png)


(2) View → Infocard

![fig2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2804113/07131bbc-d03a-427d-89b5-c0a8fdd91918.png)

(3) SMILESが書いてある

![fig3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2804113/2fac7903-f954-4f54-9e76-d9b76119cfb8.png)

SMILESも種類があって、MolViewでは二種類のSMILESを表記してくれています。


###  SMILESから分子構造の出し方

MolViewはSMILESから分子構造を出してもくれます。

(1) 検索バーにSMILESを入力
(2) Lookup SMILES

![fig5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2804113/faa5c55c-1dbe-444e-b23f-ba777bc7ba6b.png)

画像はナフタレンのSMILESを入力して分子構造を出した例です。




# ちなみに普通に分子構造をSMILESに書き換えるには

a. 水素原子(H)を省略する。
b. 単結合を省略し、二重結合を” = “、三重結合を” # ”で表す。
c. 分岐は丸括弧で表現する。
d. 環状分子は環を巻く結合をもつ原子の後ろに同一番号をつける。芳香環を構成する元素は小文字にする。

上記で書き換えた例はこんな感じです。

![fig4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2804113/0d081356-6535-41c5-903c-6b3d6c8d86eb.png)
【Mac】AppleScriptで通知センターの通知をすべて削除する方法


## 通知センターで通知をすべて削除するAppleScript

```applescript
tell application "System Events" to tell application process "NotificationCenter"
    -- 通知センターのウィンドウ内にある最初のグループ（targetGroup）を取得
    set targetGroup to group 1 of window "Notification Center" of application process "NotificationCenter" of application "System Events"
    
    -- 取得したグループ内のスクロールエリアの一番目のメニューボタンをクリック
    perform action 1 of menu button 1 of scroll area 1 of group 1 of targetGroup
    
    -- メニューが開いた後、最後のメニュー項目を選択（バナー以外の通知も削除する）
    perform action 3 of last menu item of menu 1 of targetGroup
end tell

```

## 動作

通知センターを開いた状態で上記のAppleScriptを実行すると以下のようにすべての通知が削除されます。

![screen-recording-66.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/56047138-67bc-48fb-b2b6-f3c477e7f8ff.gif)
kubernetesお勉強の目次



# 目次
- [kubernetes入門 - Part1 - とりあえずnginxをk8sで起動しHTML表示してみる](https://qiita.com/yokomoji12345/items/4b58964068a13f472840)
- [kubernetes入門 - Part2 - kubectl関連のyamlについて調べる](https://qiita.com/yokomoji12345/items/3ed67e0b8782dce5afea)
- [kubernetes入門 - Part3 - Kubernetesの基本4リソース](https://qiita.com/yokomoji12345/items/4d17148aafba9a313be0)
- [kubernetes入門 - Part4 - jsonnetを使ってみよう（jsonnet⇒json⇒yaml）](https://qiita.com/yokomoji12345/items/eaf92b2acc6bb307e0e5)
- 
# Tips
- [InfraAcademyなるものでLinuxコマンドの基礎を学んでみた](https://qiita.com/yokomoji12345/items/633cc8040cd371341bf7)
kubernetes入門 - Part2 - kubectl関連のyamlについて調べる

# yamlひな形を作成
`kubectl create --dry-run -o yaml`で作成できる

```bash
kubectl create deployment myapp --image=nginx --dry-run=client -o yaml > deployment.yaml
```

# マニフェスト
順番が逆かもしれないが、kubernetesで記載しているyamlはマニュフェストと呼ばれる。yamlで記述することで、リソース定義をツリー構造で定義する。

# マニフェストでの必須項目
|リソースの設定項目|意味|例|
| --- | --- | --- |
|apiVersion|kubernetesのAPIのバージョンを指定する|apps/v1など。kubectl explain deploymentでで対象リソースの詳細と apiVersion が確認できます。|
|kind|使用するコンテナや実行するプログラムを定義する|ConfigMap、Pod、Service、Deploymentなど|
|metadata|必須項目であり、オブジェクトを一意に特定するための情報を指定する。name、UID、namespaceなどの一意の名前を必ず指定する||
|spec|作成するオブジェクトの概要||
Ubuntu QEMU上のXP上で物理USBメモリを認識させる手順

## USBメモリの用意
USB3.2のUSBで試しており、XPから識別されずかなりはまりました。
XPで対応している**USB2.0**のものを用意します。
![_cgi-bin_mmwebwx-bin_webwxgetmsgimg__&MsgID=8735422469716070515&skey=@crypt_e58c0397_949466710b5c0c4eec77c69c18f1173b&mmweb_appid=wx_webfilehelper.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054974/b884559d-e18c-4194-a85a-f4cd4352f200.jpeg)


## USBメモリ固有情報を確認
以下の命令を実行しidVendor及びidProductを確認します。
001:008のところはlsusbの結果を元に実際の**Bus**及び**Device**の値を入れます。
```
lsusb

lsusb -v -s 001:008 | grep -E "idVendor|idProduct"
```

![图片.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054974/4efa1b1c-b0bf-4604-b0b5-06b748e63499.png)
![图片.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054974/78572272-f679-4d0d-be92-2237ac015f70.png)

## 起動
**vendorid**及び**productid**は先ほど確認した値を設定する
```
sudo qemu-system-i386 \
  -m 1024 \
  -hda xp.img \
  -boot c \
  -cpu host \
  -smp 2 \
  -net nic -net user \
  -vga std \
  -rtc base=localtime \
  -enable-kvm \
  -usbdevice tablet \
  -usb \
  -device usb-host,vendorid=0x048d,productid=0x1234
```
無事Eドライブとして認識された。
![图片.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054974/51a406fe-ac81-4416-a4a4-738b3b4b2770.png)
![图片.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054974/9afb7bf5-1220-4e68-99de-79ac3a6ca683.png)
Android Studioのファイルナビゲーションを爆速にするショートカット術【Mac】

Android Studioを使っていて、今のファイルどこだっけ？という経験あると思います。

## 全能検索

- やり方：`Shift` キーを2回すばやく押す  
- 検索できるもの（例）：
  - クラス名・ファイル名・メソッド名
  - リソース名（例：`colors.xml`）

## 最近使ったファイルに瞬間移動
- 直近で開いたファイル履歴を表示  

## 定義ジャンプ
- シンボル（変数・関数・クラス名）にカーソルを置いて`Command + B`押すと、定義元にジャンプ  
- 同様に `Command + Click` でもジャンプ可能


主によく使うのはこちらだと思います。
ショートカットは覚えると便利なので、活用してみてください。
mainブランチで行ったコミットを別ブランチで行った事にしたい

次のAscii Art(以下では図と記載)はinitコミットに変更を加えnew featコミットを行った直後の状態を示している。HEADはmainブランチの先頭を指している。new featをテストしていると不具合が発生するのでng tagをつけて、更にnew featをmain branchからng branchに移動する手順を述べる。

注釈: 下記の図でinit, new feat, new feat2はコミットを表す。実際にはコミットハッシュである。ng, mainはbranch。tag ngは図には表していない。tag名, branch名は重複して同じ名前を付与可。
```bash
init -> new feat
        |
        HEAD -> main
```
最終の状態
```bash
init -> new feat
|       |
|       ng
HEAD -> main
```

1. new featコミットにtag ngを付与

   ```bash
   $(main) git tag ng
   ```

   

2. HEADをinitへ移動

   ```bash
   $(main) git go @~ # goはreset --hardのgit alias
   ```

   

3. ng branch作成、移動。作成する際にはtag名と重複可能。

   ```bash
   $(main) git br ng; git sw ng # br, swはbranch, switchのgit alias
   ```

   

4. ng branchでng tagのコミットをmerge

   ```bash
   $(ng) git merge ng # ngはtag
   ```

   

5. main branchへswitch、不要となったng tag削除

   ```bash
   $(ng) git sw main
   $(main) git tag -d ng
   ```

   

この状態でworking treeを編集してnew feat2コミットを作成したなら次の状態になる
```bash
init -> new feat2
      \   |
  new feat|       
      |   HEAD -> main
      ng
```
【マインクラフト（統合版）】Websocketサーバーを使ってサーバー間通信チャットを作ってみました

# はじめに

以下のページではサーバーの単一プロセスによるチャットをご紹介しましたが、ここでは複合プロセスによるプライベートメッセージでのやり取りをご紹介します。

https://qiita.com/glasses_seven/items/7a490dc8694348505a53/

簡単に言えば、サーバープロセス単位で部屋割りをするチャット方式です。
ここでは以下の部屋割りと登場人物でメッセージのやり取りを行います。

<dl>
    <dt>部屋番号：10000（ポート番号10000のサーバープロセス）</dt>
    <dd>
        村人Ａ（ブラウザ）<br />
        マイクラー（マインクラフト）
    </dd>
    <dt>部屋番号：20000（ポート番号20000のサーバープロセス）</dt>
    <dd>
        村人Ｂ（ブラウザ）
    </dd>
</dl>


# 動作環境

<dl>
    <dt>プラットフォーム</dt>
    <dd>Windows10</dd>
    <dt>マインクラフト（統合版）</dt>
    <dd>Bedrock Edition v1.21.82</dd>
    <dt>socket-manager</dt>
    <dd>v1.14.7</dd>
    <dt>言語</dt>
    <dd>PHP v8.2.4（v8.1.0以降）</dd>
</dl>


# チャット動作

## 通常のチャット（ブラウザ⇔マインクラフト）

以下の画面は、同じチャット部屋で村人Ａ（ブラウザ）とマインクラフト間でメッセージ送信を行っている様子です。

![同じ部屋（サーバープロセス）内でのチャットの様子（ブラウザ⇔マインクラフト）](https://socket-manager.github.io/document/minecraft-contents/img/chat-ipc/chat-normal.gif "同じ部屋（サーバープロセス）内でのチャットの様子（ブラウザ⇔マインクラフト）")

```text:メッセージ送信の順序
１）「村人Ａ」からのメッセージ「もうかりまっか」を送信
２）「マイクラー」からのメッセージ「ぼちぼちでんな」を送信
```

## サーバー間チャット（ブラウザ⇔ブラウザ）

以下の画面は、異なるチャット部屋で村人Ａ（ブラウザ）と村人Ｂ（ブラウザ）間でプライベートメッセージ送信を行っている様子です。

![異なる部屋（サーバープロセス）間でのプライベートチャットの様子（ブラウザ⇔ブラウザ）](https://socket-manager.github.io/document/minecraft-contents/img/chat-ipc/chat-private-browser-only.gif "異なる部屋（サーバープロセス）間でのプライベートチャットの様子（ブラウザ⇔ブラウザ）")

```text:メッセージ送信の順序
１）「村人Ａ」からのメッセージ「邪魔するでー」を送信
２）「村人Ｂ」からのメッセージ「邪魔するんやったら帰ってー」を送信
```

## サーバー間チャット（ブラウザ⇔マインクラフト）

以下の画面は、異なるチャット部屋で村人Ｂ（ブラウザ）とマインクラフト間でプライベートメッセージ送信を行っている様子です。

![異なる部屋（サーバープロセス）間でのプライベートチャットの様子（ブラウザ⇔マインクラフト）](https://socket-manager.github.io/document/minecraft-contents/img/chat-ipc/chat-private-browser-minecraft.gif "異なる部屋（サーバープロセス）間でのプライベートチャットの様子（ブラウザ⇔マインクラフト）")

```text:メッセージ送信の順序
１）「村人Ｂ」からのメッセージ「トイレかしてー」を送信（マインクラフト側ではウィスパーとして表示）
２）「マイクラー」からのメッセージ「かりるんやったら返してー」を送信（＜メッセージ＞#＜ユーザー名＞形式で送信）
```


# サーバーの起動方法

## TCP通信によるサーバー間通信（IPC）の場合

サーバー間通信用の親サーバーのポート番号は10010とします。
WebsocketサーバーはTCP通信のため、ポート番号をサーバー間通信用のものと被らないようにする必要があります。
<br />
```terminal:親サーバーの起動コマンド
> php worker app:tcpmulti-minecraft-server 10000 10010
```
第一パラメータ：10000（クライアント通信ポート）
第二パラメータ：10010（サーバー間通信ポート）
<br />
```terminal:子サーバーの起動コマンド
> php worker app:tcpmulti-minecraft-server 20000 10010
```
第一パラメータ：20000（クライアント通信ポート）
第二パラメータ：10010（サーバー間通信ポート）

## UDP通信によるサーバー間通信（IPC）の場合

サーバー間通信用の親サーバーのポート番号は10000とします。
TCP通信とUDP通信とではソケットリソースが異なるため、サーバー間通信用のものと同じポート番号が利用できます。
<br />
```terminal:親サーバーの起動コマンド
> php worker app:udpmulti-minecraft-server 10000 10000
```
第一パラメータ：10000（クライアント通信ポート）
第二パラメータ：10000（サーバー間通信ポート）
<br />
```terminal:子サーバーの起動コマンド
> php worker app:udpmulti-minecraft-server 20000 10000
```
第一パラメータ：20000（クライアント通信ポート）
第二パラメータ：10000（サーバー間通信ポート）
【rails】曜日付き日付をロケールで表示する方法


## はじめに

こんにちは。アメリカ在住で独学エンジニアを目指している Taira です。
現在 Rails でアプリ開発を進めており、日付だけでなく曜日も表示したいな(例 2025年6月12日(木))みたいな状況ってあると思います。
Railsでは、`I18n`（国際化）機能を使って、日付や時間のフォーマットを自由にカスタマイズできます。今回は、「2025年6月12日(木)」のように曜日も含めた日本語表記をロケールで実現する方法を紹介します。

## 完成イメージ

```
2025年6月12日(木)
```

## 開発環境

* Ruby 3.4
* Rails 8.0.2
* ロケール：`ja`（日本語）

## 1. `I18n.l` を使って日付を表示する

Railsでは、`I18n.l(date)` でロケールに応じたフォーマットで日付を表示できます。

```erb
<%= I18n.l(date) %>
```

ただし、このままだと「2025年6月12日」のように曜日が含まれないため、ロケール設定をカスタマイズする必要があります。

## 2. ロケールファイルにカスタムフォーマットを定義する

`config/locales/ja.yml` に独自のフォーマットを追加します。

```yaml
# config/locales/ja.yml
ja:
  date:
    formats:
      with_wday: "%Y年%-m月%-d日(%a)"
```

これで以下のように書くと、`%a` により省略形の曜日（例: 木）が表示されるようになります。

```erb
<%= I18n.l(date, format: :with_wday) %>
```

## 3. `%a` を日本語で表示するための対応

実は `%a` はデフォルトだと英語（例: `Thu`）になってしまいます。
これを日本語の「木」などで表示するために、`ja.yml` に曜日の翻訳も追加します。

```yaml
# config/locales/ja.yml
ja:
  date:
    formats:
      with_wday: "%Y年%-m月%-d日(%a)"
    day_names: [日曜日, 月曜日, 火曜日, 水曜日, 木曜日, 金曜日, 土曜日]
    abbr_day_names: [日, 月, 火, 水, 木, 金, 土]
```

* `day_names` は `%A` 用（フル表記：木曜日）
* `abbr_day_names` は `%a` 用（省略表記：木）

## 4. 表示例（ビュー）

```erb
<%= I18n.l(date, format: :with_wday) %>
```

表示結果：

```
2025年6月12日(木)
```

## まとめ

| 方法                                 | 内容                    |
| ---------------------------------- | --------------------- |
| `I18n.l(date, format: :with_wday)` | ロケールに基づく整形で、翻訳と一貫性がある |
| `%a` と `abbr_day_names` を組み合わせる    | 日本語の曜日を正しく表示できる       |
【web】SSL/TLS証明書の管理の自動化

## はじめに

SSL/TLS証明書を手動管理するとミスる場合があります。
管理対象サイトが増えてくると手動で管理するのは困難です。
Let's encrypt のツール certbot で自動更新するとよいです。

## 動作環境

AlmaLinux 9.5
Apache 2.4.62

## 前提条件

ドメイン名がDNS登録されていること
Firewallで 80/443 ポートが開いていること
サーバーに十分なリソース(CPU,Memory,Disk)の空きがあること

## 手順

1. webサーバー(apache)に証明書受領用の設定をしておく (nginxの場合は読み替えて)

    `/etc/httpd/conf/httpd.conf`
    ```
    NameVirtualHost 999.999.999.999:80

    <VirtualHost 999.999.999.999:80>
        ServerAdmin your.domain.com
        DocumentRoot /var/www/your.domain.com
        ServerName your.domain.com
        ErrorLog logs/errorlog.log
        CustomLog logs/access_log.log common
        RewriteEngine on
        RewriteCond %{SERVER_NAME} =your.domain.com
        RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
    </VirtualHost>
    ```
    (999.999.999.999はあり得ないIPアドレスです。実際のサーバーのIPアドレスに置き換えます)  


1. snapd をインストールする

    root権限で
    ```
    dnf install epel-release
    dnf upgrade
    dnf install snapd
    ```

    パスを通す    
    ```ln -s /var/lib/snapd/snap /snap```

1. certbot をインストールする

    既にcertbotが入っている場合は削除する
    ```dnf remove certbot```
  

    ```snap install --classic certbot```
    
    パスを通す
    ```ln -s /snap/bin/certbot /usr/bin/certbot```
    
1. webサーバー(apache)用にサーバー証明書をインストールする

    ```certbot --apache```


### 結果を確認する

ブラウザで `https://your.domain.com` にアクセスして証明書ビューワーで見る

```curl -kv http://your.domain.com```

設定ファイル httpd.conf に次の行が追加されるはず
```Include /etc/httpd/conf/httpd-le-ssl.conf```

証明書の場所
`/etc/letsencrypt/live/ドメイン名/`

ログの場所
`/var/log/letsencrypt`

### 証明書更新を自動化する
`crontab`
```crontab
0 3 1,15 * * /usr/bin/certbot renew --dry-run || /usr/bin/certbot renew
```
(毎月1日と15日の午前3時に実行する例)  


### 運用コマンド

証明書更新テスト
```certbot renew --dry-run```

証明書更新実行
```certbot renew```

証明書情報表示
```certbot certificates```

ヘルプ
```certbot --help```

## おわりに

都合でLet's encrypt が使えない場合は、CAが提供しているAPIを使用して certbot 様の自動化スクリプトを作ればよいです。

非公開のサイトは自己署名証明書、オレオレ認証局で充分です。
可能な限り長期間発行しておけば良いと思います。

可能ならクラウドでCSP(Cloud Service Provider)に任せるのが一番です。


## 参考リンク

[Let’s Encrypt Getting Started](https://letsencrypt.org/getting-started/)

[certbot公式](https://eff-certbot.readthedocs.io/en/latest/)
DX設計要件別簡易まとめ

要件別のDX設計をざっくりと、雰囲気だけ理解する。

# 異なるアカウントのVPCに接続する場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2273453/325e283f-e4e4-4af3-8762-38b46cb4260e.png)

### ポイント
- 個別のVGWを使用し、それぞれ複数のVPCと接続可能
- VPCとオンプレの中継役として、DXGWを各アカウントに設置する

### メリット
- ホスト型のDXを1本用意すれば最大51個のプライベートVIFを作れる
- 1つのDXGWで10個のVGWをまとめられる
- よって最大510個のVPCと接続可能

### デメリット
- TGWを使用していない為、VPC間の通信ができない
- 各VPCごとにVGWのルートテーブルを設定する必要があり、設定と保守が煩雑
- ルート制御やVPCの再接続を柔軟にできない

# 異なるリージョンのVPCに接続する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2273453/a64064fc-cefe-4ec2-8753-a5c8550e8392.png)

### ポイント
- TGWで各リージョン内の複数VPCを集約
- TGWを使用するためにTransit VIFを使用

### メリット
- マルチリージョン対応
- 各TGWに複数のVPCをアタッチでき、将来のスケールアウトも簡単
- TGWとDXGWでルーテイング・接続管理を一元化できる

### デメリット
- TGW間の通信は通信できない（TGWピアリングで通信可能）

# DXの冗長化 その1
シングルコネクション × デュアルロケーション
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2273453/63004526-66a3-4850-ac6a-1d910baeaca6.png)

### ポイント
- 違うロケーションにDX接続を1本ずつ分散
- システムの安全性を高めるなら、AWS内リソースを複数のAZに分散配置する

### メリット
- コストを抑えられ、高い回復力をもつ

### デメリット
- 離れたロケーション（例：東京ー大阪）の場合、BGPマルチパス (アクティブ / アクティブ構成) を使うと経路によって通信品質がバラバラになる可能性あり

# DXの冗長化 その2
デュアルコネクション、デュアルロケーション
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2273453/bbd60e8a-275a-4c09-85ad-45662ba1b92b.png)

### ポイント
- 2つの違うロケーションにDX接続を2本ずつ分散

### メリット
- 1箇所の障害では通信品質が落ちない強力構成
- BGPマルチパス構成 (アクティブ / アクティブ構成) 

### デメリット
- 高コスト

# DXの冗長化 その3
デュアルコネクション、シングルロケーション
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2273453/cc58c98c-aa43-4ca2-b12f-cf44b52ab9b9.png)

### ポイント
- 1つのロケーションに2つのダイレクトコネクト接続

### メリット
- DX冗長化の中で一番低コスト

### デメリット
- AWS的には耐久性低い
- クリティカルな用途では使えない

# DXの冗長化とAWSサイト間VPNの活用法(VGW)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2273453/6c4e7cd7-08d0-4736-8d88-79758ccc3947.png)

### ポイント
- 冗長・バックアップ用のセキュアなインターネット経由通信
- VPN接続から送られる経路は、DX接続より後回しにされる

### メリット
- DXとVPNは別の設備で動いているので、障害やメンテナンスの影響を受けにくい
- VPNはDXに比べて低コスト

### デメリット
- フェイルオーバーの検証と運用が煩雑

# DXの冗長化とAWSサイト間VPNの活用法(TGW)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2273453/cc08ed06-3e35-4c6e-b343-3feddf46bcfc.png)

### ポイント
- 冗長・バックアップ用のセキュアなインターネット経由通信
- 1つのVPN接続を使って、複数のVPCとまとめて接続

### メリット
- Organizations + TGWを使えばマルチアカウント対応

### デメリット
- 設計の難易度高
GitHub Actions × AIラベルでPRの生産性を可視化してみた話


## ことのはじまり

GPTに「生産性をどう可視化すればいい？」と質問していたところ、  
**PRにAIラベルを付けて計測してみては**という提案が返ってきました。

さらに、「GitHub Actionsを使えばレポートの自動化もできるよ」とのこと。

そんなこともできるのか、と興味が湧きました。

## どうするか

ラベルの運用についてはなんとなく知っていましたが、  
**GitHub Actionsでレポート生成**というのは未知の領域。

まずはCursorでプロンプトを投げて、GitHub ActionsのYAMLファイルを生成してもらいました。

## 実践

……が、ここからが長かった。

使用したモデルは **Claude 4 Sonnet**。

### つまずきポイント：

- GitHubの認証まわりの設定で試行錯誤
- 何を思ったのか途中でいきなりファイルを削除して再作成をし始める
- エラー修正 → 再実行 → またエラー…を10数回繰り返す  
- やっとエラーは消えたけど、今度は**計測結果が0件**

数回やりとりしてようやく出力されたと思ったら、**集計内容が明らかにおかしい**

しかも途中から**英語で応答される**始末。  
(これはおそらくエラーログをまるっと投げたから？この時点ではcursorルールは未整備でした…)

## やってみて思ったこと

AI駆動開発って、

- AIに**投げる**
- 結果を**レビューする**
- 必要に応じて**修正を指示する**

という **サイクルを丁寧に回すことが大事**だと痛感しました。

途中で面倒になって「全部OK」にすると、  
**同じところをぐるぐる回って進まない**ということが多々ありました。

違和感を感じたら、**cursorのrulesに逐次反映**していく。  
そうすることで徐々に精度も上がってくる実感があります。

---

## まとめ

- PRにAIラベルをつけることで、**生産性を可視化できる可能性**がある  
- GitHub Actionsとの組み合わせで**自動レポート化**も狙える  
- ただし、AIとのやりとりは**丸投げせずレビュー必須**  
- "おかしな挙動"を見逃さず、ルール化していくのが大事

---

まだ改善の余地はありますが、  
「AIとともに働く」ための試行錯誤を楽しんでいきたいと思います。

## おまけ
今回作成したgithub actionsです
とりあえず動くようになったものです。
運用しているわけではないので、参考程度に。

https://github.com/kh55/ai_report
"tableBody.removeChild(tableBody.firstChild)"    が必要な理由 

### removechild あり

![スクリーンショット 2025-06-15 11.53.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/b4d192b9-a6ed-4e54-bb90-4bb0a8056c53.png)


### removechild なし

![スクリーンショット 2025-06-15 11.56.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/ab643a67-b8d8-4b8d-9e7c-694098292af2.png)


<h5>ないと、テーブルに同じものが表示され、消せないからごちゃごちゃになる</h5>
window.location.hrefについて

laravelを使用して登録画面から一覧画面に戻るためのボタンを作成中、window.location.hrefと言うものがあることがわかった。

**そもそもどのような時に使うのか**

ページ遷移する際に使用する

**使用例(bootstrapを使用)**
```php:back.blade.php
<button type="button" class="btn btn-secondary" onclick="window.location.href = '{{ route('evaluation.index',['book_id' => $book->id])}}'">戻る</button>
```

**aタグを使用した場合**
```php:back.blade.php
<a href="{{ route('evaluation.index',['book_id' => $book->id]) }}" class="btn btn-secondary">戻る</a>
```

**aタグとの違い**

大きな違いはなく、用途は同じ。

ただ、buttonはデータを送信するニュアンスも含まれているため、ページ遷移することだけが目的である場合、aタグを使用したほうが自然な書き方になる。
macOS logファイル から指定文字列を探す｜ターミナル grep

# macOS grep LOGファイル内文字列検索
macOSで LOGファイル(テキストファイル)から指定の文字列を検索する

下記の方法で、 指定ファイル内のIPアドレスを検索できる。

``` bash
find . -type f -name "*.log" -exec grep -Hn --color=auto "52.xxx.xx.xxx" {} + 
```

`--color=auto`をつけると色指定可能

https://mjeld.com/macos-grep/
MCP公式サンプルのお天気MCPサーバーを国内のお天気APIにしてみた

# 概要

ばたばたしているうちに、もうだいぶ前になってしまったが、MCP（Model Context Protocol）公式の[User Guide](https://modelcontextprotocol.io/quickstart/server#node "Quickstart - For Server Developers")を参考にMCPサーバーを作ったときのメモが残っていたので参考までに記録を残しておく。とはいえ学習目的でたいしたことはやっていないので、もう少し丁寧な説明サイトを見る事をお勧めする。。

## 公式ガイドを参考にMCPサーバーを作ってみた
基本的には、Quickstartの内容を、各自の環境にあわせて実装していくだけで、大まかな構成がわかるようになっている
[Model Context Protocol: User Guide](https://modelcontextprotocol.io/quickstart/server#node "Quickstart - For Server Developers")

::: note
ここでは、開発環境は以下を使っている
- Node.js
- Typescript
- Windows
:::

ただ、ユーザーガイドにも記載があるが、完全なソースコードは[github](https://github.com/modelcontextprotocol/quickstart-resources/tree/main)にあがっているので、ただ動かすだけならこちらをビルドするのが手っ取り早い
[github - modelcontextprotocol / quickstart-resources](https://github.com/modelcontextprotocol/quickstart-resources/tree/main)

ユーザーガイドでうまく動作しない細かなところをgithubを参考に調整することで、多少の問題が出ても解消できる
私の環境では、weather-server-typescriptをcloneして、そのまま動作することを確認している

MCP Clientも、Cloude Desctopを使うことで、サンプルどおり簡単にMCPサーバーに接続してMCP経由で天候情報を取得することができた

::: note warn
Windowsだと、デバッグの時などにMCPサーバーを接続しなおしたいときに、プロセスをいちいちkillしないと更新されなくて少々面倒だった
:::

## 国内のお天気APIに改変してみた
サンプルではWeatherAPIを使っていて、USの天候情報に限定されているため、国内のAPIで改変した
お天気APIは[天気予報 API（livedoor 天気互換）](https://weather.tsukumijima.net/)というサービスが2025年5月時点で無料だったので試しに使わせていただいた
（助かりました。ありがとうございました。）
このサービスでは、[地点定義表](https://weather.tsukumijima.net/primary_area.xml)の地域IDを使うことで、その地域の天気予報をJSONで取得できる

[例：東京都の天気の場合](https://weather.tsukumijima.net/api/forecast/city/130010)

get-forecastの情報取得元APIをこのサービスにすることで、そのMCPサーバー経由でMCPクライアントから天気予報を取得できるようになる

ちなみに、改変自体はClineさんにお願いして、5分ほどで完了
readme.mdなど気になる内容もあるが、ひとまずそのままにしておく。。
ざっと動作は確認したが、未レビューの内容を多く含むため、参考にする際は必ず事前に自身でレビューするよう気を付けてほしい。

## 結果
Claude DesktopをMCPクライアントとして、作成したMCPサーバーのget-forecastへ接続して明日の福岡の天気予報を取得してみたのがこちら
![mcp-weather-claudedesktop.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125655/826c39cf-615c-41c2-8e9c-0b0805ac13c6.gif)
念のため、ちゃんと取得できているか、元のAPIサイトの検索結果も確認
![mcp-weather-tenkiyohoapi.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125655/60dcde7c-43b0-4777-9b88-731f2d904c25.gif)

なお、もともとのWeatherAPI版ではget-alersという警報を取得するツールも定義されていたが、これは削除した。



## 参考
https://github.com/katsuya-ide/mcp-weather
みんながアクセスできるSlackアプリへのリンクを作成する


## 背景

右クリックから取得できるSlackアプリへのリンクは各ユーザー固有のものになっており、他のユーザーがクリックしても該当するアプリに飛べない
これだとワークフローなどで仕組み化するときに不便なので、みんながアクセスできるSlackアプリへのリンクを作りたい

## 結論

Deep Link を作成すればいい

## どうするか？

Deep Link は次のような構成になっている

```
slack://app?team={TEAM_ID}&id={APP_ID}
```

__TEAM_ID__ はワークスペースの識別子で、Slack URL の冒頭部分から確認できる

例： `https://sample-workspace.slack.com/`
→ `sample-workspace`

__APP_ID__ はアプリの識別子で、Slackアプリの Marketplace URL から確認できる

例: `https://sample-workspace.slack.com/marketplace/B05XYZH4XGX--sample-app`
→ `B05XYZH4XGX`

上記の例に基づくと、以下のようになる

```
slack://app?team=sample-workspace&id=B05XYZH4XGX
```

## 補足

実は `@App名` でメンションできちゃうので、メッセージで共有する場合には別に Deep Link いらない
【React初心者メモ】レンタリングとは

レンタリングとは、Reactコンポーネントの関数本体を実行して、画面に表示するための「仮想 DOM」を生成し、最終的にブラウザのDOMに反映する一連の処理のことです。

Reactのレンダリングは大きく分けて「初回レンダリング」と「更新レンダリング」の２フェーズで動いていて、その背後では“仮想 DOM”と“差分アルゴリズム” が働いています。

### 初回レンタリング
以下の流れで実行されます。
1. コンポーネント呼び出し
・ReactDOM.createRoot(...).render(<App />) が最初に呼ばれる
・App（関数コンポーネント）の本体が一度だけ実行される
2. 仮想 DOM の構築
・JSX から JS オブジェクト形式のノードツリーを作成
3. 差分検出とコミット
・空の DOM と比較して差分（パッチ）を作成
・実際の DOM に必要最小限の要素を追加して画面に表示

結果：画面が初めて描画され、ユーザーに UI が見える状態になる

### 更新レンタリング
State や Props の変更などをトリガーに再度レンダリングが走る流れです。

主なトリガー
・Stateの更新
　useState／useReducerなどで状態を更新したとき
　例：setCount(count + 1)
・Propsの変更
　親コンポーネントが渡す値 (<Child value={x} />) が変わったとき
・Contextの更新
　Context.Providerのvalue が変わったとき

以下の流れで実行されます。
1. 再コンポーネント実行
変更を受けたコンポーネント（と必要なら子孫）がもう一度関数として実行される
⇒ 関数の先頭から末尾まで最新の値で再評価

2. 新しい仮想 DOM の生成
初回と同じ仕組みで、新しいツリーを作る

3. 差分検出
・旧仮想DOMと新仮想DOMを比較
・何が追加・更新・削除されたかをマークする

4. コミット（Commit）
・差分だけを実際のDOMに反映
・useLayoutEffect → DOM 操作や計測
・useEffect → 非同期的な副作用処理

結果：画面が最新の状態に更新され、必要最小限のDOM操作で高速に再描画される
OpenManusをFastAPIでAPI化して、LLMエージェントを叩けるようにした話



こんにちは。今回は話題のOSSエージェント「OpenManus」をFastAPIを使って簡単にAPI化した方法を紹介します。

## 🚀 この記事で達成すること

* OpenManusのエージェントをCLIだけでなく、REST API経由で利用可能にする
* 外部アプリケーションからプロンプトを送り、エージェントの回答をJSONで取得

## 🧐 OpenManusとは？

OpenManusはGPT-4などのLLMと連携し、多彩なツール（ブラウザ操作、Python実行など）を使って、複雑なタスクを自動で解決するエージェントフレームワークです。

> GitHub: [https://github.com/mannaandpoem/OpenManus](https://github.com/mannaandpoem/OpenManus)

## 📌 API化の完成形イメージ

最終的に以下のようなHTTPリクエストでプロンプトを投げると、OpenManusが実行して結果を返します。

```bash
curl -X POST http://localhost:8000/run/agent \
     -H "Content-Type: application/json" \
     -d '{"prompt": "PythonでFizzBuzzを書いて"}'
```

レスポンス:

```json
{
  "status": "ok",
  "result": "FizzBuzzのPythonコードはこちらです：..."
}
```

## 📂 ディレクトリ構成

```
OpenManusAPI/
├── app/
│   ├── agent/
│   │   └── manus.py
│   └── service/
│       ├── agent_runner.py
│       └── __init__.py
├── main.py
├── requirements.txt
└── config/
    └── config.toml
```

## 🔧 実装手順

### 1. FastAPIをインストール

```bash
pip install fastapi uvicorn httpx
```

### 2. `main.py`にFastAPIのエンドポイントを作成

```python
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from app.service.agent_runner import process_prompt

app = FastAPI()

class PromptInput(BaseModel):
    prompt: str

@app.post("/run/agent")
async def run_agent(input: PromptInput):
    prompt = input.prompt.strip()
    if not prompt:
        raise HTTPException(status_code=400, detail="Prompt is empty")

    result = await process_prompt(prompt)
    return {"status": "ok", "result": result}
```

### 3. `agent_runner.py`を作成

`app/service/agent_runner.py`に以下を追加します。

```python
from app.agent.manus import Manus
from app.logger import logger

async def process_prompt(prompt: str) -> str:
    agent = await Manus.create()
    try:
        logger.info(f"Running agent with prompt: {prompt}")
        result = await agent.run(prompt)
        return result
    finally:
        await agent.cleanup()
```

### 4. `manus.py`（Manusクラス）に`run()`メソッドを追加

`app/agent/manus.py` の `Manus` クラスに以下を追加します。

```python
    async def run(self, prompt: str) -> str:
        self.memory.add_user_message(prompt)
        await self.run_loop()

        for msg in reversed(self.memory.messages):
            if msg.role == "assistant" and msg.content:
                return msg.content

        return "No response generated."
```

## 🎯 起動して動作確認

起動:

```bash
uvicorn main:app --reload
```

確認:

```bash
curl -X POST http://localhost:8000/run/agent \
     -H "Content-Type: application/json" \
     -d '{"prompt": "リストを逆順にするPythonコードは？"}'
```

正常な応答があれば成功です。

## 🐞 よくあるエラーと対処法

### エラー例

```bash
ModuleNotFoundError: No module named 'app.service'
```

対策:

* `app/` や `app/service/` に `__init__.py` を必ず置く
* プロジェクトルートで実行する（`PYTHONPATH` を調整）

```bash
export PYTHONPATH=$(pwd)
uvicorn main:app --reload
```

## 🚩 まとめ

FastAPIでOpenManusをAPI化すると、

* 他サービスや外部UIとの連携が簡単
* ターミナル以外からも使える

これにより活用の幅が一気に広がります。


https://github.com/ryosaki1112/OpenManusAPI
BSONについて調べてみた

仕事でBSONについて調べる必要があったので簡単に調べた

# BSONとは
* BSONはバイナリ形式で表現されるデータフォーマットで、名前の通りバイナリ版のJSONといった使われ方をしている
* JSONはテキストベースなので人間にとっては理解しやすいが、可読性が求められない場面ではBSONの方がより効率的だということだろう
* BSONはMongoDBで使われているそうで、PythonのPyMongoというパッケージにBSONまわりの便利な関数が入っている
    * この記事では基本的にMongoDBでの実装を参考にしている

# フォーマット
BSONはドキュメント全体のサイズ->各フィールドの名前と値>ドキュメントの終端バイトといった順番で構成されており、リトルエンディアンでエンコードされている
MongoDBのドキュメントにあった以下のサンプルを基に説明をする
```
\x16\x00\x00\x00           # total document size
\x02                       # 0x02 = type String
hello\x00                  # field name
\x06\x00\x00\x00world\x00  # field value
\x00                       # 0x00 = type EOO ("end of object")
```
https://www.mongodb.com/ja-jp/docs/languages/python/pymongo-driver/current/data-formats/bson/

* 最初の４バイトが全体のデータ長を表している
* 各フィールドの先頭1バイトがそのフィールドの型に対応する番号が入る
  * BSONの各型がどの番号に対応しているかは以下が参考になる

https://www.mongodb.com/ja-jp/docs/manual/reference/bson-types/ 

* 型バイトの後はフィールド名になっていて、0x00で終端されている
* その後フィールドの値が続く
    * サンプルだとString型なので0x00で終端されているのが、固定長の型の場合はその型長さの分だけ値が入っている
    * string型の場合最初の4バイトが終端文字を含めた文字列の長さになっている (サンプルだと"world"+0x00なので6が入っている)
* 最後に0x00でドキュメントの終了を表している

# 実際のバイト表現
よく使いそうな型がどのようにバイナリで表現されているのかを調べてみた
以下のようなサンプルコードを作ってBSONファイルを作り、バイナリエディタで中身をのぞいてみた

```python
import json
import bson

bson_test = {
    "int32": 2147483647,
    "int64": 9223372036854775807,
    "double": 1.7976931348623157e+308,
    "string": "aaaa",
    "bin": bson.Binary(b"bin data"),
    "timestamp": bson.Timestamp(123456789, 1),
    "bool": True,
    "list": [2147483647, "bbbb"],
    "object": {"id" : 1, "value" : "cccc"}
}

with open("output.bson", 'wb') as file:
    file.write(bson.encode(bson_test))

with open("output.json", 'wb') as file:
    json_data = json.dumps(bson_test, default=str, ensure_ascii=False, indent=2)
    file.write(json_data.encode('utf-8'))
```

結果は以下のようになった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296478/288c952a-671b-4969-ba87-37dbe7f017c5.png)

* 最初の4バイト```AF 00 00 00```はドキュメント全体が175バイトであることを示している
* その後、最初のフィールド```10 69 6E 74 33 32 00 FF FF FF 7F```が入っている
  * ```10```は0d16なので、型は32ビット整数であることを意味している
  * ```69 6E 74 33 32 00```はフィールド名"int32"
  * ```FF FF FF 7F```で4バイト分の値が入っている
* 少し飛ばしてバイナリ型のフィールド```05 62 69 6E 00 ...```だが、これもstring同様にfiled valueの最初の4バイトがデータ長になっている
  *  ```05 62 69 6E 00``` バイナリ型0x05 + フィールド名"bin"
  *  ```08 00 00 00 00``` データ長 8バイト
  *  ```62 69 6E 20 64 61 74 61``` "bin data" (終端文字なし)
* 配列```04 6C 69 73 74 00 ...```は以下のようになっている
  * ```04 6C 69 73 74 00 ``` 配列型 0x04+フィールド名"list"
  * ```18 00 00 00``` データ長24バイト
  * ```10 30 00 FF FF FF 7F```は配列の第一要素
      * ```10``` 最初の配列の型 (0d16で32ビット整数型)
      * ```30 00``` キーの値、つまり'0'+終端文字
          * BSONの仕様で、配列のキーは'0'からイクリメントするようになっている
      * ```FF FF FF 7F``` 実際のint32の値
  * ```02 31 00 05 00 00 00 62 62 62 62 00 00```は配列の第二要素
    * ```02```はstring型を表すバイトで```31 00```は二番目の要素を表すキー'1'
    * その後は通常のstringと同じ
* Object型もキーの値が自由に設定できる点以外は基本的には配列型と同じ

# JSONとの比較
同じデータをJSONフォーマットで出力したところ292バイトだったので、基本的にはBSONの方が効率的と考えてよさそうだ
ただ可変長の型には必ず4バイト分データ長を表すブロックがはいるので、場合によってはJSONの方が効率的になる場面もあるかもしれない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296478/47e92c9c-401f-42a6-a041-ade49135648e.png)
【AWS SAA 合格体験記】未経験からゆる～く約1年。最後はPing-Tと体験記を信じてやり切った話【合格日 2025年5月17日】

2025年5月17日に **AWS Certified Solutions Architect – Associate（SAA）** に合格しました。
ITインフラ未経験かつAWSを業務で触ったことがない自分でも合格できたので、これから受ける方の参考になればと思い、学習記録を残します。

---

## 🎓 自己紹介

* IT系の社内ヘルプデスクを10年ほど経験
* AWS未経験（仕事でも趣味でも触ったことなし）
* 年齢は30代後半
* 学習スタートは2023年9月（でも途中で飽きて中断）

---

## 📚 使用教材・サイト

### 書籍

* 『AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー 改訂第２版』
  → 最初の取っ掛かりに使いました（SAAの本ではないので注意）
　[今は３版が出てますので検討されてる方はこちらから](https://amzn.to/4l07jom)

### 参考サイト

* [AWSの基本を学ぶ（aws-exam.net）](https://aws-exam.net/clf/)
* [AWS Skill Builder - クラウドプラクティショナー講座](https://explore.skillbuilder.aws/learn/course/1875/)
* [テストメーカー（穴埋め暗記作成に使用）](https://www.test-maker.app/)
* [Ping-T（SAA対策）](https://mondai.ping-t.com/)

---

## 📆 学習の流れ

| 時期               | 内容                              |
| ---------------- | ------------------------------- |
| **2023年9月**      | CLF用のテキスト購入。1か月ほどで8割終わるが飽きて中断   |
| **2024年10月**     | 再始動。まずはCLFレベルの理解から。参考サイト①②で基礎固め |
| **2024年11月〜12月** | 参考サイト①の有料会員で1か月、問題演習に集中         |
| **2025年1月**      | CLFは受けず、Ping-TでSAAの基礎問題に取り組み始める |
| **2025年4月**      | 本格的に学習再開。試験日（5/17）をGW前に設定・予約    |
| **2025年GW〜試験前**  | Ping-Tの試験レベル問題を中心に演習＆復習         |

---

## 🔍 学習スタイルの工夫ポイント

### Ping-Tの使い方

* **問題は一周ずつ進める**：間違えた問題だけをやり直すのではなく、まずは解説をじっくり読む
* **時間をおいて再トライ**：数日後にコンボやヒット問題をやると意外と間違える＝定着の確認に効果的
* **他の選択肢に注目**：なぜその選択肢がダメなのか？までしっかり考えるようにする
* **AI Assistant** : 難しい事を聞くと間違ってることもあるらしいが、簡単なことや問題に則した内容ならガンガン活用していく

### 暗記補助

* 解説内容を穴埋めに変換して [Test-Maker.app](https://www.test-maker.app/) でスキマ時間に活用
  → ヒントに答えを書いて暗記カードのように使いました。（通常の使い方とは違います）

### 模擬試験と集中力対策

* Ping-Tの模擬試験は1回だけでしたが、**「2時間集中」の感覚に慣れておくのが大事**
* 休日にまとまった時間をとって、試験形式の練習を意識的に実施

### AWSは実際に触っておく

* 実際にサービスをを作らなくてもOK！
  → 該当サービスの**設定画面やダッシュボードを眺める**だけでも気付きがあったり、理解が深まりました
  → 公式やセミナーのハンズオンで触る程度でOK（リソースの作成→削除など）

---

## 📝 試験直前のTIPS

* 試験会場の予約は早めに！（**3週間前には予約推奨**）
* 試験時間（130分）の集中に慣れる練習をしておくと安心
* Ping-T模擬試験での点数や試験傾向については、こちらの体験記がとても参考になりました
  👉 [https://mondai.ping-t.com/g/passings/2006](https://mondai.ping-t.com/g/passings/2006)

---

## 🧠 試験当日の感想

正直「**落ちた**」と思いました。
見たことないユースケースや聞いたこともない用語が出てきて焦る場面もありましたが、
Ping-Tや先人の体験記からある程度予想していた範囲だったので、冷静に対応できたにも関わらず・・・。

自信をもって「これは絶対正解！」と思えたのは10問あるかどうか。でも結果として**合格できました。**

**「Ping-Tと合格体験記を信じてよかった」**、この一言に尽きます。

---

## 🎯 今後の目標

次は **SAP（ソリューションアーキテクト – プロフェッショナル）** を目指します！
現在は2025年10月の受験を予定して、またコツコツ進めていく予定です。

---

## まとめ

* AWS未経験でも、Ping-T＋自分なりの工夫で合格できる！
* 「Ping-Tの使い方」と「集中力対策」がカギ
* 迷ったら、先人の合格体験記を信じて進もう！

---

## 👏 最後に

ここまで読んでくださってありがとうございます。
これからSAAを目指す方にとって、少しでも参考になれば嬉しいです！

ご質問や「自分も受けます！」などのコメントも大歓迎です！
自分でよければアドバイスもさせて頂きます！
XSS攻撃を受けやすいcode

### innerHTMLとinsertAdjacentHTMLを使う

```js:悪いcode
  element.innerHTML = userInput;

  //テーブル
  tableBody.innerHTML = '';
```

```js;
element.textContent = userInput;

//テーブル
while (tableBody.firstChild) {
  tableBody.removeChild(tableBody.firstChild);
}
```
【超初心者向け】なぜマルチタスクなのに while(1) で全部止まるの？タスク切り替えのしくみをやさしく解説

私が組み込み開発に従事して間もない頃、ずっとモヤモヤしていたことがあります。


## マルチタスクって同時にタスクが動いてるんじゃないの？
たとえば…
	マルチタスクってタスクがいろいろ同時に動いてるんでしょ？
	なのに、1つのタスクの関数に while(1) を書くと、なぜ他のタスクまで全部止まるの！？
	意味がわからん！！

―― そんな風に思ったこと、ありませんか？
今でこそ当たり前に理解していますが、私も最初は本気で疑問に思っていました。
特に、プログラミング経験が浅かったり、ITリテラシーが十分でない人なら、同じ疑問を抱いたことがあるかもしれません。


## そもそも「タスク」とは？

ざっくり言えば、**やるべき仕事のひとまとまり**と考えてOKです。
例：
- タスクA：センサのデータを読み取る
- タスクB：読み取ったデータを解析する
- タスクC：解析結果を通信で送信する

## 結論：タスクは一つずつ順番に動いているだけ！
最初の疑問に、ズバリ答えましょう。
**タスクが複数あっても、実際には1つずつ順番に（高速で）切り替わりながら動いている**
だけなのです。

料理人が1人で「カレー」「パスタ」「スープ」を作っている場面を想像してみてください。
- カレーの具材を炒めて、煮込み時間に入る
- その間にパスタを茹でる
- パスタが茹で上がったら火を止めて、スープを温める

と、次々に作業を切り替えながら料理している状態です。

でも一瞬だけ見れば、料理人がしているのは1つの作業だけですよね？
スープを温めている瞬間に料理人を拘束すると、そこから先の作業はすべて止まってしまいます。

タスクもこれと同じです。
つまり、while(1) のような処理でCPUをずっと占有してしまうと、他の作業（タスク）に切り替えるチャンスがなくなってしまうのです。

なーんだ！ん！？
更に私は以下のような疑問点を持ちました。
ん、結局は1つ1つかわりばんこに動いているだけか…
だったらなぜ同時にうごいているように見えるねん？


## なぜ同時に動いているように見えるの？
これは、
**人間がタスクの切り替えを認識できないほどコンピュータが高速だから**
に過ぎません。
- 人間の反応速度は平均0.35〜0.4秒程度
- 一方、CPUは数マイクロ秒〜数ナノ秒単位でタスクを切り替えている

この高速切り替えにより、あたかも複数の処理が同時に動いているように見えるわけです。
私のように「CPU？クロック？なにそれ？」だった人には、ここがとても重要な視点でした。

## タスクはキリが悪くても切り替わる場合がある
「1つずつ順番に動いている」とはいえ、タイミングによっては中途半端な位置で切り替わることもあります。
ただし、重要な処理中の切り替えを防ぐ機構（クリティカルセクションなど）もあります。
ここでは細かくは触れませんが、「切り替わることもあるんだな」くらいにざっくり押さえておけばOKです。

### 間違った理解
```
void task1() {
	---
	foo();
	bar();
	---
}
```
→ bar()はfoo()の直後の命令だから、
必ずfoo()の直後に実行されるはずだ

### 正しい理解
```
void task1() {
	---
	foo();
	bar();
	---
}
```

→foo()の呼び出し後、bar()の呼び出し前に、
別のタスクが動くかもしれない


言い換えれば、foo()の開始→bar()の開始 までやたらと時間がかかってしまっていた場合、
疑う対象としてはfoo()のみならず、処理中にタスク切り替えが発生して、その切り替え先の処理がネックであるかもしれないという観点を持つということになります。


## まとめ

- マルチタスクは同時実行ではなく「高速な順番実行」
- CPUの処理速度が高速なため、人間には同時に見える
- while(1) のように処理がループし続けると、他のタスクが止まる
- タスクはキリの悪いところでも切り替わる可能性がある


## 注意（この記事のスタンス）
本記事では、「タスク」という用語を初心者がイメージしやすくなるよう、あえてざっくり解説しています。
そのため、割り込み制御や排他処理などの専門用語やアーキテクチャの違いといった概念には触れていません。


## 参考資料

［試して理解］Linuxのしくみ
https://gihyo.jp/book/2022/978-4-297-13148-7
(foo(), bar() の例示の参考にしました)
中学生でもわかるLLM（ChatGPTとか）の仕組み


LLMの仕組みを一枚のチートシートで説明したXの呟きがありました

https://x.com/Python_Dv/status/1923973070966095928/photo/1

この画像をChatGPT4oに添付して、
「これを中学生にも分かるように説明せよ」と指示したところ、滅茶わかりやすい説明になったので紹介します。

## ①【一番かんたん】Greedy（グリーディ）戦略：一番それっぽいのを選ぶ

AIはたくさんの候補の中から**一番確率が高い言葉**を1つ選びます。

例：  
- 候補：「my」「get」「set」「you」など
- 「you」が90%の確率なら → **即決で「you」！**

🔁 毎回同じ結果になるので、**単調でつまらなくなることも**あります。

---

## ②【ちょっとランダム】Multinomial Sampling：確率に応じて選ぶ

ここでは**確率に応じてランダムに選ぶ**方法です。

例：  
- 「you」：16％の確率  
- 「at」：14％  
- 「feel」：12％

🎲 サイコロをふるように選ぶので、**文章に変化が出て面白くなります！**

---

## ③【先のことも考える】Beam Search（ビームサーチ）：文全体でベストを選ぶ

この方法では、**今の単語だけでなく、その先の流れも考えて**選びます。

📖 まるで作文の構成を考えるように、
- いろんな候補を比べて
- 一番自然な文を選びます。

---

## ④【くり返しを避ける】Contrastive Search：同じ言葉ばかり使わない工夫

AIが**同じような言葉を何回も使わないように**します。

例：
- 「you」「you」「you」と続くのを避ける
- 「似ている言葉」があったらマイナス点（ペナルティ）をつける

🧂 そのおかげで、**なめらかで自然な文章**になります！

---

## まとめ表

| 方法 | 特徴 | 向いてる場面 |
|------|------|--------------|
| Greedy | 一番確率の高い言葉を即決 | 速さが大事なとき |
| Sampling | ちょっとランダムに選ぶ | 面白さや多様性がほしいとき |
| Beam Search | 全体の流れを重視 | ちゃんとした文を書きたいとき |
| Contrastive | くり返しを減らす工夫 | 自然でスムーズな文章にしたいとき |

---

## 🗣️ ひとことで言うと？

> AIは「サイコロをふったり、作文の流れを読んだり、くり返しを避けたり」しながら、頭よく言葉を選んでいるんだよ！

---
【Haskell】抽象度を上げれば "文脈" と "コンテナ" は同じ意味っぽい

Haskellを勉強していて面白いなと思ったことをメモしておく。

## 普通の日本語では全然違う言葉

* **コンテナ**：箱、入れ物、何かを格納するもの
* **文脈**：状況、背景、前後関係

普通に生活していたら全く別の意味で使う単語。

## でもHaskellの抽象世界では同じものを指している

Haskellの型 `f a` を考えると、これは「型 `a` が何かに包まれている」状態を表している。

* `Maybe a` ： 値があるかもしれない or ないかもしれない → "存在有無という文脈"
* `[a]` ： 複数の値 → "複数性という文脈"
* `Either e a` ： 成功 or 失敗 → "エラー処理の文脈"
* `IO a` ： 副作用のある計算 → "外部世界という文脈"

こう見ると、すべて "何らかの状況の中にある `a`" になっている。

## fmapが意味すること

この状態で `fmap :: (a -> b) -> f a -> f b` を使うと、

* **普通の関数** `(a -> b)` を
* **文脈/コンテナの中身** `a` に適用して、
* **同じ文脈/コンテナの形のまま** `b` に変換してくれる。

つまり、文脈の中に入った値を安全に変換する仕組み。これを "lifting" と呼んだりもする。

## 面白いポイント

普通の言葉なら全然違う "文脈" と "コンテナ" が、

> Haskellの抽象度の高い世界では、実質的に同じものを指してしまう

というのがすごく面白いと思った。

Haskellが "抽象の楽園" と言われる理由の一端を感じた気がする。
スマホ利用による脳疲労をPythonで視覚化してみた

## はじめに
みなさん、1日にどのくらいスマホを利用していますか？
SNSをチェックしたり、動画を見たりなど、ついついスマホに手が伸びてしまい、何時間と利用している人もいるかと思います。

今では生活に必要不可欠なスマホですが、
とくに若い世代で、スマホを手放せない人が増えてきて、**スマホ認知症**という症状が増えています。

**「スマホの使いすぎは良くない」** と頭では分かっていても、
具体的に脳にどんな影響があるのかって、なかなか実感しづらいものです。

そこで今回、
**「スマホの使いすぎによる脳への障害を、直感的に視覚化できないか？」** 
と考え、Pythonで簡単なシミュレーターを作ってみました。

## 技術スタック
- 言語: `Python`
- GUI: `Tkinter`（`Python`標準ライブラリ）
- 実行環境: `Docker`, `XQuartz`

## 脳疲労と認知機能が低下していく様子を視覚化
今回、作成したものがこちらです。
スライダーを動かして、利用時間に応じて脳ネットワークの状態がリアルタイムで変化します。

### 健康な脳（利用時間：〜2時間）
利用時間が2時間以内であれば、脳は非常に活発です。

- 明るい青色のニューロンの接続が強く、活発に信号をやりとりしている
- 神経信号（黄色い点）がネットワーク上を素早く行き交っている

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245592/b8883c2a-f8c1-45f1-8672-17fdec1416c8.gif" width=480>

### 要注意レベル（利用時間：2時間〜）

2時間を超えると、脳は徐々に悲鳴を上げ始めます。

- **活動性の低下**：ニューロンの色がくすんでいく
- **思考の鈍化**：神経信号の発生頻度と速度が低下
- **集中力の低下**：シナプスの接続が細くなり、切れやすくなる
- **神経細胞の死滅**：いくつかのニューロンが消滅し始める
- **老廃物の蓄積**：脳内にプラーク（黒い点）が現れ始める

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245592/58316cf3-be5d-4792-b3b3-47c536031658.gif" width=480>


### 危険レベル（利用時間：5時間〜）
5時間を超えると、脳への影響は深刻化します。

- **ネットワークの崩壊**：多くのニューロンが消滅し、脳のネットワークはスカスカの状態に
- **思考の停止**：神経信号はほとんど流れなくなり、脳全体の活動が著しく低下
- **プラークの蔓延**：脳の老廃物が広範囲に蓄積

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245592/cd64d56b-9ea2-47db-8ffa-57819e6b9c27.gif" width=480>


## おわりに
今回は、「スマホ脳疲労」という目に見えないリスクを`Python`と`Tkinter`で視覚化してみました。

以下に、実際のソースコードを載せています。
皆さんもぜひ、触って遊んでみてください！
[ソースコード](https://github.com/shota-watanabe/brain_simulator/tree/main)

この記事が、皆さんの健康と、Pythonの面白さを知るきっかけになれば嬉しいです。
最後まで読んでいただき、ありがとうございました！
Recoil - React状態管理ライブラリ -

:::note warn

本記事で紹介している Recoil は、**2025年1月をもって公式GitHubリポジトリ（[facebookexperimental/Recoil](https://github.com/facebookexperimental/Recoil)）がアーカイブされ、read-only（読み取り専用）状態となっています。**

そのため以下の点に注意してください：

- **今後のバグ修正・新機能追加などの更新は行われません。**
- **公式によるサポートやコミュニティの活発な議論は縮小傾向にあります。**
- プロダクション用途や中長期的なプロジェクトでは、代替ライブラリを検討することをおすすめします。

Recoil自体は現在も利用可能であり、学習目的や小規模プロジェクトでは十分に活用できますが、ライブラリの選定にあたってはこうした開発状況も踏まえた判断が重要です。

:::


# Recoilとは

Recoil は、Meta（当時はFacebook）が開発した React用の状態管理ライブラリ。Reduxよりシンプルで、グローバル状態を簡単に管理できる。

# Recoilの基本構成

## atom

- 状態の最小単位
- グローバルにアクセス・更新できる状態
- 一意のキー(key)と初期値(default)を持つ

```ts
import { atom } from 'recoil'

export const countState = atom({
  key: 'countState',     // 一意なキー
  default: 0,            // 初期値
})
```

## selector

- atomの値を元にした計算や加工、非同期処理を行える

```ts
import { selector } from 'recoil'
import { countState } from './atoms'

export const doubleCountState = selector({
  key: 'doubleCountState',
  get: ({ get }) => get(countState) * 2,
})
```

# 状態の使い方

## useRecoilState（読み書き）

- 状態を読み書きするには、useRecoilStateというHookを使用
- 引数にatomを指定

```tsx
import { useRecoilState } from 'recoil'
import { countState } from './atoms'

const Counter = () => {
  const [count, setCount] = useRecoilState(countState)

  return (
    <div>
      <p>{count}</p>
      <button onClick={() => setCount(count + 1)}>+1</button>
    </div>
  )
}
```

## useRecoilValue（読み取り専用）

- 状態のみを取得するには、useRecoilStateを使用
- 引数にatomやselectorを指定

```tsx
import { useRecoilValue } from 'recoil'
import { doubleCountState } from './selectors'

const DisplayDouble = () => {
  const doubleCount = useRecoilValue(doubleCountState)
  return <p>Double: {doubleCount}</p>
}
```
複数のWindowsを同一ドライブ上にインストールする

# 本文書の目的
VHDXを使い、複数のWindowsを同一ドライブ上にインストールする手順はマイクロソフトが以下で公開している。
https://learn.microsoft.com/ja-jp/windows-hardware/manufacture/desktop/boot-to-vhd--native-boot--add-a-virtual-hard-disk-to-the-boot-menu?view=windows-11&fbclid=IwY2xjawK7ACtleHRuA2FlbQIxMQBicmlkETFPdlRSYjhkMEJtdjcwY1hWAR5imqkztD3XOeUq6GEBkAtHSQwoOASMiK74DuV8cuE1HrSJzEU1sKWJJHPtNg_aem_wJ_wwRRPU-7wqenzjcfRbA
しかし物理ディスクを分轄してインストールする手順については公開していない。これを補足するものとして、物理ディスクを分轄してインストールする手順について述べる。
# インストール先のパーティションの用意
## 前提
* 物理ディスクは1台
* Cドライブのみ
## 手順
1. スタートメニューを右クリック→ディスクの管理
1. Cドライブを右クリック→ボリュームの縮小
1. 開けるサイズをMバイト単位で入力して縮小
1. 空き領域にシンプルボリュームを作成しVドライブとしてフォーマット
# Windowsのインストール
## 前提
* DドライブにWindowsのインストールDVDがマウントしてある
## インストール
1. スタートメニューを右クリック→ターミナル管理者
1. cmd
1. 以下のコマンドを実行
~~~
dism /Apply-Image /ImageFile:D:\sources\install.wim /index:1 /ApplyDir:V:\
~~~
## ブートメニューへの追加
~~~
C:> bcdedit /copy {current} /d "Windows 11 No2"
エントリは {9fe6b4ba-4983-11f0-b77f-00155de94ba0} に正常にコピーされました。
C:> bcdedit /set {9fe6b4ba-4983-11f0-b77f-00155de94ba0} device partition=V:
C:> bcdedit /set {9fe6b4ba-4983-11f0-b77f-00155de94ba0} osdevice partition=V:
~~~
これで、PC起動時に起動するWindowsを選べる状態になった。タイムアウトのデフォルトは「msconfig」のブートタブで変更する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505283/9e64fd07-1da8-4e99-9f1f-ab21e652213c.png)
# インストール後の設定
インストール後のキーボードレイアウトは英語になっている。これを設定で物理キーボードレイアウトを日本語に変更する。
1. 設定
1. 時刻と言語
1. 言語→日本語→言語のオプション
1. キーボード→レイアウトを変更する
1. 「日本語キーボード(106/109キー)」を選択してOK
1. 再起動
![{44821B09-F81D-42B8-B63C-F9EF34C31AF9}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505283/aacd8db7-6daf-4164-9304-7b4c7e24d3f3.png)
# 分轄した物理ディスク上にWindowsをインストールする利点
仮想ディスクではなく分轄した物理ディスク上にWindowsをインストールすると、元々のCドライブをBitLockerで暗号化することができる。仮想ディスクをCドライブに置く場合は、これができない。仮想ディスクや物理ディスクをBitLockerで暗号化することは、Cドライブの暗号化とは無関係に行うことができる。
AtCoder ABC410 振り返り #C++

# はじめに
ABC410に参加したので振り返ります。
結果は1完でした。[（コンテスト成績表）](https://atcoder.jp/users/Jun1013/history/share/abc410)
今回はA, B問題についてまとめていきます。

# [A - G1](https://atcoder.jp/contests/abc410/tasks/abc410_a)

条件分岐でカウントしていくだけでした。

- diff：12
- 計算量：$O(N)$

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

int main() {
    int N;
    cin >> N;
    int A[N];
    for (int i = 0; i < N; i++) {
        cin >> A[i];
    }
    int K;
    cin >> K;

    int counter = 0;

    for (int i = 0; i < N; i++) {
        if (K <= A[i]) {
            counter++;
        }
    }
    cout << counter << endl;
}
```

# [B - Reverse Proxy](https://atcoder.jp/contests/abc410/tasks/abc410_b)

本番の提出ではWAになりました。
原因はボールの数が最小の箱の探索とボールの追加を同時に行っていたことでした。あと配列の数え間違いですね。

- diff：57
- 計算量：$O(N * Q)$

```cpp
// WAのコード
#include <bits/stdc++.h>
using namespace std;

int main() {
    int N, Q;
    cin >> N >> Q;
    int X[N];
    for (int i = 0; i < N; i++) {
        cin >> X[i];
    }

    int box[Q];
    int ans[N];
    for (int i = 0; i < Q; i++) {
        if (X[i] != 0) {
            box[i]++;
            ans[i] = X[i];
        } else {
            int min = 101;
            int address = 0;
            for (int j = N; j > 0; j--) {
                if (box[j] <= min) {
                    min = box[j];
                    address = j;
                }
                box[address]++;
                ans[i] = address;
            }
        }
    }

    for (int i = 0; i < Q; i++) {
        cout << ans[i] << ' ';
    } 
    cout << endl;
}
```

```cpp
// ACのコード
#include <bits/stdc++.h>
using namespace std;

int main() {
    int N, Q, A[101];
    cin >> N >> Q;
    for (int i = 1; i <= Q; i++) {
        int x;
        cin >> x;
        if (x > 0) {
            A[x]++;
            cout << x << ' ';
        } else {
            int MQ = 101;
            for (int j = 1; j <= N; j++) {
                if (A[j] < MQ) {
                    MQ = A[j];
                }
            } for (int j = 1; j <= N; j++) {
                if (A[j] == MQ) {
                    A[j]++;
                    cout << j << ' ';
                    break;
                }
            }
        }
    }
}
```

# おわりに
今回はアルゴリズムというよりも文章の読解力と実装力の不足が目立ちました。ABC411に向けて精進を頑張っていきたいです。