OmniAICreator/Qiita-1.07M huggingface dataset:
【Python】エラーに関するドキュメントがないことに耐えられなかったので`cpython`にコントリビュートしたら、プロダクションコードも変更することになったお話

## きっかけ
私は以前、Pythonの各ライブラリ型情報をまとめている`typeshed`に、`ctypes`の内部実装`_ctypes`に定義された`_ctypes.COMError`の型情報を追加するPRをopenしてmergeされました。

https://qiita.com/junkmd/items/1b28e8c756f91b2a54bb

この`COMError`は発生時スタックトレースに現れてキャッチされなければシステムを停止させる例外、つまり事実上パブリックな例外であるにも関わらず、どのような理由でエラーが起きるのか、エラーの各属性が何を意味するかなどはドキュメントで言及されておらず、仕様が不明瞭なものでした。

公式のドキュメントが存在しないことにより、この例外は私がメンテナンスしている[`comtypes`]()のカスタム例外であると勘違いされることが多く、似通った内容のIssueがopenして質問と回答が繰り返され、メンテナーやコミュニティが疲弊する要素の一つとなっていました。

この状況を改善すべく、私はPythonのドキュメントに`_ctypes.COMError`に関する記述を追加しようと考えました。

### `_ctypes.COMError`とは

`COMError`は、Pythonの`ctypes`モジュールを使用してCOM (Component Object Model) オブジェクトと連携する際に発生するエラーです。

`COMError`は、COM関連のエラー情報を保持するためのいくつかのフィールドを持っています。

- `hresult`: COMメソッドの実行結果を示す数値コードである`HRESULT`値を表します
- `text`: エラーメッセージ
- `details`: 長さ5で構成されるタプルです
  - インデックス0: `descr`。テキストによる説明
  - インデックス1: `source`。エラーを発生させたクラスまたはアプリケーションの(言語依存の)`ProgID`
  - インデックス2: `helpfile`。ヘルプファイルのパス
  - インデックス3: `helpcontext`。ヘルプコンテキストの識別子
  - インデックス4: `progid`。エラーを定義したインターフェースの`ProgID`

これらのフィールドを通じて、COMエラーの詳細な情報を取得し、エラーの原因を特定することができます。

### `OSError`との違い

COMメソッドの定義方法によっては、`OSError`が`COMError`の代わりに投げられることがあります。
`OSError`は、オペレーティングシステムに関連するエラー、例えばファイルが見つからない、ネットワークに接続できないなどの場合に発生します。

`ctypes`でCOMオブジェクトのメソッドを呼び出す際、`PYFUNCTYPE`を使って関数プロトタイプを作成し、そのプロトタイプからメソッド呼び出しを行うための関数を生成します。
プロトタイプから関数を生成する際にIID(COMインターフェースを一意に識別するためのGUID(Globally Unique Identifier))を指定しなければ、`COMError`が`OSError`の代わりに投げられます。

## PR mergeまでの顛末

まず、私はPythonのIssueトラッカーに`COMError`に関するドキュメントを追加したい旨を報告しました。

https://github.com/python/cpython/issues/126615

しかし、Issueではあまり議論は起こりませんでした。そこで、私は反対意見がないものと判断し、プロダクションコードを変更することなくドキュメントだけを変更するPull Requestを送りました。

https://github.com/python/cpython/pull/126686

すると、PRを提出してから議論が始まりました。議論の中で他の開発者から「"プライベート"な要素に対してドキュメントを追加するだけでなく、`COMError`を`ctypes`へインポートしてパブリックにした方がいい」という提案があり、私もその提案に賛同しました。

Pull Requestは、他の開発者によるレビューを経て、最終的にmergeされました。

## 現在の状況

現在では、`ctypes.COMError`としてこのエラーはパブリックになり、Pythonのドキュメントにも`ctypes.COMError`に関する記述が追加されました。

- `PYFUNCTYPE`に関する記載
  https://docs.python.org/ja/3.14/library/ctypes.html#ctypes.PYFUNCTYPE

- `COMError`に関する記載
  https://docs.python.org/ja/3.14/library/ctypes.html#ctypes.COMError

[Python 3.14ベータ版も2025/4/7にリリースされた](https://www.python.org/downloads/release/python-3140b1/)ため、特に問題がなければファイナルリリースにも上記は含まれる予定です。

## その後

この件を通じて、私はOSSへのコントリビューションの難しさ、そして楽しさを学びました。

当初はドキュメントの追加だけで良いと考えていましたが、他の開発者との議論を通じて、より良い解決策を見つけることができました。

また、Pull Requestを送る際には、コードの品質だけでなく、ドキュメントの整備やテストの追加なども行う必要があり、OSSへのコントリビューションは簡単なことでもありません。

しかし、自分の書いたコードがPythonのプロダクションコードとなり、多くのユーザーが利用するようになるのは、非常にやりがいのある経験でした。

この記事が、OSSへのコントリビューションに興味を持つ方にとって、少しでも参考になれば幸いです。
【フィボナッチ数列】PHPで再帰・ループ・コントローラ実装を練習してみた。

# はじめに
この記事では、PHP(Laravel)を使って「フィボナッチ数列」を求める処理を実装してみた内容をまとめます。

# ①フィボナッチ数列とは？
**前の２つの数字を足して次の数字を作る数列**のことです。

```text
0,1,1,2,3,5,8,13,21,.....
```

数式で表すと:

```php
F(0) = 0
F(1) = 1
F(n) = F(n - 1) + F(n - 2)(n >= 2)
```

# ②Laravelでフィボナッチを求める方法

## 1. ループを求める(最も効率的)
```php
public function loopFibonacci($n)
{
    $fib = [0, 1];

    for ($i = 2; $i <= $n; $i++) {
        $fib[$i] = $fib[$i - 1] + $fib[$i - 2];
    }
    return $fib;
}
```

## 2. 再帰で求める(理解しやすい)
```php
public function recursiveFibonacci($n)
{
    if($n < 2){
        return $n;
    }
    return $this->recursiveFibonacci($n - 1) + $this->recursiveFibonacci($n - 2);
}
```

*再帰は計算量が多く、**10以上になると激重になる!**

## controllerに組み込む例
```bash
php artisan make:controller FibonacciContoroller
```

```php
namespace App\Http\Controllers;

use Illuminate\Http\Request;

class FibonacciContoroller extends Contoroller
{
    public function index()
    {
        $fib = $this->loopFibonacci(10);
        return view('fibonacci.index', compact('fib'));
    }
    private function loopFibonacci($n)
    {
        $fib = [0, 1];
        for ($i = 2; $i <= $n; $i++) {
            $fib[$i] = $fib[$i - 1] +  $fib[$i - 2];
        }
        return $fib;
    }
}
```

## Bladeファイルでの表示
```blade
<!-- resources/views/fibonacci/index.blade.php -->
<h1>フィボナッチ数列</h1>
<ul>
    @foreach ($fib as $index => $value)
        <li>F{{ $index }} = {{ $value }}</li>
    @endforeach
</ul>
```

# ③まとめ
- フィボナッチ数列は**ロジック練習に最適な題材**
- Laravelでは**コントローラ → ロジック → Blade**と流れをつかみやすい
- 再帰とループ、どちらも書いて比較してみると理解が深まる!
競技プログラミングの鉄則演習問題集を全部解く(A01～A05/B01～B04)

## はじめに
はじめまして、なすです。
'25年5月12日現在はAtCoderのレートが550(茶色)です。使用言語はPython(PyPy)です。
アルゴリズムの勉強をしたいなあと思って部室の本を漁っていたところ部室にこの本があり、それを知った流れでAtCoderに問題が置いてあると知りました。なので、少しずつ解いていくついでに記事として感想などを残そうと思いこれを書いています。

## このシリーズのスタイル
問題を解いて、ACが出た自分の解答を載せる。思ったことがあれば一言書く。以上。

## A01
```python
n = int(input())
print(n*n)
```

## A02
```python
n, x = map(int,input().split())
a = list(map(int,input().split()))
if x in a:
  print("Yes")
else:
  print("No")
```


## A03
```python
n, k = map(int,input().split())
p = list(map(int,input().split()))
q = list(map(int,input().split()))
ans = "No"
for i in range(n):
  if (k - p[i]) in q:
    ans = "Yes"
    break
print(ans)
```
in演算子を使うと1重ループだけになるので見た目が簡単になって良いです。

## A04
```python
n = int(input())
print(f"{int(bin(n)[2:]):010}")
```
フォーマットを使ってゼロ埋めをしています。また、bin(n)は先頭2文字が"0b"になるのでスライスで除いています。短く書いた分やや読みづらくなっています。

## A05
```python
n, k = map(int,input().split())
ans = 0
for i in range(1,n+1):
  for j in range(1,n+1):
    if 1 <= k - i - j <= n:
      ans += 1
print(ans)
```
1<=N<=3000なので3重ループにするとTLEになります。kから引いた値を調べることで2重ループに抑えられました。

## B01
```python
a,b = map(int,input().split())
print(a+b)
```


## B02
```python
a,b = map(int,input().split())
ans = "No"
for i in range(a,b+1):
  if 100 % i == 0:
    ans = "Yes"
print(ans)
```


## B03
```python
n = int(input())
a = list(map(int,input().split()))
ans = "No"
for i in range(n):
  for j in range(i+1,n):
    if 1000 - a[i] - a[j] in (a[0:i]+a[i+1:j]+a[j+1:]):
      ans = "Yes"
      break
  if ans == "Yes":
    break
print(ans)
```
3<=N<=100で制約が緩いので3重ループを回しても良いですが、inを使うことで2重ループに抑えられました。調べたところリストに対するinはそれほど速くないらしいので、Nの制約によっては3重ループにした方が良いかもしれません。

## B04
```python
b = input()
ans = 0
for i in range(len(b)):
  ans = ans*2 + int(b[i])
print(ans)
```
最高位の数字が欲しいので文字列として入力を受け取るのが良さそうです。
(QA) IBM Power の ASMI のエラーコードを調べたい

ご質問の背景として、IBM PowerでIBM i の使用するコア数を変更したい、という事で作業を実施した際、ASMIでエラーが出ている、という状況でした。

例としてはこのような感じのエラーがASMIのエラーが出ていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/1a6b4783-df83-4566-ab81-b89699a05d82.png)

上記画面で最右列の　CC009xxx などのコードを調べたい、という事になります。

## ASMIのエラーコードのマニュアル

下記のサイトに記載があります。今回POWER9サーバーなのでPOWER9のURLです。
**(C9xx) IPL status progress codes**
https://www.ibm.com/docs/en/power9/0000-REF?topic=POWER9_REF/p9eai/C9_status_progress_codes_info.html

