OmniAICreator/Qiita-1.07M huggingface dataset:
fish-speech をLinuxにインストールして使う方法

# 目次

1. [fish-speech の特徴](#0-fish-speech-の特徴)
2. [fish-speech のインストール](#1-fish-speech-のインストール)
   - [1.1 仮想環境の作成](#11-仮想環境の作成)
   - [1.2 リポジトリのクローン](#12-リポジトリのクローン)
   - [1.3 依存関係のインストール](#13-依存関係のインストール)
   - [1.4 モデルのダウンロード](#14-モデルのダウンロード)
3. [fish-speech の実行](#2-fish-speech-の実行)
4. [WebUI を使用した推論](#3-webui-を使用した推論)
   - [4.1 テキストと音声の入力](#41-テキストと音声の入力)
5. [参考資料](#4-参考資料)

---

## 0. fish-speech の特徴

fish-speech は、以下のような特徴を持つ先進的な音声合成ツールです。

1. **ゼロショット & 少数ショット TTS**  
   10秒から30秒の短い音声サンプルを入力するだけで、高品質な音声を生成できます。詳細は[音声クローン最佳实践指南](https://docs.fish.audio/text-to-speech/voice-clone-best-practices)をご覧ください。

2. **多言語 & クロスランゲージサポート**  
   英語、日本語、韓国語、中国語、フランス語、ドイツ語、アラビア語、スペイン語など、多言語テキストを簡単に処理できます。

3. **音素依存なし**  
   強力な汎化能力を持ち、音素を必要とせずに任意の文字表現を処理可能です。

4. **高精度**  
   5分の英語テキストで、約2%のCER（文字誤り率）とWER（単語誤り率）を達成しています。

5. **高速推論**  
   Nvidia RTX 4060ではリアルタイムファクター約1:5、RTX 4090では約1:15の高速処理を実現。

6. **WebUI 推論**  
   Gradioベースの直感的なWebインターフェースを提供し、Chrome、Firefox、Edgeなど主要ブラウザで利用可能。

7. **GUI 推論**  
   PyQt6を使用したグラフィカルインターフェースも提供されており、Linux、Windows、macOSで動作します。[詳細はこちら](https://github.com/AnyaCoder/fish-speech-gui)。

8. **簡単なデプロイ**  
   推論サーバーを簡単にセットアップでき、速度の低下を最小限に抑えます。

---

## 1. fish-speech のインストール

### 1.1 仮想環境の作成

まず、`conda`を使用してPython 3.11の仮想環境を作成します。

```bash
conda create -n fish-speech python=3.11 -y
conda activate fish-speech
```

### 1.2 リポジトリのクローン

`fish-speech`のリポジトリをクローンし、ディレクトリに移動します。

```bash
git clone https://github.com/fishaudio/fish-speech.git
cd fish-speech/
```

### 1.3 依存関係のインストール

必要なパッケージをインストールします。以下のコマンドを使用してください。

```bash
pip install -e .[stable] -i https://pypi.tuna.tsinghua.edu.cn/simple
```

### 1.4 モデルのダウンロード

`huggingface_hub`をインストールし、事前学習済みモデルをダウンロードします。

```bash
pip install huggingface_hub
huggingface-cli download --resume-download fishaudio/fish-speech-1.5 --local-dir checkpoints/fish-speech-1.5
```

---

## 2. fish-speech の実行

以下のコマンドで`fish-speech`を起動します。

```bash
./entrypoint.sh
```

初回実行時には、必要なモデルやリソースが自動的にダウンロードされます。

---

## 3. WebUI を使用した推論

`fish-speech`を起動した後、ブラウザで`http://127.0.0.1:7860/`にアクセスします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932781/54801553-318e-415b-abed-2ea6cbe578a9.png)


### 4.1 テキストと音声の入力

1. **テキスト入力**: 推論したいテキストを入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932781/8dc3fc14-b60c-48b1-850b-a3547296b466.png)


2. **参照音声のアップロード**: 参照音声ファイルをアップロードします。
3. **参照音声のテキスト入力**: 参照音声に対応するテキストを入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932781/099eb856-e39a-4541-ab7a-69269e34699f.png)

4. **推論開始**: 「生成」ボタンをクリックして推論を開始します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932781/353e4090-db34-4480-bae7-af1d0ae71eed.png)


---

## 4. 参考資料

- [Hugging Face モデルページ](https://huggingface.co/fishaudio/fish-speech-1.5)
- [GitHub リポジトリ](https://github.com/fishaudio/fish-speech)

---

以上が、Linux環境での`fish-speech`のインストールと使用方法です。ぜひお試しください！
箱庭でUnityを動かしてみる（2日目）

# 2025/2/13（2日目）実施内容
- シミュレータ起動 -> isuueを投げるも，解決に至らなかった

箱庭でUnityを動かすリポジトリは古くなっており，最新の環境（チップ：Apple M2，macOS：Sequoia 15.3）では動かないため，hakoniwa-ros2sim を土台にするのは困難

-> そこで，今使っているPCを変更（MacBook Air -> 汎用 Windows PC）
- もう一度インストールから！！
- すんなりとインストール完了（恐いくらいにエラー出なかった）
- 正常に動作することを確認

## 次は何をしていくか
- ロボットの操作がわからないので，手を動かして調べる
- 箱庭のメッセージ通信を理解して，外部からロボットを制御することを考える
- フローチャートを生成するプログラムを作成する（これがコントローラになる）
- Unityシーンを手直し（自分好みに）
- ロボット自体も変えていく（ゲームに沿った，自分好みに）
読取専用設定を使用せずに親テーブルから値を取得し、編集不可かつレコード非保存にする方法

## **概要**
カラムに読取専用設定を適用せずに親テーブル（Aテーブル）から値を取得し、子テーブル（Bテーブル）のカラムに表示するが、その値を編集不可にし、保存時にはクリアする方法。
※ **読取専用**にすると、スクリプトで他テーブルから取得した値をカラムに持たせることができなくなる。今回はスクリプトで他テーブルから取得した値をカラムに持たせたいが手入力は受け付けないための方法を考察する。

## **スクリプト（Pleasanter用）**

```javascript
$p.events.on_editor_load = function () {
    getParentData();
    $p.getControl('NumB').attr('disabled', true);  // 完全に入力不可
}

// 貸出明細テーブル (B) の「分類A」の値が変更されたら呼び出す
$(document).on('change', '#' + $p.getControl('ClassA')[0].id, function () {
    getParentData();
});

getParentData = function() {
    let classAValue = $p.getControl('ClassA').val(); // 貸出明細の「分類A」

    if (classAValue) {
        console.log("取得するレコードID:", classAValue); // 確認ログ

        $p.apiGet({
            'id': classAValue,
            'done': function (data) {
                console.log("APIレスポンス:", data); // 確認ログ

                if (data.Response && data.Response.Data && data.Response.Data.length > 0) {
                    let numBValue = data.Response.Data[0].NumHash?.NumB || data.Response.Data[0]?.NumB;
                    console.log("取得した数値B:", numBValue); // 確認ログ

                    $p.set($p.getControl('NumB'), numBValue);
                } else {
                    console.warn("レスポンスデータが空");
                    $p.set($p.getControl('NumB'), "データなし");
                }
            },
            'fail': function (data) {
                console.error("APIリクエスト失敗:", data);
            }
        });
    } else {
        console.log("分類Aが未設定のため、数値Bをクリア");
        $p.set($p.getControl('NumB'), '');
    }
};

// **保存時に NumB をクリア**
$p.events.before_send = function () {
    console.log("更新時に NumB をクリア");
    $p.set($p.getControl('NumB'), null);
};
```

## **スタイル（CSS）**
```css
#Results_NumB {
    pointer-events: none; /* クリックや入力を無効化 */
    background-color: #e9ecef; /* 無効化風の背景色 */
}
```

## **カラム設定**
- **数値Bカラム（NumB）**: **Null許容** にする

## **ポイント**
1. **親テーブル（Aテーブル）から値を取得**
2. **取得した値を子テーブル（Bテーブル）の `NumB` にセット**
3. **`NumB` を編集不可にする（CSS + disabled 属性）**
4. **保存時に `NumB` の値をクリアする（before_send イベント）**

## **動作確認済みの環境**
- Pleasanter
- JavaScript (jQuery ベース)
ダブルクオーテーションで閉じ忘れてあるHTML属性を正規表現で一括で閉じ直す備忘録

## 結論
- 検索文字列：`(\w+)=([^" >]+)`
    - ※「＊」を押下して正規表現検索を有効にしておく
- 置換文字列：`$1="$2"`

## 解説
- `$1,$2`は正規表現でヒットした文字列
- `$1`はそのままで、`$2`のみダブルクオーテーションで括って`"$2"`
- なおVSCODEだと上記だが`\1`のように表記するエディタもあるので注意
Vueのテンプレート構文

Vueのテンプレート構文は、HTMLをベースにしたテンプレート構文を使用します、基本はHTMLですが、様々な拡張機能が用意されています。

## 展開
生のHTMLよりも、HTMLの内容を簡単に置き換えることができます。書き方としては、二重波括弧 `{{ ... }}` で囲まれたやつです。

例：
```Vue
<div> {{ text }} </div>

let text = "This is Vue";
```

この例では、text の値を変更すると、div の内容も自動的に変更されます。

これは「テキスト展開 (tekisuto tenkai)」または「テキスト挿入 (tekisuto sounyuu)」と呼ばれます。

## プロパティーとバインディング

Vueでは、双方向バインディングという機能があります。HTMLまたはJavaScriptで変更したデータは、どこから変更しても、もう一方の値もそれに合わせて変わります。

例えば、input 要素の v-model ディレクティブを使うと、入力された値が自動的に Vue インスタンスのデータに反映されます。(例如，使用 input 元素的 v-model 指令，输入的值会自动反映到 Vue 实例的数据中。)

## ディレクティブ
ディレクティブは、JavaScriptの関数や値の宣言とバインディングのための文法です。

v-if、v-on、v-for など、v- で始まる特別な属性は、ディレクティブと呼ばれます。

・ v-if: 条件付きレンダリング、指定された条件が真の場合のみ、要素をレンダリングします

・ v-on (または @): イベントリスナー、 DOMイベント (例えば、クリック) をリッスンし、対応するJavaScriptの関数を実行します

・v-for: リストレンダリング配列の各要素に対して、要素を繰り返しレンダリングします。.
Proj #002 取引先コード申請のオンライン化をするゾ～第3回 Patch関数の壁にぶち当たったゾ～

https://qiita.com/Novskiiiiiiiiii/items/4a80fd1d051315e1c6f0

あけおめ、という事で約2か月ぶりの更新です。

ちょっと困った事が発生したのであ…ありのまま、今起こった事を話すぜ。

キャンバスアプリに「登録」ボタンを配置していて、
OnSelectのプロパティにPatch関数を仕込もうと計画していたのだ。

そのPatch関数を実行すると、申請管理用のリストにアイテムが作成されるってわけ。

でもそのリストには全部門の申請が作成されるわけで、A部門の申請内容をB部門の人が見れるとダメなわけだ。

犬の散歩をしていて、ふと思ったのだ。

「リストにアイテムの編集、追加権限がなくてもPatch関数って実行出来るのか？」

不安になった俺はCopilotにありのままを相談したぜ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/0cd31bd1-1fb3-4f64-a7c0-257d361161ed.png)

無慈悲な、あまりにも無慈悲な回答が返ってきたぜ。

俺は悲しみに暮れ、飲めない酒を浴びるように飲んだぜ。
嘘だけどな。

絶望に打ちひしがれている俺にCopilotはこう提案してきたぜ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/f48695fb-a173-4540-8bdd-c0de48fd991b.png)

なるほど、打つ手はあるってわけか。

しかしPatch関数をやっとの思いで使いこなせるようになった俺に、この事実は更なる試練以外の何物でもないぜ。

キャンバスアプリからフローを実行し、リストのアイテムを作成する。
アイテムの登録内容はフォーム上の項目を引数にして渡す、とそういう理屈のようだ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/497d2de0-153a-4fc7-be68-364342aef350.png)

やれる事だけやっても「作業」でしかないから、常に新しい挑戦をして
スキルを高められる環境はとてもありがたいが、

一方で俺の中の炭治郎は悔し涙を流すのであった。

この挑戦についてはまた次回以降に詳しく残していこうと思う。

https://qiita.com/Novskiiiiiiiiii/items/71b1cea504548fe74d2b
【Android / Kotlin】連続操作対策方法

# はじめに

Android開発で、連続操作対策方法について解説。
例えば、ボタンが連打された際、連打の回数分処理を行うのはなく、回数を絞って操作を行うようにする。

対策としては以下の2通り。

- debounce(デバウンス): 最後の呼び出しから一定時間が経過した場合に処理を実行する
- throttle(スロットル): 一定時間ごとに 最初に発生したイベントのみ処理する



# デバウンス

1.フローを定義

```Kotlin
// フロー
val flow = MutableSharedFlow<String>(extraBufferCapacity = 100)
```

2.初期化時、フロー処理を記述
```Kotlin
// デバウンス処理
CoroutineScope(Dispatchers.Main).launch {
    flow
        .debounce(1000) // 最後の呼び出しから1000ms経過した場合に処理を実行
        .collect {
            // ここで処理を行う
        }
    }
```

3.イベント発生処理を記述

```Kotlin
flow.tryEmit("test")
```

※スロットルを行いたい時は、`2`で`debounce`→`sample`に変更。
【2025年01月版】Proxmox8.3上 のVM上の SoftEther で Windows共有のファイルコピーがうまくいかない時のメモ

# はじめに

Raspberry Pi 上の Ubuntu で構築していた SoftEther VPN による L2 VPN を、
Proxmox上の Ubuntu での運用に移して、だいたいうまくいっていたんだけど、
Windows共有のファイルコピーだけがうまくいかない。。。

MTUとかちゃんと調整したつもりなんだけど、うまくいかない。。。

という時の解決メモ

# 結論

VM のネットワークカードを `Intel E1000E` で増設して、SoftEther のブリッジは、追加したネットワークカードで行う。

# 手順

## ネットワークカードの追加

- Bridge を `vmbr1` にしているけど、ほとんどの環境では、`vmbr0` とかだろうから合わせる
- Model が、`Intel E1000E` になっていることが重要

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143127/5295ef0e-d6d6-427a-9075-51e872ad58f2.png)

## ブリッジを追加したネットワークカードにする

- 既存のブリッジは削除して新しく追加したネットワークカードをブリッジ先にする
- ここでは、ens18が既存で、ens19が新規、入れ替えた後

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143127/5a4b5d43-8944-46e7-a912-28549ed345d6.png)

# 確認

SoftEtherによるVPNネットワークのスピードも早くなるし、Windows共有のファイルコピーもコピーされるようになった

# MTU関連メモ

## MTUの設定
### Windows上
#### 確認
```
netsh interface ipv4 show interface
```
#### 設定
```
netsh interface ipv4 set interface <インターフェイスID> mtu=1500
```

### Linux上
- MTUを自動的に変更させないカーネルパラメータ
```/etc/sysctl.conf
net.ipv4.ip_no_pmtu_disc = 1  # 無効
```
## MTU確認用の Ping
### Windows上

```
ping -t -f -l 1333 x.x.x.x
```

### Linux上

```terminal
ping -M do -s 1333 x.x.x.x
```

## MTUの計算

Pingが疎通する最大の値 + ヘッダサイズ(28byte) = 設定するMTU

# リンク

- [[Solved] SoftEther speed is too slow](https://forum.vpngate.net/viewtopic.php?t=66972)

# さいごに

かんたんでしたね
Macのpyenvでpythonをインストールできない

# 概要
`poetry install xx.xx.xx`でpythonをインストールしようとすると  
`install: Modules/_blake2.cpython-312-darwin.so: No such file or directory`が返されてしまった。  
特殊ですが、同じ人もいるかもしれないので解決した時の方法を残しておきます。（といってもほぼ海外記事の要約ですが）

# 環境
・ Mac(M3)
**・arm用とx_86用のHomebrewのパラレル構成でパッケージ(pyenv含む)を管理**
> arm版: opt/homebrew
> x_86版: /usr/local/homebrew

# 症状
下記のようにpyenvでpythonのインストールを行うと
```
pyenv install 3.12.9
```
下記エラーが発生
```
python-build: use openssl@3 from homebrew
python-build: use readline from homebrew
Downloading Python-3.12.9.tar.xz...
-> https://www.python.org/ftp/python/3.12.9/Python-3.12.9.tar.xz
Installing Python-3.12.9...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk

BUILD FAILED (OS X 14.5 using python-build 20180424)

Inspect or clean up the working tree at /var/folders/zy/rlqcx37d3wn804wr99j9yn540000gp/T/python-build.20250213171040.80924
Results logged to /var/folders/zy/rlqcx37d3wn804wr99j9yn540000gp/T/python-build.20250213171040.80924.log

Last 10 log lines:
/usr/bin/install -c -m 755 Modules/zlib.cpython-312-darwin.so /Users/taguchi/.pyenv_arm/versions/3.12.9/lib/python3.12/lib-dynload/zlib.cpython-312-darwin.so
/usr/bin/install -c -m 755 Modules/_dbm.cpython-312-darwin.so /Users/taguchi/.pyenv_arm/versions/3.12.9/lib/python3.12/lib-dynload/_dbm.cpython-312-darwin.so
/usr/bin/install -c -m 755 Modules/readline.cpython-312-darwin.so /Users/taguchi/.pyenv_arm/versions/3.12.9/lib/python3.12/lib-dynload/readline.cpython-312-darwin.so
/usr/bin/install -c -m 755 Modules/_md5.cpython-312-darwin.so /Users/taguchi/.pyenv_arm/versions/3.12.9/lib/python3.12/lib-dynload/_md5.cpython-312-darwin.so
/usr/bin/install -c -m 755 Modules/_sha1.cpython-312-darwin.so /Users/taguchi/.pyenv_arm/versions/3.12.9/lib/python3.12/lib-dynload/_sha1.cpython-312-darwin.so
/usr/bin/install -c -m 755 Modules/_sha2.cpython-312-darwin.so /Users/taguchi/.pyenv_arm/versions/3.12.9/lib/python3.12/lib-dynload/_sha2.cpython-312-darwin.so
/usr/bin/install -c -m 755 Modules/_sha3.cpython-312-darwin.so /Users/taguchi/.pyenv_arm/versions/3.12.9/lib/python3.12/lib-dynload/_sha3.cpython-312-darwin.so
/usr/bin/install -c -m 755 Modules/_blake2.cpython-312-darwin.so /Users/taguchi/.pyenv_arm/versions/3.12.9/lib/python3.12/lib-dynload/_blake2.cpython-312-darwin.so
install: Modules/_blake2.cpython-312-darwin.so: No such file or directory
make: *** [sharedinstall] Error 71
```

# 対策
結論から言うと、**x86環境のlibb2を削除する。** または、 **arm環境にlibb2を追加する。** ことで解決するらしい。  
pyenvのissueに解決法を載せてくれていた。
>I did install x64 arch brew for gaming, to /usr/local, and then arm64 arch brew to /opt  
I uninstalled libb2 from the x64 brew as prescribed, and this resolved my issue!  

 https://github.com/pyenv/pyenv/issues/2850  
 
# 原因
x_86とarm64の２つの環境を作っていることが原因だった。  

下記ドキュメントにある通り、  
コンパイラの検索パスにx86環境(`/usr/local/homebrew`)もarm64環境(`opt/homebrew`)も含まれてしまうので、あるライブラリがx86のHomebrewだけにインストールされリンクされていた場合、たとえarm64用にコンパイルしていても、コンパイラはx_86のライブラリを検出してしまう。  
とのこと。

https://github.com/pyenv/pyenv/wiki/Common-build-problems#on-apple-silicon-when-building-for-arm64-a-dependency-is-present-in-x64-homebrew-but-not-arm64-homebrew
スプラトゥーン3のブキ当てゲームを作ってみた

# はじめに
皆さんはスプラトゥーンやっていますか？
スプラトゥーンはブキがたくさんありますが、猛者の方々ならばYES/NOで答えられる質問だけでブキを当てられるはず…そう思いブキ当てゲームを作成しました。
簡単に言うとアキネーターの逆版ですね。
是非下記からアクセスして遊んでみてください。

https://basio0916.github.io/splatoonator/

# ゲームについて
下記のように質問をすると、<font color="#2e7d32">〇</font>(はい)か<font color="#d32f2f">×</font>(いいえ)か<font color="#E3D026">△</font>(部分的にはい)で回答が返ってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556091/41ef34c4-948b-4b50-a60a-1b2d7c094fc9.png)

下記のように質問の履歴が出来上がるので、これをもとにできるだけ少ない回数でブキを当てましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556091/97a112f0-44ef-47bd-b1a2-dec4de3143ae.png)

この場合、答えは「わかばシューター」となります。

# おわりに
改善要望やバグの報告はGitHubのIssueにお願いします。（日本語でOKです）

https://github.com/Basio0916/splatoonator/issues
次世代型ハッカソン！前回はどうだった？～2/20まで、2025年参加者募集中～

こんにちは。
GIFTech運営担当のHakobeです。
現在、絶賛 **「GIFTech 2025春 - Humanity1.5」** ハッカソンの参加者を募集中です！
GIFTechは、2024春にも大規模なハッカソンを行っており、今回は2回目の開催となります。
今回は、前回参加いただいた方の声を中心にご紹介します。

## 前回のハッカソンは？
2024年3月に行ったハッカソンでは・・
GIFTech Academyと、GIFTech Challengeの2部構成で、「有名インフルエンサーの求めるパーソナライズドサービスを開発する」というテーマでハッカソンを行いました！
2025年もそうなのですが、企画盛りだくさんなのが、GIFTechハッカソンならではでもあります^^

https://giftech.io/giftech2024spring/summary/

個性豊かなアプリが誕生・・！有名インフルエンサーとして、人気モデルのゆうちゃみさんもご参加いただいていました。動画もあるのでぜひ詳しくは以下からご覧ください。

https://prtimes.jp/main/html/rd/p/000000018.000102162.html

## 前回ハッカソン　参加者の声
前回参加されたエンジニアの方は、

**【エンジニアとして自身が置かれる現状】**

>・会社では0から1を作り出す機会が体験できない。
・言われた業務をこなすことがメインとなり、仲間との共創や0から1を作り出す機会がない。

そんな想いを感じてご参加いただいたエンジニアの方が、
20代前半の大学生の方から、30代の会社員の方まで、幅広くご参加いただきました。

ハッカソン参加後の感想は・・？！

**【ハッカソンに参加した感想】**
>・0→1のモノ創りの楽しさと大変さを実感していく中で、学びの意欲が自然と湧き上がってくるような経験ができてよかった

>・エンジニアとしてデザイナーやクリエイターの方と案を出していく過程が楽しかった

![05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3991729/26eb9a4d-b723-4d96-8d15-8178f2c21255.jpeg)

>・リーダーでなくても、オーナー・フォロワーシップを持つということが大事と感じ、これからも活かしていけると思った

>・作ったサービスが実際にユーザに使われる瞬間までのフェーズを鮮明にイメージできるようになり、ユーザー視点に対する考えや気持ちが変わった

![09.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3991729/22896e10-0f07-42e0-a10e-06079f3f658d.jpeg)

>・色々な物事に対してオーナーシップを持って取り組むという姿勢が参加前後で変化した

>・今まで行ったテックイベントの中で1番楽しかったです！年齢に関係なくエンジニアとして尊敬できる参加者の方々との出会いは非常に刺激的でした！

![10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3991729/8d9dca0b-e386-4014-89dc-77bec1c4ff02.jpeg)


:::note infomation
普段出会えないエンジニアとの繋がりに、喜んでいただけました！
:::

## 前回参加者の繋がりは今も・・！

参加者同士で専用のSlackを作ったり・・
一緒にもくもく会をやったり・・
新年会や忘年会など、定期的に近況報告をする仲になったり・・
そんな声を頂戴しています。

## 仲間と一緒にアプリ開発をやってみたいなら
前回参加されたエンジニアの方から、
「前回が面白かったから参加したい」「優勝できなくて悔しかったから今回は・・」といった気持ち溢れるエントリーもいただいております！
もちろん、今年初めて参加の方も大歓迎です。

**申込は、2月20日(木)まで**
以下から、ハッカソン詳細を確認して、興味をお持ちの方はぜひエントリーしてくださいね！
参加に際して、気になる点があれば、Qiitaのコメントなどでお気軽にお知らせください。

https://giftech.io/giftech2025spring/

https://qiita.com/GIFCat/items/c964cab6e330b80b97f3
AI-102 学習メモ (13) : 生成 AI ソリューションを実装する

# はじめに
この投稿は AI-102: Microsoft Azure AI エンジニア の学習をした内容のメモです。

投稿の一覧は以下のリンク先にあります。

https://qiita.com/atsmin77/items/5235dfe16ad1bed065ca

# 前の投稿

https://qiita.com/atsmin77/items/9987fa9bc1b5c917abbc

# Azure OpenAI Service

Azure OpenAI Service を利用すると、Azure 上で OpenAI を利用することができます。Azure 上にあるためセキュリティやリージョンの可用性といったメリットがあります。

https://learn.microsoft.com/ja-jp/azure/ai-services/openai/overview

## 課金モデル

Azure OpenAI はテキストのトークン数に応じて課金されます。入力と出力両方のトークンに対して課金が発生します。

https://learn.microsoft.com/ja-jp/azure/ai-services/openai/how-to/manage-costs?wt.mc_id=knwlserapi_inproduct_azportal#understand-the-azure-openai-full-billing-model

[Azure Portal](https://portal.azure.com) で Azure OpenAI Service リソースを作成し、実際に利用してみます。

## Azure OpenAI Service リソースを作成する

[Marketplace] - [Azure OpenAI] をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/3162a80f-a9f9-b863-ec54-8caa91e3476d.png)

リージョンや名前を入力します。

::: note warn
Azure OpenAI に無償版 (Free) はありませんでした。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/16472b5e-1003-dd48-6972-e6a58a400313.png)

リソースの作成が完了したら、[概要] - [Go to Azure AI Foudry portal] をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/a06c45f3-f68a-35b0-4889-eb0f028dac07.png)

## Azure OpenAI モデルを選んでデプロイする

次に、[プレイグラウンド] - [チャット] から、利用するモデルを選択してデプロイします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/92ffc34f-bc3a-b5e3-fae1-4ea6c7fb4e89.png)

今回は [gpt-35-turbo] を選択してデプロイしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/482d9a18-a71e-87dd-027c-a4ed8a2a7551.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/2269d5a2-5c12-9376-477c-209421573f82.png)

