OmniAICreator/Qiita-1.07M huggingface dataset:
VueのCSSのグローバル設定とスクロールバーのCSS

# VueのCSSのグローバル設定ファイル
プロジェクト名\src\index.css
```index.css
@tailwind base;
@tailwind components;
@tailwind utilities;


@layer base {
  
  }


  @layer utilities {
    /* カスタムスクロールバー */
    .custom-scrollbar::-webkit-scrollbar {
        width: 6px; /* スクロールバーの幅 */
        height: 6px; /* スクロールバーの高さ（横スクロール用） */
    }
    
    
    .custom-scrollbar::-webkit-scrollbar-track {
        background-color: rgba(0, 0, 0, 0.1); /* スクロールバーのトラック（背景） */
        border-radius: 20px;
    }

    .custom-scrollbar::-webkit-scrollbar-thumb {
        background-color: rgba(156, 163, 175, 0.5);
        border-radius: 20px;
    }

    
  }

```

# SideBar.vue
```SideBar.vue
<template>
  <aside class="w-full pr-2">

    <!-- リストの表示範囲を制限してスクロール可能にする -->
    <ul class="max-h-[calc(100dvh_-_300px)] overflow-y-auto bg-white shadow-md rounded-md custom-scrollbar">
      <li
        v-for="record in filteredRecords"
        :key="record.date_key"
        class="border-b border-gray-200 last:border-b-0 flex items-center cursor-pointer"
        :class="{
          'bg-blue-100': selectItemStore.nowSelectedItem_Kanri && 
                        selectItemStore.nowSelectedItem_Kanri.day_key === record.date_key,
          'hover:bg-gray-100': hoveredItem !== record,
          'hover:bg-blue-200': selectItemStore.nowSelectedItem_Kanri.day_key === record.date_key
        }"
        @click="handleClick(record)"
        @mouseover="hoveredItem = record"
        @mouseleave="hoveredItem = null"
      >
        <button class="block p-4 flex-1 text-left">
          {{ record.date_txt }}
        </button>
      </li>
    </ul>
  </aside>
</template>

<script>
import { ref, reactive, computed, watch, onMounted, toRefs, getCurrentInstance } from 'vue';
import { useRouter } from 'vue-router';
import { useSelectedRecordStore } from '../stores/selectedRecord';
import { useShareStore } from "../stores/useShareData.js";
import DatePicker_side_year from '../DatePicker/DatePicker_kanri_year.vue';
import DatePicker_side_month from '../DatePicker/DatePicker_kanri_month.vue';

export default {
  name: "SideBar",

  components: {
    DatePicker_side_year,
    DatePicker_side_month,
  },

  setup(props, { emit }) {


    return {
      Search_txt,
    };
  },
};
</script>
```

```SideBar.vue
<style scoped>


.custom-scrollbar::-webkit-scrollbar {
  width: 6px;
}

.custom-scrollbar::-webkit-scrollbar-track {
  /* background: transparent; */
  /* background: rgb(255, 255, 255); */
}

.custom-scrollbar::-webkit-scrollbar-thumb {
  background-color: rgba(156, 163, 175, 0.5);
  border-radius: 20px;
}


.custom-scrollbar::-webkit-scrollbar-thumb:hover {
  background-color: rgba(156, 163, 175, 0.5);
}
</style>
```

# スクロールバーのアクティブな範囲の色の変更
```
::-webkit-scrollbar-thumb
```
![scrollbar-props-1_856.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957418/c8a0606c-b7af-4557-a417-6c940dff6523.png)
【Next.js/React】daisyuiのコンポーネントが当たらない症状の解決方法について

# はじめに
Next.jsで開発中daisyuiのテーマカラーは当たっていましたが、cardコンポーネントが当たらない症状の解決につまずいたので記事にします。

「バージョン」
daisyui　5.0.38
tailwindcss　4.1.7

# 解決方法
.cssの記述をtailwind v4の記述に合わせる

```diff_css
-@tailwind base;
-@tailwind components;
-@tailwind utilities;
+@import "tailwindcss";

@plugin "daisyui" {
  themes: light --default, dark --prefersdark, lemonade;
}
```

# 参考
https://tailwindcss.com/docs/upgrade-guide#changes-from-v3

https://daisyui.com/docs/upgrade/


# おわりに
Next.jsのデフォルトでv3のtailwindcssがインストールされ、その後バージョンを上げましたが設定がそのままになっていたことによる不整合が原因になっておりました。

<br>


# JISOUのメンバー募集中！
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？
興味のある方は、ぜひホームページをのぞいてみてください！
▼▼▼

https://projisou.jp
DRF（Django REST framework）公式チュートリアルを日本語でまとめてみた【全6回】