右上のボックスで、検索したいコードを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/cfaa89ef-1438-4830-bbf2-c907fabe6cd3.png)

結果が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/ea1be6d7-5520-4eee-99a4-13ddc21d567b.png)
Polars struct

# struct

```
df = pl.DataFrame(
    {"person": [{"name": "Alice", "age": 32}, {"name": "Bob", "age": 41}]}
)
```

```
shape: (2, 1)
┌──────────────┐
│ person       │
│ ---          │
│ struct[2]    │
╞══════════════╡
│ {"Alice",32} │
│ {"Bob",41}   │
└──────────────┘
```

## structの値を個別に取得する

structのfield nameを指定して取得すれば良い。

```
df.select([
    pl.col("person").struct.field("name"), 
    pl.col("person").struct.field("age"), 
])
```

```
shape: (2, 2)
┌───────┬─────┐
│ name  ┆ age │
│ ---   ┆ --- │
│ str   ┆ i64 │
╞═══════╪═════╡
│ Alice ┆ 32  │
│ Bob   ┆ 41  │
└───────┴─────┘
```

field nameが分からない場合はSeriesにしてからstruct.fieldsにアクセスすればfield nameが表示される。

```
df["person"].struct.fields
```

```
['name', 'age']
```
backlogの時間を簡単に集計したい（「課題」画面編）

# backlog
https://backlog.com/ja/

# 作成方法
### ①以下スクリプトをショートカットURLに登録する。
```
javascript:(function(){  var eSum = 0, aSum = 0;  $('tr').each(function(){    var tds = $(this).find('td');    var e = parseFloat($(tds[13]).text());    var a = parseFloat($(tds[14]).text());    if (!isNaN(e)) eSum += e;    if (!isNaN(a)) aSum += a;  });  alert('予定時間： ' + eSum + ' 実績時間： ' + aSum);})();
```
以下はEdgeに登録した上記スクリプトの編集画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658170/12a0a239-3f4e-455c-81e9-e33187a4b141.png)


### ②上記のショートカットURLを開く（実行）すると、こんな感じで表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658170/d0c2b68e-f7dc-4715-b166-40825b65e26a.png)


# 注意点
課題のテーブルは列の位置を変更できるので、
集計したい場所にスクリプトを修正してあげる必要がある。

以下は、13列目と14列目に「予定時間」と「実績時間」があり、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658170/2430747c-c80f-45a9-8709-c71efc3c6ee2.png)

スクリプトも
```
    var e = parseFloat($(tds[13]).text());
    var a = parseFloat($(tds[14]).text());
```
のようにtds[99]の位置を修正している。



# 整形したスクリプト
１行だと何を書いているが分からないので、整形したスクリプトも載せる。
```
javascript:(function() {
  var eSum = 0, aSum = 0;

  $('tr').each(function() {
    var tds = $(this).find('td');

    var e = parseFloat($(tds[13]).text());
    var a = parseFloat($(tds[14]).text());

    if (!isNaN(e)) eSum += e;
    if (!isNaN(a)) aSum += a;
  });

  alert('予定時間： ' + eSum + ' 実績時間： ' + aSum);
})();

```



参考にされたし。
【Windows】Alt + F4 が効かない？原因は「Fnロック」かもしれません

## はじめに

この記事を開いていただきありがとうございます。
久しぶりにWindowsのパソコンを使う機会があったのですが、**ショートカットキーでウィンドウを閉じられない**ことに気づきました。調べてみると原因と解決方法が分かったので、以下でまとめます。

---

## 発生した問題

Windowsでは通常、**Alt + F4** でウィンドウを閉じることができます。
しかし今回は、**Alt + F4 を押しても何も起きず、効かない**状態でした。
Chrome や Explorer など、どのアプリでも**タブやウィンドウが閉じられない**という現象です。

---

## 原因：FnロックでF4キーの動作が変更されている

ノートパソコンの場合、**F1〜F12のファンクションキーが、デフォルトで音量調整や画面の明るさ調整などの「機能キー」として動作**する設定になっていることがあります。

この設定では、**Alt + F4 を押しても F4 が「音量ミュート」などの機能として認識されてしまい、ウィンドウを閉じるショートカットとして機能しません**。

---

## 解決方法：Fnロックを解除する

**Fnロックを解除することで、F1〜F12キーを本来の「ファンクションキー」として使えるようになり、Alt + F4 も正しく動作する**ようになります。

### 一般的な解除方法：`Fn + Esc`

1. **Fnキーを押しながら Escキー を押す**（`Fn + Esc`）
2. Fnロックが解除（または有効化）されます
> ※ Fnロックの動作や解除方法は、メーカーや機種によって異なる場合があります。

---

## 動作確認の方法

* `Alt + F4` を押してウィンドウやアプリが閉じれば、Fnロックの影響は解消されています。
* 逆に、`Alt + Fn + F4` を押すことで閉じる場合は、**Fnロックがまだ有効になっている**ということです。

---

## 最後に

今回は、**Fnロックの影響で Alt + F4 が効かなくなる現象とその対処法**についてまとめました。
久しぶりにWindowsを使うと、**ショートカットキーの仕様や設定の違い**を忘れていたり、**Macの操作と混同**してしまったりすることがあります。
もし同じように困っている方がいれば、この記事が少しでも助けになれば幸いです。
ここまで読んでいただきありがとうございました！
IAMデータベース認証

**IAMデータベース認証（IAM Database Authentication）** は、**Amazon RDS** や **Amazon Aurora** に接続する際に、**IAMの認証情報（トークン）を使ってログインできる仕組み**です。つまり、**データベースユーザー名とパスワードの代わりに、IAMで認証された一時的な認証情報**を使用します。

---

## ✅ 対応しているサービス

* ✅ Amazon Aurora（MySQL および PostgreSQL 互換）
* ✅ Amazon RDS for MySQL
* ✅ Amazon RDS for PostgreSQL

---

## 🎯 利用のメリット

| 特徴                   | 説明                           |
| -------------------- | ---------------------------- |
| **パスワード管理不要**        | RDS に直接パスワードを保存せず、IAM で安全に管理 |
| **一時的な認証トークン**       | 15分間だけ有効なトークンを使用（長期資格情報不要）   |
| **IAMロールベースのアクセス制御** | アプリやユーザーごとにアクセス権を細かく制御可能     |
| **統一された認証基盤**        | アプリも人間も、IAMベースで統一管理できる       |

---

## 🔐 構成イメージ

```
[ IAMユーザー / IAMロール ]
         ↓
 generate-db-auth-token
         ↓
[ DB接続ライブラリ ]
         ↓
[ RDS / Aurora (MySQL/PostgreSQL) ]
```

---

## 🛠 利用手順（MySQL/Aurora の例）

1. **RDSインスタンスでIAM認証を有効にする**

   * RDS設定 → `IAM DB Authentication` を `有効化`

2. **IAMユーザー/ロールにポリシーを割り当てる**

   ```json
   {
     "Effect": "Allow",
     "Action": "rds-db:connect",
     "Resource": "arn:aws:rds-db:region:account-id:dbuser:dbi-resource-id/db-username"
   }
   ```

3. **データベースユーザーを作成する（RDS内）**

   ```sql
   CREATE USER 'db-username'@'%' IDENTIFIED WITH AWSAuthenticationPlugin as 'RDS';
   GRANT SELECT ON my_table TO 'db-username'@'%';
   ```

4. **認証トークンを生成（AWS CLI or SDK）**

   ```bash
   aws rds generate-db-auth-token \
     --hostname your-db-endpoint \
     --port 3306 \
     --username db-username \
     --region your-region
   ```

5. **クライアントからトークンで接続**

   * パスワード欄に「生成したトークン」を使用
   * 例: MySQLクライアント

   ```bash
   mysql -h your-db-endpoint \
         -u db-username \
         --password=generated-token \
         --ssl-ca=...  # SSL証明書も必要
   ```

---

## 📌 注意点

* **SSL接続が必須**
* **トークンの有効期限は15分**
* Lambdaなどで使う場合は「起動時にトークンを生成→使い終わったら破棄」がベスト
* IAMポリシーにミスがあると接続できません（CloudTrailで診断可能）

---
【統計検定2級/学習メモ】2群間の平均の差の検定（対応がある場合）

※参考書の説明が若干不親切だったので自分用に噛み砕いたものをメモ。

対応のある2群間（ここではわかりやすくBeforeとAfter）の平均の差の検定を考える。

$d_i=x_{Ai}-x_{Bi}$ の平均 $\bar{d}(= \frac{1}{n}\sum{(x_{Ai}-x_{Bi})} = \frac{1}{n}\sum{d_i})$ と 標準偏差 $\hat{\sigma_d}$ を計算し、標準化変量を求める。

まず、$d$ と $\bar{d}$ は、$X \sim \mathcal{N}(\mu, \sigma^2)$ と $\bar{X} \sim \mathcal{N}(\mu, \frac{\sigma^2}{n})$ と同じノリ（？）で、以下の確率分布に従う。

$$d \sim \mathcal{N(\mu_d, \sigma_d^2)}$$

$$\bar{d} \sim \mathcal{N(\mu_d, \frac{\sigma_d^2}{n})}$$

個々の測定値 $x_{Ai} , x_{Bi}$が正規分布から抽出されている必要はなくて、あくまで差分だけが正規分布に従っていればよいという点がポイント。
正規性が怪しい場合は、シンプルに中心極限定理から $\bar{d}$ が上記の正規分布に従うことを考えれば良い。

正規性を前提にしているので、標準化変量が求められる。

$$z_{\bar{d}} = \frac{\bar{d}-\mu_{d}}{\sigma_{\bar{d}}} =  \frac{\bar{d}-\mu_{d}}{\sqrt{\frac{\sigma_d^2}{n}}}$$

ここで、検定するときは、帰無仮説は $H_o : \mu_A = \mu_B$ つまり $H_o : \mu_A - \mu_B =0$ だから、帰無仮説が正しいと仮定した場合の $\mu_d$ は以下のように示せる。

$$\mu_d = E[d_i] = E[x_{Ai}-x_{Bi}] = E[x_A] - E[x_B] = \mu_A - \mu_B = 0$$

よって、帰無仮説の下では $\mu_d = 0$ だから、検定統計量 $z_{\bar{d}}$ は、

$$z_{\bar{d}} = \frac{\bar{d}}{\sqrt{\frac{\sigma_d^2}{n}}}$$

※ 念の為、$\sigma_d^2 = \frac{\sum{(d_i-\mu_d)^2}}{n}$ となる。

上記は、母分散が既知の場合での記述。普通に考えると母分散は未知なのが当たり前。
母分散が未知の場合の $t$検定の統計量も、同じ要領で以下のように表せる。