## 自然言語を生成するためのプロンプトを送信する

モデルがデプロイ出来たら、プロンプトを送信して応答を確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/5aff6b90-2a0e-02b1-f85f-ef835c41dac0.png)

[コードの表示] からサンプルコードも確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/bf90a80e-c06f-cfcd-bc74-4dfb9205b62a.png)

## DALL-E モデルを使用して画像を生成する

[イメージ] を選択すると、DALL-E モデルを使用して画像を生成することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/47bdf905-6fd6-95de-c755-f7cbfa4eab7a.png)
フォルダ内にあるすべてのzipファイルを解凍するスクリプトを作ってみた

# 動機 ～無いなら作ればいいじゃない～
複数のzipファイルを入手したんだけれど、手動で1つずつ解凍するのが億劫だったので、「一括でzipファイルを解凍する」物を作ろうと思った。

# 仕様（？）
zipファイルと同じ名前のフォルダを作成し、その中に解凍するようにした。
標準のzipライブラリを使うことも考えたのだけれど、「7-zipのほうが高機能だろう。」という偏見があったので、7-zipの機能を使わせてもらった。

# 学び
リストの内報表記を使ってみた。
試行錯誤でこのような形になったのだけれど、慣れるまで時間がかかってしまった。
コードは書いてなんぼ。避けてた機能が多々あるので、これからは真摯に向き合っていきたい。
いい勉強になった。