## はじめに
この記事は、[DRF（Django REST framework）の公式チュートリアル](https://www.django-rest-framework.org/tutorial/1-serialization/)（全6回）を和訳＆解説したシリーズのまとめ記事です。

ぼくが DRF のチュートリアルで Web API を学んだとき、全6回を通して和訳された記事が見つからず、原文のまま読んで進めることになりました。
最近では ChatGPT などの生成AIを使えば、わかりやすい訳を出してくれるので便利なんですが、毎回コピペして翻訳させるのも意外と手間だったりします。

そこで今回、同じように「DRF のチュートリアルを無料でやってみたいけど、英語がちょっと苦手……」という方の助けになればと思い、この和訳シリーズを書きました。

※記事内のコードや内容は、[Django REST framework](https://www.django-rest-framework.org/)によるオリジナルチュートリアルを元にしています。著作権は全てDRFの運営元に帰属します。

## 構成
本シリーズ（全6記事）の一覧は以下のとおりです。公式チュートリアルの各パートごとに、日本語で解説しています。

| 和訳記事(Qiita) | 原文チュートリアル | 学べること |
|:-:|:-:|:-:|
| [チュートリアル①：Serialization](https://qiita.com/yutty-kov/items/b028848c0bf62a9fd1a0) | [Tutorial 1: Serialization](https://www.django-rest-framework.org/tutorial/1-serialization/) |モデル → JSON に変換（シリアライザの基本）|
| [チュートリアル②：Requests and Responses](https://qiita.com/yutty-kov/items/f5c33b15f6a7fdacf4ef) | [Tutorial 2: Requests and Responses](https://www.django-rest-framework.org/tutorial/2-requests-and-responses/) | APIとしての基本的なリクエスト・レスポンス処理|
| [チュートリアル③：Class-based Views](https://qiita.com/yutty-kov/items/b320e75411f3fc984b82) | [Tutorial 3: Class-based Views](https://www.django-rest-framework.org/tutorial/3-class-based-views/) |クラスベースビューでAPIを書く方法|
| [チュートリアル④：Authentication & Permissions](https://qiita.com/yutty-kov/items/2ddd38f4cbc4eb4ec00f) | [Tutorial 4: Authentication & Permissions](https://www.django-rest-framework.org/tutorial/4-authentication-and-permissions/) | 認証とアクセス制限の設定 |
| [チュートリアル⑤：Relationships & Hyperlinked APIs](https://qiita.com/yutty-kov/items/2ffd0099157246ae1f64) | [Tutorial 5: Relationships & Hyperlinked APIs](https://www.django-rest-framework.org/tutorial/5-relationships-and-hyperlinked-apis/) | 関連データとハイパーリンク型APIの作り方 |
| [チュートリアル⑥：ViewSets & Routers](https://qiita.com/yutty-kov/items/6109161a308eb645467e) | [Tutorial 6: ViewSets & Routers](https://www.django-rest-framework.org/tutorial/6-viewsets-and-routers/) | ViewSetとRouterでコードを簡潔にする方法 |
AIに質問するにも注意が必要

案外融通が利かなかった。（ExcelでSUMすればいいだけだが）
渡す値やフォーマットは揃っていないと期待した回答を得られなかった。

＜質問＞
```
以下の値の総計を教えて
8.0	8.0			8.0	8.0	8.0	8.0	8.0			8.0	8.0	8.0	8.0	8.0			8.0	8.0	8.0
```
■Feloの回答
```
与えられた値の総計を計算します。値はすべて8.0で、合計は次のように計算されます。
与えられた値のリストは以下の通りです：
8.0, 8.0, 8.0, 8.0, 8.0, 8.0, 8.0, 8.0, 8.0, 8.0, 8.0, 8.0, 8.0, 8.0, 8.0, 8.0
このリストには16個の8.0があります。したがって、総計は次のように計算されます：
8.0×16=128.08.0 \times 16 = 128.08.0×16=128.0
したがって、与えられた値の総計は128.0です。
```
■ChatGPTの回答
```
与えられた数値はすべて 8.0 で、空白は無視して合計を出します。
数値の数を数えると、17個の 8.0 があります。
計算：8.0 × 17 = 136.0
総計は 136.0 です。
```
■DeepSeekの回答
```
与えられた値の総計を計算します。
値のリスト:
8.0, 8.0, 8.0, 8.0, 8.0, 8.0, 8.0, 8.0, 8.0, 8.0, 8.0, 8.0, 8.0, 8.0
これらの値の個数を数えると、全部で14個あります。
総計 = 8.0 × 14 = 112.0
したがって、総計は112.0です。
```
Google Auth Platform クライアントの設定を検証するためのテストユーザーを追加する

## 概要

Google Auth PlatformのOAuthのクライアントにて動作確認のためのテストユーザーを追加する方法を簡単にまとめる。

## 前提

下記に準ずる内容でクライアントが登録できていること。

https://qiita.com/miriwo/items/9485f897045681f820bc

※おそらく自身のアカウントのみデフォルトでテストユーザーに登録されている。

## 方法

1. Google Cloud → APIとサービス → サイドバーの「OAuth同意画面」 → サイドバーの「クライアント」をクリック
1. クライアント一覧からテストユーザーを追加したいクライアント名をクリック
1. サイドバーの「対象」をクリック
1. 「テストユーザー」の`+ Add users`をクリック

    ![CleanShot 2025-05-28 at 17.07.45@2x.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/7bae6ed8-d3c5-49d9-a9a8-18da2b50306a.jpeg)

1. テストユーザーとして追加したいGoogleアカウント、もしくはGoogleグループを指定して「保存」をクリック

    ![CleanShot 2025-05-28 at 17.08.25@2x.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/f8833c7e-62d5-42d3-95ca-12fa04464e4e.jpeg)
アプリからメールを送信する仕組みを理解する

## はじめに

Webアプリでユーザーに認証メールや通知メールを送信したい場合、「メールを送る仕組み」が必要になる。しかし、「メールサーバーとは何か？」「Postfixとは何か？」「Gmailを使うにはどうするのか？」といった基本を理解していなかったため、今回はその基本から仕組みを整理する。


---

## アプリからメールを送るには？

アプリからユーザーにメールを送るためには、次のような流れが必要。

1. アプリから、メール送信を代わりにやってくれる「送信用サーバー（SMTPサーバー）」にデータを渡す
2. 送信用サーバーが、宛先の「受信用メールサーバー」にメールを届ける

---

## Postfixとは？

Postfixは、メールを送るためのサーバーソフトウェアで、Linux（Ubuntuなど）にインストールして使う。役割としては、アプリから受け取ったメールを一時的にキューに保存し、SMTPというプロトコルを使って次の送信先へ転送する。

つまり、Postfixは「メールを外に送り出すための中継役」。

---

## GmailのSMTPサーバーとは？

Gmailには `smtp.gmail.com` というSMTPサーバーが存在する。これは、Googleが運用しているメール送信用のサーバーで、Gmailユーザーがメールを送信するために使用される。

Postfixからこのサーバーに接続して、認証情報（ユーザー名・パスワード）を渡すことで、Gmail経由でメールを送信できる。

---

## 実際の流れを整理する

次のような構成を考える。

```
[アプリ]
  ↓ SMTPで送信依頼
[Postfix（Ubuntuにインストール）]
  ↓ SMTPリレー
[smtp.gmail.com（GmailのSMTPサーバー）]
  ↓ DNSで相手ドメインのMXレコードを調査
[相手の受信用メールサーバー]
  ↓
[相手が受信して読む]
```

この流れにより、アプリはPostfixに送信を任せ、Postfixは信頼されたGmailにリレーし、Gmailが最終的な配信を担う。

---

## まとめ

* メール送信には、SMTPというプロトコルを使って送信用サーバーに接続する必要がある
* Postfixは、Ubuntuなどに導入して使う自前のメール送信サーバー
* GmailなどのSMTPサーバーを中継先として使うことで、信頼性が高まる
* メールは、送信側のSMTPサーバーから、宛先の「受信用メールサーバー」へ送られる
nginx loadbalancer

```conf
upstream backend_web_servers {
  server 1.1.1.1:80;
  server 2.2.2.2:80;
  server 3.3.3.3:80;
}

server {
  listen 80;
  server_name abc.example.com;

  # 定义针对所有请求的 Location 块
  location / {
    proxy_pass http://backend_web_servers;

    # 保持原始客户端 IP 和 Host 头
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}
```

```conf
upstream backend_web_servers {
  # round_robin (默认): 轮询。
  # 请求按顺序分配给每个服务器。这是默认行为，无需显式指定。
  server 1.1.1.1:80;
  server 2.2.2.:80;
  server 3.3.3.3:80;
}

upstream backend_web_servers {
    server 1.1.1.1:80 weight=3; # 获得 3 倍的请求
    server 2.2.2.2:80 weight=1;
    server 3.3.3.3:80 weight=1;
}

upstream backend_web_servers {
    # backup (备用服务器): 当所有主服务器都不可用时，请求才会被发送到标记为 backup 的服务器
    server 1.1.1.1:80;
    server 2.2.2.2:80;
    server 3.3.3.3:80 backup; # 作为备用服务器
}

upstream backend_web_servers {
    server 1.1.1.1:80 down; # 暂时禁用
    server 2.2.2.2:80;
}

upstream backend_web_servers {
    # least_conn (最少连接): 将新请求发送到当前活动连接数最少的服务器。适用于连接时间可能不等的场景。
    least_conn;
    server 1.1.1.1:80;
    server 2.2.2.2:80;
    server 3.3.3.3:80;
}

upstream backend_web_servers {
  # ip_hash (IP 哈希): 根据客户端的 IP 地址进行哈希计算，并将请求发送到同一个服务器。
  # 这有助于实现会话持久性（Session Affinity），确保来自同一客户端的请求始终路由到同一后端服务器。
    ip_hash;
    server 1.1.1.1:80;
    server 2.2.2.2:80;
    server 3.3.3.3:80;
}

upstream backend_web_servers {
  # random (随机 - Nginx 1.9.0+): 随机选择服务器。
    random;
    server 1.1.1.1:80;
    server 2.2.2.2:80;
    server 3.3.3.3:80;
}

upstream backend_web_servers {
    hash $request_uri consistent; # 基于请求URI进行哈希
    # hash key [consistent] (通用哈希 - Nginx 1.7.9+): 允许你基于任意键（例如 URL、请求头等）进行哈希。
    # consistent 参数用于实现一致性哈希，减少后端服务器变化时的缓存失效。
    server 1.1.1.1:80;
    server 2.2.2.2:80;
    server 3.3.3.3:80;
}

upstream backend_web_servers {
    # max_fails=N 和 fail_timeout=Xs (健康检查): Nginx 可以对后端服务器进行简单的健康检查。
    # 如果服务器在 fail_timeout 时间内连续失败 max_fails 次，则认为该服务器不健康，暂时不会再将请求转发给它。
    server 1.1.1.1:80 max_fails=3 fail_timeout=30s; # 30 秒内失败 3 次就标记为不健康
    server 2.2.2.2:80;
    server 3.3.3.3:80;
}

```
Filter , Sort, Mapの使い方をまとめてみました　Swift 言語（初心者向け🔰）

Swiftには配列をカンタンに操作できる便利なメソッドがたくさんあります。
中でも超よく使うのがこの3つ👇

- filter（絞り込み）

- sort（並び替え）

- map（変換）

この記事では、Swift初心者の方に向けて解説します！

filter（条件で絞り込み）
---
使い方：
配列の中から、条件に合う要素だけを取り出す

```swift 
//偶数だけの要素を絞り出したい時
let numbers = [1, 2, 3, 4, 5, 6]
let evenNumbers = numbers.filter { $0 % 2 == 0 }
//出力 → [2, 4, 6]
```

$0は配列の要素を表す（1つずつ順番に）
条件に当てはまるの要素だけ残る

sort（並び替え）
---
使い方：
配列の要素を昇順や降順に並べ替える


```swift
let numbers = [3, 1, 5, 2, 4]

//順番に並べたい時
let sortedAsc = numbers.sorted()
// → [1, 2, 3, 4, 5]

//逆順番に並べたい時
let sortedDesc = numbers.sorted(by: >)
// → [5, 4, 3, 2, 1]
```

map（変換）
---
使い方：
配列の各要素を変換して、新しい配列を作る

```swift 
// それぞれのnumbersに２を掛けたい時
let numbers = [1, 2, 3]
let doubled = numbers.map { $0 * 2 }   
// → [2, 4, 6]
```
元の配列を1つずつ加工して新しい配列に
変換内容は自由（文字列でも、構造体でもOK）


実践例：3つを組み合わせて使う
--

```swift
let scores = [20, 60, 90, 40, 75]

// 50点以上のスコアだけ取り出し、降順に並べ、"点"をつける
let result = scores
    .filter { $0 >= 50 }      // [60, 90, 75]
    .sorted(by: >)            // [90, 75, 60]
    .map { "\($0)点" }         // ["90点", "75点", "60点"]
```

まとめ
---
| メソッド     | 意味   | 使いどころ          |
| -------- | ---- | -------------- |
| `filter` | 絞り込み | 条件に合うものだけ取り出す  |
| `sort`   | 並び替え | 昇順 or 降順にしたいとき |
| `map`    | 変換   | 要素を加工・変換したいとき  |

 Filter , Sort, Mapの使い方を初心者向けにまとめてみました! 
 最初は難しく感じることもあるかもしれないのですが、playground等で練習を繰り返すと必ず慣れてきます！
 アプリ開発でも使えるのでぜひ使ってみてください！🙌
🌳 デンドログラムってなに？中学生でも分かるようにわかりやすく解説！


こんにちは！中学生でも分かるようにわかりやすくAIやデータサイエンスの用語を解説するシリーズ！

今日は「デンドログラム」という、ちょっと不思議な名前のグラフについて、中学生でもわかるようにやさしく説明します。

「デンドログラム」は、AIやデータ分析の世界でよく使われる**グループ分け（クラスタリング）を見える化した図**です。でも、難しく考えなくて大丈夫！  
木の形をした図を見ながら、友達グループを分けるイメージで理解してみましょう！

---

## 👨‍👩‍👧‍👦 データの「仲良しグループ」を見つける！

まず、「クラスタリング」って言葉を聞いたことはありますか？  
これは、**似ているもの同士をグループに分けること**です。

たとえば、学校のクラスの中で、

- サッカーが好きな人  
- アニメが好きな人  
- 勉強が得意な人  

こんなふうに**共通点でグループを作る**ことってありますよね？  
AIやコンピュータも、データを見て「この人とこの人は似ているな〜」と感じたら、同じグループにまとめてくれます。

---

## 🌳 デンドログラムは「仲良しグループの木」

![デンドログラム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508733/a365a84c-0b03-492c-b734-10757fe5e30d.png)

デンドログラムは、そんな**グループ分けを「木の形」で見えるようにした図**です。

### ▼ イメージしてみよう

1. 最初は、すべての人がバラバラ。  
2. 似ている2人を線でつなげて「ミニグループ」を作る。  
3. ミニグループ同士をさらにつなげて、少し大きいグループに。  
4. 最後は、全員がひとつの大きな木のようにつながる。  

このように、デンドログラムは**木の枝のように、だんだんつながっていくグループ分けの様子**を表しています。

---

## 🧠 実際に使う場面って？

デンドログラムは、AIやデータサイエンスの世界でいろいろな場面で使われます。

### 💡 たとえば：

- 商品のおすすめ機能で、「似たような買い物をする人」を見つけたいとき  
- 動物や植物を「種類別」に分けるとき  
- テストの点数で、「似た傾向の成績の生徒」を分けるとき  

など、**「似ているもの同士を見つける」場面で大活躍**です！

---

## 🔍 どうやって作るの？

デンドログラムを作るには、まず「どれくらい似ているか」を数値で比べます。

たとえば、

| 名前 | 国語の点数 | 数学の点数 |
|------|------------|------------|
| Aくん | 80点       | 60点       |
| Bさん | 82点       | 62点       |
| Cくん | 40点       | 90点       |

このようなデータをもとに、「AくんとBさんは似てるな」「Cくんはちょっとちがうな」といった距離を計算して、線でつないでいきます。

この作業を「階層的クラスタリング（かいそうてきクラスタリング）」といって、コンピュータが自動でやってくれます！

---

## ✅ まとめ

| 用語             | 意味                                             |
|------------------|--------------------------------------------------|
| クラスタリング   | 似ているものをグループに分けること               |
| デンドログラム   | グループ分けの様子を木の形で見せてくれる図       |
| 使いみち         | AIの分析、動物の分類、ユーザーの傾向チェックなど |

---

## 🌟 おわりに：デンドログラムは「見える化の天才」

難しそうに見える「デンドログラム」も、身近な友達グループのように考えるとわかりやすいですね。

「似ている人をまとめる」→「つながりを木で表す」→「パッと見て分かりやすい！」  
そんな便利な図が、デンドログラムです。
AWS Security - Specialty(SCS-C02) 合格体験記

# 0.はじめに

前回の記事に引き続き、AWSの認定資格の、Security Specialtyを取得した際の事について記事にしたいと思います。

# 1.試験概要

試験にあたっての概要は以下のページにまとまっています。

https://aws.amazon.com/jp/certification/certified-security-specialty/

- 試験時間：179分
- 試験の形態：65個の問題(複数選択または複数応答のいずれか)
- 料金：300USD(税込み44000円)

# 2.学習期間

勉強期間は3週間でした。
SOAを5/4に取得したのですが、この時点で上位資格を取ることを目標にしていました。
ネットワークは苦手なので、SAPとSCSどちらを取ろうか考えたのですが、6月末の契約更新で現場を抜けようと考えていたため、5月の営業がかかる前に資格を取りたく範囲が狭そうなSCSを優先して取得することにしました。

# 4.学習方法と試験当日の流れ
SOAと同様にCloudTechを利用することにしました。

https://kws-cloud-tech.com/

書籍は「AWS認定 セキュリティ-専門知識　改訂2版　要点整理から攻略する」を購入しました。
本書は解説もわかりやすく、CloudTechと組み合わせ知識を補えたので買ってよかったです。

https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A-%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3-%E5%B0%82%E9%96%80%E7%9F%A5%E8%AD%98-%E6%94%B9%E8%A8%822%E7%89%88-%E8%A6%81%E7%82%B9%E6%95%B4%E7%90%86%E3%81%8B%E3%82%89%E6%94%BB%E7%95%A5%E3%81%99%E3%82%8B-%E4%B8%8A%E9%87%8E-%E5%8F%B2%E7%91%9B-ebook/dp/B0DCFC14PM/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=3PF4UOHD6QA9P&dib=eyJ2IjoiMSJ9.jJB2LsoOU-e3V661ItSWU9017PYq0ruXC2QNJuDEpN_GjHj071QN20LucGBJIEps.EQrOIcWyWOrQ8b4mKSDARZmWsoIcA5sWBiFqulvfKU0&dib_tag=se&keywords=%E8%A6%81%E7%82%B9%E6%95%B4%E7%90%86%E3%81%8B%E3%82%89%E6%94%BB%E7%95%A5%E3%81%99%E3%82%8B%E3%80%8EAWS%E8%AA%8D%E5%AE%9A+%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3-%E5%B0%82%E9%96%80%E7%9F%A5%E8%AD%98%E3%80%8F&qid=1748418216&sprefix=%E8%A6%81%E7%82%B9%E6%95%B4%E7%90%86%E3%81%8B%E3%82%89%E6%94%BB%E7%95%A5%E3%81%99%E3%82%8B+aws%E8%AA%8D%E5%AE%9A+%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3-%E5%B0%82%E9%96%80%E7%9F%A5%E8%AD%98+%2Caps%2C161&sr=8-1

SOAと同様にひたすら10問単位で問題を解き、間違ったところはブックマーク&すぐに反復しながら解きなおし、全問正解できれば次に行くとし、2周(反復の解きなおし含め1周カウント)しました。

SCSはCloudTechの中でも問題数が多く、約400問用意されていました。
これらを3週間で2周するのはさすがに大変でした。

解いてて感じたのですが、SOAと比べると解説がかなり適当な物も多く、個人的にはもう少し解説を丁寧にして欲しいです。

試験当日は、見直し含め大体110分くらいで試験完了しました。
やはり1問あたりの時間などもかかり大変でした。

# 6. 試験結果と受けた感想

こちらも結果は無事合格でした。
勉強した成果が出たのか、一番点数が高くびっくりしました。

こちらも試験実施日の20時過ぎに合格のメールが来てました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566232/eb16e975-49f1-4dcf-90d3-d7f4aca05722.png)

SOAと同じくCloudTechからも似たような問題も何問か出ていました。

# 7. まとめ
実際の業務においてセキュリティは試験知識だけで何とかなる事は少ないと思います。
ただ、今回この試験を通じて体系的にセキュリティについて学ぶことができ良かったです。
個人的にセキュリティは昨今最も重視されており、腐りにくいスキルだと思っているので、今後も継続的にセキュリティの知識は強化したいなと思います。

次はSAPの前にサクッと取れそうなDVAを予定しています。

**サマリ**

| 受験日 | 資格名称 | スコア | 結果 |
|:-----------|------------:|:------------:|:-----------|
| 2025/02/25     | CLF-C02        | 749         | 合格         |
| 2025/04/26     | SAA-C03        | 796         | 合格         |
| 2025/05/04     | SOA-C02        | 789         | 合格         |
| 2025/05/25     | SCS-C02        | 819         | 合格         |

**個人的難易度**
| 順位 | 資格名称 | 一言メモ |
|:-----------|------------:|:------------:|
| 1位     | SCS-C02        | 問題そのものの難易度が高いというより長文、読解力、集中力の勝負         |
| 2位     | SAA-C03        | とにかく範囲が広く覚える量が多い         |
| 3位     | CLF-C02        | CLF特有の範囲と知識が難しい         |
| 4位     | SOA-C02        | 記述することが無いくらい印象にないかな～         |
【Django】AWS S3 ファイルアップロード

# 環境
Django　4.2.18
Python　3.8.10

# はじめに
AWS利用のための事前準備をします。

- AWSにサインアップする（ルートユーザーの作成）
- IAMユーザーを作成する
- （ルートユーザーで）グループを作りポリシーに AdministratorAccess を設定する

AWSの１年間無料枠を使用しました。


# Amazon S3のバケットを準備する
AWSにIAMユーザーでログインします。

S3＞バケットを作成＞アプリ名など任意の名前（ただし一意の値）＞他はデフォルトのまま＞作成


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784177/1b39551a-7aa5-4a67-9768-e054b0a9f7d1.png)
バケットとは、Amazon S3でのフォルダのようなもの。

バケット名（BUCKET_NAME）　は一意の値。ここでは'issue-management0'とします。

# DjangoからAmazon S3に接続する

require.txtに以下を追記して保存
```diff_python: 
django-storages==1.14.6
boto3==1.26.0
```
最新バージョンはここで調べます。
https://pypi.org/project/django-storages/

インストール実行
```
pip install -r requirements.txt
```

:::note info
最新バージョンでインストールに失敗する場合は、古いバージョンで試します。
:::



# Django settings.pyの変更

```diff_python:  settings.py
""" 添付ファイルの設定 """
MEDIA_URL = '/media/'
# DEBUG = Trueの時はローカルに保存する
if DEBUG:
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
else:
    # AWS S3の設定
    DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
    AWS_STORAGE_BUCKET_NAME = 'issue-management0'
    AWS_S3_REGION_NAME = 'ap-northeast-1'

    AWS_ACCESS_KEY_ID = env('AWS_ACCESS_KEY_ID')
    AWS_SECRET_ACCESS_KEY = env('AWS_SECRET_ACCESS_KEY')
```

フォルダ構成はこうです。
（mediaフォルダも.gitignoreに入れています。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784177/9da337f2-005d-4f2e-8590-b37f4c86e806.png)


# AWSのアクセスキーID、シークレットアクセスキーを発行する

IAMユーザーでログインします。
IAM＞ユーザー＞（あなたのユーザー名）＞アクセスキーを作成＞ローカルコードを選択＞次へ＞説明タグを設定（英語のみ）＞アクセスキーを作成

これでアクセスキーID、シークレットアクセスキーが作成できました。


# 環境変数に書く
アプリに設定します。
重要な情報なので、直接コードに書かず環境変数に入れます。
```diff_python:  .env 
# AWSの設定
AWS_ACCESS_KEY_ID=****** # あなたのID
AWS_SECRET_ACCESS_KEY=****** # あなたのアクセスキー
```



# Amazon S3にファイルを登録する

まずローカルでrunserver して画像アップロードを試します。
試すときは、一時的に settings.py　で　if → if not にして試します。（True/False を反対にしています）

```diff_python:  settings.py
""" 添付ファイルの設定 """
MEDIA_URL = '/media/'
# DEBUG = Trueの時はローカルに保存する
- if DEBUG:
+ if not DEBUG:
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
else:
    # AWS S3の設定
    DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
    AWS_STORAGE_BUCKET_NAME = 'issue-management0'
    AWS_S3_REGION_NAME = 'ap-northeast-1'

    AWS_ACCESS_KEY_ID = env('AWS_ACCESS_KEY_ID')
    AWS_SECRET_ACCESS_KEY = env('AWS_SECRET_ACCESS_KEY')
```


アップロードファイルのアドレス欄にawsが表示されます。
また、Amazon S3＞バケット＞（バケット名）を見ると画像が登録されています。

:::note info
テスト後、本番環境にアップする前、
if → if not にして試したコードを元に戻しておきましょう。
:::

# 本番環境にデプロイ

render にデプロイして本番環境で登録しました。


下記の種類を試し、アップロードできました。
[".txt", ".pdf", ".docx", ".xlsx", ".png", ".jpg", ".jpeg"]
".docx", ".xlsx" はPCにダウンロードされました。※ブラウザ（Chrome）の仕様かもしれません。





:::note warn
注意
アプリ上で画像を削除すると、バケットの中身も削除されます。
:::

# 参考
こちらを参考にさせていただきました。


https://note.com/daikinishimatsu/n/na8375727b701#SwRf4

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/create-bucket-overview.html
Variables（変数）と Constants（定数）の使い方をまとめみました。（Swift初心者向け)

Swiftでプログラミングを始めると、最初に出てくるのが「変数（Variable）」と「定数（Constant）」です。
これはデータを保存・再利用するための基本中の基本！

この記事では、初心者向けに違いや使い方をやさしく解説します🔰


1.変数（Variable）とは？
--
💡 一言でいうと：
あとから値を変えられる箱！

```swift
var age = 24
age = 25 
```

ポイントとしては
- varキーワードを使う
- 途中で別の値に変更できる
- よく「変化するデータ」に使う

例えば
スコア、カウント、年齢名など


2.定数（Constant）とは？
---
💡 一言でいうと：
あとから変えられない箱！

```swift
let birthYear = 2000
birthYear = 1995 // ❌ エラー！変更できない
```
- letキーワードを使う

- 一度値を入れたら変更できない

- 絶対に変わらないデータ」に使う

よくある使い道

誕生日や固定の情報

 変数 vs 定数：違いを比較！
 --
| 比較項目      | 変数（var）     | 定数（let）  |
| --------- | ----------- | -------- |
| 値の変更      | できる ✅       | できない ❌   |
| キーワード     | `var`       | `let`    |
| 使いどころ     | 状態が変わるデータ   | 固定されたデータ |
| バグの起こりにくさ | やや起こりやすい ⚠️ | 起こりにくい ✅ |



おまけ：型（Type）を明示する方法（オプション）
---
Swiftは自動で型を推測してくれますが、はっきり指定することもできます。

```swift
var age: Int = 25
let name: String = "Hanako"
```

主な型：
String → 文字列（例: "Hello")

Int → 整数（例: 42）

Double → 小数（例: 3.14）

Bool → true / false（論理値）

----
| ポイントまとめ                                    |
| ------------------------------------------ |
|  `var` → 値を変えたいときに使う                     |
|  `let` → 一度決めたら変えない値に使う                  |
| 基本は `let` を使って、必要なときだけ `var` にするのがオススメ！ |
| 型を指定するとコードが読みやすくなる                      |

まとめ
---
Variables（変数）と Constants（定数）の使い方をまとめみました。ぜひ参考にしてみてください！✌️
VMwareとは

## 初めに
こんにちは！

今回は、仮想環境の構築に欠かせない「VMware」について、基本的な用語や概要をまとめてみました。
エンジニアとして業務を進める中で、検証環境を用意するために仮想環境を構築する機会は多いかと思います。
そんなときによく登場するのがVMwareです。VM~と名前が似ててわかりにくいですよね。。
本記事では、現場でよく耳にするVMware関連の用語を中心に、初学者の方にもわかりやすく解説していきます。
「VMwareってよく聞くけど、実際どんなもの？」という疑問をお持ちの方の参考になれば幸いです。

あくまでも初心者エンジニアのメモ程度で書いておりますのでご承知おきを～

# VMwareとは
vSphereとは、VMware者が提供する仮想化プラットフォームの製品群の総称です。
簡単にいうと、仮想サーバを作ったり、管理したりするためのツールセットです。
これを使えば、物理サーバ上に複数の仮想マシンを簡単に構築・運用することができます。
vSphereを使って仮想化を行うには、仮想マシンを動かすだけでなく、それを管理・操作するための複数のコンポーネントが必要です。


# vSphereを構成する主なコンポーネント
vSphereを使って仮想化を行うには、仮想マシンを動かすだけでなく、それを"管理・操作するための複数のコンポーネント(部品)が必要です。"
代表的なものは以下の4つです。

### ESXi(イーエスエックスアイ)
ESXiとは、仮想化を実現するための「ハイパーバイザー」と呼ばれるソフトウェアです。
Vmware vSphere のコンポーネントの中でも最も中心的な存在であり、物理サーバの上で仮想マシンを動かす「土台」のような役割を果たします。


### vCenter Server (ブイセンターサーバー)
vCenter Serverとは、仮想化監視サーバです。
Vmware vSphere のコンポーネントの中でも管理の中枢を担う存在であり、複数のESXiホストや仮想マシンを一元的に管理・制御する「司令塔」のような役割を果たします。
vCenterを使うことで、仮想マシンの作成・移動・監視・バックアップなど、さまざまな操作を効率よく実施することが可能になる。


### vSphere Client
vSphere Clientとは、vCenter Server に接続して操作を行うためのデスクトップアプリケーションです。
Windows環境で利用されることが多く、GUIで直感的に仮想環境を操作できるツールです。


### vSphere Web Client
vSphere Web Clientとは、Webブラウザを使用して、vCenter Serverにアクセスし、仮想環境を操作できるWebベースの管理ツールです。
インストール不要で、どこからでもアクセスできるのが特徴です。


## vCenter Serverの主な機能

### vSphere HA（High Availability）
サーバーに障害が発生したとき、自動的に仮想マシンを別の正常なホストに再起動してくれる機能です。システムの停止時間を最小限に抑えられます。

### DRS（Distributed Resource Scheduler）
仮想マシンの負荷を自動的に分散して、リソース（CPUやメモリ）を効率よく使う機能です。パフォーマンスの最適化に役立ちます。

### vMotion
仮想マシンを停止せずに、別のESXiホストへ「ライブ移動」できる機能です。メンテナンス時や負荷分散に便利です。

## まとめ
vSphereは、VMware社が提供する仮想化プラットフォームの総称で、仮想サーバーの構築・管理を行うためのツール群です。中心的なコンポーネントには、
仮想マシンを動かす「ESXi」、それらを一元管理する「vCenter Server」、
操作用の「vSphere Client」と「vSphere Web Client」があります。
これらが連携することで、効率的で柔軟な仮想環境の構築・運用が可能になります。
C++でドット記法を使う方法

C++でPythonやJavaScriptのようなドット記法を使いたくなりました。
そのためそうやって書く方法を書きます。
- - -
まず、クラスの書き方は
```
class クラス名{
private:
    変数名たち;
public:
    コンストラクタ;
    関数たち;
};
```
と書きます。
そして、main関数でクラスの関数を使うときは、
```
int main(){
    クラス名 変数名(aとします);
    a.関数名();

    return 0;
}
```
と書きます。
つまり、クラスを使えばPythonのようなドット記法ができます！
このやり方では、同じ関数を使ってもクラスが違えば正しく実行させるので自分の関数と元から作ってある関数を使い分けることができます。
# 余談
始めて書きましたが文章力がなさすぎて20行くらいしか書けませんでした。
AWS SysOps Administrator - Associate(SOA-C02) 合格体験記

# 0.はじめに

前回の記事に引き続き、AWSの認定資格の、SysOps Administrator Associateを取得した際の事について記事にしたいと思います。

# 1.試験概要

試験にあたっての概要は以下のページにまとまっています。

https://aws.amazon.com/jp/certification/certified-sysops-admin-associate/

- 試験時間：130分
- 試験の形態：65個の問題(複数選択または複数応答のいずれか)
- 料金：150USD(税込み22000円)

# 2.学習期間

勉強期間は約1週間でした。
SAAを4/26に取得したのですが、この時点で他の資格(SAPなど)を取得できると思いました。
順当にSAPを狙おうかとも考えたのですが、SAAをやっている中で実務含め運用系のサービスに少し弱い(わからないとかではなく単純に知識として知りたい)と思い、SOAを狙ってみることにしました。
GWは大きな用事もなくだらだら過ごすことが目に見えており、後述するCloudTechで試しに20問ほど解いてみたらいけそうだったので5/4に予約をしました。

# 4.学習方法と試験当日の流れ
CLF、SAAはUdemyを使用しましたが、SAAを受けた際に実際の問題とのずれが気になったのと、65問単位と1回の拘束が非常に長くCloudTechを利用することにしました。

https://kws-cloud-tech.com/

書籍は「AWS認定資格試験テキスト AWS認定SysOpsアドミニストレーター - アソシエイト AWS認定資格試験テキスト」を近くの本屋で購入しましたが、買って満足し中身はパラパラとしか見ていません。

https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-AWS%E8%AA%8D%E5%AE%9ASysOps%E3%82%A2%E3%83%89%E3%83%9F%E3%83%8B%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%BF%E3%83%BC-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88-NRI%E3%83%8D%E3%83%83%E3%83%88%E3%82%B3%E3%83%A0%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE/dp/481560908X/ref=sr_1_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2O0BDLA3JPSIM&dib=eyJ2IjoiMSJ9.8b-yCqjosHEictOWcJSYzraUUtDczw4oOBMMNsTpEvAIbJCRSy7XDYhVCScNfH46pHJ0UuH3slSUtffll7XSMmxyk_fZD7tPyNkU6_pL0uck11ZDHbWRbKuabjReLii1vez-8c-Y_v4nQTkBGLvCZg.Bg7Vu-W-zo6NhasE69MYMo6J8pFEZVWHuQrlQKLdPwE&dib_tag=se&keywords=soa-c02&qid=1748416952&sprefix=soa+c02%2Caps%2C253&sr=8-2

休みの期間、ひたすらCloudTechの問題を解き続けていました。
SOAは約230問用意されており、10問単位で区切られているため、隙間時間に勉強できよかったです。
また、問題の精度や回答も丁寧でわかりやすかったです。

基本的には10問単位で問題を解き、間違ったところはブックマーク&すぐに反復しながら解きなおし、全問正解できれば次に行くとやってました。
結果全体で2周(反復の解きなおし含め1周カウント)しました。

試験当日は、見直し含め大体60分くらいで試験完了しそのまま退室しました。

# 6. 試験結果と受けた感想

結果は無事合格でした。
自信はあったのですが思いのほか点数が低くびっくりしました。

こちらも試験実施日の20時過ぎに合格のメールが来てました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566232/bf1fdf78-add5-4d73-848a-b250b193ddc5.png)

CloudTechからも似たような問題も何問か出ていました。
解説などが丁寧だったので個人的にはCloudTechにしてよかったです。

# 7. まとめ
1週間という勢いで試験を受けましたが、個人的には今までで一番簡単に感じました。
点数がSAAよりも低く説得力が無いですが…。

**サマリ**

| 受験日 | 資格名称 | スコア | 結果 |
|:-----------|------------:|:------------:|:-----------|
| 2025/02/25     | CLF-C02        | 749         | 合格         |
| 2025/04/26     | SAA-C03        | 796         | 合格         |
| 2025/05/04     | SOA-C02        | 789         | 合格         |

**個人的難易度**
| 順位 | 資格名称 | 一言メモ |
|:-----------|------------:|:------------:|
| 1位     | SAA-C03        | とにかく範囲が広く覚える量が多い         |
| 2位     | CLF-C02        | CLF特有の範囲と知識が難しい         |
| 3位     | SOA-C02        | 記述することが無いくらい印象にないかな～         |
using × Task<T> に潜むバグとその防ぎ方

## `Task<IDisposable>`を返すとリソース解放漏れがおきやすい

```csharp
public async Task<FileStream> GetFileStreamAsync() { ... }

async Task AMethodAsync()
{
    // 警告されないawait忘れ
    using var stream = GetFileStreamAsync();
    ...
}
```

このコードの問題点は、`GetFileStreamAsync()`の呼び出し時に`await`を付けていないため、`FileStream`が`Dispose()`されないことです。代わりに`Task<FileStream>`が`Dispose()`されてしまいます。

`Task<TResult>`自体が`IDisposable`を実装しているために、コンパイラは警告を出せない。このため、このバグは気づかれにくくなります。

このようなリソース解放漏れを引き起こしやすいAPIの採用は、極力避けるべきです。
この投稿では、その回避方法について説明します。


## 方法1: `ValueTask<TResult>`を使用する

`using`でタスクの結果を使うことが想定されるメソッドでは、`Task<TResult>`の代わりに `ValueTask<TResult>`を返すことで、この問題を防げます。

`ValueTask<TResult>`は`IDisposable`を実装していないため、間違えて`await`を付けずに使った場合、コンパイルエラーになります。

```csharp
public async ValueTask<FileStream> GetFileStreamAsync() { ... }

async Task AMethodAsync()
{
    using var stream = await GetFileStreamAsync();
                    // ^^^^^ これがないとコンパイルエラー
    ...
}
```

これでこの類のリソースの解放漏れは防げます。
ただし、`ValueTask<TResult>`には以下のような制約があります：

- `await`を複数回使えない
- `AsTask`を複数回呼び出せない
- 未完了の状態で`Result`や`GetAwaiter().GetResult()`を呼ぶと未定義動作
- 上記のプロパティやメソッドを複数回使うと同様に未定義動作
- `WhenAll`や`WhenAny`に直接渡せない

とはいえ、タスクを同期的に扱う範囲では、実用上大きな問題はありません。

## 方法2: AsyncExライブラリの`AwaitableDisposable<T>`を使用する

Stephen Cleary 氏のAsyncExライブラリでは、`AwaitableDisposable<T>`という型を用いてこの問題に対処しています。

この型の特徴は以下の通りです：

- `Task<TResult>`をラップして返す (`TResult`は`IDisposable`を実装)
- 自身は`IDisposable`を実装しない
- `await`すると内部の`TResult`を返す

詳細は [このStackOverflowの回答](https://stackoverflow.com/a/41636917)が参考になります。

この仕組みを使うと、以下のように書けます。

```csharp
public AwaitableDisposable<FileStream> GetFileStreamAsync() { ... }

async Task AMethodAsync()
{
    using var stream = await GetFileStreamAsync();
                    // ^^^^^ これがないとコンパイルエラー
    ...
}
```

この型は自作しなくても、Nito.AsyncExパッケージを使えば簡単に導入できます。

`ValueTask<TResult>`を使っていないので、前述の未定義動作の懸念もなくなります。
「未定義動作？ 地球が爆発するかもしれない！こわい！」という方にも安心です。

## そもそも、なぜ`Task<TResult>`が`IDisposable`を実装しているのか

「`Task`を`Dispose()`しているコードなんて見たことない」という方も多いと思います。
実際、通常の使用では`Dispose()`は不要です。

とはいえ、極めてまれに`Dispose()`すべきケースが存在します。

詳細は公式ブログにて：

https://devblogs.microsoft.com/dotnet/do-i-need-to-dispose-of-tasks/
For Loops と While Loops の違いを簡単に説明してみました！Swift言語 （初心者向け🔰）

Swiftで繰り返し処理をする際に使われるのが 「ループ（繰り返し処理）」 です。中でもよく使うのが「for文」と「while文」。
この記事では、初心者の方向けに「forループ」と「whileループ」の違いをk解説します！

そもそもループって何？
---
ループとは、同じ処理を何度も繰り返すための仕組みです。

たとえば「1〜5までの数字を順番に表示したい」場合、同じようなコードを何度も書くのは面倒ですよね。そんなときに活躍するのがループです。

Forループとは？
---
決まった回数だけ繰り返したいときに使います。

```swift 
for 変数 in 範囲 {
    繰り返したい処理
}
```
 例：
```swift 
for i in 1...5 {
    print(i)
}

#出力
1
2
3
4
5
```



Whileループとは？
---
条件が満たされている間、繰り返したいときに使います。


基本構文：
```swift 
while 条件 {
    繰り返したい処理
}
```

```swift 
var i = 1

while i <= 5 {
    print(i)
    i += 1
}
```
 このコードも1〜5の数字を表示しますが、iが5以下である限り繰り返されます。

 ⚠️ 注意点として、条件を間違えると無限ループになり、フリーズする可能性があるので条件を必ず確認しましょう!

 例
 ```swift
var i = 1

while i <= 5 {
    print(i)
    // i += 1 を書き忘れた！
}
 ```
 🧨 問題点： iが増えないため、i <= 5の条件が永遠にtrueになり、ずっとループが終わらない
➡ アプリがフリーズしたり、クラッシュする原因になります。
 

----
ForとWhileの違いまとめ
----

| 比較項目      | forループ                | whileループ             |
| --------- | --------------------- | -------------------- |
| 繰り返し回数の決定 | あらかじめ「何回繰り返すか」が決まっている | 「条件が満たされる限り」繰り返す     |
| よく使う場面    | 配列や数の範囲を順番に処理したいとき    | 条件によって繰り返しを止めたいとき    |
| 書き方の簡単さ   | コンパクトでシンプル            | 変数の初期化や増加を自分で書く必要がある |


最後に
---
for文は「何回繰り返すか」が決まっているときに便利！

while文は「ある条件が満たされるまで繰り返す」ときに便利！

どちらも使いこなせると、コードがグッと読みやすくなります !

Swiftのループに慣れるために、実際に手を動かして試してみましょう💪
AWS Solutions Architect - Associate(SAA-C03) 合格体験記

# 0.はじめに

前回の記事に引き続き、AWSの認定資格の、ソリューションアーキテクトアソシエイトを取得した際の事について記事にしたいと思います。

# 1.試験概要

試験にあたっての概要は以下のページにまとまっています。

https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/

- 試験時間：130分
- 試験の形態：65個の問題(複数選択または複数応答のいずれか)
- 料金：150USD(税込み22000円)

# 2.学習期間

元々SAAの資格を1つのゴールとしていました。
2月末に無事CLF-02を取得しましたが、3月は業務で使用しているAWSの知識をつけることを優先し、
申し込みは4月の頭になってしまいました。
1か月あれば受かるだろうと思い、試験日は4/26にしました。

# 4.学習方法と試験当日の流れ
学習にあたっては書籍の「AWS教科書 AWS認定ソリューションアーキテクトアソシエイト テキスト＆問題集」およびのUdemyを利用しました。

https://www.amazon.co.jp/AWS%E6%95%99%E7%A7%91%E6%9B%B8-AWS%E8%AA%8D%E5%AE%9A%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88-%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%EF%BC%86%E5%95%8F%E9%A1%8C%E9%9B%86-%E7%85%A4%E7%94%B0-%E5%BC%98%E6%B3%95/dp/4798183261/ref=sr_1_2_sspa?crid=33RHDLRIFSE9H&dib=eyJ2IjoiMSJ9.DDVtxmJY032mpxVdeh-WQFBWZ60eR0HWqRNdow_qUV4QqcgmEnhwgp1rhWzt1-UvaQTtPAub0ZoYeLrQ4NeXFi5zE4I7qslrjuU9eXxIai3FdwUVJGJq_MpwoRks0HZtaP_nH21GHu_yBHH9yL4j7GtRDvOAV9S8HuYzjvrsEe8P0kPrtXUnhhzN29sAZ_nTZB9qx01tNxmddT4W1lL7JU4zizNhsCGfSiauT8oYuXfeMJwZxuy9NVweE_Ft5aq3JjbZHxSzDMruiCc3LlY6zAgyAf1-o7W6Qz6t_EryyJY.IPrXqva_M1hifBzc-LJbE8-kQh5IFzeBGa1Fq3-aNhY&dib_tag=se&keywords=aws+%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88+%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88&qid=1748414860&sprefix=%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88%2Caps%2C160&sr=8-2-spons&sp_csd=d2lkZ2V0TmFtZT1zcF9hdGY&psc=1

https://www.udemy.com/course/aws-knan/?couponCode=ST19MT280525G2

基本的には書籍を数日かけ1週し、Udemyの問題集は他の方の合格体験記でも評判の良かった物を利用しました。
他の方も記載している通り、この問題集自体かなり難易度が高いように感じました。
初見ではどの演習も5～6割しか解けませんでしたが、全体的に3週ほど実施し、8、9割取れるようにしました。

試験当日、開始時刻は15時からでしたが14時30分には会場に到着しそのまま試験を受けました。
見直し含め大体70分くらいで試験完了しそのまま退室しました。

# 6. 試験結果と受けた感想

結果は無事合格でした。
試験直後は受かったかわからず不安でしたが、試験実施日の20時過ぎに合格のメールが来てホッとしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566232/41bc3122-bcf6-4f44-821b-959a045501e8.png)

実際に試験を受けて感じたことなのですが、確かにUdemyの問題は難易度が高い分知識もしっかりつきましたが、問題の傾向や問い方が実際の試験とずれているように感じました。
問題集はそれぞれのコンポーネントに深入りしすぎて、実際に試験では使わないような分野もあったのでそこが微妙でしたが、実際この問題集で受かったので感謝しています。

# 7. まとめ
正直ソリューションアーキテクトは試験範囲が広く、覚える量が多く大変でした。
点数もすごい余裕というわけではないですが、ぼちぼち位の点数だったのでよかったです。

SAAを勉強し受かったタイミングで、勉強すればできる！と思いはじめ他の資格も積極的に狙っていこうと感じ始めました。

**サマリ**

| 受験日 | 資格名称 | スコア | 結果 |
|:-----------|------------:|:------------:|:-----------|
| 2025/02/25     | CLF-C02        | 749         | 合格         |
| 2025/04/26     | SAA-C03        | 796         | 合格         |

**個人的難易度**
| 順位 | 資格名称 | 一言メモ |
|:-----------|------------:|:------------:|
| 1位     | SAA-C03        | とにかく範囲が広く覚える量が多い         |
| 2位     | CLF-C02        | CLF特有の範囲と知識が難しい         |
.NET MAUIでのAndroidアプリ署名方法

# .NET MAUIアプリをGoogle Playにリリースする方法  
～署名付きAPK/AABの作成とアップロード手順～

## はじめに

.NET MAUI を使って Android アプリを開発した後、Google Play Console に公開するためには「署名付きビルドの作成」が必要です。

本記事では、次のような内容をステップバイステップで解説します：

- Keystore の作成
- .csproj への署名設定追加
- Release ビルドの作成
- Google Play Console へのアップロード

## 開発環境

- OS: Windows 11  
- IDE: Visual Studio 2022（17.9 以降）  
- .NET: 8.0  
- Google Play Console を使用

---

## ステップ1：Keystore（署名鍵）の作成

以下のコマンドを実行して、署名鍵（.keystoreファイル）を作成します：

```bash
keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000
```
・my-release-key.keystore: 任意のファイル名
・my-key-alias: 任意のエイリアス（覚えておく）
・-validity: 鍵の有効期限（日数)

このファイルは今後の更新にも使用しますので、安全な場所に保管してください。


---

## ステップ2：.csproj に署名情報を追加
作成した Keystore を .NET MAUI プロジェクトの .csproj ファイルに設定します。<PropertyGroup>の最下部に私は書いています。

```.xml
</PropertyGroup>

<!--ここから-->
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
  <AndroidPackageFormat>aab</AndroidPackageFormat>
  <AndroidKeyStore>True</AndroidKeyStore>
  <AndroidSigningKeyStore>C:\Users\fl344\source\repos\App\FeeLog\feelog-key.keystore</AndroidSigningKeyStore>
  <AndroidSigningStorePass>$(AndroidSigningStorePass)</AndroidSigningStorePass>
  <AndroidSigningKeyAlias>feelog-key-alias</AndroidSigningKeyAlias>
  <AndroidSigningKeyPass>$(AndroidSigningKeyPass)</AndroidSigningKeyPass>
</PropertyGroup>
<!--ここまで-->

<ItemGroup>
```

Visual Studio でビルドする前に環境変数を設定（PowerShell）を1回だけ行う。
```.powershell
$env:AndroidSigningStorePass = "あなたのキーストアのパスワード"
$env:AndroidSigningKeyPass = "あなたのキーのパスワード"

```

---
## ステップ3：Releaseビルドの作成
DebugモードからReleaseモードに変更
\プロジェクト名\bin\Release\net8.0-androidの中から-Signed.aabとなっているファイルを確認する。
「signed」が証明されてることを表しています
---
## ステップ4：Google Play Console へのアップロード
以下の手順で Google Play Console にアップロードします。

Google Play Console にログイン

新規アプリを作成（言語・アプリ名などを入力）

左メニューから「リリース」→「アプリのリリース」へ進む

作成した .aab ファイルをアップロード

テスト → 本番公開へ進める

## 補足：.csprojでのバージョン指定方法
以下のように .csproj にアプリのバージョン情報を追加できます。

```.xml
<PropertyGroup>
  <ApplicationVersion>1.0.1</ApplicationVersion>
  <VersionCode>2</VersionCode> <!-- アップデート時に数値を上げる -->
</PropertyGroup>
```
## おわりに
.NET MAUI を使った Android アプリ開発は非常に効率的ですが、Google Play へのリリースには Android 独自の知識も必要です。
本記事が、リリース手順を初めて踏む方の参考になれば幸いです。
【Python】標準ライブラリのrandomモジュールのrandom関数を使って0.0以上1.0未満の浮動小数点数の乱数を生成する方法

・標準ライブラリのrandomモジュールのrandom関数を使って0.0以上1.0未満の浮動小数点数の乱数を生成するには、プログラムの冒頭に**import random**と記述し、**random.random**()を実行すればよい。

・「import モジュール名」の形でモジュールをインポートできる。なお、モジュール内に含まれる特定の関数をインポートしたい場合は、「from モジュール名 import 関数名」と表記する。

・randomモジュールに含まれるrandom関数を実行するには、random.random()と記述する。random関数に引数を指定することはできない。
test

Sub CollectAAAFiles()
    Dim colFiles As Collection
    Set colFiles = New Collection

    Dim folderPath As String
    folderPath = "C:\Your\Target\Folder\"  ' ★←ここに親フォルダのパスを入力

    Call SearchFilesWithAAA(folderPath, colFiles)

    ' 例：結果を表示
    Dim f As Variant
    For Each f In colFiles
        Debug.Print f
    Next f
End Sub

Sub SearchFilesWithAAA(ByVal path As String, ByRef col As Collection)
    Dim fso As Object
    Dim folder As Object, subfolder As Object
    Dim file As Object

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set folder = fso.GetFolder(path)

    ' ファイルをチェック
    For Each file In folder.Files
        If InStr(file.Name, "AAA") > 0 Then
            col.Add file.Path
        End If
    Next file

    ' サブフォルダを再帰的にチェック
    For Each subfolder In folder.SubFolders
        Call SearchFilesWithAAA(subfolder.Path, col)
    Next subfolder
End Sub
ChatGPTにloveプロトコルを作らせてみた

...最近パソコンをあまり触ってないので前のネタを。
# まずは定義
```
恋愛の順序を表すのにIEEEプロトコルのうちいくつかを使用します。
例えば、『「今日一緒帰ろ」「うん」』といった会話は、『「データ要求：今日、一緒に帰るかどうか」「ACKパケットとOKパケット」』というように存在しないものも含めて表します。
以下の様子をこの形式で表してください。

「LINEなどの連絡手段を繋げる」
↓
「会う」
↓
「スキンシップをとる」
↓
「告白して付き合う」

足りないものは想像して表してください。
```
適当にこんなものを作ってみた。
中間の`LINEなどの...`から`...付き合う`まではChatGPTで生成。
ある意味逆輸入。
そしてできたloveプロトコルを解説してみる。

# Loveプロトコルの解説
ここからはChatGPTの書いたloveプロトコルについて解説。
## 1. 連絡手段を繋げる方法
「連絡先(IP)を知りたい」とARPリクエストを送信する。
### 返答の形式
「これだよ」と **アドレス(LINE IDなど)** が返る。
もしくは、何も返ってこない。

:::note info
タイムアウト処理が必要です。
:::

...。
これ... ~~ルータのやつじゃね？~~ loveプロトコルです。

## 2. 会う方法(3-Way ハンドシェイクの場合)
1. 1.の方法で確認したアドレスにSYNパケットを送る(例：今度会えないかな？)
1. 相手からSYN-ACKパケットが返る(例：いいよ。私も思ってた。)
1. ACKパケットを送る(例：じゃあ、◯日にね。)

...だから ~~TCPだって。~~ loveプロトコルです。

# ここまで。
今回はここまで。
好評だったら追記します。
「UDEV Gothic」のインストール方法解説【Windows】

UDEV Gothicは、視認性が高くプログラミングに適した日本語フォントです。
Rictyフォントの派生であり、文字の区別がつきやすいように工夫されています。

UDEV Gothicは.ttfを生成するためにビルドが必要です。
ここでは、その方法について解説していきます。

# 前提条件
ローカルにPython3の環境があること。

# 1. リポジトリをローカルに落としてくる
https://github.com/yuru7/udev-gothic?tab=readme-ov-file

`git clone`したり、zipで落としてきたりしましょう。
`https://github.com/yuru7/udev-gothic.git`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1101233/d5bb6827-a7ec-4570-9267-8f294f8832fb.png)

