OmniAICreator/Qiita-1.07M huggingface dataset:
ページレイアウトのまとめ

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめN～Z](https://qiita.com/Keiji_otsubo/items/92f92bb9f668ca9688be)

-----------------


# 権限がないエラー

+ [insufficient permission when doing the trailhead under page layout > account layout, does someone know how to fix it?](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000MaMxj)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/45733fa5-6bb8-46af-a128-8e5851594f9f.png)

:::note
Please check this article. 


Administrator unable to edit page layout in Lightning Experience 
https://help.salesforce.com/s/articleView?id=000384259&type=1
:::
プログラムとプロセス

# 1. 要約

- プログラムを実行すると「プロセス」と呼ばれる

| 項目 | プログラム（Program） | プロセス（Process） |
| --- | --- | --- |
| 意味 | 実行前の命令集合 | 実行中のプログラムの実体 |
| 状態 | 静的（static） | 動的（dynamic） |
| 例え | 本棚に置かれた本 📚 | 読まれてる本 📖 |
| 形態 | ストレージ上のファイル | メモリ上で動作しているもの |
| 存在場所 | ディスク | メモリ |

# 2. プログラム

あるタスクを実行するための一連の命令で、コンピュータで実行可能な任意のソフトウェアを指す。プログラムは、ディスク上のファイルとして存在し、実行されるまでは何もしない**静的な存在**。一般的に**ソースコード**と呼ばれるものは、この「プログラム」に該当する。

# 3. プロセス

プロセスとは、プログラムの実行中のインスタンス（=動作中のプログラム）を指す。プログラムはOSによりメモリにロードされ、CPUによって実行されるとき、それは「プロセス」として動的に機能する。

各プロセスは、

- メモリ空間
- プロセス制御ブロック（PCB）

を持っている。

## 3.1. メモリ空間とは？

メモリ空間は、プロセスに割り当てられる専用のメモリ領域で、**プログラムコードやデータを格納するために使用される**。各プロセスは独自のリソース（メモリ空間）を持っている。これにより、各プロセスを他から独立して動かすことができる。

## 3.2. プロセス制御ブロック（PCB）とは？

プロセス制御ブロック（PCB)は、OSが**各プロセスを管理用のデータ構造**である。プロセスの「識別番号」や「プロセスが次に実行する命令のアドレス」など、OSがプロセス管理に必要とする様々な情報が入っている。例えば以下のような情報である。

- プロセスの現在の状態（実行中、待機中、終了など）
- プログラムカウンタ
- I/Oの状況　等が含まれる


# 4. 終わりに
もし間違いがあれば、コメントで教えてください。
【C#で学ぶ】応用情報技術者試験のためのアルゴリズム入門：ヒープソート編