# コード

以下、作成したコード

``` Extract_ZipFiles.py
import os
import subprocess
import multiprocessing

# zipファイルの解凍
def extract_zip(zip_path, extract_dir):
    try:
        # 7-zip のパスを設定
        seven_zip_path = r"C:\Program Files\7-Zip\7z.exe" 

        # 7-zip コマンドを実行（解凍先にファイルが存在する場合は強制的に上書き。確認はスキップ）
        command = [seven_zip_path, "x", zip_path, f"-o{extract_dir}", "-y"]
        subprocess.run(command, check=True)

    except subprocess.CalledProcessError as e:  # 解凍失敗
        print(f"Error extracting {zip_path}: {e}")
    except FileNotFoundError:
        print("7-zip が見つかりません。パスを確認してください。") #7-zipが存在しない場合

def main():

    archive_dir = r"C:\Users\xxx\Documents\sample"  # 複数のzipが格納されているパスを設定。
    # ディレクトリの確認
    if not os.path.exists(archive_dir):
        print("Archive フォルダが見つかりません。")
        return

    zip_files = [
        (os.path.join(archive_dir, filename), os.path.join(archive_dir, filename[:-4]))
        for filename in os.listdir(archive_dir)
        if filename.endswith(".zip")
    ]
        
    with multiprocessing.Pool() as pool:        # プロセスのプール
        pool.starmap(extract_zip, zip_files)    # extract_zip 関数を並列実行

if __name__ == "__main__":
    main()

```
メッシュの作成