# 2. Fontforgeのインストール
[公式サイト](http://fontforge.github.io/en-US/) からWindows用のインストーラをダウンロードして実行、インストールする。

https://fontforge.org/en-US/downloads/windows-dl/


# 3. `fontforge_script.py`の実行
インストールが終了したら、スタートメニューから`FontForge interactive console`と検索し、起動する。
そうするとffpythonにパスが通ったコマンドプロンプトが立ち上がる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1101233/a0acdc5f-d4fa-4757-bc0a-766b98ae1eec.png)

1で落としてきたリポジトリのディレクトリのパスに`cd`コマンドで移動。
以下を実行する。
[オプション](https://github.com/yuru7/udev-gothic?tab=readme-ov-file#%E3%83%93%E3%83%AB%E3%83%89%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3)はお好きなように。
```terminal
ffpython.exe .\fontforge_script.py --jpdoc --nerd-font --liga
```

以下のように表示されれば成功。
```terminal
=== Generate Regular ===
The glyph named heart is mapped to U+F08D0.
But its name indicates it should be mapped to U+2665.
Lookup subtable contains unused glyph uni00A0#1 making the whole subtable invalid
Lookup subtable contains unused glyph uni00A0#1 making the whole subtable invalid
=== Generate Bold ===
Lookup subtable contains unused glyph uni00A0#1 making the whole subtable invalid
Lookup subtable contains unused glyph uni00A0#1 making the whole subtable invalid
=== Generate Italic ===
Lookup subtable contains unused glyph uni00A0#1 making the whole subtable invalid
Lookup subtable contains unused glyph uni00A0#1 making the whole subtable invalid
=== Generate BoldItalic ===
Lookup subtable contains unused glyph uni00A0#1 making the whole subtable invalid
Lookup subtable contains unused glyph uni00A0#1 making the whole subtable invalid
```

# 4. `ttfautohint-py`と`fonttools`をインストール
普通のターミナルを開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1101233/4ff65f5f-00ec-48b3-94d1-9284ed632c8d.png)


