OmniAICreator/Qiita-1.07M huggingface dataset:
ABC402の記録


# はじめに
今回は不参加でした。あとから解いた。

https://atcoder.jp/contests/abc402

成績：不参加

# A
pythonには大文字かどうかを判断する関数があるのでそれを使う。
```python:A
s = input()
ans = []
for i in range(len(s)):
    if s[i].isupper():
        ans.append(s[i])
print("".join(ans))
```


# B
queueを使えばappendとpopleftで言われた通り対応可能。
```python:B
from collections import deque
q = int(input())
row = deque([])
for _ in range(q):
    query = input()
    if query[0] == '1':
        row.append(int(query[1:]))
    else:
        v = row.popleft()
        print(v)
```


# C
食材ごとにどの料理に使われているかをまとめておく。
最終日にはどの料理も食べられるので、その状態から一日ずつ食材を禁止していき、食べられなくなった料理をsetに入れていく。
で、mからその時点でのsetの要素数を引いた値を毎回出力する。
Kの合計が3x10^5以下なのでまあ間に合うという計算。

```python:C
sys.stdin = io.StringIO(_INPUT)
#実際の提出はこの下
n,m = map(int,input().split())
#まず各料理に使われる食材の数と種類をまとめておく
dish = []
for _ in range(m):
    dish.append(list(map(int,input().split())))
#print(dish)

#次に食材ごとに使われている料理をまとめる
source = [[] for _ in range(n)]
for i in range(m):
    for j in range(dish[i][0]):
        source[dish[i][j+1]-1].append(i+1)
#print(source)

#最終日には全部食えるのでそこからさかのぼって減らしていく
eat = list(map(int,input().split()))
eat = eat[::-1]
noteat = set()
ans = [m]
for i in range(n-1):
    for j in source[eat[i]-1]:
        noteat.add(j)
    ans.append(m-len(noteat))
for a in ans[::-1]:
    print(a)
```


# D
並行にならない限り交わるが、ほとんどの直線は交わるのでm(m-1)/2から交わるものを引くと考える。で、平行になるものは(A+B)%nが等しくなるらしい。どういう原理かはわからないが……
```python:D
n,m = map(int,input().split())
lines = [0 for _ in range(n)]
for _ in range(m):
    a,b = map(int,input().split())
    lines[(a+b)%n] += 1
ans = m * (m - 1) // 2
for i in range(n):
    if lines[i] >= 2:
        ans -= lines[i] * (lines[i] - 1) // 2
print(ans)
```
D問題が考察系だったので実際に参加していたらこれを解けたかどうかは怪しいところ……Cもやや難しいやり方をしてしまった気がする。
AtCoder ABC403 振り返り(緑コーダーがPythonでABC問題)

## AtCoder Beginner Contest 403 を振り返ります