こんにちは！応用情報技術者試験（AP）の受験者向けに、これまで[探索](https://qiita.com/izutani/items/a701cdec50bc58fe9a74)や[ソート](https://qiita.com/izutani/items/7a0465adbd0dc4939b50)アルゴリズムを解説してきました。今回は「ヒープソート」を取り上げます。ヒープというデータ構造を活用した面白いアルゴリズムで、試験でも出題される可能性があります。C#での実装とともに学びましょう！

# ヒープソートとは？
ヒープソートは、ヒープと呼ばれる特殊な二分木構造を利用してデータを整列するアルゴリズムです。ヒープには「最大ヒープ」（親ノードが子ノードより大きい）と「最小ヒープ」（親ノードが子ノードより小さい）の2種類がありますが、今回は最大ヒープを使った昇順ソートを解説します。

### ヒープソートの流れ
1. 配列を最大ヒープに変換する（ヒープ化）
2. ヒープの根（最大値）を配列の末尾に移動し、ヒープのサイズを縮小
3. 残りの部分を再びヒープ化し、2を繰り返す

### 特徴
* **時間計算量**: O(n log n)（nは要素数）
* **メリット**: 安定した性能、追加のメモリをほとんど使わない（インプレースソート）
* **デメリット**: 実装がやや複雑、他のO(n log n)のアルゴリズム（例: クイックソート）に比べて定数倍が大きい

# C#での実装例
以下は、配列を昇順に整列するヒープソートのコードです。最大ヒープを利用します。

```csharp
using System;

class Program
{
    static void HeapSort(int[] array)
    {
        int n = array.Length;

        // 配列全体を最大ヒープに変換
        for (int i = n / 2 - 1; i >= 0; i--)
        {
            Heapify(array, n, i);
        }

        // ヒープから1つずつ最大値を末尾に移動
        for (int i = n - 1; i > 0; i--)
        {
            // 根（最大値）を末尾に移動
            int temp = array[0];
            array[0] = array[i];
            array[i] = temp;

            // 残りの部分をヒープ化
            Heapify(array, i, 0);
        }
    }

    static void Heapify(int[] array, int n, int i)
    {
        int largest = i; // 親ノード
        int left = 2 * i + 1; // 左の子
        int right = 2 * i + 2; // 右の子

        // 左の子が親より大きい場合
        if (left < n && array[left] > array[largest])
        {
            largest = left;
        }

        // 右の子が親より大きい場合
        if (right < n && array[right] > array[largest])
        {
            largest = right;
        }

        // largestが親と異なる場合、交換して再帰的にヒープ化
        if (largest != i)
        {
            int temp = array[i];
            array[i] = array[largest];
            array[largest] = temp;

            Heapify(array, n, largest);
        }
    }

    static void Main()
    {
        int[] numbers = { 5, 3, 8, 4, 2 };
        Console.WriteLine("ソート前: " + string.Join(", ", numbers));

        HeapSort(numbers);
        Console.WriteLine("ソート後: " + string.Join(", ", numbers));
    }
}
```

### 実行結果
```text
ソート前: 5, 3, 8, 4, 2
ソート後: 2, 3, 4, 5, 8
```

# ヒープソートの仕組みをステップで解説
### 初期配列: [5, 3, 8, 4, 2]
1. **ヒープ化**
配列を最大ヒープに変換します。結果: `[8, 4, 5, 3, 2]`
（8が根、左右の子がそれより小さい）
2. **最大値を末尾に移動**
8を末尾に移動し、残りをヒープ化: `[5, 4, 2, 3, 8]`
3. **繰り返し**
5を末尾に移動し、残りをヒープ化…と続け、最終的に`[2, 3, 4, 5, 8]`に。
このように、ヒープの性質を利用して効率的にソートが進みます。

# 試験対策のポイント
1. **ヒープの性質を理解する**
最大ヒープでは「親 ≥ 子」が常に成り立ちます。このルールが崩れないよう、ヒープ化（Heapify）の処理が重要です。
2. **時間計算量を覚える**
ヒープ化にO(n)、ソート全体にO(n log n)かかることを押さえましょう。試験で計算量を問われたら自信を持って答えられます。
3. **疑似コードに慣れる**
試験ではC#ではなく疑似コードで出題されることも。`Heapify`の再帰的な動きを頭で追えるように練習してください。

# おわりに
ヒープソートは、ヒープというデータ構造を活かしたユニークなアルゴリズムです。応用情報技術者試験では直接出題される頻度は高くありませんが、理解しておくとアルゴリズム全体の視野が広がります。ぜひコードを実行し、配列がどう変化するか確認してみてください。ともに頑張りましょう！
【kintone】データ移行、一括更新などの際、CSVファイルをExcelで開くと、自動で型変換されてしまう問題を解決したい

# はじめに
こんにちは！
なぜか突然、中耳炎になってしまったノベルワークスの[つつみん](https://x.com/tsutsumin_38)です。痛いので、みなさんもお気をつけください…:angel:

新年度を迎えて、アプリの整理に伴うデータ移行やデータの整頓作業などが発生していませんか？

私は最近、kintoneのデータをCSV形式でエクスポートし、それをExcelで開いたところ、勝手に型が変換されてしまうという事態に直面しました。地味に困るやつですよね…:weary:

というわけで今更感はありつつも、今回は、「CSVファイルをExcelで開くと自動で型変換されてしまう問題」について、調べたことを備忘録としてまとめておきます:pencil2:

データ移行や取り込み作業の際に、同じような悩みを抱えている方の参考になれば嬉しいです！

#  :robot:なぜ型が勝手に変わるの？

## ExcelがCSVを開くときの自動処理の話
CSV（Comma Separated Values）ファイルは、カンマ（,）で区切られたプレーンテキストです。
つまり、中身は全部「文字列」として書かれてるだけです。これをExcelでダブルクリックすると、Excelは「文字列として読む」んじゃなくて、「表にしてあげるね〜」と勝手に解釈＆型変換して表示します。

## 🤖 Excelの“親切な”自動変換の例
| 入力（CSV内） | Excelで開いたときの変換例 | 問題点 |
|:-:|:-:|:-:|
| 001 | 1  | 先頭の0が消える |
| 1-2 |  1月2日や 1/2 に変換されることも | 意図しない日付変換 |
| 12E3  | 12000  | 数値（指数表記）に変換される |

##  型変換されると何が困るの？
### 実際に起きた今回の事例
①以下のレコードをcsvで書き出す
![2025-04-09_08h47_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957410/65fd84cd-c0be-406e-a6ea-28810830b5ad.png)
②csvをexcelで開く（型変換されてる…）→そのまま上書き保存する
![2025-04-09_09h24_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957410/61a46e98-6a62-42e2-86c5-b2b3f3dfb003.png)
③csvを読み込む
![2025-04-09_08h49_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957410/0c5d3df6-a776-4cbc-972b-0311bef9851a.png)

※受付番号とIDが意図しないデータになっている:alien:！！！

# 対処法は？おすすめの回避方法3選
方法①：Excelではなくテキストエディタで開く
方法②：Excelのインポート機能を使って手動で型指定する
方法③：Googleスプレッドシートで開いてからExcelへ変換

# おすすめな方法は？
今回は、Excelシートを他のメンバーと共有して編集してもらう予定があったため、
手動で型指定ができる<strong>【方法②】の「Excelのインポート機能」</strong>を採用しました。

一方で、複数人でリアルタイムに作業したい／共有の手軽さを重視したいという場合には、
【方法③】の「Googleスプレッドシートを使って開く」方が便利かもしれません。
## 方法②の手順を紹介
1. Excelを開き「データ」タブ→「テキストまたはCSVから」をクリックしてCSVファイルを選択
![2025-04-09_09h41_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957410/c6130d6f-7d59-41b2-82b6-38b67855af5d.png)

2.プレビューが表示されるので「データ型検出」を「データ型を検出しない」にして「読み込み」をクリック
![2025-04-09_09h49_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957410/7573f453-ae44-4c35-8bde-3bbde6566b65.png)

3.正しくデータが表示される
![2025-04-09_09h56_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957410/070981dc-6757-4efb-b2ce-5c372ce69ea4.png)

4.必要に応じて編集（編集後に変換されてしまう可能性があるので、「表示形式」を指定しておく）
![2025-04-09_09h56_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957410/b9811083-99ac-4d39-9d1e-a546f419f799.png)

5.変更したファイルをCSVで保存します。保存前に1行目の「見出し行」を削除。
「テーブルデザイン」の「見出し行」のチェックを外すと1行目が空白行になるので削除。
![2025-04-10_08h58_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957410/abbb08ac-adf4-4232-a5e9-d35d66cf0a6e.png)

![2025-04-10_08h59_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957410/8b6c5506-296c-400e-9e2b-9259415f211c.png)

![2025-04-10_08h56_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957410/884011a0-70a8-4d8e-b105-a6cb002d6a47.png)


# まとめ
CSVの型変換は、地味だけど見逃せない落とし穴です:frowning2:
特に、kintoneに再インポートしたときにエラーが出なかったとしても、「あれ？なんかデータおかしくない？」と後で気づく… :fearful:なんてことは、なるべく避けたい:fist:

少し手間でも、正しい手順で取り込むことで、ミスやトラブルを防ぐことができます。
今回の件で、「ちゃんと確認しよう」と心に誓ったつつみんでした:muscle:
Flaggerの`progressDeadlineSeconds`とは何か？`ImagePullBackOff`でも10分待たされる理由

Flagger(Kubernetesでカナリアリリースを実現するツール)では、イメージの取得できないような状況で、約10分間ほど待たないとカナリーが失敗判定になりません。イメージが取得できないのであればもっと早く失敗判定を下してほしいところです。この10分という待ち時間は、Flaggerの「`progressDeadlineSeconds`」パラメータが関係しています。本稿では、この設定値がCanaryデプロイメントにどう影響するのか、そしてどのように調整できるのかを解説していきます。

## Flaggerにおける進行状況デッドラインの仕組み

Flaggerは、Kubernetesのカナリアリリースを自動化するツールです。その中核となる機能の一つが、カナリーデプロイメントの自動管理です。

カナリーデプロイメントが進行する際、Flaggerは定期的にデプロイメントの状態をチェックし、問題があれば自動的にロールバックします。この「問題があると判断するまでの時間」を決めているのが、「`progressDeadlineSeconds`」というパラメータです。

### デフォルト値は10分

Flaggerのコードを見ると、`progressDeadlineSeconds`のデフォルト値は600秒（10分）に設定されています：

```go
// GetProgressDeadlineSeconds returns the progress deadline (default 600s)
func (c *Canary) GetProgressDeadlineSeconds() int {
    if c.Spec.ProgressDeadlineSeconds != nil {
        return int(*c.Spec.ProgressDeadlineSeconds)
    }

    return ProgressDeadlineSeconds // この定数が600に設定されている
}
```

https://github.com/fluxcd/flagger/blob/6f165a10de0172acd773f2c05fa92d49b72abafb/pkg/apis/flagger/v1beta1/canary.go#L31

https://github.com/fluxcd/flagger/blob/6f165a10de0172acd773f2c05fa92d49b72abafb/pkg/apis/flagger/v1beta1/canary.go#L571

つまり、何も設定しなければ、デプロイメントに問題が発生してから10分間待ってからロールバックが行われます。

## `ImagePullBackOff`と10分間の関係

`ImagePullBackOff`のようなエラーが発生すると、KubernetesはDeploymentの`Available`コンディションを`False`に設定し、その理由として`MinimumReplicasUnavailable`を記録します。同時に、このコンディションの「`LastUpdateTime`」も更新されます。

Flaggerはこの`LastUpdateTime`を基準にして、`progressDeadlineSeconds`で指定された時間（デフォルト600秒）が経過したかどうかをチェックします：

```go
if available != nil && available.Status == "False" && available.Reason == "MinimumReplicasUnavailable" {
    from := available.LastUpdateTime
    delta := time.Duration(deadline) * time.Second
    retriable = !from.Add(delta).Before(time.Now())
}
```

簡単に言えば：

1. `ImagePullBackOff`が発生→デプロイメントの状態が更新される
2. Flaggerがその状態を検出→`LastUpdateTime`からのカウントダウン開始
3. `progressDeadlineSeconds`（デフォルト600秒）経過→「リトライ不可能」と判断
4. Canaryデプロイメントを失敗と見なし、ロールバック実行

これが、`ImagePullBackOff`などのエラーが発生してから約10分後にCanaryが失敗となる仕組みです。

## デッドライン時間を調整する方法

デプロイ失敗に早く気づきたい場合、この待ち時間を短縮できます。Canary CRの`spec.progressDeadlineSeconds`パラメータを使って、進行状況デッドラインを設定しましょう：

```yaml
apiVersion: flagger.app/v1beta1
kind: Canary
metadata:
  name: my-app
  namespace: default
spec:
  # 進行状況デッドラインを180秒（3分）に設定
  progressDeadlineSeconds: 180
  # その他の設定は省略
```

この設定により、`ImagePullBackOff`などのエラーが発生した場合、3分後にはロールバックが開始されます。

## まとめ

Flaggerの「`progressDeadlineSeconds`」は、デプロイメントの進行状況を監視し、問題が発生した場合にタイムアウトで判断するための重要なパラメータです。デフォルトの10分という時間が長いと感じるなら、Canary CRでこの値を調整することで、より迅速にエラーを検出し、ロールバックさせることができます。

最後までお読みくださりありがとうございました。

Xでは、Kubernetes関連の小ネタを投稿していますので、よかったらフォローお願いします！

https://x.com/suin

また会社ではKubernetesエンジニアを募集しているので、よかったら見てみてください！

https://herp.careers/v1/c16e
IBM i 7.6の機能拡張概要 by スティーブ・ウィル

## 前置き：Mr IBM i といえば
日本で有名なMr. IBM i (AS/400）といえば昔はフランク・ソルティス博士、今はスティーブウィル氏ではないでしょうか。

ということでスティーブ・ウィルさんによるIBM i 7.6（と7.5 TR6）の紹介ブログからIBM i 7.6（と7.5 TR6）の機能拡張の目玉をご紹介します。

***IBM i 7.6は4/18に出荷開始予定です***

※ご存じのように近年のIBM i バージョンは最新2世代（現在だとIBM i 7.6と7.5）について基本的に同一の機能拡張を追加していきます。機能拡張はTR:Technology Refreshという名称のパッチ群（PTF群）で提供されます。
※ということは、IBM i 7.4については現時点で標準サポートがありますが、今後機能拡張は基本無い、という事になります。（バグフィックスほかのサポート要件でのアップデートはありますが。）

インフォセンター（IBM docs）で以下がIBM i 7.6のページです。このページから 新着情報 などで検索するとIBM i 7.6での機能拡張や変更点を調べることができます。
https://www.ibm.com/docs/ja/i/7.6.0?topic=documentation-overview-whats-new

※・・正直、検索が使いにくいので(^^;、外部の検索エンジンから検索したほうが個人的には早い事が多いです(^^;

## スティーブ・ウィル氏のブログ：Announcing IBM i 7.6 and IBM i 7.5 TR6（TechChannel）

原文はこちら
https://techchannel.com/operating-system/ibm-i-7-6-and-7-5-tr6/

### IBM i 7.6（Baseバージョン）のキーワードはセキュリティ、データベース、システム管理、アプリケーション開発、HA/DR

上記でBaseバージョンとあえて書いたのは今後数年TRとして様々な拡張がされるであろうからです。まずは2025年4月発表の7.6Baseでは上記6点をスティーブさんは挙げています。

### 1.セキュリティの拡張：MFAをIBM i OSの標準機能として提供

IBM i OSのユーザープロフィール（ユーザーID）毎にMFA（多要素認証）を設定可能になりました。MFAはTOTPベース（タイムベース・ワンタイムパスワード）です。
5250サインオンだけでなくNavigator for iブラウザーU/Iその他あらゆるユーザーアクセスが対象です(4/10深夜ウェビナーQAより)。

※4/10深夜のウェビナーでMFAはIBM i 7.5に対しては提供されない旨のQAがありました。

### 2.データベース SQLの拡張

一例として、 data-change-table-referenceが拡張された。SQLSTATE_INFO 表は、Db2 for i で使用される SQLSTATE 値とそれに対応する SQLCODE に関する情報を返します。データベース エンジニア向けには、DUMP_PLAN_CACHE プロシージャーが拡張され、QRO_HASH オプション フィルターが提供され、特定の SQL ステートメントの SQL クエリー エンジンの詳細を簡単に取得できる。
Db2 for i の機能拡張は、こちら
Db2 for IBM i　https://www.ibm.com/support/pages/db2-ibm-i

[一例](https://www.ibm.com/docs/ja/i/7.6.0?topic=statement-selecting-deleted-values)として引用
SELECT文のFROM句にDELETE文を指定することで、削除された行の値を取り出す。
従業員'00200'の削除された行のすべてのカラム値を見る
```
SELECT *
  FROM OLD TABLE (DELETE FROM EMPLOYEE
                          WHERE EMPNO = '000200'));
```

削除文に関連する追加情報を返すことができます。 削除が発生した時のタイムスタンプを返すには、INCLUDE句とSET句を使ってカラムを定義
```
SELECT DELETE_TS, EMPNO, WORKDEPT, LASTNAME, FIRSTNME
  FROM OLD TABLE (DELETE FROM EMPLOYEE
                         INCLUDE (DELETE_TS TIMESTAMP) 
                         SET DELETE_TS = CURRENT TIMESTAMP
                         WHERE EMPNO = '000280');
```

※本日時間無く、後で調べます。

### 3.システム管理 Navigator for i ほか

Navigator for i で複数IBM i のサブスクリプションライセンスの有効期限情報と警告をマルチシステム ダッシュボードと「単一システムの管理」ページに表示。Navigator for i のMFA対応。MFAの設定自体もNavigator for iからできる。
参考url: https://www.ibm.com/support/pages/ibm-navigator-i

### 4.アプリケーション開発 Code for i拡張
Code for IBM i は、FF RPGに加え、固定フォームRPGと、固定フォームRPGの参照サポート?を追加。バッチ投入、出口プログラム（EXIT POINT）デバッグサポートの追加。
Code for IBM i の Db2 for i 拡張機能ではSQL 構文検証と、自然言語処理のための AI プラットフォームとの統合を改善
参考url：https://marketplace.visualstudio.com/items?itemName=HalcyonTechLtd.code-for-ibmi

### 5.HA/DR PowerHA for i のPowerVS拡張
IBM PowerHA SystemMirror for i を使用してPowerVSでオンプレと同等のHA/DR機能を利用可能に。 これには、Global Replication Service (GRS)、FlashCopy、切り替え可能な LUN のサポートが含まれる。これによりPowerVS IBM i でストレージベースのHA/DR ソリューションが実現する。
参照url：https://www.ibm.com/products/powerha


細かなところは明日以降しらべて書きたいと思います。
【Mac】シンボリックリンクを作成・削除する方法

## 作成

以下のコマンドでシンボリックリンクを作成できます。

```shell
ln -s /path/to/original /path/to/link
```

例：`../.env.local` への `.env` というシンボリックリンクを作成

```shell
ln -s ../.env.local .env
```

## 削除方法

以下のコマンドで削除できます。

```shell
unlink /path/to/link
```
#0100（2025/04/10）クラスの初期化メソッド

# Python クラスの初期化メソッド

Pythonのクラスでは、インスタンスやクラスを初期化・設定するための特殊メソッドがいくつか用意されています。代表的な4つのメソッドと、他の関連する初期化メソッドを詳しく解説します。

---

## 1. `__init__`（インスタンスの初期化）

### 特徴
- インスタンスが生成された後に呼び出される。
- 主にインスタンス変数の初期化や設定に利用する。

### 使用例
```python
class MyClass:
    def __init__(self, value):
        self.value = value

obj = MyClass(10)
print(obj.value)  # 出力: 10
```

---

## 2. `__new__`（インスタンスの生成）

### 特徴
- インスタンスが生成される直前に呼び出される。
- クラスのインスタンス生成を制御したいときに利用。
- 必ず生成したインスタンスを返す必要がある。

### 使用例
```python
class Singleton:
    _instance = None

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance

obj1 = Singleton()
obj2 = Singleton()

print(obj1 is obj2)  # 出力: True
```

---

## 3. `__post_init__`（データクラスの初期化後処理）

### 特徴
- データクラス（`@dataclass`）のインスタンス生成後に自動で呼ばれる。
- `__init__`メソッドで設定した後の追加処理を記述したい場合に使う。

### 使用例
```python
from dataclasses import dataclass

@dataclass
class User:
    name: str
    age: int

    def __post_init__(self):
        if self.age < 0:
            raise ValueError("Age must be positive")

user = User("Alice", 30)
print(user)  # 出力: User(name='Alice', age=30)
```

---

## 4. `__init_subclass__`（サブクラスの初期化）

### 特徴
- クラスがサブクラス化された時に自動で呼び出される。
- サブクラスが生成されるたびに共通の処理を行いたい時に便利。

### 使用例
```python
class Base:
    def __init_subclass__(cls, **kwargs):
        super().__init_subclass__(**kwargs)
        print(f"Subclass initialized: {cls.__name__}")

class SubClass(Base):
    pass

# 出力: Subclass initialized: SubClass
```

---

## その他の初期化に関連する特殊メソッド

### 5. `__prepare__`（クラス定義時の名前空間準備）

- メタクラスでクラス作成時に呼ばれる。
- クラス定義内の名前空間（辞書）を準備・初期化する。

### 使用例
```python
class Meta(type):
    @classmethod
    def __prepare__(metacls, name, bases):
        print(f"Preparing namespace for {name}")
        return dict()

class MyClass(metaclass=Meta):
    pass

# 出力: Preparing namespace for MyClass
```

---

### 6. `__class_init__`（非公式）

- Python標準には存在しないが、一部のフレームワークなどが特別に用意していることがある。
- 主にクラスが初めて使用される際に初期化処理を実施するケース。

---

## 各メソッドの呼び出し順序まとめ

インスタンス生成時:

```
__new__ → __init__ → (__post_init__ ※データクラスのみ)
```

サブクラス生成時:

```
__prepare__ (メタクラス) → __init_subclass__
```

---

これらを使い分けることで、より柔軟で明確なクラス設計が可能になります。
同期処理、非同期処理とは

JavaScriptを勉強中の初心者です。今回は「非同期処理」について学んだことを、自分の理解の整理も兼ねてまとめてみます。

---

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

- 同期処理と非同期処理の違い
- JavaScriptでの非同期処理の書き方（async/await, .then）

---

## ✅ 同期処理と非同期処理の違い

### :point_up: 同期処理
処理が上から順番に実行される処理方法。
ひとつが終わるまで、次の処理に進めません。

```js
console.log("タスクAを実行");
console.log("タスクBを実行");
console.log("タスクCを実行");
```

出力
```
タスクAを実行
タスクBを実行
タスクCを実行
```

### :point_up: 非同期処理
時間がかかる処理（通信やタイマーなど）を待たずに進める処理方法。
時間のかかる処理を裏で行いながら、他の処理を進めるイメージ。


```js
console.log("タスクAを実行");

setTimeout(()=> {
    console.log("タスクBを実行, （３秒後）");
},3000);

console.log("タスクCを実行");
```

出力
```
タスクAを実行
タスクCを実行
タスクBを実行, （３秒後）
```


## ✅ JavaScriptでの非同期処理の書き方（async/await, .then）

### :point_up: 非同期処理の書き方①：async / await

```js
const resultTaskB = () => {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve("タスクBを実行");
    }, 2000);
  });
};

const sampleFunction = async () => {
  console.log("1.タスクAを実行");
  
  const result = await resultTaskB();
  console.log("2." + result);
  
  console.log("3.タスクCを実行");
};

sampleFunction();
```

出力
```
1.タスクAを実行
2.タスクBを実行
3.タスクCを実行
```
resultTaskBの処理をawaitで待ちますが、asyncの外側の処理は進めます。


### :point_up: 非同期処理の書き方②：.then でつなげる

```js
const resultTaskB = () => {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve("タスクBを実行");
    }, 2000);
  });
};

console.log("1.タスクAを実行");

resultTaskB()
  .then((result) => {
    console.log("2." + result);
    console.log("3.タスクCを実行");
  });
```

出力
```
1.タスクAを実行
2.タスクBを実行
3.タスクCを実行
```
Promiseを返す関数のあとに.then()を使って処理を続けます。

---

他にも「Promiseを省略する場合」、「Promise.allで多数の処理を待つ場合」などありますが、別で記事にしたいと思います。


参考にしたサイト：https://jsprimer.net/basic/async/
windows11で、sketchup6 その64

# 概要
windows11に、sketchup6を入れてみた。
rubyで、3Dを書く。
練習問題、やってみた。

# 練習問題
rubyスクリプトで文字を書け。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/dd3c69cd-482e-4503-9dc3-8c46732d694d.png)

# サンプルコード

```
def create_text(text)
	entities = Sketchup.active_model.entities
	entities.add_3d_text text, TextAlignLeft, "Arial"
end
```

以上。
音スイッチを作って遊ぶ。(M5NanoC6)


いろいろ、注意
----

- 過去ログ見てちょんまげ!!!
- GROVE端子の信号の外側(1)がマイク入力
- GROVE端子の信号の内側(2)がマイク電源
- 各自、データシート確認の事
- 全て秋月で調達

結果
----



![image_original(15).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/3b81cdf9-2825-4538-a0e5-d585c38ba310.jpeg)

![image_original(16).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/c9c6b662-f5bb-407a-8229-fe60255b044e.jpeg)

プログラム
----

```c++



//SoundLed_1_c6_1


//ヘッダー
#include <Arduino.h>


//初期化
void setup() {

  //シリアルポートの初期化
  //Serial.begin(9600); //debug

  //LEDのGPIO初期化
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(2, OUTPUT);
  digitalWrite(2, HIGH);

}//setup


//メインループ
void loop() {

  int vo = 0;  //電圧
  int cl = 0;  //L ch
  int i  = 0;  //counter

  //L1
  while (cl < 200) { //ピークを越えたらループから抜ける 好みでピーク値を変える
    for (i = 0; i < 8; i++) { //平均化する
      //センサーの値から電圧に変換(x39.0625/8)
      vo = analogRead(1);         //センサーの値
      //vo = ((vo * 39U) + (vo >> 4)) >> 3; //電圧こと 0～5000 //M5NanoC6
      if (vo < 1650) {vo = 1650;} //マイナス側のカット(マイクだから+-あり)
      vo = vo - 1650;             //中心にする
      cl = cl + vo;
    } //for
    cl = cl / 8;
    //Serial.println(cl); //debug
    cl = cl * 1 + cl >> 0;         //倍率を掛ける(好みで変える)
  } //while

  //LEDの点滅
  digitalWrite(LED_BUILTIN, HIGH);
  delay(100); //100ms待つ
  digitalWrite(LED_BUILTIN, LOW);
  //delay(1000); //1秒待つ

}//loop



```
MCP VSCode GithubCopilot の組み合わせでplaywrightを動かしてみた（MAC環境）

# Playwright MCP サーバーをMACにインストール
```
npm install -g @playwright/mcp
```

# VSCodeでGithubCopilotのAgentモードを許可する
メニューバーの Code > Preference > Settigs をクリックしてSettings画面を開く
![スクリーンショット 2025-04-10 6.32.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72832/9bbf4871-8501-4550-875c-86f3c5c6ca5d.png)

chat.agent.enabled で検索して、
Chat > Agent:EnabledをクリックしてチェックをONにする
![スクリーンショット 2025-04-10 6.35.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72832/8721c8c6-cbfa-4ff3-9372-f294a318169e.png)

# VSCodeでPlaywright MCP サーバーを起動する
Settings画面右上のファイルアイコンをクリックして、settings.jsonを開く
![スクリーンショット 2025-04-10 6.41.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72832/5c11ab6a-4382-495a-9947-5f94fbe068c5.png)

settings.jsonに下記のmcpの項目を追加する
```
"mcp": {
        "servers": {
            "playwright": {
                "command": "npx",
                "args": [
                    "@playwright/mcp"
                ]
            }
        }
    }
```
Startをクリックして、Runningになれば、Playwright MCP サーバーが起動しています。

![スクリーンショット 2025-04-10 6.46.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72832/f254923b-7f95-4f05-8d68-dff142747b53.png)
![スクリーンショット 2025-04-10 6.46.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72832/3b604184-b8a5-4a13-8a3e-d77c0b4951af.png)



# Github Copilot Agent モードが Playwright MCP サーバーに接続しているか確認する
Agentを選択して、レンチのアイコンをクリック
![スクリーンショット 2025-04-10 6.52.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72832/a3d42a0c-9bfb-40b1-b1ce-6b206431bb44.png)
MCP Server: playwrightのチェックボックスがONになっているポップアップがでてくればOKです
![スクリーンショット 2025-04-10 7.06.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72832/c2911922-54eb-4561-a4fc-a0ceb0699703.png)


# Github Copilot Agent モードでplaywrightを動かしてみる
「playwright で https://github.com/microsoft/playwright-mcp のサイトを開いてください」と入力して送信
![スクリーンショット 2025-04-10 7.17.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72832/a3391171-2023-4a67-b4d9-e79ff2d8c060.png)

先ほどのMCP Server: playwrightポップアップのbrowser_navigateの機能を使うか訪ねてくるので「Continue」をクリック

![スクリーンショット 2025-04-10 7.13.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72832/266faf07-0807-4ca3-9a7b-b7733165c94e.png)
![スクリーンショット 2025-04-10 7.13.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72832/847c0aac-cac0-45fa-82fb-9673d1592347.png)


「I have successfully opened the GitHub page for the Playwright MCP project.」と表示され、https://github.com/microsoft/playwright-mcp のサイトがplaywrightで表示することができました。
![スクリーンショット 2025-04-10 7.23.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72832/1abdb874-d5c0-46b7-955b-788ff53c8531.png)
Windowsのバグ？GetWindowRectとdpiの変な仕様を見つけた件について．

## 環境
- Unity 2022.3.5f1
- Windows 11 Home 24H2 (Bld. 26100.3775)
## GetWindowRectとdpi(拡大率)
Win32APIには，"GetWindowRect()" というAPIがある．

https://learn.microsoft.com/ja-jp/windows/win32/api/winuser/nf-winuser-getwindowrect

Unityからも，以下のようにDllImportを行うことで，このAPIを使用することができる．
``` cs
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
```

先日，このAPIについて，変な仕様を見つけた．
システム>ディスプレイ>拡大縮小とレイアウト から拡大率を100%から変更するときにその現象は起こる．

↓ 現在のモニター環境はこんな感じ
![スクリーンショット 2025-03-24 162710.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780404/c4a7dd96-5a4f-49d4-84c9-6bbe9c52d0cb.png)

dpi=96 (つまり，拡大率100%)のとき，GetWindowRect()で取得できるRectの4つの値は，以下のようになる．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780404/ee72aec2-1a66-411b-b6bc-3d45fae22665.png)
※左の4つの値は，GetClientRect()という別のAPIで取得した値なので，本文とは関係ない．

(Left,Top,Right,Bottom) = (1920/348/4480/1788)
まぁ，Width = 4480-1920 = 2560なので合っている．

では，dpi=192 (拡大率200%)のときはどうか．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780404/cf79ce46-18b6-4cec-8deb-759561100820.png)

なるほど，なるほど．
dpiを変更したとしても，GetWindowRect()で取得できるRectは変更がないのね．
計算できるWidth の値は変わらず，Width = 4480-1920 = 2560．


## 法則性を変えてきたWindows君
問題はここからである．
dpi=168 (拡大率175%)にしてみた．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780404/6feff3c8-a706-4f58-91e9-00a7c1fe39da.png)

(Left,Top,Right,Bottom) = (1920/348/3383/1171)

... ん？
 dpiを変更しても，取得できる値は変わらないのでは..？
 
 Width = 3383-1920 = 1463となっていて，モニタの幅が2560じゃなくなっている．
 2560/1.75=1462.8≒1463であるから，その数字になることはおかしなことではないのだけれど，それならdpi=192のときに，計算できるWidthの値が2560/2.0=1280になるはず．

 ## 他のdpiでも検証してみた
 ↓ dpi=120 (拡大率125%)
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780404/9cce6114-39d5-4d81-8b45-933a7ae78c32.png)
Width = 3968-1920 = 2048 (※2560/1.25=2048)

↓ dpi=144 (拡大率150%)
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780404/91a74ff6-68fc-4708-b224-d293fd5a8d52.png)
Width = 3627-1920 = 1707 (※2560/1.5=1706.6)