1で落としてきたリポジトリのディレクトリのパスに`cd`コマンドで移動しておく。

以下を実行。
```terminal
pip install fonttools
pip install ttfautohint-py
```

# 5. fonttools_script.pyの実行
上記のターミナルで以下を実行。ここでオプションは不要。
```terminal
python .\fonttools_script.py
```

# 6. 生成された`.ttf`をインストール
1で落としてきたリポジトリのディレクトリ内に`build`ディレクトリが生成されている。
その中の4つの`.ttf`をコンピュータにインストールすれば完了。
全選択して右クリック→インストールでも良いし、一つ一つインストールしてもよい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1101233/226cc336-fc7d-4852-b5be-916670d9e83a.png)

# 7. おまけ：VSCodeでの指定名
`UDEV Gothic JPDOCNFLG`という名前で指定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1101233/52cd69f8-3437-4aa9-bc78-31217e3a6632.png)

おわり。
shoestring をソースから動かしてみようぜ


よっしゃ！今回は Symbol の shoestring をソースからガッツリ動かす方法を紹介していくぜ！  
難しそうに見えても、手順通りにやれば余裕だ。さっそく始めてみようぜ！

---

## 1. pyenv をインストールするぜ

Python のバージョン管理は pyenv が超便利だぜ。  
もし他の仮想環境ツール使ってるなら、この手順はスキップしても OK だ！