```
scale 0.001;
// Divisions in x/y/z directions.
nx 15;
ny 15;
nz 100;
// radius
r 10;
pi 3.1415926;
theta0 0.0;
theta45 45.0;
theta90 90.0;
theta135 135.0;
theta180 180.0;
theta225 225.0;
theta270 270.0;
theta315 315.0;
ratio 2.5;
ratioMid 0.75;
Xin1 #eval {$r/$ratio * cos($theta45 * $pi /180)};
Yin1 #eval {$r/$ratio * sin($theta45 * $pi /180)};
Xin2 #eval {$r/$ratio * cos($theta135 * $pi /180)};
Yin2 #eval {$r/$ratio * sin($theta135 * $pi /180)};
Xin3 #eval {$r/$ratio * cos($theta225 * $pi /180)};
Yin3 #eval {$r/$ratio * sin($theta225 * $pi /180)};
Xin4 #eval {$r/$ratio * cos($theta315 * $pi /180)};
Yin4 #eval {$r/$ratio * sin($theta315 * $pi /180)};
Xout1 #eval {$r * cos($theta45 * $pi /180)};
Yout1 #eval {$r * sin($theta45 * $pi /180)};
Xout2 #eval {$r * cos($theta135 * $pi /180)};
Yout2 #eval {$r * sin($theta135 * $pi /180)};
Xout3 #eval {$r * cos($theta225 * $pi /180)};
Yout3 #eval {$r * sin($theta225 * $pi /180)};
Xout4 #eval {$r * cos($theta315 * $pi /180)};
Yout4 #eval {$r * sin($theta315 * $pi /180)};
InYmin #eval {$r/$ratio*$ratioMid * sin($theta270 * $pi /180)};
InXmax #eval {$r/$ratio*$ratioMid * cos($theta0 * $pi /180)};
InYmax #eval {$r/$ratio*$ratioMid * sin($theta90 * $pi /180)};
InXmin #eval {$r/$ratio*$ratioMid * cos($theta180 * $pi /180)};
OutYmin #eval {$r * sin($theta270 * $pi /180)};
OutXmax #eval {$r * cos($theta0 * $pi /180)};
OutYmax #eval {$r * sin($theta90 * $pi /180)};
OutXmin #eval {$r * cos($theta180 * $pi /180)};
Zmin 0.0;
Zmax 1200;

geometry
{
}
vertices
(
//circle radius in
($Xin3 $Yin3 $Zmin) //0
($Xin4 $Yin4 $Zmin) //1
($Xin1 $Yin1 $Zmin) //2
($Xin2 $Yin2 $Zmin) //3
//circle radius out
($Xout3 $Yout3 $Zmin) //4
($Xout4 $Yout4 $Zmin) //5
($Xout1 $Yout1 $Zmin) //6
($Xout2 $Yout2 $Zmin) //7
//circle radius in
($Xin3 $Yin3 $Zmax) //8
($Xin4 $Yin4 $Zmax) //9
($Xin1 $Yin1 $Zmax) //10
($Xin2 $Yin2 $Zmax) //11
//circle radius out
($Xout3 $Yout3 $Zmax) //12
($Xout4 $Yout4 $Zmax) //13
($Xout1 $Yout1 $Zmax) //14
($Xout2 $Yout2 $Zmax) //15
);

blocks
(
//center(block0)
hex (0 1 2 3 8 9 10 11) ($nx $ny $nz) simpleGrading (1 1 1)
//Ymin(block1)
hex (1 0 4 5 9 8 12 13) ($nx $ny $nz) simpleGrading (1 1 1)›
›
//Xmax(block2)
hex (2 1 5 6 10 9 13 14) ($nx $ny $nz) simpleGrading (1 1 1›
›)
//Ymax(block3)
hex (3 2 6 7 11 10 14 15) ($nx $ny $nz) simpleGrading (1 1 ›
›1)

// Xmin(block4)
hex (0 3 7 4 8 11 15 12) ($nx $ny $nz) simpleGrading (1 1 1›
›)
);
edges
(
//circle radius out
arc 4 5 (0 $OutYmin $Zmin)
arc 5 6 ($OutXmax 0 $Zmin)
arc 6 7 (0 $OutYmax $Zmin)
arc 7 4 ($OutXmin 0 $Zmin)
arc 12 13 (0 $OutYmin $Zmax)
arc 13 14 ($OutXmax 0 $Zmax)
arc 14 15 (0 $OutYmax $Zmax)
arc 15 12 ($OutXmin 0 $Zmax)
//circle radius in
arc 0 1 (0 $InYmin $Zmin)
arc 1 2 ($InXmax 0 $Zmin)
arc 2 3 (0 $InYmax $Zmin)
arc 3 0 ($InXmin 0 $Zmin)
arc 8 9 (0 $InYmin $Zmax)
arc 9 10 ($InXmax 0 $Zmax)
arc 10 11 (0 $InYmax $Zmax)
arc 11 8 ($InXmin 0 $Zmax)
);

faces
(
);
boundary
(
walls
{
type wall;
faces
(
(5 13 14 6)
(6 14 15 7)
(7 15 12 4)
(4 12 13 5)
);
}
inlet
{
type patch;
faces
(
(0 1 2 3)
(0 4 5 1)
(1 5 6 2)
(2 6 7 3)
(7 4 0 3)
);
}
outlet
{
type patch;
faces
(
(8 9 10 11)
(8 12 13 9)
(9 13 14 10)
(10 14 15 11)
(11 15 12 8)
);
}
);
```
DB初心者向けデータベース学習ガイド

DB初心者がデータベースを学習する際の効率的な進め方を調べてまとめました。
基礎から実務レベルまで、順を追って学習できるようにしｔつもりです。

## 1. 基礎知識の習得

まずはデータベースの基本概念を学びます。

### 学ぶべき概念
- **データベースの種類**（リレーショナルDB、NoSQL など）
- **RDBMSの基本**（SQL Server, MySQL, PostgreSQL など）
- **テーブル・レコード・カラム・主キー・外部キーの概念**
- **正規化（第1〜第3正規形）**