↓ dpi=216 (拡大率225%)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780404/3a00ab9f-eab4-4bd9-b934-c252a1611869.png)
Width = 4480-1920 = 2560

**「200%未満だったら，得られるRectは拡大率に対応するけど，200%以上になるとそのまま」** という感じだろうか？

## まとめ
正直，なんでこんな仕様になっているのかはわからない．
なにかいいことがあるのだろうか．

時間があるときに，追加で検証を行ってみたり，情報収集をしたりして，事情を調べてみたい．
ユークリッド距離と角度の計算

# <font color="Red">ユークリッド距離を計算<font>
覚書。
各点があり、重心を計算する。
重心から各点へのユークリッド距離と角度を計算する。
角度は基準として最初の点から見た角度とする。

以下、もし最初の点が重心とピタリ重なる場合、角度は計算されず（基準ベクトルが0）、全て0を返す。

```python
import numpy as np
# 高次元データ（N個のD次元ベクトル）
data = np.array([
    [1.0, 3.0, 3.0],
    [2.0, 1.0, 4.0],
    [0.0, 3.0, 2.0]
])

# ステップ1: 重心（平均ベクトル）を計算
centroid = np.mean(data, axis=0)

# ステップ2: 各点から重心へのベクトルを計算
vectors = data - centroid

# ステップ3: 距離を計算（ユークリッド距離）
distances = np.linalg.norm(vectors, axis=1)

# ステップ4: 単位ベクトル（方向）も取得したい場合
unit_vectors = vectors / distances[:, np.newaxis]

# オプション: 角度を取りたい場合（基準方向が必要）
# ここでは例として、最初の点を基準に他との角度を計算してみます
reference = vectors[0]
angles = []
for v in vectors:
    cos_theta = np.dot(reference, v) / (np.linalg.norm(reference) * np.linalg.norm(v))
    angle = np.arccos(np.clip(cos_theta, -1.0, 1.0))  # ラジアン
    angles.append(np.degrees(angle))  # 度数法に変換

# 結果の表示
print("重心:\n", centroid)
print("各点から重心へのベクトル:\n", vectors)
print("距離:\n", distances)
print("単位ベクトル:\n", unit_vectors)
print("角度（基準は1つ目）:\n", angles)
```
Geminiで戦士を描いてみた。