$$ t_{\bar{d}}=\frac{\bar{d}-\mu_d}{\sqrt{\frac{\hat{\sigma_d}^2}{n}}}  →  t_{\bar{d}}=\frac{\bar{d}}{\sqrt{\frac{\hat{\sigma_d}^2}{n}}} $$

※念の為、$\hat{\sigma}^2 = \frac{\sum{(d_i-\bar{d})^2}}{n-1}$ となる。

自由度は、BeforeとAfterの2群でペアとなっている個体数 $n$ から1を引いた値（ $\nu = n-1$ ）になる。
AWS Glueクローラーメモ

AWS Glueクローラー（Crawler）は、AWS Glueのコンポーネントの一つで、**データの中身を自動でスキャンし、スキーマ（データ構造）を推論して、Glue Data Catalogに登録する**役割を担います。いわば「データの構造を読み取るロボット」です。

---

### 🔍 Crawlerの役割

* S3、RDS、DynamoDBなどの**データソースをクロール（走査）**
* データの**形式やカラム構造を自動で解析**
* Glueの**Data Catalogにテーブルとして登録**
* 新しいファイルやスキーマの変更も自動検出可能

---

### 🛠 主な使い方の流れ

1. **Crawlerを作成**

   * データの場所（例：`s3://my-bucket/raw-data/`）を指定
   * 分析対象のデータストアやIAMロールも設定

2. **ターゲットデータを走査**

   * CSV, JSON, Parquetなどを自動識別
   * スキーマ情報を抽出（例：カラム名・型）

3. **Data Catalogに反映**

   * 自動生成された**テーブル**がGlueの**データベース内**に作成される
   * これにより、AthenaやRedshift Spectrumなどからクエリ可能に

---

### 📦 対応しているデータソースの例

| データソース          | 対応例                              |
| --------------- | -------------------------------- |
| Amazon S3       | CSV, JSON, Parquetなど             |
| Amazon RDS      | MySQL, PostgreSQLなど              |
| Amazon DynamoDB | テーブル構造をそのまま取得                    |
| JDBC互換データソース    | Oracle, SQL Serverなど（接続先により制限あり） |

---

### ✅ 利用するメリット

* スキーマ定義の手間が減る
* データの変更を自動で追跡可能
* ETL前の準備が非常に楽になる
* 他の分析サービスとの接続がスムーズ

---

### 🧠 補足

* スキーマが変わると、新しいバージョンとして記録されます（スキーマ変更に強い）
* Crawlerは**スケジュール実行も可能**（例：1日1回スキャン）
* 手動でのテーブル定義も可能ですが、Crawlerでの自動化が効率的です

---

AthenaやETLジョブの前にこのCrawlerを使うことで、\*\*「どんなデータがあるのか」\*\*を自動で認識し、活用できるようになります。

使いたいデータソースがあれば、それに応じた具体例もお出しできます！
選択ソートについて調べてみた

## はじめに
　大学の授業で選択ソートについて習ったので、自分自身の理解を深める目的で、最低限の情報だけ記事にまとめてみました。

## 操作
　最小値を探して先頭と入れ替え、先頭を除いた部分でまた最小値を探し、その部分の先頭とまた入れ替える...というのを繰り返してソートを行います。

データ数をnとすると、要素は0番目からn-1番目まであります。

１段階目
0番目を最小値に
n-1番目まで見て行って、小さいものがあれば最小値を更新
0番目と最小値を入れ替え

２段階目
1番目を最小値に
同様にn-1番目まで見て行って、小さいものがあれば最小値を更新
1番目と最小値を入れ替え
・
・
・
n-1段階目
n-2番目とn-1番目を比較して小さいほうを最小値に
n-2番目と最小値を入れ替え

### 可視化
　一応記事なので文字で書きましたが、やはり文字で見てもよくわからないので可視化してみました。

![selection_sort_animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3922095/75ce04a0-d093-4585-8a77-a3e4f31e6a3b.gif)


## 計算量
　1段階目の比較回数は最初の0番目と1～n-1番目を比較するためn-1回。それ以降は１段階ごとに１回ずつ比較回数は減っていき、最後のn-1段階目で1回になるので、1～n-1までの和が、全体としての比較回数になります。

$$ 比較回数=(𝑛−1)+(𝑛−2)+⋯+1 = \frac{(𝑛−1)((𝑛−1)+1)}{2} = \frac{𝑛^2−n}{2} $$

ということで、データ数をnとしたときの計算量はO(n^2)です。

::: note
ソート前の順番によらず、常にこの計算量になります。
:::

## 安定ソートではない
　例えば[7, 2, 3, 7, 5, 1]という配列の場合以下のようになります。（わかりやすくするため７に番号を振っています）
```
[7-1, 2, 3, 7-2, 5, 1](ソート前)
[1, 2, 3, 7-2, 5, 7-1](1と7を入れ替え)
[1, 2, 3, 5, 7-2, 7-1](5と7を入れ替え)
```
ソート前と後で7-1と7-2の順番が入れ替わってしまっているので、安定ソートではないことがわかります。
 
## 内部ソート
　選択ソートは、リスト内の最小値を見つけて順番に入れ替えていくソート方法ですが、後述のコードを見ればわかる通り、入れ替えなどの操作が配列自身のメモリ領域内で完結できるので、内部ソートです。

## コード
pythonで書くと、こんな感じになります。
```python
def selection_sort(arr):
    for i in range(len(arr)-1):
        min_index = i
        for j in range(i + 1, len(arr)):
            if arr[j] < arr[min_index]:
                min_index = j

        arr[i], arr[min_index] = arr[min_index], arr[i]
```

## 総評

### 強み
- シンプルで実装が簡単
- 入れ替えの回数自体は少なめ（最大n-1）

### 弱み
- 計算量がO(n^2)のため遅い
- ほぼソート済みでも効率が改善されない
- 安定ソートではない

→　交換をあまり行いたくない場合や、初心者向けのソートとして適正あり

## 最後に
　ここまで読んで下さりありがとうございました。正直、筆者はソートなどのアルゴリズム系が、あまり得意ではないです。しかし、基本情報技術者試験などでも問われる内容ですし、毎週授業で１つずつ扱うみたいなので、復習+α的な感じで記事にしていきたいと思っています。
壊滅的な自分のUIデザインをAIにいい感じにしてもらう

# はじめに
自分は正直デザインが苦手です...。
なので個人開発で画面のイメージを作ってみたものの、パワーポイントでただ図形をはっつけたような悩ましいもので「なんとかならないものか」と頭を抱えていました。

そんな時に色々調べてく中で出会ったのが、VercelのAIツール「v0」。  
なんとなく試してみたら、いい感じになったのでデザイン苦手な人でも大丈夫ですよってことで記事にしようと思いました！

# v0とは
Next.jsを開発しているVercel社で開発されたAIツールです。
自然言語でUIないしはコードを生成してくれます。

https://vercel.com/blog/transforming-how-you-work-with-v0

# いい感じにしてもらう画面とその概要
まずは、僕がfigmaで作った、こちらの壊滅的なデザインをご覧ください笑

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2715279/7fba62a2-0871-44f9-9a51-e552f34fdee0.png)

以下のイメージで画面を作りましたが、ここからv0にいい感じにしてもらおうと思います。

## コンセプト
身近にふと感じた些細な幸せを気軽に記録できる日記アプリ。
ユーザーの「心がほっこりした」という瞬間を増やしたい。

## 機能の概要
以下のような画面、機能を想定して作りました。

- ホーム画面
    - 褒めてくれるキャラクターが常駐している
    - 記録した日記の数を月ごとに換算して表示してくれる
    - 日記追加のボタンもある
- 日記追加画面
    - 日記を記録する画面(ただし、ホーム画面に集約できそうなので今回は対象外にします)
- 一覧画面
    - カレンダーをクリックすると過去に記録した日記を閲覧できる
- 設定画面
    - まだ固まってないが、テーマ変更などをイメージしている

# いい感じにしてもらう
僕のデザインに引っ張られないよう、キャプチャは添付しないで行い、力量を確かめます笑
あくまで「いい感じに」になることを目的としているので今回はある程度よさげだったらOKにします。 

## ホーム画面
まずはホーム画面から、以下のように聞いてみます。
```
日記アプリのホーム画面を作成してください。 以下の要素を含めてください：

・一番上のカードには「今月の幸せメモリ」というタイトルで記録した数が表示 
・真ん中にユーザーを褒めてくれるキャラクター（画面内に常に表示される仮想キャラクターのような存在） 
・下には「小さな幸せを記録する」という文言のボタン 
・デザインの雰囲気は「薄いピンクで温かみのあるモダンなUI」にしてください。 
・スマホライクな画面
```
するとこんな感じになりました。最初よりはよさそう、、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2715279/65028f57-fb9d-465f-9498-b6886dd294ba.png)

もう少し、かわいくシンプルな感じにしてもらいます。
プロンプトの内容は以下です。
```
もう少しシンプルで見たらほっこりするようなデザインにできますか？
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2715279/9a7f2bf7-fcc7-42e0-886f-3ab3bf437452.png)
いい感じになりました！

## 日記追加
「小さな幸せを記録する」ボタンから日記追加のダイアログのデザインもしてもらいます。
以下で聞いてみます。
```
「小さな幸せを記録する」ボタンをクリックしたら、日記追加のダイアログを出すようにしたいです。
その際以下の要素を入れてください 
・気分を絵文字で選択できる 
・画像をアップロードする欄がある
```
いい感じのを作ってくれました！
しかも、ものの数分で実際に動くものも作るという...恐ろしや
![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2715279/79233d86-dd26-4765-b902-1f5274e6b61a.gif)

## 一覧画面
同じように一覧画面も作ってもらいます。

聞いた内容↓
```
日記アプリの一覧画面を作成してください。 以下の要素を含めてください：