### まずは必要なパッケージをインストールだ

```bash
sudo apt install -y make build-essential libssl-dev zlib1g-dev \
    libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \
    libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev \
    libffi-dev liblzma-dev
```

### pyenv 本体をインストールするぞ

```bash
curl https://pyenv.run | bash
```

### シェルの設定ファイルに追記しておこう

```bash
echo '#pyenv start' >> ~/.bashrc
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init - bash)"' >> ~/.bashrc
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc
echo '#pyenv end' >> ~/.bashrc
```

### シェルを再起動して反映だ

```bash
exec $SHELL -l
```

## 2. shoestring をクローンしようぜ

ホームディレクトリにクローンする例だけど、好きな場所で OK だぜ！

```bash
git clone https://github.com/symbol/product.git
cd product
git submodule update --init --recursive
cd tools/shoestring
```

---

## 3. Python 仮想環境を作るぞ

仮想環境名は好きな名前で OK だ。ここでは`shoestring-dev`にしてるぜ。

```bash
pyenv install 3.12.10
pyenv virtualenv 3.12.10 shoestring-dev
pyenv local shoestring-dev
```

## 4. 依存パッケージをインストールだ

pypi から shoestring をインストールした場合は勝手に入るけど、ローカルインストールの場合は手動でインストールする必要があるぜ。

