OmniAICreator/Qiita-1.07M huggingface dataset:
MCreator/Modアイコンの作り方

#前の記事:https://qiita.com/yt365/items/319e30666113cc9640e2
今回は作ったModのアイコンを設定できるようにします。
## この記事で分かること
・Modのアイコンの設定方法
・アイコン画像の作り方
## 絵を描く
リソースからテクスチャを作成し、好きな絵を描きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054637/0a1dc049-cc56-4b12-bd1e-e678de060dec.png)
好きな絵が描けたら、右上の保存ボタンを押します。
テクスチャの名前を入力して、テクスチャタイプをその他にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054637/ad1679e7-4144-4e07-a763-6407912adb46.png)
テクスチャを保存したら、左上の方にあるワークスペースからワークスペースの設定を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054637/403e7d5f-4515-4191-a565-5c88bb0d7d1a.png)
modのロゴ画像からさっき作った画像を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054637/b72e6735-6583-4e22-96f4-de6a497d505a.png)
変更を保存を押して、右上の再生ボタンからマイクラを立ち上げます。
## 試してみる
マイクラのmodボタンからアイコンが表示されているか確かめます。![2025-05-12_19h24_14.png]
![2025-05-12_19h19_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054637/0fe7f80b-7227-4a20-966f-bfe4f8f65add.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054637/41975848-dcf4-448f-853e-9fba007425fd.png)
電波法を説明します➃[特定小電力]➂

前回、時間の例として送信時間制限やキャリアセンスなどを説明しました。引き続き時間ですが、2.4GHzのみに特化して説明します。結論を先に言いますが、2.4GHzには時間の規定はありません。つまり、いつでも自由に電波を出すことができます。但し、最近はドローンなどの一部でキャリアセンスの要求があります。ただ、不思議なのがレベルの規定がないのです。結局、取って付けただけの規定で、意味があるのかは不明です。

2.4GHzは皆さんがWi-Fiを使うときに選択する周波数で、現在は2.4GHzと5GHzの両方を使い分けていると思います。5GHzについては周波数を拡げてWi-Fi６やWi-Fi7などの高速化が進んでいます。但し、無線LANとしては2.4GHzから始まり、混信問題から5GHzに拡張されています。IEEE802.11で始まる規格が基本的にWi-Fiとして利用されています。
2.4GHz帯はISMバンドと呼ばれ、IはIndustry、SはSientific、MはMedicalを指します。日本語で言えば「産業科学医療用の周波数バンド」となります。カッコ良く聞こえますが、無線からみたら「ゴミバンド」と揶揄されることが多いです。何故かというと、元々この周波数帯の無線通信としてはアマチュア用しかなく、電子レンジのマグネトロンの発振周波数でもあり、主にエネルギー伝送などで使われています。電子レンジを動かすとBluetoothのヘッドホンが聞こえずらくなるのはそのためです。ただ、このような理由からほぼ全世界で無線として使われていなかったため、電波としては空き状態で、周波数の変更なしにどこでも使えるメリットがあることから無線LANの規格としてIEEEが802.11を策定して、今に至ります。
2.4GHz帯が他の周波数と大きく違う内容を、電波法として取り上げると以下です。

➀チャネルの規定がない
➁占有帯域幅の規定はあるが、ざるの様に広い(26MHz)
➂時間制限がない
➃キャリアセンス不要（一部ラジコンなどで定義)
➄送信出力規定がmW/MHzと謎の「/MHz」が入る
➅半値角規定により最大10倍の送信が可能

2.4GHzは全世界で使えることから、初期に制度化されたあとから緩和されたことが多く、➅の半値角規定もその1つです。
半値角とは送信出力ピークの半分のレベルになる角度で、全周が360度のため半値角が18度のアンテナなら出力が半分の角度は18×2＝36となり、送信可能なアンテナゲインの付加分は360÷36＝10倍で、10倍は10dBのため12.14dBiのゲインのアンテナまで利用できます。送信出力の上限は10mW/MHzのため、最大22.14dBmの送信出力まで許容されることになります。半値角がその倍の36度なら360÷72＝5のため、7.1dBiのゲインのアンテナが利用できます。一方、半値角が18度より狭い場合は計算上アンテナゲインを高くできそうですが、上限の付加は10dBのため12.14dBi以上のアンテナは利用できません。

話が長くなるので、2.4GHzの残りについては次回に説明します。
学習歴5カ月目で名刺アプリのDB設計に挑戦してみた【React × TypeScript × Supabase】

## はじめに
初めまして、UX/UIデザイナーとして活動しているKikoといいます。
デザインエンジニアになることを目標に今年の1月からReactの勉強を始めました！

自分の簡単な自己紹介はこちら👇

https://qiita.com/kikotkk/items/b702b6c3a227690eeec6


## 何を作ったのか
TypeScriptで開発する名刺アプリをテーマに、フロントエンドとバックエンドの構築に取り組みました。

### 概要
前回の課題からアップグレードし、DBの設計にがっつり取り組みました。

簡単な画面構成はこんな感じです
![スクリーンショット 2025-04-25 18.17.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3977506/1e6bc802-384d-46e2-9e6c-eea08965a22e.png)

### mockup
バリデーションが出たり、実際に登録後は個人データにアクセスできる仕組みを実装しました。

![画面収録-2025-05-10-14.39.39-_1_.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3977506/6edf9645-1ac9-4855-a65d-0654817ba535.gif)



## 開発環境・技術スタック