・一番上にはカレンダーが表示
・カレンダーの日付をクリックするとカレンダーの下に記録した日記のカードが表示
・カードをクリックすると詳細を見れる
```

![Animation2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2715279/2aaef823-94a1-4d6a-8a35-e52ec33228e6.gif)
ほぼ自分のイメージ通りに作ってくれました。
なんか怖くなってきました...笑

## 設定画面
最後は設定画面を作ってもらいましょう。
こちらはあまり固めてなかったのであえてふんわりした感じで聞いてみます笑
```
日記アプリの一覧画面を作成してください。 
テーマの変更のほかにまだ案がないのでいい感じの設定があれば適宜追加してください。
```
なんかいい感じにしてますね笑
ところどころ動いてないところもありますが十分すぎるくらいやっちゃってます。
iPhoneの「設定」のUIに近い感じです。
![Animation3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2715279/8e3374c4-903d-4c94-ba7b-ced077d9d2fa.gif)

## 最後に
画面を「いい感じにしてもらおう」と思ってv0に頼んでみたところ、なんと実装まで含めてコード生成してくれる優れものでした。

しかも、ディレクトリ構成込みでNext.js（App Router構成）＋TypeScript＋Tailwind CSSのソースコードを生成してくれるうえ、そのままVercelにデプロイすることもできます。
正直、ちょっとしたアプリならほぼAIだけで開発できてしまいそうな勢いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2715279/a4f896ab-1a18-4f1e-92b3-ba8cf8ea0777.png)

「イメージはあるけど、いざデザインに起こすとうまくいかない…」という人は、UIデザインの壁打ち相手として使うのもおすすめですし、プロトタイプをまずv0に作ってもらい、そのあとで自分好みに改良するといった使い方も十分アリだと思います。
Pure JavaScript なGitServer

## Pure JavaScriptのGitServerを作成しました

1月ごろから細々とやっていたのですが、ようやく作成できました。

https://github.com/funkjk/tiny-git-server

デモサイトは以下
https://tiny-git-server.vercel.app/

標準のGitクライアントと[isomophic-git](https://github.com/isomorphic-git/isomorphic-git)から操作できます。


Gitの内容を理解するのに時間かかったので、そこら辺をつらつら記載していきます。
分からないところもあるので、わかる人いれば教えてくれると助かります。

## 作成した目的

Webサービス開発時に、Gitリポジトリ作るほどでもない小さい内容をバージョン管理できる仕組みが欲しかった。
しかし、ちょうどよさそうなものがない。（単純なファイルであればS3などでもよいが、複数のファイル合わせてバージョン管理したかった）
結局Gitが良いと思ったがGitHubにリポジトリを作成するほどでもないので、別のGitサーバが欲しく、サーバレスにデプロイできるものが欲しかった。

### 似ているライブラリなど

https://github.com/bahamas10/node-git-http-server
node上で動くGitServerだが、内部ではGitコマンドを実行している

https://github.com/isomorphic-git/server
isomorphic-gitのサーバの残骸
isomorphic-gitはWeb上でGitクライアントが利用できるもの


## 構築ノウハウ

### Gitサーバで用意するべきエンドポイント

http://localhost:3000/testgitrepoに対して用意するべきエンドポイントは以下の３つ

1. GET http://localhost:3000/testgitrepo/info/refs
1. POST http://localhost:3000/testgitrepo/git-upload-pack
1. POST http://localhost:3000/testgitrepo/git-receive-pack

https://git-scm.com/book/ja/v2/Git%e3%81%ae%e5%86%85%e5%81%b4-%e8%bb%a2%e9%80%81%e3%83%97%e3%83%ad%e3%83%88%e3%82%b3%e3%83%ab

git pushの時には、info/refsで現在のサーバ側のリポジトリ状態を確認し、git-receive-packにて実際に受け取る情報をもらっていく
git pullやcloneの時には、その逆にinfo/refsで現在のサーバ側のリポジトリ状態を確認し、git-upload-packでサーバからクライアント側にアップロードする
Webエンジニアからするとreceiveとuploadがわかりづらいが、もともとsshで受け取る考え方だったからそのコマンドが実施することを記載しているのだろうと思う


#### Memo

以下の環境変数を変えた状態でgitコマンドを実行することで、どのようなやり取りされているか見える
export GIT_TRACE=1
export GIT_CURL_VERBOSE=1
export GIT_TRACE_PACKET=true
https://git-scm.com/book/ja/v2/Git%E3%81%AE%E5%86%85%E5%81%B4-%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0

### やり取りされている中身

こちらについては、詳細に記載されているものを見たことはない
頑張ってパケットキャプチャとGitの実装を見つつ解析していった

基本的にやり取りされている内容はバイナリなので、そこを抑えなければならない

（余裕出来たらここら辺もうちょっと書いていきたい。。。）

### capablity

Gitではcapablityという追加機能（？）的なものがあり、基本的な動作と特定のcapabilityが指定された際に動く機能がある
本来はすべて実装するべきだが、一部しか実装できていない

各capabilitiesは以下で規定されているが、具体的な内容については記載が見つからない
https://git-scm.com/docs/protocol-capabilities


## 終わりに

RFCやJSRなどがあれば、それで割と明確に規定が書かれていて、それを実装すればよいのですが、Gitだとそれがなかったです。Gitはプロトコルではなく、ソフトなんだと実感しました。
普段はWeb系として働くことが多いので、細かくバイナリ操作するのは久しぶりでした。ちょっと汚いコードが多いので、リファクタリングしたい。
Oura RingのスコアをGitHubプロフィールに貼ってみた


最近ちょっと体調を崩しがちで、健康管理ってほんと大事だなーと感じることが増えました。
そして何故か体調が悪い日に限って仕事が立て込む気がするんですよね。
そこで「体調が悪い時はちゃんと気づいてもらえる仕組みを作ろう」と思い、
Oura RingのスコアをGitHubプロフィールに貼り付けるGitHub Actionを作りました👇

![oura-github-profile.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303869/6384318a-4a6e-4afd-87e9-dd9976a50029.png)

マネジメント視点でも、  
「今日のスコア低いな。ミーティングやめとくか」みたいな判断材料になったら面白いな、と。

## Oura Ringとは？

![ouraring.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303869/ca6f78a8-7256-49d2-b537-e5804326c1d1.png)
出典: [ouraring.com](https://ouraring.com/)

Oura Ring（オーラリング）は、指輪型のウェアラブルデバイスです。  
装着して寝るだけで、以下のようなデータを自動で計測してくれます。

- 体調全般のスコア（Readiness Score）
- 睡眠スコア（Sleep Score）
- 活動スコア（Activity Score）

見た目はシンプルなリングですが、睡眠や体調の詳細なスコアを計測できる高機能なデバイスです。
近年はライフログやセルフケアに関心のある人たちに広く使われています。

## 作ったもの

定期的にOura APIからスコアを取得し、  
GitHubプロフィールに貼れるSVGカードを生成するGitHub Actionを作成しました。

https://github.com/savvan0h/oura-profile-cards

## できること

- 直近7日分の **Readiness Score** と **Sleep Score** を取得
- それらのスコアを表示するSVGカードを生成
- GitHub Actionsで自動更新
- GitHubプロフィールなどにそのまま貼り付け可能

※現在はレイアウトや色のカスタマイズには対応していません。

## 使用例

以下のようなSVGカードがGitHubプロフィールに表示されます。

- Readiness Score

![Weekly Readiness Card](https://raw.githubusercontent.com/savvan0h/oura-profile-cards/refs/heads/main/images/weekly-readiness-card.svg)

- Sleep Score

![Weekly Sleep Card](https://raw.githubusercontent.com/savvan0h/oura-profile-cards/refs/heads/main/images/weekly-sleep-card.svg)

## セットアップ

1. `.github/workflows` にワークフローを追加
2. [OuraのAPIトークン](https://cloud.ouraring.com/user/sign-in?next=%2Fpersonal-access-tokens)をRepository Secretsに追加
3. 自動生成されたSVGファイルをREADMEに貼るだけ！

詳しい使い方は[README](https://github.com/savvan0h/oura-profile-cards#readme)をご覧ください。

## おわりに

ネタで作りましたが、
日々のスコアがちょっとした会話のきっかけにもなって面白いです。

ぜひ、GitHubプロフィールに健康ログを貼ってみてください!
基本情報技術者試験に向けてゼロから未経験者が勉強してみた_part1

# 今回やっていくこと
エンジニア未経験かつ前提知識ゼロの人間が基本技術者試験に受かるための勉強の軌跡を残していきます。

まずはそもそもA試験、B試験とはなんぞやという状態であったため、そこを調べることから始めることにしました。

科目A試験...テクノロジ、マネジメント、ストラテジ系からの出題
科目B試験...アルゴリズム・プログラミング、セキュリティからの出題

らしいです。

なので、まずは当分科目A試験のテクノロジから勉強することにしました。

この記事は、勉強したことを自分なりにまとめたものを残しておくといった方針で書いていこうと思います。

## テクノロジー基本理論
基本的にA試験は某道場を用いて勉強していこうと思います。
出てきた問題に対してわからない場合、それについて調べていくといったスタイルで勉強していきます。

# ２の補数、負数
某道場で問題を解いていたところ、第一問は高校数学の場合の数で対応できるような問題であったのですが、突然”補数”、”負数”といった言葉が出現して混乱してしまいました。
それらの用語について簡単に言うと、
| | |
|:-:|:-:|
| 補数 | 負の数を正の数で表したもの  |
|  負数| 負の数そのもの|

といった具合です。
ここでなんでわざわざ補数という概念を使うのか？といった疑問が真っ先に出てきました。

以下に補数について自分なりの解釈をまとめてみました。
例えば<font color="LimeGreen">1010110の補数の絶対値を求めよ</font>、といった問題が与えられた場合、
マイナスの表現を使わずに負の数を表したいことになります。
では負の数について考えてみると、負の数とはその絶対値と等しい正の数の話に関する単位元と考えることができます。
例えば3という数の負の数-3について
```math
3 + (-3) = 0
```
ということが成り立つため、足してゼロになる数が負の数であることが言えます。
では、10101110について同様に考えていきましょう。
```math
\begin{align}
10101110 + (01010001 + 00000001) 
\\= (10101110 + 01010001) + 00000001
\\= 11111111 + 00000001
\\= 100000000 = 00000000
\end{align}
```
無事ゼロにすることができました。最後の式は今8桁の範囲で考えているからゼロとしています。
したがって、01010001 + 00000001 = 01010010が補数の絶対値になるということです。

よく解説などに0と1を反転させて1を足す、といったような説明は最初は意味不明だったのですが、こう考えるとわかりやすいかもしれません。

# まとめ
今回の記事は短いですが、ここまでとします。
誰も読まないとは思いますが、何か間違っているところの指摘やアドバイスなどあれは非常に助かります。
これからエンジニアになるための行動や勉強などを記録していきますので、どうぞよろしくお願いいたします。
ほぼ未経験から6週間でCCNA合格｜ネットワークの基礎力を武器に

**なぜCCNAを取ろうと思ったか**
----------------------------------------
普段の業務ではAnsibleを使ってVPSの構築をしていますが、ネットワークエラーが発生した際に原因が分からず、それだけで一日を消費してしまうことが多々ありました。
そのため、ネットワークの基礎知識を身につけるべく、CCNAを取得しようと考えました。

**学習期間**
----
6週間（3/31〜5/11）
平日2時間　休日4時間
計　120時間程度

**学習プラン**
-----
**1週目：**
「1週間でCCNAの基礎が学べる本 第3版」を一周して、CCNAの全体像を把握。

**2週目：**
ping-tのピックアップ問題を一周。
問題を解きつつ、解説や参考書と照らし合わせて、「今どの分野を学んでいるのか」「この単語はどのレイヤに属するのか」「どのプロトコルに関係しているのか」などを整理しながら進める。

**3週目：**
ピックアップ問題の2周目。
正答率を意識しながら、自分が理解できていない分野を洗い出し、その単元を重点的に復習。

**4週目：**
ピックアップ問題以外の問題に取り組み始める。
ここまでである程度の理解ができているため、なんとなく問題が解けるようになる。
ただし、「これだ！」と自信を持って答えた問題が間違っていたりして、認識のズレが明らかになってくる。
そのズレを修正しながら、理解が浅い部分についてはChatGPTに質問しながら進めた。

**5週目：**
ping-tの模擬試験に挑戦。
「模擬試験で9割取れれば本番も合格できる」というネットの声を信じて、模試を開始。
出題回数が少ない順に試験を受け、「見たことがない問題をなくす」方針で進めた。

**6週目：**
模擬試験＋コマ問に取り組む。
この頃には、模擬試験で9割を3〜4回取れていたので、余った時間でコマ問を解いた。
シミュレーション問題対策になるかと思ったが、個人的には全く役に立った気がしないです...
ただ、通常問題の中にある「どのモードでコマンドを打つべきか」といった問いには強くなった気がする。

**試験中の感想**
-----
シミュレーション問題対策としてやっていたコマ問。
でも本番では「全然わからん...」という感じで、全部スキップして他の問題で点を取る戦法に。
さらに、ところどころ日本語が怪しい設問があり、手応えはまったくなかったです...。

**資格結果**
--
シミュレーション問題を一つも解かずに合格！
なんとかなりました...。

**具体的な点数配分**
---
Automation and Programmability： 70%

Network Access： 25%

IP Connectivity： 92%

IP Services： 80%

Security Fundamentals： 60%

Network Fundamentals： PENDING

こうして見ると、Network Accessのスコアがかなり低いですね。
判明しているスコアの平均は約65.4%で、よく言われる「75%以上で合格」と比べるとかなり低い。
ただ、それぞれのカテゴリが同じ問題数ではないので、割合が高いカテゴリの問題数が多くて、結果的に合格したのかなと思います。

**CCNAを受けた全体的な感想**
--
総じて、かなりつらい資格取得でした。
Cisco機器を触ったこともなく、オンプレ対応の経験も少なかったため、最初は感覚で解ける問題がほとんどなく、
「やりたくねぇ...」という気持ちと戦いながらの学習でした。
IPv6は意味不明だし、端子やケーブルなんて使わないのに覚えさせられるし...本当にしんどかったです。

ただ、3週目を過ぎたあたりから、業務内の打ち合わせで飛び交っていた用語が
「あ、これCCNAで出てきたやつだ！」と分かるようになってきて、それが楽しかったです。
以前は“何を話しているのか分からなかった”会話にも少しずつ付いていけるようになり、
確実に理解の土台ができてきたと感じています。

それでも模擬試験では、「こんなの知らねーよ！」と何度も叫んでいましたけどね...。
（実家住まいなもので、親からうるせぇと言われたこともありました...。）

**次の目標**
--
ネットワークの基礎知識は仕入れたので、
次はインフラ全体を見渡せる力を付けるために、AWS SAAを取りに行きたいなぁ...。
DockerからMuJoCoのGUIを表示させてみた

# はじめに
<!-- 発端や概要を記載 -->
普段は Ubuntu 24.04 を使用していますが、今回 Ubuntu 20.04 上で MuJoCo を動かす必要があり、Docker コンテナ内で作業を行いました。しかし、Docker 内ではそのままでは MuJoCo の GUI を表示できなかったため、表示できるように環境を整備した手順をまとめます。

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [使用環境](#Chapter1)
1. [注意事項](#Chapter2)
1. [環境構築](#Chapter3)
1. [参考文献](#reference)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# 使用環境
・ホストOS: Windows 11 Home（バージョン 24H2、ビルド 26100.3915）
・WSL2: Ubuntu 24.04 LTS
・CPU: Intel Core i7-1065G7
・RAM: 16 GB
・Dockerバージョン: 26.1.3（build 26.1.3-0ubuntu1~24.04.1）
・Xサーバ: VcXsrv（GUI表示用）

<a id="#Chapter2"></a>
# 注意事項
DISPLAYを設定後は既存のパスが変更されてしまい、Docker外でのGUI表示ができなくなるので、現在のDISPLAYを確認しておきましょう。
デフォルトだとDISPLAY=:0のようです。

<a id="#Chapter3"></a>
# 環境構築
### 1. Docker コンテナを起動して MuJoCo をインストール
以下のコマンドでUbuntu20.04コンテナを起動し、必要なパッケージとMuJoCoをインストールします。
~~~
docker run -it ubuntu:20.04 bash
apt update
apt install python3-pip
pip3 install mujoco
python3 -m mujoco.viewer
~~~
この時点ではまだGUI表示環境が整っていないため、次のようなエラーが出ます。
~~~
X11: The DISPLAY environment variable is missing
~~~
### 2. コンテナの一時停止
いったん Docker コンテナを停止して GUI 環境を整えます。
~~~
docker ps
docker stop <コンテナ名 or コンテナID>
~~~
### 3. VcXsrv のインストールと起動（Windows側）
Docker コンテナから GUI を表示するために、Windows 側に X サーバ が必要です。今回は「VcXsrv」を使用します。
ダウンロード：[https://sourceforge.net/projects/vcxsrv/](URL)[1]
インストール後、「XLaunch」を起動し、以下の設定で進めます。
「Multiple windows」を選択
「Start no client」を選択
「Disable access control」にチェックを入れる
※私は次のページを参考にしました：[https://atmarkit.itmedia.co.jp/ait/articles/1812/06/news040.html](URL)[2]
### 4. ホストPCのIPアドレスを確認
WindowsのCMDで以下を実行し、Wireless LAN adapter Wi-Fiの項目にある IPv4 アドレス をメモしておきます。
~~~
ipconfig
~~~
### 5. DISPLAY 環境変数とアクセス設定
WSLに戻り、以下のように設定します。
~~~
export DISPLAY=<IPアドレス>:0.0
xhost +local:root # rootユーザーのXアクセスを許可
docker start -ai NAME//Dokerの再開
~~~
Docker コンテナ内で以下を再実行
~~~
python3 -m mujoco.viewer
~~~
以下のようなMuJoCo の GUI が表示されれば成功です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4075273/72142a56-ec73-453f-a820-a13af398fcd9.png)

### 7. 作業終了後のアクセス制限解除
作業が終わったら、アクセス制限を戻しておきましょう
~~~
xhost -local:root
~~~

<a id="#reference"></a>
# 参考文献
- [1]：[https://sourceforge.net/projects/vcxsrv/](URL)
- [2]：[https://atmarkit.itmedia.co.jp/ait/articles/1812/06/news040.html](URL)
「ただいま」で始める即行動習慣　Alexaルーチンで5分作業モードを自動化してみた

こんにちは！ エンジニアのまるさんかく(@Marusankaku_E)です。
今回は、帰宅して「アレクサ、ただいま」と言うだけで、自然に5分間の作業モードに入ることのできるAlexaルーチンを紹介します。

##  きっかけ
最近「習慣化」に関する本を読んだのですが、そこにはこう書いてありました。

「やる気は、始めてから湧いてくる」(作業興奮と言うらしいです)

なるほど、と思って自分の日常を振り返ってみました。
仕事から帰宅 → ベッドにダイブ → 気づいたらスマホ片手にダラダラ →  気づけば日付をまたいでいる。
こんな生活、心当たりないでしょうか。

このままではまずいと危機感を覚えた私は、「帰宅直後に強制的にスイッチを入れる方法」を模索しました。
そこで思いついたのが**Alexaルーチンで自動的に“やる気スイッチ”を入れてもらうこと**でした。

## 実現したいこと

- 帰宅したら「アレクサ、ただいま」と声をかけると
    - 優しく労いの言葉をかけてくれる
    - 作業開始を促してくれる
    - BGMで環境を整えてくれる

帰宅後すぐにに５分間だけでも作業を行うことで習慣化を行おうという内容です。

## ルーチン概要

###  ルーチン名
**「ただいまルーチン」**

### 実行条件
- 音声コマンド：「アレクサ、ただいま」

### Alexaのアクション内容
1. 「おかえりなさい！お疲れ様です。」と発話
2. 「5分間だけ頑張りましょう！」と発話
3. 「落ち着いたカフェBGM」を5分間再生


##  設定手順（Alexaアプリ）

1. Alexaアプリを開きます
2. 下部メニューの「その他」をタップ　
3. 右上の「＋」をタップして新しい定型アクションを追加
4. 名前：**「ただいまルーチン」**（任意）
5. 実行条件を設定→「音声」→「アレクサ、ただいま」と入力
6. アクションを追加：
    - 「Alexaのおしゃべり」→「ひと言」→「帰ってきたら」→「おかえりなさい！お疲れ様です。」
    - 「Alexaのおしゃべり」→「カスタム」「5分間だけ頑張りましょう！」
    - 「ミュージック」→「カフェBGM」を指定 → 再生時間：5分に設定

##  応用アイデア

- 人感センサと連携して、帰宅したら定型アクションを実行する
- スマート電球と連携して「集中モードの明かり」に変える
- 作業をトラッキングするToDoアプリと連携（IFTTTなど）

##  おわりに

アレクサにそもそもただいまを言う習慣が無いため、言うこと自体を忘れてしまうことが多発しました。
しかし、いざルーチンが発動すると、意外とすんなり作業に入れて驚きました。
特に良かったのは、BGMが5分後にスッと止まるところ。タイマー音のように「さあ終わり！」とならない分、気づいたら30分くらい集中していたこともあります。
アレクサを持っていれば、誰でもすぐに試せるので、ちょっとでも「やる気が出ない」「帰宅後ダラけちゃう」と感じている方にはおすすめです。
これを機に習慣化のための仕組みづくりに取り組んでみてはいかがでしょうか。
アプリの起動速度を試すとWPFよりもWinUI 3+NativeAOTの方がだいぶ速いようです（ただし0.5秒未満の差）

# 概要

WPFは起動が遅い。とよく聞きます。実際にどれくらい遅いものか、WPF以外と比べたらどうなのか、というのを試してみました。ここでは空っぽの画面を表示するだけのアプリの起動時間を試しているため、画面が複雑になって来るとまた違うかもしれません。

# 最初に結論まとめ

WPF、WPF＋ReadyToRun、WPF（.NET Framework）、WinUI 3＋NativeAOT、ネイティブC++のウインドウを試しました。.NETは8、.NET Frameworkは4.8.1です。

ログオンからスタートアップアプリ起動までが15秒くらいの環境で試すと、WPFは少し遅いです。WPFよりもWinUI 3やネイティブの方が、0.5秒弱くらい速いようです。大差無いとも言えますし、0.5秒違えば体感でだいぶ違ってくるので大きいとも言えます。起動速度にこだわる用途ではWinUI 3+NativeAOTの採用も選択肢になりそうです。

# 詳しく

実際にシンプルなアプリを作って計測してみました。と言っても、適当な1つの計測環境で数回ずつ測っただけなので、数字はあまり正確ではありません。大まかにどんな傾向があるかを見るくらいに捉えてください。

## 計測に使ったアプリ

テンプレートから生成しただけで画面には何も追加しない状態のコードに、画面が表示されたくらいのタイミングで「プロセス起動からの経過時間」の取得を行うコードを追加したもの。

https://github.com/suusanex/measure_dotnet_app_boot

## 計測条件

1. 次の内容のVM
    1. Windows 11 x64 24H2
    2. CPUコア2
    3. メモリ8GB
    4. ※他VMとハードを共有しているためストレージ等の性能がブレる可能性有り
2. ローカルアカウントの自動ログオン設定
3. 対象アプリだけをスタートアップ登録（Startupフォルダへショートカット配置）
4. 再起動直前のスナップショットを作成し、そこへ戻してからすぐ計測

## 計測内容

1. 目視で、ログオン画面開始から、アプリの画面表示までの時間を計測
2. アプリ内の処理で、画面表示時点の、プロセス起動からの経過時間を計測

## 計測結果1 ログオン開始～スタートアップ起動

複数回計測したものはカンマ区切りで記載。

|対象|計測結果|
|---|---|
|.NET 8|18s,14s|
|.NET 8 ReadyToRun|15s,17s,15s|
|.NET Framework 4.8.1|15s,14s|
|ネイティブC++|16s,14s|
|WinUI 3 NativeAOT（自己完結）|16s,14s|

## 計測結果2 プロセス起動からの経過時間

複数回計測したものはカンマ区切りで記載。

|対象|計測結果|
|---|---|
|.NET 8|0.68s,0.50s|
|.NET 8 ReadyToRun|0.52s,0.49s,0.57s|
|.NET Framework 4.8.1|0.32s,0.31s|
|ネイティブC++|0s,0s|
|WinUI 3 NativeAOT（自己完結）|0.09s,0.18s|

## 計測結果考察

プロセス内では.NET 8では0.5～0.6秒程度なのに対し、WinUI 3は0.1～0.2秒でネイティブは0秒。.NET FWはその中間くらい。ということで速さは「ネイティブC++ > WinUI 3+NativeAOT >> .NET FW > .NET 8」といった順位になりそうです。

ネイティブC++が最速なのは当然として、WinUI 3のNativeAotはだいぶ速くなった印象ですね。

その程度の差のため、スタートアップに15秒程度を要している計測環境では、「スタートアップの起動にかかる時間」という観点だとほとんど差が見えませんでした。少なくとも空っぽのアプリについては、スタートアップ用途では気になるほどの差はなさそうです。

しかし0.5秒弱の差はあるので、狙って起動した時の体感起動速度はありそうです。そこにこだわる場合はWinUI 3の検討も選択肢になると思います。（ランタイム配布等の他の条件を満たせれば、ですが）

# まとめ

WPFは起動が遅い印象はありましたが、少なくともシンプルなアプリでは意外とそれほどの差はありませんでした。しかしWinUI 3+NativeAOTのほうが0.5秒弱くらいは速そうなので、その差にこだわる用途では検討アリだと思います。
個人的備忘録：FastAPI の環境構成を開発と本番で切り替えるシンプルな方法②

## はじめに

本記事では、FastAPIやPythonアプリをAWS ECS Fargate上にデプロイする際の環境変数の管理方法についてまとめています。

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

ローカルと本番環境での環境変数の扱いを切り替えることで、安全かつ効率的な運用を目指します。

## 書こうと思ったきっかけ

受講しているITスクールのハッカソンの開発の一環で、開発環境と本番環境で異なる環境変数の管理が必要となったため、混乱を避けるためにも設定方法を記事として記録しておくことにしました。

## 内容

### 環境ごとの`.env`利用有無

| 環境          | `.env` 読み込み | 備考                        |
| ----------- | ----------- | ------------------------- |
| ローカル        | 読み込む        | `.env` に値を記載              |
| 本番（Fargate） | 読み込まない      | Secrets Managerやタスク定義から注入 |

### 方法①：マネジメントコンソールから設定する手順

1. ECS → タスク定義 → 対象のタスク定義を選択 → 新しいリビジョンを作成
2. \[コンテナの定義] → 編集 → 環境変数セクションへ移動

![Screenshot 2025-05-12 at 7.31.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/ceb68f55-feea-41d6-a656-30f458200bf8.png)

3. 以下を追加：

| 名前             | 値（例）                                             |
| -------------- | ------------------------------------------------ |
| `ENV`          | `production`                                     |
| `DATABASE_URL` | `mysql+pymysql://user:password@host:3306/dbname` |