```bash
scripts/ci/setup_lint.sh
pip install symbol-lightapi
pip install symbol-sdk-python
```

## 5. 言語ファイルを作成しよう

2025/05/28 現在、日本語は入ってないから、日本語で動かしたいなら自分で翻訳した `shoestring/lang/ja/LC_MESSAGES/messages.po` を作って実行してくれよな！

```bash
scripts/compile_resource_strings.sh
```

## 6. shoestring を実行してみるぜ

日本語で実行したいなら、こうだ！

```bash
LC_MESSAGES=ja python3 -m shoestring
```

### ウィザードモードで起動したいときは？

```bash
LC_MESSAGES=ja python3 -m shoestring.wizard
```

### 別のディレクトリから動かしたい場合は？

`PYTHONPATH`でソースのありかを示してあげれば、どこでも実行可能だぜ！

```bash
PYTHONPATH=~/product/tools/shoestring LC_MESSAGES=ja python3 -m shoestring.wizard
```

## 7. Lint チェックもやってみようぜ

まずは shellcheck をインストールするぜ！必須だぜ！

```bash
sudo apt update
sudo apt install shellcheck
```

Lint を実行するにはこうやるんだぜ！迷わず実行だ！

```bash
cd ~/product/tools/shoestring
scripts/ci/lint.sh
```

