OmniAICreator/Qiita-1.07M huggingface dataset:
LDAP 認証の技術検証：Active Directory と Windows Server での設定と確認をまとめた個人的な備忘録

## はじめに
Active Directory (AD) を使用した LDAP 認証の技術検証を行う。

本記事では、Windows Server 上で LDAP 認証をテストし、接続の確認方法やエラー発生時の対処方法について解説する。

## 環境情報
| 項目 | 設定値 |
|------|------|
| **LDAP サーバー (AD サーバー)** | `ad.honda.com` |
| **LDAP ドメイン** | `honda.com` |
| **LDAP ポート** | `389` (LDAP) または `636` (LDAPS) |
| **テストユーザー** | `testuser@honda.com` |
| **ユーザーの識別名 (DN)** | `CN=testuser,CN=Users,DC=honda,DC=com` |

## LDAP サーバーへの接続確認
LDAP サーバー (`ad.honda.com`) への接続が確立されていることを確認する。

### `Test-NetConnection` を使用した確認
PowerShell で以下のコマンドを実行し、ポート `389` への接続が成功するか確認する。
```powershell
Test-NetConnection -ComputerName ad.honda.com -Port 389
```
成功例:
```
ComputerName     : ad.honda.com
RemoteAddress    : 10.0.1.203
RemotePort       : 389
TcpTestSucceeded : True
```
失敗例:
```
TCP Test Failed
```
対処方法:
- `ad.honda.com` が正しく名前解決できているか (`nslookup ad.honda.com`)
- LDAP ポート (`389` または `636`) がファイアウォールで開放されているか確認

## LDAP 認証のテスト
### PowerShell を使った LDAP 認証
以下のスクリプトを PowerShell で実行し、`testuser@honda.com` の LDAP 認証をテストする。

```powershell
$ldapServer = "ad.honda.com"
$ldapUser = "testuser@honda.com"
$ldapPassword = "P@ssw0rd"

try {
    $ldapConnection = New-Object System.DirectoryServices.DirectoryEntry("LDAP://$ldapServer", $ldapUser, $ldapPassword)

    if ($ldapConnection.Name -ne $null) {
        Write-Host "LDAP 認証成功: ユーザー $ldapUser は有効"
    } else {
        Write-Host "LDAP 認証失敗: ユーザーが見つからない"
    }
} catch {
    Write-Host "LDAP 認証エラー: $_"
}
```
成功時:
```
LDAP 認証成功: ユーザー testuser@honda.com は有効
```
失敗時:
```
LDAP 認証失敗: ユーザーが見つからない
LDAP 認証エラー: Access is denied
```
対処方法:
- `testuser@honda.com` のパスワードが正しいか確認
- `Get-ADUser` コマンドでユーザーの識別名 (DN) を取得
```powershell
Get-ADUser -Filter {SamAccountName -eq "testuser"} | Select-Object DistinguishedName
```

## GUI ツール `ldp.exe` を使用した認証テスト
- `Windowsキー + R` を押して `ldp.exe` を開く
- 「Connection」→「Connect」 を選択
  - **Server:** `ad.honda.com`
  - **Port:** `389`（LDAPS を使う場合は `636`）
  - **Use SSL** は **チェックなし**（LDAPS 使用時はチェック）
- 「Connection」→「Bind」 を選択
  - **Bind Type:** `Simple Bind`
  - **User:** `testuser@honda.com`
  - **Password:** `P@ssw0rd`
- 「OK」をクリックして認証を試す
  - 認証成功時: `Authenticated as DN` のメッセージが表示
  - 認証失敗時: `Invalid credentials` エラーが表示

## `ldapsearch` コマンドを使用した認証テスト
Linux (WSL) 環境から LDAP 認証をテストする場合、以下のコマンドを実行する。
```sh
ldapsearch -x -H ldap://ad.honda.com -D "CN=testuser,CN=Users,DC=honda,DC=com" -W -b "DC=honda,DC=com"
```
成功時:
```
dn: CN=testuser,CN=Users,DC=honda,DC=com
objectClass: user
sAMAccountName: testuser
```
失敗時:
```
ldap_bind: Invalid credentials (49)
```
対処方法:
- パスワードが正しいか確認
- ユーザーの DN (識別名) を `Get-ADUser` で確認

## まとめ
| 方法 | 確認内容 | コマンド |
|----------|----------|----------|
| **PowerShell を使用** | `testuser@honda.com` が LDAP 認証できるか | PowerShell スクリプト |
| **`ldp.exe` を使用** | GUI で LDAP 認証を試す | `ldp.exe` |
| **`ldapsearch` を使用** | Linux (WSL) から認証 | `ldapsearch` |
Dockerのイメージがようやくわかった件

エンジニアのくせに、2025年だよ？なんて冷たいこと言わないでくださいね。。

## はじめに
先日、時間が空いたのでAIに問うてみた。

**Reactって流行っているけど、特徴は何なの？？**

その流れでインフラの話になり、Kubernetesの話が出てきた。
なんとなく「仮想化でしょ？」って知識しかなかった。
だって、ガリガリ開発してたのは仮想化出始め、VMが使えるかなーって頃。

AIと話しているうちに、VMとDockerの違いがわかってきた。

## 想定読者
- 「仮想化；VMでもDockerでも」をあまり自分で扱ってない
- 全盛期に仮想化なんてなかったよーってシニアエンジニア
- インフラと開発は関連がないと思っているそこのあなた
- 先進的でなく、中途半端なメーカー縛りの多い「中、中の上」くらいの企業で開発されているみなさま

に向けて。そして
## Dockerのロゴはなぜ船のコンテナのように縦に積まれているのか？
ということに疑問を抱いている方、答えられない方はぜひ読んでみてください。

## お願い
- IT業界に入った頃にはAWSやら仮想化があったエンジニアのみなさま、優しい目で見てやってください

## なぜ「コンテナ」と呼ぶのか、Dockerのロゴはなぜ縦に積まれているのか
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59593/711a2e37-b2db-4aa8-a9d2-bcb9879b0159.png)
（docker.comより引用 https://www.docker.com/ja-jp/ ）

公式ページでも**仮想マシン**とは言ってないんですよね。
ページを見ていると
- 開発環境
- 実行環境

という表現。
なのでVMから想像する**仮想化**とは違うんだなと気付く。

## 要はロゴが物語っていた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59593/1cd9da15-e8e4-4594-aa0c-bb18a3cc5962.png)

これですね、Dockerのロゴ。鯨に**コンテナ**が積まれているやつ。

#### Dockerはコンテナなので自走しない
というのが僕の解釈。
コンテナは船に乗っけて運ぶためのもの。**自走しない**ので、インフラ部分はホストOSに依存している。
VMのようにゲストOSの独立性は保たれない、コンテナはホストOSに依存する。

#### コンテナなので縦積みされている
個人的にはここが一番のキモであり、AWS等の活用の意味が深まったところ。
- 開発環境に使う
- 疎結合を実現する

これがAIに「Reactとは？」聞いた流れで**繋がった点**

WebシステムをReact、Pythonを使って開発すると
- React：フロントエンド
- Python：バックエンド
- MySql：データベース

を、それぞれのコンテナにし**縦積み**にして環境を作る。
**疎結合**なので、Pythonのバージョンアップをするにはバックエンドコンテナだけを新バージョンで作って動作確認すれば良い。

#### 発端はMVCモデルの現在地
JavaでWeb開発全盛の頃は**MVCモデル**が常識というか、前提だった。
- Reactの話を聞いている中で、C:Controlって誰がしてるん？
- そもそもTomcatのようなミドルウェアって不要？？

という疑問が生まれてきた。
AIに聞いたら

> Reactがフロントの場合、バックエンドはPythonで作ってAPIインターフェースで繋げることが多いです

という驚きの発言。
APIインターフェースって別システム繋ぐ時に使うやつじゃないん？（前時代発想）

それだけ**疎結合**な環境になっているし、APIを作れる状況にあるということは**インターフェースを増やせばビックデータにも使いやすい。**

#### 話をDockerに戻して
そういえば開発しててセキュリティパッチ当てるにも**いきなり全環境**を繋げた状態のものに当てるから、何かあった時にどこに問題があるかの切り分けで苦労したな。

なるほどね、プロセスごとにコンテナ（Docker）を使っていればコピって作ることも、差し替えて動作確認することも、なんなら違うものを当てても前後関係のインターフェースだけ合わせてれば動作確認できるのね。

ようやく理解できた、便利さも。

お付き合いくださり有難うございます。
robloxでassistant その173

# 概要
robloxでassistantやってみた。
ニューラルネットワーク、見つけたのでやってみた。

# 参考にしたページ

https://www.roblox.com/ja/games/134233981214443/LuNeT-1-1-Test#!/about

# 写真


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/04e4a1f7-3fae-4fa3-9953-8b5ce057d038.png)

# 調査

agentが全体でtrain
envはgame
actorはmodel
modelはnn.Sequential
入力01で	goalUp goalDown goalRight goalLeft dangerUp dangerDown dangerRight dangerLeft
入力8、隠れ層256、出力4
オプチマイザーは、SGD
-	nn.Linear(8, 256)
-	nn.ReLU()
-	nn.Linear(256, 4)
-	nn.Softmax()

出力01で	UP DOWN RIGHT LEFT
50回でupdate、resetボタンでストップ
ウェイト、バイアスの出力無くて、DataStoreServiceに保存
やる程、賢くなる。

以上。
【Javascript】Qiitaで自分の記事一覧を取得する方法

以下の通りでした。

```js
await fetch(`https://qiita.com/api/v2/users/${userID}/items`, {
		method: "GET",
		headers: {
			Authorization: `Bearer ${qiitaAccessToken}`,
		},
	})