4. 保存してリビジョンを作成
5. 新しいリビジョンでサービスを更新（またはタスクを再起動）

#### なぜ `ENV=production` が必要？

`"name": "ENV", "value": "production"` をタスク定義の環境変数に追加する理由は、アプリケーション側で「本番環境かどうか」を判定するためです。

```python
if os.getenv("ENV") != "production":
    load_dotenv()
```

このように、`ENV` が `production` であれば `.env` ファイルを読み込まないようにしています。

* `.env` を読み込んでしまうと、ECSに設定した環境変数よりも `.env` の値が優先される可能性がある
* `.env` が存在しない状態で `load_dotenv()` を呼ぶとエラーになる場合がある（意図しない挙動）
* ローカルと本番の動作切り替えを簡単に行える

つまり「ENV=production」は、本番環境で`.env`を無効化するためのスイッチのような役割を果たしており、セキュリティや安定運用のために重要です。

### 方法②：JSONのタスク定義で書く場合

```json
{
  "containerDefinitions": [
    {
      "name": "your-container-name",
      "image": "your-image",
      "environment": [
        {
          "name": "ENV",
          "value": "production"
        },
        {
          "name": "DATABASE_URL",
          "value": "mysql+pymysql://user:password@host:3306/dbname"
        }
      ]
    }
  ]
}
```