## 8. テストも動かしてみようぜ

こいつでバッチリ動作確認だぜ！

```bash
cd ~/product/tools/shoestring
scripts/ci/test.sh
```

### カバレッジを取る

```bash
scripts/ci/test.sh code-coverage
```

バッチリとコードカバレッジを取るのは腕のいい魔法使いの証拠だぜ！これでどこまでテストできてるか一目瞭然だ！

```bash
coverage report
```

さらに！HTML で結果を見たいならこうだ！超見やすくなって最高だぜ！

```bash
coverage html
```

## 9. インストールしてしまうのもアリだぜ

ビルドには Poetry v1 系を使ってるから、まずはそれをインストールするんだ。

```bash
curl -sSL https://install.python-poetry.org | POETRY_VERSION=1.8.5 python3 -
```

あとはビルドしてインストールするだけ！簡単だろ？

```bash
poetry build
pip install dist/symbol_shoestring-0.2.1-py3-none-any.whl
```

---

お疲れさま！これですべての準備が整ったぜ！  
もし困ったことがあったら、遠慮せずコメントしてくれよな！  
一緒に楽しく開発ライフを送ろうぜ！最高だぜ！
laravel sail コンテナを再作成する方法

## 概要

laravelのsailにてコンテナを再作成する方法を簡単にまとめる。

## 方法

下記のコマンドを実行する

```
./vendor/bin/sail down --rmi all -v
./vendor/bin/sail up -d
```


.envのDB_DATABASEなどを変更してDBを再作成したい場合にはこのコマンドが使える。
1標本問題の推定

# 正規母集団の母平均の推定
正規母集団から抽出した標本$x$を以下の様に定義する。ここで、母平均を$\mu$、母分散を$\sigma^2$とする。

```math

x \sim N \left( \mu, \sigma^2 \right)

```

よって、標本平均$\overline{x}$は、以下の分布に従う。$n$は標本数とする。

```math

\overline{x} \sim N \left( \mu, \frac{\sigma^2}{n} \right)

```

また、不偏分散(母分散の不偏推定量)は以下の様に定義する。

```math

\hat{\sigma} = \cfrac{1}{n-1} \left( x - \mu \right)^2

```