```

[公式ドキュメント](https://qiita.com/api/v2/docs#get-apiv2items)のurlだと、自分はなぜか記事が一件しか取得できなかったので、上記のurlで取得しています。
【Swift】スコープについて理解する

## はじめに
スコープについて理解しきれていない部分があったため、学習した内容をまとめます。

## スコープとは
変数、定数、関数、型の名前の有効範囲を表すものを**スコープ**といいます。
スコープはその範囲に応じて**ローカルスコープ**と**グローバルスコープ**に分類されます。
同じスコープ内には同じ名前を複数存在させることはできず、変数、定数、関数、型の種類が異なっていたとしても名前は一意である必要があります。

## ローカルスコープ
関数や制御構文によって定義されるスコープを**ローカルスコープ**といいます。
ローカルスコープで宣言された変数や定数は、**関数や制御構文が持つ実行文の内部のみで有効**で、**スコープの外部からは参照できません。**

![スクリーンショット 2025-03-09 6.36.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4004493/304cffc8-ee79-42bd-8b74-9718e754d837.png)

上の例では、関数someFunction()内で定数aを宣言しています。
関数someFunction()内はスコープ内であるため定数aを参照できますが、関数の外はスコープ外となるため定数aを参照できず、コンパイルエラーとなっています。

ローカルスコープで宣言された変数や定数は限られた範囲からしか参照されないため、**意図しない変更が起こりにくい**というメリットがあります。





## グローバルスコープ
どの関数にも型宣言にも含まれないスコープを**グローバルスコープ**といいます。
グローバルスコープで宣言された変数や定数はファイル外も含めてどこからでも参照できます。

![スクリーンショット 2025-03-09 6.50.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4004493/456c29b5-679b-41b3-8b1e-3f95c7938024.png)


上の例では、グローバルスコープに定数globalAを定義し、関数someFunction()の内部と外部から参照しています。

グローバルスコープで宣言された変数や定数はどこからでも同じ名前で参照でき、**意図しない変更を招きやすい**ため、ローカルスコープで宣言された変数や定数よりも説明的な命名が必要になります。

## スコープの優先順位
同じスコープ内に同じ名前を複数存在させることはできませんが、異なるスコープには同じ名前を存在させることが可能です。
異なるスコープに同一の名前が存在する場合、**名前を参照するスコープから最も近い祖先のスコープにあるものが優先**されます。
例えばあるローカルスコープとグローバルスコープで同じ名前の定数が宣言されていた場合、ローカルスコープ内ではローカルスコープの方の定数への参照が優先されます。

![スクリーンショット 2025-03-09 7.01.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4004493/003e9eca-b5d2-452e-84da-a55b6e08ebb9.png)

上の例では、グローバルスコープと関数someFunction()のローカルスコープの両方に同じ名前の定数aを宣言し、それぞれのスコープから定数aを参照しています。
実行結果から、関数someFunction()のローカルスコープでは同じローカルスコープ内で宣言された定数aを参照し、グローバルスコープではグローバルスコープで宣言された定数aを参照していることがわかります。

## まとめ
- スコープとは変数、定数、関数、型の名前の有効範囲を表すもの
- スコープは範囲に応じて**ローカルスコープ**と**グローバルスコープ**に分類され、同じスコープ内には同じ名前を複数存在させることはできない
- 関数や制御構文によって定義されるスコープが**ローカルスコープ**、どの関数にも型宣言にも含まれないスコープが**グローバルスコープ**
- 異なるスコープに同一の名前が存在する場合スコープには優先順位があり、**名前を参照するスコープから最も近い祖先のスコープにあるものが優先**される
Active Directory入門：LDAP認証の技術検証 (Windows環境)について体系的に整理してみた

## **はじめに**
Windows環境でLDAP認証を利用する際の技術検証についての備忘録です。

ドメイン参加済みのWindowsサーバーで、LDAPを使用したユーザー認証を行う手順をまとめます。

---

## **環境情報**
- **LDAPサーバー (Active Directory)**
  - ホスト名: `ad.example.com`
  - ドメイン: `example.com`
  - LDAPポート: `389`（LDAPSの場合 `636`）
- **テスト用クライアント (Windowsサーバー)**
  - ドメイン参加済み
  - ユーザー: `testuser@example.com`

---

## **1. PowerShell を使った LDAP 認証の確認**

PowerShellを使用して、LDAP認証が成功するかをテストします。

### **スクリプト**
```powershell
# LDAPサーバー情報
$ldapServer = "ad.example.com"
$ldapPort = 389  # LDAPSなら 636
$ldapUser = "testuser@example.com"
$ldapPassword = "P@ssw0rd"

# DirectoryEntry クラスを使ってバインド (認証)
try {
    $ldapConnection = New-Object System.DirectoryServices.DirectoryEntry("LDAP://$ldapServer:$ldapPort", $ldapUser, $ldapPassword)
    
    if ($ldapConnection.Name -ne $null) {
        Write-Host "LDAP 認証成功: ユーザー $ldapUser は有効"
    } else {
        Write-Host "LDAP 認証失敗: ユーザーが見つからない"
    }
} catch {
    Write-Host "LDAP 認証エラー: $_"
}
```

### **結果の確認**
| 結果 | 出力メッセージ |
|------|--------------|
| 認証成功 | `LDAP 認証成功: ユーザー testuser@example.com は有効` |
| 認証失敗 | `LDAP 認証失敗: ユーザーが見つからない` |
| 認証エラー | `LDAP 認証エラー: Access is denied` |

---

## **2. `ldp.exe` を使った LDAP 認証の確認 (GUI ツール)**

1. `Windowsキー + R` を押し、`ldp.exe` を実行します。
2. **「Connection」→「Connect」** を選択します。
   - **Server:** `ad.example.com`
   - **Port:** `389`（LDAPSなら `636`）
   - **Use SSL** にチェックを入れます（LDAPSを使う場合）
3. **「Connection」→「Bind」** を選択します。
   - **Bind Type:** `Simple Bind`
   - **User:** `testuser@example.com`
   - **Password:** `P@ssw0rd`
4. **OK をクリックし、認証結果を確認します。**

### **結果の確認**
| 結果 | 確認方法 |
|------|----------|
| 認証成功 | `Authenticated as DN` が表示される |
| 認証失敗 | `Invalid credentials` エラーが表示される |

---

## **まとめ**

| 検証方法 | 成功時の確認方法 | 失敗時のエラー例 |
|----------|----------------|----------------|
| **PowerShell スクリプト** | `LDAP 認証成功` | `LDAP 認証エラー: Access is denied` |
| **ldp.exe (GUI ツール)** | `Authenticated as DN` | `Invalid credentials` |

本記事の内容は、個人の技術調査に基づいており、実際の環境での検証はまだ行っていない部分も含まれます。

:::note info
**LDAP 認証の技術検証として、まずは PowerShell で認証テストを行い、その後 `ldp.exe` で確認するのが基本だと思っています。**
:::

今後は **LDAP を使ったアプリケーションの認証組み込み** を進める予定です。
競プロ日記#25/03/09

アルゴ式-[背の順になるように](https://algo-method.com/tasks/6021900cc7f93955)
- 以下の様にそこまでの最大値を記憶していけばN回の計算で答えを出せる。
```
for(int i = 0;i < N;i++){
    if (vecN.at(i) < temp){
        
        ans += (temp - vecN.at(i));
        temp = max(vecN.at(i),temp);
    }else{
        temp = vecN.at(i);
    }
}
```
今更言えない、httpサーバー、メールサーバーとのチャットの方法

初めての動作チェックには telnet コマンドによる
サーバーとのチェックが最も簡単です

今やtelnetコマンドがないかもしれませんので
```
apt install telnet
yum install telnet
```
等とインストールしましょう

なお、そのためにポートをわざわざ開ける必要はありません

この記事ではSSLでのチェックを行いません

# http
`telnet example.com 80`
```
Trying 192.168.0.1...
Connected to example.com.
Escape character is '^]'.
```
`GET / HTTP/1.1`
`Host: example.com`
`（空行）`
```
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Sat, 08 Mar 2025 20:28:04 GMT
Content-Type: text/html
Content-Length: 162
Connection: keep-alive
Location: https://example.com/