# 概要

Geminiで戦士を描いてみました。

# 実装

プロンプトと実行結果は以下の通りです。

```
炎の剣を使う戦士を描いてみてください。
```

![炎の剣を使う戦士_20250410.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/bbe453d5-da97-468b-8b47-b99b24911dec.png)

```
氷の剣を使う戦士を描いてみてください。
```

![氷の剣を使う戦士_20250410.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/6a91e346-bfb1-4965-9a64-d98737a3bffe.png)

```
電撃の剣を使う戦士を描いてみてください。
```

![電撃の剣を使う戦士_20250410.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/09ba17ed-14da-4adc-b046-e7ca255eacd8.png)

非常に興味深いです。

# まとめ

何かの役に立てばと。
マテリアルエクスプローラ

TiN(111)/HfO2(111)インターフェース、ストレーンーマッチングスーパーセル。

私たちのオンラインマテリアルバンクから入手できます：https://platform.mat3ra.com/bank/materials

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4022238/eac4c3e6-9e8a-4577-9140-3e67f21931c3.png)
ASAのサーバーをdockerで建てる

# 概要
　[前回](https://qiita.com/nattoufu/items/d113bb017d7cbc7fc7d6)最小構成でdockerfileからサーバーを構築してみました。今回は公開されているdocker-composeファイルからARKサーバーを構築しようと思います。

# 環境
* Ubuntu 22.04
* Docker 27.3.1

# マシンスペック
* CPU
    * core i7-6700
* メモリ
    * 16GB
* ディスク
    * SATA SSD 1TB

# はじめに
　前回に引き続きdockerのインストール等は他の記事に分かりやすく書いてあるので、自分が分かりやすいなと感じた記事を紹介しておきます。
 
 https://qiita.com/ryome/items/29b3241d32cf63849f63

# docker-compose.ymlのダウンロード
```bash
$ wget https://raw.githubusercontent.com/mschnitzer/ark-survival-ascended-linux-container-image/main/docker-compose.yml
```

# ポート開放
　`docker-compose.yml`のportのところを見てもらえればわかる通りに、最初の設定では`7777/udp`と`27020/tcp`を使うようになっています。なので、その2つのポートを気合いで開放してください。
 
:::note warn
 `27020/tcp`の方は変えても大丈夫なのですが`7777/udp`を変えてしまうとサーバー検索の時点で見つからなくなってしまうので注意しましょう
:::
　一応、外部ポートが`7777/udp`なら何でもいいので内部ポートをルーター設定で変えている場合は変えても問題ありません。 ~~まぁ、これが出来る人はこんな記事読まないでしょうが...~~

# とりあえず起動
```bash
$ docker-compose up -d
```
このコマンドは`compose-docker.yml`があるところで実行してください。
`-d`というのはバックグラウンドで実行みたいなものです
```bash
$ docker logs -f asa-server-1
```
`-f`はリアルタイムでログを表示という意味です
ここで`Starting the ARK: Survival Ascended dedicated server`みたいなのが出てたら成功です
もし、`Error! 23090`的なものが出ていたらもう一回`docker-compose up -d`をしてあげましょう

# 設定ファイルを適用する
先ほどのログから`ctrl+C`で抜けてください。
```bash
$ docker cp ./your/path/GameUserSetting.ini asa-server-1:/home/gameserver/server-files/ShooterGame/Saved/Config/WindowsServer
```
`./your/path/GameUserSetting.ini`のところはどっかから持ってくるなりvimとかで作るなり気合いでどうにかしてください
一度再起動しないとこの設定は適用されません

# とりあえず停止
```bash
$ docker-compose down
```
このコマンドも`compose-docker.yml`があるところで実行してください

# 設定を反映
```bash
$ docker-compose up -d
$ docker logs -f asa-server-1
```
同じように起動出来たらさっきの設定が反映されているはずです
`Game.ini`も変更したい場合は同じ手順で出来ます

# バックアップのやり方
```bash
$ docker cp asa-server-1:/home/gameserver/server-files/ShooterGame/Saved ./your/path/backup
$ zip ./your/path/backup
```
　自分はコンテナの中のセーブデータをホストPCにコピーしてzipするシェルスクリプトとcronで定期的に実行しています
　どうやらdockerコンテナのボリュームでバックアップするというオシャレな方法もあるらしいのですが、自分はセーブデータさえ無事ならいいかなって思っているのでやりません
~~めんどくさいわけではないですからね~~

# 終わりに
　dockerは本当に難しいですよね...自分もここまで構築するのに4日かかりました。もし、この記事を参考にしてやってみて詰まってしまったりしたら、コメントで質問ぶん投げてください。自分の分かる範囲で答えます。頑張ります。

 # 参考

 https://gamesv.agepote.jp/game-server/linux-ark-remaster
競プロ日記#25/04/09

# アルゴ式-[Ex. ハッシュテーブル](https://algo-method.com/tasks/878)
- 正直難しすぎた。
- 解説を読んで実装の流れというか概念みたいなものは理解できたのだが実装内容がよくわからなかった（おそらくこれはC++の言語仕様を最低限しか理解できてないせい。文法が理解できていない）
- また、解説を読んで実装の流れがわかっただけで1から実装できるかといわれるとそこまでの理解は足りていない。要復習

# アルゴ式-[表と数値 (2)](https://algo-method.com/tasks/325)
- [表と数値 (1)](https://algo-method.com/tasks/324)の要領でやれば大きな問題なく実装できる。

# アルゴ式-[3 つの仕事](https://algo-method.com/tasks/41)
- 結局DP特有の以下のような考え方が重要
1. i 日目に仕事 0 を行う場合：dp[i][0] = max(dp[i-1][1], dp[i-1][2]) + A[i][0]
2. i 日目に仕事 1 を行う場合：dp[i][1] = max(dp[i-1][0], dp[i-1][2]) + A[i][1]
3. i 日目に仕事 2 を行う場合：dp[i][2] = max(dp[i-1][0], dp[i-1][1]) + A[i][2]

```
// 1, 2, ..., N-1 日目の報酬を求める
for (int i = 1; i < N; ++i) {
   dp[i][0] = max(dp[i-1][1], dp[i-1][2]) + A[i][0];
   dp[i][1] = max(dp[i-1][0], dp[i-1][2]) + A[i][1];
   dp[i][2] = max(dp[i-1][0], dp[i-1][1]) + A[i][2];
}
```
- そしてこれらの状態を管理するdp[][]配列の管理が重要。
0,1,2いずれの仕事からスタートした場合の軌跡がdp[][]で管理されていること
```
// 動的計画法の配列を用意する
   vector<vector<int>> dp(N, vector<int>(3, 0));
```
[Spring Framework] WebClient の maxInMemorySize とは？

 「レスポンス」 を受け取る際に、どれだけメモリ上に保持して良いか の設定
 リクエスト（送信側）に対する制限ではない。
 
```java
WebClient.builder()
    .codecs(config -> config.defaultCodecs().maxInMemorySize(10 * 1024 * 1024)) // 10MB
    .build();
```
PythonでAI生成してみた【Stable Diffusion × Diffusers入門】



##  はじめに

AIによる画像生成技術が進化し、誰でもPythonを使ってアート作品を創れる時代になりました。  
この記事では、**Diffusersライブラリ**と**Stable Diffusion**を使って、

を**Pythonだけで生成**してみます。

---

##  使用するツール

- **Python 3.8以上**
- **Diffusers** ライブラリ（Hugging Face製）
- **Stable Diffusion v1.5**（学習済みテキスト→画像変換モデル）
- **torch（PyTorch）**
- **PIL（画像表示・保存）**

---

##  コード全体

以下のコードをコピペするだけで、アート生成ができます。

```python
from diffusers import StableDiffusionPipeline
import torch

# モデルをCPUで読み込む（GPUがない環境用）
pipe = StableDiffusionPipeline.from_pretrained(
    "runwayml/stable-diffusion-v1-5"
).to("cpu")  # ← ここを "cuda" にするとGPU対応

# プロンプト指定（生成したいイメージ）
prompt = "a Japanese ukiyo-e style painting of a dragon flying in the clouds"

# 画像生成（時間がかかる可能性あり）
image = pipe(prompt).images[0]

# 表示と保存
image.show()
image.save("generated_art.png")
```

---

GPUを使わないとシミュレーション時間が長すぎます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4046871/1f967c30-5c5b-45e7-b260-76b23c488a30.png)
日本語の感情分析をPythonとTransformersでやってみよう


SNSの投稿やレビューを見て「これってポジティブ？ネガティブ？」と気になったこと、ありませんか？  
    今回は、**無料で公開されているBERTベースの日本語感情分析モデル**を使って、Pythonでサクッと感情分析を行う方法をご紹介します。

---

##  Step 1：ライブラリのインストール

最初に必要なライブラリをインストールします。以下のセルを実行してください（Google Colab推奨です）。

```python
# 初回のみ実行（感情分析モデルと日本語処理に必要なライブラリ）
!pip install transformers fugashi ipadic unidic-lite
```

---

##  Step 2：日本語感情分析モデルを読み込む

`transformers` ライブラリの `pipeline` を使って、感情分類モデルを簡単に利用できます。  
ここでは、`llm-book/bert-base-japanese-v3-marc_ja` というモデルを使います。

```python
from transformers import pipeline

# 日本語の感情分析パイプラインを構築
classifier = pipeline(
    "text-classification",
    model="llm-book/bert-base-japanese-v3-marc_ja"
)
```

---

##  Step 3：SNS投稿の感情を判定してみよう！

実際に任意のSNS投稿を入れて、ポジティブ・ニュートラル・ネガティブのどれかを判定してみましょう。

```python
# 任意の日本語テキスト
text = "この製品は本当に素晴らしいと思いました。"

# 感情分析を実行
result = classifier(text)[0]

# 結果の表示
print("入力文:", text)
print("感情ラベル:", result["label"])  # positive / neutral / negative
print("確信度:", round(result["score"], 3))
```

---

##  出力結果（例）

```
入力文: この製品は本当に素晴らしいと思いました。
感情ラベル: positive
確信度: 0.998
```
ロボコン用パソコンの選び方

# 必要なスペックについて
ロボコンで使用するソフトウェアが動く物を選びましょう。それらが動くパソコンであれば大体のことが出来るので安心です。
ロボコンでよく使用するソフトウェア
機械班
・SOLIDWORKS
回路・制御班
・KiCAD
・CubeIDE
・VS Code
・VisualStudio
ロボコンでは使わなくてもSOLIDWORKSやUnityを創造工学などで使うので高いスペックの物を選んで損は無いです。

# OS
WindowsとMAC,Ubuntuが大きくわけてあります。
SOLIDWORKSはWindowsでしか動かないため機械班はWindowsにしましょう。
制御班と電気班はUbuntuやMACでも動きますが、Windowsを使っている人が多いのでWindowsにすると先輩や先生に質問できるので安心です。

# パソコンのスペックの見方
パソコンのスペックはCPUとGPUとメモリ容量で決まります。また、筐体の材質や重量、画面の種類、充電端子なども重要です。
## CPU
主にIntelとAMDがあります。
最近ではSnapdragonやMediatechも参入していますがWindowsのエミュレーターを動かしているだけで、動きにくいソフトが多いのでやめましょう。
CPUはIntelの第12世代以降、AMDの5世代以降を選びましょう。
コア数やプロセスルールが違うので性能が大きく変わります。
### Intel
CoreI3,CoreI5,CoreI7,CoreI9、CoreUltra3,CoreUltra5,CoreUltra7,CoreUltra9が一般的な用途に用いられるパソコンです。CeleronやPentium、Xeonなどもありますがスペックが低かったり用途が特殊だったりします。
Corei〇のものを選ぶ場合は〇の後が12,13,14のものを選びましょう。
CoreUltra〇のものは大体大丈夫です。
Corei〇やCoreUltra〇の〇の部分に入る文字がCPUのグレードを表しています。7や9の物を選べば大丈夫です。また、5のものでも後に話す末尾の文字がHXやHの物を選べば大丈夫です。
最後に重要なのが末尾に着いている文字です。UやHX、H,Pなどがあります。Uの物は低消費電力モデルなので性能が低く、避けた方がいいです。
### AMD
Ryzen3,Ryzen5,Ryzen7,Ryzen9,RyzenAI5,RyzenAI7,RyzenAI9が一般的な用途に用いられるパソコンです。
Ryzen Z1搭載機はゲーム用なので形状が特殊でロボコンで使うのは難しいです。
Athronは性能が低いです。
Ryzen〇のものを選ぶ場合は〇の後が5以上のものを選びましょう。
RyzenAI〇のものは大体大丈夫です。
Ryzen〇やRyzenAI〇の〇の部分に入る文字がCPUのグレードを表しています。7や9の物を選べば大丈夫です。また、5のものでも大丈夫なものもあります。
## GPU
NvidiaとAMDがあります。AMDはノートパソコン用をほとんど作っていないのでNvidiaのみ解説します。
Gforseとそれ以外があります。Gforse以外はOpenGLが使えるためSOLIDWORKSと相性がいいですが価格がかなり高いためGforseの方がいいです。
RTXとGTX,GTがありますがGTXとGTは古いのでRTXにしましょう。
RTX〇〇□□という型番だとしたら〇〇が世代、□□がグレードを表しています
GforseRTX3050以上がオススメです。GforseRTXの後の数字の〇〇に当てはまる部分が30以上、□□に当てはまる部分が50以上なら大丈夫です。
最悪、妥協してグラボが付いている物を選べばなんとかなります。
## メモリ
メモリは16GB以上にしましょう。32GBあると安心です。
8GBだと何も起動してなくても重たいです。
# ストレージ
256だと少ないです500以上を選びましょう1TBあると安心です。
## 蛇足
値段だけで選ぶと画面や筐体がしょぼかったり、重かったりするので以下も確認すると安心です。また、あると便利なアイテムも紹介します。
### 画面
大きくわけてOLEDIPS,VA,TNがあります。TN液晶とVA液晶は発色が悪く、視野角が狭いので避けた方がいいです。
13インチ以下は少し手狭に感じるので14インチ以上がいいです。
### 筐体
ロボコンではパソコンをよく持ち運ぶためプラスチック筐体の物は弱いので避けた方がいいです。
### 重量
長距離の通生は2kg超のパソコンだと腰が逝くかもしれません。IPadも持ち運ぶため軽いに越したことはないです。
### 便利なアイテム
#### マウス
トラックパッドだときついです。サイドボタンが2つ付いているBluetooth接続の物を選びましょう。ドングルだと持ち運ぶ時に邪魔で壊れたりします。
https://amzn.asia/d/iHIIG3g
#### テンキー
機械設計では数値をたくさん入力するので機械班はあると便利です。
右利きだと右手にマウス、左手にテンキーという配置にできるので作業を効率化できます。
https://amzn.asia/d/c5ipykh
#### UVCキャプチャーボード
これを使うとIPadをサブモニターとして使えます。また、IPadやスマホをRaspberryPiなどの画面として使えるので便利です。
https://amzn.asia/d/e3vAx7r

# 結論
以下のLINKから価格ドットコムで検索して出てきたパソコンがオススメです。
機械班
https://s.kakaku.com/pc/note-pc/itemlist.aspx?pdf_Spec110=8,9&pdf_Spec119=24,25,26,35,36,38,39,59,60,61,62,63,71,72,73&pdf_Spec301=13.3,13.5,14,14.5,15,15.6,16,16.3&pdf_Spec307=512,1000,2000,4000&pdf_Spec308=16,32&pdf_Spec311=15000-&pdf_so=p1
制御・回路班
https://s.kakaku.com/pc/note-pc/itemlist.aspx?pdf_Spec110=8,9&pdf_Spec301=13.3,13.5,14,14.5,15,15.6,16,16.3&pdf_Spec307=512,1000,2000,4000&pdf_Spec308=16,32&pdf_Spec311=15000-&pdf_so=p1
値段や見た目、大きさなどで選んでください。
AmazonのAmazon直売やビックカメラ,ヨドバシ、パソコン工房、ドスパラ、TUKUMO、メーカー直販がオススメです。
よく分からない方は多分これを買えば大丈夫な中で1番安い物を置いておきます。(4月10日1時)価格は変動するため最安を保証できません。
機械班
https://s.kakaku.com/item/K0001665137/
制御・電気班
https://s.kakaku.com/item/K0001543298/
pip install -r .\requirements.txt で、UnicodeDecodeError: 'cp932' codec can't decode byte 0x88 エラーが発生した場合

環境：windows

# エラー内容

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558094/d55af77e-63ab-4a75-8adc-0a4082cb8dab.png)