### 学習方法
- 書籍: 『達人に学ぶ SQL徹底指南書』、『リレーショナルデータベース入門』
- 動画: Udemy の SQL 入門コース　←有料
- チュートリアル: [SQLZOO](https://sqlzoo.net/), [W3Schools](https://www.w3schools.com/sql/)

※私個人としては、書籍より手を動かせて日本語にも対応している `SQLZOOのチュートリアル` がおすすめ！

---

## 2. SQLの基礎

基本的な SQL 文を学び、実際に動かしてみます。

### 学ぶべき SQL 文
- **データの取得**: `SELECT`, `WHERE`, `ORDER BY`
- **データの集計**: `GROUP BY`, `HAVING`, `COUNT`, `SUM`
- **データの変更**: `INSERT`, `UPDATE`, `DELETE`
- **テーブルの作成**: `CREATE TABLE`, `ALTER TABLE`, `DROP TABLE`
- **インデックスとパフォーマンス最適化**: `INDEX`, `EXPLAIN`

### 学習方法
- **環境構築**: MySQL Workbench, SQL Server Management Studio などを利用
- **実践問題を解く**: [LeetCode SQL](https://leetcode.com/problemset/database/), [HackerRank SQL](https://www.hackerrank.com/domains/sql)

---

## 3. 実務に即した学習

基礎を学んだら、実際の業務で使えるように実践的な課題に取り組みます。

### 学ぶべき内容
- **業務データを用いた SQL の活用**
- **ストアドプロシージャ・トリガーの理解**
- **ER図を作成し、設計から実装の流れを体験**

### 実践課題例
- 売上データから特定の条件に合う顧客リストを抽出
- シンプルな在庫管理システムの DB 設計

---

## 4. 応用学習

さらにスキルを伸ばすために、パフォーマンスチューニングやトランザクション管理を学びます。

### 学ぶべき内容
- **パフォーマンスチューニング**
  - インデックス設計、クエリ最適化 (`EXPLAIN`, `QUERY PLAN`)
- **トランザクション管理**
  - `COMMIT`, `ROLLBACK`, `ACID特性`
- **セキュリティ**
  - 権限管理 (`GRANT`, `REVOKE`)
  - SQL インジェクション対策

### 学習方法
- 実際の SQL パフォーマンスを分析し、改善を試す
- チームでコードレビューを行い、適切な SQL の書き方を指導

---

## 5. 実務を通じた習得

実際の業務データを扱いながら学習するのが最も効果的です。

### 進め方
- **小規模な業務改善タスクを任せる**
- **レビューを行い、適切な SQL の書き方を指導**
- **ドキュメント作成も経験させる**（DB 設計書、SQL の説明資料）

---

## まとめ

1. **基礎知識の習得** → 書籍・動画・チュートリアルで学ぶ
2. **SQL基礎** → 実際に手を動かして学習
3. **実務に即した学習** → 実際のデータを扱う
4. **応用学習** → パフォーマンス・トランザクション・セキュリティ
5. **実務を通じた習得** → 業務タスクに組み込む

この流れで学習を進めると、実践的なデータベーススキルが身につきます！

---

## おすすめリソース

- **チュートリアル**
  - [SQLZOO](https://sqlzoo.net/)
  - [W3Schools](https://www.w3schools.com/sql/)

- **問題演習**
  - [LeetCode SQL](https://leetcode.com/problemset/database/)
  - [HackerRank SQL](https://www.hackerrank.com/domains/sql)

- **書籍**
  - 『達人に学ぶ SQL徹底指南書』
  - 『リレーショナルデータベース入門』
SE37执行SE16N_INTERFACE

SE37

①SE37で下記の画面に入る。
「SE16N_INTERFACE」を入力して、上の「実行」を押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/e3aa6482-646a-4c44-9747-aa0fc1f30ce0.png)


2.この三つを入力して、再度「実行」を押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/348b5f68-63ba-462c-a627-c489b6ce710e.png)

3.この画面にはいて、編集できるようになった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/1f665774-bfda-43c0-bfcf-9bd89c766208.png)

4.「保存」ボタンを押すと、アラートが出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/9dcb1b51-5e5f-4f7b-9deb-7250bcb653a8.png)
AI-102 学習メモ (12) : Azure AI Document Intelligence ソリューションを実装する

# はじめに
この投稿は AI-102: Microsoft Azure AI エンジニア の学習をした内容のメモです。

投稿の一覧は以下のリンク先にあります。

https://qiita.com/atsmin77/items/5235dfe16ad1bed065ca

# 前の投稿

https://qiita.com/atsmin77/items/e70a11afbd107d249193

# Azure AI Document Intelligence

Azure AI Document Intelligence を利用すると、構築済みのモデルを利用して[様々なドキュメント](https://learn.microsoft.com/ja-jp/azure/ai-services/document-intelligence/overview?view=doc-intel-4.0.0#prebuilt-models)からテキストを抽出することができます。また、独自のフォームをラベル付けして、カスタムモデルを作成することもできます。

## 利用可能なファイル形式

* PDF
* 画像ファイル
  * JPG/PNG/BMP/TIFF/HEIF

* ファイルサイズ
  * 無償版 (F0) は 4 MB
  * 有償版 (S0) は 500 MB

https://learn.microsoft.com/ja-jp/azure/ai-services/document-intelligence/train/custom-template?view=doc-intel-4.0.0#input-requirements

## 事前構築済みモデルを使用してドキュメントからデータを抽出する

[Azure Portal](https://portal.azure.com) で Azure AI Document Intelligence リソースを作成し、実際に利用してみます。

### Document Intelligence リソースをプロビジョニングする

[リソースの作成] - [Document Intelligence] を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/262413a9-b201-5d0b-52c3-f3819ad8a1dc.png)

リージョンや名前を入力し、リソースを作成します。

::: note 
500 ページ / 月 まで利用できる無料プランが選択できます。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/c8e578df-98fa-fa8b-aefd-53a1acdbe01d.png)

### Document Intelligence Studio から構築済みモデルを利用する

作成したリソースの [概要] から Document Intelligence Studio を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/565a6e73-8d50-b922-6218-302240143f4a.png)

ここでは、試しに構築済みモデルからレシートを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/7a050ac2-68b3-3f8d-39eb-b91ab41ed425.png)

ダイアログで、先ほど作成した Document Intelligence リソースを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/84acca1c-6677-0e92-d876-bab49598f3bc.png)

左側からサンプルデータを選択し、[Run analysis] をクリックすると、レシートから情報が抽出できていることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/400856e3-3e9a-747b-fe84-704e232e59be.png)

プルダウンからレシート以外のほかの構築済みモデルに切り替えることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/86af0d57-d2b2-6a26-cc97-ca37967a4ad8.png)

## カスタム ドキュメント インテリジェンス モデルを実装する

任意のドキュメントから情報を抽出するには、カスタムモデルを作成します。カスタムモデルはラベル付けツールを利用して、サンプルデータをラベル付けしトレーニングすることで作成できます。

https://learn.microsoft.com/ja-jp/azure/ai-services/document-intelligence/v21/label-tool?view=doc-intel-2.1.0

### サンプル ラベル付けツール

サンプル ラベル付けツールを利用することで、手動でフォームの項目をラベル付けして、カスタムモデルをトレーニングすることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/3e9af79e-0719-e7e2-6e63-eb818f360e3a.png)

1. サンプル ラベル付けツールで新しいプロジェクトを作成
1. 用意したサンプルのフォームを手動でラベル付け
1. ラベル付けの結果を使用してモデルをトレーニング

https://learn.microsoft.com/ja-jp/azure/ai-services/document-intelligence/v21/label-tool?view=doc-intel-2.1.0

# 次の投稿

https://qiita.com/atsmin77/items/14c5ef67ef5d9d5d8109
🔬 量子機械学習（QML）の未来：AIと量子コンピュータの融合 🚀

# 量子機械学習（Quantum Machine Learning）とは？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917980/d21473b2-c9d2-496e-8d2f-88938a318701.png)

## 🌟 はじめに

近年、量子コンピュータの進化とともに、**量子機械学習（Quantum Machine Learning, QML）**が急速に発展しています。従来の機械学習と比較し、量子コンピュータの特性を活用することで、より高速かつ複雑なデータ解析が可能になると期待されています。

本記事では、
- 量子機械学習の基本概念
- 量子機械学習の利点と課題
- 具体的なアルゴリズムとサンプルコード
- 量子機械学習のフレームワーク
- 未来の応用事例

について詳しく解説します。🚀

---

## 💡 量子機械学習とは？

量子機械学習（QML）は、**量子コンピュータの計算能力を活用した機械学習**です。

### 🔹 量子コンピュータの特性
1. **重ね合わせ（Superposition）**：量子ビット（キュービット）は、0と1の両方の状態を同時に持つことが可能。
2. **量子もつれ（Entanglement）**：2つ以上の量子ビットが相互に影響し合うことで、並列処理能力が向上。
3. **量子トンネリング（Quantum Tunneling）**：最適化問題を高速に解くことが可能。

これらの特性を利用し、**大規模データの解析や最適化問題をより効率的に処理する**のがQMLの目的です。🎯

---

## ⚡ 量子機械学習のメリットと課題

### ✅ メリット
1. **超並列計算**：量子コンピュータの特性により、大規模データ処理が可能。
2. **複雑な最適化問題の解決**：量子トンネリングを利用し、組合せ最適化問題の効率向上。
3. **機械学習の加速**：量子アルゴリズムを活用することで、従来よりも高速な学習が期待される。

### ❌ 課題
1. **ハードウェアの発展不足**：現時点では、実用的な量子コンピュータの開発が進行中。
2. **エラー率が高い**：量子コンピュータは、環境の影響を受けやすく、エラー率が高い。
3. **アルゴリズム開発の難しさ**：従来の機械学習とは異なるアプローチが必要。

---

## 🛠 量子機械学習の具体的なアルゴリズムとコード

QMLの代表的なアルゴリズムには、以下のようなものがあります。

### 🔹 1. 変分量子回路（Variational Quantum Circuit, VQC）
量子ビットのパラメータを調整し、古典コンピュータと組み合わせて最適化を行う。

#### **サンプルコード（Qiskit使用）**
```python
import numpy as np
from qiskit import QuantumCircuit, Aer, transpile, assemble
from qiskit.circuit import Parameter
from qiskit.visualization import plot_histogram

# 量子回路の設計
theta = Parameter('θ')
qc = QuantumCircuit(2)
qc.h([0, 1])  # 重ね合わせを作る
qc.cx(0, 1)  # もつれを作る
qc.ry(theta, 0)
qc.cx(0, 1)
qc.ry(theta, 1)

# シミュレーターで実行
simulator = Aer.get_backend('qasm_simulator')
tqc = transpile(qc, simulator)
qobj = assemble(tqc)
result = simulator.run(qobj).result()
counts = result.get_counts()

# 結果の表示
plot_histogram(counts)
```

このコードでは、基本的な量子回路を作成し、VQCをシミュレートしています。💻✨

---

## 🚀 量子機械学習フレームワーク

量子機械学習を実装するためのフレームワークとして、以下のツールが活用されています。

### 1. **Qiskit（IBM）**
IBMが提供するオープンソースの量子コンピューティングフレームワーク。
- Pythonライブラリとして利用可能。
- 実際の量子コンピュータでの実行が可能。

### 2. **PennyLane（Xanadu）**
量子機械学習に特化したフレームワーク。
- TensorFlowやPyTorchと統合可能。
- 量子ニューラルネットワークの設計が可能。

### 3. **Cirq（Google）**
Googleが開発した量子コンピュータ向けのフレームワーク。
- 量子アルゴリズムの実装が可能。
- 量子誤り訂正機能をサポート。

---

## 🔮 量子機械学習の未来と応用