以下HTML
Connection closed by foreign host.
```

:::note info
常時SSLをしているので301が帰ってきています。通常であれば200が帰ります
:::

# smtp

`telnet smtp.example.com 25`
```
Trying 192.168.0.1...
Connected to smtp.example.com.
Escape character is '^]'.
220 example.com ESMTP MAIL
```
`helo example.com`
```
250 mail.example.com
```
`mail from: <example@example.com>`
```
250 2.1.0 Ok
```
`rcpt to: <test@test.com>`
```
250 2.1.5 Ok
```
`data`
```
354 End data with <CR><LF>.<CR><LF>
```
`From: <example@example.com>`
`To: <test@test.com>`
`Subject: test`
`（空行）`
`test`
`.`
```
250 2.0.0 Ok: queued as ADB0A194B31A
```
`quit`
```
221 2.0.0 Bye
Connection closed by foreign host.
```

# pop

`telnet pop.example.com 110`
```
Trying 192.168.0.1...
Connected to pop.example.com.
Escape character is '^]'.
+OK Dovecot ready.
```
`user アカウント`
```
+OK
```
`pass パスワード`
```
+OK Logged in.
```
`list`
```
+OK 1 messages:
1 ???
.
```
`retr 1`
```
+OK ??? octets
メール内容
.
```
`quit`
```
+OK Logging out.
Connection closed by foreign host.
```
『ソフトウェア開発現場の「失敗」集めてみた。』を読んだ。

『ソフトウェア開発現場の「失敗」集めてみた。』を読んだ。

[ソフトウェア開発現場の「失敗」集めてみた。 42の失敗事例で学ぶチーム開発のうまい進めかた | 出石 聡史 |本 | 通販 | Amazon](https://www.amazon.co.jp/dp/4798185183)

![](https://m.media-amazon.com/images/I/71wSM9iN0mL._SY425_.jpg)

『ソフトウェア開発現場の「失敗」集めてみた。』。そのままですが、中身もそのまま、色々な失敗集。リアルな事例が集められているので、古典に飽きたらちょっとした娯楽のつもりで読んでみるのも良いと思われる。

私の場合、ちょっとやそっとの失敗じゃ驚かないよと思ってページをめくり始めたが、のっけから登場したのは皆の願いをかなえたい「八方美人仕様」。ああこれは失敗するやつだ、と期待が高まりました。

Qiita なら アドベントカレンダー の「やらかしちゃった人」が良い例だと思うが...

https://qiita.com/advent-calendar/2024/yarakashi-production

本として完成度を高めるに、エピソードだけ集めてくるのはできるけどいい具合に抽象化したりリアルなフェイクにしたりするの難しいよね、と思いながら読みました。

## 刺さったトピック

日程要望 と 機能要望 の見積もりが甘い、というあるある。また「オレゴン大学の実験」... あの「顧客が本当に欲しかったもの」。

https://xtech.nikkei.com/it/article/COLUMN/20080828/313626/

顧客から機能要望ではなく「困りごと (課題)」を聞き出すことが大事だという教訓になりそう。私自身も、対応 OS とかミドルウェアとか全製品の担当者集まってどの Version 対応するとかしないとかマトリックス作る会議やってたような思い出もある。

この本は、自分だけが読んでも駄目で皆で輪読すると良いであろう話がたくさん書かれている。結局ソフトウェアとは、ひとりで作っていれば失敗は少ないものなのかもしれない、という気持ちになる。人と人が集まるから失敗も起こるし、何かが生まれる。ソフトウェア開発は楽しいですね。

## ほか参考

[読書感想文「ソフトウェア開発現場の「失敗」集めてみた。 42の失敗事例で学ぶチーム開発のうまい進めかた」](https://zenn.dev/levtech/articles/24b4a4014a883f)
[ソフトウェア開発現場の「失敗」集めてみた。から学んだこと - 虎の穴ラボ技術ブログ](https://toranoana-lab.hatenablog.com/entry/2024/07/22/120000)

特別抜粋版がありました: [エンジニアには失敗からしか得られない学びがある　『ソフトウェア開発現場の「失敗」集めてみた。』発売|CodeZine（コードジン）](https://codezine.jp/article/detail/19395)


以上です～
数学的真理は証明できるのか？: 一階述語論理の完全性の重要さ

## 一階述語論理の完全性定理の重要性

本記事では、**「一階述語論理の完全性定理」** の重要性について解説します。一階述語論理の完全性定理は、数学的真理と証明可能性をつなぐ架け橋となる重要な定理です。本記事では、この定理が数学の厳密な証明体系をどのように支えているのかを解説し、なぜ初学者にとって学ぶべき重要な定理なのかを明らかにします。

論計舎では、数理論理学を体系的に学ぶための第一歩として、この完全性定理を重要視しています。実際の講義では、この定理の証明を通じて、数学の証明体系がどのように機能するかを詳しく解説します。本記事の内容は、その入門としても活用できるでしょう。

さらに、このテーマに関心のある方に向けて、論計舎で開催する「一階述語論理の完全性とその証明」に関する集中講義の案内も掲載しています。

---

## 1. 数理論理学とは何か

数理論理学とは、数学を数学的に研究する試みであり、数学の証明の正当性を数学的に保証することを目的とする分野です。数理論理学は、数学の証明を数学的に研究する分野です。たとえば、「すべての証明を形式化して矛盾がないか確かめる」ことを目指したヒルベルト計画がその一例でその出発点の一つです。これにより、数学が厳密な体系である理由を解明できます。数学における証明や論理式を形式化し、それらの性質を研究することで、数学がいかに厳密な体系として成り立っているかを明らかにします。

---

## 2. 完全性とは何か

数学の証明体系において、 **「健全性」と「完全性」** は重要な概念です。

**健全性**とは、『証明された命題はすべて数学的に正しい』ということを形式的に表現していると言えるでしょう。一方で、**完全性**とは『数学的に正しい命題（数学的真理）はすべて証明できるのか？』という問いに対する肯定的な答えです。
つまり、健全性と完全性は補完的な概念であり、完全性定理は「証明可能なことの範囲が十分広い」ことを保証します。この定理により、「どんな数学的対象にも成り立つことは証明できる」と証明が数学を展開するにあたって十分に強力であることがわかります。言い換えましょう。「健全性とは、数学的証明が誤りなく正しいことを保証する性質です。一方、完全性とは、数学的に正しいすべての命題（数学的真理）が証明可能であることを保証する性質です。」


完全性とは、「数学的に正しい命題はすべて証明できる」という性質です。たとえば、「どんな整数 $n$ でも $n > 0$ なら $n + 1 > 1$」が正しい場合、これを公理から証明できることを保証します。プログラミングでは、仕様が正しいならその実装が検証可能であることに似ています。



---

## 3. 一階述語論理とは

一階述語論理とは、簡単にいうと「量化子（$\forall$：全称、$\exists$：存在）」を含む論理体系です。ここでは例えば「すべての $x$ について命題 $\varphi$ が成り立つ」といった表現が可能です。

数学の基礎を厳密に定式化するために、公理系（ペアノ算術、集合論など）は一階述語論理を用いて定義されます。一階述語論理は、数学の証明を厳密に表現し、証明の正当性を保証する重要な体系なのです。

数学における厳密な証明の一例として **$\varepsilon - \delta$論法** を挙げることができます。これは解析学において極限を厳密に定義するための方法であり、任意の $\varepsilon$ に対して適切な $\delta$ を見つけることで関数の収束性を証明するものです。この中で「ある $\delta$ が存在する」という主張を正確に記述するために、一階述語論理の枠組みが必要となります。このように、数学の多くの厳密な定義は、一階述語論理なしには成り立ちません。

---

## 4. まとめ: 一階述語論理の完全性が重要な理由


一階述語論理の完全性定理が重要な理由：
- 数学的真理を証明可能にする。
- 証明体系の強さと限界を明らかにする（不完全性定理への道を開く）。
これを学ぶことで、数学や論理の基礎が深く理解できます。

---

## 5.  集中講義の案内

本記事で紹介した完全性定理をさらに学びたい方へ。論計舎の集中講義「一階述語論理の完全性とその証明」で、証明の詳細を体系的に解説します。詳細は[こちら](https://ronkeisha.net/events/202503-comp/)から！
- 日程：2025年3月17日～21日
- 形式：オンライン（Zoom、アーカイブ視聴可）
- 受講料： 8,800円（3名以上の参加でグループ割引あり）
【初心者向け~ハンズオン~】GitHub Pagesを使ってHTML、CSSファイルを世界へ公開してみよう！！

## 🎯 はじめに

Webサイトを作るとき、「せっかく作ったHTMLやCSSをインターネット上で公開したい！」と思ったことはありませんか？
Live serverなどの拡張機能を使えば簡単にローカルで見れはしますが、
他の人へ見せつける（？）ことはできないですよね。

そんなときに便利なのが **GitHub Pages** です！

GitHub Pages を使えば、**無料で自分のHTMLやCSSを世界に向けて公開** できます。

この記事では **初心者向けのハンズオン形式** で、GitHub Pages を使って **HTMLとCSSのWebページを公開する手順** を解説します！

---

## **📌 手順の概要**

1. **リポジトリの準備**（GitHubにプロジェクトを作成する）
2. **HTML・CSSファイルの準備**（サンプルコードあり）
3. **GitHub Pages の設定**（デプロイ方法）

---

## **1. リポジトリの準備**

まずはGitHubに **新しいリポジトリ** を作成します。

### ✅ **リポジトリを作成する**

1. GitHubにログインし、右上の `+` ボタン → `New repository` をクリック。
2. **リポジトリ名** を入力（例: `my-first-website`）。
3. **「Public（公開）」** を選択。
4. **「Initialize this repository with a README」にはチェックを入れない**。
5. `Create repository` ボタンをクリック。

🎉 これでGitHub上に **リポジトリが作成されました！**

---

## **2. HTML・CSSファイルの準備**

次に、公開するHTMLとCSSのファイルを準備しましょう。
今回は簡単のためにこちらでサンプルファイルを準備したので、こちらをご利用ください。

### ✅ **初心者向けのサンプルコード**

📌 **`index.html`（Webページのメインファイル）**
```html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>GitHub Pages 初公開！</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <h1>GitHub PagesでWebサイトを公開しよう！</h1>
    <p>これは初心者向けのGitHub Pages公開サンプルです。</p>