```
UnicodeDecodeError: 'cp932' codec can't decode byte 0x88
```

# 原因
保存形式がUTF8

# 対処方法
VS Codeの場合　
UTF-16 LEにしたら、エラーでなくなった。

エディタ右下のUFT8と記載の部分をクリックすると、エンコードを変更して保存することができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558094/bd04523f-42e6-49ad-944f-6ed1ec921543.png)
犬と猫を判別するための画像処理プログラム



##  はじめに
本記事では、犬と猫判別するPythonコードをご紹介します。


##  参考リンクまとめ



https://qiita.com/AnnoJou/items/86ba0f91b8c2cc747573


##  Pythonコード

```python
# YOLOv5のセットアップ / Setup YOLOv5
!git clone https://github.com/ultralytics/yolov5.git
%cd yolov5
!pip install -r requirements.txt

# Google Colabで画像アップロード / Upload image
from google.colab import files
uploaded = files.upload()

# アップロード画像のファイル名を取得 / Get uploaded filename
import os
img_path = list(uploaded.keys())[0]

# 推論の実行 / Run inference
import torch
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)
results = model(img_path)

# 犬と猫のみ抽出 / Filter for 'dog' and 'cat'
detected = results.pandas().xyxy[0]
filtered = detected[detected['name'].isin(['dog', 'cat'])]

# 検出結果の表示（画像とボックス）/ Show image with boxes
results.render()
from IPython.display import Image, display
import PIL.Image
display(PIL.Image.fromarray(results.ims[0]))

# 犬と猫の数をカウント / Count dogs and cats
num_dogs = (filtered['name'] == 'dog').sum()
num_cats = (filtered['name'] == 'cat').sum()
print(f"犬の数: {num_dogs}")
print(f"猫の数: {num_cats}")
```
結果
画像生成AIで作った画像


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4046871/80033d17-2ece-4c69-a486-d401f81f85b9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4046871/4cc9de35-3966-4a74-822e-d30520ee9b2d.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4046871/a2795412-e8ac-4fbe-a7a2-fab18c4ed096.png)