* フロントエンド：React(React hook form、React Router）、TypeScript
* バックエンド：Supabase
* デプロイ：Firebase Hosting
* CI/CD：GitHub Actions
* ライブラリ: chakraUI v2
* 環境構築（Vite）
* テスト：Jest


## 一番苦戦したところ
今回一番苦戦したのは、DB周りの設計や概念の理解でした。

デザイナーとしてUIをFigmaで作る経験から、コンポーネント化の概念は比較的掴みやすかったです。

しかしテーブル同士を接着する中間テーブルの概念がなかなか捉えられず、かなり悩みました。

「なぜ一つのテーブルにまとめないのか？」「そもそもDBとは何か？」という根本的な疑問からスタートし、初めてデータベースの概念に触れる機会となりました。
最終的にはFigJamで図解しながらデータの紐付けを整理し、時間をかけて理解を深めていきました。

![スクリーンショット 2025-04-18 15.45.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3977506/2841f18f-4513-434c-aa1b-fa65bd3ff98c.png)

## 楽しいと思えたところ
React Hook FormやReact Routerの便利さを実感しました。
特に、バリデーションや画面遷移の処理がシンプルかつ合理的に設計できるため、開発効率が大きく向上しました。
日頃figmaでUIを作る上でvariable（今回のアップデートでもう滅びましたが）等のstate管理の理解が実際に実装してみることでグッと深まりました。


## NEXT STEP

次の課題でいよいよ自分のアプリを個人開発で作ることになります。
作って終わりではなく、きちんと運用保守する価値のあるようなものを作れたらいいなと思います✊
PythonでAtCoderのA問題完答

はじめまして。AtCoderでの成績記録や、競技プログラミングで役立った実装・テクニックをまとめていく予定です。主にPythonで解いていますが、アルゴリズムや考え方の部分が参考になれば嬉しいです。自分の復習用も兼ねていますが、誰かの助けになれば幸いです！

### 現在の成績
早速ですがついにA問題を完答しました！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1334049/47d3280e-f115-4b64-99e1-27f340b445a2.jpeg" width="400">

次は、B問題！と意気込んでいますが、先が長い...
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1334049/34bda36a-9a90-4b09-982c-71a26a6c259b.png" width="400">
というわけで、学んだことの整理やモチベを保つために投稿を始めることにしました！

### 今まで学んだこと

#### 入力

二文字
```python
x,y=map(int,input().split())
```


リスト
```python
a=list(map(int,input().split()))
```

二次元リスト
```python
a=[list(input()) for i in range(n)]

a = [[int(x) for x in input().split()] for i in range(n)]

a = [list(map(int,input().split())) for i in range(n)]
```

#### 計算


    x + y    x と y の和
    x - y    x と y の差
    x * y    x と y の積
    x / y    x と y の商
    x // y   x と y の商を切り下げたもの
    x % y    x / y の剰余
    -x       x の符号反転
    +x       x そのまま
    x ** y   x の y 乗

    math
    
    sqrt   平方根
    floor　小数点以下を切り捨て
    ceil　 小数点以下を切り上げ

#### リストの各要素の出現個数をカウント


    import collections

    l = ['a', 'a', 'a', 'a', 'b', 'c', 'c']
    
    c = collections.Counter(l)
    print(c)
    # Counter({'a': 4, 'c': 2, 'b': 1})
    
    print(c['a'])
    # 4
    
    print(c.keys())
    # dict_keys(['a', 'b', 'c'])
    
    print(c.values())
    # dict_values([4, 1, 2])
    
    print(c.items())
    # dict_items([('a', 4), ('b', 1), ('c', 2)])

    print(c.most_common())
    # [('a', 4), ('c', 2), ('b', 1)]

    print(c.most_common()[0])
    # ('a', 4)
    
    print(c.most_common()[0][0])
    # a

    print(c.most_common(2))
    # [('a', 4), ('c', 2)]

#### 文字とUnicode値を変換する関数

    # 文字をUnicodeポイントに変換
    print(ord('a'))
    # 97

    # Unicode値を文字列に変換
    print(chr(97))
    # a
【用語解説】可視光カメラをサクッと抑える。

### ずばり・・・
人間の目で見える光を利用して画像や映像を記録するカメラ。
可視光の波長範囲は約400～700ナノメートル。

**光の検出：**可視光カメラは、レンズを通して入射した可視光をイメージセンサで電気信号に変換し、画像や映像として記録する。
**色の再現：**RGB(赤・緑・青)の3原色を組み合わせる事で自然な色彩を再現。
**光量の依存：**十分な光がないと、鮮明な画像を得ることが難しく、暗所では補助光（フラッシュなど）が必要になる。

スマホのカメラ、デジタルカメラで使われてるよ。

### 参考文献（2025年5月12日）

https://ken-enjoybusiness.com/visible-light-camera/

https://www.greelane.com/ja/%E7%A7%91%E5%AD%A6%E6%8A%80%E8%A1%93%E6%95%B0%E5%AD%A6/%E7%A7%91%E5%AD%A6/definition-of-visible-light-605941


https://www.infinitioptics.com/glossary/visible-imaging-sensor-400700nm-colour-cameras
コンピュータサイエンス学び直し - 「再帰関数」について -


# 1. はじめに

エンジニアとして 3 年が経過しようとしている中、技術を使ってより高度な問題解決をしていくためには、フレームワークや言語に依存しない基礎となる知識が必要だと感じたため、CS を勉強し直しています。
その学習内容を備忘録として発信します。
今回は「**再帰関数**」についてです。

# 2. 話の進め方

本記事では、「**再帰関数とは何か**」、「**再帰関数はなぜ必要なのか**」、「**再帰関数の使い方と注意点**」という順番で解説を進めます。
尚、サンプルのコードには Ruby を使用します。

# 3. 再帰関数とは

再帰関数とは、**自分自身を呼び出すことによって処理を繰り返す関数**のことです。この「**自分自身を呼び出す**」という考え方を、コンピュータサイエンスでは「**再帰的（recursive）**」と表現します。

「再帰的（recursive）」という言葉は、ラテン語の “recurrere”（「繰り返し戻る」の意）に由来し、同じ構造を内包する構造を指します。これは、数学や哲学でも使われる概念で、「定義の中にその定義自身が現れる」という自己参照的な特徴を持ちます。

:::note info
英語圏のコンピュータサイエンスの文献では、再帰関数は次のように定義されることが一般的です。

> “A recursive function is a function that calls itself either directly or indirectly in order to solve a > problem by breaking it down into simpler sub-problems.”

>（訳：「再帰関数とは、自分自身を直接または間接的に呼び出すことで、問題をより単純な部分問題に分割して解決する関数のことである。」）
:::

このように、再帰関数は単なる自己呼び出しにとどまらず、「**問題を部分的に解いて全体の解を導く**」というアルゴリズム的な意義を持っています。

# 4. 再帰関数はなぜ必要か

## 4-1. コードの可読性という観点

再帰関数を使うと、複雑な繰り返し処理や分岐処理をシンプルで直感的な形で記述できます。たとえば、木構造や階層構造を扱う処理では、再帰によってコードの見通しが良くなります。

## 4-2. コードの保守性という観点

再帰は処理の本質的なロジックを簡潔に表現できるため、将来的な修正や拡張がしやすくなります。ループ処理で書かれた冗長なコードと比べて、意図が明確になり、バグの温床が減ります。

## 4-3. コンピュータのパフォーマンスという観点

場合によっては、再帰を利用することで計算量を抑えた効率的なアルゴリズムを実装できます（例：分割統治法）。ただし、関数呼び出しのコストがかかるため、常にパフォーマンスが向上するとは限りません。

# 5. 再帰関数の使い所

## 5-1. 階層構造を扱うとき

ツリー構造（例：ファイルシステム、組織図、HTML DOM など）を扱うときには、再帰関数が非常に適しています。ノードを辿って同じ処理を繰り返すような場面では、再帰を使うことで簡潔な実装が可能です。

## 5-2. 同じ処理を繰り返しながら、状態を変化させたいとき

たとえば、「ある数値を1ずつ減らしながら処理したい」「配列の先頭から順に処理をしたい」といった場面で、状態（引数）を変化させながら自己呼び出しする再帰は自然な形になります。

## 5-3. 問題を小さな部分問題に分解できるとき

ソートアルゴリズム（クイックソート、マージソート）や探索（分割統治、バックトラッキング）のように、全体の問題を部分的に分割して解決していくタイプの問題に再帰がよく使われます。

## 5-4. 繰り返し処理の中で条件分岐が多くなるとき

ループ処理で条件分岐が複雑になりすぎる場合、再帰によって処理を分解・整理することで、可読性の高いコードになります。特に状態遷移が明確な処理（例：パズル解法、迷路探索）で役立ちます。

# 6. 再帰関数の具体的な使い方と注意点

再帰関数を使うには、「**終了条件（ベースケース）**」と「**再帰呼び出し（再帰ステップ）**」の2つが必要です。以下は、階乗（factorial）の例です。

## 6-1. 基本的な使い方

``` ruby

def factorial(n)
  if n == 0 # 終了条件（ベースケース）
    return 1
  else
    return n * factorial(n - 1)  # 再帰呼び出し（再帰ステップ）
  end
end

```
factorial(3) を呼び出すと、
```
factorial(3) = 3 * factorial(2)
             = 3 * 2 * factorial(1)
             = 3 * 2 * 1 * factorial(0)
             = 3 * 2 * 1 * 1
             = 6
```
のように再帰的に処理が行われ、最終的な結果を導き出します。

## 6-2. 使うときの注意点

### 6-2-1. 終了条件を必ず設定すること

終了条件がないと、無限ループになり、スタックオーバーフロー（メモリの限界）を引き起こします。

### 6-2-2. スタックの深さに注意

言語によっては、関数呼び出しの深さに制限があります。深い再帰を多用する場合は、末尾再帰を使用したり、ループやスタック構造を使った非再帰的実装を検討しましょう。

### 6-2-3. パフォーマンスの最適化

同じ計算を何度も繰り返す再帰は非効率です。メモ化（結果のキャッシュ）や動的計画法を併用すると、計算効率を大きく改善できます。

# 7. まとめ

再帰関数は、**自己参照を通じて複雑な問題をシンプルに解決する強力な手法**です。特に、階層構造や繰り返し構造の問題に対して高い表現力を持ちます。ただし、**使い方を誤るとパフォーマンスや安全性に悪影響があるため、終了条件と最適化を意識して使うことが重要**です。
vscodeが勝手に.envを読み込むの何とかしてほしい

workspaceに.envファイルが置いていあるpythonのプロジェクトをvscode開き、ctrl + shift + @でterminalを立ち上げると勝手に.envを読み込みます。しかも:をエスケープして。

なので、.envに

```
DB_PATH=sqlite:///sqlite.db
```

とかって書いてると、勝手にDB_PATHにsqlite\xa///sqlite.dbが設定され、terminalでコマンド実行に影響を及ぼします。

## 対策: settings.jsonでpythonのextensionの設定を変える

設定画面からPython: Env Fileの項目を編集するか、settings.jsonを編集するかでpython.envFileを空にします。

![pic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2109677/7357b2d4-109d-4c21-a209-8ae87ae3def1.png)

![pic2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2109677/7f0eef01-2f81-4fbb-87d5-759f5282f7e1.png)

デフォルトでこういう設定になってるっていうことは何らかの理由があってのことだと思いますが、ターミナル起動時に.envが自動で読み込まれないと困るっていう状況が想像つかないです。
せめて、勝手にエスケープしないでほしい。
RSpecでバリデーションを無視したい

Rails 開発で RSpec を使用していると、Factorybot等で作成したオブジェクトやカラムに対してのバリデーションを一時的に無視したい時が現れます。
たとえばどういう時かというと、バリデーションを設定したときに、

- 外部依存のAPIから取得すべき必須パラメータがまだモックできていない 
- CSV取り込み用の途中データをテストしたい

というときに、テストケースが全て落ちてしまいますよね。
そのようなときにうまくいった方法を書きます。

## `skip_callback` を使用する

特定のバリデーションが、`before_validation`で設定されていた場合、`skip_callback`を使用することで、バリデーションを一部スキップすることが可能です。
簡単なコードで表すと、
```ruby
class Order < ApplicationRecord
  before_validation :validate_external_status

  private

  def validate_external_status
    # 外部APIでのステータス検証
    ExternalService.check(status_code)
  end
end
```
というモデルがあったとして、
```ruby
RSpec.describe "Order" do
  let(:order) { build(:order, status_code: "PENDING") }

  context "外部ステータス検証をスキップしたいとき" do
    before do
      # validate_external_status コールバックだけを無効化
      Order.skip_callback(:validate, :before, :validate_external_status)
    end

    after do
      # コールバックを復元
      Order.set_callback(:validate, :before, :validate_external_status)
    end

    it "バリデーションなしで保存できる" do
      expect(order.save).to be true # passed
    end
  end
end
```
という具合に使用します。
他のテストへの影響を最小限にするため、テスト後に**必ず `set_callback` で元へ戻す**ことで、一部のバリデーションをスキップし、他は通常通りテストを行うようにします。

## FactoryBotの trait やオプションでバリデーションをスキップ

FactoryBot の`trait`や`to_create`オプションを組み合わせると、テスト用のファクトリでのみ `save(validate: false)`を実行するようにカスタマイズできます。

基本構文は、
```ruby
trait :skip_validations do
  to_create { |instance| instance.save(validate: false) }
end
```
です。
name と email が必要な User モデルがある前提で使用してみると、
```ruby
FactoryBot.define do
  factory :user do
    name { "ohtani" }
    email { "invalid_email" }  # 本来は format: のバリデーションがあると仮定

    trait :skip_validations do
      to_create { |user| user.save(validate: false) }
    end
  end
end
```
という感じになります。

:::note info
この時点では何が起こるのかというと、
- `factory :user`のデフォルト生成では通常どおりバリデーションが働く
- `create(:user, :skip_validations)`とするとバリデーションを飛ばして保存される
:::

実際のテストでは、
```ruby
RSpec.describe "User" do
  let(:skipped_user) { create(:user, :skip_validations) } # バリデーションスキップ

  context "skip_validations" do
    it "persists the record without running validations" do
      expect(skipped_user).to be_persisted # passed
    end
  end
end
```
というふうに使えます。



## `save(validate: false)` を使う
Rails の標準メソッド `save(validate: false)` は、モデルに定義された **すべての** バリデーションと関連コールバックをスキップしてレコードを保存します。

```ruby
RSpec.describe "User" do
  let(:user) { User.new(email: "hogehogedaze") }  # 不正なメールフォーマット

  context "skip validation" do
    before { user.save(validate: false) }

    it "persists the record even with invalid email" do
      expect(user).to be_persisted
    end
  end
end
```
:::note warn
この方法は、Rails ガイドにも書いてあるように、`save(validate: false)`は非常に注意して使用する必要があります。

なぜなら、この方法は、すべてのバリデーションを無視することになるためです。DB制約以外は何も担保してくれません。
結果としてテストのデータの整合性が保たれない不十分なものになってしまいます。そのため、注意して使う必要があります。
:::

## 最後に
テストの開発効率を高めるためにバリデーションを一時的にスキップするテクニックは便利ですが、「本番コードを汚さない」「テストの意図を明確化する」ことが重要です。ぜひ、今回の事例を参考にしてみてください！
文字列の書き換え

Paizaの「指定位置の文字を置換」問題で、またインデックスの罠にやられました(´;ω;｀)　今回は文字列の書き換えの問題について解説！

<br>

## 問題概要

文字列 `S`、整数 `i`（位置）、文字 `c` が与えられる

`S` の `i`文字目 を `c` に置き換えて出力せよ

入力例:

    ABCDEFGHIJKLMNOPQRSTUVW&XYZ
    16 !

出力例:

    ABCDEFGHIJKLMNO!QRSTUVW&XYZ

<Br>

https://paiza.jp/works/mondai/string_primer/normal_step3

<br><br>

## NGコード：ズレ
```js
const rl  = require('readline').createInterface({input:process.stdin});
const lines = [];


rl.on('line', input => lines.push(input));
rl.on('close',()=>{
    const S = lines[0];
    const [i,c] = lines[1].split(' ');
    
    const result = S.slice(0,Number(i)) + c + S.slice(Number(i)+1);
    
    console.log(result);
});
```

🔻 `i` は 1-based（1文字目が1）なのに、JavaScriptの `.slice()` は 0-based。
つまり「1引く」必要あり！

<br>

## ✅ OKコード：ズレ補正
```js
const index = Number(i) - 1;
const result = S.slice(0, index) + c + S.slice(index + 1);
```
🔧 `.slice()`は [start, end) の半開区間。end は含まないので `index + 1` を使う。

<br>

### ✅ 配列化アプローチ：さらに読みやすく
```js
const chars = S.split('');
chars[index] = c;
console.log(chars.join(''));
```
- `.split('')` → 配列に

- `chars[index] = c` → 置換

- `.join('')` → 再び文字列に

👉 直感的！文字列の書き換えには実はこっちの方が見やすくて安全かも。

<br>

## 💡 技術メモまとめ

- JSのインデックスは 0-based、でも入力が 1-based なら `-1` する
- `.slice(start, end)` の end は含まれない（＝半開区間）
- `.split()` → `.join()` の編集パターンは、柔軟かつ安全


<br><Br><br> [僕の失敗談(´;ω;｀)と解決法🐈](https://paizabeginner.wordpress.com/2025/05/12/paiza%e3%81%a7%e5%9f%ba%e6%9c%ac%e3%83%9e%e3%82%b9%e3%82%bf%e3%83%bc%ef%bc%9a%e6%96%87%e5%ad%97%e5%88%97%e3%81%ae%e6%9b%b8%e3%81%8d%e6%8f%9b%e3%81%88/)
Githubコンフリクトで解決できた記事（随時更新）

# .gitignore関係
https://shuhey-hashimoto.com/xcode/%E3%80%90xcode%E3%80%91userinterfacestate-xcuserstate%E3%81%A3%E3%81%A6%E3%81%AA%E3%81%AB%EF%BC%9F%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E3%81%97%E3%81%A6%E3%81%84%E3%81%84%E3%81%AE%EF%BC%9F/
【メモ】Pythonで正の小数を四捨五入して整数に

どうもこんにちは！

round()関数を使って四捨五入して整数に、本当にそれでよかったのでしょうか、という話です。
タイトルで察した方もいらっしゃると思いますしWebで検索したらもろもろ出てくる話ですが、自分はAtcoderではまだ小数を使ってないこともあり把握していませんでした。
自分が忘れないように整理します。

# 起きたことと調べてわかったこと
某所のスキルチェック問題で、round関数を使って小数第一位を四捨五入して整数にしたところ誤答が発生。テストケースの詳細は不明ですが、例えば2.5をround関数で丸めると2となることがわかりました。
(ちなみに3.5をround関数で丸めると4となるため、x+0.5の丸めが必ずx(つまり切り捨て)になるわけでもありません)

# 四捨五入するには
## 計算でおこなう
小数第一位が0.5以上なら2倍したら整数の1桁目が+1されるので、以下の式で四捨五入できます。ただ、後述の関数を使う方が無難とのこと。丸めとかで0.5以上でも1桁目が+1されないケースもあるんでしょうか。あと負の数には使えません。
~~~Python
int((x*2+1) // 2)
~~~

## Decimal関数を使う
decimalモジュールに含まれるDecimal関数を使うと10進数の浮動小数点の演算ができます。(モジュール名はdecimal、関数はDecimalです)
以下が変数xを四捨五入して整数にする例。主なポイントはコメントで入れました。
~~~Python
from decimal import *
Decimal(str(x)).quantize(Decimal('0'), ROUND_HALF_UP)

# Decimal(str(x)) で変数をstr型にしてDecimal型に変換
# Decimal().quantize()でDecimal()の値を四捨五入。
#  整数で四捨五入の場合はquantize(Decimal('0'),ROUND_HALF_UP)
# quantizeの引数のうち、Decimal('0')で出力する値の桁数。例えば'0.1'だと小数第一位で出力。
# ROUND_HALF_UPは丸め方の指定。この場合は一般的な四捨五入。
#  ROUND_HALF_DOWNにすると、0.5以下が切り捨てになる(0.51とかは切り上げ)
~~~

ではでは。

# 参考にしたサイトなど

https://note.nkmk.me/python-round-decimal-quantize/

https://docs.python.org/ja/3.13/library/decimal.html
【Salesforce認定ServiceCloudコンサルタント】やったこと

## この記事は
筆者が、2025年5月にSalesforce認定ServiceCloudコンサルタントを取得した際に使用した教材などのまとめです。

### 筆者のスペック
+ SE3年目
+ Salesforce実務未経験
+ これまでに認定アドミニストレーター、認定Platformデベロッパー、認定Platformアプリケーションビルダー、上級アドミニストレーターを取得
    + [【Salesforce認定アドミニストレーター】やったこと](https://qiita.com/shi-mashimashima/items/9217fa657897538b571f)
    + [【Salesforce認定Platformデベロッパー】やったこと](https://qiita.com/shi-mashimashima/items/d3f86fe1b6468b3a68c8)
    + [【Salesforce認定Platformアプリケーションビルダー】やったこと](https://qiita.com/shi-mashimashima/items/ad663a388592a0e01337)
    + [【Salesforce認定上級アドミニストレーター】やったこと](https://qiita.com/shi-mashimashima/items/edd5932dffd7607622fc)
    + [【Salesforce認定SalesCloudコンサルタント】やったこと](https://qiita.com/shi-mashimashima/items/6d8883b995de90671f19)

### 認定ServCloudコンサルタント資格概要
#### 試験の詳細
+ 多肢選択式の60問
+ 試験時間は105分
+ 合格点は67%
+ 受験料は30,000円（税抜）

#### 試験概要
+ 業種の知識: 12%
+ 実装戦略: 14%
+ Service Cloud ソリューション設計: 20%
+ ナレッジ管理: 8%
+ 受け入れとインタラクションチャネル: 15%
+ ケース管理: 18%
+ コンタクトセンター分析: 8%
+ インテグレーション: 5%

## 勉強の流れ
だいたい2週間くらいで取り組みました。

### Trailmix
認定資格用のTrailmixをこなしていきました。
ヘルプがメインだったので、内容を読んでメモにまとめる、を繰り返していきました。

https://trailhead.salesforce.com/ja/users/strailhead/trailmixes/prepare-for-your-salesforce-service-cloud-consultant-credential

【参考】メモはこんな感じでまとめてました。
<details>
  <summary>展開</summary>
  
```
### リリース 
+ リリースの流れ
    + 計画→準備→テスト→実行→検証 

+ リリース手順
    + Sandboxで新しいアプリケーションを設定 
    + Sandboxでテスト実行 
    + 変更セット作成 
    + 本番に適用 

+ ベストプラクティス 
    + 追加・変更になる機能について、全社員（ユーザー）に事前にアナウンスしておく 
    + リリース作業時間中に本番実環境への設定変更作業をしないよう周知する 
    + ApexやVisualforceのユニットテストのコードカバー率が75％以上になるようにする 
    + sandbox環境からステージング環境（本番環境と同様の環境だが不具合発見やリリーステスト用に用いる）でうまくリリースができるか事前に確認する 

+ データインポート時の注意 
    + インポート前に重複データは排除 
    + Salesforceのデータ型に一致するようすべての行を標準化 
    + インポート後、重複ルール・一致ルールによる重複管理を実施 
```
</details>

### 問題演習
問題集を周回していきます。
+ 1周目：初見の用語を先ほどのメモに追加しつつ解く
+ 2周目：復習しつつ解く
+ 3周目～：わからなかった問題をメインに解く

という流れで進めていきました。進捗は過去の試験と同様、スプレッドシートにまとめました。→ [参考](https://qiita.com/shi-mashimashima/items/6d8883b995de90671f19)

#### 使った問題集
##### note「Salesforce認定ServiceCloudコンサルタントPACK」
https://note.com/salesforce777/m/mbe1ac7203c34

有料。正答の画像入り解説付き。
3択形式になった2025年版にも対応しています。

##### JPN試験過去問
無料。noteの問題集の後に取り組み、日付が最新になっている二つを解きました。
noteの問題集と答えが食い違っている問題がありましたが、AIに問題を投げてみたり検索して複数サイトの解答を見比べてみたりして自分なりに正解と思う選択肢を選ぶようにしました。

+ 全79問

https://www.jpnshiken.com/shiken/Salesforce.Service-Cloud-Consultant-JPN.v2024-05-10.q79.html

+ 全104問

https://www.jpnshiken.com/shiken/Salesforce.Service-Cloud-Consultant-JPN.v2024-03-25.q104.html

## 受験
### 試験会場
+ オンサイト受験しました。
### 試験内容
+ 回答10分+見直し20分、の30分ほどで終わりました。
+ 過去問と同様の問題が多々出ました。問題集をしっかり周回していれば大丈夫そう。
+ 参考：得点率
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3978744/dc93d606-7644-48f3-a2ac-8a0db84f904b.png)

## 終わりに
+ 標準機能メインで勉強していましたが、開発の知識が全然ないので、次回は上級デベロッパーにチャレンジしようかなと思っています。引き続きがんばります。
Geminiでタンバリンを使う魔法少女を描いてみた。

# 概要

Geminiでタンバリンを使う魔法少女を描いてみました。

# 実装

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

```
光のタンバリンを使う魔法少女を描いてください。
```

![光のタンバリンを使う魔法少女_20250512.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/86460a79-66b9-49bf-b66f-ef18e4108ddf.png)


```
闇のタンバリンを使う魔法少女を描いてください。
```

![闇のタンバリンを使う魔法少女_20250512.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/a95d18de-19ee-4e87-b3ca-e3f4e6beb891.png)


```
聖なるタンバリンを使う魔法少女を描いてください。
```

![聖なるタンバリンを使う魔法少女_20250512.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/4d81050a-0b59-48e0-bf07-0af465d5b61f.png)

# まとめ

光の子と聖の子は可愛い。
何かの役に立てばと。
RAGを超えて：動的AIにおけるMCPサーバの持続的な役割

急速に進化する人工知能（AI）の分野では、新しい頭字語や概念が次々と登場します。あなたはおそらく、RAG（Retrieval Augmented Generation）という、巨大言語モデル（LLM）が特定の情報にアクセスし活用する方法を革命的に変える強力な技術について聞いたことがあるでしょう。しかし、もう一つの同様に重要なプレイヤーが注目を集めています。それがMCP（Model-Context-Protocol）サーバです。一部では、これを「AIツールのUSB-C」ともささやき、標準化されたプラグアンドプレイのインタラクションの未来を示唆しています。 ここで疑問が湧いてきます：RAGがデータベースをベクトル化してコンテキストを取得できるのに、なぜLLMがMCPサーバを使ってコンテキストを要求する必要があるのでしょうか？ その答えは、インタラクションのタイミングと性質にあります。RAGは、LLMが応答を作成し始める前に関連する背景知識を提供するのに優れていますが、MCPは生成プロセス中に外部システムと動的にインタラクトする能力をLLMに与えます。これを、シェフに最初にすべての材料を渡す（RAG）と、レシピの途中で特定のスパイスや新鮮な材料を呼び出すことができるようにする（MCP）違いと考えることができます。これにより、はるかに広範なツールやリアルタイムの情報が利用可能になります。

MCPの活用例を描いてみましょう

例えば、あなたがAIに「今四半期の販売量トップ5の製品は何ですか？最近そのいずれかに顧客からのクレームや問題が報告されましたか？」と質問したとします。 これは単純な検索ではありません。複数のステップを要する調査が必要です： 

1. AIの解析：LLMはまずあなたの質問を解析します。販売データ（おそらく製品データベースから）と顧客フィードバック（クレームやサポートチケットシステムから）の2つの異なる情報が必要であることを認識します。 
2. 最初の専門家（製品DB）への呼びかけ：AIは、製品データベースが販売データの主要なソースであると特定します。MCPクライアントを介してリクエストを作成します。これは次のように見えるかもしれません：getTopProducts(by="sales_volume", period="2025-01-01 - 2025-03-31", limit=5)。 
3. MCPサーバの働き：このリクエストは指定されたDB関連のMCPサーバに送信されます。このサーバは熟練した通訳のように機能します。標準化されたMCPコールを受け取り、実際の製品データベースが必要とする特定のクエリ言語やAPIコールに変換します。 
4. データの取得とフォーマット：MCPサーバはデータベースからデータを取得し、それをAIが容易に理解できるように構造化された形式、通常はJSONにフォーマットします。 
5. データの配送：サーバはこの整理された製品データのパッケージをAIクライアントに送信します。 
6. 動的コンテキスト注入：AIクライアントはトップ5の製品を取得し、この新しいデータをLLMにフィードバックして、回答の生成に影響を与えるアクティブなコンテキストの一部とします。 
7. 次の調査（クレームDB）：トップ製品が特定された後、AIは類似のMCPコールレスポンスパターンを別のMCPサーバ（顧客クレーム/問題データベースに接続されたもの）と実行し、これらの特定の製品に関連する最近の報告を確認するかもしれません。 


この一連のプロセスを通じて、AIクライアントはオーケストレーターとして機能し、一つのツールからの出力（製品リスト）を次のツール（クレーム検索）の入力としてインテリジェントに使用します。最終的に、必要なすべてのピースを動的に集め、包括的な回答を構成します。

MCPの導入：課題と考慮事項 MCPサーバの潜在能力は大きいですが、プロジェクトに導入する際にはいくつかの考慮事項があります。
これらは障害になるわけではありませんが、慎重な評価が必要です： 
1. 運用上の負荷：異なるツールやデータソース用に追加のMCPサーバを運用することは、展開、監視、および稼働時間の維持において運用上の努力を増加させます。 
2. ステートレス性とスケーラビリティ：これらのMCPサーバをステートレスに設計する方法は？これは、容易な水平スケーリングと効果的な負荷分散のために重要であり、需要の変動に対応できるようにするためです。 
3. 標準化と選択：多くのオープンソースコミュニティやベンダーがMCPのようなサーバを開発する可能性がある中で、どれを作成、採用、または維持するかを定義する方法は？明確な基準を確立することが重要です。 
4. 急速な進化：MCPサーバのコンセプトは比較的新しく、日々進化しています。これには、新しい変更、プロトコル、およびベストプラクティスに素早く適応する必要があります。 
5. セキュリティとガードレール：これらのサーバはリクエストと潜在的に機密性の高いデータを取り扱います。認証（トークン/キー）と認可を含む強固なセキュリティ対策が重要です。 
6. ガバナンスとコントロール：MCPサーバのインタラクションをどのようにガバナンスするか？特定のデータに対してREAD操作のみを許可し、CREATE、UPDATE、DELETEを禁止するポリシーを強制するゲートウェイの実装や定期的な脆弱性スキャンの実施が重要です。 
7. 信頼の重要なテスト：おそらく最も重要な考慮事項はテストです。厳格な精度テストは根本的に重要です。MCPサーバがデータを取得できるかどうかだけでなく、AIモデルが以下に適しているかどうかも問われます： 
    a. これらのツールを使うタイミングを知っているか 
    b. タスクに適したツールを選んでいるか
    c. ツールの出力を適切に意思決定に活用しているか
    
    綿密なテストがなければ、誤用のリスクがあります。AIはツールに過度に依存したり、誤ったツール使用したり、最も必要なときにツールを使用しない可能性があります。精度テストはAI操作の整合性有効性を保護します。

RAGとMCPの持続的なパートナーシップ 

MCPサーバはRAGを置き換えるためにあるのではなく、補完するためにあります。RAGは基礎的な事前ロードされた知識ベースを提供し、MCPは動的でオンザフライのツールキットを提供します。両者が一体となることで、LLMは知識が豊富なだけでなく、リソースフルでインタラクティブになり、リアルタイムで世界のデータと連携する複雑で多面的なクエリに対応できるようになります。今後、MCPの慎重な統合が、より洗練された、真に役立つAIアプリケーションの鍵となるでしょう。
初心者歓迎！機械学習の開発環境に迷ったらこれ！Poetry × Hydra × W&B × PyTorchで始めるMLライフ

# 1. はじめに
このシリーズでは，Pythonを使った機械学習（特に深層学習）の **環境構築** と **効率化** について紹介します．  
「初めてだけどチャレンジしてみたい！」「もっと効率よく研究がしたい！」という方に向けて，筆者が実際に使ってみて「最強だ」と感じた構成をまとめました． **わかりやすさ重視** で細かく説明していきますので，初学者もぜひ御覧ください．

なお，筆者自身もまだまだ勉強中＆この記事が初投稿です！  
お気づきの点があれば，ぜひコメントなどでご指摘いただけると嬉しいです 🙏

# 2. 対象読者
こんな人におすすめ：
- 機械学習の理論はある程度わかるけど、**実装環境の構築がよくわからない人**
- Pythonで機械学習をしていて、**もっと開発を効率化したい人**
- Pythonのバージョンやパッケージが**ごちゃごちゃで困っている人**

# 3. このシリーズで得られること  
- Pythonの**バージョン・パッケージ管理が楽になる**
- モデルの**パラメータ管理・可視化・ログ記録がスムーズ**に
- 再利用しやすいテンプレートで、**すぐに開発に集中できる環境**を手に入れられる 

# 4. 扱うツールをざっくりと紹介

| ツール | 説明 |
|--------|------|
| [WSL2](https://learn.microsoft.com/ja-jp/windows/wsl/) | WindowsでもLinux環境を使えるようにする仕組み |
| [pyenv](https://github.com/pyenv/pyenv) | Pythonのバージョンを柔軟に切り替え管理できるツール |
| [Poetry](https://python-poetry.org/) | パッケージ・仮想環境の管理を一括で行えるモダンなツール |
| [PyTorch](https://pytorch.org/) | 機械学習（深層学習）ライブラリ |
| [Hydra](https://github.com/facebookresearch/hydra) | パラメータや設定の管理を柔軟に行えるライブラリ |
| [W&B](https://wandb.ai/site) | 実験のログ記録・可視化・比較などを支援する便利ツール |


# 5. 最強環境のイメージ図
ざっくりと！こういうイメージの環境を作ります．  
- `Project A`：今回構築する環境の具体例．  
- `Project B`：「pyenv × poetry を使えばこんなふうに別の仮想環境も簡単に作れるよ！」という一例にすぎません（実際にこの B の中身を使うわけではありません）.  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077793/6e0b287f-a489-4396-827c-98467866fd08.png)
図の下部には，この環境で使用される各ツールの役割や流れも凡例として示しています．
初学者の方でも「何を，なんのために使うのか」がパッと掴めるようになっています 💡

# 6. 記事構成（予定）

- 【第0回】初心者歓迎！機械学習の開発環境に迷ったらこれ！Poetry × Hydra × W&B × PyTorchで始めるMLライフ（⬅️ **この記事** ）
- [【第1回】WindowsとLinux両方使うならWSL2を使え！ (初心者歓迎)](https://qiita.com/gajitaku/items/8a9fbbf53e9ad2809717)
- [【第2回】pyenv × PoetryでPythonのパッケージ管理を効率化！（Windows / Linux 両対応・初心者歓迎）](https://qiita.com/gajitaku/items/c50b945725fcf8d75bb8)
- 【第3回】PyTorchを使った初めてのディープラーニング体験！(初心者歓迎)
- 【第4回】ごちゃごちゃファイルとはサヨナラ！Hydraでパラメータ管理（Python 機械学習・初心者歓迎）
- 【第5回】神ツールW&Bで訓練の可視化・比較・ログ化が一瞬（Python 機械学習・初心者歓迎）
- 【第6回】Hydra × W&B × PyTorchテンプレ作ったから使ってほしい（Python 機械学習・初心者歓迎）

# 7. おわりに
このシリーズでは，再現性・効率性を重視した機械学習の開発環境を構築していきます．
初めて取り組む方も，すでに経験のある方も，それぞれのレベルに応じて使える内容を目指しています．

基本的には **第1回から順番に読み進めてもらうのがおすすめ** ですが，「もう知ってる！」という部分は **どんどん飛ばして** もらって構いません！

あなたの研究や開発が，より快適で楽しいものになりますように！
それでは，次回からさっそく構築を始めていきましょう．
- [【第1回】WindowsとLinux両方使うならWSL2を使え！ (初心者歓迎)](https://qiita.com/gajitaku/items/8a9fbbf53e9ad2809717)
【備忘録】ローカルでは通るのにVercelでビルドエラー？ Gitの大文字・小文字変更の罠

## はじめに

Next.js × TypeScript で開発中のアプリを Vercel にデプロイしようとしたところ、ローカル（Windows）ではビルド成功、Vercel では失敗という現象に遭遇しました。

結論から言うと、エラーの原因は Git が大文字・小文字だけのファイル名の変更を検出してくれなかったことでした。

## 発生したエラー

Vercel のデプロイログに以下のようなエラーが出力されていました。

```bash:bash
Module not found: Can't resolve '@/components/header'
```

### 確認したこと

✅ 　ファイル名を間違えていないか（大文字・小文字の違いはないか）
✅ 　 import のパスを間違えていないか
✅ 　ローカル環境ではビルドできている

「合っているはず...」と思いつつ、思い当たることが一つ。
直前にファイル名を大文字から小文字に変更していたことを思い出し、そこが怪しいと考えました。

## 背景と原因

✅ ファイル名を変更したつもりだった

- コンポーネントファイル名 `Header.tsx` を `header.tsx` に変更
- import 文も `@/components/header` に統一

  **しかし...**

❌ Git は変更を検知していなかった

- Windows はデフォルトで大文字・小文字を区別しないファイルシステム（NTFS など）
- Git も「変更なし」と判断して差分を記録せず
  　 ⇒ Vercel（Linux・大文字小文字を区別する環境）では Header.tsx を読み込もうとしてビルドエラーに

## 解決方法

ちゃんとファイル名の変更を Git に認識させる

#### 1. 一旦ファイル名を別名に変更（中間名）

```bash:bash
git mv src/components/Header.tsx src/components/Header_temp.tsx
```

#### 2. 目的の小文字ファイル名に戻す

```bash:bash
git mv src/components/Header_temp.tsx src/components/header.tsx
```

#### 3. コミットしてデプロイ

### 他の選択肢：core.ignorecase を false にする方法（おすすめしない）

Git には core.ignorecase という設定があり、これを false に設定すると
大文字・小文字の違いも厳密に追跡されるようになります。

```bash:bash
git config core.ignorecase false
```

この方法を使えば、`Header.tsx` → `header.tsx` のような変更も Git が認識できるようになりますが、以下の理由から今回は採用しませんでした。

:::note warn
**おすすめしない理由**

- 既に大文字、小文字違いのファイルが存在する場合に競合が発生する可能性がある。
- チーム開発環境で、他のメンバーの Git 設定や OS によって挙動が変わる可能性があり、「自分の環境では動く」状態が発生しやすい。
- ローカルで設定を変更して作業を続けると、意図しない差分が発生する恐れがある。

:::

ちなみに現在の設定は以下コマンドで確認できます。

```bash:bash
git config --get core.ignorecase
```

## まとめ

- Windows では大文字・小文字だけのファイル名変更は Git が無視することがある（ファイル名の変更だけで、内容が変わらなかった場合など）。
- Vercel（Linux）では大文字・小文字を区別するため、ビルドエラーになる。
- 対応策は git mv を使って変更を明示的に伝えること！
- core.ignorecase の変更も一応の方法だが、副作用が多く安全性に欠けるため推奨しない。

---

オブジェクティブグループでは X の投稿も平日毎日行っています！
IT 関連の小ネタや便利技から、日常のアニメ・ゲーム布教なども幅広く投稿してるので、
ご興味のある方は是非フォロー・いいねをお願いします。

https://x.com/obg_ocr
【Python】threadingを用いた並列処理

`threading`は並列処理を行うにあたって用いられる`Python`の標準ライブラリです。当記事ではthreadingを用いた並列処理について簡単に取りまとめました。


## threadingの基本的な使い方
`threading.Thread`を用いることで並列処理を行うことができます。当節では以下サンプルコードをいくつか確認します。


### 引数や返り値がない場合のサンプルコード
実行する関数に引数や返り値がない場合、`threading.Thread`に`target`で関数名を指定することで並列処理を行うことができます。

```python:threading1.py
import threading


def function1():
    for i in range(1000):
        if (i+1)%100==0:
            print(i+1)

def function2():
    for letter in 'abcdefghij':
        print(letter)

# スレッドを作成
thread_1 = threading.Thread(target=function1)
thread_2 = threading.Thread(target=function2)

# スレッドの実行
thread_1.start()
thread_2.start()

# スレッドが終了するのを待つ
thread_1.join()
thread_2.join()
```

・実行結果
```
100
200
300
400
a
b
c
d
500
e
f
g
h
600
i
700
j
800
900
1000
```

実行結果より、`thread_1`と`thread_2`で`function1`と`function2`がそれぞれ並列で実行されていることが確認できます。実行結果の表示順は実行したタイミングによって変わるので何度か確認してみると良いと思います。

また、`threading.Thread`を用いるにあたっては`threading.Thread.start`でスレッドを実行し、`threading.Thread.join`でスレッドが終了するのを待つというのは抑えておくと良いです。
はじめてすぎる ASP.NET / C# 学習メモ①

<br>
仕事上ではじめてASP .NETと C# を触ることになったのでメモがてらの記事第一弾です。<br>

まず勉強方法は以下<br> 
1. 今触ってる業務上のプログラミングコードをなんとなく流し読み
2. 1でよくわからんとなってから、それぞれのファイルと依存関係をなんとなく理解してみる
3. 一番大事な部分そうみたいなファイルをいっこチョイスして中身みてく

みたいな感じで進めてみてる。


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

:::note 
C#の癖/特徴

✅ 型に超うるさい（静的型安全）
    とにかく「型は絶対に決めて！」「ルール守って！」って言ってくる。<br>
    
✅ プロパティ文化
    get; set; が超よく出てくる。
    （get＝読み取り、set＝書き込み）
    できること最初に決めとく的なやり方<br><br>
    
✅ クラス構成が重厚（大企業っぽい）
    インターフェース、抽象クラス、依存性注入、サービス…とにかく分業＆司令塔多め<br>
    
✅ 非同期（async/await）文化
    非同期処理に全振り。タスク（Task）が超重要で、ほとんどのAPIは async。
    DBとのやりとり？やりくり？よく考えなきゃだめ<br>

✅ 属性（アトリビュート）だらけ
    [Something] の山！メタ情報や動作指定が全部「属性」で管理されがち<br>
    
✅ LINQというSQL風の魔法
    配列・リスト操作が Where, Select みたいなSQLチックな書き方でできる<br>

✅ null にめちゃ気をつかう
    null許容型、null合体演算子（??）、nullチェック（?.）など多すぎるくらいある<br>
    
✅ Visual Studio前提の世界
    本来はクロスプラットフォームだけど、開発は Visual Studio で完結する前提が多い<br>
    
✅ NuGetでパッケージ管理
    JavaScriptのnpm、Pythonのpip的なもの。追加ライブラリ前提でコードが多い
    まじでNuGetありき<br>
    
✅ .NETの思想が中にある
    C#だけじゃ完結しない
    ASP.NET / Entity Framework / Dependency Injection など.NET全体と連携する設計になってる
    業務上ではDapper使ったりしている<br>
    
:::


とりあえず **「書くこと多い」** イメージということまでわかった（何もわかっていない）
猿でもわかるAIの倫理・リスクシリーズ 🐵⚠️AI倫理教育の必要性

 

## 「AI倫理教育の必要性」〜“技術だけ”ではもう足りない時代へ〜

---

### 🧩 1. はじめに：AIエンジニアにとって「倫理」とは何か？

「AIエンジニアならコードを書ければOK」——そう思っていませんか？

近年、AIが生成・分類・判断する場面が社会のあらゆる場面に広がる中で、次のような問いが浮かび上がっています：

* このアルゴリズムは誰かを不公平に扱っていないか？
* 出力結果は人を傷つける可能性がないか？
* 利用者のプライバシーを侵害していないか？

**AIが意思決定を代行する今、技術者自身が“倫理的責任”を問われる時代**になっています。

本記事では、「なぜ今、AI倫理教育が必要なのか？」という問いを実務目線から掘り下げ、**教育の在り方・実践方法・注意点**をコードとともに紹介します。

---

### 📚 2. AI倫理とは？そして教育の必要性とは？

#### ■ AI倫理とは

AI倫理とは、以下のような原則を守ることを指します：

* **公平性（Fairness）**：性別・年齢・人種に関係なく公正であること
* **透明性（Transparency）**：判断根拠を説明できること
* **説明可能性（Explainability）**：人が理解可能なロジックを持つこと
* **プライバシー保護（Privacy）**：個人情報を正しく扱うこと
* **責任性（Accountability）**：問題が起きた時の責任所在が明確であること

#### ■ なぜ教育が必要か？

* 実務の中でこれらの原則を意識せずに開発されてしまうケースが多発
* エンジニアが「技術的には可能でも社会的にはNG」な判断をする場面が増加
* 誤用や無自覚な差別により、企業が法的・社会的責任を問われることも

---

### 💻 3. Python実例：倫理チェック付きフィルタリング

ここでは、テキスト生成モデルに「攻撃的・差別的な表現」をフィルタリングする簡単なチェックロジックを実装してみましょう。

#### ✨ シナリオ：生成AIの出力結果をリアルタイムにフィルタリング

```python
import re

# 攻撃的表現の例（実務ではブラックリストやOpenAIのModeration API等を使用）
BLOCK_WORDS = ["バカ", "死ね", "無能", "女のくせに", "黒人", "低能"]

def is_ethical(text):
    for word in BLOCK_WORDS:
        if word in text:
            return False
    return True

# 出力された文章（例）
output_texts = [
    "あなたは無能だ",
    "この製品は素晴らしいです",
    "黒人の役割は少ない",
]

for text in output_texts:
    print(f"{text} → {'OK' if is_ethical(text) else 'NG'}")
```

> ✅ 実務ではさらに精度の高い「コンテンツモデレーションAPI」や、「属性バイアス検知ツール」などと組み合わせて利用します。

---

### 🛠️ 4. 実務Tips：AI倫理教育をどうチームに浸透させるか？

#### ✅ 現場で実践できる教育法

| 方法          | 内容                  | 工数          |
| ----------- | ------------------- | ----------- |
| ランチ勉強会      | 月1でケーススタディを共有       | 2h/月        |
| 倫理レビュー      | コードレビュー時に倫理観点も加える   | +10% effort |
| フェイルケース集    | 「やってはいけない事例集」を社内で共有 | 継続的更新       |
| AI利用チェックリスト | モデル・データ・使用方法の倫理チェック | 導入初期に効果大    |

#### ⚠️ よくある失敗

* 上層部だけが意識して現場に届かない
* 研修が一過性になり「日常の開発」に反映されない
* ルールが堅すぎて現場の創造性が失われる

---

### 🌱 5. 発展：AI倫理と企業文化、そして社会実装

#### ■ AI倫理 × DevOps文化

| 項目    | 旧来        | モダンAI開発       |
| ----- | --------- | ------------- |
| デバッグ  | 機能が動くかどうか | 社会的に問題ないかまで   |
| モデル評価 | 精度が高いか    | バイアスや公平性まで    |
| 成果物   | コード中心     | 説明資料やガイドライン含む |

#### ■ 海外・国内の取り組み例

* **Google**：AI Principlesを開発者にも適用し、透明性を重視
* **欧州委員会**：AI倫理の法制化を進行中（AI Act）
* **日本（経産省）**：AIガバナンスガイドラインを策定

---

### 🧭 6. まとめ：AI時代における“新しい教養”としての倫理

| 観点     | ポイント                      |
| ------ | ------------------------- |
| ✅ 必要性  | AIが判断主体になるからこそ、人間の倫理知識が重要 |
| ⚠️ リスク | 教育不足が差別・誤用・炎上を引き起こす       |
| 💡 展望  | エンジニアリング教育に「倫理」が必須となる未来へ  |

---

## 📌 最後に

「正しく動くAI」だけでは足りません。
これからは「**正しくあってほしいAI**」を作ることが求められます。
倫理教育は、単なる知識ではなく、**エンジニアの武器**です。

明日からでも社内勉強会で「AI倫理」について話してみませんか？

---

📘 **次回予告：「「デジタル奴隷制度」とAI労働問題」**
仕様のキャッチアップ、どうしよう

## はじめに
新しい会社に入社したエンジニアが必ず通るであろう道、**プロダクトのキャッチアップ**。
本記事では私が入社後にどのようにキャッチアップをしていったかをまとめてみました。

## 目次
1. 仕様のキャッチアップ
1. 背景のキャッチアップ
1. 実装方法のキャッチアップ

## キャッチアップする上での材料（以下、キャッチアップ材料）
- ドキュメントツール（Notion、Cosense、esa、Confluenceなど）
- プロダクトのソースコード
- プロダクトリポジトリのPR、コミット
- Slack、Teamsなどのテキストコミュニケーションツール
- プロダクトのヘルプページ

※ 本記事では「先輩エンジニアに質問する」は最終奥義として扱うため除外します

## 仕様のキャッチアップ
|キャッチアップ材料|相性|
|---|---|
|ドキュメントツール|△
|ソースコード|◯
|PR、コミット|△
|テキストコミュニケーションツール|△
|ヘルプページ|◎

**結論、まずはヘルプページを見ましょう！！！！！！！**
仕様をキャッチアップする上で参照するべきドキュメントは、以下の3点を満たすことが望ましいです
- **正しいこと**
- **最新の情報であること**
- **探しやすいこと**

当たり前ですが、ユーザーがプロダクトについて仕様面で分からないことがあった場合、ヘルプページしか拠り所がないです。ヘルプページはユーザーにとっての公式ドキュメントなんです。
そのため、ヘルプページを見ることで基本的な仕様は全て把握できるようになっている（はずです）
エンジニアは真っ先にコードを見にいく人が多いイメージがありますが、ヘルプページの改善のためにもまずはヘルプページを確認することをオススメします！

ソースコードも仕様理解を深めるためには有効だと思います。（特に内部的な仕様などh
コードは嘘つきませんし、常に最新です。
ただ、探しやすさが入社したてのエンジニアからするとハードルがあります。（どこ読めばええんや・・・）

目的のコードを探す個人的なテクとしては
- フロントエンド側のコードの場合は、画面上のテキストなど目印になるワードでコード検索する
- バックエンド側のコードの場合は、ブラウザの開発者ツールでリクエストを確認→エンドポイントでコード検索する

最近であればAIコーディングエージェントに聞くのもありだと思います。
「**の処理を行なっているファイルを教えてください」と一発聞くだけで教えてくれます！👍

一方で、ドキュメントツール、PR、テキストコミュニケーションツールがなぜ仕様のキャッチアップに不向きかというと、**これらは基本的に最新の状態に更新されないからです**
つまり、最新でなければ今の仕様としては正しくもない。そして、過去現在が入り混じっているので探しにくいです。
**しかし、この特性が別の観点で活きてくるので詳しくは後述！☝️**


:::note info
まとめ
まずはヘルプページを見よう！！
:::


## 背景のキャッチアップ
|キャッチアップ材料|相性|
|---|---|
|ドキュメントツール|◎
|ソースコード|△
|PR、コミット|◎
|テキストコミュニケーションツール|◎
|ヘルプページ|△

**「なんでこんな仕様になってんの？」**
**「このコード、消したらまずいんかな？」**
みたいな背景も、タスクを進めていくにつれてキャッチアップが必要になることでしょう。

しかし、最新のコードからはコメントでも書いていない限り、その歴史的背景を読み取ることは難しいと思います。
そんな時に参照するのは、ドキュメントツール、PR、テキストコミュニケーションツールです！

前述の通りこれらは**基本的に最新の情報に更新されていないです。**
言い方を変えれば **その時々の情報をそのまま残してくれている。** ということです

つまり「歴史の本文（ポーネグリフ）」です。

しかし、これらは前述の通り過去現在のものが入り混じっており、目的のドキュメントを探しづらいです。
そんな時は下記の順序で目的のドキュメントを探すことが多いです

**実装背景が知りたいコード行→コミット→PR→PRに紐づいているドキュメントorチャット**

PRとドキュメントが紐づいている前提ではありますが、ドキュメントorチャットを直接探すよりこちらの方が早い場合があります。

コードからコミットを含むPRを探す場合はGitLensなどの拡張機能を使うのが良いかと思います👍

**まとめるとコードを見た時に「なんでこうなっているんだろう？」と感じたら、まずはその該当コードのPRを見に行き、そのPRに紐づいているドキュメントorチャットを見る、という手順を踏んでキャッチアップしています。**

:::note info
まとめ
ドキュメントや過去のチャットのやりとりを探そう！
コード→PR→PRに紐づいているドキュメントorチャットというたどり方が案外近道になることも！？
:::

## 実装方法のキャッチアップ
|キャッチアップ材料|相性|
|---|---|
|ドキュメントツール|◯
|ソースコード|◯
|PR、コミット|◎
|テキストコミュニケーションツール|◯
|ヘルプページ|×

「表にこちらのアイテムを追加してください」
「こちらの機能にもログ出力の処理を追加してください」
など過去に前例がある機能実装の場合は、**参考PRを探すのがオススメです！**
過去の参考PRはどのファイルを弄る必要があるのかなどを理解するのに役立ちます👍

こちらも背景のキャッチアップと同様にGitLensなどを駆使して参考PRを探すのがオススメです！

:::note info
まとめ
過去の参考PRを探そう！
:::

## その他
キャッチアップをする際に、自分の分報チャンネルに「分かったこと」「分からないこと」をどんどん書いていくのが良いと思います。（Working Out Loud（大声作業））
自分の考えをアウトプットし続けていると、他の人から反応をもらえることがあり、その際にキャッチアップが進むことも多々あります。

また、「分かったこと」「分からないこと」もポーネグリフになり、将来別の誰かを助けることがあるかもしれませんので、キャッチアップした内容をどんどんアウトプットしていくことは良いことが多いです

https://blog.studysapuri.jp/entry/2018/11/14/working-out-loud

:::note info
まとめ
キャッチアップした内容はどんどんアウトプットしよう！未来の誰かを救うかも？
:::


## おわりに
新しい会社に入社したけど最初の数ヶ月は分からないことだらけでしんどい…と感じているエンジニアの方々の参考になればと思います！
皆さんのおすすめのキャッチアップ方法があれば是非教わりたいです！🙏
最後まで読んでいただきありがとうございました！🙏
猿でもわかるAIの倫理・リスクシリーズ 🐵⚠️AIと人権侵害の危険性



## 「AIと人権侵害の危険性」〜便利さの裏に潜む技術者の責任〜

---

### 🧩 1. はじめに：AI技術の進化と“見えない人権侵害”

私たちが開発・運用するAI技術は、日々進化し、私たちの生活をより快適に、効率的に変えつつあります。

しかしその一方で、\*\*「AIが知らぬ間に人間の尊厳を傷つけている」\*\*可能性もあります。

* AI採用システムが無意識に性別差別をしていた
* 顔認識が特定人種の識別に偏りを持っていた
* チャットボットがユーザーを傷つける発言を生成した

こうした事例は決してSFの話ではなく、実際に**Amazon、IBM、Meta、Google**などでも起きた問題です。

本記事では、**実際のコード例**を交えながら「AIと人権」を取り巻く倫理的リスクと、エンジニアとしてどう向き合うべきかを解説します。

---

### 📚 2. AIと人権侵害の代表的ケースと技術背景

#### ■ よくある問題ケース

| ケース            | 影響       | 原因            |
| -------------- | -------- | ------------- |
| 採用AIが女性を評価しない  | 機会の平等を阻害 | 学習データが男性偏重    |
| 顔認識で有色人種に誤検出   | 不当な逮捕・監視 | 不均衡なトレーニングデータ |
| 生成AIが差別的な発言を出力 | 精神的損害・炎上 | インターネットの偏見を吸収 |

#### ■ 技術的な落とし穴

* **データバイアス（偏り）**：収集データが特定層に偏っている
* **ブラックボックス問題**：モデルの判断根拠が説明できない
* **非対称な使用環境**：現場での使われ方が想定と異なる

---

### 💻 3. 実装例：バイアス検知付きのテキスト分類AI

以下は、AIが性別バイアスを持っていないかを**スコアで可視化**するシンプルな実装例です。

```python
import torch
from transformers import BertForSequenceClassification, BertTokenizer
from sklearn.metrics import classification_report

# 1. モデルとトークナイザーの準備
model = BertForSequenceClassification.from_pretrained("bert-base-uncased", num_labels=2)
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")

# 2. 入力文（性別によるバイアス確認）
texts = [
    "He is a great leader.",
    "She is a great leader.",
    "He is very emotional.",
    "She is very emotional."
]

# 3. 推論
model.eval()
for text in texts:
    inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True)
    outputs = model(**inputs)
    pred = torch.argmax(outputs.logits, dim=1)
    print(f"{text} -> Prediction: {pred.item()}")
```

> 🔍 このコードで「He」と「She」で同じ文を評価し、結果が大きく異なる場合は**モデルに性別バイアスがある**可能性があります。

---

### 🛠️ 4. 実務Tips：人権リスクを回避するための開発・運用術

#### ✅ 実務で役立つヒント

| 項目      | 内容                             |
| ------- | ------------------------------ |
| データの透明性 | どんなデータで学習されたかを明記する（Data Card）  |
| バイアス評価  | モデルの推論における属性バイアスを定期的に検出・レポート化  |
| 説明可能性   | SHAPやLIMEなどでモデル判断根拠を人間が読める形にする |
| プロンプト制御 | 生成AIでは不適切表現の出力をブロックするフィルター設計   |

#### ⚠️ よくある落とし穴

* テストデータにマイノリティ属性が含まれていない
* デバッグ段階で倫理チェックが抜け落ちている
* プロダクトオーナーが倫理リスクの重要性を理解していない

---

### 🌐 5. 応用と今後の取り組み

#### ■ 応用分野での注意

* **HRTech：採用AIの透明性ガイドライン**
* **EdTech：生成AIによる生徒評価と公平性**
* **GovTech：公共政策におけるAI活用時の倫理審査制度**

#### ■ 企業の取り組み例

* **Google**：「AI Principles」として“差別しない”を明文化
* **Meta**：バイアス検出ライブラリ「Fairness Flow」の開発
* **日本企業**でも、経産省がAI倫理ガイドラインを発行（2021）

---

### 🧭 6. まとめ：AI開発は“人権設計”から始まる時代へ

| 評価軸    | 内容                           |
| ------ | ---------------------------- |
| ✅ メリット | 公平・透明なAIがユーザー信頼を高める          |
| ⚠️ リスク | 一度の倫理的炎上で信用失墜の可能性            |
| 💡 展望  | エンジニアの倫理知識＝スキルの一部として求められる時代へ |

---

🔚 **結びに：**

AIに倫理を組み込むのは「制限」ではなく「拡張」です。
私たちエンジニアは、技術の力でよりよい社会を築くことができます。
今こそ、\*\*「正しく作り、正しく使う」\*\*という責任を意識していきましょう。

---

📌 **次回予告：「AI倫理教育の必要性」について掘り下げます。**
コンストラクタ関数

### コンストラクタ関数とは
　・主にビルトインオブジェクトで使われる
　・新しくオブジェクトを生成できる関数
 　 ＝この新しいオブジェクトのことをインスタンスと呼ぶ(要はコピー)
 　→コンストラクタ関数が雛形となり、関数を再度書く必要がなくなる
  　・ES6以降はclassが登場、async,awaitへ  

 [ コンストラクタ関数の作り方 ]
 ```
 function Obj(){　　　　　　//※コンストラクタ関数は頭文字を大文字にする
	this.name = '太郎';
}
let a = new Obj();　　　　　//new演算子によってインスタンスを作成する
console.log( a.name ); 　　// '太郎'
 ```
 
 ・変数 a は、コンストラクタ関数(Obj)のプロパティを引き継ぐ
・コンストラクタ関数とは別のオブジェクトとして認識、だから便利

 つまり、Obj != a　であるが、値は保持され機能を変更だけ変更可能。
 よって、コードの構造化、再利用性、保守性というメリットが得られる。

 　非同期処理で使われるPromiseはビルトインオブジェクトのコンストラクタ関数であるため、この概念の理解が重要となる。
　 ES6以降では、classやasync,awaitがこの性質を受け継ぐため、必ず理解しておくべき。
猿でもわかるAIの倫理・リスクシリーズ 🐵⚠️超高度AIと人権問題



## 超高度AIと人権問題：コードを書く我々エンジニアが直面する現実

---

### 🧩 1. はじめに：AIが「人権」を侵害する日が来る？

2024年、OpenAIやAnthropicなどの企業が開発するLLM（大規模言語モデル）は、人間と区別がつかないほど自然な会話を行うまでに進化しました。
その一方で、「AIによって個人の尊厳が脅かされる時代」がすぐそこまで来ています。

* AIが採用・評価・選別を自動化する
* AIが生成したデータで“人格評価”がされる
* AIの出力が差別的・偏見的である可能性

このような場面で、**人権と技術がぶつかる現場**に私たち開発者が立ち会うことになります。

---

### 🧠 2. 超高度AIと人権の接点：何が問題なのか？

#### 🔍 【問題1】ブラックボックスな意思決定

AIの判断プロセスが不透明だと、差別や偏見が潜んでいても誰にも気づかれない。

#### 🔍 【問題2】偏った学習データによるバイアス

人間社会にある不平等がそのままAIに「学習」されてしまう。

#### 🔍 【問題3】プライバシーの侵犯

学習・推論過程で個人情報やセンシティブなデータが不用意に扱われる。

#### 🔍 【問題4】責任の所在不明

AIが誤った判断をしたときに、誰がどこまで責任を取るのかが曖昧。

> 💬「それ、AIが勝手にやったことですから…」では済まされない時代が到来しています。

---

### 💻 3. 実例で学ぶ：差別を検出するFairnessチェックの実装（Python＋`Fairlearn`）

ここでは、採用AIモデルにおいて**性別による差別**がないかをチェックする例を紹介します。

#### 📦 インストール

```bash
pip install fairlearn scikit-learn pandas
```

#### 🧪 コード例：Fairness Metricsを使った分析

```python
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from fairlearn.metrics import MetricFrame, selection_rate, demographic_parity_difference
import pandas as pd

# ダミーデータの準備（性別あり）
data = pd.read_csv("hiring_data.csv")
X = data.drop(columns=["hired"])
y = data["hired"]
gender = data["gender"]  # "male" or "female"

X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y)

model = LogisticRegression()
model.fit(X_train, y_train)

# 予測とFairness評価
y_pred = model.predict(X_test)
frame = MetricFrame(
    metrics={"selection_rate": selection_rate},
    y_true=y_test,
    y_pred=y_pred,
    sensitive_features=gender.loc[y_test.index]
)

print(frame.by_group)
print("Demographic parity difference:", demographic_parity_difference(y_test, y_pred, sensitive_features=gender.loc[y_test.index]))
```

#### ✅ 実行結果イメージ（図1：selection rate by gender）

* male: 0.75
* female: 0.42
  👉 明らかなバイアスがある！

---

### 🛠 4. 実務Tips：倫理対応でよくある落とし穴

| 課題     | よくある誤解           | 対処法               |
| ------ | ---------------- | ----------------- |
| バイアス対策 | 「学習データを均等にすればOK」 | ラベルバイアス、機能バイアスも確認 |
| 公平性の定義 | 「正解率が同じなら公平」     | 選択率・エラー率もチェックすべき  |
| 説明可能性  | 「XAI使えば安心」       | XAIの誤解釈リスクも考慮     |
| データ匿名化 | 「名前を消せば匿名」       | 組み合わせで個人特定されうる    |

> ⚠️ **「公平性」とは数値だけで測れない、社会的・文化的文脈が不可欠です。**

---

### 🌐 5. 応用と未来展望：技術で倫理を内包する時代へ

#### 🧩 応用例

* **採用AI → 公平なスクリーニングツール**
* **クレジットAI → 与信判断の透明化**
* **監視AI → 公共空間のプライバシー保護機能付き**

#### 🔮 未来展望

* **倫理by-design**（設計段階から倫理要素を組み込む）
* AI倫理チェックリストの自動化ツール普及
* **Explainable AI（XAI）＋ Fair AI**が標準装備に

---

### 🧾 6. まとめ：我々がコードで守るべき「尊厳」

| 項目      | 内容                   |
| ------- | -------------------- |
| ✔️ メリット | 高効率・大規模判断・バイアス分析可能   |
| ⚠️ リスク  | 不透明な偏見・責任不明・人権侵害の可能性 |
| 💡 指針   | 技術者が倫理の担い手となる時代へ     |

私たちは、ただ「動くコード」だけでなく、「**人に優しいコード**」を書く責任を持っています。
あなたの書いたAIが、未来の誰かを傷つけないように。
今こそ、**技術と倫理を同時に学ぶタイミング**です。

---

📌 **次回予告：「AIと人権侵害の危険性」について掘り下げます！
興味があれば、ぜひフォロー＆コメントください。**
座標圧縮をばっこり解説 [競プロ]

## 座標圧縮とは
座標関係なく、数値の大小関係のみが重要な時に、軽量化するために用いる処理のことです。

## サンプルコード
```cpp:coordinate_compression.cpp
void solve() {
    // 入力待ち
    int n;
    cin >> n;
    vector<int> v(n);
    for(int i = 0; i < n; ++i) cin >> v[i];

    // 代行を作成 → 昇順に並び替え → 重複消去 → 元のベクトルを書き換え
    vector<int> p = v;
    sort(p.begin(), p.end());
    p.erase(unique(p.begin(), p.end()), p.end());
    for (int& x : v) x = lower_bound(p.begin(), p.end(), x) - p.begin();

    // 結果出力
    for (int i = 0; i < n; ++i) cout << "v[" << i << "]: " << v[i] << endl;
}

```

## 実例
[鉄則本A15](https://atcoder.jp/contests/tessoku-book/tasks/tessoku_book_o)
この問題はデータの軽量化というよりは、座標圧縮をしたものを出力しなさいという感じですが、基本なのでよいと思います。[実装例](https://atcoder.jp/contests/tessoku-book/submissions/65738480)
[ABC213C問題](https://atcoder.jp/contests/abc213/tasks/abc213_c)
この問題は上の問題の2次元版です。[実装例](https://atcoder.jp/contests/abc213/submissions/65738362)

(追記募集しています。編集リクエスト通します。)

# まとめ
正直理解が正しいか怪しいです。
何かご指摘ございましたら、コメント欄にてお願いいたします。
それでは！
猿でもわかるAIの倫理・リスクシリーズ 🐵⚠️宇宙開発におけるAI倫理課題



## 宇宙開発におけるAI倫理課題とは？〜フルスタックエンジニアが直面するリアルな実装とリスク〜



### 🛰️ 1. はじめに：宇宙開発とAIが交わる時代へ

近年、SpaceXやJAXAをはじめとした宇宙開発機関では、ミッション自動化・ナビゲーション・異常検知など、さまざまな分野でAIの活用が急速に進んでいます。しかし、**「AIに宇宙船の意思決定を任せてもよいのか？」**、「**地球外での誤作動は誰が責任を取るのか？**」といった倫理的課題も浮き彫りになってきました。

このブログでは、**現役ソフトウェアエンジニアの視点から**、宇宙AIの導入事例、リスク、そして実際に試してみたコード例を交えて、技術的かつ倫理的に掘り下げていきます。

---

### 🚀 2. 宇宙開発におけるAI技術の概要

宇宙分野におけるAIの主な用途は以下の通りです：

| 用途     | 内容                      |
| ------ | ----------------------- |
| 自律航行   | AIが軌道修正や障害物回避をリアルタイムに判断 |
| データ解析  | 宇宙望遠鏡やセンサーのビッグデータを処理    |
| 故障予測   | 機器の異常予兆をAIで検出           |
| ロボティクス | 火星探査ローバーなどの自律制御         |

これらのAIは、一般的なクラウド環境ではなく、**耐放射性のあるエッジデバイス**（例：NVIDIA JetsonやNASA独自チップ）上で動作することが多く、リアルタイム性と高い信頼性が求められます。

---

### 🧪 3. 実装例：宇宙ローバーの障害物検知AI（PyTorchベース）

以下は、火星ローバーの自律走行用に開発された簡易な画像分類モデルの例です（ローカルカメラの映像から障害物を検出）。

```python
import torch
import torch.nn as nn
import torchvision.transforms as transforms
from PIL import Image

# CNNモデル（簡易版）
class ObstacleClassifier(nn.Module):
    def __init__(self):
        super().__init__()
        self.net = nn.Sequential(
            nn.Conv2d(3, 16, 3, padding=1),
            nn.ReLU(),
            nn.MaxPool2d(2),
            nn.Conv2d(16, 32, 3, padding=1),
            nn.ReLU(),
            nn.MaxPool2d(2),
            nn.Flatten(),
            nn.Linear(32*64*64, 2)
        )

    def forward(self, x):
        return self.net(x)

# 入力画像の前処理
transform = transforms.Compose([
    transforms.Resize((256, 256)),
    transforms.ToTensor()
])

model = ObstacleClassifier()
model.load_state_dict(torch.load("rover_model.pth"))
model.eval()

# 入力画像の読み込み
image = Image.open("test_mars.jpg")
input_tensor = transform(image).unsqueeze(0)

# 推論
output = model(input_tensor)
_, predicted = torch.max(output, 1)
print("Obstacle Detected" if predicted.item() == 1 else "Safe Path")
```

> 🔧 **Tips**：火星環境の画像ノイズは強いため、データ拡張処理を強めに設定（例：ランダムブラー、露光変化）するのがポイント。

---

### 💡 4. 実務Tips：宇宙AIで陥りがちなトラブル

| 問題        | 内容                | 回避策               |
| --------- | ----------------- | ----------------- |
| 放射線による誤動作 | メモリビットフリップで推論が不安定 | ECC付きRAM＋冗長ネットワーク |
| 通信遅延      | 地球⇔宇宙で数分以上のラグが発生  | 完全自律型AI＋ログ同期設計    |
| データ不足     | 宇宙環境の学習データが少ない    | シミュレーション＋転移学習     |
| 倫理的曖昧性    | AIの行動責任が曖昧        | 決定記録と責任ドキュメント化    |

また、\*\*「AIの判断が人間より正確でも、責任の所在が曖昧なら運用に耐えない」\*\*というのが実務的な現実です。

---

### 🔭 5. 応用と未来展望：宇宙AI × 地球アプリケーション

宇宙向けに開発されたAI技術は、地球上でも応用可能です：

* ローバー → **農業用ドローンの障害物回避**
* 異常検知 → **スマートファクトリーの監視**
* 通信断耐性AI → **災害時ドローン制御**

さらに、将来の展望としては：

* **AI宇宙飛行士の導入**
* **地球外コロニーの意思決定支援**
* **宇宙×ブロックチェーンで責任追跡**

---

### 🧭 6. まとめ：可能性とリスクのバランスを見極めよう

| 項目     | 内容                 |
| ------ | ------------------ |
| ✅ メリット | 自律化・信頼性向上・リアルタイム処理 |
| ⚠️ リスク | 誤作動時の責任・倫理的ルール未整備  |
| 🔮 将来性 | 地球外での新しい人類の意思決定支援へ |

AI×宇宙というロマンと責任の間で、私たち技術者が果たすべき役割はますます大きくなっています。「ただ動く」だけでなく、「**どう動くべきか**」という問いを常に忘れずにいたいですね。

---

📌 **次回予告**：「超高度AIと人権問題」を掘り下げます！
猿でもわかるAIの倫理・リスクシリーズ 🐵⚠️金融システムにおけるAIハッキングの脅威



## 「金融システムにおけるAIハッキングの脅威」——AIセキュリティの落とし穴と守り方

---

### 1. はじめに 〜AIが金融を襲う日〜

ここ数年、金融業界におけるAIの活用は飛躍的に進んでいます。信用スコアの自動計算、投資アルゴリズム、異常検知による不正利用の防止まで、AIは“金融の脳”となりつつあります。

しかし、このAIがハッキングされたらどうなるでしょうか？

本記事では、「金融システムにおけるAIハッキングの脅威」というセンシティブなテーマを、エンジニア目線で掘り下げていきます。特に、**機械学習モデルの脆弱性、攻撃パターン（例：モデル反転攻撃や敵対的サンプル）、実際のコード例**を通して、実務で役立つセキュリティ対策までを解説します。

---

### 2. 金融×AIの現状とリスクの概要

#### 🔍 なぜ金融業界はAIに依存するのか？

* リアルタイム分析：数百万件のトランザクションを即時スキャン
* 自動取引：HFT（高頻度取引）の意思決定最適化
* 不正検知：パターン認識による詐欺行動の検出

#### ⚠️ AI導入に潜む3つのリスク

1. **ブラックボックス性**
2. **敵対的攻撃（Adversarial Attacks）**
3. **データ漏洩（Model Inversion）**

---

### 3. 攻撃の実例とコードによる再現

#### 3-1. 敵対的サンプルによる誤分類攻撃（Adversarial Example）

```python
import torch
import torch.nn as nn
import torchvision.models as models
import torchvision.transforms as transforms
from PIL import Image
import numpy as np

# 学習済みモデル（例: ResNet）をロード
model = models.resnet18(pretrained=True)
model.eval()

# 入力画像の前処理
transform = transforms.Compose([
    transforms.Resize(224),
    transforms.ToTensor(),
])

image = Image.open("normal_card_transaction.png")
input_tensor = transform(image).unsqueeze(0)

# 元の予測結果
original_output = model(input_tensor)

# 敵対的ノイズを加える
epsilon = 0.01
input_tensor.requires_grad = True
output = model(input_tensor)
loss = nn.CrossEntropyLoss()(output, torch.tensor([0]))
loss.backward()

# FGSM（Fast Gradient Sign Method）でノイズ生成
perturbed_data = input_tensor + epsilon * input_tensor.grad.sign()

# 攻撃後の予測
adversarial_output = model(perturbed_data)
```

📌 **結果**：通常の決済画像を「不正」と誤判定、もしくはその逆が起きうる。

#### 3-2. モデル反転攻撃（Model Inversion Attack）

* 攻撃者が**出力の一部とモデル構造を知っている**前提で、元の入力データ（例：個人金融情報）を再構築する。

```python
# 攻撃アルゴリズムの擬似コード
# For illustration purpose only
for i in range(1000):
    candidate_input = generate_random_input()
    output = target_model(candidate_input)
    if is_similar_to_target_output(output):
        save_candidate(candidate_input)
```

---

### 4. 実務で役立つ防御策と落とし穴

#### ✅ 対策①：敵対的訓練（Adversarial Training）

```python
# 正常データ＋敵対的データで学習
train_data += adversarial_examples
model.train(train_data)
```

#### ✅ 対策②：Differential Privacyでモデルを守る

```python
from opacus import PrivacyEngine

privacy_engine = PrivacyEngine()
model, optimizer, dataloader = privacy_engine.make_private(
    module=model,
    optimizer=optimizer,
    data_loader=dataloader,
    noise_multiplier=1.0,
    max_grad_norm=1.0,
)
```

#### ❌ よくある落とし穴

* データ暗号化だけで安心と思いがち（モデル自体の脆弱性は別問題）
* ブラックボックス化しすぎて監査不能になる

---

### 5. 発展的な応用・研究トピック

* Federated Learningとそのセキュリティ強化（例：Secure Aggregation）
* Explainable AIで不正検知の透明性向上
* 金融庁ガイドラインに沿ったAI活用基準（リスク管理モデル）

---

### 6. まとめ：AIを金融に使うなら、攻撃者の視点を持て！

| 観点          | メリット      | リスク         |
| ----------- | --------- | ----------- |
| 高速・高精度な判断   | 金融取引の効率化  | 敵対的入力で誤作動   |
| 大量のデータ処理    | 不正検知能力の向上 | モデルから個人情報漏洩 |
| 自動化によるコスト削減 | 人為ミスの削減   | 攻撃者による悪用    |

AIは素晴らしい武器にもなるが、同時に攻撃対象にもなります。特に金融分野では、\*\*「守るAI設計」\*\*がこれからの技術者の新たな役割となるでしょう。

🧠💬 **次回は「宇宙開発におけるAI倫理課題」について掘り下げていきます。お楽しみに！**
Copilot演習シナリオ：自己PR

### 自己PR文を生成してみましょう。

ITエンジニアとしての自己PRをCopilotを利用して生成します。
プロンプト投入前に次の情報を準備しましょう。
・メインスキル
・趣味
・特技
・資格
・好きなこと
・集中できること
・将来どんなことで活躍したいのか

情報が準備できたら次のプロンプトに内容を盛り込み、実行してください。

~~~
#背景
私は顧客に派遣として赴くエンジニアです。
メインのスキル分野はクラウドです。
顧客向けに自己PRを提示する必要があります。
#命令
顧客が興味を持ってくれそうな自己PRを生成してください。
#入力
”””
・趣味
・特技
・資格
・好きなこと
・集中できること
・将来どんなことで活躍したいのか
”””
#出力
２５０字を目処に、丁寧な日本語で生成してください。
~~~

生成結果をよく読んで、自分の紹介としてふさわしい文面に修正しましょう。

この演習はこれで終了です。