### 🌍 1. **医療分野**
- ゲノム解析の高速化により、新薬開発を加速。
- 量子AIを活用した病気診断の向上。

### 💰 2. **金融業界**
- 高速なリスク分析と最適な投資戦略の構築。
- 金融市場のリアルタイム解析による市場予測。

### 🚚 3. **物流・交通**
- 配送ルートの最適化。
- スマートシティにおける交通流の最適化。

---

## ✨ まとめ
✅ **量子機械学習（QML）は、従来の機械学習に比べ、高速なデータ処理と最適化が可能。**
✅ **QiskitやPennyLaneなどのフレームワークを活用し、量子アルゴリズムを実装できる。**
✅ **医療・金融・物流など、多くの分野での応用が期待されている。**

量子機械学習は、これからの技術革新の鍵を握る分野です！💡✨
今後の進化に注目しながら、ぜひQMLの世界を探求してみてください！🚀
GenAIと共に歩むF5資格試験の道: Day3   〜 技術英語と実践学習で知識を深める

本日も、生成AIのサポートを受けながらF5資格の勉強をしました。
特に会話型リアルタイムフィードバックの力を実感した一日となりました。

本日利用したツールはChatGPT o3‑mini-highとPerplexityです。
両ツールの個人的な使い分け方法も記載しています。

---

## 1. 技術英語セッション（10～15分）

### タスク①: フラッシュカード作成
- **作業内容:**  
  - キーワード：`load balancing, traffic management, SSL offloading, BIG‑IP, TMOS`  
  - 上記用語をChatGPT o3‑miniのプロジェクト内で管理している用語集に追加しました。

---

## 2. 技術学習セッション（F5‑101/201教材の精読）

### タスク②: 章の要点整理と理解補助  
### タスク③: 公式ドキュメントとの照合
- **作業内容:**  
  - ChatGPTから「ロードバランシングとSSLオフロードの基本原理」というドキュメントを読むよう指示を受けましたが、該当資料が見つからなかったため、試験要綱セクション1.01「アーキテクトとアプリケーションのデプロイ」をPerplexityに食わせて授業をしてもらいました。  
  - 試験要綱の具体的な内容は以下の通りです:

  ```
  タイトル: "アーキテクトとアプリケーションのデプロイ"
  目的:
    "1.01":
      説明: "必要な設定オブジェクトを特定し、最適なアプリケーションデプロイを実施する"
      例:
        - "最小限の設定オブジェクトの選定"
        - "設定オブジェクト間の依存関係の理解"
        - "必要なLTMプロファイルの特定"
        - "仮想サーバと仮想アドレスの違いの把握"
  ```

- **補足:**  
  - **LTMプロファイル:** 単なるHTTPプロファイルとは異なり、細かなプロトコル制御が可能（例：Compression_ONKeep-Alive_HTTP_PRF：圧縮＆キープアライブON）。  
  - **その他のLTMプロファイル:**  
    - **TCPプロファイル:** 遅延ACK制御、ウィンドウサイズ調整、OneConnect機能。  
    - **SSLプロファイル:** SSLオフロード、証明書管理、TLSバージョン制御。  
  - **仮想サーバ:** LTM上で定義される、特定のIP/ポートを利用するクライアント入口。FortigateのExplicit Proxy設定に類似しており、理解が進みました。  
- **感想:** Perprexicity先生の授業を通じて、理論だけでなく具体的な構成の理解が深まりました。

---

## 3. ツール比較とフィードバック

### ChatGPT
タスク①ではChatGPTを利用しました。学習する単語が明確であり、ハルシネーションが起きる確率が少ないと思いました。
- **特徴:**  
  - ChatGPTの最近のモデルでは拙いインプット情報でも、的確に理解・解釈して、高品質なフィードバックをくれます。他の生成AIでも的確にプロンプトを書けばよいのですが、o3‑miniを利用することで時短になります。
  - プロジェクト機能のおかげで、チャットアーカイブの管理が容易になり、学習の振り返りもしやすいです。

### Perplexity
タスク②③ではネットに存在するソースを元に授業をして欲しかったので、Perplexityを利用しました。
- **特徴:**  
  - 何も自分で用意がない場合でも、何かしらのソース資料を参照しながら回答してくれるのが有用です。  
### 使い分けのポイント  
  - **資料が自前にある場合:** ChatGPTを使用して、深い理解や詳細なフィードバックを得る。  
  - **資料がない場合やWeb情報を参照した回答が欲しい場合:** Perplexityを活用して、ある程度の適切な回答を得る。回答してもらった後にソース資料の確認を行う。

---

## 4. 動画視聴＆ノート作成

### タスク④: 動画の視聴と要点抽出
- **作業内容:**  
  - ベーシックなハンズオン動画が見たかったので、YouTubeで検索し、NetMavenさんの「F5 BIG-IP LTM/DNS(GTM) Training」再生リストから、「Initial Configuration - VLAN, Self-IP」と「Standard Virtual Server」のハンズオンセッションを視聴。  
  - **学びのポイント:**  
    - IPアドレスの振り分け方法  
    - Node、Pool、Virtual Serverの作成  
    - ラウンドロビンによる負荷分散の確認  
- **感想:** 実際に仮想環境で設定を試してみたいという意欲が湧きました。

---

## 5. 英語での振り返り

### タスク⑤: 英語での学習内容のパラグラフ作成
- **作業内容:**  
  - 当日の学習内容を短い英文パラグラフにまとめ、新しい単語やフレーズをリストアップ。  
  - 初稿を作成後、ChatGPT o3‑miniに英語の添削を依頼し、より自然な表現にブラッシュアップしてもらいました。  
- **感想:** 英語力の低下を実感しつつも、丁寧なフィードバックにより改善のヒントを得ることができました。

---

## まとめ

本日の学習では、以下の成果を実感しました：

- **技術英語の強化:** フラッシュカード作成や英語パラグラフ作成を通じ、専門用語と実践的な表現の習得に努めました。  
- **教材と公式資料の精読:** F5の基礎機能を理解し、実際の設定に役立つ知識を得ることができました。  
- **ツールの使い分け:**  
  - **ChatGPT:** 「賢い学友」として、深い理解と具体的なフィードバックを提供。  
  - **Perplexity:** Web情報を補完し、ソース資料を活用した回答が得られる。  
- **実践的な学習:** ハンズオンセッションの視聴により、実際の構成手順が具体的にイメージでき、仮想環境での試行への意欲が高まりました。

明日からは、試験問題形式のアウトプットも意識し、さらに実践的なスキルの習得に挑戦していきます。

---