犬の数: 4
猫の数: 4
【Tips】他の人のリポジトリのコミット履歴を見ながら個人開発する

ここでは個人開発を継続するための方法の一つとして、他の人のリポジトリのコミット履歴を見ながらそれを辿るように開発するという、私がよく使っている手法を紹介します。

こちらの記事と合わせて参考にしていただけると幸いです。
https://qiita.com/takutosan/items/ba94ef5c104a1c6a1c1f

こんな悩みを持っていませんか？
「家にいるときのちょっとした時間でコードを書きたい、、」
「でもハードル感じてあまり継続できない、、」
自分よりできるエンジニアの方を見て、「もっとコードが書けるようになりたい...！」と思ったことはよくあることかと思います。私自身もインターンで社員の方や同じインターン学生を間近で見て、彼らみたいにコードを書けるようになりたいなと何度も思わされました。

しかし、現実は仕事終わりで疲れていたり、気付いたら片手にスマホがあって動画を見てたりSNS見てたりと自分が楽なルーティンになっちゃってる方は少なくないのではないでしょうか。

そこで、今回は他人のリポジトリを参考にして自分の興味のあるものを個人開発する際におすすめの方法として、そのリポジトリのコミット履歴（右上の時計のマーク）をInitial Commitからたどりながら開発するという方法を紹介します。