</body>
</html>
```

📌 **`style.css`（Webページのデザイン）**
```css
body {
    font-family: Arial, sans-serif;
    text-align: center;
    margin: 50px;
    background-color: #f4f4f4;
}
h1 {
    color: #333;
}
```

この2つのファイルを **以下のように** に配置してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3909033/eecd0873-e0aa-4dcb-8b8e-fd301e32768f.png)

※フォルダ名は何でもよいです。



### ✅ **ファイルをGitHubにアップロード**
:::note warn
※注意！以下画像のように、ターミナルの語尾（カレントディレクトリ）が作ったフォルダと同じ名前になっていることを確認してください
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3909033/bb068483-02dc-4f08-8d8f-9acbdfc4d37f.png)

蒸気を確認したらターミナルで以下のコマンドを実行し、GitHubにアップロードしましょう。

```sh
git init  # リポジトリを初期化（1回だけ実行）
git add .
git commit -m "Add initial HTML and CSS files"
git branch -M main
git remote add origin https://github.com/あなたのGitHubユーザー名/my-first-website.git
git push -u origin main
```

📌 これで **GitHubにファイルがアップロード** されました！

---

## **3. GitHub Pages の設定**

最後に **GitHub Pages の設定** を行い、サイトを公開します！

### ✅ **GitHub Pages を有効化する**

1. GitHubのリポジトリページを開く。
2. `Settings` タブをクリック。
3. 左サイドバーの `Pages` をクリック。
4. `Branch` の `main` を選択し、`Save` をクリック。

🎉 **設定完了！** 数分後にWebサイトが公開されます。

---

## **4. 公開URLを確認する**

GitHub Pagesが有効になると、`Settings > Pages` に **公開URL** が表示されます。

例：
```
https://あなたのGitHubユーザー名.github.io/my-first-website/
```

このURLを開けば、作成したHTMLファイルが **世界中の誰でも閲覧できるWebサイト** になっています！🌍✨

---

## **🎉 まとめ**

✅ GitHubでリポジトリを作成する
✅ HTML・CSSファイルを作成し、GitHubにアップロードする
✅ GitHub Pages を有効化し、Webサイトを公開する

これで **あなたの作ったWebページが世界に公開されました！** 🚀

---

## **📝 参考リンク**
- [GitHub Pages 公式ドキュメント](https://docs.github.com/en/pages/getting-started-with-github-pages/about-github-pages)
- [無料でWebサイトを公開する方法 (Qiita)](https://qiita.com/)
cmdやPowershellで実行できるコマンドの概念

### 初心者向けです。
まずは以下をご覧ください。

#### cdコマンド実行。publicというディレクトリに移動しているのが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919278/29921d5f-76f6-49fa-92c9-acd2b6e08514.png)

#### pingコマンド実行。GoogleのキャッシュDNSサーバに通信しているのが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919278/d4d7284e-d94e-457c-a1b6-80371c1b4529.png)

…うん、どちらもコマンドを実行しただけじゃないとお思いかもしれませんが、実はこの2つのコマンドは異なる仕組みで実装されています。
そもそもコマンドの正体とは、というのがこのブログの内容です。

### 内部コマンド（組み込みコマンド）
例：cd、rmとか
これらはcmd.exeなどのシェルの内部に組み込まれているコマンドです。
つまり、『もし cd と打ち込まれたら、それに続くパスに移動』というコードがそのままcmd.exe内で定義されているものと思われます。
cmd.exeの開発者が「これは使えた方が便利だよね」という意図で、cmd.exe単体で利用できるようにcmd.exeに埋め込んだもの…ということです。

cmd.exeの中身（バイナリデータ）を取り出したら、このへんのコマンドが定義されてそうな箇所があった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919278/209a90b4-3470-4339-8a71-27d6fdb55d4c.png)

### 外部コマンド

ping、とか
これは外部のファイルを参照して動いています。
つまり、ping.exeという外部にpingを飛ばす処理が書かれたファイルがあり、それを読み込んでいるだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919278/7be2a157-4848-42ea-9f33-d6b250cadc30.png)
cmd.exeから、別の実行ファイル"ping.exe"を動かしている訳ですからcmd.exeだけで完結する処理ではありません。
タスクマネージャーを見ても、実行した瞬間にプロセスが発生していることが確認できます。
当然ですが、cdコマンドなどはcmdやpowershell内で完結しているので、新しいプロセスは発生していません。

#### 実行前はping.exeはないが、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919278/f44c23f7-e5ac-4ebf-b318-3234c229fcdb.png)

#### 実行すると動く。結果が表示されたらping.exeのプロセスは勝手に終了して閉じる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919278/7dd81d4e-dfa8-4c0b-9293-d8f790a2364c.png)

### 外部コマンドについて
結局はただファイルを実行しているだけ。
しかし、本来はこのように「CドライブのWindowsのSystem32にあるPING.exeを実行してください。」という風に、そのファイルの保存場所と拡張子（.exe）まで正確に指定しないと動かない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919278/7cdb70b1-162b-4319-814b-35c98f6be021.png)

私はDMMGamesからウマ娘をプレイしているが、DMMGamePlayer.exeだけでは実行できない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919278/9d98d03f-3f73-4df8-bf56-6fcb90dd8b27.png)
ではなぜPing.exeは正確に入力した場合はもちろん、ファイル名だけで実行できるのか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919278/c69fe97d-24c6-4335-a588-87c7a97a3163.png)

その答えは パスを通しているから。

### パスを通すとは
指定したパス内にあるファイルは、ファイル名だけで実行できるというもの。
ここのPathで指定されているもの。確かにPing.exeがあるC:\Widnows\system32も登録されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919278/ee503e98-d58e-4835-a43f-537e25e0fb9e.png)
目的はただ一つ。便利だから。
IBM Cloud Professional Architect v6を受けてみた

## IBM Cloud Professional Architect v6とは

IBM Cloudの認定技術者試験の1つで、中級レベルの試験です。当試験に合格するとIBM Certified Professional Architect - Cloud v6の認定資格を得ることが出来ます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/10e94410-2fe7-4ed0-85d7-b25a1ca63659.png" width="128">

認定資格および試験の概要はこちらです。

https://www.ibm.com/training/certification/ibm-certified-professional-architect-cloud-v6-C9005800

実を言いますと<a href="https://qiita.com/teruq/items/a3af04998b707372037d">前回の投稿</a>で先に上位資格であるAdvanced Architect v2を受けていたのですが、IBM Cloudバッジコレクターの血が騒ぎ今回受験して来ました。

## 学習方法

IBM公式の学習サイトがありますのでそこで勉強することも可能です。なお私は例によって無勉強で行ってきました。

なお、昨年まではIBM Cloud Prepという試験対策に特化したサイトがあったのですが残念ながらサンセットしてしまったようです。

https://www.ibm.com/training/path/ibm-cloud-professional-architect-690

## 受験方法

PearsonVUE社のサイトで予約して受験してください。

https://www.pearsonvue.com/jp/ja/ibm.html

## 合格点

64問中39点以上（60%）が合格ラインです。

## 感想

結構難易度は高め？の印象でした。Power VSやVMwareなどあまり関わって来なかったジャンルが多かったですし、これどう見てもどっちも正解じゃないかという問題も多かったです。結果としてはあまり余裕のないスコアで合格は出来ました。

ちなみにAdvanced Architect v2を持っていると次のようなPLUSバッジも同時発行されました。

<img src="https://images.credly.com/size/680x680/images/5878c75a-80f9-47fd-a066-68c4c49397f6/F1002500_BADGE_EMBLEM_FILE_AArchArch.png" width="128">
個人でデータ基盤を作ってみたい

# 前置き
私はデータエンジニアとして働いており、業務では大規模なデータを取り扱うので相応のデータ基盤の開発を行っております。

そのデータ基盤では多数のメンバーが携わりながら開発や保守運用を行なっているのでデータ基盤の開発をしていくのは大掛かりかつ大変だなと思う一方、個人でスモールスタートする形でデータ基盤を作るとしたらどう作ったら良いかというのが気になり、個人開発の範囲で作ってみようと思いました。

# どんなデータ基盤を作るのか？
- 主にAWSを用いてデータソースの取得からデータレイクへのデータ連携、そしてETLツールを用いてDWHへデータをロードするデータ基盤を作りたいと思います
- 最終的にBIツールを用いてDWHへ連携したデータを可視化するところまでやります
- 具体的に連携するデータとしては、技術サイト(ZennやQiita)の日毎のタグトレンド情報です
  - なぜこのデータかというと、技術サイトによってトレンドの技術に違いがあるのかが気になったのでこのデータを日次連携して分析することで解明したかったからです

# システム構成図
簡易的ですが構成図としては下記のように実装しました。
![](https://storage.googleapis.com/zenn-user-upload/19cc816205a0-20250223.png)
BIツールとしては、Amazon QuickSightを使いたかったのですがコストの都合上Google Looker Studioを使用しております。

#### 処理の流れ
1. APIを叩いてタグ情報を取得するlambda関数を日次で実行
2. 取得されたデータをS3へ格納
3. 格納されたS3データを元にGlueジョブでデータを抽出・加工してRedshiftへ連携
4. Looker StudioでRedshiftを読み込んでレポートを表示

# 作成したレポート
(数年ぶりにレポート作りました。見づらかったらすみません🙇)
### Qiitaのタグ情報レポート
![スクリーンショット 2025-03-09 2.41.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244234/7ab7e3a3-f15d-46d1-9cbf-9a631f0e8a83.png)

### Zennのタグ情報レポート
![スクリーンショット 2025-03-09 2.43.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244234/56e7f91f-d046-4ad6-b9f2-ff7fe7f16b45.png)


# データからわかったこと
### タグ数の割合の違い
- Qiitaでは、全体的に歴史のある言語・フレームワーク（Ruby・Rails・PHPなど）が上位に入りつつDockerやAWS、Pythonなど近年の定番技術も高いシェアを維持している
- Zennでは、RustやNext.js、Flutter、Goなど比較的新め・モダンな技術が高い存在感を示している

### 日次増加率の傾向
- Qiita側では-0.25から+0.2程度の比較的小さな変動範囲になっている
    - 一部タグでやや低下傾向があるものの、全体に大きく伸びているタグと大きく減少しているタグが激しく分かれているわけではない
- Zenn側では-0.05から+0.35程度の範囲でQiitaと比べるとやや変動幅が広い
    - 一部タグでプラスの増加率が大きく、特にnext.jsやフロントエンド関連タグが伸びており、これからも伸びていきそう
    - Qiitaと比べて規模が比較的小さい分、特定の技術への記事が集中したらその分伸び率が大きくなりやすそう
 
## 「技術サイトによってトレンドの技術に違いがあるのか？」
この疑問からデータを収集して分析しましたが下記の点で違いがありそうだと感じました。
- Qiitaは古参ユーザ層を含む幅広い技術が投稿されやく、Zennは最新技術（特にWebフロントやAI, Rust等）に注目が集まり投稿されやすい
- Qiitaの方がユーザ数の母数が多いため、新規トレンドが急激に伸びるのが顕在化しにくそうな一方でZennは総数が少ないため一気に伸びる現象が起きやすく、伸び率の変化が見やすい。
  - そのため、トレンドを素早く把握したいならZennを見て、幅広い歴史のある技術の知見を探したいならQiitaを見る、という使い分けが出来そう。
 
# 最後に
実際にデータ基盤を作成してみましたが、そこまで大きなデータを取り扱われなければ簡単に実装できると感じました。BIツールを用いたレポート開発は普段の業務で行わないので上手くレポート開発出来るか不安でしたが、自分なりにデータを可視化して分析することができたので良い経験になりました。

また、今回は2週間半程度のデータで分析しましたがもっと長期のデータを取り込んで分析したらまた別の見え方が見えてくると思います。データはたくさん溜めて分析するとまた価値が出てくるので次は数ヶ月または数年単位でデータを収集して再度データ分析をしてみたいと思います！
SAPメモリ関連の静的パラメータでも動的に変更する裏技

アプリチームで何かプログラムを動かして、メモリエラー対応が必要な事ってありますよね。
よくあるのがTSV_TNEW_PAGE_ALLOC_FAILEDとか。
 
RZ10でパラメータ変更後、インスタンスを再起動するのがお作法的には正しいです。
ただジョブが動いてたり、RISE環境だと簡単にすぐ再起動できない事も少なくないですよね。
 
RZ11から動的パラメータであれば変更できますが、今回は権限の問題か変更できませんでした。
→RZ11で見るとztta/roll_extensionは動的に変更できないとの記載なので多分権限は関係ない
 
メモリ関連であれば動的にパラメータ変更できるプログラムRSMEMORYを見つけたのであくまでも裏技的なものとして共有です。

# SE38からRSMEMORYを実行
実行すると下記の画面になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821335/49a3be6e-4f12-4d31-bc36-792adb5439bf.png)

 
左側の枠で大きく分けて、DIA、BTC、その他のパラメータという感じです。
 
クラスに1or2を入れて、EMかHEAPのパラメータの指定をします。
 
設定したら右上のCopyボタンクリック。

## 反映後の確認

反映後はちょっと分かりにくいですが、ST02のGotoから下記の項目クリックです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821335/1e6c3c91-162a-419c-ad67-ece6e73b4469.png)

## 値確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821335/9ba2b9c2-5027-4520-980c-6883c98f17bc.png)

今回はNon-DIAのEMを約18GBにしたのでそれが反映できてます。
 
あくまでも臨時的なものですので、再起動するとパラメータは消えます。
 
作業後は忘れずにRZ10で同じ設定をしておきましょう。
ChatGPT推薦する1440p最高画質60FPSで遊べるゲーミングPC

最近自作PCを組み立てしようと思ってChatGPTに聞いた。2025現在も結構参考になりそう、ノートを残っておく。

- [9070XT](https://www.amd.com/en/products/graphics/desktops/radeon/9000-series/amd-radeon-rx-9070xt.html)は現時点ですでに販売開始だが、残念ながら品薄なので、多分しばらく599ドルで買えない。待つか？
- CPUは無駄に見えそう。Ryzen5系の7600X十分かも
- 総額約22万


| **Component**  | **Model** | **Estimated Price (JPY)** |
|---------------|----------|------------------|
| **CPU**       | AMD Ryzen 7 7800X3D | ¥55,000~¥60,000 |
| **Cooler**    | DeepCool AK620 / Noctua NH-D15 | ¥8,000~¥15,000 |
| **Motherboard** | MSI B650 TOMAHAWK WIFI / ASUS ROG STRIX B650-A WIFI | ¥25,000~¥30,000 |
| **RAM**       | 32GB (2x16GB) DDR5-6000 CL30 (G.Skill Trident Z5 / Corsair Vengeance) | ¥18,000~¥22,000 |
| **GPU**       | AMD Radeon RX 7800 XT | ¥85,000~¥95,000 |
| **Storage**   | 1TB NVMe SSD Gen4 (Samsung 990 Pro / WD Black SN850X) | ¥16,000~¥20,000 |
| **Power Supply** | 750W~850W 80+ Gold (Corsair RM850e / Seasonic Focus GX-850) | ¥15,000~¥18,000 |
| **Case**      | Lian Li Lancool III / Fractal Design Meshify 2 / Corsair 4000D Airflow | ¥12,000~¥18,000 |
Gemini Code Assist for GitHubでコードレビューまでしてくれるようなので試してみました

## 概要
https://cloudonair.withgoogle.com/events/modern-app-summit-25q1

先日Googleの主催するModern App Summit ’25に参加しました。その中でもGemini Code Assistはイベントを通して推していたのかなと感じたのとGithub連携によるコードレビューは是非とも試してみたいと思ったので試してみたいと思います。

## 参考ページ
公式

https://codeassist.google/?hl=ja

## セットアップ
どこよりも優しくgithub連携までします。

https://github.com/apps/gemini-code-assist

github appsから連携

![スクリーンショット 2025-03-09 0.01.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254217/f124416d-d2c8-48b5-8ac1-81819b39385b.png)
個人もしくは参加しているオーガナイゼーションを選択。今回はデモなので個人に紐付けます

![スクリーンショット 2025-03-09 0.03.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254217/bda3c250-040a-4d90-a252-85ee95162c9a.png)
全てに適用する or 特定のリポジトリを選択できる。今回はリポジトリを指定。

![スクリーンショット 2025-03-09 0.06.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254217/b565c756-4f9f-4887-b1f1-9016593a5288.png)
諸々確認して承認。

![スクリーンショット 2025-03-09 0.08.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254217/7ee540c3-7d91-42af-9ac0-b5f6e35a0fec.png)
Geminiに飛ぶのでそちら側でも諸々確認して承認。

![スクリーンショット 2025-03-09 0.09.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254217/d52b4dae-df72-420e-a3af-f9644c575087.png)

> リポジトリで作成されたすべてのプル リクエストは、Gemini によるコード レビューを受けます。
コードレビューには、プルリクエストの概要、改善提案、提案されたコミットが含まれます。

とのこと。完了!!

## 実際にコードレビューをしてもらう

https://github.com/hoshima-ut/portfolio

これでやってみる。

![スクリーンショット 2025-03-09 0.31.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254217/21dd9e56-d64e-43a2-8a52-35967cecb801.png)
せっかくなので私のポートフォリオをGeminiにベース書いていただきました。あとは細かい微調整。

https://github.com/hoshima-ut/portfolio/pull/1

PRはこちら。

![スクリーンショット 2025-03-09 0.57.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254217/fbafcc29-7329-4908-bb32-74424cffbb6b.png)
PRを出すとGemini側でサマリーを出してくれます。

![スクリーンショット 2025-03-09 0.58.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254217/7314daed-d43f-42e4-9926-e862e3bb0e85.png)
![スクリーンショット 2025-03-09 0.58.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254217/e5a535d8-d764-4c0f-9e4f-8fe2299e7853.png)
追ってコードレビューの提案。簡単なUIなのでそこまで多くは提案されなかった。ここが商用の開発だったらどこまで指摘が出るのかは楽しみ

## まとめ
Gemini Code AssistをGithub連携させるとPR時にサマリーやコードレビューまでしてくれることは確認できました。日本語で返してもらったり中身をチューニングしていくことができるらしいのでこれからもっと掘っていきたいです。

Geminiで吐いたコードをpushしているのだから特に何も出てこないんじゃないかと思ったが、ちゃんと自分でコードレビューしてくれたので中の人が2人いるような感覚になりました。笑

GitHub Copilotが競合する機能だと思いますが、それだと現状Enterpriseプランにしないとコードレビューは使えないようです。どこかで機会があれば掘ろうかな
Chatbot UI (legacy) を o3-mini や GPT-4.5 Preview に対応してみた（APIバージョン2025-02-01-preview）

こんにちはー。  

最近、@potofoさんが私が作成した Chatbot UI (legacy) のAzure対応版を紹介してくれていたことに気づきました。ありがとうございます！

このコードは海外の方々にも利用されているようで、多くの方々に貢献できていることにとても嬉しく感じています。

https://qiita.com/potofo/items/ab5a1f7b1a6ee09fe369

そしてなんと！ Azure OpenAI で誰でも o3-mini が使えるようになりました！パチパチパチ。

その嬉しさの勢いで、Chatbot UI (legacy) を修正して、o3-mini や GPT-4.5 Preview が動作するようになりました。 (正確には、GPT-4.5 Preview は値段が高いため実行できていません。)

# アップデート版 Chatbot UI (legacy) 
今回修正した Chatbot UI (legacy) のコードは以下のブランチにあります。

https://github.com/KentaroAOKI/chatbot-ui/tree/feature-supports-azure-openai-api-2025-02-01-preview

修正した主な箇所：

OpenAI向けの修正
- 選択できるOpenAIモデルが古かったため、最新のモデル（gpt-3.5-turbo、gpt-4o-mini、o1-mini、o3-mini、gpt-4.5-preview）に更新しました。
- 最新モデルでは、system role や stream、developer role、temperature など、使用できる機能が異なるため、モデルごとにAPIリクエストを変更するようにしました。

Azure OpenAI向けの修正
- モデル選択画面では、OpenAIのAPI向けのモデルが設定できますが、Azure OpenAIのデプロイメントではないため、Azure OpenAI ではモデルの選択コンポーネントを非表示にしました。
- Azure OpenAIのデプロイメントに合わせたリクエストができるように、system role、stream、developer role、temperature の設定を追加しました。

共通箇所の修正
- stream を使ったリクエストだけでなく、通常リクエストにも対応できるように修正しました。
- max_tokens が廃止されたため、max_completion_tokens を使用するように変更し、各モデルで最大値が設定できるようにしました。

# ローカル環境における起動方法
git cloneして修正したブランチをcheck outします。

```
git clone https://github.com/KentaroAOKI/chatbot-ui.git
git fech
git checkout -b feature-supports-azure-openai-api-2025-02-01-preview
```

npmで必要なパッケージを取得します。
```
npm i
```

.env.local.example を .env.local としてコピーします。コピーした .env.local を編集してください。

OpenAI API を使う方は、"#for Azure OpenAI API"の箇所をコメントにして、"#for OpenAI API"以下を修正してください。

```sh
# Chatbot UI
NEXT_PUBLIC_DEFAULT_SYSTEM_PROMPT="You are ChatGPT, a large language model trained by OpenAI. Follow the user's instructions carefully. Respond using markdown."
OPENAI_REQ_MAX_COMPLETION_TOKENS=0

