OmniAICreator/Qiita-1.07M huggingface dataset:
CDLEひろしま キックオフミーティングに参加してみた

おはようございます。座禅いぬです。
タイトルの通り、**CDLEひろしまという新しいコミュニティがスタートした**のでキックオフミーティングに参加してきました。以下イベント参加レポートです。

## 参加に至る流れ

### なぜCDLEだったのか
今年初めに**ディープラーニングG検定2025#1**を受験し、合格しました。受験した理由は、もちろん勉強の指標という面もありましたが、最大の理由は**CDLEというAIコミュニティに参加するため**でした。

背景として、マナビDX Questというイベントで色々なことを教えてくださった方にイベント終了後の学習について相談した際、「**CDLEというコミュニティが活発で面白いですよ！**」とお勧めいただいたということがありました。しかしながら、参加のためにはG検定を合格しなければならない。実際イベントで学んでいたのがPyTorchで画像分類する課題だったので、イベントと並行して試験勉強を行いました。

G検定はAI全般の知識、ディープラーニングにおける必須の知識、実装するにあたり知っておきたい法的な知識などが学べる試験なので、「いわゆる試験勉強」というより**実践的な知識が多い試験**でした。試験自体は目的ではなかったのですが、結果受けてとても良かったなと思います。

### CDLEとは
>G検定・E資格の合格者のみが参加できる、9万人を超える日本最大級のAIコミュニティです。ディープラーニングの社会実装の日本代表として、社会を発展させるエバンジェリストたちが集まり、学び合い・アウトプットする場を提供しています。「CDLE」では、コミュニティサイト（β版）や、Slack、イベントなどを通じて、日常的に様々な情報交換や交流が行われています。（[公式サイトより引用](https://www.jdla.org/cdle/)）

実際参加してみた印象としては、**学習者主体のコミュニティ**として情報交換がたくさんある感じ。特にジャンルや地域で集まって活発に活動している印象でした。勉強会の情報なども得られます。

自分の地域が中国地方なのですが、イベントにオフラインでも参加してみたいなと思いながら公式Slackの情報を漁っていたところ、**ふみすけさん**という方がリーダーとして**CDLEひろしま**をスタートするというアナウンスが2/17にありました。なんというタイムリーさ。

## どんな感じになりそう？
### 実際、めっちゃ盛り上がりそう
そんな中、「**CDLEひろしまキックオフミーティングをします！**」というアナウンスがあり、先週参加してきました。まだメンバーとしては少数ですが、参加された皆さん全員の熱量がすごかったです。

なにより、それぞれが
- **今解決したいビジネス課題とアイディアがある**
- **社会人として継続的学習をしている**
- **そもそもG検定合格者なので技術的下地がある**
- **勉強する仲間が欲しい**

このような方々だったので、初めて会ったとは思えないほど議論が盛り上がりました。地元にこんな人たちがいて新しくコミュニティができるはすごい事だと思います。ふみすけさんから今後の方針についての説明もあり、メンバーからはそれぞれ積極的な意見が出ました。

### 「広島をAIで盛り上げる！」のお手伝いがしたい
広島県は現在「広島AIラボ」、「ひろしまAI部」などの取り組みを行っているそうです。自治体の主導で企業や学生などがAIを導入・学習することを支援する取り組みを複数行っています。

そのような中で、リーダーのふみすけさんからは「**広島県をAIで盛り上げる！**」と広島の地元AIコミュニティとして貢献する方針を打ち出され、メンバーのみなさんから賛同の声が上がりました。

また、大学関係の方もいらっしゃって、大学との連携・コラボイベントの案も出ました。個人的には、情報のアップデートが激しい**AIというジャンルで最先端の研究をしてい方とお話ができるという環境にも非常に魅力を感じています**。

余談ですが、基本的に皆さん初対面だったのですがメンバーの一人がまさかの中高の同級生で、25年ぶりぐらいの再会でした。これも地元コミュニティならではですね。色んな人のつながりが今後広がりそうだなと感じました。

## まとめ
以上、イベント参加レポートでした。個人的な感想の羅列ではありますが、とにかく**これは絶対もりあがる**という印象が非常に強かったです。僕はまだまだ学び始めたばかりの初学者ではありますが、**CDLEひろしまのメンバーとしてお手伝いがしたい**と感じています。
防ごう。自己参照iflameの無限ループ。

ふと思いついたけど見当たらなかったので書きます。
初心者過ぎてわからないのですが、そもそもiflame要素での自己参照って使うことあるんですかね？

# 完成図
https://xn--28j4bvdyc.tech/blog/iflame-self/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778018/40800b68-5018-4d6f-9409-c530f02055a6.png)

# 方針
iflameで参照するURLに階層の深度(depth)をパラメータとして付け加え、その値によって再帰構造を繰り返すか判断する。

# 作成したコード
```html
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <title>自己参照iframeサンプル</title>
    <style>
        body {
            font-family: sans-serif;
            text-align: center;
            margin: 50px;
        }

        iframe {
            margin-top: 20px;
            border: 2px solid #aaa;
            width: 80%;
            height: 300px;
        }
    </style>
</head>

<body>
    <h1>自己参照iframeテスト</h1>
    <div id="content"></div>

    <script>
        const MAX_DEPTH = 3; // 最大階層

        // 現在のdepthをURLから取得
        const params = new URLSearchParams(window.location.search);
        const depth = parseInt(params.get('depth') || '0', 10);

        // 今のdepthを表示
        document.getElementById('content').innerHTML = `<p>現在の階層: ${depth}</p>`;

        // 最大階層未満なら自己参照iframeを表示
        if (depth < MAX_DEPTH) {
            const nextDepth = depth + 1;
            const iframe = document.createElement('iframe');
            iframe.src = `?depth=${nextDepth}`;
            document.getElementById('content').appendChild(iframe);
        } else {
            document.getElementById('content').innerHTML += `<p>最大階層に到達しました！</p>`;
        }
    </script>
</body>

</html>
```
## 注意点
* 再帰の階層を増やしすぎるとブラウザが重くなる
* サーバーによっては自己参照を禁止していることもあるらしい(GitHub PagesはOKでした)
* スマホブラウザの負荷を考えてあげてください
* ブラウザ側でも回数やら個数やらの制限があるかもしてない

# まとめ
URLに情報を書き足すことでiflameの中の動作をルートと変更することができた。
最近再帰構造のあるゲームが流行ってたりする気がするので、ゲーム制作者さんの選択肢が広がるといいなと。
FreeBSD ports に入っている py-wheel のバージョンが混在してて｢ｱｰﾒﾝﾄﾞｸｾｪ｣ってなったのでなんとかした件

# 概要
とある GW と平日の間の昼下がり｡｡｡
> そぷらのさん＠気まま気ままでがんばらない @soprano1125
> FreeBSD ports で py-setuptools と py-setuptools-rust をビルドさせようとすると「py-wheel のバージョンとコンフリクトしてっぞ」と言われてｱｰﾒﾝﾄﾞｸｾｪ(キレ声
> [午前11:23 · 2025年4月28日](https://x.com/soprano1125/status/1916679516094910822)

# どういうこと???
```
[root@builder /usr/ports/devel/py-setuptools-rust]# make
===>   py311-setuptools-rust-1.11.1 depends on package: py311-setuptools>=62.4 - found
===>   py311-setuptools-rust-1.11.1 depends on package: py311-setuptools-scm>=0 - found
===>   py311-setuptools-rust-1.11.1 depends on package: py311-wheel>=0 - not found
===>  Installing for py311-wheel-0.45.1

===>  py311-wheel-0.45.1 conflicts with installed package(s): 
      py311-wheel044-0.44.0

      They install files into the same place.
      You may want to stop build with Ctrl + C.
===>  Checking if py311-wheel is already installed
===>   Registering installation for py311-wheel-0.45.1 as automatic
Installing py311-wheel-0.45.1...
pkg-static: py311-wheel-0.45.1 conflicts with py311-wheel044-0.44.0 (installs files into the same place).  Problematic file: /usr/local/bin/wheel-3.11
*** Error code 1

Stop.
make[1]: stopped in /usr/ports/devel/py-wheel
*** Error code 1

Stop.
make: stopped in /usr/ports/devel/py-setuptools-rust
[root@builder /usr/ports/devel/py-setuptools-rust]# 
```
このように｢どちらか片方をビルドするときにもう片方が『ﾃﾒｰ､コンフリクトしてんじゃねーか!』と怒られてしまう｣わけです｡ ~~ゥァア゛ーッ(CV.ポプ子~~

# ｢ｼｮｰｶﾞﾈｰﾅｰ｣と思いながらやったこと
```
[root@aki /usr/ports/devel/py-setuptools]# pkg remove -f py311-wheel044
Updating database digests format: 100%
Checking integrity... done (0 conflicting)
Deinstallation has been requested for the following 1 packages (of 0 packages in the universe):

Installed packages to be REMOVED:
        py311-wheel044: 0.44.0

Number of packages to be removed: 1

Proceed with deinstalling packages? [y/N]: y
[1/1] Deinstalling py311-wheel044-0.44.0...
[1/1] Deleting files for py311-wheel044-0.44.0: 100%
[root@aki /usr/ports/devel/py-setuptools]# 
```
｢ｼｮｰｶﾞﾈｰﾅｰ｣と思いつつ py-setuptools を make し直す前に｢pkg remove -f｣で一旦コンフリクトしている py-wheel を消してあげました｡ py-setuptools-rust の場合も同様にコンフリクトしている py-wheel を消しておいてから py-setuptools-rust を make し直します｡

# あとがき
｢こういうのは [bugzilla](https://bugs.freebsd.org/bugzilla/) に書いとけや!!｣とか言われそうなのですが英語そんなにできるわけじゃない~~しそもそも bugzilla にユーザー登録をするのがめんどくさい~~ので何を思ったかここに行き着いた方がやってくれたほうがいいんじゃないかなーと思いながらこの記事を書いたのは(ぉぃ
[py-wheel044 の FreshPorts](https://www.freshports.org/devel/py-wheel044/) のコミットログを見る限り､混在させるのは致し方ないにしても他のパッケージに影響出ちゃうのはちょっと勘弁してくれよぉってなりながらコマンド入力してました｡

｢とりあえず祝日前(2025-04-28)､ここにさくっと書いておいて GW 明け以降になんとかなってればいいやw｣って感じで(素
ローカル環境のサーバー証明書(マルチドメイン含む)作成方法

今回は、ローカル環境のサーバー証明書作成方法についてまとめてみました。
あくまでローカル環境（PC上）で構築したWebサーバーに適用するサーバー証明書を、同一端末あるいは同一ネットワーク上にある別端末にインストールする方法となります。

## 1. サーバー証明書について

### 1-1. 🔐 サーバー証明書（SSL証明書）ってなに？

インターネットで**安全に通信**するための「身分証明書」みたいなものです。


### 1-2. 🌐 どうして必要なの？

たとえば、あなたがウェブサイトにパスワードやクレジットカード番号を入力するとき、それが**他の人に盗まれたら困りますよね？**

SSL証明書があると、
- 入力した情報が暗号化される ✅
- サイトの「本物の証明」がされる ✅

これにより、安全に通信できるのです！

### 1-3. 🔎 どう見分けるの？

ブラウザのアドレスバーに注目！

- 🔒 鍵マークが出ている → SSL証明書あり、安全！
- URLが「https://〜」 → 暗号化通信中！

例：  
```
https://example.com ← 安全なサイト
http://example.com ← 安全でない可能性あり
```

## 1-4. 🛠️ 簡単な仕組み

1. あなた（ユーザー）がWebサイトにアクセス
2. サイトが「この証明書で本物のサイトですよ！」と提示
3. あなたのブラウザがそれを確認
4. OKなら、情報が暗号化されて送られる

## 1-5. 💡 まとめると…

| 用語 | わかりやすく言うと |
|------|--------------------|
| SSL/TLS | 通信を暗号化する技術 |
| サーバー証明書 | サイトが本物だと証明するもの |
| HTTPS | 暗号化されたWeb通信のしくみ |

## 2. ローカルホスト(またはPC名を含んだ)のサーバー証明書の作り方

PowerShellでDnsNameでlocalhostのサーバー証明書を[中間証明書]として作成できます。
```powershell
New-SelfSignedCertificate -DnsName "localhost" -CertStoreLocation "cert:\LocalMachine\My" -NotAfter (Get-Date).AddYears(30)

PowerShellでDnsNameで以下のように複数指定することで、サーバー証明書に複数のドメインを含めることができます。
```powershell
New-SelfSignedCertificate -DnsName "localhost","PC名" -CertStoreLocation "cert:\LocalMachine\My" -NotAfter (Get-Date).AddYears(30)
```

※サブジェクト代替名を確認すると、指定したドメインが記載されています。


![](https://storage.googleapis.com/zenn-user-upload/9f5eec6d9406-20250428.png)

※作成したあと、IISのSSL証明書を変更することを忘れずに

## 3. localhostで保護された通信にする方法

### 3-1 .localhostでSSL通信を行う場合の注意点

※保護されていない通信の場合、ブラウザ側の処理(`navigator.credentials.create`、`navigator.credentials.get`)でエラーになります。ブラウザは保護された通信であれば、公的認証局(CA)が発行したルート証明書でなくとも動きます。

しかし、localhostの証明書をプログラムで検証したとき、クライアント端末にあるクライアント証明書(SSL証明書と突合いする証明書)が、`信頼されたルート証明機関`に入っていても、公的認証局(CA)が発行したルート証明書（WinodowsUpdateで自動インストールされるもの)ではないため、エラーが発生する場合があります。

CSharpでは、`X509ChainStatusFlags.UntrustedRoot`エラーが発生するため、`ServicePointManager.ServerCertificateValidationCallback`にTrueを設定して回避します。
※参考文献
[SslPolicyErrors](https://learn.microsoft.com/ja-jp/dotnet/api/system.net.security.sslpolicyerrors?view=net-8.0)
[X509ChainStatusFlags](https://learn.microsoft.com/ja-jp/dotnet/api/system.security.cryptography.x509certificates.x509chainstatusflags?view=net-8.0)


### 3-2. localhost証明書で保護された通信を行う方法

(1) [インターネットオプション] -> インターネットのプロパティから[コンテンツ]タブ -> [証明書] -> [中間証明書] から、作成したlocalhost証明書をダブルクリックで開きます。
(2) localhostのサーバー証明書をダブルクリックし、`詳細`タブから`ファイルコピー`をクリックする。

(3) 証明書のエクスポートウィザードで以下の通り進める
- 秘密キーのエクスポート
  - 「はい、秘密キーをエクスポートします」を選択する
- エクスポート ファイルの形式
  - Personal Information Exchange - PCS #12(.PFX)を選択する
    - 以下のものに全てチェックを入れる
      - 証明のパスにある証明書を可能であれば全て含む
      - すべての拡張プロパティをエクスポートする
      - 証明書のプライバシーを有効にする
- セキュリティ
  - 任意のパスワードを入力し、暗号化は`AES256-SHA256`を選択する
- エクスポートするファイル
  - 任意の場所、任意のファイル名を指定する

(4) [証明書の管理](https://jp.globalsign.com/support/clientcert/management-epki/cert-confirmation.html)を開く
(5) `インポート`をクリックする

(6) 証明書のインポートウィザードで以下の通り進める
- (3)でエクスポートしたファイルを指定する(ファイルの種類を`全てのファイル`または`Personal Information Exchange`に変更するとファイルが表示されます）
- 秘密キーの保護
  - (3)で指定したパスワードを入力する
  - 以下のものにチェックを入れる
    - すべての拡張プロパティを含める
- 証明書ストア
  - `証明書を全て次のストアに配置する`にチェックを入れて、参照から`信頼されたルート証明機関`を選択する
SQLに特化したRAGフレームワーク「Vanna」を動かしてみる

# Vanna

SQLの生成を行うRAGフレームワークです。
SQLの生成だけではなく、実行と簡単なグラフ化までやってくれます。

https://github.com/vanna-ai/vanna

# 動作環境
* OS : Windows11
* 言語：Python3.13
* DB：MySQL
* LLM：GPT-4o

※pythonに含まれるsqliteのバージョンが低いと動作しないので、そのエラーが出る場合はpythonのバージョン上げれば動きます。

# 手順
### 事前準備
基本的には公式の手順書に従って進めればよいです。
一部ピックアップして説明します。

https://vanna.ai/docs/postgres-openai-standard-chromadb/

VannaにDBの権限を渡す。
試してないけどVannaに登録、更新、削除をさせたくない場合は参照権限のみのユーザを設定すれば大丈夫。
```python
vn.connect_to_postgres(host='my-host', dbname='my-dbname', user='my-user', password='my-password', port='my-port')
```

データベースのスキーマをVannaに渡す。
公式の手順書だと「vn.train(plan=plan)」コメントアウトされてるけど、実行しないとダメ。
```python
df_information_schema = vn.run_sql("SELECT * FROM INFORMATION_SCHEMA.COLUMNS")
plan = vn.get_training_plan_generic(df_information_schema)
vn.train(plan=plan)
```

以下を実行して、それっぽいデータが追加されてたらOK。
```python
training_data = vn.get_training_data()
training_data
```

スキーマ以外にも、文章だったり、よく使うSQLをRAGに追加することができます。
```python
vn.train(documentation="Our business defines OTIF score as the percentage of orders that are delivered on time and in full")
vn.train(sql="SELECT * FROM my-table WHERE name = 'John Doe'")
```

質問とSQLをセットで登録することも可能で、これによって質問と回答の傾向を覚えさせることができます。

```python
vn.train(
    question="What is the average age of our customers?", 
    sql="SELECT AVG(age) FROM customers"
)
```
### 実行
実行は以下のようにして行います。
```python
vn.ask("昨日申込されたordersを取得してください。")
```
askメソッドの引数は以下のようになっており、auto_trainがTrueだと質問によって生成されたSQLが実行できた場合、Vannaの学習データに自動で追加されます。
![https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_267761_25b1cbd4-04f7-4090-9844-4d71dcbd4ab6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267761/d1d1dc3c-70e5-4524-8b65-7c027a576d4d.png)


| 名前 | タイプ | 説明 | 初期値 |
|:-----------|------------:|:------------:|:------------:|
| question | str | 質問         | None |
| print_results | bool | SQLの結果を表示するか | True |
| auto_train | bool | 自動で学習させるか | True |
| visualize | bool | グラフを描写するか | True |

# まとめ
最初はDBをLLMで動かすためのMCPサーバ的なサービスなのかなと思いましたが、触った感じそういった側面もありつつ、メインはSQLを生成するためのRAGフレームワークだなと感じました。学習データが足りていない状態だと、事細かに命令しないと正しいSQLを出力できないのと、対話的にSQLを修正できないため、実用レベルに持っていくのは結構難しいかなというのが感想です。しかしDBのスキーマをLLMに渡して、SQLを作らせるという考えはいずれ実用化していくと思います。
Geminiでピアノを使う魔法少女を描いてみた。

# 概要

Geminiでピアノを使う魔法少女を描いてみました。

# 実装

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

```
光のピアノを使う魔法少女を描いてください。
```

![光のピアノを使う魔法少女_20250428.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/980c6cfe-9f60-4ad3-a17d-888ba2803b30.png)


```
闇のピアノを使う魔法少女を描いてください。
```

![闇のピアノを使う魔法少女_20250428.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/7d22da5d-cf25-4f36-adc0-1ac0321179a3.png)


```
聖なるピアノを使う魔法少女を描いてください。
```

![聖なるピアノを使う魔法少女_20250428.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/6bcbc324-102e-4ad3-905c-f35e355b9960.png)

# まとめ

聖の子が可愛いかも。
何かの役に立てばと。
未経験エンジニアとして1年働いてみた結果

## 未経験エンジニアとして働くことへの不安

私は未経験エンジニアとして働き始めて1年が経過しました。  
現在はエンジニアとしての業務をしながら、新たに入社した研修生の中で複数人との面談を行っています。

社会人として働き始めたことで心身ともに負担も増加していると思うので、精神的なサポートの一環として面談を実施しています。  
基本的には雑談がメインで、研修の大変さや成長している実感、土日の楽しみなどをざっくばらんに話しています。

担当している研修生の中には総合職の方もいれば、エンジニアとして働くことが決まっている社員もいます。  
中でも、私と同じようにこれまでプログラミングを本格的に学んだことがない、もしくは少し触れた程度で深くは学んでいない方と話す機会があり、自分が入社当時に思っていたエンジニアになることへの不安と、現在の状況とを比較してみました。

### 「本当に未経験でもエンジニアとして働くことができるのか」

これは非常に抽象的な不安でした。  
プログラミングとは何なのか、いったい何をするのかわからなさすぎることから漠然とした不安を感じていました。

**現状：全然働けます。**

難しいことは毎日降りかかってきますが、簡単な業務から少しずつ難しい内容へと業務の幅が広がっていきます。  
プログラミングがどうこうというよりも、少しずつ業務内容を理解し、覚えていくことで漠然とした不安は研修が終わって業務が始まる頃にはなくなりました。

### 「エンジニアの人ってコミュニケーションを取らずに黙々と仕事をするのか」

私は大学まで体育会で部活動ばかりしてきた人生だったので、コミュニケーションを取らずに仕事をするのはどのような感情になるのかと不安に思っていました。

**現状：コミュニケーションは毎日取りますが、頻繁ではありません。**

元々はコミュニケーションが全くないと思っていましたが、グループでの進捗報告やトレーナー・マネージャーとの1on1ミーティングを通じて業務内容や日頃の相談をする機会があります。  
そのため、十分にコミュニケーションを取ることができています。  
研修の時は毎日出社していたため、業務が始まり毎日オンラインで仕事をするようになるとコミュニケーションは少なく感じますが、それでも必要なコミュニケーションは取れています。

### 「プログラミングなどの技術って本当に身につくのだろうか、仕事についていけるのだろうか」

研修でプログラミングに触れますが、当然ながら非常に難しく感じました。  
業務内だけでソースコードを読めるようになったり、書けるようになったりするとは到底思えませんでした。

**現状：徐々にですがついていってる感じはします。初学者にとってUdemyは偉大です。**

最初は書籍やサイトの情報を読んでも、なかなか自分で理解するのは難しかったです。  
しかし、この会社では社員のスキルアップのためにUdemyを無料で使用できるため、動画教材を活用して1からゆっくり学ぶことで、プログラミング言語の理解や、コードを書くイメージをつかむことができました。  
私は現在もUdemyを愛用しています。資格や技術で勉強したいと思うものは大抵Udemyで学べるので、業務で成長を実感することは多くなくても、Udemyで学びながら少しずつ知識や技術を習得できるのは、スキルはもちろん精神的にもいいえ今日だと思います。

## まとめ

未経験からエンジニアとして働くことは、大きな意思決定だと思います。  
わからないことが多いことによる不安や、働き始めてからの難しさに直面することは当然のことです。

ただ、研修生たちが抱いている不安は、私自身も当時同じように感じていました。  
しかし、1年実際に働いてみて、今でははっきりと「心配することはないよ」と研修生との面談時に自然と伝えることができるようになりました。これからさらに新卒の方々に負けないよう頑張ります。
正規化とは？

## 正規化とは？

正規化とは、テーブルについてシステムでの利用がスムーズに行えるように整理する作業である。  
データの登録や変更、削除が整合的に行えるようにテーブルのフォーマットを整理することが、重要な目的である。

リレーショナルデータベースの論理設計において、正規化がもっとも重要な土台となる。

## 正規形とは

正規形とは、データベースで保持するデータの冗長性を排除し、一貫性と効率性を保持するためのデータ形式である。

正規形のレベルは第5正規形まであるが、一般的には第3正規形まで考えることが多い。

### 第1正規形の定義

「一つのセルの中には一つの値しか含まない」

一つのセルに一つだけの値が含まれているとき、この値を**スカラ値**と呼ぶ。

### 第2正規形の定義

「テーブル内で部分関数従属を解消し、完全関数従属のみのテーブルを作成する」

- **部分関数従属**：主キーの一部の列に対して従属する列がある
- **完全関数従属**：主キーを構成するすべての列に従属性がある

### 第3正規形の定義

「テーブル内部の推移的関数従属を解消する」

- **推移的関数従属**：テーブル内部に存在する段階的な従属関係
【マインクラフト（統合版）】Websocketサーバーを使って「エヴォーカーファングの杖」を作ってみました

# 動作環境

<dl>
    <dt>プラットフォーム</dt>
    <dd>Windows10</dd>
    <dt>マインクラフト（統合版）</dt>
    <dd>Bedrock Edition v1.21.73</dd>
    <dt>socket-manager</dt>
    <dd>v1.14.1</dd>
    <dt>言語</dt>
    <dd>PHP v8.2.4（v8.1.0以降）</dd>
</dl>


# 使い方

このアイテムをメインハンドに装備した状態で使うと、プレイヤーが向いている方向へエヴォーカーファングを召喚します。
<img src="https://socket-manager.github.io/document/minecraft-contents/img/iron-fang/horizon.png" height="335px" width="500px" />

上を向いて使う事で対空戦も可能です。
<img src="https://socket-manager.github.io/document/minecraft-contents/img/iron-fang/sky.png" height="335px" width="500px" />

しゃがんだ状態で使うと護りの隊列になります。
<img src="https://socket-manager.github.io/document/minecraft-contents/img/iron-fang/defense.png" height="335px" width="500px" />

護りの隊列ではプレイヤーを中心として放射状にノックバックがかかるようにしているので、以下のように範囲内へ侵入した相手を遠ざけながらダメージを与える事ができます。
![実戦](https://socket-manager.github.io/document/minecraft-contents/img/iron-fang/defense-monster.gif "実戦")


# 「エヴォーカーファングの杖」取得

socket-manager環境のビヘイビアパック／リソースパックなどのアドオンパックを適用しておけば、以下の方法で「エヴォーカーファングの杖」が手に入ります。

### ・取引で取得する場合

武器鍛冶師の村人との取引で手に入ります。
<img src="https://socket-manager.github.io/document/minecraft-contents/img/iron-fang/trade.png" height="335px" width="500px" />

### ・ショップで購入する場合

以下のショップで購入できます。

https://qiita.com/glasses_seven/items/e77bfb43baf55e35680b/

### ・コマンドで取得する場合

以下はワールドオーナーやシステム組み込み用としてコマンドで取得する方法です。
<img src="https://socket-manager.github.io/document/minecraft-contents/img/iron-fang/get-command.png" height="335px" width="500px" />
<img src="https://socket-manager.github.io/document/minecraft-contents/img/iron-fang/get-iron-fang.png" height="335px" width="500px" />

---

あとはsocket-managerでWebsocketサーバーを起動後、マインクラフトからの接続が完了すれば「エヴォーカーファングの杖」を含めた各種コンテンツが使えるようになります。

:::note info
socket-managerの導入方法やアドオンパックの所在については以下のページでご紹介していますのでご興味のある方はご覧ください。
:::

https://qiita.com/glasses_seven/items/433ac9d9fcbdb72c6d18/

:::note info
アドオンパックの適用方法については以下のページでご紹介しています。
:::

https://qiita.com/glasses_seven/items/7a174722c9030e669eac


# おわりに

今回は「発射アイテム」としてのエヴォーカーファングの杖を実装後、「ダミーエンティティ」を作成して「発射体エンティティ」として発射する事でイベント検知を行っています。

https://qiita.com/glasses_seven/items/ed7e18730c9c5de3295c/

https://qiita.com/glasses_seven/items/abf1aecba67284e88e27/

https://qiita.com/glasses_seven/items/6bcd386abd74db01e450/

また、「召雷の魔石」実装時と同じようにWebsocketサーバーを介したネットショップとの接続中は発動できないようにしています。

https://qiita.com/glasses_seven/items/e58ec2ceaf2850461965/
QiitaCLIを使ってQiitaのWebエディタで書いた記事も丸ごとGitHubでバックアップ・管理したい

# QiitaCLIを使ってQiitaのWebエディタで書いた記事も丸ごとGitHubでバックアップ・管理する方法

## 結論
Qiitaの記事をGitHubでバックアップ・管理するには以下のコマンドを実行します：

```bash
npx qiita pull
git add -A
git commit -m "qiitaバックアップ"
git push
```

GitHub Actionsで定期実行すれば、自動的にバックアップを取得できます。

## 詳細解説

### QiitaCLIとは？

QiitaCLIはQiitaが提供する公式のコマンドラインツールで、ローカル環境からQiitaの記事を作成・編集・管理することができます。Webエディタだけでなく、お気に入りのエディタやIDEを使った記事作成をサポートしています。

### セットアップ手順

1. **準備するもの**
   - GitHubアカウント
   - Node.js環境（npxコマンドを使用するため）
   - Qiitaアカウントとアクセストークン

2. **初期設定**

   ```bash
   # プロジェクトフォルダの作成
   mkdir qiita-backup
   cd qiita-backup
   
   # Gitリポジトリの初期化
   git init
   
   # QiitaCLIの初期設定
   npx qiita init
   ```

   `qiita init`実行時に必要な情報：
   - Qiitaのアクセストークン（Qiitaの設定ページから取得）
   - ユーザー名
   - その他の基本設定（プロンプトに従って入力）

3. **GitHubリポジトリとの連携**

   GitHubで新しいリポジトリを作成し、ローカルリポジトリと連携します。

   ```bash
   git remote add origin https://github.com/あなたのユーザー名/リポジトリ名.git
   ```

### 記事のバックアップ方法

1. **手動でバックアップする場合**

   ```bash
   # Qiitaから記事を取得
   npx qiita pull
   
   # 変更をコミット
   git add -A
   git commit -m "qiitaバックアップ"
   
   # GitHubにプッシュ
   git push origin main
   ```

2. **GitHub Actionsで自動化する場合**

   リポジトリのルートに `.github/workflows/backup.yml` ファイルを作成します：

   ```yaml
   name: Qiita Backup

   on:
     schedule:
       - cron: '0 0 * * *'  # 毎日午前0時に実行
     workflow_dispatch:      # 手動実行も可能

   jobs:
     backup:
       runs-on: ubuntu-latest
       steps:
         - uses: actions/checkout@v3
         
         - name: Setup Node.js
           uses: actions/setup-node@v3
           with:
             node-version: '16'
             
         - name: Fetch Qiita articles
           run: npx qiita pull
           env:
             QIITA_TOKEN: ${{ secrets.QIITA_TOKEN }}
             
         - name: Commit changes
           run: |
             git config --global user.name 'GitHub Actions'
             git config --global user.email 'actions@github.com'
             git add -A
             git diff --quiet && git diff --staged --quiet || git commit -m "Automatic backup of Qiita articles"
             
         - name: Push changes
           uses: ad-m/github-push-action@master
           with:
             github_token: ${{ secrets.GITHUB_TOKEN }}
             branch: ${{ github.ref }}
   ```

   **注意事項：** GitHub ActionsでQiitaのアクセストークンを使用するには、GitHubリポジトリの「Settings」→「Secrets and variables」→「Actions」でシークレット変数 `QIITA_TOKEN` を作成し、Qiitaのアクセストークンを設定してください。

### QiitaCLIの便利な機能

- **記事の一覧取得**: `npx qiita list`
- **新規記事の作成**: `npx qiita new 記事のファイル名`
- **記事のプレビュー**: `npx qiita preview`
- **記事の投稿**: `npx qiita publish 記事のファイル名`

### バックアップの活用方法

GitHub上でバックアップした記事は以下のように活用できます：

1. **バージョン管理**: 記事の変更履歴を追跡できます
2. **ブランチ機能**: 実験的な内容を別ブランチで作成可能
3. **コラボレーション**: Pull Requestを使った共同編集
4. **バックアップ**: Qiitaのサービスに依存せず記事を保存

## まとめ

QiitaCLIとGitHubを組み合わせることで、Webエディタで書いた記事も含めてQiitaの全記事を効率的にバックアップし管理できます。GitHub Actionsによる自動化で、定期的なバックアップも簡単に設定できるため、大切な技術記事を安全に保存しながら効率的に管理できます。

初期設定に少し手間はかかりますが、一度設定してしまえば自動的にバックアップが取得されるので、技術記事を書く方には非常におすすめの方法です。
Java解説 20250428

### サブクラス
継承元のクラス
```
[修飾子] class サブクラス名 extends スーパークラス{}
```
### final修飾子
・変数に付けた場合は定数。
・メソッドにつけた場合、サブクラス側でそのメソッドをオーバーライドできない。

### this
・メンバ変数名とローカル変数名が同じ場合、ローカル変数が優先して参照されます。このときにメンバ変数を指定する場合にはthisをつける。
・インスタンス変数への適用：this.変数名;
・コンストラクタ呼び出しの適用：this();

### ローカル変数
メソッドの中で宣言されている変数。

### メンバ変数
クラスの中で宣言されている変数。

<br>

[オラクル認定資格教科書 Javaプログラマ Bronze SE(試験番号1Z0-818)](https://www.amazon.co.jp/%E3%82%AA%E3%83%A9%E3%82%AF%E3%83%AB%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E6%95%99%E7%A7%91%E6%9B%B8-Java%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E-Bronze-SE-%E8%A9%A6%E9%A8%93%E7%95%AA%E5%8F%B71Z0-818/dp/479816206X/ref=pd_lpo_d_sccl_1/357-5313211-9846263?pd_rd_w=VQCzo&content-id=amzn1.sym.855d8f70-df76-4181-80b0-56e48ae3bb9b&pf_rd_p=855d8f70-df76-4181-80b0-56e48ae3bb9b&pf_rd_r=JRR4W9RKV32K4AXF1WRZ&pd_rd_wg=l7VoD&pd_rd_r=1d465f85-0562-4b51-b523-77f8486c1508&pd_rd_i=479816206X&psc=1 "オラクル認定資格教科書 Javaプログラマ Bronze SE(試験番号1Z0-818)")
（ポエム）動画コンテンツを活用したプログラミング学習の効果的なアプローチ

主にティーチング研修を実施してきた経験から、今回は動画コンテンツとハンズオン環境を組み合わせたハイブリッド形式での研修について共有します。これまでのコーチング形式での指導方法についてお問い合わせをいただくことが多いため、可能な限り参考になるポイントをご紹介します。

## 想定読者
- **学習者の方々**
  - Udemy、YouTubeなどの動画教材でプログラミングを学ばれている方
  - プログラミングに関心をお持ちの学生の方（未経験者も含む）
  - 独学での学習に課題を感じている方
- **指導者の方々**
  - 他の講師の指導アプローチに関心をお持ちの経験者
  - これからプログラミング教育に携わる予定の方
  - 技術者のオンボーディングを担当される方
- **研修・教育関連のお問い合わせ**
  - 7月〜翌3月までの期間でのご依頼に対応可能です
  - カリキュラム設計やAI/DX関連の研修計画コンサルティングも承っております

## 本記事の範囲について
本稿では「動画コンテンツを使ったプログラミング学習のコツ」という点に焦点を当て、学習者それぞれに最適な具体的な学習方法や指導方法については触れません。プログラミング学習は個人の適性や学習分野によって適切なアプローチが異なるためです。個別のご相談はカジュアル面談などの機会にお願いします。

## 動画学習の特性を理解する

### 新しい学習形態としての動画コンテンツ
動画を主体とした学習スタイルは比較的新しいものです。プログラミング講師や、オンライン環境での学習に慣れた世代にとっては馴染みつつありますが、「馴染んでいる」ことと「効果的な学習方法が確立されている」ことは異なります。

動画学習の効果を最大化するためには、単に従来の対面形式をオンラインに置き換えるのではなく、メディアの特性を活かした新しいアプローチが必要です。講師と学習者の間で期待値のずれがないよう、お互いの理解を深めることが重要です。

### プログラミング学習特有の視点移動
プログラミングを動画で学ぶ際には、以下のような視点の切り替えが頻繁に発生します：

1. 教材（動画）の視聴
2. 手元の開発環境の確認
3. コードの実行
4. 実行結果の確認
5. 教材内容との照合

この一連のサイクルを何度も繰り返すことになるため、学習環境の整備が重要です。特に：

- 単一モニターでの学習時には画面分割の工夫が必要
- 解像度や配色によって見え方が異なる点への配慮
- 長時間のPC作業による身体的負担への対策（定期的な休憩やストレッチ）

一般的な学習と比べても視覚的な負荷が高いため、効率的な学習環境づくりが成功の鍵となります。

## オンライン学習環境の最適化

オンライン学習とオンサイト学習には、それぞれ特性があります。「対面でなければ伝わらない」と思われがちですが、オンライン環境を適切に活用することで効果的な学習体験が可能です。

ただし、組織によっては電子契約やデジタル環境への移行途上であることも考慮すべきでしょう。テクノロジーの導入と人の適応には時間差があるため、環境に合わせた柔軟な対応が求められます。

---

動画コンテンツを活用したプログラミング学習は、適切な環境設定と学習方法の工夫により、非常に効果的なアプローチとなります。個々の学習者に合わせたカスタマイズと、メディアの特性を理解した指導が重要です。

## 動画コンテンツの効果的な活用法

プログラミング学習における動画コンテンツは、大きく「リアルタイム受講」と「アーカイブ視聴」に分けられます。それぞれの特性を理解し、適切に活用することで学習効果を最大化できます。

### リアルタイム受講の活用法

リアルタイムでの動画受講（ライブ配信やオンラインセミナーなど）には以下のような特徴があります：

- **インタラクティブな質問機会**: 講師に直接質問できる貴重な機会です。事前に疑問点をメモしておき、質問タイムを有効活用しましょう。
- **集中力の維持**: 決められた時間に参加するため、モチベーションと集中力を保ちやすい環境です。
- **コミュニティ形成**: 同じ内容を学ぶ仲間との交流が可能で、学習コミュニティの形成につながります。

**効率化のコツ**:
- 事前に環境構築を完了させておく
- 質問したいポイントをあらかじめリストアップしておく
- チャットやQ&A機能を積極的に活用する
- メモツールを準備し、ポイントを素早く記録する習慣をつける

### アーカイブ視聴の活用法

録画された動画コンテンツの視聴には、以下のような利点があります：

- **自分のペースでの学習**: 理解できない部分は繰り返し視聴でき、理解できた部分は速度を上げて視聴することも可能です。
- **柔軟なスケジュール**: 自分の都合の良い時間に学習できるため、日常の予定に合わせやすくなります。
- **セクション単位での学習**: 必要な部分だけをピンポイントで視聴できます。

**効率化のコツ**:
- 再生速度の調整機能を活用する（1.25倍〜1.5倍速で視聴し、難しい部分は通常速度に戻す）
- 目次やチャプターマーカーを活用して必要な部分にすぐにアクセスする
- 実践と視聴を交互に行い、学んだ内容をすぐに手を動かして確認する
- コードを書く際には一時停止を活用し、理解度を確認しながら進める
- 重要なポイントをタイムスタンプとともにメモしておく（復習時に便利）

## 両方を組み合わせた理想的な学習サイクル

最も効果的なのは、リアルタイム受講とアーカイブ視聴を組み合わせた学習サイクルです：

1. **事前学習**: アーカイブ動画で基礎知識を習得
2. **リアルタイム参加**: 応用内容や疑問点を解消するライブセッションに参加
3. **復習と実践**: 再度アーカイブを活用して復習し、学んだ内容を実際にコーディングで試す
4. **コミュニティでの共有**: 学習成果や疑問点をコミュニティで共有し、フィードバックを得る

この循環的なアプローチにより、単調になりがちな動画学習に変化をつけながら、効率的に知識を定着させることができます。

## まとめ

動画コンテンツを活用したプログラミング学習は、適切な方法で取り組むことで非常に効果的です。リアルタイム受講の臨場感とインタラクティブ性、アーカイブ視聴の柔軟性と反復学習の利点、それぞれの特性を理解し、自分の学習スタイルに合わせて最適な組み合わせを見つけることが重要です。

また、動画学習はあくまでもプログラミングスキル習得の一手段であり、実際に手を動かしてコードを書く時間を十分に確保することが何よりも大切です。動画から得た知識を、実践を通じて自分のものにしていくプロセスを大切にしてください。

プログラミング学習の旅が実り多きものとなりますよう、この記事が少しでもお役に立てば幸いです。
luatexja-preset & luatexja-fontspecのWarningを緩和する

## 問題

```
Package luatexja-preset Warning: Japanese fonts will be scaled by 0.924715.
Package luatexja-fontspec Warning: \addjfontfeature(s) ignored;
```
という警告が出て，Latexmkがmax-repeatまで回ってしまう．これを解消してビルドを高速化したい．

## 解決法

https://tex.stackexchange.com/questions/238620/luatexja-preset-deluxe-option-crashes

上記より，

```tex
\DeclareDocumentCommand \newjfontfamily { m O{} m O{} } {
  \cs_set_eq:NN \fontspec_set_family:Nnn \ltj_fontspec_set_family:Nnn
  \newfontfamily #1 [#2] {#3} [#4]
  \cs_set_eq:NN \fontspec_set_family:Nnn \__ltj_orig_fontspec_set_family:Nnn
}
```

をluatexja-preset読み込み後に追記することで，ビルド時1度しか当該警告がでなくなった．
その内容までは追ってないが，ビルド時間がおおはｂ短縮されたのでよしとする．

時間があるときに根本的な解決を試みる．
【API基盤構築】同期処理と非同期処理の選び方：何秒以上で非同期を検討すべきか

## 内容

API基盤を構築する際、同期処理と非同期処理の選択は非常に重要です。本記事では、これらの処理の違いや、具体的に何秒以上の処理であれば、非同期を検討すべきかということについて解説します。結論としては、ユーザが介在する処理に関しては、3秒以上かかる処理には非同期処理を検討すべきと考えています。

## 同期処理と非同期処理とは

### 同期処理
同期処理とは、ある処理が完了するまで次の処理が待機する方式です。つまり、リクエストを送信した後、レスポンスが返ってくるまで他の処理を行うことができません。

 **利点**: 処理の順序が明確で、デバッグが容易。
 **欠点**: 待機するため、処理が遅延する可能性があり、ユーザー体験が悪化することがある。

### 非同期処理
非同期処理は、リクエストを送信した後、レスポンスを待たずに次の処理を進める方式です。これにより、ユーザーは他の作業を続けることができます。

 **利点**: 待ちが発生しないので、処理の効率が良く、ユーザー体験が向上。
 **欠点**: 処理の順序が不明確になり、実装やデバッグが複雑になることがある。

## 同期/非同期の選択

API基盤を設計する際、以下のような場合分けで同期処理または非同期処理を選択することが一般的です。

### 同期処理が適している場合
- リクエストの結果が即時に必要な場合（例: ユーザー認証）
- 処理が短時間で終わる場合（例: 簡単なデータ取得）

### 非同期処理が適している場合
- 長時間かかる処理（例: バッチ処理、ファイルアップロード）
- リアルタイムにリクエスト結果が必要でない場合（例: メール、ファイルの送信）

## 何秒以上で非同期を検討すべきか
先ほど、「処理が短時間で終わる」、「長時間かかる処理」としましたが、具体的に何秒以上の処理で非同期処理を検討すべきでしょうか。これはユーザが介在する処理の場合、ユーザがどれぐらいのレスポンスであれば、ストレスなく操作可能かという点が重要です。API基盤で何秒が妥当かという情報は見つけられなかったため、Webサイト表示のパフォーマンスでの話を元に考えます。

まずは、世界で一番使われているWebサービスであるGoogle検索では、Largest Contentful Paint（LCP）が2.5秒以内に実現するようしています。
[Google検索セントラルより](https://developers.google.com/search/docs/appearance/core-web-vitals?hl=ja)

:::note info
Largest Contentful Paint（LCP）
読み込みパフォーマンスの尺度で。ユーザが最初にページ移動したタイミングから最大のコンテンツが表示されるまでの時間
:::
実際に[Googleが​掲げる​ 10 の​事実](https://about.google/company-info/philosophy/)によると検索結果の​平均応答時間は​1秒足らずとなっているそうです。
また[TECH+](https://news.mynavi.jp/techplus/article/20121211-a025/)によるとWebサイトの待ち時間に関して、3秒を過ぎると57%のユーザーがWebサイト訪問をあきらめるという情報があります。また、モバイル端末からのアクセスでは、約60%のユーザが3秒での表示を許容範囲としています。
これらの情報からユーザは3秒を過ぎるとストレスを感じ始めるため、3秒以上の処理であれば、非同期処理を検討すべきと考えられます。

## まとめ

API基盤における同期処理と非同期処理の選択は、システムの設計において非常に重要です。要件に応じて適切な処理方式を選択し、ユーザー体験を向上させることが求められます。ユーザが介在する処理の場合、3秒以上かかる処理には非同期処理を検討すべきと考えられます。
RSpecでbinding.pryを使おうとしたらなぜが止まらない現象について(初学者向け)

# 現象内容
gem`pry-rails`、`pry-byebug`を導入しているにも関わらず、binding.pryが機能していない状態。`itブロック`にも確実に定義している。
参考記事：[Rspecでbindingを使って変数の中身を調べる方法](https://qiita.com/ngron/items/712bf3e06b7566e492ee)
今回は例としてusersテーブルにcreateした時、presence: trueを定義したカラムがnilだった場合、バリデーションエラーが機能するかをテストします。
※今回はあえてcreateにタイポをさせています。
```ruby:user_spec.rb
describe 'バリデーションチェック'
  it 'nameが空だった場合、バリデーションエラーが入る' do
    user = User.craete(name: "hogehoge", age: 20, email: "hoge@example.com")
    # ここにbinding.pryを定義してみる
    binding.pry
    expect(user).to be_invalid
  end
```
# 結論
### エラーが発生したコードの後に`binding.pry`を記述していた
エラーが発生したタイミングでit内の処理は中断されます。そして次に定義したitが呼び出されるので、エラーコードの後に書いたbinding.pryはスルーしてしまいます。
```ruby:user_spec.rb
describe 'バリデーションチェック'
  it 'nameが空だった場合、バリデーションエラーが入る' do
    # createのタイポによるメソッド未定義エラー
    user = User.craete(name: nil, age: 20, email: "hoge@example.com")
    # ここで処理がストップする。binding.pryは呼び出されない。
    binding.pry
    expect(user).to be_invalid
  end
  # 次のitに移行する。
  it 'ageが空だった場合、バリデーションエラーが入る' do
     user = User.create(name: "hogehoge", age: nil, email: "hoge@example.com")
     expect(user).to be_invalid
  end
```
# 今回勘違いしてしまったこと
エラーが出てしまった後でもすべての**itブロック**が呼び出されていたので、エラーが発生してもすべてのコードを読み込んでくれていると勘違いしていました。
通常だとエラーが発生した時点ですぐにエラー画面が表示するので、「ここで処理が止まっているんだな」と視覚的にわかりやすいのですが...
今回の現象でエラーが出てしまった時の挙動について、少し理解が深まったかなと思います。
# 補足：Gemfileで定義する場所について
binding.pryが使えない原因としてGemfileの記述場所が違う可能性もあります。(私も間違えていました)
```ruby:Gemfile
# 開発環境とテスト環境で使用するgem
group :development, :test do
  gem 'byebug', platforms: %i[mri mingw x64_mingw]
  gem 'rspec-rails'
  gem 'factory_bot_rails'
  # 本来はここに'pry-rails'と'pry-byebug'を定義する
end
# 開発環境のみ使用するgem
group :development do

  gem 'pry-rails'
  gem 'pry-byebug'

end
```
rspecはテスト環境で使用しているので、`group :development`の方に定義してしまうと`binding.pryは未定義のメソッドだよ！`とエラーが出てしまいます。
なのでgemを導入する時は、役割を理解してそれぞれのグループに配置する必要がありますね！
【SQL】主キー


# はじめに

こんにちは。アメリカに住みながら、独学でエンジニアを目指している Taira です。

現在 SQL を学習中ですが、教材の中で「主キーとは？」と問われた時、「テーブルの中にある一意性をもったキー」と答えました。

しかし、主キーにはそれ以外にも重要な性質があることがわかりました。

私のようにパッと答えられない人は、今回の記事で一度主キーの定義を整理してもらえると幸いです。

# 主キー (Primary Key) とは？

主キーとは，「**テーブルの中で、この 1 行はこれ！と一意に特定できるカラム**」のことを言います。

主キーには下記の 3 つの性質が決められています。

| 性質           | 説明                               |
| :------------- | :--------------------------------- |
| **非 NULL 性** | 空にならず、必ず値が入っている     |
| **一意性**     | 重複しない（すべての行で異なる値） |
| **不変性**     | 原則、変更されない                 |

---

# 主キーに適しているかのチェック

## 1. 学生テーブルの「メールアドレス」

- 重複しないか？ ： 基本一意
- NULL にならないか？ ：未登録で NULL になる可能性
- 変更されないか？ ：変更の可能性

→ 一意性はあるが、不変性が不完全なため、主キーには向かない。

_（大学発行メールなら主キー向きになる可能性もあり）_

## 2. 商品テーブルの「商品名」

- 重複しないか？ ：重複の可能性あり
- NULL にならないか？ ：基本登録
- 変更されないか？ ：リニューアルで変更の可能性

→ 一意性が保証されないため、主キーに向かない。

## 3. 社員テーブルの「社員 ID」

- 重複しないか？ ：一意に割り振る
- NULL にならないか？ ：必要登録
- 変更されないか？ ：変更しない設計

→ 主キーに適している！

## 4. 本テーブルの「出版日」

- 重複しないか？ ：同日に複数本発売可能
- NULL にならないか？ ：登録もれる可能性
- 変更されないか？ ：基本変更なし

→ 一意性がないため、主キーに向かない。

## 5. 会員テーブルの「電話番号」

- 重複しないか？ ：家族共有などの可能性
- NULL にならないか？ ：未登録の可能性
- 変更されないか？ ：変更可能

→ 一意性や不変性に疑問があり、適しているとは言い難い。

## 6. 注文履歴テーブルの「注文 ID」

- 重複しないか？ ：一意発行
- NULL にならないか？ ：登録必須
- 変更されないか？ ：基本変更なし

→ 主キーに最適！

---

# まとめ

主キーは、単に「一意性あれば良い」というものではありません。

**非 NULL 性、一意性、不変性**の 3 つの観点から検証し、実際の運用も見込んで選ぶことが重要です。

最初は記憶だけでも足りるので、数を習れるつもりでチェックしてみてください！
【Pyxel】セーブ機能付きのゲームを実行ファイル化したい！

## はじめに
　今回は、セーブ機能付きのゲームを実行ファイル化する方法を紹介します。といっても、pyからexeへの変換の手順は変わりません。セーブ機能を実装するためのファイル操作をするときに、注意すべき点があります。この記事はその点について詳しく解説したものです。

::: note warn
この記事の内容はWindowsを想定しています。筆者はMacを持っていないので、確認できないのですが、似たような問題が発生する場合は、おそらく同様に解決できると思います。
:::

## 注意すべき点
　今回のテーマで注意すべき点は、ディレクトリ構造です。ゲームを作るときは、プロジェクトフォルダを作って、その中に`src`など、目的別のファイルを置くのが普通だと思います。そして、セーブデータもプロジェクトフォルダの内部に生成すると思います。自分で実行する分には、これで事足りるのですが、いざ動作確認を終えて実行ファイル化すると、**セーブデータが残らない**という問題が発生します。（筆者は発生しました）

## 原因について
　セーブデータが残らない原因として、実行ファイルを置いている位置と、プログラムの実行パスが異なる点が挙げられます。どこから実行したかに関わらず、実行パスが`C:\Users\ユーザー名\AppData\Local\Temp\.pyxel\play\ランダムな数字\実行ファイルの名前`となるようです。
 
 　たとえば`game.exe`という名前のファイルを起動した場合、`C:\Users\ユーザー名\AppData\Local\Temp\.pyxel\play\ランダムな数字\game`になります。`game`の中身は、実行ファイル化するときに読み込んだプロジェクトフォルダとなっています。

　これだけなら問題はなさそうですが、パスに書いたランダムな数字というのが厄介なポイントです。実行ファイルからプログラムを実行したタイミングで、それ以下のディレクトリ構造が再生成されているようなので、セーブデータを残しても、次にプログラムを起動した際に初期化されてしまいます。

　つまり、プロジェクトフォルダ内に、いくらセーブデータを残そうが意味はないと考えていいでしょう。

## 解決策
　解決策は単純な話で、再生成されない部分にセーブデータを残せばいいです。
 ~~具体的には、上位の階層にセーブデータ用のファイルを生成し、初回以外はそこからセーブデータを読み込むようにするのがおすすめです~~

バージョン2.2.6で追加された`user_data_dir`というものを使うと、安全なデータ保存先が取得可能だと、Xの方でコメントをいただきました。

```python
path = pyxel.user_data_dir('開発者名', 'アプリ名')
print(path)    # C:\Users\ユーザー名\.pyxel\開発者名\アプリ名
```

これを踏まえて、以下のようなコードで、セーブ機能を実装することができました。
 
```python
import pyxel, os, pickle

#保存先のパスを取得
directory_path = pyxel.user_data_dir('開発者名', 'アプリ名')
save_path = os.path.join(directory_path, "save.pkl")

try:
    with open (save_path, "rb") as f:
        save_data = pickle.load(f)

        # 二回目以降の処理
        
except FileNotFoundError:

    # 初回時の処理

    with open(save_path, "wb") as f:
        pickle.dump(save_data, f)

```
`pyxel.user_data_dir`を使ってセーブデータ格納用フォルダを生成します

後は普通のファイル操作と同様に、初回実行時のみセーブ用ファイルの生成を行い、二回目以降は読み込みを行うなど、各自必要な処理をしてください。

:::note
プログラム内で書き換えないようなファイル（フォントファイルなど）は相対パスのままでもいいのですが、セーブデータ以外にも書き換えるファイルがある場合は、セーブデータ用のファイルと同じところにおいてあげると良いでしょう。
:::

<details><summary>修正前の記事の内容（一応残してますが見なくていいです）</summary>
今回はプロジェクトフォルダの直下にメインファイルを置いている想定で書いています。
 
```python
import os, pickle

current_path = os.path.abspath(__file__)
# 4階層上のディレクトリに作成
directory_path = os.path.abspath(os.path.join(current_path, "..", "..", "..", "..", "game"))
os.makedirs(directory_path, exist_ok=True)
save_path = os.path.join(directory_path, "save.pkl")

try:
    with open (save_path, "rb") as f:
        save_data = pickle.load(f)

        # 二回目以降の処理
        
except FileNotFoundError:

    # 初回時の処理

    with open(save_path, "wb") as f:
        pickle.dump(save_data, f)

#----あとは各自の処理----
```
osモジュールを使ってメインファイルの絶対パスを取得した後、その４つ上（.pyxel）を指定し、プロジェクトフォルダの名前でセーブデータ格納用フォルダを生成します（初回のみ）
</details>

## まとめ
セーブ機能付きのゲームを実行ファイル化するときは、実行時に初期化されない位置へセーブ用ファイルを生成する必要がある！

その際に、`user_data_dir`というメソッドが提供されているので、これを使うと便利！

## 最後に
　ここまで読んで下さりありがとうございました。この記事では実行ファイル化する手順については触れなかったので、そちらについても確認したい方は、以下の記事も併せてご覧ください。

 https://qiita.com/Prosamo/items/6ab9612958f854ba51ed

## 参考

https://note.com/koide_mizu1433/n/nb966bb430504
macOS の Rosetta が壊れたときの対処方法

macOS をソフトウェアアップデートしたところ何かに失敗したらしく、Google 日本語入力が動かなくなった。かなり困る...。

調べるとどうも Google 日本語入力が壊れたのではなく Rosetta が壊れているようだった。(Google 日本語入力は ARM 版無いらしい)

``` console:Rosetta が壊れている様子
$ arch -x86_64 uname -m
assertion failed [thread_starts_interval.has_value()]: __thread_starts section missing
(RebaseRuntimeMachO.cpp:191 rebase_image)
 zsh: abort      arch -x86_64 uname -m
```

とりあえず Rosetta を再インストールしてみることにした。

``` console
$ sudo softwareupdate --install-rosetta --agree-to-license
(略)
Install of Rosetta 2 finished successfully
```

``` console:Rosetta が直った様子
$ arch -x86_64 uname -m
x86_64
```

直った... よかった。(Google 日本語入力も動いた)
URL短縮サイトを高速にするための検索アルゴリズムを妄想してみた

URL短縮サイトを実装する場合、  
たとえ人気のないサイトでも、**何千万件以上**のURLが登録されることが考えられます。

例えば、

- 「ABC -> https://google.com 」
- 「ABD -> https://www.yahoo.co.jp/ 」

といった情報が、何千万件と保存されるわけです。

この何千万件の情報を比較するだけであれば、そこまで膨大な時間はかからないかもしれません。  
しかし、**URL短縮サイトは「速度」が命**だと私は考えています。  
動作の遅いURL短縮サイトは、それだけでユーザー離れにつながるでしょう。

そこで今回は、  
「**何千万件からでも高速に検索できる仕組み**」について、妄想してみようと思います！

---

## 前提条件

簡単のため、今回は短縮URLに **Base62** を使用すると仮定します。

Base62とは、以下の文字を使うものです。

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789

---

# まずは「1ファイル末尾追記方式」を考える

最初に、「**1つのファイルにすべてのURL情報を追記していく**」方法を考えます。

仮に、**1URLあたり平均30文字**とすると、  
何千万件登録されれば、**約10億文字**になります。

大半（99%以上）が1バイト文字なので、ファイルサイズは概ね**1GB程度**でしょう。  

また、**StreamReader**などで1行ずつ読み込めば、  
メモリを大量に消費することなく、比較作業が可能です。

---

この方法では、単純に何千万回比較することになりますが、  
それでも実際には**そこまで時間はかからない**と推測されます。

基本的な実装としては問題ないでしょう。

---

## ただし、さらに高速化できないか？

とはいえ、  
**URL短縮サイトでは、さらに高速なレスポンスが求められる**と考えます。

そこで、  
「**比較回数をさらに減らす方法**」を妄想してみます。

---

# 1文字目ごとにファイルを分ける

検索対象の短縮URL（検索部分）は、Base62文字列です。

そこで、**検索部分の1文字目ごとにファイルを分割**する方法を考えます。

例えば、次のようにします。

- 「ABC -> https://google.com 」という登録があれば
- 「A.txt」に「BC -> https://google.com 」を書き込む

つまり、**先頭文字別に振り分ける**のです。

検索時は、まず先頭1文字で対応するファイルを選び、  
その中で残りの文字列を検索します。

これにより、  
**検索対象は理論上62分の1に減少**します。

多少ファイルアクセスコストは増えますが、  
十分効果的な最適化と言えるでしょう。

---

# さらに 1〜2文字目ごとにファイルを分ける

さらに踏み込んで、  
**検索部分の1文字目＋2文字目でファイルを分ける**方法も考えられます。

この場合、

- 「ABC -> https://google.com 」という登録なら
- 「AB.txt」に「C -> https://google.com 」を書き込む

という形になります。

これにより、ファイル数は **62² = 3844個** になりますが、  
比較対象は理論上 **62²分の1** にまで減少します。

---

### フォルダ構成の工夫

ファイル数が増えるので、  
「**1文字目ごとにフォルダを作り、その中に2文字目ごとのファイルを置く**」  
という構成にするのも一つの手でしょう。

例：

- 「ABC -> https://google.com 」という登録なら
- 「A/B.txt」に「C -> https://google.com 」を書き込む

これにより、  
ファイルシステムの負荷分散も期待できます。

（このあたりは、検索アルゴリズムやファイルシステムの特性にも依存するでしょう）

---

# まとめ

以上、  
**URL短縮サイトにおける検索高速化についての妄想**をまとめました。

なお、実際の運用では、

- `https://` を別文字に置換したり
- `https://` から始まるURLのみ許可したり
- 使用する文字として 0 と O を省いたり

などの工夫もあり得るでしょうが、  
今回は**検索速度に特化**して考えてみました。

---

もし、**実際の短縮URLサービスで使われているアルゴリズム**について  
ご存じの方がいらっしゃいましたら、  
ぜひコメントいただけると嬉しいです！

最後までお読みいただき、ありがとうございました！

***

追記

投稿後に文章を ChatGPT に添削頂きました。

AI で添削した文章が
好みではない方には申し訳ありませんが
この添削後の文章で容赦頂きますようお願いします。
猿でもわかるAIの倫理・リスクシリーズ 🐵⚠️[第10回] 生成AIの「幻覚」現象とは何か？





## 1. はじめに：生成AIの「幻覚」とは？

ChatGPTやClaude、Geminiなどの生成AIは、私たちの日常業務を劇的に変えました。  
しかし、**「それっぽいけどウソ情報」を堂々と出してくる**ことがあります。

これが俗にいう「**幻覚（hallucination）**」です。

### 📌 生成AI幻覚の例
- 実在しない論文や記事タイトルを提示
- 架空のAPIやライブラリを案内
- 事実と異なる歴史的出来事を説明

**なぜ、こんな「それっぽいウソ」を生成してしまうのか？**  
本記事では、幻覚のメカニズムとエンジニア視点での対策について深堀りしていきます！

---

## 2. 生成AI幻覚のメカニズムとは？【図解】

生成AI（特に大規模言語モデル、LLM）は、  
**「次に来そうな単語を確率的に予測する」**仕組みで動いています。

![生成AIの予測イメージ](https://upload.wikimedia.org/wikipedia/commons/e/ef/Language_model.png)

_(図1：言語モデルは「もっともありそうな単語列」を予測しているだけ)_

つまり、  
- 本当に正しいか？  
- 事実と一致するか？  
をチェックしていないのです。

そのため、文法的には完璧でも**事実無根な回答**が生まれることがあります。

> 🤔 言い換えると、生成AIは「知識ベース」ではなく「パターン予測器」だということ！

---

## 3. 実践編：幻覚を引き起こしやすいプロンプト例と検証

エンジニアなら**「どんな時に幻覚が起きやすいか」**を肌感覚でつかみたいですよね。  
ここでは簡単なPythonスクリプトを使って試してみましょう！

### 🛠️ OpenAI APIを使った実験

```python
import openai

openai.api_key = "YOUR_API_KEY"

prompt = "世界で初めて量子コンピュータを発明した人物の名前とその論文を教えてください。"

response = openai.ChatCompletion.create(
    model="gpt-4",
    messages=[{"role": "user", "content": prompt}],
    temperature=0.7
)

print(response['choices'][0]['message']['content'])
```

**結果例**：

```
世界で初めて量子コンピュータを発明したのは「ジョン・スミス博士」であり、彼の代表的な論文は「Quantum Computing and Its Future Perspectives」（1985年）です。
```

> ❌ 実際には「ジョン・スミス博士」など存在しません！論文も存在しない架空のものです。

---

## 4. 実務Tips：幻覚を減らすためにできること

現場エンジニア向けに、実践的な幻覚対策も紹介します！

### ✅ 幻覚を抑える方法

| 手法                           | ポイント                         |
|-------------------------------|----------------------------------|
| 検索連携（RAGなど）               | 外部ナレッジベースで裏付ける          |
| 明確なプロンプト設計（プロンプトエンジニアリング） | あいまいな質問を避ける               |
| 生成温度（temperature）を下げる      | 出力のランダム性を減らす（例：0.2〜0.3） |
| 事実確認（ポストプロセス）         | 生成後に検証APIや自前ロジックでチェック  |

### ❌ よくあるミス
- 「大規模モデルなら幻覚しない」と思い込む
- 「1回出た回答」をそのまま信用してしまう
- 「温度0でも幻覚がゼロになる」と誤解する

---

## 5. 応用編：幻覚対策を実装してみる（RAGミニサンプル）

### 🛠️ Retrieval-Augmented Generation (RAG)の超シンプル版

```python
from transformers import pipeline

# シンプルなドキュメント
knowledge_base = {
    "量子コンピュータ": "量子コンピュータは1980年代に提唱され、現在も研究が進められている。代表的な研究者はリチャード・ファインマンなど。"
}

# 質問に最も近い知識を選ぶ（本当はEmbeddingを使うがここでは単純化）
query = "量子コンピュータを最初に提唱したのは誰？"

# 簡易検索
context = knowledge_base.get("量子コンピュータ", "")

# 回答生成
generator = pipeline("text-generation", model="gpt2")
prompt = f"以下の情報に基づいて質問に答えてください:\n{context}\n質問:{query}"
output = generator(prompt, max_length=100)

print(output[0]['generated_text'])
```

> 🔥 ポイント：  
> モデル単体ではなく、**事実情報（context）を与えてから生成**させる！

---

## 6. まとめ：生成AIと幻覚の付き合い方

| メリット               | デメリット                     |
|-----------------------|-------------------------------|
| 高速な文章生成が可能        | 幻覚リスクが常に付きまとう         |
| 柔軟なアイデア出しができる     | 厳密な事実性が求められる場面では危険  |

### 🚀 未来展望
- RAGや検索拡張型AIの普及
- 幻覚検出アルゴリズムの進化
- 信頼性を考慮したプロンプト設計の標準化

---

## 📣 最後に

幻覚をゼロにするのは現時点では難しいですが、  
✅ 正しく理解し  
✅ 適切にコントロールし  
✅ 賢く活用する

ことは可能です！

次回は、**「RAGを本番システムに組み込むTips集」**についても紹介予定ですので、お楽しみに！

---

👩‍💻👨‍💻  
もしリクエストがあれば、この記事に合わせた  
- 「幻覚発生パターン7選」
- 「幻覚チェックリスト」  
も追加作成できます！

👉 興味ありますか？🌟  
（続編記事のテーマ案も募集中です！）
猿でもわかるAIの倫理・リスクシリーズ 🐵⚠️[第9回] AIは差別を助長するのか？データバイアス問題



## 1. はじめに：AIが「差別」を生み出す？

近年、AI技術の急速な普及に伴い、  
- 採用システム
- 融資審査
- 顔認識技術  
などの分野で「**AIが差別を助長している**」という批判が高まっています。

> 例えば「ある民族グループに不利なスコアをつけた顔認識AI」や「女性候補者を低く評価する採用AI」が問題になりました。

なぜこんなことが起こるのか？  
それは、**AI自体が差別的だからではなく、学習データに偏り（バイアス）があるから**です。

本記事では、  
- データバイアスとは何か  
- 実際にどのように発生するか  
- エンジニアが現場でできる対策  
を、**具体例とコード付き**でわかりやすく解説していきます！

---

## 2. データバイアスとは何か？【図解あり】

まず基本から押さえましょう。

### 📚 データバイアスの定義
**データバイアスとは**  
「特定の属性や集団に対してデータの量や質が不均等なことにより、学習結果に偏りが生じる現象」です。

例えば：

| シナリオ                  | バイアス例                   |
|---------------------------|------------------------------|
| 採用AIのトレーニングデータ    | 男性応募者が90%、女性応募者が10% |
| 顔認識データ                | 白人顔画像が95%、有色人種が5%   |

![データバイアスのイメージ図](https://upload.wikimedia.org/wikipedia/commons/2/28/Bias.png)  
_(図1：偏ったデータが生むバイアスのイメージ)_

結果として、AIは「正しい判断ができない」「差別的な出力をする」リスクを持ちます。

---

## 3. 実践編：バイアス検出と対策をやってみよう！

ここでは、簡単なサンプルを使って  
**バイアス検出の基礎**を体験してみましょう！

### 🛠️ Pythonでのバイアス可視化例

#### データ例（男女の昇進データ）

```python
import pandas as pd

# ダミーデータ
data = {
    'gender': ['male', 'female', 'male', 'female', 'male', 'male', 'female', 'female', 'male', 'female'],
    'promotion': [1, 0, 1, 0, 1, 1, 0, 0, 1, 0]  # 1=昇進、0=昇進せず
}

df = pd.DataFrame(data)
print(df)
```

| gender | promotion |
|--------|-----------|
| male   | 1         |
| female | 0         |
| ...    | ...       |

#### 昇進率を比較してみる

```python
# 昇進率を性別ごとに算出
promotion_rate = df.groupby('gender')['promotion'].mean()
print(promotion_rate)
```

出力例：

```
gender
female    0.0
male      1.0
Name: promotion, dtype: float64
```

> 😱 明らかに「男性ばかり昇進」していることがわかります！

---

## 4. 現場Tipsとよくある落とし穴

### ✅ 現場で使えるTips
- **データ収集段階から意識する**  
  → 属性別のカバレッジ（例：性別、人種、年齢層）をチェック
- **モデル訓練後にも検証する**  
  → バイアステストツール（Fairlearn, AIF360など）を活用

### ❌ よくあるミス
- **「大量データなら大丈夫」と思い込む**  
  → 量よりも**質と多様性**が重要！
- **機械学習モデルに丸投げする**  
  → 「なぜこの予測が出たか」を説明できないとリスク大

---

## 5. 応用編：バイアス低減テクニック

さらに進んだ対策として、こんな技術もあります！

| テクニック                      | 具体例                                                   |
|-------------------------------|---------------------------------------------------------|
| リサンプリング                   | 少数派データを増やす（オーバーサンプリング）              |
| 損失関数のカスタマイズ             | バイアス軽減を目的に新しいロス関数を設計                 |
| 公平性指標（Fairness Metric）の最適化 | Accuracyだけでなく、Equal Opportunityなども考慮する |

![公平性の概念図](https://upload.wikimedia.org/wikipedia/commons/7/76/Fairness_metrics.png)  
_(図2：公平性指標のイメージ)_

これらを取り入れることで、より「信頼できるAIシステム」を目指すことができます！

---

## 6. まとめ：これからのエンジニアに求められる視点

| メリット                     | デメリット                    |
|-----------------------------|------------------------------|
| 社会的信頼を得られる             | 開発・検証コストが増大する可能性あり |
| プロダクト品質・ユーザー満足度向上 | データ収集・選別に工数がかかる         |

---

## 🚀 最後に

AI時代のエンジニアにとって、  
単にモデルを作るだけでは不十分です。

✅ バイアスに気づく力  
✅ 公平性をデザインする力  
✅ 説明可能性を確保する力

これらを持つことで、より高い次元で技術を活かせるようになります！

> 🌟 小さなプロジェクトでも、まずは「属性別の結果確認」から始めてみましょう！


👩‍💻👨‍💻  
もしご希望があれば、この記事向けに「オリジナル図解7枚セット」も作成できます！  
さらに具体例を増やした続編記事もOKです！

👉 続きを読みたいテーマ、または「この部分をもっと掘り下げて」などご希望ありますか？🌟  
（お気軽に教えてください！）
【Python初心者】printとreturnの違い - 関数の戻り値がないときの挙動まとめ

Pythonを学び始めたころ、関数の挙動が思っていたのと違って戸惑ったことがありました。
特に print() と return の違いが曖昧なままだと、「ちゃんと表示されているのに None が出てきた！」と驚くことがあります。

この記事では、関数の戻り値がないときにどうなるかを具体的なコード例をもとに整理しておきます。

## 例：printとreturnの違いを見てみよう

以下のコードをご覧ください。

```py
def show_total(price)
    tax = 5
    print("合計金額:", price + tax)

total_price = 100
print(show_total(total_price))
```

```:実行結果
合計金額: 105  
None
```

「表示はされてるのに、なぜ `None` が出てくるの？」と感じた方は、以下の解説をチェックしてみましょう。



## 解説：printは表示、returnは値を返す

このコードでは、次のような流れで処理が行われています。

1. `show_total(total_price)` を呼び出すと、関数内の `print()` によって `"合計金額: 105"` が表示される  
2. しかし、`show_total()` 関数には `return` がないため、戻り値は `None`  
3. `print(show_total(total_price))` によって `None` も表示されてしまう

つまり：

- `print()` は「画面に表示」するだけ
- `return` を使わない限り、関数は自動的に `None` を返す



## 修正例：値を返すようにするには？

```py
def calculate_total(price):
    tax = 5
    return price + tax

total_price = 100
print("合計金額:", calculate_total(total_price))
```

```:実行結果
合計金額: 105
```

このように、関数に `return` を使うと戻り値が返されるので、`None` は表示されません。



## 他の例：戻り値がない関数はすべてNoneを返す

```py
def greet(name):
    print(f"{name}さん、こんにちは！")

message = greet("田中")
print("関数の戻り値:", message)
```

```:実行結果
田中さん、こんにちは！
関数の戻り値: None
```

このように、`return` を書かない関数は、明示的に何も返していないように見えても、内部的には `None` を返しています。

---

## ✅ まとめ：printとreturnの違いを押さえよう

| 項目      | 説明                                   |
|-----------|----------------------------------------|
| `print()` | コンソールに表示するだけ（戻り値なし） |
| `return`  | 関数の「戻り値」を指定する              |
| 戻り値省略| `None` が返される                      |

関数の戻り値に関しては、動かしてみるまでは意外と実感が湧きにくい部分でした。
今回のような「表示されるけど None が返る」といった違和感を何度か経験して、ようやく print() と return の役割の違いが腑に落ちてきたように思います。


## 📚 参考リンク

- [Python公式ドキュメント - 関数定義](https://docs.python.org/ja/3/tutorial/controlflow.html#defining-functions)
猿でもわかるAIの倫理・リスクシリーズ 🐵⚠️[第8回] AI規制の最新動向：日本・EU・アメリカの比較



## 1. はじめに：なぜ今「AI規制」が重要なのか？

AI技術は爆発的に進化し、  
- チャットボット
- 自動運転
- 生成AI  
など、社会のあらゆる領域に入り込みつつあります。

しかし、  
☢️ **「AIによる差別」「プライバシー侵害」「誤情報拡散」** といったリスクも急増。

そのため、世界中で**AI規制**に関する動きが加速しています。

> エンジニアとしては、技術だけでなく「ルール作り」の流れも正しくキャッチする必要があります！

この記事では、  
- 日本
- EU（欧州連合）
- アメリカ  
それぞれの**AI規制の最新動向**をわかりやすく比較し、  
実装レベルでどう対応すべきかを解説していきます！

---

## 2. AI規制の全体像と比較

### 📚 各国の動向まとめ

| 地域     | 規制の特徴                     | ポイント                             |
|---------|------------------------------|-------------------------------------|
| 日本     | ソフトロー（指針中心）             | 技術推進とリスク抑制のバランスを重視         |
| EU      | ハードロー（法規制強め）             | 世界初の包括的AI規制「AI Act」を制定        |
| アメリカ | 自由主義的（基本は民間主導）          | 連邦レベルでは緩め、州ごとに規制が異なる傾向  |

![各国AI規制比較図](https://upload.wikimedia.org/wikipedia/commons/5/55/World_map_AI_regulation.png)  
_(図1：世界のAI規制マップ（イメージ）)_

---

## 3. 実践編：規制対応を意識したAI開発のステップ

たとえば、  
生成AI（例えば文章生成API）を自社プロダクトに組み込むケースを考えます。

🔧 こう進めるべきです！

### ステップ例

```markdown
1. リスク分類
   - 低リスク（例：推薦システム）
   - 高リスク（例：雇用判断AI）
   - 禁止領域（例：社会的スコアリング）

2. データガバナンス設計
   - 学習データの出所を管理
   - バイアス検出テストを設計

3. ログ・トレース機能実装
   - 推論プロセスを記録
   - 利用者からの説明要求に対応可能に

4. リスクに応じた利用制限設定
   - 高リスクの場合、必ず人間の承認を挟む
```

### 🛠️ コード例（簡易版：推論ログ収集）

```python
import logging

# ロガー設定
logging.basicConfig(filename='inference.log', level=logging.INFO)

def generate_response(prompt):
    # ダミー応答生成（実際はLLM APIを呼び出す想定）
    response = f"Answer to '{prompt}'"
    
    # ログに記録
    logging.info(f"Prompt: {prompt} | Response: {response}")
    
    return response

# 使用例
output = generate_response("AI規制って何？")
print(output)
```

✅ 推論内容を自動で記録することで、  
「誰が・いつ・何を使ったか」が後から検証できるようにしています。

---

## 4. 現場での実践Tipsとよくある落とし穴

### ✅ 現場Tips
- **初期段階から規制対応を組み込む**：後から付け足すとコストが跳ね上がる
- **リスクプロファイリングを徹底する**：対象システムごとにリスクレベルを分類

### ❌ よくあるミス
- **「うちは日本企業だから大丈夫」と油断する**：EU向けサービスなら**EU法適用**される場合も
- **ブラックボックス化しすぎる**：説明可能性（Explainability）が今後ますます重要に

---

## 5. 拡張応用：具体的に押さえておきたい技術ポイント

より高度な規制対応を目指すなら、次の技術要素にも取り組みましょう！

| テーマ                      | 実践技術・例                                                   |
|----------------------------|-------------------------------------------------------------|
| Explainable AI (XAI)         | SHAP, LIMEなどを使ってモデル判断を可視化                    |
| フェアネス（公平性）           | バイアス検出ツール（Fairlearn, AIF360）                   |
| データ匿名化・プライバシー強化 | Differential Privacy技術、Federated Learningの活用      |

![XAIイメージ](https://upload.wikimedia.org/wikipedia/commons/9/9c/Explainable_AI.png)  
_(図2：Explainable AIのコンセプト図)_

---

## 6. まとめ：AIエンジニアに求められる「次世代リテラシー」

| メリット                           | デメリット                         |
|-----------------------------------|----------------------------------|
| ユーザー信頼を獲得できる             | 開発コスト・運用コストは増加する       |
| 国際展開へのハードルを下げられる       | 対応しないと罰金・社会的制裁のリスク   |

---

## 🚀 最後に

技術だけでは、これからのAI時代は戦えません。  
**「技術＋倫理＋法規制」**を武器にすることが、これからのエンジニアには求められます。

> 🌟 まずは、小さなプロジェクトからでも「規制対応設計」を意識してみましょう！


---

もしご希望があれば、このシリーズ用に  
**オリジナル図解7枚パック**も作成可能です！📊✨  
必要でしたら教えてくださいね！🎨

---

👉 この続き、または図解作成、別テーマ展開などご希望ありますか？