以降、今後更新予定
【初心者向け】Google検証機能の使い方？

ここではGoogle検証機能で何ができるかを中心に、Google検証機能の使い方を紹介します。これは長期インターンでもよく使っている方法なので、まだ使ったことがない方や知ってるけどGoogle検証機能で何がわかるの？といった方向けに説明します。

今後更新予定です
BunがViteに勝った話

BunがViteに勝ちました。

:::note warn
これはBunを推奨する記事ですが、Viteがいらないと言っているわけではありません。
:::

## Viteとは
ViteとはWebフロントエンドのビルドツールです。
HTML関係の処理とアセット管理などがあります。
そして開発用にHMRサーバーを立ち上げれたりします。

https://vite.dev

## Bunとは
公式では
> A fast all-in-one JavaScript runtime

となっており、まあ要するに**爆速NodeJS互換欲張りパック**です。
何があるかというと...
- 爆速npm互換パッケージマネージャー
- デフォルトTypeScript・JSX対応
- Postgres・SQLite・S3クライアント
- テストランナー・ハッシュ等の便利API
- Web標準HTTP・WebSocketサーバー
- ホットリロード

などなど。

https://bun.sh

## Bunの進化
Bunには`Bun.build`というesbuild互換バンドラーが搭載されており、これはとても進化してきました。
その一つとしてHTMLが挙げられます。
なぜかHTMLのバンドルもできるんです。Viteと同じようにそのHTMLが読み込んでいるプログラムをバンドルしてくれます。

それに加えアセット管理機能もちゃんとあって、
特に設定されてないファイル等をインポートするとファイルパスがインポートされます。
```tsx
import icon from "./assets/icon.svg";
console.log(icon); // "./assets/icon.svg"などになる。コンパイルするといい感じに解決される。
```

https://bun.sh/docs/bundler#assets

この時点でViteの代替になりうるんですが、Bunにはまだすごい機能があります。
### JSX
デフォルトでJSXに対応していて、`tsconfig.json`等から読んだ設定でコンパイルします。
```tsx
export const App = () =>
    <div>Hello!</div>;
```

https://bun.sh/docs/runtime/jsx