# for OpenAI API
# OPENAI_API_TYPE=openai
# DEFAULT_MODEL=o3-mini
# OPENAI_API_KEY=YOUR_KEY
# OPENAI_API_HOST=https://api.openai.com
# OPENAI_API_VERSION=2025-02-01-preview

# for Azure OpenAI API
OPENAI_API_TYPE=azure
AZURE_DEPLOYMENT_ID=o3-mini
OPENAI_API_KEY=YOUR_KEY
OPENAI_API_HOST=https://<endpoint>.openai.azure.com
OPENAI_API_VERSION=2025-02-01-preview
OPENAI_REQ_STREAM=true
OPENAI_REQ_ROLE_SYSTEM=false
OPENAI_REQ_ROLE_DEVELOPER=true
OPENAI_REQ_TEMPERATURE=false
```

実行します。
```
npm run dev
```

実行したら、Webブラウザで "localhost:3000" にアクセスします。

Chatbot UI の画面（OpenAI の API を使用）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32580/2a880235-2b2c-4335-b4fe-6723da24bdff.png)

Chatbot UI の画面（Azure OpenAI の API を使用）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32580/258133dc-9df2-4a54-a0bd-5f839d559c1a.png)



# さいごに
次は、前回作成した 実験用のAIエージェント を o3-mini で試してみる予定です。それではー！

https://qiita.com/kekekekenta/items/a29def2eceacdfea037f
MIT App Inventorでchatbotの回答を制御する方法（その2）テキストと数値の出力を行う．AIによるファンタジーのキャラクタ創造

## はじめに
以前の記事でgoogle documentの記事（[Gemini API を使用して構造化された出力を生成する](https://ai.google.dev/gemini-api/docs/structured-output?hl=ja&lang=rest)）をMIT App Inventoで実装しました．その結果，MIT App Inventorにて生成AIを利用するときにjson schemaを利用することでAIの解答をより求めるものへと近づけられることがわかりました．
ここでは，MIT App InventorでAIからの解答をテキストと数値に分けて出力します．マジ便利！

## 作成するアプリ
MIT App Inventorからchat Botにアクセスし，ファンタジーに出てきそうなキャラクタのプロフィールを４人考えてもらう．

**プロフィールの出力項目**
* 名前
* 年齢
* 種族
* 特技
* 詳細

:::note info
年齢のみ数値で出力してもらう．そのほかはテキスト，
:::

## デザイナー画面
![スクリーンショット 2025-03-08 234526.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/f8c55813-13d1-4289-9b01-e47b25795a65.png)

|機能|内容|
|:-:|:-:|
|Button_ai|クリックしたらgeminiに質問|
|Button_reset|Labelをきれいにする|
|Label1|geminiからの返答|
|Web1|Geminiへのアクセス|

## ブロック画面
### 変数
#### GeminiへのURL
```
https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=
```
![blocks (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/eb327ec2-02e5-43f9-ac96-3ce96f2570c3.png)

#### APIKey
ご自身キーをいれてください
![blocks.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/cc710c2e-d27f-4b14-812f-282e760bdf94.png)

### when Button_ai .Click
ボタンをクリックしたらgeminiに質問
![blocks (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/0955d0a2-0ac6-480c-964c-6d0e2042223a.png)


**Geminiへの質問文**
```
ファンタジー系の物語に出てくるキャラクターのプロフィールを考えてください．
以下の出力項目をすべて考えてください．
出力項目は次の5項目です．
名前，年齢，種族，特技，詳細
種族には魔法使いや騎士，エルフがいます．
特技には種族に関連したものを上げてください．たとえば職業が魔法使いならば，氷魔法が得意や回復魔法が得意など上げてください．
詳細には物語内でどのような立ち回りをするのか詳細に記述してください．
キャラクターは４人考えてください．
```

**dictionaryの中で，equired，STRING，INTEGERについて**
```json
"required":["特技", "年齢", "種族", "詳細", "名前"]
"$comment": "requiredは必須項目"