### セキュリティ面の注意

`DATABASE_URL` にはパスワードなどの機密情報が含まれるため、**本番環境では Secrets Manager や SSM パラメータストア**を使って管理するのがベストプラクティスです。

ECSのタスク定義では `secrets` セクションを利用することで、Secrets Manager に格納された情報を直接環境変数として注入することができます。

## まとめ

* ローカルでは `.env` に記載した環境変数を使用
* 本番では Secrets Manager やタスク定義で注入し、`.env` は使わない
* `ENV=production` によって本番と開発の切り替えを制御
* 安全で柔軟な環境変数管理のため、AWSリソースと連携した設計を行う
0と1を0と11111111(-1)にして遊ぶ。(計算、加算器で)ビットマスクの為


いろいろ、注意
----

- UNOでの予定は、未定　(真面目にUNOでやっても、いいんだけど意味が無いから)
- UNOは、C++言語である。(とうぜん8ビット機)
- 0と1からビットマスクを使って任意の値にすると高速に処理できる?
- 掛け算を使えは、なしということで(例題の趣旨に反する)(アキュムレーター(全加算器)を使って遊ぶ)(細かいつこみが入りそうだけどALUに繋がつているのは、アキュムレーター(レジスター(加算器)))

プログラム
----

オンラインコンパイラーPAIZA

```c++


//8ビット分、2進数に変換して表示するマクロ(注意!!!入力は、破壊される
#define bit8_put(aa) for(int ii=8;ii!=0;ii--){if(aa&0x80){printf("1");}else{printf("0");}aa=aa<<1;}

#include <iostream>
using namespace std;
int main(void){
    // Your code here!

    char a;
    char b;
    
    a = 0;
    
    printf("IN[%d]\n",a);
    
    b = 0 - a;
    
    printf("OUT[%d]\n",b);
    printf("\n");
    
    a = 1;
    
    printf("IN[%d]\n",a);
    
    b = 0 - a;

    printf("OUT[%d]\n",0 - a);
    
    bit8_put(b);
}


```


```

IN[0]
OUT[0]

IN[1]
OUT[-1]
11111111

```
Povoの「５分以内通話かけ放題」の注意事項

# １，Povoの「５分以内通話かけ放題」の注意事項
Povo社の「５分以内通話かけ放題」を購入する時に、
月の中で契約したら、来月のこの日までの期間か（１か月間）と思っておりましたが、そうではなかったです。
例えば、4/30でも契約したら、4月が１日未満残っているけど、4/30~4/30が１か月間と計算されます。
なので、月末とかで契約するのを避けましょう。

# ２，実績
4/17で契約しまして、4月の料金支払い日(5/10)で、４月の分と、5月自動継続分の2ヵ月間が徴収されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/2a41644a-d8e3-45ee-826f-0623ddf4b8a0.png)

そんなことがPovo社のページで記載がございますので、詐欺ではありません。
ただ、これほど読む方が少ないかと(笑：）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/e583d922-306b-4fd3-8d59-0f97a6966b30.png)
個人的備忘録：FastAPI の環境構成を開発と本番で切り替えるシンプルな方法①

## はじめに

本記事では、FastAPI + SQLAlchemy アプリケーションにおける環境変数の管理方法についてまとめています。

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

特に、本番環境と開発環境での環境変数の読み込み方法を切り替える方法を紹介します。

## 書こうと思ったきっかけ

受講しているITスクールのハッカソンの開発の一環で、データベース接続情報などの機密情報を安全に管理しつつ、開発時には柔軟に変更できる仕組みを残しておきたかったため、この記事を備忘録としてまとめています。

## 内容

以下のコードでは、開発環境では `.env` ファイルを読み込み、本番環境（例：AWS Fargate）では `.env` に依存せず、事前に設定された環境変数（Secrets Managerなど）から読み込む構成にしています。

```python
import os
from dotenv import load_dotenv
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, declarative_base
from core.config import settings

# 本番以外のときだけ .env を読み込む
if os.getenv("ENV") != "production":
    load_dotenv()

DATABASE_URL = os.getenv("DATABASE_URL")

engine = create_engine(DATABASE_URL, echo=True, future=True)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()

def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()
```