### esbuildプラグイン
esbuild互換なのでもちろんesbuildプラグインを使えます。
例えば[esbuild-plugin-vue3(Vue SFCプラグイン)](https://www.npmjs.com/package/esbuild-plugin-vue3)や[esbuild-svelte(Svelteプラグイン)](https://www.npmjs.com/package/esbuild-svelte)など。
```tsx
import esbuildPluginVue3 from "esbuild-plugin-vue3";
Bun.build({
    entrypoints: ["./index.html"],
    plugins: [esbuildPluginVue3],
    outdir: "dist"
})
```
### 速い
速いです。esbuildの1.76倍、Viteの内部で使われてるRollupにTerserを追加した場合188倍の速度......恐ろしい

https://bun.sh/docs/bundler

### サーバー標準搭載
BunではこのようにHTMLを実行しようとするとそのページのWebサーバーを起動できます。
```bash
$ bun index.html
```
そしてホットリロードは以下のようにできます。
```bash
$ bun --hot index.html
```
プラグインは`bunfig.toml`で指定できます。

https://bun.sh/docs/runtime/bunfig#preload

### 他にも色々
- [開発サーバーをバックエンドとの併用](https://bun.sh/docs/bundler/fullstack)
- [ソースマップ](https://bun.sh/docs/bundler#sourcemap)
- [ローダー](https://bun.sh/docs/bundler/loaders)
- [ネストCSS・CSSの便利系](https://bun.sh/docs/bundler/css#syntax-lowering)
- [マクロ](https://bun.sh/docs/bundler/macros)

オーバーキルだな...

## Viteと比較
|論点| Vite | Bun |
|:-:|:-:|:-:|
| 速度 | △ | ◎ |
| 標準搭載機能 | △ | ◎ |
| アセット管理 | ◎ | ○ |
| 学習難易度 | ○ | △ |
| 依存関係の追加 | 必要 | 不要 |
## 結論
Bunはすごい。
自分みたいなBunを信仰している人は参考にしてください。
そして速度を求める人も試してみてください。
## おまけ：wasm-packでちょっと苦労した
wasm-packが出力したパッケージは以下のような構造になっています。
```mermaid
graph TD;
    WebAssembly.wasm-->ラッパー.js;
    ラッパー.js-->クライアント.js;
```
なのでラッパーにうまくWasmファイルを渡す必要があります。
普段はラッパーがうまく読み込んでくれるのですが、
残念ながらBunのインポートシステムでWebAssemblyをそのままインポートできません。
なのでwasm-packで`--target bundler`で出力したパッケージを読み込めません。
`--target web`はViteが上手く解決してくれましたがBunは上手く解決してくれません。
なので手動で伝える必要があります。
このようにして解決できました。
```js:クライアント.js
import wasm from "bge-wasm/wasm"; // WebAssemblyのパス
import init from "bge-wasm/web"; // ラッパー

init(wasm);
```
以上。
sshキーを作成してgithubに登録する方法

# 鍵ペアの作成

ホームディレクトリに移って、下記コマンドから.から始まる隠しファイルがないか確認する。
```
ls -a
```

ない場合は下記コマンドで鍵ペアを入れるための.sshフォルダを作成する。
```
mkdir ~/.ssh
```

このコマンドで鍵ペア(秘密鍵、公開鍵)が作成できる。

```
ssh-keygen -t ed25519
```

そしたら下記について聞かれるのですべて`Enter`をおす。
![Monosnap yurikawasha — yurikawasha@yurikawashanoMacBook-Pro — ~ — -zsh — 93×32 2025-04-09 23-46-59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3982231/6ab536bd-385b-4d1f-9c11-d1e802a3fae9.png)

`Enter`をおして、こんな感じの図形が出てきたら鍵の作成は成功。
![Monosnap yurikawasha — yurikawasha@yurikawashanoMacBook-Pro — ~ — -zsh — 93×32 2025-04-09 23-45-34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3982231/60740d08-cc34-4edf-bfcf-ed95fe2dcd9e.png)

次に先ほど作成した.sshフォルダの中に移動する。
```
cd ~/.ssh
```

`ls`でid_rsa(秘密鍵)、id_rsa.pub(公開鍵)が作成されているか調べる。


# githubへの登録

鍵の登録はここで行う。
https://github.com/settings/keys

そしたら、右上のNew SSH keyをクリック。
![Monosnap SSH and GPG keys 2025-04-10 00-07-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3982231/6404a65f-72fa-4afa-a500-250e8110fc59.png)

中身はこんな感じ。
![Monosnap Add new SSH key 2025-04-10 00-08-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3982231/67d81414-f033-4f74-ab47-60d272820a76.png)

登録できたら、ターミナル上でこれを打ち込んで確認。
```
ssh -T git@github.com
```

yesかnoのどちらか聞かれるので、下記を見て、フィンガープリントが間違っていなかったら、`yes`を入力
https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/githubs-ssh-key-fingerprints

自分のgithub上の名前が返ってきたら成功です。


追記:
VScode上でpushする場合はターミナル上で下記の設定が必須。

```
 git config --global user.name "自分の名前" 
```

```
 git config --global user.email "自分のメールアドレス" 
```

設定ができているか確認。

```
 git config --global --list
```

<br>

:::note alert
※ **2025/05/05 追記**
鍵ペアの作成方法で`ssh-keygen -t rsa` を記載していましたが、この鍵暗号方式は古いので使わないでください。
:::
[iOS] GitHubにAPIキーを公開しない方法（xcconfigを活用）

## ⭐️ はじめに
最近、マップを活用したUIを実装してみたくて、Google Maps PlatformでAPIキーを発行しました。
本記事では、発行したAPIキーがGitHubにアップロードされないようにする方法について紹介します。

## 👨‍💻 詳細

### 🤷‍♂️ なんで？
まず、APIキーを隠すべき理由はセキュリティの観点から非常に重要です。
APIキーが公開リポジトリに含まれてしまうと、第三者に不正に利用される可能性があります。
例えば、Google Maps PlatformのAPIキーが漏洩されると、他人に大量のリクエストを送られ、想定外の課金が発生するリスクがあります。

そのため、APIキーはソースコードに直接書かず、.xcconfigファイルなどを使って外部から安全に読み込む方法が推奨されています。

### 🏃‍➡️ 方法
色んな方法がありますが、本記事では’.xcconfig’ファイルを利用する方法を紹介します。

1。ファイルを作成します。
![스크린샷 2025-04-06 15.28.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050491/fd69bf77-5d2c-4ebd-b323-9c25e89ef339.png)

２。作成したファイルに以下のように環境変数を定義します。
![스크린샷 2025-04-10 00.01.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050491/cae57e49-8803-4e24-8f63-5113aefe874b.png)


3。そしてプロジェクトにconfigurationsを上で作った'.xcconfig'ファイルに設定します。
![스크린샷 2025-04-06 15.32.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050491/9affcc19-8dc0-4bde-a554-2f3b9c6a62d7.png)

４。info.plistでは、以下のように環境変数を活用してapi keyを設定します。
![스크린샷 2025-04-09 23.56.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050491/a1115907-392e-4d4e-8fd5-88ad4229dff8.png)

５。'.gitignore'に'.xcconfig'ファイルを追加します。
![스크린샷 2025-04-09 23.59.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050491/caa2f18e-9fee-47c4-a904-8dc5215b2992.png)

以下のコードのように値がよく出力されるかを確認することができます。
![스크린샷 2025-04-10 00.07.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050491/03c54a8b-a0cb-48f9-9225-c583c7e288ea.png)


## 💬 まとめ 
APIキーだけでなく、BaseURLのような機密性が高い情報も、上記のような方法で必ず隠して万が一の事故を防ぐことが最善の方法だと考えています。
Autonomous Database: 踏み台経由でプライベートのAPEXにアクセスする

## はじめに
プライベートのAutonomous Database（ADB）を利用しているAPEXに、Linuxサーバーを踏み台にしてSSHポートフォワードで接続します。

## 構成イメージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3963468/5c408ca1-eb5e-4a76-82e0-7d89cc6c6152.png)

## 前提

セキュリティリストで以下を許可しておきます。

パブリック（踏み台）サブネット
- イングレス
    - 接続元からから22/tcp
- エグレス
    - すべて

プライベート（ADB）サブネット
- イングレス
    - VCNから443/tcp
- エグレス
    - すべて

## 手順

1. ローカル端末（Powershell等）から、ADBに踏み台サーバーを経由するSSHポートフォワーディングします

    ```ruby
    ssh -i "<踏み台の鍵の場所>" -N -L <localポート番号>:<ADBのプライベートエンドポイントIP>:<宛先=ADBのポート番号:443> <user名>@<踏み台のPublicIP>
    ```

    例：`ssh -i "C:\Users\XXX\XXX.key" -N -L 443:10.0.1.6:443 opc@168.XX.XX.XX`

1. ローカル端末のWebブラウザから https:\/\/localhost へアクセスします

1. ORDS（Oracle Rest Data Services）のページからAPEXの管理画面にアクセスすることができます。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3963468/431a0a64-19f0-4d4d-8f6c-85c56a018460.png)

1. APEXの実行（もしくはSQL Developer WebからDatabase Actions）をクリックして作成されているDBユーザー（admin等）でログインします。
コンテンツデータのコピペ方

### cpコマンド
```
shopt -s dotglob #隠しファイルもコピーできるようになる
cp -p /old/document/root/* /new/document/root/　#旧から新へコピペ
shopt -u dotglob　#設定解除
```
### rsyncコマンド

```
rsync -av --progress /old/document/root/ /new/document/root/
```
`
各オプションの意味
`
- a ：アーカイブモード（ディレクトリ構造・シンボリックリンク・パーミッション・所有者などを保持しつつコピー）
 
- v ：冗長モード（コピーされるファイル名などを表示）

- --progress ：進行状況（コピーの進み具合）を表示

`
パスの最後の / の意味
`
- 中身だけをコピー（/old/document/root/ の中のファイルを対象）

`
/ がない場合
`
- ディレクトリごとコピーされる（/old/document/root/ フォルダごと複製）
GoでBcryptを使用するときのメモ

# GoでBcryptを使用するときのメモ

パスワード保存にargon2が推奨[^1]されている現在でもBcryptを使うときようのメモ。

- 使用しているパッケージ->[golang.org/x/crypto/bcrypt](golang.org/x/crypto/bcrypt)

Bcryptは72バイト文字より長い入力を切り捨てる[^2]ため、それ以上の入力を考慮するのであればハッシュ関数（例えば出力長が64バイトのSHA-512）を用いるなどして入力長が72バイト以下に収まるように処理しなくてはならない。一部の実装ではヌルバイト文字を終端文字として認識してしまう問題があるが、golang.org/x/cryptoの実装ではそのような問題がない[^3]ので、HMACを使ってBcryptの入力にすればよい。

※単にSHA-512を使うと脆弱なので❌

```golang
var secretKey []byte

func init() {
	key := os.Getenv("SECRET_KEY")
	if key == "" {
		log.Fatal("SECRET_KEY is not set")
	}
	secretKey = []byte(key)
}

func computeHMACSHA512(data []byte) []byte {
	h := hmac.New(sha512.New, secretKey)
	h.Write(data)
	return h.Sum(nil)
}

func GeneratePasswordHash(password []byte) ([]byte, error) {
	p := computeHMACSHA512(password)
	return bcrypt.GenerateFromPassword(p, bcrypt.DefaultCost)
}

func VerifyPassword(hashedPassword, password []byte) bool {
	p := computeHMACSHA512(password)
	return bcrypt.CompareHashAndPassword(hashedPassword, p) == nil
}

```

[^1]:[https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html](https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html)
[^2]: [golang.org/x/crypto](https://pkg.go.dev/golang.org/x/crypto)ではエラーになる
[^3]: 最終的にコミットには含まれていないが、過去にこの動作についてドキュメント化されようとしていたようである->[https://go.dev/cl/516916](https://go.dev/cl/516916)。
IPアドレスの枯渇問題とその実態

IPアドレスは、インターネット上でデバイスを一意に識別するために必要不可欠な存在です。私たちが使うインターネット接続機器、例えばスマートフォンやPCなどには、それぞれ固有のIPアドレスが割り当てられています。しかし、IPアドレスの識別は全世界のデバイスの全てをまかなえるのでしょうか。

## IPv4アドレスの構成とその制限
IPv4アドレスは32ビットで構成され、通常は4つのオクテット（8ビット）に分かれて、次のような形式で表現されます。
```
192.168.0.1
```
これを32ビットの2進数にすると、次のようになります。
```
11000000.10101000.00000000.00000001
```
これにより、IPv4では理論上、約42億（2^32）の異なるIPアドレスが存在することになります。しかし、実際にはこの「全アドレス」が有効に使用されるわけではありません。

## IPアドレスの枯渇と原因
IPアドレスが枯渇する理由は、以下の点にあります。

**特定用途向けに予約されたアドレス**
一部のIPアドレスは特定の用途や用途専用に予約されています。これにより、一般的な利用可能なIPアドレスは制限されます。例えば：
- `0.0.0.0` や `255.255.255.255` はブロードキャストや特殊な目的に使用されるもの
- プライベートネットワーク用のアドレス範囲（`10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`など）
- リンクローカルアドレス（`169.254.0.0/16`）

**IPアドレスの無駄な使用**
アドレスの割り当てが効率的でない場合、無駄に多くのIPアドレスが割り当てられ、実際には利用されないことがあります。たとえば、非常に大きなIP範囲が特定の企業や組織に割り当てられても、すべてのアドレスが使われるわけではないことがあります。

**割り当てミスや管理の不備**
初期のインターネットの成長段階では、IPアドレスの割り当てが非常に緩やかであったため、大規模なIPブロックが無駄に使われるケースがありました。

## IPv4の枯渇とその対策
IPv4アドレスが枯渇する問題を解決するために、いくつかの対策が講じられました。

### NAT（Network Address Translation）

NATを使うことで、複数の内部ネットワークデバイスが1つのIPアドレスを共有することができ、IPv4アドレスの利用効率が向上します。これにより、家庭や企業の内部ネットワークは、インターネットに出る際に同じIPアドレスを使用することができます。

### CIDR（Classless Inter-Domain Routing）

CIDRを使用することで、IPアドレスの割り当てをより細かく調整し、より効率的に使用できるようにしています。CIDRでは、従来のクラスベースのアドレス指定（A、B、Cクラス）を廃止し、柔軟にサブネットを指定できるようにしました。

### IPv6への移行

最も根本的な解決策は、IPv6への移行です。IPv6は128ビットのアドレス空間を使用し、事実上、無限のIPアドレスを提供します。これにより、インターネット接続を持つデバイスの急増に対応できるようになります。

## IPv6の普及
**IPv6**は、**IPv4**に代わる新しいインターネットプロトコルで、128ビットのアドレス空間を提供します。これにより、理論的には2^128（約340澗個）のIPアドレスが利用可能となります。この膨大なアドレス空間により、IPアドレスの枯渇問題は解消されます。

IPv6への移行は進んでおり、特にモバイル機器やIoT（モノのインターネット）デバイスが増加する中で、IPv6が重要な役割を果たすと期待されています。ただし、完全なIPv6への移行は時間がかかるため、しばらくはIPv4とIPv6が並行して使用される状態が続きます。

## まとめ
IPアドレスは42億通りといった数ではありますが、実際には予約されたアドレスや効率的な使用方法によって枯渇問題を回避してきました。IPv4アドレスの枯渇問題は、NATやCIDR、そして最終的にはIPv6への移行によって解決されつつあります。IPv6により、今後も十分にアドレスを供給できるようになっています。