[参考リンク: F5公式サイト](https://www.f5.com/ja_jp/)  
[参考リンク: DevCentral](https://devcentral.f5.com/)  
[参考リンク: F5 BIG-IP LTM/DNS(GTM) Training](https://www.youtube.com/watch?v=4qP9QmE2XDc&list=PLLRktiW5GEC2T0hmyhC2f8slMXAZyfLgw)
AdMob SDKの初期化処理を最適化してアプリ起動のパフォーマンスを向上させる

Android の AdMob の SDK のドキュメントが更新されて、導入のドキュメントに初期化処理の最適化の記載が増えていたのでその紹介です。
もし過去に AdMob を導入していて以下に類する処理を実装をしていない場合は、アプリ起動時間の短縮や ANR の改善を見込める可能性があります。

## 追加された記載

導入の実装例に追加されたのは `MobileAds#initialize` の処理を別スレッドで行うことで起動時処理のブロッキングを防ぐというものです。

```kotlin
class MainActivity : AppCompatActivity() {
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val backgroundScope = CoroutineScope(Dispatchers.IO)
    backgroundScope.launch {
      MobileAds.initialize(this@MainActivity) {}
    }
  }
}
```

https://developers.google.com/admob/android/quick-start#initialize_the_mobile_ads_sdk

## 他の最適化オプション

それ以外にもベータ版の機能として広告の最適化オプションが提供されています。


### 初期化の最適化

AndroidManifest に以下の設定をすることで AdMob の初期化処理を別スレッドで行うようになります。
上記の `MobileAds#initialize` を別スレッドで処理している場合はこの設定は不要です。

```xml
<manifest>
  ...
  <application>
      ...
      <meta-data
          android:name="com.google.android.gms.ads.flag.OPTIMIZE_INITIALIZATION"
          android:value="true"/>
  </application>
</manifest>
```

### 広告読み込みの最適化

AndroidManifest に以下の設定をすることで広告読み込みの呼び出し処理を別スレッドで行うようになります。

```xml
<manifest>
  ...
  <application>
      ...
      <meta-data
          android:name="com.google.android.gms.ads.flag.OPTIMIZE_AD_LOADING"
          android:value="true"/>
  </application>
</manifest>
```

https://developers.google.com/admob/android/optimize-initialization


## アプリ起動時の計測

あまりスペックが高くない端末である Xperia 10(Android 10) で Baseline Profiles 適用状態で Cold 状態からのアプリ起動の時間を Macrobenchmark で計測しました。

|パターン|結果|
|:--:|:--:|
|何もなし| ![スクリーンショット 2025-02-13 13.17.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126298/12325d9b-a2ff-488f-9e8d-23de8f9ab12a.png)|
|別スレッド実装|![スクリーンショット 2025-02-13 13.24.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126298/1117b07b-4468-46fd-8877-0d0b34379581.png) |
|`OPTIMIZE_INITIALIZATION` の設定|![スクリーンショット 2025-02-13 13.27.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126298/624c47ba-0e03-4d43-8a1b-400ae76be21e.png) |

内部の処理が不明なので理由が定かではないのですが、`MobileAds#initialize` を別スレッドにする方が一番効果あるという結果が出ました。
人間のフィードバックによる強化学習（RLHF）の探求

想像してみてください。まるでソフトウェアではなく、あなたのあらゆるリクエストを理解してくれる親しみやすい専門家と会話しているような感覚を。まさにそれが、ChatGPTが登場したときに人々が体験したことでした。ChatGPTは、AIの驚異的な未来を垣間見せてくれたのです。

一見すると、ChatGPTは普通のチャットボットのように見えます。しかし、それは単なる質問応答の枠を超えています。会話を驚くほど自然に続けることができるため、技術の専門家から一般ユーザーまで、「どうしてこんなことが可能なのか？」と驚かされるのです。

その答えは？ ***人間のフィードバックによる強化学習（RLHF）です***。この最先端技術こそが、ChatGPTに複雑なプロンプトを処理し、人々の期待に沿った応答を生み出す驚異的な能力を与えています。

本記事では、RLHFの仕組み、大規模言語モデル（LLM）のチューニングに不可欠な理由、そしてAIの進化を大きく前進させるこの技術の革新性について詳しく解説します。

# RLHFとは何か、そしてなぜ重要なのか？
[人間のフィードバックによる強化学習（RLHF）](https://arbisoft.com/blogs/exploring-reinforcement-learning-from-human-feedback-rlhf) は、AIモデルに人間の専門知識を活用して学習させる革新的な手法です。従来のAIはデータのパターンに単純に依存していましたが、RLHFでは人間のトレーナーがリアルタイムで指導することで、より適切な回答や提案、洞察を生み出せるようになります。これにより、AIの応答がより人間の価値観や好みに合ったものになっていきます。

OpenAIの報告によると、RLHFを活用することでAIモデルの精度と関連性が最大30%向上することが確認されています。これは、AIのパフォーマンスを大幅に引き上げる大きな進歩です。つまり、RLHFは従来の「機械的」な振る舞いと、人間の直感に近い応答とのギャップを埋める重要な技術なのです。

# RLHFの仕組み
### 1. 事前学習済みモデルの準備
RLHFのプロジェクトは、すでに大量のテキストデータを学習したAIモデルから始まります。たとえば、ChatGPTは膨大なインターネット上のデータをもとに訓練されたGPTモデルを基盤としています。この事前学習により、モデルは言語の基本構造や一般的な知識を習得します。

### 2. 教師ありファインチューニング（SFT）
次に行うのが「教師ありファインチューニング（Supervised Fine-Tuning, SFT）」です。このフェーズでは人間のトレーナーがAIの回答を洗練させる役割を果たします。トレーナーは、例えば「人工知能を簡単に説明してください」といったプロンプトを与え、AIが最適な回答を生成できるように指導します。この段階では、モデルがさまざまな状況において人々が期待する応答を学習することを目的としています。

### 3. 報酬モデルの作成
次に、「報酬モデル」を構築します。このフェーズでは、人間の評価者が同じプロンプトに対する複数のAIの回答を比較し、最良から最悪までランク付けします。このランキングデータを学習することで、報酬モデルは今後AIの回答を自動でスコアリングできるようになります。これは、まるで「批評家」のような役割を果たし、AIがどの程度適切な回答をしているのかを判断する仕組みです。

### 4. 報酬モデルを活用した強化学習
最後に、AI（この段階では「RLポリシー」と呼ばれる）は、生成した回答を報酬モデルに送り、スコアを受け取ります。スコアが高ければそのままのアプローチを維持し、スコアが低ければ改善を試みます。このフィードバックループを繰り返すことで、AIは継続的に人間らしく自然な応答を生成する能力を向上させていきます。

こうして、RLHFはAIの学習を導き、人間の価値観や期待により適したモデルへと進化させていくのです。

# 実世界での応用
現在、企業はRLHFを活用して、事前学習済みの大規模言語モデル（LLM）の能力を向上させています。以下はいくつかの具体的な例です。

**Eコマース:**
仮想アシスタントが、ユーザーのクエリに基づいて特定の商品をおすすめできます。例えば、「子供向けのトレンドの冬服を見せて」といったリクエストに対応可能です。[AIチャットボット](https://arbisoft.com/solutions/ecommerce/ai-chatbots-and-customer-support)を導入することで、顧客とのやり取りを強化し、サポートの質を向上させることができます。

**医療:**
BioGPT-JSL のようなシステムは、診断の要約を行ったり、簡単な健康関連の質問に答えたりすることで、医療従事者を支援します。

**金融:**
金融機関はLLMを活用し、関連する金融商品を提案したり、財務データから有益なインサイトを導き出したりしています。例えば、BloombergGPT は、金融分野のデータを用いて微調整されており、金融業界向けの高度な情報分析が可能です。

**教育:**
トレーニングされたLLMを活用することで、学習者はパーソナライズされた学習体験を受け、迅速なフィードバックを得ることができます。また、教師向けには高品質な試験問題の生成支援を行い、教育の効率を向上させることができます。

RLHFを活用することで、これらの分野でのAIの応用範囲が広がり、より人間に寄り添ったインタラクションが実現されています。

# 結論
RLHF（人間のフィードバックによる強化学習）は、AI開発における大きな進歩であり、機械学習と人間の直感とのギャップを埋める技術です。 人間のフィードバックを学習プロセスに統合することで、AIモデルはより正確に動作し、人間の価値観や好みに沿った応答ができるようになります。この技術が進化を続けるにつれ、さまざまな分野での応用が広がり、より知的で人間中心のAIソリューションが実現されるでしょう。

RLHFを探求することは、人間の専門知識と機械学習が融合し、私たちの日常生活、仕事、ビジネスを支える強力で信頼性の高いシステムを生み出す未来を垣間見ることでもあります。RLHFを活用した[機械学習ソリューション](https://arbisoft.com/solutions/data/machine-learning)を導入することで、企業は高度なデータ分析を活用し、意思決定の最適化、顧客体験のパーソナライズ、業務の効率化を実現できます。

RLHFによって、人間とAIの協力関係は新たな高みに到達し、イノベーション、技術の発展、そして企業向けの革新的なソリューションを推進する力となるのです。
Swift学習：文字列の比較演算

## 文字列の比較演算
文字列も数値と同じように比較して「TrueとFalse」を判定できる。

#### 使える比較演算子
１．両辺が等しい：==
２．両辺が等しくない：!=

#### 記述例
```Swift
let fruits1: String = "Apple"
let fruits2: String = "Peach"

let isEqual1: Bool = fruits1 == fruits2 // Falseになる
let isEqual2: Bool = fruits2 != fruits2 // Trueになる
````

#### 注意点：データ型は揃える

#### 記述例
```Swift
let one: Int = 1
let two: String = 2

let isEqual: Bool = one == two // コンパイルエラーが発生する

let oneIntToString: String = String(one) // 整数型の定数oneを文字列がに変換

let isEqual: Bool = oneIntToString == two // コンパイルエラーは発生しない
```

#### おまけ：文字列同士の連結
「+」演算子で文字列を繋げることだ出来る

#### 記述例
```Swift
let firstName: String = "Mike"
let lastName: String = "Henderson"

let myName: String = firstName + lastName // "MikeHenderson"になる
```
Pythonのレトロゲームエンジン「Pyxel」が面白い！

## はじめに

皆さんゲームは好きですか？
かくいう私もゲーマーです。
何といっても2025年2月といえばモンスターハンターシリーズ最新作「モンスターハンターワイルズ」が発売されます。
とても楽しみですね！
また、2025年内にはNintendo Switch 2も発売が予定され、ゲーム業界は大いに盛り上がること間違いなし！
さて、プログラミング学習始めた方、続けている方の中にはゲーム作りに興味がある方も多いのではないでしょうか？
私がまさにそうでしたが、「とはいえ自分程度じゃな～」と思っていました。
そんな時「Pyxel」という便利なゲームエンジンを見つけ触ってみたのですが、これがとても面白かったので、軽く共有させていただきます！

## Pyxelって何？
一言で言えば「レトロゲームを作れるゲームエンジン」です。
レトロゲームとはピクセルアートで作られたゲームのことを指します。
ファミコンやスーパーファミコン時代のマリオやファイナルファンタジーなどをイメージすれば分かりやすいと思います。
様々なジャンルのゲームを作ることができ、マリオのようなアクションゲームだけでなく、RPG、落ちものパズル、シューティングゲームなども作ることができます。

## Pyxelの良い所
**1. Pythonコードでゲームが作れる**
Pythonのゲームエンジンなので当たり前のことですがPythonコードでゲームを作ることができます。
基本的にはPythonのコーディングだけで完結するため、私のようなPythonの学習者には嬉しいですね。

**2. 導入が簡単**
Pythonの環境さえあればコマンドプロンプトやターミナルに`pip install pyxel`と入力してインストール。
あとはコードの先頭に`import pyxel`と記載するだけですぐに使えるようになります。
他にインストールが必要なものも特にないため着手しやすいです。

**3. ドット絵が描ける**
ドット絵を作れるエディターが同梱されており、自前のピクセルアートを作成することができます。
VSCodeなどのコマンドラインにて`pyxel edit`と入力すると専用のエディターが起動するため別途ペイントツール等を用意する必要はありません。

実際のエディター画面
![pyxel_bouningen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2150221/c655e839-b23c-ad65-86e7-136f3b98a24a.png)

**4. 音楽を自作できる**
上記エディターの①の部分をクリックするとサウンド編集画面が開き、BGMや効果音を作成することができます。
![pyxel_sound2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2150221/92b2a279-5b11-8944-9427-da4199f04160.png)
また、②をクリックするとミュージック編集画面が開き、サウンド編集画面で作ったサウンドを組み合わせて曲を作ることができます。
![pyxel_music2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2150221/438250f6-26a2-981f-f54b-0621359ced6a.png)

**5. 使用できる色や同時再生音数の拡張ができる**
Pyxelにおいてデフォルトで使用できるピクセルの色数は16色、同時に再生できる音の数は4音ですが、プログラムから拡張することも可能です！

**6. 日本生まれのゲームエンジン！**
こちらのゲームエンジンですが、制作者が日本の方です！
そのため日本語での解説資料や記事が多いというのもとっつきやすいポイントになります。
日本人としてはありがたいですね！

## さいごに
自分も触り始めたばかりなので今回は軽いご紹介まで…。
今後何か作ったり面白いトピックがあれば改めて記事にしたいと思います。
制作者の方の公式Qiita記事もありますので興味がわいた方は是非そちらの記事をご覧ください！
* [【公式】レトロゲームエンジンPyxelを使わない理由が見つからない](https://qiita.com/kitao/items/eae53dd47c663b497352)
* [【著者が解説】書籍『ゲームで学ぶPython！ Pyxelではじめるレトロゲームプログラミング』の魅力](https://qiita.com/kitao/items/f4058530eefdb2d05822)

***
オブジェクティブグループではXの投稿も平日毎日行っています！
IT関連の小ネタや便利技から、日常のアニメ・ゲーム布教なども幅広く投稿してるので、
ご興味のある方は是非フォロー・いいねをお願いします。
https://x.com/obg_ocr
PythonでRSA暗号化・復号化実装する方法[PyCryptodome]

# はじめに
RSA暗号は、公開鍵暗号方式の代表的なアルゴリズムです。データの暗号化と復号化を非対称な鍵(公開鍵と秘密鍵)を用いて行います。
本記事では、PythonのライブラリPyCryptodomeを用いて、RSA暗号化・復号化を実装する方法を紹介します。
# RSA暗号とは
1977年、当時MITにいた3人の研究者リベスト(R.L.Rivest)、シャミア(A.Shamir)、エイドルマン(L.Adleman)により発表された公開鍵暗号方式で、次のような特徴があります。
- 公開鍵と秘密鍵を利用してデータの暗号化と復号化を行う
- 公開鍵は暗号化に、秘密鍵は復号化に使用される
- 大きな素因数を使った数字的な問題(素因数分解)を利用することで高いセキュリティを確保する

これにより、安全な通信を実現することが可能です。例えば、webサイトのSSL/TLS通信や電子署名など。様々分野で利用されています。
# 必要なライブラリ
今回のプログラムでは、PyCryptodomeというライブラリを使用します。インストールは以下のコマンドで行えます。
```
pip install pycryptodome
```
# 実装の概要
今回のプログラムでは、以下の処理を行います。
1. RSA鍵のペアの作成
1. メッセージの暗号化(公開鍵を使用)
1. メッセージの復号化(秘密鍵を使用)

**コード全体**

```py:Rsa.py
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
import binascii

# 鍵ペアを生成
def generate_keys():
    key = RSA.generate(2048)
    private_key = key.export_key()
    public_key = key.publickey().export_key()
    return private_key, public_key

# 公開鍵でメッセージを暗号化
def encrypt_message(public_key, message):
    key = RSA.import_key(public_key)
    cipher = PKCS1_OAEP.new(key)
    encrypted_message = cipher.encrypt(message.encode())
    return binascii.hexlify(encrypted_message).decode()

# 秘密鍵でメッセージを復号化
def decrypt_message(private_key, encrypted_message):
    key = RSA.import_key(private_key)
    cipher = PKCS1_OAEP.new(key)
    decrypted_message = cipher.decrypt(binascii.unhexlify(encrypted_message))
    return decrypted_message.decode()

# メイン処理
# 鍵ペアの生成
private_key, public_key = generate_keys()

# メッセージの暗号化
message = "Hello, RSA!"
encrypted = encrypt_message(public_key, message)
print(f"暗号化されたメッセージ: {encrypted}")

# メッセージの復号化
decrypted = decrypt_message(private_key, encrypted)
print(f"復号化されたメッセージ: {decrypted}")
```
# プログラムの説明
### 1.RSA鍵ペアの生成
generate_keys()関数では、2048ビットのRSA鍵ペアを生成しています。public_keyが暗号化に使用される公開鍵、private_keyが復号化に使用される秘密鍵です。
```py:Rsa.py
def generate_keys():
    key = RSA.generate(2048)
    private_key = key.export_key()
    public_key = key.publickey().export_key()
    return private_key, public_key
```
### 2.メッセージの暗号化
encrypt_message()関数では、PKCS1_OAEPアルゴリズムを使用して公開鍵でメッセージを暗号化しています。暗号化されたメッセージはバイナリデータであるため、binasciiを用いて16進文字列に変換しています。
```py:Rsa.py
def encrypt_message(public_key, message):
    key = RSA.import_key(public_key)
    cipher = PKCS1_OAEP.new(key)
    encrypted_message = cipher.encrypt(message.encode())
    return binascii.hexlify(encrypted_message).decode()
```
### 3.メッセージの復号化
decrypt_message()関数では、秘密鍵を用いて暗号化されたメッセージを復号化しています。復号化後、元のメッセージが再現されます。
```py:Rsa.py
def decrypt_message(private_key, encrypted_message):
    key = RSA.import_key(private_key)
    cipher = PKCS1_OAEP.new(key)
    decrypted_message = cipher.decrypt(binascii.unhexlify(encrypted_message))
    return decrypted_message.decode()
```
# 実行結果
```
暗号化されたメッセージ: 8f4b91c43e4b6f2db3b4b...
復号化されたメッセージ: Hello, RSA!
```

# まとめ
本記事では、PythonのPyCryptodomeライブラリを使用してRSA暗号化・復号化を実装しました。RSA暗号はセキュリティ分野で重要なアルゴリズムです。応用として、電子署名や安全な通信プロトコルの理解に役立つので、応用してみてください。
最後まで読んでくださり、ありがとうございました。もし改善点や質問があれば、ぜひコメントしてください！

# 参考資料
https://it-trend.jp/encryption/article/64-0056
Django に入門してみる。

インストール方法、起動方法とか、全部わからない状態からスタートです。

Django というか、そもそも普段Python全く使わないので、その環境構築とかの方法も調べて（VS Codeでやる方法とか）、
そのあとで、
とりあえず、このDjango入門記事のとおりに作ってみました。

https://qiita.com/pythonista/items/19613663ef7bb3c57d4f


# 投稿リスト画面

![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/52daffb1-3814-4f9e-8535-7530281d9b85.png)

# 編集画面

![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/6ac06312-805e-42dc-9aa1-3be92eb0614d.png)

ここまでは記事通りにできました。

投稿の、新規作成、修正、削除できます。


# 気づいたこと

ここで、この Modelのコードの、

```python:models.py
from django.db import models

# Create your models here.
class Post(models.Model):
    name = models.CharField('user name', max_length=15)
    micropost = models.CharField('tweet', max_length=140, blank=True)

    def __str__(self):
        return self.name
        
```
CharFieldの第１引数の user name や tweet　が
```python:models.py
    name = models.CharField('user name', max_length=15)
    micropost = models.CharField('tweet', max_length=140, blank=True)
```

編集画面のこの赤枠で囲った部分に相当するのではないか？と思い、

![3 - コピー (2).PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/def45cdc-f700-4453-9656-da75a521718b.png)

別の文字列を入れたら、変更されました。

```python:models.py
    name = models.CharField('名前', max_length=15)
    micropost = models.CharField('投稿', max_length=140, blank=True)
```

![8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/56984baa-d4a6-42ce-bb9f-45ba6d043dc8.png)

また、もしかすると、半角英字は自動的に先頭が大文字になるのか？と思い、
「名前」を「a名前」と入れてみた所、画面表示は「A名前」になりました。

```python:models.py
    name = models.CharField('a名前', max_length=15)
    micropost = models.CharField('投稿', max_length=140, blank=True)
```

![9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/8a72e3ba-cdf0-4f5b-a8a9-2b9c22a0b0b6.png)
Object型について

# サーブレット、JSPでアプリ開発の学習中に疑問に思ったことを書きます。
  サーブレットで生成したデータをJSPに連携させるときに、
  ### 例（Humanはクラスです）
  ```
  Human h = (Human)request.getAttribute("human")
  ```
  のような書き方をしてデータの取得を行います。
    この”get.Attribute()”で取得するのはObject型になっています。

ここで疑問に思ったことが、HumanというクラスのObjectでキャストしていることです。

なぜObject型で取得した値をObjectにキャストしているのか分かりませんでした。

##### 調べて何となく自分なりに答えを出したことを書きます。（間違っているかもしれません。）

クラスで作成したObjectはObject型を継承した子クラスだそうです。なのでクラスのObjectを生成すると、そのクラス固有のObjectとなるので
（"Human h = new Human();） 
#ｈはHumanクラスのObject→つまりHuman型となります。
だからObject型で取得した値をHuman型でキャストする必要があるらしいです。

これは普段使っていたキャストと少し似たところを見つけたのですが、
数値型のキャストの場合、（Double型→int型）
大きいデータ型から小さいデータ型に変換するときにキャストを行います。
Object型も一緒で、(Object型→Human型)
親クラスであるObject型を継承した子クラスHuman型に変換するときにキャストが必要であると考えられると思いました。