"properties": {
    "名前": {
        "type":"STRING"
        "$comment": "テキストで出力してほしいときはSTRING"
    },
    "年齢": {
        "type":"INTEGER",
        "$comment": "整数で出力してほしいときはINTEGER"
        
        "description":"ファンタジーなので人間の常識で考える必要はありません．"
        "$comment": "descriptionは説明"
```


### when Web1. GotText
Geminiからの解答
![blocks (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/ccc761f5-6b8c-4c82-835d-760cf8c637b1.png)


## 実行結果
キャラクターを考えてくれますね
![Screenshot_20250308-235425.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/d2f2d7ce-8648-4623-9889-3f0f78437ebb.png)


## おわりに
整数のみを出力できるのはアプリ開発の幅が格段に広がります！！！他の条件も追加できるか調べたいですね．．．
よく忘れるFinderの使い方 - パスの表示 / 隠しファイルの表示 / 拡張子の表示

## はじめに

macでファイルを扱うための`Fider`の機能で、毎回調べて毎回忘れるものを記事として残しておきます。


### 環境

今回の記事を書いている環境のmacOSは、Sonoma 14.6です。


## パスの表示

Finderのウィンドウ下部に現在開いているフォルダのフルパスを表示するには、以下の手順を実行します。

Finderを開いて、メニューバーの「表示」から「パスバーを表示」を選択すると出てきます。
ショートカットだと `⌥` + `⌘` + `P`で切り替わります。


![スクリーンショット 2025-03-07 23.36.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760224/bc0606e7-8977-4471-8312-028ed63e651d.png)



## 隠しファイルの表示

### ショートカットキーでサクッと切り替え

普段は表示されない隠しファイル/フォルダ。

表示したい時は、ショートカットの`⌘` + `⇧` + `.`(ドット)で切り替わります。

### 隠しファイルの表示／非表示をコマンドで恒久的に切り替える

この記事を書くために調べていて知ったんですが、コマンドで恒久的に切り替える（常に隠しファイルを表示させる）方法もあるようです。

それが↓

```sh:sh
$ defaults write com.apple.finder AppleShowAllFiles -bool true
$ killall Finder
```

本命、というか設定の変更は1行目のコマンドで、2行目は設定の変更を反映させるためにFiderを再起動しているだけですね。

元に戻す（隠しファイルを表示しない設定にする）にはこちら↓

```sh:sh
$ defaults write com.apple.finder AppleShowAllFiles -bool false
$ killall Finder
```

最後のフラグが`false`に変わっているだけですね。


### ちなみにコマンドで設定を変えた後もショートカットは有効

前述のコマンドで隠しファイルを常に表示する設定にした上で、ショートカット（`⌘` + `⇧` + `.`）を試してみると、普通に隠しファイルの表示／非表示は切り替わりました。

なので「恒久的に切り替える」と言うよりは「隠しファイルを表示するかどうかのデフォルト設定を切り替える」と言うほうが正確かもですね。


## 拡張子の表示

Finderのデフォルト設定だと、一部ファイルの拡張子は非表示になっています。
すべてのファイルで拡張子を表示させたい場合は、Finderを開いて、メニューバーの「Finder」から「設定」を開き、「詳細」タブを開きます。

![スクリーンショット 2025-03-09 0.10.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760224/23dbe79c-433d-42cb-9d9b-59fa04422e9f.png)


「すべてのファイル名拡張子を表示」という項目があるので、チェックを入れましょう。
【Mac】ターミナルから現在の外観モードを確認する方法

以下のコマンドを実行するとダークモードになっている場合には"Dark"が返却され、それ以外の場合にはエラーとなります。

```terminal
defaults read -g AppleInterfaceStyle
```

ダークモードの場合

```terminal
$ defaults read -g AppleInterfaceStyle
Dark
```

ダークモードでない場合

```terminal
$ defaults read -g AppleInterfaceStyle
2025-01-25 10:21:27.778 defaults[14319:355652]
The domain/default pair of (kCFPreferencesAnyApplication, AppleInterfaceStyle) does not exist
```
[効率化] 快適なターミナル環境を構築 : tmux

この記事では、開発作業でよく複数のターミナルを同時に扱う場面において、tmux を使うことで1つのターミナルで効率的に作業を管理する方法を紹介します。tmux の基本的な使い方から実践的なカスタマイズまでを解説します。

## はじめに

tmux は「terminal multiplexer」の略で、以下のような機能を提供するツールです：

- 複数のターミナルセッションを 1 つのウィンドウで管理
- SSH 接続が切れても作業状態を保持
- ウィンドウやペインで画面を分割して効率的に作業

## 環境構築

### インストール

各環境に応じて以下のコマンドでインストールできます：

```bash
# Ubuntu/Debian
sudo apt-get install tmux

# macOS
brew install tmux
```

### 基本設定

`~/.tmux.conf`に以下の設定を追加することで、より使いやすい環境になります：

```tmux
# マウス操作を有効化
set-option -g mouse on

# true color対応
set-option -sa terminal-features ',xterm-256color:RGB'

# ステータスラインをカスタマイズ
set-option -g status-interval 1
set -g status-left "#[fg=#eee8d5,bold] Session: #S / "
```

## 基本的な使い方

### セッション管理

よく使うコマンドは以下の通りです：

```bash
# 新規セッション作成
tmux new -s プロジェクト名

# セッションの一時退避
Ctrl+b → d

# セッションに再接続
tmux attach -t プロジェクト名
```

### 画面操作

基本的なキーバインド：

- `Ctrl+b → c`: 新しいウィンドウを作成
- `Ctrl+b → %`: 画面を左右に分割
- `Ctrl+b → "`: 画面を上下に分割
- `Ctrl+b → 矢印キー`: ペイン間を移動

## 実践的なカスタマイズ

### キーバインドの最適化

以下の設定で、より直感的な操作が可能になります：

```tmux
# プレフィックスキーをCtrl+kに変更
set -g prefix C-k
unbind C-b

# ペイン分割を直感的に
bind v split-window -h  # 縦分割
bind s split-window -v  # 横分割
```

### 作業効率を上げる Tips

1. **プロジェクトごとのセッション管理**

   ```bash
   # プロジェクトAの作業開始
   tmux new -s projectA
   ```

2. **定型的な画面レイアウトの作成**
   ```tmux
   # レイアウトを保存
   bind S command-prompt -p "保存名:" "run-shell 'tmux save-layout %1'"
   ```

## トラブルシューティング

### よくある問題と解決方法

1. **セッションが作成できない**

   - 既存のセッション確認: `tmux ls`
   - プロセス確認: `ps aux | grep tmux`

2. **キーバインドが効かない**
   - 設定の再読み込み: `tmux source-file ~/.tmux.conf`
   - キーバインドの確認: `tmux list-keys`

## まとめ

tmux を使いこなすことで、以下のような利点が得られます：

- 複数の作業を効率的に管理
- SSH 接続での作業が安定化
- カスタマイズによる作業効率の向上

ぜひ、自分の開発スタイルに合わせてカスタマイズしながら使ってみてください。

## 参考

- [tmux 公式ドキュメント](https://github.com/tmux/tmux/wiki)
- [tmux cheatsheet](https://tmuxcheatsheet.com/)

**Happy Hacking!**
Astroテンプレートの作り方と公開方法

## Astroとは？
簡単に言うと、Astroはウェブサイトを素早く簡単に作れるツールで、特にコンテンツが多いサイトに最適です。

Astroの使い方は簡単。各ページのファイルを用意し、Markdown（HTMLの簡単なバージョン）やHTMLライクな構文で内容を書きます。インタラクティブな部分、例えばボタンを作りたい場合は、ReactやSvelte、Vueなどのフレームワークを使えます。コンテンツとコードが完成したら、コマンドを実行してサイトをビルドするだけ。HTMLファイルなのでサーバーにアップロードすればすぐに公開できます。

### AstroとGatsbyの違い
Gatsbyというツールも聞いたことがあるかもしれません。AstroとGatsbyはどちらもウェブサイトを作るツールですが、いくつかの違いがあります。

- AstroはデフォルトでJavaScriptを最小限にし、Gatsbyに比べてサイトの読み込みが速い
- AstroはReact、Svelteなど複数のライブラリを使えるがGatsbyはReact依存
- AstroはReactを知らなくても始められるが、GatsbyはReactとGraphQLの知識が必須

### Astroを選ぶメリット
他のツールと比べて、Astroを選ぶ理由は以下の通りです。

- 高速性能: サイトの読み込みが速い
- 学習コストが低い: 比較的簡単で初心者にもおすすめ
- 柔軟性: 必要なライブラリを使えるので、用途に合わせて最適化できます
- 将来性: 最新のウェブ技術で作られているので、将来も役立ちます

要はAstroは速くて簡単で柔軟性があるため、特にコンテンツ重視のサイトを作るのに選ばれます。ブログやポートフォリオを作りたい人にもおすすめです。


## Astroテンプレートの作り方
まずはスターターテンプレートをインストールしてAstroの環境を構築します。
```
npm create astro@latest
```
このコマンド実行後、対話形式でプロジェクト設定を行います。テンプレート作成目的で、「Empty Project」を選択し、TypeScriptのstrictモードを有効にするのが推奨です。

### テンプレートディレクトリ構造
Astroの基本的なテンプレートは、特定のフォルダ構成を持っています。主に以下のようになります。
```
src/
├── components/
├── layouts/
├── pages/
├── styles/
├── env.d.ts
astro.config.mjs
package.json
```

pagesディレクトリは必須で、ここに配置された.astroファイルが直接ルーティングされます。例えばpages/about/index.astroは/aboutパスでアクセス可能です

### コアコンポーネントの作成
ヘッダーやフッターなどの共通部品はcomponentsディレクトリに配置します。

基本のヘッダーコンポーネント例：
```
---
// src/components/Header.astro
const { title } = Astro.props
---

<header class="header">
  <h1>{title}</h1>
  <nav>
    <a href="/">Home</a>
    <a href="/about">About</a>
  </nav>
</header>

```
このコンポーネントは他のページからインポートして使用できます

### テンプレート作成に必要な要素
公開用テンプレートに含めるべき最低限のファイルはこちら。

package.json：依存関係とスクリプト定義
astro.config.mjs：ビルド設定
README.md：使用方法とドキュメント
src/pages/：ベースページ
src/layouts/：共通レイアウト

astro.config.mjsではテンプレートの基本設定を定義します。
```
export default defineConfig({
  output: 'static',
  integrations: [react(), tailwind()]
});
```

### GitHubへのテンプレート公開
新しいリポジトリを作成してテンプレートファイルをプッシュします。

ここは通常のGithubと使い方は同じです。

### 公開済みテンプレートの利用方法
テンプレートの利用は公式テンプレートと同様Githubからインストールできます。
```
npm create astro@latest -- --template yourgithub/your-template-repo
```

また、手動でクローンして使うこともできます。
```
git clone https://github.com/yourusername/yourtemplate
cd yourtemplate
npm install
npm run dev
```

### テンプレートをコミュニティに公開
公式テーマページからテンプレートを登録することができます。
https://astro.build/themes/

Githubにログインして「Submit theme」から登録作業を行います。


## Astroで使えるテンプレートとコンポーネント一覧
公式テーマはこちら
- https://astro.build/themes/

公式コンポーネントはこちら
- https://astro.build/integrations/

## まとめ
今回は最低限の構成で作る方法を解説しましたが、実際にはデザインの追加、再利用できるコンポーネントの追加、Tailwindを入れたりSEO対策やGTMを入れたりと言った作業も行います。素晴らしいテンプレートが完成したらぜひコミュニティに登録してみてください。
AWSリージョン封鎖するときはSecurityHubにも気をつけよう

リージョン封鎖したのに料金がかかっている
リソースは全部削除しているつもりだがSecurityHubが..

というときはSecurityHubの消し忘れなので
リージョン封鎖は一旦解除してSecurityHubも消しましょう
ダイソーセンサーライトをUSB化改造してはんだづけ体験

乾電池式のセンサーライトをUSB電源に改造します。安く簡単に行えるはんだづけ体験です。

![IMG_20250308_223837.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/e602a526-e6c8-4c39-be68-13cfe627f02f.jpeg)


ダイソーの￥330センサーライトです。
![IMG_20250308_195934.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/1ecdaff0-97af-4213-b288-ce22a06484be.jpeg)

磁石付き、スイッチなども割としっかりしていて使いやすそうです。

![IMG_20250308_210251.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/1d5e119d-9d57-4c3f-bdcb-5c78a60a163a.jpeg)

カッターの歯を入れて、散光カバーを取り外します。スイッチのついてない方の端です。

![IMG_20250308_210642.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/71e7c00c-d89c-4f18-beda-fc483c98bd22.jpeg)


ネジを2つ外してから、この位置の電極をはんだごてをあてて取り外します。

![IMG_20250308_210940.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/198daaa8-c728-4959-ac47-c3c97b9d5931.jpeg)

反対側ははんだを当てなくても取り外しができます。この電極は折ってしまいましょう。
![IMG_20250308_211041.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/27312b88-fe0b-4f41-abac-f7fc62586dc3.jpeg)

適当なUSBケーブルを使いやすい長さでカット。
![IMG_20250308_211241.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/fd718ff1-f506-4eb5-bccf-8a3d25e86d29.jpeg)

USBケーブルは、通常は赤緑白黒の配線ですが、そうではないものも多いです。上のケーブルは黒の代わりに太い白、下のケーブルは黒の代わりに銀のシールド線になっています。
![IMG_20250308_211758.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/83b32a00-36dd-4ab6-a432-5a4aa6797b79.jpeg)

信号に使っている緑と白の線は切ってしまいます。赤と黒の線(写真では赤と太い白の線)を残しておきます。
![IMG_20250308_211813.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/087bd1e4-2394-49a9-bc4f-ccadbba27bc3.jpeg)

この位置にはんだづけ。
![IMG_20250308_212123.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/1b06314a-c48b-4349-87a3-b2827e4c7087.jpeg)

組み立てて完成です。
![IMG_20250308_223837.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/e602a526-e6c8-4c39-be68-13cfe627f02f.jpeg)
ダイソーテープLEDを人感センサ対応に改造してはんだづけ体験

ダイソーのテープLEDを人感センサを合体させるはんだづけ工作です。

![IMG_20250308_223949.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/1954fbfb-8d8e-40d7-ba22-ec343639e075.jpeg)

長いのが￥550,短いのが￥330です。短い方をお勧めします。

![IMG_20250308_195959.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/f379d11b-b463-4218-9f7d-c8bab5cbbd71.jpeg)


人感センサは秋月電子で6個で￥400で投げ売りしていた人感センサユニットです。これは乾電池式。

![IMG_20250308_195654.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/17db1941-4041-4039-b825-29a75771a0a5.jpeg)

# 改造

まずダイソーのテープを観察。150Ωの電流制限抵抗がLEDごとについている構造ぽいです。

![IMG_20250308_204218.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/b145519a-7792-41d0-b1bc-8906805c3615.jpeg)

ケーブルをカットして導線をむき出しにしておきます。
![IMG_20250308_204423.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/796c0617-40b5-4de1-a862-46c81e1961b4.jpeg)

人感センサモジュール。
![IMG_20250308_204605.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/8e2be60a-cca9-4fb2-9edd-1a2c3cd38e92.jpeg)

裏蓋を開けて電池金具を取り外し、ケーブルも切ってしまいます。
![IMG_20250308_204651.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/654dba44-2b02-4ffe-9371-c98c70afec30.jpeg)

この場所の爪を押すと
![IMG_20250308_204742.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/c2e2a7ab-3c3c-4b31-9fce-a020e6c4fccb.jpeg)

表側から基板が外せるようになります。
![IMG_20250308_204819.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/6614b63d-c774-44a4-bf9b-8f1a3cdbc83d.jpeg)

先程のLEDテープのメーブルをはんだづけします。手前の白い線はLEDをに向かいます。USBコネクタからの白い線は黒い線にはんだづけします。赤い線は3つをはんだづけして接続。はんだづけしたら絶縁しておきます。

![IMG_20250308_205826.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/71788932-b4cd-4f9e-8333-92f37f05affa.jpeg)

うまく収めて完成！

![IMG_20250308_223949.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/1954fbfb-8d8e-40d7-ba22-ec343639e075.jpeg)

人感センサを経由するとちょっと暗くなってしまいます。
腕に覚えのかる方は基板上のトランジスタをよりよいものに変更すると性能がUPします。
LLMは日本語の文字数カウントが苦手

# LLMは文字数のカウントが苦手なのか
以下のプロンプトを実行して確認してみます。

## 検証用プロンプト
```
ひらがな、もしくはカタカナで3文字の果物教えて
```

## GPT-4o
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479797/c83e4cc1-fd9a-41dd-a474-06d2838de345.png)
「もも」と「なし」は2文字ですね。

## Claude 3.7
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479797/90e8497d-18ba-4b35-a2d5-f258446bafbb.png)
Claude 3.7でも同様の誤りをしています。

## o1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479797/3d1dc5e9-d037-4ee5-953e-652482ba5bc8.png)
推論モデルであるo1は正しい回答をしてくれました。

## Claude 3.7 (Extended)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479797/68e8a24f-2e54-4045-b074-3cac0e33cb31.png)
Claude 3.7 もExtendedモードにしたところ、正しい回答をしてくれました。

# なぜこのような誤りが起きるのか
o1に聞いてみました。

## 間違える理由
一般的に、ChatGPTなどの大規模言語モデルは「文字数を正確に数える」という処理を内部で厳密に行っているわけではなく、あくまで膨大なテキストパターンを元に次に続く単語や文を生成しているため、「ひらがな／カタカナで何文字か」を厳密に判断するのが苦手です。
その結果、**「もも」「いちご」「なし」**のように2文字のものまで「3文字の果物です」と誤って挙げてしまうことがあります。

## 間違えた理由の細分化

### 1. 訓練データに基づくパターン生成
GPTは質問を受けてから文脈に合う単語を統計的に選んで文章を生成しますが、実際に「〇文字かどうか」をプログラム的にチェックしているわけではありません。
そのため、果物名の中で「3文字」という条件を満たしているかどうかを厳密に検証しないまま、会話コーパス等から得た知識を踏まえた“可能性の高い単語”を列挙してしまいます。

### 2. 文字数カウントと内部トークン化のズレ
GPTの内部では、単語や文が「トークン」と呼ばれる単位で分割されています。
日本語ではひらがなやカタカナがどのようにトークン化されるかは複雑で、実際の文字数とトークン数が必ずしも一致しません。
そのため「文字数を数える」というタスクが苦手になりがちです。

### 3. 誤った文字数認識
特に日本語の文字数は、ローマ字変換時の母音・子音の個数や、発音単位（モーラ数）などとは一致しません。「いちご」は3文字、「もも」「なし」は2文字と数えるべきですが、「読み」の長さや他言語での表記などと混同し、誤って3文字扱いしてしまうケースがあります。

このように、GPT系モデルは「文字数カウント」などの形式的・機械的なチェックを得意とせず、むしろ曖昧なパターン認識に基づいて出力するため、厳密な文字数判定が絡むタスクにおいて誤りを生じやすいのが原因です。

## まとめ
LLMは、日本語の文字数カウントが苦手であることが分かりました。
文字数を厳密に制御しなければならない場合は、ルールベースの処理と組み合わせて使用する必要がありそうです。
AtCoderをPythonで取り組んだ振り返り(ABC396)

どうもこんにちは！

今週もAtCoderのコンテストに参加できたので記録がてら振り返ります。
参加3回目にしてようやくCまで完答できました！Dはちょっと考えましたが厳しいと判断して途中で断念。

# 問題
問題は以下のリンクから。取り組めたA~Cまでを振り返ります。

https://atcoder.jp/contests/abc396/tasks

# A - Triple Four -
与えられた長さNの整数列の中に同じ要素が3個連続する箇所の有無を判定する問題。数列を1つずつたどって2つ先まで同じかを確認すればよいですね。
~~~Python
n = int(input())
s = list(map(int,input().split()))

for i in range(len(s)-2):
  if s[i] == s[i+1] and s[i+1] == s[i+2]:
    print("Yes")
    break
  elif i == len(s)-3:
    print("No")
~~~

# B - Card Pile -
0が書かれた100枚のカードの山があり、入力として以下のいずれかの処理をする指示をQ個与えられたとき、処理後に抜きとられたカードの整数を出力するという問題。
　・整数xが書かれたカード1枚を山の一番上に積む。
　・カードの山から1番上のカードを抜き取り、そのカードに書かれている整数を出力する。(この問題では山にカードが無い状態でさらに引くことはないとする)
特に制約が厳しいということも無さそうなので、シンプルに要素100個の配列を作って、順番に処理していくかたちにしました。
~~~Python
q = int(input())
s = [0] * 100

for i in range(q):
  tmp = list(map(int,input().split()))
  if tmp[0] == 1:
    s.insert(0,tmp[1])
  else:
    print(s.pop(0))
~~~

# C - Buy Balls -
N個の黒色のボールとM個の白色のボール、それらのボール1個1個に与えられた価値が入力として与えられ、黒色のボールの数が白色のボールの個数以上になるように合計0個以上選ぶとき、選んだボールの価値の総和としてありうる最大値を出力するという問題。ボールの価値はプラスもあればマイナスもあります。
ボールの数は黒白それぞれで1から$2×10^5$個、ボールの価値の範囲は$-10^9$から$10^9$ということで、時間制限の考慮も必要そうな問題ですね。
黒のボールはとりたいだけとれるので、価値が最大となるようにボールをピックする場合分けは以下。
　・プラスの価値を持つボールの数は黒が白より多いまたは同数　→　すべてのプラスのボールの価値の合計が最大値
　・プラスの価値を持つボールの数が白の方が黒より多い　→　黒のプラスの価値のボールの数だけ白もとる、残ったボールから、マイナスの価値を持つ黒ボールとプラスの価値を持つ白ボールの合計がプラスになる数だけ追加でとる。例えば、残ったボールが黒は-1,白は3なら両方とると差し引き+2なのでとるということですね。
~~~Python
n,m = map(int,input().split())

# 黒ボールの価値と白ボールをそれぞれ配列に入れて価値の高い順にソート
b = [int(x) for x in input().split()]
w = [int(x) for x in input().split()]
b.sort(reverse=True)
w.sort(reverse=True)

# ピックするボールの最後の位置を記録する
b_count = 0
w_count = 0

# 黒白ともに、正の価値を持つボールをいったん全部ピック
# 黒ボールの数が白ボール以上であれば、この結果が最大価値
for i in b:
  if i >= 0:
    b_count += 1
for i in w:
  if i >= 0:
    w_count += 1
if b_count < w_count: # 白ボールの方が多い場合、いったん黒ボールの数にあわせる
  w_count = b_count

# 黒ボールの価値(マイナス) + 白ボールの価値(プラス)がプラスであれば、ピックするとして追加
while True:
  if b_count == len(b) or w_count == len(w):
    break
  if b[b_count] + w[w_count] >= 0:
    b_count += 1
    w_count += 1
  else:
    break

# ピックしたボールの価値の合計を出力
print(sum(b[:b_count]) + sum(w[:w_count]))
~~~

# おわりに
1回目の振り返りで3月中に4問完答をめざすというところで、1つステップを進めたのはよかったと思います。3月中のコンテストはあと3回、引き続き取り組んでいきたいと思います。

ではでは。