[AtCoder Beginner Contest 403（Promotion of AtCoder Career Design DAY） - AtCoder](https://atcoder.jp/contests/abc403)

前回に引き続き、今回もunratedで参加。用事があったため開始時間に間に合わず、2−3分ほど遅れて着手しております。

結果は、C問題までの3問にACでした。最近D問題が解けてないので、ちょっと厳しいですね...。

## [A - Odd Position Sum](https://atcoder.jp/contests/abc403/tasks/abc403_a)

奇数番目の文字のみを足していきます。配列のindexでは[0,2,4...] を足していけばよいです。

``` python
N = int(input())
A = list(map(int, input().split()))

answer = 0
for i in range(0, N, 2):
    answer += A[i]
print(answer)
```

## [B - Four Hidden](https://atcoder.jp/contests/abc403/tasks/abc403_b)

比較する文字数の条件が厳しくないので、全探索で求めます。

比較の条件のところがちょっと難しいですが、以下の2つの条件をチェックすればよいです。

* T[x] が "?" であれば、S[y]は何でもok
* T[x] が "?" でないなら、T[x] == S[y] ならOK

``` python
T = list(input())
U = list(input())

diff = len(T) - len(U) # 文字数の差

# 比較の開始地点をiとする
for i in range(diff + 1):
    is_ok = True

    for j in range(len(U)):        
        # "?" だった場合はok
        if T[i + j] == "?":
            continue

        # T, J が一致すればok
        if T[i + j] == U[j]:
            continue

        is_ok = False

    # 一致する文字列が存在
    if is_ok:
        print("Yes")
        exit()

print("No")
```

## [C - 403 Forbidden](https://atcoder.jp/contests/abc403/tasks/abc403_c)

以下の2つのデータ構造を作って解きました。

* all_access_set: 全てのページにアクセスできるユーザーのset
* access[Y]: ページ Y にアクセスできるユーザーのset

----

ユーザーX が ページY にアクセスできるかを判定するには、以下のどちらかに当てはまれば良いことになります。

* all_access_set の中に ユーザーXがいる
* access[Y] のなかに ユーザーXがいる


``` python
N, M, Q = map(int, input().split())

all_access_set = set()
access = defaultdict(set)

for i in range(Q):
    query = list(map(int, input().split()))

    if query[0] == 1:
        # ページYにアクセスできるユーザーに、Xを追加
        X = query[1]
        Y = query[2]
        access[Y].add(X)
    elif query[0] == 2:
        # all_accessにユーザーXを追加
        X = query[1]
        all_access_set.add(X)
    else:
        # ユーザーX が all_access_set or access[Y] にいるか？
        X = query[1]
        Y = query[2]
        if X in all_access_set:
            print("Yes")
            continue
        if X in access[Y]:
            print("Yes")
            continue
        print("No")
```
Google Analytics Data APIにてデータを取得する際、実はレスポンス行数制限があった

# 背景
Google Analytics Data APIのガイドを眺めていたら、今まで知らなかったことを知った。
知らずのうちにデータの欠損が起こってしまうこともあるため、重要な点だと感じた
知っている方が多いかもしれないが、意識していない人も多いと思うため共有する。

# 結論
デフォルトではレスポンス行数は`10000`行までとされている。
limitの指定を行うことで最大`250000`行までは増やすことが出来る。
しかし、limitにて指定した行数以上のレスポンス行数がある場合、**超えた行数分のデータは返されない**
➡limitにて指定する`250000`行以上のデータを取得するには、リクエストを分ける必要がある。

Google公式のガイドは以下

https://developers.google.com/analytics/devguides/reporting/data/v1/basics?hl=ja#pagination

# 手順

## レスポンスの最大行数を`250000`行に増やす

以下のように、リクエストのlimitの項目に`250000`を設定するだけでよい
```
POST https://analyticsdata.googleapis.com/v1beta/properties/GA_PROPERTY_ID:runReport
  {
    ...
    "limit": 250000,
    "offset": 0
  }
```
## 250000行以上のレスポンスを取得する

リクエストを分ける必要がある。
offsetにて取得するデータの開始行を指定できる。
一回目のリクエストでは最初から取得するので0をセットする。
249999行までは一回目のリクエストで取得できた。
250000行目以降は二回目のリクエストで取得する。開始行は250000なのでoffsetに250000をセットする。

### 一回目
```
https://analyticsdata.googleapis.com/v1beta/properties/GA_PROPERTY_ID:runReport
  {
    ...
    "limit": 250000,
    "offset": 0
  }
```
### 二回目
```
https://analyticsdata.googleapis.com/v1beta/properties/GA_PROPERTY_ID:runReport
  {
    ...
    "limit": 250000,
    "offset": 250000
  }
```

# 今後の展望やメモ

API経由でデータを取得する際は、**レスポンスの行数を確認**する処理を追加する必要がありそう
なぜなら、考慮しないと知らないうちに全てのデータが取得できていないということが起こりうるから

また、Google公式のガイドを読んでいると、複数期間を一度にリクエストすることが出来ることも知った。使うことがあるかもしれないので頭に入れておきたい。
【C# 12】∞の真相を探る旅に出た話

# はじめに

ある日、画面に「∞が表示されている。」との報告を受けました。  
この不可解な事象の真相を求め、旅に出ました。

# 動作確認環境

- Windows 10 22H2
- Visual Studio 2022
- .NET 8.0
- C# 12.0
- PHP 8.1

# 無限が入るパターンについて

以下のコードでは、値が無限になります。

```csharp
// hogeは、∞になる。
double hoge = 1.0 / 0.0;
```

このコードでは、1.0を0.0で割ることにより、`hoge`には無限大（∞）が代入されます。  

# 無限が入る原因

`double`型は、IEEE 754の仕様を実装しているためです。  
IEEE 754では、0で割ると無限になると定められています。

# 無限の他にも…

IEEE 754では、NaN（Not a Number）という値も存在します。  
これは、以下のようなパターンで発生します。

```csharp
// hogeは、NaNになる。
double hoge = 0.0 / 0.0;
```

細かいことを言えば、-0や-∞も存在します。

# 他の型に変換してしまうと...

例えば、int型にキャストすると、`int.MinValue`の値が返ってきます。

``` C#
// hogeは、∞になる。
double hoge = 1.0 / 0.0;
// fugaは、-2147483648になる。
int fuga = (int)hoge;
```
# IEEE 754を実装した愉快な仲間たち

IEEE 754を実装した型の一覧を以下に示します。  
私が主に使用するC#、VB.NET、F#の言語における対応を記載しています。

| C#     | VB.NET | F#      |
|--------|--------|---------|
| double | Double | float   |
| float  | Single | float32 |
| NFloat | NFloat | NFloat  |
| Half   | Half   | Half    |

これらの型は、IEEE 754の仕様に従って、無限やNaNの取り扱いを行います。

# 余談

PHPでは、どのような挙動になるのか実験してみました。

```php
# DivisionByZeroErrorが発生する。
$hoge = 1.0 / 0.0;
```

PHPでは、0で割ると`DivisionByZeroError`が発生します。  
しかし、関数を使って割り算を行うと、無限（INF）を得ることができます。

```php
# 無限(INF)になる。
$hoge = fdiv(1.0, 0.0);
```

# さいごに

長くもない旅から帰ってきました。  
こうした仕様を覚えておくことも大事だと実感しました。  
ユーザに入力させる部分では、バリデーションや入力値制限をより一層しっかり行いたいと思います。

# 参考文献

https://ja.wikipedia.org/wiki/IEEE_754

https://learn.microsoft.com/ja-jp/dotnet/api/system.single?view=net-8.0

https://learn.microsoft.com/ja-jp/dotnet/api/system.double?view=net-8.0

https://learn.microsoft.com/ja-jp/dotnet/api/system.runtime.interopservices.nfloat?view=net-8.0

https://learn.microsoft.com/ja-jp/dotnet/api/system.half?view=net-8.0

https://learn.microsoft.com/ja-jp/dotnet/api/system.int32.minvalue?view=net-8.0#system-int32-minvalue

https://yujisoftware.hatenablog.com/entry/20170313/1489423151

http://fsharpintro.net/primitiveTypes.html

https://www.php.net/manual/ja/function.fdiv.php
図書館プログラマにはなれなかったが

図書データベースの移行でDBの移行で難儀していたところがあった。担当ではなかったが、困っているようなのでゴルラムを書いたことがある。

OracleのDBから、PC用図書館システムへの移行だった。

佐賀図書館探訪
https://researchmap.jp/blogs/blog_entries/view/87854/62cce4e64831da5d50aaaf3f2274e921?frame_id=391292

佐賀図書館探訪

伊万里市民図書館
開館時間　10:00 ～ 18:00
６．伊万里駅（バスセンター）から図書館まで
■徒歩　　　　　 約２０分
■車（タクシー）　約５分

武雄市図書館
朝9：00～夜9：00まで／365日年中無休
JR佐世保線武雄温泉駅から徒歩15分
祐徳バス　図書館前
JR九州バス　ゆめタウン

佐賀市立図書館
水～土曜日　10:00～17:00
●徒歩　JR佐賀駅から徒歩１５分
●バス　どんどんどんの森前バス停下車

佐賀県立図書館
午前9時～午後8時
ＪＲ佐賀駅から、1．6㎞（徒歩20分）
タクシーで約7分

佐賀大学図書館
11/1（土） 
本  館 10:00-19:00
医学分館 10:30-18:30

JR佐賀駅からバスで約20分
4番のりば から市営バス
「4番 佐賀女子短大・高校線」「11番 佐賀大学･西与賀行」「12番 佐賀大学･東与賀行」「63番 佐賀女子短大・高校線」のいずれかで「佐大前」バス停下車料金 200円（2014年10月現在）→ 佐賀駅バスセンター 乗場案内
JR佐賀駅からタクシーで約15分

### 案１
07:43発小倉(福岡県) ↓970円　17分67.2km　[新幹線]こだま857号
08:00着
08:14発博多(福岡県)2410円820円42分53.6km[特急]かもめ101号
08:56着佐賀(佐賀県)
（73分）佐賀県図書館が９時から。次に佐賀大図書館へ寄ってから佐賀市図書館
141分
11:17発佐賀(佐賀県) 560円620円  24分28.3km [特急]みどり7号
11:41着武雄温泉(佐賀県)
(24分)
(その次だと12:16発佐賀(佐賀県) 560円620円 24分28.3km [特急]みどり9号 12:40着武雄温泉(佐賀県))
120分
13:41発武雄温泉(佐賀県) 280円300円  14分14.5km [特急]みどり11号
13:55着
14:00発有田(佐賀県) 420円 24分13.0km [普通]松浦鉄道西九州線
14:24着伊万里(佐賀県)
(43分)
158分
17:02発伊万里(佐賀県) 420円 26分13.0km [普通]松浦鉄道西九州線
17:28着
17:46発有田(佐賀県)↓ 37分28.2km [普通]ＪＲ佐世保線
18:23着
18:26発肥前山口(佐賀県) ↓820円 48分68.2km [特急]かもめ38号
19:14着
19:29発博多(福岡県) 3180円970円 16分67.2km [新幹線]のぞみ96号
19:45着小倉(福岡県)
(163分)

### 案2
08:04発小倉(福岡県) ↓970円17分67.2km[新幹線]こだま823号
08:21着
08:34発博多(福岡県)2750円930円66分81.9km[特急]みどり3号
09:40着武雄温泉(佐賀県)
121分
11:41発武雄温泉(佐賀県) 280円300円14分14.5km[特急]みどり7号
11:55着
12:14発有田(佐賀県)420円23分13.0km[普通]松浦鉄道西九州線
12:37着伊万里(佐賀県)
147分
15:04発伊万里(佐賀県) 420円26分13.0km[普通]松浦鉄道西九州線
15:30着
15:45発有田(佐賀県)↓36分28.2km[普通]ＪＲ佐世保線
16:21着
16:26発肥前山口(佐賀県)840円300円8分14.6km[特急]かもめ30号
16:34着佐賀(佐賀県)
122分　佐賀市図書館に10分しかいられない。佐賀県図書館、佐賀大図書館は大丈夫。
18:36発佐賀(佐賀県) ↓820円38分53.6km[特急]かもめ38号
19:14着
19:29発博多(福岡県)2410円970円16分67.2km[新幹線]のぞみ96号
19:45着小倉(福岡県)
mixed-contentの対処

### はじめに
WordPressサイトをHTTPS化するときに、ページ内の画像だけHTTPで参照されてしまい、ブラウザのコンソールに「Mixed Content: The page at '...' was loaded over HTTPS, but requested an insecure resource '...'」と表示される現象が起こります。本記事では、WordPress側とCloudFront（CDN）側の設定によってMixed Contentを解消し、画像を正常に表示させる方法を解説します。

### 環境
- WordPress
- AWS EC2 + CloudFront

### 問題
1. SSL証明書は正常に適用され、URLは`https://example.com`としてHTTPSでアクセス可能
2. 投稿や固定ページのHTMLソースでは画像URLが`http://`のまま生成される
3. ブラウザのDeveloper Consoleに以下のようなエラーが表示され、画像が読み込まれない
   ```
   Mixed Content: The page at 'https://example.com' was loaded over HTTPS, but requested an insecure resource 'http://example.com/image/foo.jpg'. This request has been blocked; the content must be served over HTTPS.
   ```

### 原因
- WordPressの設定（`WP_HOME`/`WP_SITEURL`など）がHTTPのままか、内部的に`$_SERVER['HTTPS']`を認識できずHTTPSを強制できていない
- CloudFront経由でのリクエスト時にHostヘッダーやプロトコル情報がオリジン（WordPress）に伝わらず、WPがHTTPとして扱っている

### 対策
#### 1. `wp-config.php` でHTTPS強制設定
WordPressが実際にHTTPSでアクセスされていることを認識できるよう、以下を `wp-config.php` に追加します。

```php
$_SERVER['HTTPS'] = 'on';
// 管理画面もHTTPSに強制
define('FORCE_SSL_ADMIN', true);

// サイトURLをHTTPSに固定
define('WP_HOME', 'https://example.com');
define('WP_SITEURL', 'https://example.com');
```

- `HTTP_X_FORWARDED_PROTO` はCloudFrontやALBなどのリバースプロキシから送信されるプロトコル情報を拾うためのヘッダーです。
- これにより、WordPress内部でHTTPSを認識し、投稿URLやメディアURLも`https://`となります。

#### 2. CloudFrontの設定確認
CloudFrontで配信するとき、オリジンリクエストポリシーでプロトコルヘッダーを渡す設定を行います。

1. **Behaviors** で該当ビヘイビアを選択
2. **Origin request policy** を `AllViewer` もしくはカスタムで **`Header: X-Forwarded-Proto`** を含めるポリシーを選択
3. **Viewer protocol policy** を `Redirect HTTP to HTTPS` もしくは `HTTPS Only` に設定

これにより、CloudFront→WordPressへプロトコル情報が正しく伝わり、WordPressがHTTPSリクエストとして処理します。

#### 3. キャッシュの無効化
設定変更後はCloudFrontキャッシュが残っていると反映されないため、Invalidationを実行します。

1.該当ディストリビューションを選択
2.キャッシュの削除を選択
3.削除したいパスを入力し、実行

### まとめ
- WordPress側では `$_SERVER['HTTPS']='on'` と `FORCE_SSL_ADMIN`、`WP_HOME/WP_SITEURL` をHTTPS化
- CloudFront側では `X-Forwarded-Proto` をオリジンへ転送し、HTTPS Onlyへリダイレクト
- キャッシュをInvalidationして設定を即時反映

これらを組み合わせることで、Mixed Contentエラーを解消し、画像を含むすべてのコンテンツをHTTPSで安全に配信できます。
PHPからGemini APIを使う

## はじめに
エンジニア兼プログラミング講師をしているmei_13と申します。
運用しているホームページにてPHPでGemini APIを使うことがあったので、関数化して使いやすくしました。
(**prompt.json**が生成されるので注意!!)
ご利用は自己責任でお願いします。また、例外処理はご自身で付け加えてご利用ください。

## コード
```PHP  
function ReplyGemini($prompt, $gemini_api_key){
    $prompt_json = []; 
    $prompt_json["contents"]["parts"]["text"] = $prompt;
  
    $prompt_json = json_encode($prompt_json, JSON_PRETTY_PRINT);
 
    file_put_contents("prompt.json", $prompt_json);
 
    $curl_script = <<<EOM
    curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent" \
    -H 'x-goog-api-key: $gemini_api_key' \
    -H 'Content-Type: application/json' \
    -X POST \
    -d@prompt.json \
EOM;
 
    exec($curl_script, $output, $ret);
 
    $output = implode("\n", $output);
 
    $json = json_decode($output, true);
    $text = $json["candidates"][0]["content"]["parts"][0]["text"];
 
    return($text);
}

$GEMINI_API_KEY = "YOUR API KEY";
$prompt = "こんにちは";
$rep = ReplyGemini($prompt, $GEMINI_API_KEY);
```

## おわりに
Gemini APIは無料枠も大きく、他の生成AIに比べてとっつきやすいと思います。
最初に生成AIのAPIを使ってみようと思う方はおすすめです。

生成AIを活用しているホームページも増えてきましたね。
機会があれば私が運用しているホームページもご紹介したいと思います。
進捗管理はリーダーだけの仕事じゃない   トップダウンとボトムアップで回す“二層管理”のススメ

# 進捗管理はリーダーだけの仕事じゃない  
――トップダウンとボトムアップで回す“二層管理”のススメ――

## はじめに
> 「進捗管理 = リーダーの仕事」と思われがち。でも実際には**リーダーとメンバー双方の責任**で成り立つものだ。  
> 本記事では、リーダーとメンバーがそれぞれ担うべき役割を整理し、トップダウンとボトムアップの両面から進捗を“挟み撃ち”する方法を紹介する。

---

## よくある誤解：進捗管理＝リーダー専任説
| 誤解 | 実態 |
|------|------|
| リーダーが細かく状況を把握し、遅れがあれば指示を出せばよい | **リーダーは全体把握が限界**。メンバーのタスク状況はメンバー自身が最も詳しい |
| メンバーはリーダーに報告さえしていればOK | 報告だけでは“遅れの芽”を潰せない。**日々のセルフマネジメントが必須** |

---

## 役割分担：リーダー vs メンバー

### リーダーが担うこと（トップダウン）
1. **全体スケジュール設計**  
   - マイルストーン設定・依存関係の明示
2. **プロジェクト可視化**  
   - ガントチャート、カンバン、バーンダウン等で進捗を“誰でも見える化”
3. **リスク／課題の収束**  
   - “赤信号”を検知したら即座にリソース調整・意思決定
4. **報連相の流れづくり**  
   - 報告フォーマットや定例ミーティングの設計

### メンバーが担うこと（ボトムアップ）
1. **自タスクの進捗管理**  
   - 毎日“予定 vs 実績”をセルフチェック  
   - タスク分割・見積もり精度の継続改善
2. **地面レベルのリスク発見**  
   - 実装難易度の想定外、外部依存の遅れ……小さな違和感を即エスカレーション
3. **情報のプル型共有**  
   - REFS（Review・共有）を自発的に回し、他メンバーの進捗も補完
4. **改善提案**  
   - ツール選定や手順変更など“現場の知見”をトップにフィードバック

---

## 二層管理を機能させるコツ

### 1. 情報粒度を合わせる
- リーダー用：全体勝率を測る**マクロ指標**  
  - 例）完了ストーリー数、残タスク数、総バーンダウン率
- メンバー用：自タスクの**ミクロ指標**  
  - 例）1日の作業時間実績、ブロッカー件数、レビュー待ち時間

### 2. 共通のプラットフォームを使う
- GitHub Projects / Jira / Notion など**一元化**  
- 更新者（メンバー）と閲覧者（リーダー）が同じデータをリアルタイムで見られる状態に

### 3. “上から下へ・下から上へ”の定例サイクル
| 頻度 | トップダウン（リーダー発） | ボトムアップ（メンバー発） |
|------|---------------------------|-----------------------------|
| 毎日 | デイリースタンドアップで全体状況共有 | タスク更新・阻害要因の即報告 |
| 週次 | マイルストーン進捗レビュー | 課題・改善案の提案 |
| 随時 | 重大リスクのエスカレーション | 想定外ブロッカーの報告 |

### 4. 仕組みで“サボれない”設計にする
- タスク未更新は自動リマインド  
- レビュー遅延はダッシュボードで赤表示  
- **仕組みが先、精神論は後**  

---

## 期待できる効果
1. **遅延の早期発見**  
   - ボトムアップで細かな遅れを検知  
   - トップダウンで全体最適な手当て
2. **属人化の防止**  
   - 進捗データが共有資産になることで“あの人しか知らない”を排除
3. **メンバーの当事者意識向上**  
   - “自分のタスク＝自分の責任”が明確になる
4. **リーダーのマネジメント負荷軽減**  
   - 手動で状況ヒアリングする時間を、意思決定や障害解決に回せる

---

## まとめ
- 進捗管理を**リーダー専任の仕事**と捉えると、情報が遅れ・歪み・隠れる。  
- **リーダーは全体最適・メンバーは個別最適**を追い、二層で管理することで“正確で素早い”プロジェクト運営が実現する。  
- ポイントは「**仕組みと可視化**」。ツール・定例・指標を整え、トップダウン × ボトムアップのサイクルを回そう。

> **プロジェクト成功の原動力は、リーダーのリードとメンバーの自立が互いを補完しあうこと。**  
> 今日から“二層管理”を取り入れ、チーム全員で進捗を前へ押し進めよう！
【LLM】プロンプトテクニック -CoTとSCoTの比較-

## はじめに
　LLMの精度向上するためのプロンプトテクニックとして、参考資料[1]や視聴してきたUdemy講座ではCoT（Chain of Thought）が紹介されており、普段の業務から利用してきた。しかしながらLLMからのレスポンス精度に満足いっていなかったので、改めてプロンプトテクニックについて調査したところ、SCoT(Strategic Chain of Thought)という手法がCoTよりも精度が高いと言われており、今回検証した結果を備忘録としてまとめる。

## SCoTとCoTの違い
　詳細な内容は参考資料[2][3]に任せ、簡易的なイメージを記載していく。
　CoTとは、リクエストに対してレスポンスするまでを各ステップごとに分けて考えさせる手法で、プロンプト上では「**ステップバイステップで検討して** 回答してください。」と表現されている。この際、プロンプトに記載されている情報や解決したい課題によって、誤ったステップによる誤答を引き起こしてしまう。
　SCoTとは、CoTをベースとしてLLMに**何が重要/不要か**、もしくは**どういったステップで検討していくか戦略**をプロンプトに明記していく手法である。

## 検証
　各プロンプトをGPT4oにリクエストすることで、回答にどのような違いがあるか確認した。
　「ペンが入っている箱の数はいくつですか？」という問いに対して、プロンプトには関係ないノートやボールが入った箱の情報が含まれている。
 
### CoT
　
``` prompt.txt
【問題】
ある倉庫には、赤い箱、青い箱、黄色い箱、緑の箱があります。
赤い箱にはペンが入っています。
青い箱にはノートが入っています。
黄色い箱にはペンが入っています。
緑の箱にはボールが入っています。

「ペンが入っている箱の数はいくつですか？」

ステップバイステップで検討して回答してください。
```

``` result.txt
はい、ステップバイステップで検討していきます。

ステップ1：各箱と中身を整理する
赤い箱 → ペン

青い箱 → ノート

黄色い箱 → ペン

緑の箱 → ボール

ステップ2：ペンが入っている箱を確認する
赤い箱 → ペン → ✅

青い箱 → ノート → ❌

黄色い箱 → ペン → ✅

緑の箱 → ボール → ❌

ステップ3：ペンが入っている箱の数を数える
赤い箱 → ペン → 1箱

黄色い箱 → ペン → 1箱

合計 2箱 です。

最終回答
ペンが入っている箱の数は「2つ」です。

```

### SCoT
　今回は戦略として、不要な情報（ペン以外の情報）は無視するよう指定した。

``` prompt.txt
【問題】
ある倉庫には、赤い箱、青い箱、黄色い箱、緑の箱があります。
赤い箱にはペンが入っています。
青い箱にはノートが入っています。
黄色い箱にはペンが入っています。
緑の箱にはボールが入っています。

「ペンが入っている箱の数はいくつですか？」
ステップバイステップで検討してください。ただしペンの入った箱だけに注目し、それ以外は無視してください
```

``` result.txt
了解しました。
ステップバイステップで、ペンの入った箱の数を検討します。

【ステップ1】ペンが入っているかを確認する
倉庫には4つの箱があり、それぞれ次の中身です：

赤い箱 → ペン

青い箱 → ノート

黄色い箱 → ペン

緑の箱 → ボール

ペンが入っている箱はどれか確認します。

【ステップ2】ペンの入った箱をリストアップする
ペンが入っている箱は次の通りです：

赤い箱

黄色い箱

【ステップ3】ペンの入った箱の数を数える
リストアップした結果、2個ありました。

【結論】
▶ ペンが入っている箱の数は、2個です。
```

## 考察
　今回２つの手法でLLMにリクエストしたところ、最終的な回答は一致したうえに、ステップ数にも２つの手法に変わりなかった。この要因として、以下の２点が考えられる。

 ①そもそも問題がシンプルすぎたため、SCoTにしなくてもLLM側で何が重要な情報か判断しやすかった。
 ②GPT4oが優秀なため、ある程度の無駄な思考を自動でカットできてしまう。

 ## 所感
　今回の検証では思うようにCoTとSCoTの精度差異を確認することができなかった。しかしながわ参考資料[2]にあるように、GPT4ominiなどのSLMにおける効果は高い可能性があることに加え、事前に戦略を伝えることで安定した回答に期待ができる。そのため、GPT4oなどの高精度が期待されているモデルではSCoTを利用する必要はないと断言するには早く、複雑なリクエストに対する安定した回答を求める場合には一度試してみる意義があるだろう。

 ## 参考資料
[1]西見公宏、吉田真吾、大嶋勇樹共著、『LangChainとLangGraphによるRAG・AIエージェント[実践]入門』、技術評論社、2024年11月
[2]Naoki Matsumoto, 『【最先端プロンプトエンジニアリング】LLM推論精度を爆上げするStrategic Chain-of-Thought とは？【CoTを超えろ】』,　https://zenn.dev/chips0711/articles/d32bf746a6948e
[3]田中侑李, 『戦略的知識を統合する新たなプロンプト手法、SCoT(Strategic Chain-of-Thought)が登場！』, https://ai-scholar.tech/articles/chain-of-thought/SCoT
[4]テックファームブログ, 『小規模言語モデル（SLM）とは？LLMとの違いやメリットを解説』,https://www.techfirm.co.jp/blog/slm
Copilotの入力プロンプト

### はじめに
Copilotの入力プロンプト例です。
### 説明
エクセルに条件シートとデータシートを設けます。

【条件シート】
条件１	入力された内容をデータシートのテーブルに従い整理
条件２	データシートのテーブルに該当しない項目は「-」を明記
条件３	入力された内容がテーブルの該当項目にない場合はテーブルの「その他」の列に明記。複数ある時は「/」区切りで明記。
条件４	データシートのテーブルにペーストできるようにカンマ区切りのコードブロック形式で表示

【データシート】
列A　列B　列C　その他
AWS完全初心者がJAWS-UGでLT登壇をしてみた話

## はじめに
こんにちは、Tsukasaです！
今日はAWS完全初心者の自分がJAWS-UGでLT登壇をした時のことについて記事を書いていこうと思います。初心者にLTはハードルが高いのでは？といった方やそもそもLTって何？といった方にとってプラスになればなと思います。よろしくお願いいたします！

## そもそもLTとは？
LTとはLightning Talk（ライトニングトーク）の略で、「短いプレゼンテーション」のことです。
LTにはいろんな種類があり、短いものでは５分や10分長いと20分のものもあります。

## LTをやってみようと思った経緯
エンジニアによるLTと言うとスキルの高い人が技術的に難しい話をしているように見えますよね。
私自身まだエンジニアとしての歴も短いですし、AWSに関しては全く触ったこともなかったので、AWSについてのLTなんて自分にとっては完全無縁だと思っていました。
JAWS-UGの活動自体には2月頃から参加していましたが、資格全冠の凄い人がレベルの高い話をしてるなくらいにしか思っていませんでした。しかし、この思考を変える出来事があったのです。
それが、3/1に行われたJAWS DAYSです。
JAWS DAYSに関しては下記の記事に詳細がありますので、是非ご覧ください！

https://qiita.com/tks_1128/items/14b0bf757145317e5d7b

このJAWS DAYSに参加したことでアウトプットをすることの大切さをまず学びました。
今まで見る専門だったQiitaに記事を投稿するようになり、9,000人近い人に読んでいただいたこともあり、この経験をLTで話すことはできないだろうか？と思うようになったのです。
しかし、上述のようにLTと言うと技術的な話をみっちりしないといけないというイメージがありました。ですが、JAWSは基本的にAWSに関する話であれば、技術的な話じゃなくても大丈夫なのです。
とは言え、本当に技術的な話をしなくても大丈夫なのだろうか？という不安はありました。
そのため、私が参加しているJAWS-UG初心者支部の運営の方にJAWS DAYSに参加した時の話をLTでしても大丈夫か？の確認を行いました。
すると運営の方から快く許可をいただくことができ、めでたく3/26に行われた初心者支部のオンラインイベントでLT登壇デビューを果たしたのです。

## LTをやることのメリット
LTをやることのメリットは沢山あります。
以下にざっくりまとめてみました。
・自分の経験をアウトプットできる。
・自分のことを知ってもらえる。
・スライド作成、プレゼン力、人に伝える力が身に付く。
・自分の経験が必ず誰かの役に立つ。

それでは1つずつ見ていこうと思います。

**自分の経験をアウトプットできる。**
まずはアウトプットです。
自分の経験を話すことで、知識の定着にもなります。
私はまだ技術的なLTをやったことがないのですが、技術的な話をした場合は知識の定着に大いに役立つと思います。技術的な話でなくとも学んだことや考え方、習慣等が定着するのでお勧めです。

**自分のことを知ってもらえる。**
LTに登壇することで自分を知ってもらえる機会にもなります。
私自身これまでに3回登壇しましたが、登壇をする度に知ってもらえる機会が増えたと思います。
特にオフラインでの登壇ですと、大体その後懇親会に参加することが多いので、そういった席でLTについての感想を話してもらえたり、名刺交換やSNSを交換する形でどんどん人脈が増えていきました。
その結果AWSの学習について迷ったり悩んだりした時も相談できる仲間ができました。

**スライド作成、プレゼン力、人に伝える力が身に付く。**
このスキルは社会人にとって必須のスキルだと個人的には考えています。
特に5分のLTですと、短いが故に自分が一番伝えたいポイントを簡潔に聞いている方々に伝えるのは容易ではありません。そこに笑いを入れるとなると尚更難しいのです。
ですが、これができるようになると、上記のようにプレゼン力や人に伝える力を身に付けることができます。業務上、人前に出てプレゼンをする人もいれば、しない人もいると思います。
もしプレゼンをする機会がない人でもLTを通して人に伝える力を身に付けることで、コミュニケーション能力が上がります。このように「組織」で「他人」と働く人には社会人としてのスキルを上げることができる絶好の機会なのです。
また学生の方にも凄く役立つものだと思います。大学や専門学校でもプレゼンする機会は沢山あると思いますし、就活の場でも自分の長所を簡潔に伝えることで、内定に繋がることもあるでしょう。
LTは学生にも社会人にもスキルを上げる絶好のチャンスなのです。

**自分の経験が必ず誰かの役に立つ。**
もし技術的な内容でLTを行えば、その内容が聞いている人の役に立ち、知識になることは容易に想像ができると思います。しかし技術的な話をできなくても、LTで話した内容は必ず誰かの役に立ちます。
現に私が話したことをきっかけにQiitaに記事を投稿し始めたり、ハンズオンを始めた方がいらっしゃると聞きました。このように登壇内容が技術的であろうがなかろうが、必ず誰かの役に立つのです。
個人的にはこの部分が一番大切かなと思います。自分の話したことが、誰かの役に立つことは誰でも嬉しいものです。

## 終わりに
いかがでしたでしょうか？
LTをすることで得られるメリットは沢山あることがわかっていただいたのではないでしょうか？
AWSを学習し初めて半年しか経っていない自分が既に3回登壇したくらいなので、普段から業務で使っている方はいくらでもできると思います。
是非挑戦してみてください！
最後に今まで登壇した際に用いた資料を添付します。
もし良かったらご覧ください！

https://speakerdeck.com/tks_21/2025-dot-03-dot-26ltzi-liao

https://speakerdeck.com/tks_21/2025-dot-04-dot-17ltzi-liao

https://speakerdeck.com/tks_21/2025-dot-04-dot-22ltzi-liao
2025年4月以降, cloudflareでNext.jsを使う場合は workers で opennext を使うべし

# 概要

- 今後cloudflareで、無料枠でnext.jsを使ってみようと思ってる人向けです
- 従来は pages に next-on-pages を使ってデプロイするのが無料枠で済ませる鉄板でしたが、、、

# まず大前提で、今後は cloudflare pagesを使わず、workersにnext.jsをデプロイすべき

タイトルのとおりで

next-on-pagesを使ってcloudflare pages + functinosで動かすのが去年以前の主流でしたが、
ハマりどころ多いし、時間食われるしnext.jsの最新版対応できないし、やめたほうがいいです

すでに公式docでも注記がついており、workersが推奨されています
https://developers.cloudflare.com/pages/framework-guides/nextjs/ssr/

workersは2024年11月から**無料で3MB**までデプロイできるようになったし、
**1日10万リクエストは無料でいけますし、opennextはいい感じに無料枠を最大限活用できるようにしてくれてます**

# workers で opennext/cloudflareを使ってnext.jsをホスティングする

https://opennext.js.org/cloudflare

opennextはnextをどこでもデプロイできるようにするプロジェクト

cloudflareではworkersに焦点をあてて作られているので、今後はpagesではなくworkersに、opennextを使ってデプロイする、ということになります

https://developers.cloudflare.com/workers/frameworks/framework-guides/nextjs/

Next.jsをpagesで動かすためのアダプタ、next-on-pagesはNext.js 14まで対応ということで
今後は問答無用でこちらを使った方が良いでしょう

# workersでnext.js運用した際、静的アセット、画像などは勝手にKVやR2を使ってくれるのでworkersのリクエストを消費しない

next.jsのデフォルトで作られるindexを開くと
`xxx.workers.dev/vercel.svg` というvercelのアイコンが表示されます

そのた、トップページリクエスト＋画像などのアセットリクエスト分も含めて
workersのリクエストバジェットを消費するのかなと思ってたんですが

cloudflareのメトリクスを見ると、全体を強制リロードしてもリクエスト+1にしかなっていませんでした
これは嬉しい誤算でした


claude3.7sonnetに聞いたら、どうもOpenNextがその辺うまいことKVやR2やらを使ってworkersの消費を抑えてくれているらしい💰️

知識が古い可能性あるので、気になる方は自分で見てみてください

```
# Cloudflare WorkersとOpenNextの静的アセット配信について

ご質問の内容は、完全に正しい観察です。OpenNextで構築されたNext.jsアプリケーションをCloudflare Workersにデプロイした場合、静的アセット（vercel.svgなどの画像）はワーカーのリクエスト数にカウントされません。

## 仕組みの解説

1. **アセット配信の最適化**:
   - OpenNextは、静的アセット（画像、CSS、JS、フォントなど）をCloudflare R2またはWorkers KVに保存します
   - これらのアセットは、Workers KVまたはR2から直接CDN経由で配信されます
   - したがって、Workersのリクエスト数としてカウントされません

2. **具体的な動作**:
   - ユーザーがページ（`https://imgboard.parupunte.workers.dev/`）にアクセスすると、Workersがリクエストを処理します（+1カウント）
   - 同じページ内の画像（`/vercel.svg`）は、Workers KVから直接配信され、Workersリクエストは発生しません
   - これは意図的な最適化設計で、Workersの無料枠（1日10万リクエスト）を効率的に使用するためです

3. **package.jsonの設定**:
   - `@opennextjs/cloudflare`のバージョン`1.0.0-beta.3`を使用しており、この機能が組み込まれています
   - デプロイ時に`opennextjs-cloudflare build && opennextjs-cloudflare deploy`コマンドが実行され、最適な配信設定が適用されます

## 利点

この仕組みには大きな利点があります：

1. **コスト効率**:
   - 静的アセットがWorkersリクエストを消費しないため、無料枠を主に動的コンテンツに使用できます

2. **パフォーマンス**:
   - 静的アセットがCDNから直接配信されるため、読み込み速度が向上します

3. **スケーラビリティ**:
   - 画像などの大量のアセットがあっても、Workersのリクエスト制限に影響しません

そのため、観察されている動作は正常で、むしろOpenNextの優れた最適化の一例です。
```


# pages + next-on-pagesの場合、 AppRoute 動的ルーティングがNext.js 15だと動かない

以下エラーで、問答無用でstatus code500になる
```
"Error: Disallowed operation called within global scope. Asynchronous I/O (ex: fetch() or connect()), setting a timeout, and generating random values are not allowed within global scope. To fix this error, perform this operation within a handler. https://developers.cloudflare.com/workers/runtime-apis/handlers/"
```

こういう問題もあり、next-on-pagesはもう使わないほうがいいですね

https://opennext.js.org/cloudflare
ファインチューニング



**ファインチューニング（Fine-Tuning）**とは、  
**すでに学習済みのモデル**に対して、**追加で特定のデータを使って再学習させること**を指します。

簡単に言うと：
> **「基礎ができているAIに、特定分野の"しつけ"をする」作業  
です。

---

### 具体的なイメージ
たとえば：

- ChatGPTのような大規模言語モデル（LLM）は、一般的なインターネット知識で訓練されています。
- でも、ある会社専用の製品情報や社内用語に特化した応答をさせたいとき、その会社のデータを使って追加学習させる。
- こうすることで「一般的な知識＋自社専用の知識」を持ったモデルが完成します。

これがファインチューニングです。

---

### ファインチューニングの流れ（ざっくり）
1. **ベースモデルを用意**（例：ChatGPT、BERTなど）
2. **追加したいデータを用意**（例：FAQデータ、特定ドメインの会話データ）
3. **ベースモデルをそのデータで再学習**  
   （全部をゼロから学習し直すわけではなく、すでにある知識をベースに微調整する）

これによって、
- モデルは**基本性能を保ちながら**
- **特定タスクや特定領域に強くなる**  
という効果があります。

---

### ファインチューニングとインコンテキスト学習の違い
| 項目 | ファインチューニング | インコンテキスト学習 |
|:---|:---|:---|
| 学習方法 | モデルのパラメータを更新する | モデルのパラメータは変えない |
| 必要なもの | 特別なデータセット、計算リソース | 良いプロンプト（入力例） |
| 効果 | 永続的に知識やタスクが身につく | 一時的にタスクに対応できる |

---

### まとめ
- ファインチューニングは「モデルの再教育」
- 追加データでモデルを特定分野向けに調整できる
- パラメータ自体を変更するので、効果は**長期的**

---
WSL のUbuntu にあるPostgresにアクセスする

# 初めに
ここで行うことは下記のとおりです。
1. UbuntuにPostgresのインストール
1. UbuntuのIPアドレス確認
1. ホストOS（Windows OS自体）から接続するため設定
1. WindowsにFirewall設定追加

# UbuntuにPostgresのインストール
UbuntuにPostgresをインストールしましょう。

パッケージ情報を最新の状態に保つためのコマンド実行する。
```bash
$ sudo apt update
```
パッケージのアップデートを行うコマンド実行（時間が掛かるのでどちらでもいい）
```bash
$ sudo apt upgrade
```
PostgreSQL本体、PostgreSQL周辺の拡張モジュールや便利ツールをインストール
```bash
$ sudo apt install postgresql postgresql-contrib
```
参考)
PostgresSQLを任意のバージョンでインストールする場合、必要なバージョンを探して入れてください。
```bash
$ sudo apt-cache search postgresql | grep ^postgresql
```


# UbuntuのIPアドレス確認
下記の方法で確認できます。
## Ubuntuから確認

### hostname
```bash
$ hostname -I
172.27.73.187
```
### ip addr
```bash
$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet 10.255.255.254/32 brd 10.255.255.254 scope global lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:15:5d:61:c4:f5 brd ff:ff:ff:ff:ff:ff
    inet 172.27.73.187/20 brd 172.27.79.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::215:5dff:fe61:c4f5/64 scope link
       valid_lft forever preferred_lft forever
```
eth0の値がIPです。

## Windowsから確認

### hostname
```bash
PS > wsl -e hostname -I
172.27.73.187
```



# Ubuntu内のPostgres設定ファイル修正
2つのファイルを修正します。
1. postgresql.conf
1. pg_hba.conf

エディターは好きなものを使用してください。
```bash
$ vi
$ nano
```
viで修正します。

## postgresql.conf
バージョンは一つしか入れないと思うので入れたバージョンで開けるよう、下記コマンドでエディタを開きます。
```bash
sudo vi /etc/postgresql/*/main/pg_hba.conf
```

localhostを外部からも接続できるよう「*」に変更する。
```config
#listen_addresses = 'localhost'         # what IP address(es) to listen on;
listen_addresses = '*'                  # what IP address(es) to listen on;
                                        # comma-separated list of addresses;
                                        # defaults to 'localhost'; use '*' for all
 
```

viのコマンドは下記でできる。
```bash
# コマンドモードでlocalhost検索
/localhost (+ enter)
# 文字列置換で入力モードに入りlocalhostを変換しコマンドモードに戻る
cw * (+ esc)
# 書き込みして終わり
:wq
```

## pg_hba.conf
md5のハッシュ値による通信で全てから受けられるように1行追加します。

```config
host    all             all             0.0.0.0/0               md5
```

viのコマンドは下記でできる。
```bash
# 最後の行へ行く
(shift +) g
#挿入モード
i
# 上の1行を貼り付け
# 書き込みして終わり
:wq
```

# WindowsのFirewallに設定追加
WindowsのFirewallの受信の規則（インバウンド）にPostgresnoポートを追加します。

管理者で行ってください。
```powershell
$ New-NetFirewallRule -DisplayName "PostgreSQL WSL 5432" -Direction Inbound -Protocol TCP -LocalPort 5432 -Action Allow
```
接続アドレスが決まっている場合は直接指定してください。
```powershell
New-NetFirewallRule -DisplayName "Allow PostgreSQL from WSL" -Direction Inbound -Protocol TCP -LocalPort 5432 -RemoteAddress <IPアドレス> -Action Allow
```
AtCoder ABC402 振り返り(緑コーダーがPythonでABC問題)

## AtCoder Beginner Contest 402 振り返り

[東京海上日動プログラミングコンテスト2025（AtCoder Beginner Contest 402） - AtCoder](https://atcoder.jp/contests/abc402)

この日はunrated参加にしました。C問題まで3問の解答です。

## [A - CBC](https://atcoder.jp/contests/abc402/tasks/abc402_a)

```moji.upper()``` で大文字に変換できるので、元の文字と比較しました。
しかし、単純に ``` moji.isupper()``` で大文字判定ができるので、そちらを使うほうが楽でしょう。

``` python
S = list(input())
answers = []
for i in range(len(S)):
    # S[i].isupper() を使うほうがわかりやすい
    if S[i].upper() == S[i]:
        answers.append(S[i])
print("".join(answers))
```

## [B - Restaurant Queue](https://atcoder.jp/contests/abc402/tasks/abc402_b)

待ち行列の問題なので、キューを使って処理します。B問題でキューを使うのは珍しい気もします。
条件が厳しくないので、普通に配列(list)を使っても間に合いそうです(未確認)。

``` python
from collections import deque

Q = int(input())

queue = deque()
for i in range(Q):
    query = input().split()
    if query[0] == "1":
        # 1のときは末尾に追加
        queue.append(int(query[1]))
    elif query[0] == "2":
        # 2のときは先頭から取り出す
        num = queue.popleft()
        print(num)
```

## [C - Dislike Foods](https://atcoder.jp/contests/abc402/tasks/abc402_c)

データの持ち方を工夫して解きました。

```
# foodDishDict 食材 i が使われている 料理
foodDishDict[1] = [1, 3] # 食材1 は 料理 1,3 で使用
foodDishDict[2] = [1, 3, 5] # 食材2 は 料理 1,3,5 で使用
...

# K[] 料理で使用している食材数
K[1] = 2
K[2] = 3
K[3] = 3
...
```

上のようなデータ構造を作っておきます。食材を克服したとき、以下の処理を行います。

```
# 食材1 を克服した場合、料理[1, 3] から食材数を-1する
K[1] = 2 → 1
K[3] = 3 → 2
```
食材数が 0 になった場合、その料理を食べられることになります。



``` python
N, M = map(int, input().split())

K = [] # 料理iに使われている食材の数
foodDishDict = defaultdict(list) # 食材がどの料理に使われているか

# 食材データ読み込み
for i in range(M):
    KA = list(map(int, input().split()))
    K.append(KA[0])
    for j in range(1, len(KA)):
        foodDishDict[KA[j]].append(i+1)

# 食材克服データ読み込み
B = list(map(int, input().split()))

caneat = 0 # 食べられる料理の数
for b in B:
    dishlist = foodDishDict[b]
    # 克服した食材を使っている料理(dish)をループ
    for dish in dishlist:
        # 使用食材数を-1
        K[dish-1] -= 1

        # 使用食材数が0になれば、食べられる
        if K[dish-1] == 0:
            caneat += 1
    print(caneat)
```
ハルシネーション



**ハルシネーション（Hallucination）**とは、  
AI（特に大規模言語モデルや生成AI）が、**事実と異なる内容や、根拠のない内容をもっともらしく作り出してしまう現象**のことを指します。

簡単に言うと：
> **「それっぽいけど、ウソ」**  
な回答をAIがしてしまう現象です。

---

### 例

例えば、あなたがAIにこんな質問をしたとします：

> 「2022年にノーベル文学賞を受賞したのは誰ですか？」

もしAIが、
> 「村上春樹です。」
と答えたら、それは**ハルシネーション**です（実際には違う人が受賞しています）。

一見自然な日本語で答えているので、**間違いに気づきにくい**のも大きな問題点です。

---

### なぜハルシネーションが起こるのか？
- AIは「知識ベース」で動いているわけではなく、「次に来るもっともらしい単語列」を予測して生成しています。
- 正しいかどうかを**必ずしも検証していない**ため、「見たことがありそうな答え」を作ってしまう。
- 特に**訓練データに存在しない情報**や、**難しい質問**に対して発生しやすいです。

---

### ハルシネーションが問題になる場面
- 医療や法律など、**正確さが非常に重要な分野**  
- ニュース記事やレポートの作成  
- 教育用途（間違った知識を広めてしまう可能性がある）

---

### 対策
- 出力内容を**人間が必ず確認**する
- **ファクトチェック**を別プロセスで組み合わせる
- モデル自体を**より事実ベースで学習させる（RAG：Retrieval-Augmented Generationなど）**

---

### まとめ
- ハルシネーション＝「もっともらしいけどウソをつく現象」
- 理由＝AIは確率で文章を作っているから、必ずしも真実を見ていない
- 対策＝人間による検証、事実確認システムとの組み合わせが重要

---
docker desktopが起動しないので力業で起動させる

# **インストールしたdocker desktopが最初の一回以降起動しなくなる**

<font color="#ff0000">**試したもの**</font>
再起動やwsl(Linex系等のソフト）をアンインストールなど試したが変わらず:point_up:

<br><br><br><br>
# <font color="blue"> 解決策（力技）</font>

最終的にdocker homeのウェブサイト(https://app.docker.com/?index)
から画像左上のLauch docker desktopをクリックし、docker desktopを起動させた


# docker homeのサイト
![キャプgagtragaeチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203503/6d0e14a5-4d3e-4f77-9841-c2aa95a7962e.jpeg)


:::note info
2025/4/28現在までの力業です
:::
深層強化学習


**深層強化学習（Deep Reinforcement Learning, Deep RL）**とは、  
**強化学習（Reinforcement Learning）**と**深層学習（Deep Learning）**を組み合わせた技術です。

それぞれ簡単に整理すると：

- **強化学習**：  
  エージェント（AI）が「環境」の中で行動し、「報酬」をもらいながら、どう行動すれば最も高い報酬を得られるかを学ぶ仕組みです。  
  例：ロボットが迷路を脱出するにはどう動けばいいかを試行錯誤で覚える。

- **深層学習**：  
  ニューラルネットワーク（特にディープな層を持つもの）を使って、複雑なパターン認識や関数近似を行う技術です。  
  例：画像から犬と猫を判別する。

---

**深層強化学習**はこれらを組み合わせて、  
「環境の情報（状態）」から「最適な行動」を選ぶために**ディープニューラルネットワーク**を使う、という考え方です。

簡単に言うと：
> **複雑な状況の中で、試行錯誤しながらニューラルネットワークで賢く行動を学ぶ方法**

です。

---

例えば有名な事例は：
- **AlphaGo（囲碁のAI）**  
- **ロボットの自動制御**  
- **ゲームプレイ（例：Atariのゲームを人間よりうまくプレイするAI）**

などです。

---

### ポイントまとめ
- 従来の強化学習では「状態→行動」の対応をテーブル（表）で管理していたけど、現実はもっと状態が複雑なので、表じゃ無理。
- そこで**ニューラルネットワーク**で「状態→行動」を近似する。
- 深層学習によって、視覚情報や複雑な状態空間でも強化学習ができるようになった。

---
インコンテキスト学習


インコンテキスト学習（In-Context Learning）とは、機械学習や自然言語処理（特に大規模言語モデル、たとえばChatGPTなど）において、**明示的にモデルを再学習・再トレーニングすることなく、プロンプト（入力文）に例を与えるだけで新しいタスクに適応させる学習方法**を指します。

具体的には、
- モデルに対して「問題とその答え」の例をいくつか与え、
- その流れに続いて新しい問題を提示すると、
- モデルがその例に倣って新しい問題に対する答えを推測する
という動作をします。

例えば、こんな感じです：

```
Q: 猫は英語で何と言いますか？
A: cat
Q: 犬は英語で何と言いますか？
A: dog
Q: 鳥は英語で何と言いますか？
A: 
```
このように例を入力することで、モデルは「日本語の動物名を英語に翻訳する」というタスクをその場で理解し、学習していないタスクでもそれらしく答えることができます。

ポイントは：
- **学習パラメータを更新しない**（あくまで入力内容だけで対応する）
- **即時的にタスクを適応する**
- **例（コンテキスト）を工夫することで精度を高められる**

です。

---
アセンブリとは何か：機械語への扉



> _"言葉を失ったとき、人は最も純粋な行動に立ち返る。コンピュータも同じだ。"_  

アセンブリ。  
それは、プログラムが人間の言語から離れ、**機械の論理に最も近づいたときに生まれる記述形式**である。  
この扉を開いた瞬間、私たちは「**動作そのものを記述する**」という、根源的な設計行為に立ち戻ることになる。

本稿では、「アセンブリとは何か」を、単なる定義ではなく、**意味と存在理由**から掘り下げる。

---

## アセンブリは「記号による機械語の表現」である

コンピュータは、0と1しか理解できない。  
だが、人間が直接ビット列で命令を書くのは、非効率で危険だ。

アセンブリは、この**機械語命令に対する「人間向けのラベル」**である。

例：

- 機械語（バイナリ）: `10110000 01100001`
- アセンブリ表記 : `MOV AL, 61h`

ここで `MOV` は「移動（Move）」を意味し、`AL` はレジスタ名、`61h` は16進数の値である。  
つまりアセンブリは、「**ビット列の意味を人間に可読化する記号体系**」なのだ。

---

## 高級言語とアセンブリの違いは「距離」である

高級言語（C, Python, Rustなど）は、抽象度が高い。  
それは人間の概念に近づくために、**手続き・関数・オブジェクト**といった構造を持つ。

アセンブリは、それらの抽象をすべて剥ぎ取り、  
**「レジスタへの代入」「メモリアドレスへの読み書き」「ジャンプ命令」**といった、  
**最小単位の動作**だけを扱う。

つまり、アセンブリは「機械に最も近く、人間から最も遠い言語」である。  
しかしその距離こそが、**究極の制御力と透明性**を保証する。

---

## アセンブリを書くとは、「制御を握る」ということ

アセンブリを書くとは、「**コンパイラに任せない**」という宣言である。  
それは、次のような意思表明に等しい：

- どのレジスタを使うか自分で決める  
- どのメモリにアクセスするか明示する  
- どの命令順序で最適化するか設計する

これは単なる自己満足ではない。  
**リアルタイム性、サイズ制約、セキュリティ、あるいはただ純粋な最適化**のために、  
制御を手放さない設計者だけが持ちうる武器なのだ。

---

## アセンブリは「言葉ではなく振る舞い」を記述する

通常のプログラミングでは、「意図」が支配する。  
「何をしたいか」を記述する。

アセンブリでは違う。  
**「何をするか」ではなく、「どう振る舞うか」を一命令ずつ記述する。**

例：

```assembly
MOV AX, BX   ; BXレジスタの内容をAXレジスタにコピーする
ADD AX, 5    ; AXレジスタに5を加算する
JZ  label    ; 結果がゼロならラベルにジャンプする
```

このように、**手続きそのものを、設計者が一手一手指示していく。**  
そこには、抽象も仮定もない。**ただ動作だけがある。**

---

## なぜ現代においてもアセンブリを学ぶのか？

コンパイラがこれほど発達し、最適化も自動化されている現代において、  
アセンブリを学ぶことは一見無駄に思えるかもしれない。

しかし、それは以下の理由において意味を持つ：

- **ブラックボックスに依存しない設計感覚が身につく**  
- **最適化の限界と可能性を直感できる**  
- **セキュリティ上の脆弱性（バッファオーバーフローなど）を根本から理解できる**  
- **JITコンパイラ・VM開発・カーネル開発に必須となる**  
- **バイナリ解析やリバースエンジニアリングに不可欠な素養となる**

アセンブリを知ることは、  
**プログラムが“なぜ動くか”ではなく、“どう動いているか”を体で知ること**に他ならない。

---

## アセンブリを書くとは「自ら機械になる」覚悟を持つこと

アセンブリを書くという行為は、  
高級な言語機能の恩恵を放棄し、**己が設計者として最後の責任を引き受ける**という覚悟を意味する。

それは、「このデータをこのレジスタに載せ、この条件でジャンプし、このメモリ領域に書き込む」という、  
**完璧な明示と制御の連続**であり、  
同時に**たった一つのミスがすべてを崩壊させる世界**への踏み出しでもある。

---

## 結語：アセンブリとは、機械語への扉であり、設計者の最初の約束である

アセンブリは難解ではない。  
それは**世界を最小単位で支配するための言語**だ。  
レジスタ、命令、メモリアドレス――それらを理解し、制御することで、  
初めてプログラムは「自らの意志」で動き始める。

そしてその最初の扉が、アセンブリである。

> _"アセンブリとは、意味を持った動作そのものだ。設計者が最も近い場所で、最も無言の命令を、機械に託すための言語である。"_
Lambdaオーソライザーで任意のステータスコードを応答する方法について

# 現時点での結論
LambdaオーソライザーをPythonで記述する場合、**ステータスコードを指定しクライアントへレスポンスを応答する機能**は現時点[^1]では対応していませんでした。

そのため、エラーケースでは```401 Unauthorized```と```403 Forbidden```のいずれかの利用となります。

:::note
500 InternalServerErrorも応答可能ですが、ハンドリング可能なエラーは4xx系で応答させた方がよさそうです。
:::

[^1]: 2025年4月28日時点。今後要望により対応してもらえる可能性あり。

# はじめに
API Gatewayでは、リクエストを認証認可するためのカスタムロジックをLambdaで実装し、**Lambdaオーソライザー**として統合先機能の認証認を設定できます。

具体的には、API Gatewayがリクエストを受け取ると、Lambdaオーソライザーが呼び出され、リクエストのトークンやヘッダー情報を検証します。
検証結果に基づいて、リクエストを許可するか拒否するかを決定します。

Lambdaオーソライザーの特徴は以下の通りです。

* カスタム認証ロジック：独自の認証ロジックを実装できる
* 柔軟な認可：ユーザーやグループに基づいた細かいアクセス制御が可能
* 統合：API Gatewayとシームレスに統合される


# Lmabdaオーソーライザーの使い方例
詳細は以下のAWSドキュメントに記載の通りです。
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html

ここでは、Lambdaオーソライザーの応答にのみ注目します。

## Lambdaオーソライザーで許可"Allow"を応答したい場合
Lambdaオーソライザーで以下のように```"Effect": "Allow"```で応答することで、Lambdaオーソライザーは許可され、後続の処理に移ります。

```json
{
    "principalId": "*",
    "policyDocument": {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": "execute-api:Invoke",
                "Effect": "Allow",
                "Resource": "resource_name"
            }
        ]
    }
}
```

## Lambdaオーソライザーでエラー応答したい場合
### 403 Forbiddenで応答したい場合
以下のように```"Effect": "Deny"```で応答します。

```json
{
    "principalId": "*",
    "policyDocument": {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": "execute-api:Invoke",
                "Effect": "Deny",
                "Resource": "resource_name"
            }
        ]
    }
}
```

### 401 Unauthorizedで応答したい場合
```Unauthorized```エラーを発生させることで、応答は```401 Unauthorized```となります。
具体的には、以下のようなLambdaオーソライザーを設定すると、```401```が応答します。

```python
import json

def lambda_handler(event, context):

raise Exception('Unauthorized') # Return a 401 Unauthorized response
```

### 500 InternalServerErrorで応答したい場合
これら以外のレスポンスを応答すると、500エラーとなります。


# 応答をカスタムしたい場合
例えば、```"Effect": "Deny"```だけど、ステータスコードを```401```で応答したい場合は、**API Gatewayのゲートウェイレスポンス**を利用することで、ステータスコードを```401```に変更することができます。

* 参考：https://dev.classmethod.jp/articles/lambda-authorizer-response-status-code-customize/
* 参考：https://qiita.com/catDaisuke/items/b897aaf040f4b7f17907


# さいごに
Lambdaオーソライザーで、エラースタータスコードをどこまで応答できるかを確認してみました。
今後の機能拡張により、細かいエラーコードが応答できると設計の幅が広がると思いました
@JsonIdentityInfoで循環参照防止


## @JsonIdentityInfoとは？

Jackson（＝JavaオブジェクトをJSONに変換するライブラリ）用のアノテーションで、オブジェクト同士が循環参照しているとき、無限ループにならないようにするために使う。

```java
@JsonIdentityInfo(
    generator = ObjectIdGenerators.PropertyGenerator.class,
    property = "id"
)
```

これをエンティティにつけると、Jackson は次のように動作します：

- 初回出現時 → フルオブジェクトでシリアライズ  
- 2回目以降の出現 → "id"だけの値（あるいは参照）として出力

| 項目 | 意味 |
|:---|:---|
|generator = PropertyGenerator.class | オブジェクトのプロパティ（ここではid）を使って識別する |
| property = "id" | idプロパティを使う（Word.idなど） |


#### @JsonIdentityInfoなしの場合
```java
WordA → WordB → WordA → WordB → WordA → ・・・
```

無限に繰り返して、  StackOverflowError（エラー）になる。

---

#### @JsonIdentityInfoを付けた場合
```java
WordA (id: 1) → WordB (id:2) → 参照(id:1) → 参照(id:2) → ...
```

idだけで参照を表現する。無限ループしない。





### 例：

```json
{
  "id": 1,
  "wordName": "A",
  "relatedWords": [
    {
      "id": 2,
      "wordName": "B",
      "relatedWords": [1]  ← 循環回避のため、idだけで参照
    }
  ]
}
```




JSON変換時に  
  - まだ初めて出てくるオブジェクトなら展開して出力
  - 2回目以降に出てきたオブジェクトならidだけ参照

という挙動になる



##  有効なケース

| 状況 | 内容 |
|------|------|
| 内部的に相互参照のあるエンティティ構造をそのままJSONに出したいとき | 再帰的構造や親子関係を維持したままクライアントに返したい場合、@JsonIdentityInfoは便利です |
| デバッグや一時的なプロトタイプ | エンティティ構造をフルで見たい、試したい、開発初期などに役立ちます |
| クライアント側（JSなど）が、参照関係やID解決のロジックを持っている場合 | つまり「idだけ渡しても、その先を別途取得できる構成」の場合 |

---

## 有効でないケース

| 問題 | 説明 |
|------|------|
| フロントエンドがidだけのデータでは困る場合 | たとえば `relatedWords[i].wordName` を表示したいのに、それが `117` という数値だけだったら undefined になる |
| JSONが「ID参照形式」になり、フロントで追加の解決処理が必要になる | クライアント側で ID → フル情報 のマッピングを自分で行う必要がある |
| ネストが深くなると人間が読みにくくなる*| 入れ子の中が一部オブジェクト、一部IDだけという不安定な構造になりやすい |
| 結局エンティティの構造がそのままAPI仕様になってしまう | エンティティ設計変更のたびにAPIが壊れるリスクがある（DTOなら防げる） |
| 本番用途には非推奨 | JSON形式が不安定であり、堅牢さに欠ける

---

##  使ってよい場面／避けるべき場面

| 使ってよい（有効） | 避けるべき（限界） |
|-------------------|------------------|
| 試作段階のREST APIでとりあえず動かしたい | 本番APIで安定したレスポンス構造が必要な場合 |
| 内部ツール・非公開APIなどで利用 | 外部公開するAPIや他システム連携時 |
| フロントが `id` を使って後から詳細を取りに行く構成になっている | フロントがそのまま表示に使いたいとき（例：関連語の名前をそのまま表示） |

---

##  結論

- `@JsonIdentityInfo` は、*PAの循環参照を一時的に避けるための応急処置には有効
- ただし、「idだけで参照」となるので、フロントが直接 `.wordName` や `.category.name` を使いたいときには非常に使いにくい
- API設計として安全・堅牢にしたいなら、**DTOに変換**して返すのがベスト
積読日誌：最近読んだ本とこれから読みたい本 -アーキテクト向け- 

こんにちは、アーキテクトのやまぱんです。
最近ずっと積んでた本を消化したのでメモしておきます。
*書籍の URL は Amazon Associate のURLを利用してます。

-----------------------------------------------------------
コメントや質問、<font color="red">**いいね、拡散**</font>、是非お願いします🥺！
もしなにか間違ってたら<font color="red">**優しく**</font>教えてください！

-----------------------------------------------------------
知ってる内容も結構多かったりしましたが、知識の確認にもなってよかったかなと思います。
他にもおすすめの本があれば是非コメントで教えてください！

またこれから読みたい本もメモしておきます。
誰かのためになればうれしいです。

## 読んだ本
+ [OAuth、OAuth認証、OpenID Connectの違いを整理して理解できる本 [2024年改訂版]](https://authya.booth.pm/items/1550861)　https://authya.booth.pm/items/1550861
OAuth 2.0、OAuth認証、OpenID Connectの違いを図解ベースで整理して学べる。よくある「OAuthってログインでしょ？」という誤解を正しつつ、認可と認証の本質を理解できる点が強み。PKCE対応やOIDCフローまでカバーされていて、クラウド設計や認証基盤を考える際の土台づくりに最適。認可フローと認証フローの整理に悩んだらまずこれ。

+ [パケットキャプチャの教科書](https://amzn.to/3GudIt2)　https://amzn.to/3GudIt2
みやたさんの本です。Wiresharkベースにパケット解析を実践的に学べる。単なるツール操作だけでなく、「なぜこの現象が起こるか」というネットワークプロトコル視点で解説されている点が強み。トラブルシューティングや通信最適化の力を鍛えるには最適。点と点がつながる感じ。
 
+ [ネットワークデザインパターン](https://amzn.to/4jriBkV)　https://amzn.to/4jriBkV
こちらもみやたさんの本です。現場で使われるネットワーク構成（VPN、DMZ、冗長化設計など）を「パターン」として整理しており、設計・提案業務の即戦力になる一冊。図が多く、体系的に整理されているので、設計の引き出しを増やしたい人に特におすすめ。特にオンプレ経験が少ない人は一度読んでおいてもいいかもと思います。

+ [インフラデザインパターン](https://amzn.to/4jr2HHl)　https://amzn.to/4jr2HHl
サーバ、ストレージ、ネットワークを横断した「システム全体設計の型」を示す。性能要件や可用性要件を満たす設計ポイントが例示されており、特にプリセールス・アーキテクト系の人には刺さる内容。クラウド設計にも役立つかなと思います。こちらもオンプレ経験が少ない人は一度読んでおいてもいいかもと思います。
 

+ [暗号化入門 秘密の国のアリス](https://amzn.to/3Gs4NIu)　https://amzn.to/3Gs4NIu
暗号の基礎（共通鍵暗号、公開鍵暗号、ハッシュ関数）を、物語仕立てでわかりやすく学べる。
RSAやDiffie-Hellmanもやさしく説明されており、「暗号アルゴリズムをざっくり理解しておきたい」という人に最適なファーストブック。

+ [Azureネットワーク設計・構築入門 基礎知識から利用シナリオ、設計・運用ベストプラクティス](https://amzn.to/44HZej4)　https://amzn.to/44HZej4
あとはなんといってもこちらです。同僚の方が書いた本ですが、自信をもってお勧めできます。
NWの関連する基礎知識からAzure上でのネットワーク設計・構築の考え方を体系的に学べる一冊。VNET、VPN、ExpressRoute、Peeringなど実務で必要な設計パターンがシナリオ別に整理されており、特にクラウドアーキテクトやネットワークエンジニア志向の人には刺さる内容。Azure独自の設計思想（ルーティング、セキュリティグループ設計など）を理解するのにも役立つかなと思います。Azureネットワークを「なんとなく使っていた」人は一度読んでおくと設計品質が上がるはずです。

## 購入済みの読みたい本
http  / L7レイヤーの 知識、セキュリティ的な知識も体系的に入れておきたいなというところでこういう本を読もうかと思ってます。資格試験もいくつか控えてますけど、寒くなる前には読みたいです。
+ [安全な Web アプリケーションの作り方](https://amzn.to/3ECZxkO)　https://amzn.to/3ECZxkO
いわゆる徳丸本と呼ばれてるベストセラー的名著らしいです。
+ [プロになるための Web技術入門](https://amzn.to/4lR0HtD)　https://amzn.to/4lR0HtD
+ [作って学ぶ ブラウザの仕組み](https://amzn.to/4lQeIHW)　https://amzn.to/4lQeIHW
こちらGoogleの人が書いた本です。


+ [Azureの知識地図 〜クラウドの基礎から実装・運用管理まで](https://amzn.to/42QbU4O)　https://amzn.to/42QbU4O
あとはなんといってもこちらです。同僚の方が書いた本で、献本いただけるみたいなので来たら是非読んでレビューしたいと思います！！

## まだ買ってないけど読みたい本
システムパフォーマンス周りの本読みたいなと思い始めました。
+ [絵で見てわかるシステムパフォーマンスの仕組み](https://amzn.to/3GFI8IC)　https://amzn.to/3GFI8IC
+ [詳解 システム・パフォーマンス 第2版](https://amzn.to/436enJK)　https://amzn.to/436enJK
こっちはちょっと重そうなのでいつになるかわからんけど・・・ｗ



-----------------------------------------------------------
他にもおすすめの本があれば是非コメントで教えてください！
M_Cmd：内部処理

# ワイルドカード変換
~~~
'==============================================================================
' 内部処理
'==============================================================================
' ワイルドカード変換
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' RepExp→findstr
'------------------------------------------------------------------------------
Private Function PF_Cmd_ReturnWildCardRegExp2FindStr( _
        ByVal aSrchPtn As String) As String
    Dim wkRtn As String: wkRtn = aSrchPtn
    Dim wkTmpAry As Variant, wkTmp As Variant
    
    If M_String.F_String_GetSplit(wkTmpAry, wkRtn, "|", aIncChkFlg:=True) = True Then
        wkRtn = ""
        
        For Each wkTmp In wkTmpAry
            If wkTmp <> "" Then
                wkRtn = wkRtn & " " & wkTmp
            End If
        Next wkTmp
    End If
    
    PF_Cmd_ReturnWildCardRegExp2FindStr = wkRtn
End Function
~~~
2025年4月時点での sd-webui-train-tools 導入方法

Stable Diffusion Web UI の拡張機能 sd-webui-train-tools の導入方法です。

拡張機能 sd-webui-train-tools を導入するには Stable Diffusion Web UI をダウングレードする必要があります。
複数の解説ページにて、stable-diffusion-webui のApr 4, 2023のコミットである
Commit ID(Commit hash): `80752f43b22acd85bf6ab54b2e4788f144a0c813`
が train-tools を動かすのに必要と言われていますが、2025年4月時点では、それでは動作しません。
過去の同じバージョンを導入しているのになぜ今だと動かないのか？
おそらく動作環境が変わっている、つまり依存関係にある他のソフトウェアのバージョンが今では異なっているためかと思われます。

sd-webui-train-tools の最終コミットは Mar 28, 2024 です。
この時点にあわせることを考えます。
なお、Stable Diffusion Web UI は、すべてのコミットを見ても、修正途中のソースが混じっているのか、動かせないものがほとんどなので、リリース版の中から選択します。
**必要なのは、**
**Releases 1.8.0 (Mar 2, 2024)**
Commit ID(Commit hash): `bef51aed032c0aaa5cfd80445bc4cf0d85b408b5`
**です。**

stable-diffusion-webuiを通常の手順でインストールすると最新版になっています。
ここから上記コミットIDを指定してダウングレードします。
stable-diffusion-webui のフォルダ上で、Git Bash のコンソールから（コマンドプロンプトや、「ターミナルで開く」→PowerShellコンソール からでもおそらく同じ）
`git checkout bef51aed032c0aaa5cfd80445bc4cf0d85b408b5`
を実行します。

（参考）【Stable Diffusion Web UI】アップデート・ダウングレードの方法
https://soroban.highreso.jp/article/article-045

これで webui-user.bat を起動すると、画面下部のバージョン表示が
version: v1.8.0
になっているはずです。

次に sd-webui-train-tools をインストールします。
[Extensions]タブから、[Install from URL]に
https://github.com/liasece/sd-webui-train-tools
を入力して[Install]ボタンを押すと、このURLのGitHubからダウンロードされ「extensions」フォルダに入ります。
[Installed]タブからも、インストールされていることが確認できるはずです。

しかしそのままでは動かないので、[Apply and restart UI]ボタンは押さずに、Stable Diffusion Web UIを終了させてリソースの修正をかけます。

### numpyのダウングレード
numpy 1.24.2　リリース日: 2023年2月6日
を適用します。
`pip uninstall numpy`
`pip install numpy=1.24.2`

### 修正(1)
（参考: https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11312427706 ）
sd-webui-train-toolsフォルダの中にある
requirements.txtを編集して、「huggingface-hub」に
バージョンを追記する
```plaintext
huggingface-hub==0.25.2
```

### 修正(2)
（参考: https://fedor-hidor.blog.jp/archives/26127416.html ）
stable-diffusion-webui\modules フォルダの中にある
sd_models.py　721～730行目を次のとおり修正
```python
    #try:
    #    with sd_disable_initialization.DisableInitialization(disable_clip=clip_is_included_into_sd or shared.cmd_opts.do_not_download_clip):
    #        with sd_disable_initialization.InitializeOnMeta():
    #            sd_model = instantiate_from_config(sd_config.model)
    #
    #except Exception as e:
    #    errors.display(e, "creating model quickly", full_traceback=True)

    if sd_model is None:
        #print('Failed to create model quickly; will retry using slow method.', file=sys.stderr)
        print('Creating model using slow method.', file=sys.stderr)
```

### 修正(3)
（参考: https://github.com/Mikubill/sd-webui-controlnet/issues/2136 ）
stable-diffusion-webui\venv\Lib\site-packages\gradio フォルダの中にある
blocks.py　286行目
```python:修正前
            "inputs": [block._id for block in inputs],
```

```python:修正後
            "inputs": [block._id for block in inputs if block is not None],
```

これで、webui-user.bat から Stable Diffusion Web UI を起動すると、無事「Train Tools」タブが増えています。

※ 過去の他の解説ページの方法が現在ではうまくいかなくなっているのと同様、この方法もいずれ時がたつにつれダメになるかもしれません。
個人的備忘録：SLAの基本要素を整理してみた（スクールハッカソン用サンプル）

## はじめに

受講しているITスクールのハッカソンで挑戦してみたいと思ったため、個人的な備忘録としてとりあえず作成してみました。

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

---

**参考にした文献**

https://www.sysadmingroup.jp/wp/wp-content/uploads/2007/12/2ce263e9a0536d62d74e974c070e3b36.pdf

https://qiita.com/syantien/items/0da42ce3c9b17d3ab08e

https://www.crew-sys.com/wp-content/uploads/2023/01/term_b2.pdf

https://clickup.com/ja/blog/193559/sla-project-management

## 対象範囲
本SLAは、以下のサービスを対象とします。

- システム名：【システム名】
- 提供サービス内容：【例：Webアプリケーションの提供、データベース運用、障害対応等】

---

## サービス提供時間

| 項目 | 内容 |
|:---|:---|
| 提供時間 | 年中無休（計画メンテナンス時間を除く） |
| 計画メンテナンス | 通知後、実施。原則、事前に【営業日前】に案内 |

---

## 可用性（稼働率）
本サービスの可用性（稼働率）の目標値は以下のとおりです。

- 月間稼働率目標：**高水準以上**

### 稼働率算出方法

![Screenshot 2025-04-28 at 20.42.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/17e92b46-237c-4350-baed-826f0dab0707.png)

※ダウンタイム：システム利用不可状態を指す。
ただし、以下は除外とします。
- 計画メンテナンス時間
- 利用者側の過失や要因による障害
- 災害等不可抗力による障害

---

## インシデント対応

### 優先度と対応目安

| 優先度 | 例 | 初動対応時間 | 完了目標時間 |
|:---|:---|:---|:---|
| 緊急（P1） | システム全停止、重大なデータ損失 | 迅速対応 | 早期復旧 |
| 高（P2） | 一部システム機能停止、回避策無 | 迅速対応 | 営業時間内復旧 |
| 中（P3） | 軽微な不具合、回避策あり | 通常対応 | 翌営業日対応 |
| 低（P4） | 問い合わせ、改善要望 | 営業日対応 | 順次対応 |

---

## 通知・連絡手段

- 障害連絡先：【メールアドレス、電話番号】
- 通知方法：メール／電話
- 連絡可能時間：24時間対応（※緊急時以外は営業時間内）

---

## レポーティング

月次レポートとして以下を提出します。
- 稼働率報告
- 障害・インシデント発生状況
- 改善施策提案（必要に応じて）

---

## 免責事項

以下の場合はSLAの対象外とします。
- 自然災害、テロ行為、戦争、停電などの不可抗力
- 利用者側のシステム環境・通信設備に起因する障害
- 提供者が事前に通知した計画停止

---

## まとめ
本テンプレートは、システム運用におけるサービス水準を明確にし、関係者間での認識を揃えることを目的としています。

:::note warn
***実際の運用に際しては、必要に応じて具体的な条件を加筆・修正し、現場に即した形にブラッシュアップする必要があります。***
:::

あくまで、サンプルで作成したみただけとなります...。
【3分クラスタ講座②】スプリットブレインってなに？

##  目的
スプリットブレインを、クラスタ初心者に向けてざっくり説明することを目的としています。

---

##  この記事でわかること

- スプリットブレインとは何か
- スプリットブレインへの対策

---

##  スプリットブレインってなに？

前回、Corosyncがハートビートによりお互いの生存確認をしていると説明しましたが、
障害によってはこのハートビートのみが障害を起こす場合があります。

２ノード構成で通常時はNode1でリソースが起動しているAcitve/Standbyのクラスタ構成で考えてみます。
<br>

![クラスタ正常時](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56869/d75c9ea8-959b-4428-bdf6-7e00be87db53.png)

<br>


ハートビート通信でお互いに正常であることが確認できているため、何も起きません。
しかし、ハートビート通信のみ障害が起きた場合は以下のような状況になります。
<br>

![ハートビート障害時](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56869/ae6ea337-0556-498a-bef8-8499329f81fb.png)

<br>

両ノードともに自身は正常だけどもう１台のノードが死んだと勘違いします。
そのため、自身がクラスタの生き残りだと判断して、各自がクラスタを構成しようとします。
それがスプリットブレインです。
その際に、仮想IPが複数起動されることでIPアドレスが重複したり、DBを両ノードが起動してデータの整合性がおかしくなったりと問題が発生してしまいます。

##  どうやって防ぐ？
軽い感じで書きましたが、実際に発生したらとんでもない障害です。
そのため、クラスタや可用性を設計する際はかならずスプリットブレインを起こさないよう検討する必要があります。クラスタにはこれを回避する仕組みが存在します。


### クォーラムによる多数決
スプリットブレインを引き起こさない考え方としてクォーラム（多数決）があります。
クラスタの主導権を握るのは過半数以上のノードが存在する側で、主導権を握った側がリソースの起動ができるようにするというものです。

例えば3台のノードでクラスタを組んでいる場合を考えてみます。


![３台構成正常時](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56869/1a545dba-6da0-4c6d-a5d4-e370d606c54a.png)

この構成ではクォーラムを獲得するには２票必要になります。
<br>


この構成でNode3のハートビート通信に異常がおきたケースは以下のようになります。

![３台構成HB障害時](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56869/fcaffddf-bb4a-4df2-a167-0af4ba85c682.png)


障害が発生したノードは１票、それ以外の側が２票を持つため、２票側でのみクラスタが構成されスプリットブレインを回避できます。


#### 偶数台ノードでのクラスタ構成の注意

たとえば２台構成の場合、１台と１台にクラスタが分断されてしまい、どちらもクォーラム（過半数）をとれず、スプリットブレイン発生、もしくはクラスタ停止が発生してしまします。こういった場合はフェンシング（STONITH）と呼ばれるサーバの強制停止機能でリソースの多重起動を防ぐ手段やクォーラムサーバ等のクラスタ外部の存在を利用することで解決します。

## まとめ

* スプリットブレインは、ハートビート通信切断等によって発生するクラスタリソースの多重起動のこと
* クォーラム（多数決）によりクラスタのスプリットブレインを防ぐ
* 偶数台のクラスタ構成ではクォーラムの考えだけでは問題が発生するため、フェンシングや外部のクォーラムを利用することを検討する