## 母分散が既知
母分散が既知か未知かで推定方法が異なる。まず、母分散が既知の場合の区間推定方法を示す。信頼区間は$95{\\%}$とする。

```math
Z = \cfrac{\overline{x} - \mu}{\cfrac{\sigma}{\sqrt{n}}} \sim N \left( 0, 1 \right)
```

$Z$は標準正規分布に従うため、信頼区間を$95{\\%}$とすると、以下の関係が成立する。

```math

P \left( - Z_{0.25} \leq Z \leq Z_{0.25} \right) = 0.95

```

よって、区間推定式は以下の様になる。

```math

\overline{x} - Z_{0.25}\cfrac{\sigma}{\sqrt{n}} \leq \mu \leq \overline{x} + Z_{0.25}\cfrac{\sigma}{\sqrt{n}}

```

## 母分散が未知
続いて、母分散が未知の場合の区間推定方法を示す。信頼区間は95%とする。

```math
t = \cfrac{\overline{x} - \mu}{\cfrac{\hat{\sigma}}{\sqrt{n}}} \sim t(n-1)
```

$t$は自由度$n-1$の$t$分布に従うため、信頼区間を$95{\\%}$とすると、以下の関係が成立する。

```math

P \left( - t(n-1)_{0.25} \leq t \leq t (n - 1)_{0.25} \right) = 0.95

```

よって、区間推定式は以下の様になる。

```math

\overline{x} - t(n-1)_{0.25} \cfrac{\hat{\sigma}}{\sqrt{n}} \leq \mu \leq \overline{x} + t(n-1)_{0.25}\cfrac{\hat{\sigma}}{\sqrt{n}}

```

# 正規母集団の母分散の推定
正規母集団の母分散の区間推定を行うために、以下の様に$w$を定義する。

```math

w = \sum_{i} Z^{2}_{i} = \cfrac{(n-1)\hat{\sigma}^2}{\sigma^2} \sim \chi^2(n-1)

```

$w$は自由度$n-1$の$\chi^2$分布に従うため、信頼区間を$95{\\%}$とすると、以下の関係が成立する。

```math

P \left( \chi^2(n-1)_{0.975} \leq w \leq \chi^2(n-1)_{0.025} \right) = 0.95

```

よって、区間推定式は以下の様になる。

```math

\cfrac{(n-1)\hat{\sigma}^2}{\chi^2(n-1)_{0.025}} \leq w \leq \cfrac{(n-1)\hat{\sigma}^2}{\chi^2(n-1)_{0.975}}

```

# 母比率の推定
十分に大きい標本数$n$の標本に対して、$x$人が確率$p$で発生する事象に当てはまったとする。すると、$x$の分布は以下の様に定義できる。これを二項分布という。

```math

x \sim B(n, p)

```

中心極限定理を用いることにより、$x$の分布を以下の様に正規分布として定義出来る。

```math

x \sim N(np, np(1-p))

```

よって、標本比率は以下の様に定義出来る。

```math

\hat{p} = \frac{x}{n} \sim N \left( p, \cfrac{p(1-p)}{n} \right)

```

標本比率は、正規分布に従うので、標準正規分布$Z$は以下の様に定義出来る。

```math

Z = \cfrac{\hat{p} - p}{\sqrt{\cfrac{p(1-p)}{n}}} \sim N(0, 1)

```

$Z$は標準正規分布に従うので、信頼区間を$95{\\%}$とすると、以下の関係が成立する。

```math

P \left( - Z_{0.25} \leq Z \leq Z_{0.25} \right) = 0.95

```

よって、区間推定式は以下の様になる。

```math

\hat{p} - Z_{0.25}\sqrt{\cfrac{p(1-p)}{n}} \leq p \leq \hat{p} + Z_{0.25}\sqrt{\cfrac{p(1-p)}{n}}

```

ここで、大数の法則を用いると以下の関係式が成立する。

```math

\lim_{n \rightarrow \infty} \hat{p} \simeq p

```

故に、上記の推定式は以下の近似式で書き改められる。

```math

\hat{p} - Z_{0.25}\sqrt{\cfrac{\hat{p}(1-\hat{p})}{n}} \leq p \leq \hat{p} + Z_{0.25}\sqrt{\cfrac{\hat{p}(1-\hat{p})}{n}}

```
Rustに拒否反応

# FreeBSD で certbot が非常に導入しづらくなった
certbotはPythonで動くプロダクトだが、Pythonのセキュリティー系コンポーネントがRustに依存するようになったおかげでportsから導入するのに異常なコストを要求することになった。

Rustをパッケージ管理システムで入れる分にはそこまで思わないかもしれないが、ソースから環境をコンパイルするだけなのに異常にハイパフォーマンスな環境を要求され、ほとんどの環境ではコンパイルに失敗する。

## ChatGPTに聞いてみた

それは非常によくわかります。特に **FreeBSDのような非主流環境でのCertbot導入**は、Python依存地獄＋ビルド問題にRust依存が加わることで「証明書一枚取るのにここまで大変か」となることがよくあります。

---

## 🔧 状況整理：なぜCertbotでRustが必要になるのか？

Certbot自体はPython製ですが、依存する一部のライブラリ（特にセキュリティ系：`cryptography`, `pyOpenSSL`など）が**Rustで書かれたコンポーネント**（例：`cryptography >= 3.4`でRustが必要）に依存するようになったため、`pip install certbot` や `ports/security/py-certbot` などがRustを要求します。

---

## ✅ Rustなしで Let's Encrypt の証明書を取得する方法（代替案）

RustやPythonを導入せず、**できる限り簡素な構成で証明書取得**したい場合、以下の方法が現実的です：

---

### 1. **acme.sh**（シェルスクリプト製 ACME クライアント）

* **完全なBash/Zsh実装（Rust・Python不要）**
* **軽量・簡単・FreeBSDでも完動**
* ワイルドカード証明書、DNS認証、スタンドアロンHTTPサーバなど多彩なモードに対応
* Cloudflare、AWS、Route53 など主要DNSプロバイダとの統合も可能

#### 🔧 インストール例（FreeBSDでもOK）:

```sh
curl https://get.acme.sh | sh
~/.acme.sh/acme.sh --issue -d example.com --webroot /usr/local/www/example.com
```

#### ✅ 特長

* 証明書の取得・更新が1コマンド
* 証明書は `~/.acme.sh` に保存、nginxやapacheと連携可能
* systemdではない環境にも適応しやすい

#### 🔗 公式

[https://acme.sh](https://acme.sh)

---

### 2. **lego**（Go製のACMEクライアント）

* 静的バイナリで提供 → 導入が超簡単
* ワイルドカード、DNS-01、HTTP-01 に対応
* RustもPythonも一切不要

#### 🔧 インストール例:

```sh
curl -LO https://github.com/go-acme/lego/releases/download/v4.15.0/lego_v4.15.0_freebsd_amd64.tar.gz
tar xf lego_*.tar.gz
./lego --email you@example.com --domains example.com --http --path /etc/ssl/lego run
```

#### ✅ 特長

* 複数ドメインにも対応
* 自動更新スクリプトもあり
* DNSプロバイダ連携も多彩

#### 🔗 公式

[https://go-acme.github.io/lego/](https://go-acme.github.io/lego/)

---

### 3. **dehydrated**（シェルスクリプト製、元祖簡易クライアント）

* ACMEv1の頃からある軽量クライアント
* acme.shよりやや低機能だが、簡単

---

## 🔚 結論：Certbotがダメなら`acme.sh`が最良の代替

| ツール        | Rust不要 | Python不要 | FreeBSD適性 | 機能性 | 備考       |
| ---------- | ------ | -------- | --------- | --- | -------- |
| Certbot    | ✕      | ✕        | △（Rust必須） | ◎   | 導入が困難    |
| acme.sh    | ◎      | ◎        | ◎         | ◎   | 推奨       |
| lego       | ◎      | ◎        | ◎         | ◎   | 静的バイナリで楽 |
| dehydrated | ◎      | ◎        | ◎         | △   | シンプル派向け  |

---

### 🔍 推奨アクション

* **今後はCertbotではなく `acme.sh` もしくは `lego` に乗り換え**
* サーバ更新スクリプトやcronにそのまま組み込める
* Let's Encrypt本体の仕様変更にも対応が早い（acme.sh は活発にメンテナンス中）

---

### acme.sh はマニュアルがすごく判りにくいんだよなぁ…
つづく、かもしれない。
Dockerで起動しているコンテナ内のApacheのプロセス数を一気に数えてくれるワンラナー

どこのコンテナがたいへんそうなのかなぁ？ってぱっと調べたいと思ったので
作ってみました

```
echo "ContainerID     ContainerName                  Apache Count" ; docker ps | awk 'NR>1 {print $1 " " $2}' | while read CONTAINER_ID IMAGE_NAME; do CNT=`docker exec $CONTAINER_ID sh -c "ps auxwww 2>null | grep [a]pache | wc -l"`; printf "%-15s %-30s %s\n" "$CONTAINER_ID" "$IMAGE_NAME" "$CNT" ; done
```

```
ContainerID     ContainerName                  Apache Count
b17aed273d7e    ABCFront                       0
d5eb014989f0    ap_004                         7
1ad5d0d4808e    ap_003                         7
fba7062b36d3    ap_002                         6
2c00ee5897db    ap_001                         7
49e862f7acd2    ap_000                         11
```


ワンラナー的な肝は

```read```はスペース区切りの文字列を変数化してくれます
```
$ "echo "abc xyz" | { read VAR1 VAR2; echo "$VAR1 は $VAR2 です"; }
abc は xyz です
```
※{}で囲まないとうまくいかないです


先頭行を外して2行目から処理する```awk 'NR>1 {}'```
も覚えておいて損はないですね。