このようにすることで、開発時は `.env` に接続情報を記述し、本番時はタスク定義やSecrets Managerから環境変数を注入するだけで切り替えが可能になります。

## まとめ

* `.env` の読み込みは `ENV != "production"` のときに限定
* 本番環境では AWS Fargate のタスク定義や Secrets Manager を利用
* 開発環境と本番環境の切り分けが簡単になる

セキュアかつ柔軟な構成を実現できるため、今後のプロジェクトでも活用していきたいと考えています...！
ユーザーの声を形態素解析する：C#で作った業務可視化ツール

## はじめに

ある時、別部署で「お客様からの意見・要望」を蓄積しているという話を聞きました。  
それらはCSV形式でまとめられていたものの、**上手く活用されていない**ように見えました。

せっかく蓄積されている貴重なフィードバックも、量が多くなると“読んで終わり”になってしまいがちです。  
どうにかして**傾向を客観的に見える形にできないか？** ──そう思って、形態素解析ツールの作成を思い立ちました。

当時の僕はまだ新人で、業務量にも余裕がありました。  
正式な依頼ではなかったものの、「こういうものがあったら便利だよな」と思い、空いた時間を使って試作を始めました。

ツールに求めたのは、以下のような要素です：

- 指定列のフリーテキストを一括解析（CSV入力）
- 名詞など指定した品詞だけを抽出
- 除外語リストでノイズ語を除去
- 単語ごとの出現回数をカウント・ソート
- 出現回数の下限を指定してノイズを除外
- CSVで出力できるようにする

こうしてできたのが、**MeCabSharpとWinFormsを使った軽量な形態素解析ツール**です。

この記事では、その設計方針や構成、簡単な工夫についてまとめてみます。

## 目次
- 使用技術と方針
  - なぜこの構成にしたか
- ツールの構成
- 工夫と詰まった点
- おわりに

## 使用技術と方針

このツールでは以下の技術スタックを採用しました：

- **C#（.NET Framework）＋WinForms**  
  内製ツールとしての保守性・即時性を重視し、GUIも含めて単体で完結する構成にしました。

- **MeCabSharp（MeCabのC#ラッパー）**  
  高速な日本語形態素解析エンジン「MeCab」をC#から直接呼び出せるラッパーです。  
  形態素解析とは、文章を単語単位に分解し、それぞれの品詞などを分析する技術です。

### なぜこの構成にしたか

- **業務端末で動作可能なGUI形式が必要だった**  
  実行者にとってPythonやCLI操作はハードルが高いため、GUI操作で完結させる必要がありました。

- **除外語の調整や閾値設定をUIで柔軟に行いたかった**  
  頻出語の出現バランスはデータごとに大きく異なるため、ハードコーディングせず、UIから調整可能な仕組みにしました。

- **辞書のカスタマイズに対応できるようにしたかった**  
  業界用語や社内用語など、一般辞書に存在しない単語の登録も考慮し、MeCabのユーザー辞書機能に対応させました。

## ツールの構成

このツールは、以下のような処理ステップで構成されています。

### 1. CSVファイルの読み込み

- 対象のCSVファイルをドラッグ＆ドロップ、またはファイル選択ダイアログから読み込み
- フィールドの中から「解析対象とする列」を選択（例：「要望内容」など）

### 2. 除外語リストの読み込み

- `.txt`形式の除外語ファイルを読み込み
- 1行1語形式（例：「する」「こと」「対応」など）で記述

### 3. 形態素解析の実行（MeCabSharp）

- MeCabSharp経由で、指定列の各文章を形態素解析
- 品詞フィルタ（名詞のみ、固有名詞を除外など）を適用
- トークンごとに単語リストを構築

### 4. 頻出単語の集計・ソート

- 全行を解析後、出現頻度を単語ごとにカウント
- 除外語と品詞フィルタを適用済みの状態で、回数順にソート

### 5. 閾値によるフィルタ

- 出現回数の**下限**をUIから設定可能（例：2回以上出現した語だけ残す）
- 出現回数の**上限**はあえて設けていません  
  （多く出現する語が何かは実行してみないと分からないため）

### 6. 結果のCSV出力

- 集計された結果はCSV形式で保存可能
- 他の資料作成や報告用途にそのまま活用できる

※ UI上でのプレビュー表示は未実装で、CSV出力のみに対応しています。

## 工夫と詰まった点

### 辞書の強化（ユーザー辞書の活用）

- デフォルト辞書では業界用語や社内特有の表現が解析されないケースが多く、
  MeCabのユーザー辞書機能を導入しました。
- `.csv`形式で専門用語を追加し、辞書再構築することで精度を改善。

### 品詞の取捨選択

- 動詞や助詞はノイズが多いため、名詞中心に絞る設計に。
- 固有名詞を除外するかどうかはオプションとして切り替え可能（チェックボックスで指定）

### 除外語の扱い

- ストップワードの除去に加え、ドメイン固有の不要語も除外可能に。
- 除外語リストは`.txt`形式で編集できるため、ノンエンジニアでも調整しやすい。

### 閾値設定と柔軟性

- 単語の頻度に合わせて、出現回数の下限を指定できる
- 上限フィルタは実装せず、「想定外に多い語」も可視化対象としています

## おわりに

このツールは、「せっかく蓄積されたデータをもっと活用できるようにしたい」という思いから、  
新人時代に手探りで作り始めたものでした。

形態素解析自体はすでに多くの言語処理ライブラリで扱える技術ですが、  
実際の業務で“使いやすい形”に落とし込むには、  
意外と多くの調整ポイントやユーザー目線の工夫が必要です。

特に以下のような学びがありました：

- ノイズ語の排除と、意味のある語の抽出のバランスが難しい
- 辞書のメンテナンスは地味だが、効果は大きい
- 出力結果が“次の行動につながる形”であることが重要

地味ではありますが、こうしたツールは  
「業務の中でなぜか誰も作っていなかったけど、あると確実に役に立つ」タイプのものです。

この記事が、  
- 形態素解析を実業務に取り入れてみたい方  
- C#やWinFormsで自然言語処理をやってみたい方  
- データの“読める形”への変換に関心がある方  
の参考になれば幸いです。
個人的備忘録：family を忘れると ECS タスクは登録できない話

## はじめに

AWS ECSでタスク定義を登録しようとした際に、「`フィールド: family は必須です`」というエラーが表示され、登録ができない事象に遭遇しました。

## 書こうと思ったきっかけ

受講しているITスクールのハッカソンの開発の一環で、ECSのタスク定義をJSON形式で作成・登録していた際にこのエラーが発生しました。

備忘録として残しておくことで、同じミスを防ぎ、スムーズなデプロイにつなげたいと考えています。

## 内容

このエラーの原因は、ECSタスク定義において **`family` フィールドが省略されていたこと**です。

### family フィールドとは？

* タスク定義の名前を指定する**必須フィールド**。
* 同一のfamily名で再登録するとリビジョンが上がる仕組み。

### 修正例

以下のように、`containerDefinitions` の外側に `family` フィールドを追加する必要があります：

```json
{
  "family": "my-app-task",
  "containerDefinitions": [
    { ... }
  ],
  "taskRoleArn": "arn:aws:iam::xxxxxxxxxxxx:role/ecs-task-execution-role",
  "executionRoleArn": "arn:aws:iam::xxxxxxxxxxxx:role/ecs-task-execution-role",
  "networkMode": "awsvpc",
  "volumes": [
    {
      "name": "cws-instrumentation-volume",
      "host": {}
    }
  ],
  "requiresCompatibilities": ["FARGATE"],
  "cpu": "256",
  "memory": "512"
}
```

## まとめ

`family` フィールドは見落としがちですが、ECSタスク定義には必須項目です。

:::note warn
**これを忘れると、JSONの構造がいくら正しくても登録できず、手間がかかります。**
:::

今後はテンプレートとして`family`を最初に記述しておくことで、同様のミスを防いでいきたいと思います...！
個人的備忘録：チーム開発で話題になった「配色」について検討した内容を整理してみた

## はじめに

本記事では、現在開発中のWebアプリケーションにおける配色についての所感と改善提案をまとめています。

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

## 書こうと思ったきっかけ

受講しているITスクールのハッカソンの開発の一環で、UIデザインの一部として配色に関する議論があったため、忘れないように記事として記録することにしました。

**実際にメンバーと評価したデザイン**

![Screenshot 2025-05-12 at 6.04.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/b5ec2493-6e68-4695-859b-a8cb3273ef3c.png)

## 内容

### 現在の配色に関して

* 背景：薄緑と白のストライプで落ち着いた印象
* ナビバー：紺ベースに白文字、ログアウトボタンは緑で視認性良好
* キャラクター表示部：キャラの視認性がやや弱く、背景に沈んで見える可能性がある

### 検討案1：もっとポップな配色

* 背景：クリーム色や薄いピンク系に変更
* キャラ背景：個別に丸みのある色枠を追加
* フォント色：柔らかい茶色系なども検討

| 要素       | 色名      | カラーコード  |
| -------- | ------- | ------- |
| 背景       | クリーム色   | #FFF9E3 |
| キャラ背景    | ペールピンク  | #FFDDE1 |
| フォント（茶系） | ソフトブラウン | #7A5C4F |

### 検討案2：ビジネス向けのトーンに

* 背景：単色のベージュやライトグレー
* ナビバーとボタン：統一感あるブルー・グレー系
* 全体的にモダンで落ち着いた印象に

| 要素      | 色名       | カラーコード  |
| ------- | -------- | ------- |
| 背景      | ベージュ     | #F5F5DC |
| 背景（代替案） | ライトグレー   | #EAEAEA |
| ナビバー    | ダークブルー   | #2C3E50 |
| ボタン     | スチールグレー  | #6C7A89 |
| フォント    | チャコールグレー | #333333 |

### 検討案3：レトロ感の演出

* 背景：セピア系の色合い
* ナビバーやロゴ：深緑やエンジ色で懐かしさを演出
* キャラクターフォント：明朝体やレトロ風フォントに

| 要素       | 色名      | カラーコード  |
| -------- | ------- | ------- |
| 背景       | セピア     | #F4ECD8 |
| ナビバー     | 深緑      | #355E3B |
| ロゴ・アクセント | エンジ     | #9B1C31 |
| フォント     | ダークブラウン | #3B2F2F |

## まとめ

現在の配色は落ち着きがあり万人受けしやすいが、目的やターゲット層に応じてより親しみやすさ・ビジネス感・レトロ感などを強調する選択肢もアリかと思っています。

今後の開発方針に応じて柔軟に変更を検討していきたいと感じました...！
【学習記録】Python 3 エンジニア認定基礎試験に1ヶ月半で合格しました

## はじめに

「Python 3 エンジニア認定基礎試験」に合格したので、学習記録として勉強方法をまとめてみました。  
これから試験を受ける方や、勉強法を探している方の参考になればうれしいです。

## Python 3 エンジニア認定基礎試験とは？

- 試験名：Python 3 エンジニア認定基礎試験  
- 形式：CBT方式（会場受験）  
- 出題形式：選択式（四択〜五択）  
- 出題数：40問  
- 合格ライン：70％（28問以上正解）  
- 出題範囲：Pythonチュートリアル（3.8相当）  

## この試験を受けた理由

アプリの修正などでPythonを少し触った経験はありましたが、体系的に基礎を学んだことがなかったため、**あらためて基礎力を固めようと思い、この試験に挑戦しました**。

「とにかく合格したい」という目的であれば、とりあえず模擬試験の問題を繰り返し解いて慣れる方法もあると思います。  
ただ私は、基礎をしっかり身につけたいと考えていたため、理解を深めながら進める方法を選びました。  
人によっては少し遠回りに感じるかもしれませんが、自分にとっては必要なプロセスだったと思います。

## 使用した教材・サービス

### 📘 Dpro Exam（ディープロ）
- URL：[https://diver.diveintocode.jp/dive_into_exam](https://diver.diveintocode.jp/dive_into_exam)  
- 月額：980円（税込）  
- 内容：章ごとの学習、小テスト、模擬試験が用意されているオンラインサービス  

### 📘 PRIME STUDY
- URL：[https://study.prime-strategy.co.jp/](https://study.prime-strategy.co.jp/)  
- 内容：無料で受けられる模擬試験が3回分提供されている  

## 学習スケジュール

- 学習期間：全体としては約1ヶ月半。実際に集中して取り組めたのはそのうち1ヶ月ほど  
- 体調を崩したり、仕事が忙しい時期もありましたが、無理のない範囲で継続しました  
- 試験直前は模擬試験と復習に集中して対策しました

## 勉強の進め方と意識したこと

### ✅ STEP1：Dpro Examで基礎固め

まずはDpro Examに登録し、すべての章を一通り学習しながら、小テストを解いていきました。

📌 Dpro Examを選んだ理由：
- 書籍よりもオンライン教材の方が自分に合っていたため  
- 試験対策に特化しており、要点を効率よく学べそうだと感じたため  

小テストは、ある程度の正答率が出るまで繰り返しました。

### ✅ STEP2：小テストの復習とQiitaへのアウトプット

一通り終わった後、全小テストをもう一度解き直しました。

その際、覚えていなかった内容や理解が浅いと感じた部分は**Qiitaにまとめる**ようにしました。  
このアウトプット習慣は現在も続けていて、ミスしたところやあやふやだった知識は記録して見返すようにしています。

### ✅ STEP3：Dpro模擬試験で力試し

Dpro Examの模擬試験を3回ほど実施し、毎回間違えた問題を重点的に復習しました。  
3回目くらいからは、9割前後の得点が取れるようになってきました。

### ✅ STEP4：PRIME STUDYで総仕上げ

仕上げとして、PRIME STUDYの模擬試験3回分をまず1周解き、その後も同じ3回分を2周して、合計で3周しました。  
解くたびに間違えた問題を復習し、最終的にはほぼ満点に近い点数が取れるようになりました。  
（ちなみに、Dpro Examの模擬試験より難しく、最初に解いたときはかなり苦戦しました。）

## 補助的に使ったツール：ChatGPT

学習全体を通して、ChatGPTを疑問解決のツールとして積極的に活用していました。

Pythonの文法やエラーメッセージの意味、関数やクラスの使い方など、書籍では調べにくい細かな内容にもすぐアクセスでき、理解を深める助けになります。

また、「なぜこうなるのか？」と感じたときに、それを自然な言葉でそのまま質問できるのも大きな魅力です。
複雑なトピックもかみ砕いて説明してくれるため、独学を進めるうえで非常に心強い存在でした。

---

### 🔁 学習中に意識したこと

とにかく「**毎日少しでも手を動かすこと**」を意識していました。

最近筋トレやダイエットに取り組んでいて、「小さな積み重ねの大切さ」を体感しています。  
この考え方を勉強にも応用し、短時間でも継続することを大事にしました。

完璧を求めすぎず、できる範囲でコツコツ取り組んだことが、今回の合格につながったと思います。

## 試験当日の感想

- 本番では、模擬試験で見かけたような問題が多く出題されたため、模擬試験をしっかり復習しておけば、落ち着いて対応できると感じました。  
- 難易度的には、全体的に基礎的な問題が多めで、Dpro Examの模擬試験よりやや難しいものもありましたが、PRIME STUDYの模擬試験よりはやさしめに感じました。  
- 特にコードが長めの問題は、PRIME STUDYの模擬試験とほぼ同じ形式で出題されたため、**本番対策としてPRIME STUDYの模擬試験は非常に有効**だと感じました。

## 試験を終えて思ったこと

正直これまで、プログラミングが「楽しい」と思えたことはあまりありませんでした。

でも今回の学習を通じて、**理解できると楽しさを感じられる**ようになり、苦手意識がかなり薄れました。  
これは、試験に合格できたこと以上に大きな収穫だと感じています。

## 今後の目標

まだ知識として定着しきれていない部分もあるため、引き続き基礎の理解を深めていきたいです。

今後は「Python 3 エンジニア認定実践試験」の合格を目指して、学習を継続していく予定です。

## おわりに

この記事が、これからPythonの勉強を始める方や、基礎試験に挑戦しようとしている方のヒントになれば幸いです。  

最後まで読んでいただき、ありがとうございました！
Unityの誤差許容比較Approximatelyについて

# floatの誤差許容比較関数Approximately
[孫引き](https://discussions.unity.com/t/mathf-approximately-is-not-always-working/765317/4)なんですけど、デフォルトのApproximatelyはこうなってるみたいです。
```c#
public static bool Approximately(float a, float b)
{
  return (double) Mathf.Abs(b - a) < (double) Mathf.Max(1E-06f * Mathf.Max(Mathf.Abs(a), Mathf.Abs(b)), Mathf.Epsilon * 8f);
}
```
代入を入れて見やすくしたのがこちら
```c#
public static bool Approximately(float a, float b)
{
    // max(a,b)* 0.000001f まで誤差を許容する。でも両方0に近いと、許容誤差がほぼ0になる
    float c1 = 1E-06f * Mathf.Max(Mathf.Abs(a), Mathf.Abs(b));

    // a b が0に近いとき用の、許容誤差の最小値(これ以上は小さくならないようにする)
    float c0 = Mathf.Epsilon * 8f;

    return (double)Mathf.Abs(b - a) < (double)Mathf.Max(c0,c1);
}
```
# 自分で定義したほうがいいかも？
## 理由1 比較値*0.000001f は小さすぎる?
自分で値を操作できたほうがいいかなって
## 理由2 もっと最適化できる？
許容誤差をaとbの大きいほうを基準に計算していますが、どちらでもいいと思います。
aとbが近い場合、厳密な値の比較が必要ですが、許容誤差もどちらを使ってもほとんど同じです。
aとbが遠い場合、許容誤差の誤差なんて気にならないくらい差があります。

許容誤差係数が0.01のとき、|a|<|b|, |a|=|b|rとして計算してみると、rが0.99から0.990099の間に、aかbどちらを基準にするかで結果が分かれる区間があります。

つまり片方の値の0.99倍の値と比較した場合と、0.990099倍の

100と99.0099を比較したときどうなるか
チェックする差は0.9901
99.0099が基準なら許容誤差は0.990099 許容誤差外にあります。
100が基準なら許容誤差は1 許容誤差内にあります。
# コード例
```c#
public static bool Approximately(float a,float b)
{
    // a * 0.01f までの誤差を認める
    // a b どちらでも良い
    // 差がある場合は結局false
    // 差がない場合は同じくらいの許容誤差(適正)で判断される
    float abs_a = Mathf.Abs(a);
    int z = Convert.ToInt32(abs_a < 1);
    return Mathf.Abs(a - b) < (abs_a + z) * 0.01f;
}
```
(調査中) Reactor Nettyで自動追加されるレスポンスヘッダー


| ヘッダー名| 説明 |
|:-----------|:------------|
|`Transfer-Encoding: chunked`|デフォルトで付与されやすい。レスポンスボディがストリーミング（サイズ不明）だとNettyが自動で追加。|
|`Date`|HTTP/1.1仕様に基づいてNettyが追加。|
|`Content-Length`|明示的に指定すれば付く。しなければ `Transfer-Encoding: chunked` で代用。|
|`Connection: keep-alive`|HTTP/1.1ではデフォルトで追加される。明示的に close を指定しない限り。|
|`Content-Type`|明示的に設定しない限りは通常付与されない。が、Spring WebFlux 経由だと推定で追加されることがある。|
|`Server: ReactorNetty/xxx`|Nettyのバージョンによって異なるが、自動で付加される。明示的に削除・変更可能。|

## Tomcatが Transfer-Encoding: chunked を自動設定する条件
 HTTP/1.1で、Content-Length が明示されていない場合
Servletレスポンスで Content-Length を設定しない（または設定できない）と、TomcatはHTTP/1.1の仕様に従って Transfer-Encoding: chunked を自動付加します。

過去に2重に設定されることを防ぐプルリクエストが提出されましたが、マージされなかったようです。
[Fix explicit chunked encoding specification #676](https://github.com/apache/tomcat/pull/676)

java/org/apache/coyote/http11/Http11Processor.java
https://github.com/apache/tomcat/blob/main/java/org/apache/coyote/http11/Http11Processor.java#L930
https://github.com/apache/tomcat/blob/main/java/org/apache/coyote/http11/Http11Processor.java#L948

## Spring MVC、Spriing FrameworkのWeb Client(+Reactor-Netty)、Tomcatの構成の場合にTransfer-Encoding: chunked の2重設定を防ぐには

・Spriing FrameworkのWeb Client(+Reactor-Netty)で連携先のレスポンスを受け取ったときにContent-Lengthがなかった場合にレスポンスヘッダーに`Transfer-Encoding: chunked`を自動付与

・その場合、Spring MVCは、以下のようにTransfer-Encodingをヘッダーを削除する必要がある
```java
// Transfer-Encodingを削除
headers.remove(HttpHeaders.TRANSFER_ENCODING);
```
その後、tomcatが`Transfer-Encoding: chunked`を付与する

## tomcatが`Transfer-Encoding: chunked`を付与しないようにするには、Content-Lengthを明示的に設定

```java
// Transfer-Encodingを削除
headers.remove(HttpHeaders.TRANSFER_ENCODING);

// Content-Length を明示（chunkedを無効化）
headers.setContentLength(body != null ? body.length : 0);
```