OmniAICreator/Qiita-1.07M huggingface dataset:
OCI学習#4 Object設定、アクセス

## 概要
OCI Architect Associate 2024資格取得に向けて学習を進めているが、
実際に触ったほうが理解も進み、いざ構築する際に手が止まらなくなると考えたため
OCIチュートリアルを参考に操作感を覚える。
その際の手順等を見返せるように、簡単に記す。

## OCI学習記事まとめ
今回の一連の記事を下記にまとめます。
1.[OCI学習#1 ネットワーク設定](https://qiita.com/nonZy/items/adbbf47646a28e59fe36)
予算設定、コンパートメント作成、VCN、IGW、ルート表、セキュリティリスト作成。
2.[OCI学習#2 インスタンス作成、接続:](https://qiita.com/nonZy/items/b821d419c03ca7c7cd7c)
インスタンス作成、SSH接続
3.[OCI学習#3 Block Volume追加](https://qiita.com/nonZy/items/5053c853c77cfb68bc51)
Block Volumeの作成、アタッチ、OSでのパーティション設定、ファイルシステム作成、マウントまで

## ゴール
[入門編 - Oracle Cloud Infrastructure を使ってみよう](https://oracle-japan.github.io/ocitutorials/beginners/)
チュートリアルを参考に、下記を実施して操作感を覚える。
1.クライアントからパブリックサブネットのインスタンスSV01へ接続。
2.インスタンスSV01からプライベートサブネットのインスタンスSV02へ接続。
3.SV02へBlock Volumeを追加、マウント。
4.クライアントからObject StorageのObjectにアクセス。
![edu02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510919/c45ec428-e355-4c9b-887e-20550417f585.png)

## 本記事の内容
### 事前準備-index.htm作成
端末よりオブジェクトへのアクセス確認をするためにClaude 3.7 sonnetにindex.htmlを作成してもらう。

### バケット作成
1.[ストレージ]-[ブロック・ストレージ]-[オブジェクト・ストレージとアーカイブ・ストレージ]-[バケット]をクリック
2.[バケットの作成]をクリック
アクセス確認の実施だけなので、基本全てデフォルト。
![41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510919/adf31313-0dbf-4ee4-bfb7-66648b9a3928.png)

### オブジェクトアップロード
1.[バケット]-[オブジェクト]-[アップロード]をクリック
アップロード。
![42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510919/b73f8e93-47ac-4d96-833d-f70a85057c99.png)
全てデフォルト
![43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510919/b3b349d3-9257-460c-9713-8f9156b200d4.png)

### 事前認証リクエストの作成
1.対象オブジェクトを選択
2.[編集]-[事前承認済みリクエストの作成]をクリック
![44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510919/3f1b2316-db55-460a-89b9-2f3c68289c37.png)

対象はindex.htmlのみなので、オブジェクトを対象としてリクエストの作成を行います。
また、書き込みの必要はないので、読み取り専用で払い出します。
![46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510919/928e9874-985b-425d-9ec9-bfb4fd47ea2f.png)

### オブジェクトへのアクセス
1.URLをコピーして、ブラウザへ貼り付ける
アクセス確認の結果は下記。
![47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510919/f8d032ce-0c49-480e-b3e9-123739e6b7ae.png)

## まとめ
AWS S3のような静的ウェブサイトホスティングのような機能は現時点では存在していなかった。
これで今回の学習目的は全てクリア。

OCIの学習は継続的に行い、振り返りができるようにQiitaに載せていこうと思います
[Linux] SSH接続時のホスト認証について

## この記事について
サーバにSSH接続する際、ホスト認証とユーザ認証が行われている。
本記事では、ホスト認証の仕組みについて記載する。

## SSH接続における認証
SSH接続の際に行われる認証の順番としては、<mark>ホスト認証⇒ユーザ認証。</mark>
* ホスト認証
  クライアントから見て、接続先のサーバーが信頼できるかどうかを確認する
*   ユーザ認証
  サーバーから見て、ユーザーが本人であるかを確認する

## ホスト認証について
### 鍵ペアの生成（サーバー側）
サーバーにOpenSSH等のsshサービスがインストールされる際、以下の各鍵ファイルが生成される
* 秘密鍵ファイル
```
[root@localhost ~]# ll /etc/ssh/ssh_host_rsa_key
-rw-r-----. 1 root ssh_keys 2578 Apr  2 11:06 /etc/ssh/ssh_host_rsa_key
```
* 公開鍵ファイル
```
[root@localhost ~]# ll /etc/ssh/ssh_host_rsa_key.pub
-rw-r--r--. 1 root root 554 Apr  2 11:06 /etc/ssh/ssh_host_rsa_key.pub
```
### SSH初回接続（クライアント側）
1. クライアントからサーバーへの初回接続の際、サーバーは上述の公開鍵ファイルをクライアントに送信する。クライアントは、サーバーから受け取った公開鍵ファイルを以下ファイルに記録する。
   ```
   [root@localhost ~]# ll ~/.ssh/known_hosts
   -rw-r--r-- 1 root root 173  4月 10 17:10 /root/.ssh/known_hosts
   ```
2.  受け取った公開鍵ファイルを信頼していいかどうかの確認が行われる
    *    CLI画面
    ```
      Are you sure you want to continue connecting (yes/no/[fingerprint])?
    ```
    * Teraterm

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550683/05a74d8d-383d-4a26-ae8c-5833b7bf5f9e.png)


3. 次回接続時、クライアントは接続先サーバーから送られてくる公開鍵情報が以下のファイルに存在しているか否かを確認する。存在していれば、ユーザー認証の段階に進む。以上。
```
[root@localhost ~]# ll ~/.ssh/known_hosts
-rw-r--r-- 1 root root 173  4月 10 17:10 /root/.ssh/known_hosts
```
Oracle SQLコマンドまとめ

# Oracle インフラ保守メモ（基礎まとめ）

職場でOracleを使用しており、インフラ保守担当として必要な知識をまとめたメモです。  
自分用の備忘録ですが、参考になれば嬉しいです。

---

## ✅ 全体像：保守担当者の役割と観点

| 項目 | 内容 |
|------|------|
| 運用監視 | セッション／リソースの監視、エラーログ確認 |
| 性能管理 | 実行計画・I/O・メモリ設定の確認と最適化 |
| バックアップ | RMANやexpdpによる定期バックアップとリカバリ手順 |
| アクセス管理 | ユーザー・ロール・権限の適切な設定 |
| パッチ管理 | バージョン／パッチ適用履歴の管理 |
| トラブル対応 | ロック、ディスク逼迫、遅延セッション対応 |
| リソース設計 | 表領域、REDO、UNDO、TEMPの最適配置と監視 |

---

#参考文献
[SQL*Plusよく使うコマンド - Qiita](https://qiita.com/maripoyo/items/d0bf9bd125c66df32a4c)


## 🔎 セッション・プロセス管理

### 現在のセッション一覧

```sql
SELECT
  sid, serial#, username, osuser, status,
  machine, program, module, logon_time
FROM v$session
WHERE username IS NOT NULL;
````

### 自分のセッションのみ取得

```sql
SELECT
  sid, serial#, username, status, machine, logon_time
FROM v$session
WHERE audsid = userenv('sessionid');
````
【Rails】paramsの値の取得

# はじめに
paramsの値の取得方法について試した結果をまとめます。

# paramsとは
- ActionController::Parametersクラスのインスタンス
- Hashクラスは継承していない

# paramsの値を取得する
- `{"[キー名]" => "[値]"}` の形で格納される

### 取得結果の例
下記の出力結果はすべて、Rails.loggerの出力結果に改行などの編集を加えています。
- AuthorモデルにBooksモデルが親子関係にあり、フォームで同時に保存する場合のパラメータを想定
- author_paramsは下記のようにストロングパラメータとして取得する場合
```rb
def author_params
  params.require(:author).permit(:last_name, :first_name, books_attributes: [:book_name])
end
```
#### params
```
{"authenticity_token"=>"[トークン]", 
"author"=>{
"last_name"=>"山田", "first_name"=>"花子",
"books_attributes"=>{
"0"=>{"id"=>"", "book_name"=>"きょう"},
"1"=>{"id"=>"", "book_name"=>"あした"}}}, 
"controller"=>"mm/authors",
"action"=>"create"}
```

#### author_params
```
{"first_name"=>"花子",
"last_name"=>"山田",
 "books_attributes"=>#<ActionController::Parameters {
 "0"=>#<ActionController::Parameters {"id"=>"", "book_name"=>"きょう"} permitted: true>,
 "1"=>#<ActionController::Parameters {"id"=>"", "book_name"=>"あした"} permitted: true>}
 permitted: true>}
```
#### params[:author][:first_name]　/ params.dig(:author, :first_name) / author_params[:first_name] / author_params.dig(:first_name)
 ```
花子
 ```
 :::note
キー名はシンボルでも文字列でも指定できるので`params['author']['first_name']`でも取得できる
:::

#### params[:author][:books_attributes] / params.dig(:author, :books_attributes)
 ```
{"0"=>{"id"=>"", "book_name"=>"きょう"},"1"=>{{"id"=>"", "book_name"=>"あした"}}
 ```
#### author_params[:books_attributes] / author_params.dig(:books_attributes)
```
{"0"=>#<ActionController::Parameters {"id"=>"", "book_name"=>"きょう"}  permitted: true>,
"1"=>#<ActionController::Parameters {"id"=>"", "book_name"=>"あした"} permitted: true>}
```

####  params[:author][:books_attributes]['0'] / params.dig(:author, :books_attributes, '0') / author_params[:books_attributes]['0'] / author_params.dig(:books_attributes, '0')
::: note
インデックスの数字に`[0]` `[:0]` は使えない
:::
 ```
{"0"=>{"id"=>"", "book_name"=>"きょう"}
 ```
#### params[:author][:books_attributes]['0'][:book_name] / params.dig(:author, :books_attributes, '0', :book_name) / author_params[:books_attributes]['0'][:book_name] /  author_params.dig(:books_attributes, '0', :book_name)
 ```
 きょう
 ```
【Rails】マイグレーションをgit revertした際の事後対応

# はじめに
マイグレーションを実行したコミットをgit revertした際に事後対応が必要となったため、その対応について記録します。

# `git revert` 後の状態
- マイグレーションファイルが削除済みになる（Vscode上）
- マイグレーションのStatusが「up」でMigration Nameが「****** NO FILE ******」になる
```
$ rails db:migrate:status

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20240412075830  Remove hoge from fuga
   up     20250401071535  ********** NO FILE **********
```

# 対応
## 手順
#### 1\. ダミーファイルを作成し、「***** NO FILE *****」と置き換える
#### 2\. ダミーファイルのマイグレーションStatusを「down」に変更する
#### 3\. ダミーファイルを削除する

## 手順の解説
#### 1\. ダミーファイルを作成し、「***** NO FILE *****」と置き換える
- ダミーファイルを作成
  - ファイル名は「**** NO FILE ****」のMigration IDをコピペし、[Migration ID]_[任意の名前].rbとする
  - ファイルの中身は空のメソッドなどを書く
```
$ touch db/migrate/20250401071535_piyo.rb
```
```rb
# 20250401071535_piyo.rb
class Piyo < ActiveRecord::Migration[6.0]
  def change
  end
end
```
- 「***** NO FILE *****」とダミーファイルが置き換わっていることを確認
```
$ rails db:migrate:status

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20240412075830  Remove hoge from fuga
   up     20250401071535  Piyo
```
#### 2\. ダミーファイルのマイグレーションStatusを「down」に変更する
- マイグレーションStatusを「down」に変更する
```
$ rails db:migrate:down VERSION=20250401071535
```
- 「down」に変更されていることを確認する
```
$ rails db:migrate:status

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20240412075830  Remove hoge from fuga
  down    20250401071535  Piyo
```

#### 3\. ダミーファイルを削除する
- 削除する
```
$ rm db/migrate/20250401071535_piyo.rb
```
- ステータスからも削除されていることを確認する
```
$ rails db:migrate:status

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20240412075830  Remove hoge from fuga
```
# その他
#### マイグレーションは実行したい場合
- `git revert` したコミットの中にマイグレーションを含む複数の変更があり、マイグレーションは実行したいが、その他の変更はrevertした状態のままにしたい場合を想定
- 上記の対応手順のダミーファイルを元のマイグレーションファイル名と中身で作成する
- 手順3のダミーファイルの削除の代わりに　`rails db: migrate` を実行する

#### git revertを取り消したい場合（適切な手順ではないと思いますが、下記を実行した際の記録です）
- リモートリポジトリのHEADに合わせて巻き戻す
```
$ git reset --hard origin/[リモートリポジトリ名]
```
- マイグレーションstatusを確認する
```
$ rails db:migrate:status

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20240412075830  Remove hoge from fuga
  down    20250401071535  Add foreign key constraint to active storage attachments for blob idactive storage
```
- マイグレーションを実行する
```
$ rails db:migrate
```
- マイグレーションstatusが「up」になったことを確認する
```
$ rails db:migrate:status
 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20240412075830  Remove detail date from bill details
   up     20250401071535  Add foreign key constraint to active storage attachments for blob idactive storage
```

# おわりに
マイグレーションを含むコミットをリバートすると事後対応が必要になることが分かりました。後先を考えずにリバートを使わないよう気を付けたいと思います。
【Rails】双方向関連付けとinverse_of

# はじめに
双方向関連付けと `inverse_of` が必要なケースについての学習記録です。

# 双方向関連付けとは
- Railsでは、基本的にモデル間の関連付けを双方向で設定する
- Active Recordは規約通りの関連付け名がある場合、二つのモデルが双方向に関連していることを自動で認識する
```rb
class User < ApplicationRecord
  has_many :comments
end

class Comment < ApplicationRecord
  belongs_to :user
end
```
# 双方向関連付けが自動で認識されなくなるケース
-  `:foreign_key` `:through` などのオプションが使われると、規約通りの関連付け名でないため自動で認識されなくなる
```rb
class User < ApplicationRecord
  has_many :comments
end

class Comment < ApplicationRecord
  belongs_to :user, class_name: "Author", foreign_key: "author_id"
end

# Railsの規約では相手モデルを指す外部キーのカラム名は `[モデル名]_id`が使われる
# :foreign_keyオプションを使うと、外部キーのカラム名を直接指定できる
```

# `inverse_of` で双方向関連付けを明示的に宣言する

```diff
class User < ApplicationRecord
- has_many :comments
+ has_many :comments, inverse_of: "user"
end
```
# おわりに
複数モデルの同時保存する際のエラー解決策として `inverse_of` に行き当たりました。同時保存時に外部キーがない事によるid違反を解消してくれるそうです。オプションを使用している際などは `inverse_of` を書き忘れないように気を付けたいです。
# 参考

https://zenn.dev/igaiga/books/rails-practice-note/viewer/ar_inverse_of

https://railsguides.jp/association_basics.html#%E5%8F%8C%E6%96%B9%E5%90%91%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91

https://www.subculeng.com/?p=740
【Rails】renderメソッド使用時のMissing partialエラーの対応など

# はじめに
部分テンプレート使用時に注意したい点を備忘録としてまとめます。

## ActionView::Template::Error (Missing partial)の対応
#### エラー内容
```mm/hoge/index.html.erb
<%= render 'registration' %>
```
```
ActionView::Template::Error (Missing partial mm/hoge/registration, base/fuga/registration, application/registration with {:locale=>[:ja, :en], :formats=>[:js, :html, :text, :css, :ics, :csv, :vcf, :vtt, :png, :jpeg, :gif, :bmp, :tiff, :svg, :mpeg, :mp3, :ogg, :m4a, :webm, :mp4, :otf, :ttf, :woff, :woff2, :xml, :rss, :atom, :yaml, :multipart_form, :url_encoded_form, :json, :pdf, :zip, :gzip], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby, :jbuilder]}. Searched in: ....
```
#### 原因
- renderメソッドを書いたビューファイル「mm/hoge/index.html.erb」と部分テンプレート「mm/fuga/_registration.html.erb」が別のディレクトリにあるため
#### 解決法
- app/views以下のパスを書く
 ```diff
- <%= render 'registration' %>
+ <%= render 'mm/fuga/registration' %>
```
### 以下の書き方はすべて同じファイルを呼び出す
- UsersControllerクラスのupdateアクション実行に失敗し、editテンプレートをレンダリングする場合
- すべてviews/usersディレクトリのedit.html.erbがレンダリングされる
```rb
render :edit
render action: :edit
render "edit"
render action: "edit"
render "users/edit"
render template: "users/edit"
```
### `partial`は省略可能だが、`locals` などの追加オプションも渡す場合は省略できない
```rb
# 基本の使い方
render 'ファイル名', 部分テンプレートで使う変数: 変数に入れる値

# OK
render 'registration', user: @user, index: @index
render partial: 'registration', locals: { user: @user, index: @index }

# NG
render 'registration', locals: { user: @user, index: @index }
```
### 部分テンプレートファイル名のアンダースコア（`_`）は呼び出し時は省略する
「_registration.html.erb」ファイルを呼び出す場合
```rb
render 'registration' # 同じディレクトリにある場合 
render 'books/registration' # 別のディレクトリにある場合
```
【Rails】モデル間の関連付けにおけるbuildメソッドとストロングパラメータの書き方

# はじめに
Active Recordの関連付けのケースごとに、buildメソッドの書き方と、ストロングパラメータの書き方について調べた学習記録です。

# 一対一の場合
### モデルでの定義
```rb
class Author < ApplicationRecord
  has_one: account
end
```
```rb
class Account < ApplicationRecord
  belongs_to: user
end
```
### buildメソッドによる関連付けの定義

```rb
@user = User.new
@account = @user.build_account
```
### ストロングパラメータの定義方法
- `accepts_nested_attributes_for` の追加
```rb
class User < ApplicationRecord
  has_one: account
  accepts_nested_attributes_for :account # 追加
end
```
```rb
private
def user_params
  params.require(:user).permit(:email, # usersテーブルへの保存を許可するキー名
   account_attributes: [:first_name, # accountsテーブルへの保存を許可するキー名
   ])
end
```

# 一対多の場合
### モデルでの定義
```rb
class User < ApplicationRecord
  has_many: accounts
end
```
```rb
class Account < ApplicationRecord
  belongs_to: user
end
```
### buildメソッドによる関連付けの定義

```rb
@user = User.new
@account = @user.accounts.build
```

### ストロングパラメータの定義方法
- `accepts_nested_attributes_for` の追加
```rb
class User < ApplicationRecord
  has_many: accounts
  accepts_nested_attributes_for :accounts # 追加
```
```rb
private
def user_params
  params.require(:user).permit(:email, # usersテーブルへの保存を許可するキー名
   accounts_attributes: [:first_name, # accountsテーブルへの保存を許可するキー名
   ])
end
```
# 多対多の場合
### モデルでの定義
```rb
class Account < ApplicationRecord
  has_many :user_accounts
  has_many :users, through: :user_accounts
end
```
```rb
class User < ApplicationRecord
  has_many :user_accounts
  has_many :accounts, through: :user_accounts
end
```
```rb
class UserAccount < ApplicationRecord
  belongs_to :user
  belongs_to :account
end
```
### buildメソッドによる関連付けの定義
```rb
@user = User.new
@account = @user.accounts.build　# 中間テーブルにも自動で反映される
```
### ストロングパラメータの定義方法
```rb
private
def user_params
  params.require(:user).permit(:email, # usersテーブルへの保存を許可するキー名
  account_ids: [] # コントローラーに渡るidの配列と中間テーブルを作成する
  )
end
```
【第0回】Azureで社内webシステムを再現｜構成図と動作の流れ

## はじめに

初めまして、サバインフラと申します。
インフラエンジニアとしてSIerで3年間勤務し、Windows ServerやAzureの設計・構築を担当してきました。

業務はインフラ部分の構築や移行作業がメインで、フロントエンドやバックエンドの処理については曖昧な理解に留まっていました。  
仕組みを正しく把握するために、実際にアプリケーションとインフラの両方を自分で構築してみることにしました。

題材として、以前の勤務先で使用されていた「社員番号から社員情報を検索する社内アプリ」の簡易版を選び、  
Azureの無料クレジットを利用して、仮想的な社内システムを構成しました。

今回は作成したシステムの構成と動作フローに絞って説明します。
具体的な作成手順は次回移行の記事で説明します。

## システム構成について

![azure_onpre_joutai (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037248/c4ca0ec8-7c6d-4bb6-9bb4-1fa9738e4e0b.png)


上図は、今回構築したシステムの構成図です。  

すべての仮想マシンは「East US 2」リージョンに配置し、OSには「Windows Server 2022」を使用しました。  
VMのサイズは `Standard DC1s v3`（vCPU 1 / RAM 8 GiB）で統一しています。
>Azureの無料クレジット期間中は、リージョンごとにvCPUの上限（通常は4コア）があります。
今回は仮想マシンを4台使いたかったので、1台あたりvCPU 1コアにしました。

### 構成要素の説明

- **AD-VM1**  
  ドメインコントローラー（AD DS）と証明機関（AD CS）を担当。  
  発行した証明書はWEBサーバーやADFSサーバーに適用しています。  
  また、タスクスケジューラを用いて定時にActive Directoryから社員情報を抽出し、  
  DBサーバー（SQL Server）へ送信する自動処理もこのVM上で実行しています。


- **AD-VM2**  
  セカンダリのドメインコントローラーとして動作し、ADFS（Active Directory Federation Services）によるSSO認証を処理します。

- **WEB-VM1**  
  IIS上でWebアプリケーションを提供します。アプリ本体はAzure Files上のHTML / JavaScript / PHPファイルを参照しています。

- **DB-VM1**  
  SQL Serverをインストールし、社員情報（社員番号・名前）を格納。Webアプリケーションからの検索要求に応答します。

- **Azure Files**  
  Webアプリケーションの静的ファイル（HTML / JS / PHP）を格納。WEBサーバーからマウントして参照されます。

## 処理の流れ

ここでは、社内ユーザーがWebアプリにアクセスしてから検索結果を得るまでの一連の処理を、2つのフェーズに分けて説明します。

- フェーズ1：SSO認証が完了し、アプリ画面が表示されるまで  
- フェーズ2：検索処理が実行され、結果が表示されるまで

---

### フェーズ1：SSO認証によるログイン処理

![azure_onpre_dousa (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037248/60f593f0-b2f5-45e5-ab10-6b1d116014ca.png)


1 **ユーザーがWebアプリにアクセス**  
ブラウザでWebアプリのURLにアクセスします。

2️ **WebサーバーがADFSへのリダイレクトを指示**  
Webサーバー（IIS）がSSO構成になっており、ADFSのログインページへリダイレクトを返します。

3️ **ユーザーがADFSに認証情報を入力**  
ADFSのログイン画面にユーザー名とパスワードを入力します。

![スクリーンショット 2025-04-11 17.19.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037248/c9a2e6b5-b93e-4f3c-8984-df464947361b.png)

4️ **ADFSが認証し、SAMLアサーションを発行**  
入力された情報をADと照合し、認証が成功するとSAMLトークン（アサーション）を発行します。

5️ **ユーザーがSAMLトークンを持ってWebサーバーへ戻る**  
トークンを持って再度Webアプリへアクセスします。

6️ **Webサーバーがトークンを検証し、アプリ画面を表示**  
SAMLトークンを受け取り、署名などを検証した後にWebアプリの画面を表示します。

![スクリーンショット 2025-04-11 17.20.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037248/d292b995-6c71-464f-8855-a326d5daf506.png)

---

### フェーズ2：検索処理の実行と結果表示

![azure_onpre_dousa2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037248/eed144af-db52-4dff-8066-384c721ecfc0.png)


7️ **ユーザーが社員番号を入力し検索を実行**  
アプリ画面の入力フォームに社員番号を入力し、検索ボタンを押します。

8️ **WebサーバーがSQL Serverに対してクエリを実行**  
バックエンドはPHPで構成しており、指定された社員番号に一致する名前をSQL Serverに問い合わせます。

9️ **SQL Serverが該当データを返す**  
該当するレコードをWebサーバーに返します。

10 **Webサーバーが結果をユーザーに表示**  
取得した名前をHTMLとして組み立て、ユーザーのブラウザに表示します。
![スクリーンショット 2025-04-11 17.21.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037248/d7b23900-7848-439b-b9b6-ea2a0fe064c2.png)

---
Windowsでwsl + Dockerの環境構築

# wslの設定とインストール
#### wslの設定
検索バーで"Windowsの機能の有効化または無効化を検索し、
以下機能にチェックをつけてOKを押す
・Hyper-V
・仮想マシンプラットフォーム
・Linux用Windowsサブシステム

#### wslのインストール
コマンドプロンプトを管理者として実行

```php:wslをインストール
wsl --install
```

```php:wslをアップデート
wsl --update
```

```php:ディストリビューションを確認
wsl --list --verbose
#or
wsl -l -v
```

```php:Ubuntuをインストール
wsl --install -d Ubuntu
```

```php:ディストリビューションの削除
wsl --unregister ディストリビューション名
```
# VScodeでUbuntu起動
VScodeの拡張機能でDev ContainersまたはRemote Developmentをインストールする
VScode内にインストールした拡張機能からwslの仮想環境を起動する

Remote Developmentの場合
”リモートエクスプローラー”→”WSLターゲット"→"Ubuntu"→"現在のウィンドウで接続する"

# Dockerの環境構築
https://docs.docker.com/engine/install/ubuntu/#installation-methods
VScodeからwsl/Ubuntuの仮想環境が起動していることを確認しターミナルを開く
```php:Dockerインストールのリポジトリ登録
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
```
```php:パッケージのインスール
#Install the Docker packages
 sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```

```php:実行中・停止中、両方のコンテナを表示
docker ps -a
or
docker ps -all
```

```php:実行中のコンテナを表示
docker ps
```

```php:コンテナを削除
docker rm <NAME>
```

```php:Dockerのバージョン情報を表示
docker version
```

```php:dockerのユーザー権限
#確認
getent group docker
#結果 docker: x :123:

#dockerグループにユーザーを追加する
sudo usermod -aG docker <ユーザー名>

getent group docker
#結果 docker: x :123: <ユーザー名>
```

```php:dockerのユーザー権限：root以外のユーザーおよびsudoアクセス権を持つユーザーがDockerコマンドを実行できるようにする手順
# dockerグループを作成
groupadd docker

# dockerサービスを再起動します。
service docker restart
#UNIXソケット/var/run/docker.sockは、dockerグループのメンバーによって読取りと書込みが可能

#Dockerアクセス権限が必要なユーザーをdockerグループに追加
usermod -a -G docker user1
```
# コンテナの作成
https://hub.docker.com/
https://hub.docker.com/_/python
#### コンテナを選択する


```php: 新しいコンテナの起動
#docker run <オプション> <イメージ> <コマンド>
#docker run -it --name test python:3.xx
docker run -it -v /mnt --name test python.3.12.8
```

オプション
-i	コンテナの標準入力にアタッチ
-t	疑似ターミナルを割り当て
-v　コンテナの任意のパスにますんと
--name	コンテナに名前をつける
割り込みの仕組み概要

質問：「割り込みというのはハードウェアの機能を使った仕組みなのですか？
ソフトウェアだけでは説明できない気がしています．」
以下はChatGPTの回答．

---

はい、その通りです！  
あなたの感覚は **とても正確**です。

> 🔑 結論から言うと：  
> **割り込み（Interrupt）とは、基本的に「ハードウェアの機能」を利用した仕組み**です。  
> ソフトウェアだけで「本当の意味での割り込み」は実現できません。

---

## 🔧 割り込みとは何か？ — ハードウェアの視点から

### ● 基本のイメージ：
CPUは通常、メモリにある命令を順に実行しています。  
でも、外部から「今すぐこれやって！」という要求（＝割り込み）が来ると、
➡ **現在の処理を中断して、別の処理（割り込みハンドラ）に飛ぶ**  
➡ 終わったら、もとに戻って再開

この「中断」こそが **ハードウェアによる制御**です。

---

## 💡 具体的には、こんな風に動いています：

| 要素 | 役割 |
|------|------|
| **ハードウェア（例：キーボード、タイマー、通信モジュール）** | 割り込み信号（INT）をCPUに送る |
| **CPU** | 割り込み信号を受け取ると、現在の命令実行を一時停止し、割り込みハンドラのアドレスへジャンプ |
| **割り込みベクタテーブル** | 割り込みごとに、どの処理関数にジャンプすべきかを定義したアドレス表 |
| **ソフトウェア（割り込みハンドラ）** | ハードウェアからの信号に応じて実際の処理を記述（例：受信データを読み込むなど） |

---

## 🚫 ソフトウェアだけで割り込みはできるの？

- いわゆる**「割り込み風」の処理**（イベント駆動やポーリング）はソフトウェアだけでもできます。
- しかし、「CPUの処理をハード的に一時中断させ、即時対応させる」という本来の意味での**割り込みはソフトウェアだけではできません**。
- なぜなら、「中断してジャンプする仕組み」自体が**CPU内部のハードウェアロジック**だからです。

---

## ✅ だから「割り込み駆動型」はハードウェア＋ソフトウェアの協調

- ハードウェアが信号を出す
- CPUが割り込みを受ける
- ソフトウェア（あなたが書いたハンドラ関数）が処理する

この三者がうまく連携することで、**リアルタイムかつ効率的な応答**が可能になります。

---

もし、もっと具体的に「CPUの中で何が起きてるのか？」とか「割り込み禁止ってどうやってるの？」など、さらにディープな仕組みに興味があれば、そこもお伝えできますよ。  
気になる方向で深掘りしましょう！
【WSLトラブル】Windowsからのファイルコピーで謎の`:Zone.Identifier`ファイル大量発生した話

## 【WSLトラブル】Windowsからのファイルコピーで謎の`:Zone.Identifier`ファイル大量発生？原因と削除方法を解説

みなさんこんにちは！
普段WindowsとWSL (Windows Subsystem for Linux) を行き来しながら開発している皆さん、こんな経験はありませんか？

WindowsのエクスプローラーからWSL上のディレクトリにファイルをドラッグ＆ドロップやコピペで持ってきたら、いつの間にか元のファイル名の後ろに `:Zone.Identifier` が付いた、サイズ0の謎のファイルがたくさん作られていた…！

```bash
$ ls -alh
-rw-r--r-- 1 user user 4.5K Apr 11 16:46 init.sql
-rw-r--r-- 1 user user    0 Apr 11 16:44 init.sql:Zone.Identifier # ← なんだこれ！？
-rw-r--r-- 1 user user 8.2K Apr 11 16:46 config.yaml
-rw-r--r-- 1 user user    0 Apr 11 16:44 config.yaml:Zone.Identifier # ← こっちにも！
```

邪魔だし、数が増えると単純に見づらいですよね。これ、一体何者で、どうすれば消せるのでしょうか？
今回は、この `:Zone.Identifier` ファイルの正体と、安全かつ効率的に削除する方法について解説します。

### `:Zone.Identifier` って何？ ADS？ xattr？

最初、このファイルを見たときなんだこれは？と思いましたが、調べてみるとWindowsの代替データストリーム (Alternate Data Stream, ADS)機能がLinux環境にゴミをたくさん作っているということが判明しました。

背景として、Windowsはインターネットからダウンロードしたファイルなどに出所情報を示すゾーン識別子 (Zone Identifier) をADSとして付与することがあります。WSL (特にWSL2) がLinuxファイルシステム (ext4など) を使うようになり、この情報が `user.Zone.Identifier` というxattrとして引き継がれるケースがあるようです。

`ls -al` の出力結果を見てみましょう。

```bash
-rw-r--r-- 1 user user    0 Apr 11 16:44 readme.md
-rw-r--r-- 1 user user    0 Apr 11 16:44 readme.md:Zone.Identifier
```

これはLinuxファイルシステム (ext4など) にADSやxattrが付与されている状態ではなく、**単純に `readme.md:Zone.Identifier` というファイル名を持つ、サイズ0の独立したファイル** として存在していることを示しています。

試しに、拡張属性を削除するコマンド `setfattr` を使ってみても…

```bash
$ setfattr -x user.Zone.Identifier readme.md:Zone.Identifier
setfattr: readme.md:Zone.Identifier: No such attribute # 属性がないよ！と怒られる
```

これは拡張属性を管理するファイルではなく、ファイル名にコロン `:` が含まれているだけのゴミファイルのようでした。

### `:Zone.Identifier` ファイルを削除する方法

とりあえず不要なファイルは削除したいですよね。正体が「ファイル名にコロンが含まれる通常のファイル」だと分かれば、削除は簡単です。Linuxの標準的な `rm` コマンドが使えます。

**1. 特定のファイルを削除する場合**

```bash
# ファイル名を正確に指定して削除
rm readme.md:Zone.Identifier

# 削除されたか確認
ls -al 
```

ファイル名に特殊文字が含まれている場合は、クォーテーションで囲むか、バックスラッシュでエスケープする必要があるかもしれませんが、今回の `:` に関してはそのまま指定して問題なさそうでした。

**2. 大量にあるファイルを一括削除する場合**

ディレクトリ内に大量の `:Zone.Identifier` ファイルがある場合は、`find` コマンドを使うのが効率的です。

**重要:** `rm` や `find ... -delete` はファイルを完全に削除するコマンドです。実行前に、本当に削除したいファイルだけが対象になっているか確認することを強く推奨します。

```bash
# カレントディレクトリ以下にある `:Zone.Identifier` で終わるファイルを検索して表示 (確認用)
find . -type f -name '*:Zone.Identifier' -print

# 確認後、問題なければ実際に削除 (-delete オプション)
find . -type f -name '*:Zone.Identifier' -delete

# もしくは -exec rm {} \; を使う場合 (少し遅いが確実)
find . -type f -name '*:Zone.Identifier' -exec rm {} \;
```

まず `-print` で削除対象となるファイルリストを表示し、意図しないファイルが含まれていないか確認してから、`-delete` オプションや `-exec rm {} \;` で削除を実行しましょう。これで、散らかった `:Zone.Identifier` ファイルを一掃できます。

### まとめ

WindowsのエクスプローラーからWSLへファイルをコピーした際に生成される `:Zone.Identifier` ファイルは、ADSやxattrではなく、単にファイル名にコロンが含まれたサイズ0の通常ファイルでした。

標準的ではない挙動のため原因特定は難しいですが、不要であれば `rm` コマンドや `find` コマンドを使って安全に削除できます。

もし同じ現象で困っていたら、ぜひこの方法を試してみてください！
コミット、ブランチ、プルリクにはプレフィックスをつけよう〜💪

## はじめに

開発をしていて、コミットメッセージやブランチの命名、

プルリクのタイトルって悩みませんか？

私はそれなりに悩みます💦

悩んだは良いものの、上記の内容に色々と込めようとして、

良かれと思って説明的になってしまい、

色々と書き過ぎて冗長になってしまうことってありますよね。。。

まぁ、私はあります😅

それに、これらの命名を考えるのもちょっと面倒ですよね💦

まぁ、私も面倒です。。。

そこで読み手にとってより簡潔で分かりやすくなり、

かつ楽に運用できそうな方法がありましたので、

今回はこれを記事にしてみたいと思います！

## プレフィックスをつけてみよう💪

結論から言うと
<br>

**プレフィックスをつける**

<br>
たったそれだけです。

例えば何らかの新規開発、機能追加であるならば...

```
feat or feature
```

これをプレフィックスとしてつけてみましょう。

```
feat/何を？

feat:何を？
```

こんな感じですね。

同様に修正系ですと...

```
fix/何を？

fix:何を？
```

リファクタリングですと...

```
refactor/何を？

refactor:何を？
```

テスト関連ですと...

```
test/何を？

test:何を？
```

それ以外の雑多なものなら...

```
chore/何を？

chore:何を？
```

こんな感じですね。
<br>

https://www.conventionalcommits.org/en/v1.0.0/

<br>
こちらで紹介されているプレフィックスを使って運用すると

なお良さそうですね☺️

Jiraを使っているならブランチの『何を？』にチケット番号を付けることで

トレーサビリティも担保出来ますし、

より内容も手短に出来ますので良いですよ〜🎶

...

あれっ、これってJiraの運用でも使えるのでは。。。！？

<br>
to be continued...

## 参考

https://www.conventionalcommits.org/en/v1.0.0/
VPN(GlobalProtect)のSIG内でWSLを使用するための設定


# VPN(GlobalProtect)対応の実施
GlobalProtectというVPN製品が提供するSIG(Secure Internet Gateway)の環境下で、WSL2上のWebアクセス系コマンドがx509エラーになることがあります。

参考記事：

https://qiita.com/rabut/items/1393d8999ebd79ad4fcb

本記事は、その回避方法を記載したものです。

ザックリとは、wsl-vpnkitを導入し、VPN用のルート証明書をWSL2上のLinuxにインストールすることで、現象を回避できます。 以下、その手順です。


## 1. wsl-vpnkitの導入
まず、wsl-vpnkitを導入します。

参考記事：
https://zenn.dev/xeres/articles/2023-10-05-install-wsl-vpnkit

なお、参考記事にもありますが、Windows 11環境ではMirrored モードを使用した方がいいかもしれません。私の環境は10だったので、とりあえずこれで。


### 1.1. wsl-vpnkitの入手
以下から最新(※)のwsl-vpnkit.tar.gzを入手。(※)2025年3月30日時点ではv0.4.1 
https://github.com/sakai135/wsl-vpnkit/releases/

格納先はどこでもいいですが、以降の手順をコピペでやりたい方は「D:\wsl\wsl-vpnkit」直下に保存してください。 

### 1.2. wsl-vpnkitのインストール
ホストのWindowsからPowershellで以下を順に実行し、wsl-vpnkitSのインストールを実施。 
```Powershell:
cd D:\wsl\wsl-vpnkit # wsl-vpnkit.tar.gz格納先
wsl --import wsl-vpnkit --version 2 D:\wsl\wsl-vpnkit wsl-vpnkit.tar.gz
```

### 1.3. wsl-vpnkitの自動起動設定
wsl-vpnkitが自動起動するように設定します。

以下、WSL上でWebアクセスをさせたいディストリビューション(ゲストOS)の名前が「Ubuntu」である前提で手順を記載します。必要があれば読み替えてください。


まず、Ubuntuの/etc/wsl.confに以下を設定しsystemdを有効化してください。
```:/etc/wsl.conf
[boot]
systemd=true
```

Ubuntuで以下を実行し、systemdにwsl-vpnkitの起動を追加し、有効化します。
```sh:
wsl.exe -d wsl-vpnkit --cd /app cat /app/wsl-vpnkit.service | sudo tee /etc/systemd/system/wsl-vpnkit.service
sudo systemctl enable wsl-vpnkit
 ```
 
ホストのWindowsのコマンドプロンプトから以下を実行してUbuntuを再起動します。
```
wsl --shutdown
wsl -d Ubuntu
```


## 2. ゲストOSへVPN用ルート証明書をインストール
次に、UbuntuにVPN用のルート証明書をインストールし、SSLのエラーを抑止します。

参考記事: 

https://qiita.com/rabut/items/1393d8999ebd79ad4fcb

### 2.1. ホストOSからVPN用ルート証明書を取得
ホストのWindowsのコマンドプロンプトから以下を実行し、証明書ストアを起動。
```
certmgr.msc
```
起動した画面から「信頼されたルート証明書」⇒「証明書」を開いて、VPN(GlobalProtect)用の証明書を探してください。多分、名前にVPNとかSIG(Secure Internet Gateway)とかが入っているような気がします。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/80071d4d-ce79-4172-ac74-dde7460b28f5.png)

証明書を見つけたら、「右クリック」⇒「すべてのタスク」⇒「エクスポート」を選択し、証明書のエクスポート ウィザードを起動。 
さらに「次へ」をクリックすると、以下の画面になります。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/ae0bf41d-46c3-4355-89a4-1a8827acc0d6.png)

「Base 64 encoded X.509」を選択し、「次へ」をクリック。 
ファイル名を指定する画面が起動するので、「D:\wsl\wsl-vpnkit\certification_for_VPN.cer」を指定して「次へ」をクリック。 
完了画面が表示されるので、「完了」をクリック。

### 2.2. ゲストOSへ証明書をインストール
Ubuntuで以下のコマンドを順に実行。

```
sudo cp /mnt/d/wsl/wsl-vpnkit/certification_for_VPN.cer /usr/local/share/ca-certificates/certification_for_VPN.crt
sudo update-ca-certificates
```

### 2.3 動作確認
Ubuntuで以下を実行し、エラーにならないことを確認。
```
wget https://www.google.com -O /tmp/test
```

実行例 
```
$  wget https://www.google.com -O /tmp/test
--2025-04-11 16:58:15--  https://www.google.com/
Resolving www.google.com (www.google.com)... 172.217.161.196
Connecting to www.google.com (www.google.com)|172.217.161.196|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘/tmp/test’

/tmp/test                                 [ <=>                                                                   ]  17.67K  --.-KB/s    in 0.01s

2025-04-11 16:58:15 (1.39 MB/s) - ‘/tmp/test’ saved [18099]```
```

以上で、WSL2のLinuxからSSLを用いた通信が可能になります。
Coqのコードをopamに登録する方法 

# Coqのコードをopamに登録する方法 

Rocq(旧Coq)のopamリポジトリはこちら: https://github.com/rocq-prover/opam
基本的にはこちらにPRを投げることでopamリポジトリに登録してもらう．これはopamのデフォルトリポジトリではないが，Rocq使う人がみんな入れているリポジトリなのでほぼ公式みたいな存在．

* forkする
* opamファイルを追加する
* PRとしてなげる

## `coq-extra-dev` に登録するには

こちらリポジトリは開発用なので，どんなものでもバンバンいれられそう．

https://github.com/rocq-prover/opam/tree/master/extra-dev/packages

* ↑上記の場所にディレクトリを一つ新規追加する
    * ディレクトリ名は `rocq-{プロジェクト名}/rocq-{プロジェクト名}.dev/` とかにしがち
* そのなかに `opam` という名前で opamファイルを配置する


## `coq-released` に登録するには

まずは自分のリポジトリでタグを打って，releaseしておくのがよさそう

https://github.com/rocq-prover/opam/tree/master/released/packages

* 上記の場所に `rocq-{プロジェクト名}/rocq-{プロジェクト名}.{バージョン}/opam` というファイルを追加
* opamファイルの `url` セクションをgithubのリリースの tar.gz のリンクにする
* 手元にtar.gzをダウンロードして checksumを取る
    * `shasum -a 256 ~/Downloads/{ファイル名}.tar.gz` とか
* 適当なブランチにcommitしてPR作成
cのenum

自分用

common.h

```
#ifndef __COMMON_H__
#define __COMMON_H__

#define DEFINE_ENUM_WITH_STRINGS(name, LIST)               \
    typedef enum name                                      \
    {                                                      \
        LIST(DEFINE_ENUM_ELEMENT)                          \
    } name;                                                \
                                                           \
    static inline const char *name##_to_string(name value) \
    {                                                      \
        switch (value)                                     \
        {                                                  \
            LIST(DEFINE_ENUM_CASE)                         \
        default:                                           \
            return "UNKNOWN";                              \
        }                                                  \
    }

#define DEFINE_ENUM_ELEMENT(e) e,
#define DEFINE_ENUM_CASE(e) \
    case e:                 \
        return #e;

#endif

```

test.c
```c
#include <stdio.h>
#include "common.h"

#define COLOR_ITEMS(X) \
    X(RED)             \
    X(GREEN)           \
    X(BLUE)

DEFINE_ENUM_WITH_STRINGS(Color, COLOR_ITEMS)

extern void fruits(void);

int main(void)
{
    printf("%s(%d)\n", Color_to_string(1), GREEN);
    fruits();
    return 0;
}

```

test2.c
```c
#include <stdio.h>

#include "common.h"

#define FRUITS_ITEMS(X) \
    X(APPLE)            \
    X(GRAPE)            \
    X(ORANGE)

DEFINE_ENUM_WITH_STRINGS(Fruits, FRUITS_ITEMS)

void fruits(void)
{
    printf("%s(%d)\n", Fruits_to_string(2), ORANGE);
}

```


何かもっと良い方法があった気がするのだけど
見つけきれなかったのでとりあえずこれで

出力サンプル

```shell
tyano ~$ gcc test.c test2.c 
tyano ~$ ./a.out 
GREEN(1)
ORANGE(2)
```


# 値指定版

```
#include <stdio.h>

#define DEFINE_ENUM_WITH_STRINGS(Name, LIST) \
    typedef enum Name {                      \
        LIST(EXPAND_ENUM, EXPAND_ENUM_VAL)   \
    } Name;                                  \
    static const char *Name##_to_string(int v) {       \
        switch (v) {                                    \
            LIST(EXPAND_CASE, EXPAND_CASE_VAL)         \
            default: return "UNKNOWN";                 \
        }                                              \
    }

#define EXPAND_ENUM(name) name,
#define EXPAND_ENUM_VAL(name, val) name = val,

#define EXPAND_CASE(name) case name: return #name;
#define EXPAND_CASE_VAL(name, val) case name: return #name;

```

```c
#define COLOR_LIST(X, X_VAL) \
    X(RED)                   \
    X(GREEN)                 \
    X(BLUE)                  \
    X_VAL(BLACK, 1000)       \
    X(WHITE)

DEFINE_ENUM_WITH_STRINGS(Color, COLOR_LIST)
```
機械学習データセット調達完全ガイド、データ調達の安全要件を解説

# はじめに
機械学習モデルの精度向上には、高品質かつ多様なトレーニングデータが不可欠です。しかし、データ調達のプロセスにおいては、データの質だけでなく「安全性」も重要な要素となります。特に個人情報やセンシティブなデータを取り扱う際、適切な管理とコンプライアンス遵守が求められます。本記事では、「安全管理を徹底した機械学習向けデータセット」とその調達方法について詳しく解説します。

# なぜデータ調達における安全管理が重要なのか？
AI技術の進化に伴い、企業や研究機関でのデータ利用が増加しています。しかし、データ収集・管理における不備は次のようなリスクを引き起こす可能性があります：

### プライバシー侵害 
個人情報を含むデータが不正利用されると、法的責任や信頼失墜につながります。
データ漏洩: サイバー攻撃や内部ミスによるデータ漏洩は、企業のブランド価値を大きく損ないます。
### コンプライアンス違反
GDPR（一般データ保護規則）やCCPA（カリフォルニア消費者プライバシー法）などの国際規制に違反すると、巨額の罰金が課される場合があります。

これらのリスクを回避するために、データ調達の段階から厳格な安全管理を行うことが必要です。

# 安全管理を徹底したデータセットの特徴
安全管理を徹底した機械学習向けデータセット」は、以下の特長を持っています：

### プライバシー保護への配慮

匿名化処理: 個人情報を含むデータはすべて匿名化または仮名化されています。これにより、特定の個人を識別することが不可能になります。

データ最小化原則: 必要最小限のデータのみを収集し、過剰な情報収集を避けます。

### コンプライアンス対応

####  国際規制準拠
GDPR、CCPA、日本の個人情報保護法など、主要なプライバシー規制に対応したデータ収集プロセスを採用しています。

#### データ提供元から同意取得
データ提供者からの明確な同意を得ることで、データ使用範囲・禁止事項に対して明確化になっています。倫理的なデータ活用を実現します。

#### データ使用許諾締結
お客様との間にデータ使用許諾書を締結、データ使用範囲や権益を明確化にしています。

#### 使用権利の明確化
カスタマイズデータ収集・カスタマイズ案件に対して、データ権利はお客様に属し、納品してからデータの完全破棄が義務付けられています。

#### 技術的・人的なデータ安全環境の整備
データ処理に関わるスタッフは機密保持に関するトレーニングを受け、機密保持契約書に署名しています。リソースファイルの安全な暗号化、音声ファイルの違法コピー防止、データ収集セキュリティ、ビジネスロジックセキュリティ、ID認証、アクセス制御など、技術レベルでデータセキュリティを保障しています。

### 品質管理の徹底

専門チームによる検証: 収集されたデータは、専門チームによって厳格な品質チェックを受けます。ラベル付けの正確性やデータの一貫性を保証します。
多様性確保: 年齢、性別、地域、文化背景など、多様な属性を網羅したデータセットを構築することで、バイアスを最小限に抑えます。

# 安全管理を徹底したデータ調達のステップ
データ調達のプロセスにおいて、以下のステップを踏むことで安全管理を徹底できます。

### 目的の明確化
まず、どのような目的でデータが必要かを明確にします。例えば、自然言語処理（NLP）モデルのためのテキストデータ、画像認識モデルのための写真データなど、目的に応じて必要なデータ種別を決定します。

### データソースの選定

信頼できるデータソースを選ぶことが重要です。当社では、以下のような安全なデータソースを活用しています：

公開データベース

合意に基づく個人データ提供

パートナー企業との協力

### データクリーニングと加工
収集したデータは、ノイズや不要な情報を除去し、機械学習モデルに適した形式に加工します。この段階で、プライバシーに関わる情報を削除することも行います。

### セキュリティ対策の導入
データの保管・共有には、以下のようなセキュリティ対策を講じます：

暗号化技術の活用

アクセス制限の設定

定期的なセキュリティ監査

# まとめ

以上、様々な視点からデータ調達時の要点を解説しました。気をつけながらデータセットをお選びいただければい幸いです。
QiitaへGoogle Slidesを埋め込む方法

Qiitaでできることを調べていたら、スライドが埋め込めるとあったのでチャレンジ。
共有リンクをiframeの`src=""`に指定したら編集ページが表示されてしまった。
埋め込み用のiframeタグを発行させる必要があり、地味に迷ったので共有。

## 参考

https://qiita.com/Qiita/items/612e2e149b9f9451c144

## ゴール
<iframe src="https://docs.google.com/presentation/d/e/2PACX-1vQ-NILDlQLvr_a6rHMEaVj9TcElDrzdD6Ga8eG9nYOLvrxeg9Vhnogx0HxnMRRg7KBA3QR9TPIUZtpa/embed?start=false&loop=false&delayms=3000" frameborder="0" width="900" height="440" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"></iframe>

## 手順
- GooleSlides「メニュー」→「ファイル」→「共有」→「ウェブに公開」
- 「埋め込む」タブを選ぶ
- 生成されたiframeタグをコピー
- それをQiitaに貼る！

## 調整
iframeサイズ比率を以下のようにしてみた。
```html:HTML
width="900" height="440"
```
【AWS構築】AutoScalingの自動スケーリングを負荷テストで確かめる

# 前提
・AutoScalingグループは作成済みでEC2が1台起動
・EC2にはSSM接続orSSH接続可能

## 負荷テストの概要

色々Linuxに負荷をかける方法はありますが、今回はFork爆弾というコマンドを使用します。
(リポジトリからパッケージインストールも面倒だしね）

```bash
:(){ :|:& };:
```

上のコマンドは:で定義された関数を無限に呼び出してプロセスを占領するコマンドです。（フォーク爆弾）
Linuxのデフォルトでは、ulimit -uがunlimitedになっているため、無限にプロセスが生成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801383/7c010abe-51eb-4223-8854-7f433792b252.png)



使い捨てのEC2とはいえ爆発的に増加するのは怖いので10万ぐらいに上限を制限しておきます。

```
ulimit -u 100000
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801383/c8bff673-adb5-4275-8c5e-428048c79b10.png)


## コマンド実行

EC2のモニタリングでCPU使用率（％）メトリクスを確認しましょう。
当たり前ですが、100％になっています。（SSH接続も落ちました）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801383/24ea598f-d2e2-4504-95af-8be77a62d3ca.png)

AutoScalingグループを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801383/cd28f11f-b2f2-476d-a96f-e8c50dbc6520.png)
↑インスタンスの台数が1台増えて2台になっています。スケーリングされています。



## 反省
すぐに100％になったので、本当に50％閾値でスケーリングされているのかはよくわからなかった...
stress使う方がテストとしては確実。。。
MCPを使ってみる

昨日、Cursorの使い方で撃沈したけど、MCPはできたはず…今日はCursorの使い方をテーマにするか？5月の
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2559587/390802fb-ebbe-4407-9f13-0ce61b270951.png)

https://modelcontextprotocol.io/clients

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2559587/5e82daec-672e-49b7-a830-589d42706a3b.png)

開いた。チャット欄周辺にはMCPを指定するようなところが見当たらない。

Claudeに聞いてみた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2559587/fcb0941a-8d6a-4f93-8bfe-fc4cb3c4a2f9.png)

返答が手短で好印象。[Claude] > [設定…] > [開発者]にあった。

[はじめる]をクリックしたら、MCP公式のServerのQuick Startに飛んだな👀
サイドバーを見るとFor Claude Desktop Usersがあったので、そちらを見てみる。
[構成を編集] をクリックするのが正解だったようだ。
https://qiita.com/kaisumi/items/bbcb771d8589c2d526ab
昨日↑で作ったサーバーはMCP仕様を満たしていないことが発覚したので、修正した。
```json
{
  "mcpServers": {
    "local": {
      "url": "http://localhost:8000"
    }
  }
}
```
Claude Desktopを再起動したら、
うまくいかない。公式の例をそのまま試してみることにした。
```json
{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "/Users/username/Desktop",
        "/Users/username/Downloads"
      ]
    }
  }
}
```
だめだった😞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2559587/ff4cc35e-ae5f-4766-8bd6-14c642f44dc1.png)

あ、でも何かしらは登録されている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2559587/49389c15-9650-4dfe-8e54-6ff162472f1f.png)

MCPを使う側面から、MCPについて理解したことを言語化した：

https://zenn.dev/kaisumi/articles/61ab096fc10aca
マテリアライズド・ビューをグループ・リフレッシュしたい

# はじめに

マテリアライズド・ビューをグループ・リフレッシュに対応させたあと、実際にグループ・リフレッシュするまでの手順を紹介します。

# 手順

## ① リフレッシュ・グループの作成

まずはリフレッシュ・グループを作成します。

```SQL
EXECUTE DBMS_REFRESH.MAKE(name => 'GRP001', list => '', next_date => '', interval => '');
```

以下のクエリにより、リフレッシュ・グループが作成できたことを確認します。

```SQL
SELECT RNAME FROM USER_REFRESH;
```

|RNAME |
|:-----|
|GRP001|

## ② マテリアライズド・ビューの追加

作成したリフレッシュ・グループにマテリアライズド・ビューを追加します。

```SQL
EXECUTE DBMS_REFRESH.ADD(name => 'GRP001', list => 'M001');
EXECUTE DBMS_REFRESH.ADD(name => 'GRP001', list => 'M002');
EXECUTE DBMS_REFRESH.ADD(name => 'GRP001', list => 'M003');
```

以下のクエリにより、マテリアライズド・ビューが追加できたことを確認します。

```SQL
SELECT NAME, RNAME FROM USER_REFRESH_CHILDREN
```

|NAME|RNAME |
|:---|:-----|
|M001|GRP001|
|M002|GRP001|
|M003|GRP001|

## ③ グループ・リフレッシュの実行

作成したリフレッシュ・グループを指定して、グループ・リフレッシュを実行します。

```SQL
EXECUTE DBMS_REFRESH.REFRESH(name => 'GRP001');
```

USER_MVIEW_REFRESH_TIMESテーブルのLAST_REFRESHカラムを確認し、リフレッシュ・グループに所属するマテリアライズド・ビューがすべてリフレッシュできたことを確認します。

```SQL
SELECT NAME, LAST_REFRESH FROM USER_MVIEW_REFRESH_TIMES
```

|NAME|LAST_REFRESH          |
|:---|:---------------------|
|M001|3/17/2025, 12:45:38 PM|
|M002|3/17/2025, 12:45:38 PM|
|M003|3/17/2025, 12:45:38 PM|

# 環境情報

- Oracle Database 23ai EE Extreme Perf Release 23.0.0.0.0 - for Oracle Cloud and Engineered Systems
【Unity】I2 Localization 言語ごとにフォントを変更したい時

# 言語ごとのフォント設定

## Assets内で`I2`で検索
![スクリーンショット 2025-04-11 154226.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3847430/dc5c7870-a189-4ffa-8dc2-2f66ef006fbc.png)

## `I2 Languages (Language Source Assets)`を選択
![スクリーンショット 2025-04-11 154416.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3847430/12768f88-c2d8-46b8-a06b-887a179773ef.png)

## `Terms`を選択（多分初期選択されている）
![スクリーンショット 2025-04-11 154546.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3847430/032aad1d-7f05-496d-a39b-e993d86706b7.png)

## `LiberationSans SDF`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3847430/43b28849-0c42-4861-9272-cf69fc9b45cb.png)

ここで各言語ごとにフォント設定すればOK
venvを使用したPython開発環境構築

# ターミナルを開いてから作業を開始する

#### 指定場所へのフォルダ作成-フォルダ移動まで

```php:作業しているディレクトリを絶対パスで表示
pwd
```

```php:プログラムを作成したいディレクトリへ移動
#cdと入力した後 フォルダのドラッグ&ドロップでも可
#cd ../で一つ上の階層へ移動
#desktopが移動先になるので自由に変更する
cd desktop
```

```php:新規ディレクトリを作成
#testがフォルダ名となる　仮でtestを入れています
mkdir test
```

```php:新規ディレクトリに移動
#ディレクトリ名に合わせる 仮でtestを入れています
cd test
```

```php:ファイルやディレクトリの一覧を表示
#現在のディレクトリを確認
pwd
#現在のディレクトリの一覧表示を行い何もないことを確認
ls
```

# Pythonのvenv仮想開発環境を作成
```php:ファイルやディレクトリの一覧を表示
#2番目のvenvが仮想環境名　　　仮でvenvとする
python -m venv venv
```

```php:venv仮想開発環境の起動
#venvが仮想開発環境名　    　仮でvenvとする
.\venv\Scripts\activate
 ```

```php:pip(Python Package Installer)のアップグレード
#pipをアップグレードしていないとライブラリのバージョンインストールに影響がでることがある
pip install --upgrade pip
#or
pip install -U pip

#別のアップグレード
#Python経由でpipを呼び出してインストール 使用中のPython環境で確実にpipを使える
python -m pip install --upgrade pip
```

```php:requirements.txtライブラリのインストール
#git clone等でrequirements.txtが用意されている場合
pip install -r requirements.txt
```

```php:venv仮想開発環境の終了
deactivate
```
技術的負債を完全に防止することは無理！！というお話

# はじめに
webアプリを個人開発する機会があり、自由な個人開発なのだから技術的負債をゼロにするぞ！！と息巻いたものの敗北したお話です。技術的負債にどう向き合うべきかまとめました。
割と当たり前な内容ですが、折角経験したので残しておきます。

# 結論
- 技術的負債をゼロにするために頑張るなら、サービスに力を注ぐのもあり
- 技術的負債は適切なものと、不適切なものに分かれる
- 適切な技術的負債は状況によっては受容すべきだが、返済計画は立てるべき

# 技術的負債とは何か
議論の前に、前提となる「技術的負債とは何か」を抑えておきます。

:::note info
設計、フレームワーク、言語、コードに関し、継続的に開発を行う上で理想状態から離れたもの
:::

つまりは「あるべき」ではない状態です。
さらに、マーティン・ファウラーは、技術的負債を４象限に分けて整理しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4027860/d3269340-f6de-425d-9bd5-d88cc7f170b6.png)
(引用：@hirokidaichi, https://qiita.com/hirokidaichi/items/c66682a64ac2fc59cdf3)

このうち慎重な無意識の領域については、リリース後に初めて発覚するものなので、開発中に気付くのは原理的に無理です。
さらに慎重で意図的な領域の負債は許容すべきだと思う場面が多くありました。

# 慎重で意図的な技術的負債
この領域は、技術的負債を自覚したうえでスピード、リリース、コストを優先して敢えて負債をこしらえます。
例えば、今回の開発では設計をかなり妥協しています。
そもそも設計書を必要最低限しか作っていません。作ったのは下記ぐらいです。
- テーブル設計書
- 特に複雑なロジックの基本、詳細設計書
以上。
絶対特大の負債をこしらえています。
しかし、詳細完璧な設計書を作ったところでサービスが売れずに没になったら設計書も闇に葬られます。
それであれば最低限動くサービスをいち早く作って市場に投入して、継続していける見込みが立てばリバースエンジニアリング方式で設計書を作ったほうがよっぽど生産的です。
上記のような理由で妥協している箇所が他にもあり、現在進行形で負債は膨らんでいます。

# ではどうするのか
負債が膨らんでいる以上、返済計画を立てなければいけません。無計画な負債は、遠くない将来に首が回らなくなります。
今回の開発では、特にいくつかの対策を講じて返済計画としています。
### 概要
- ソースコードに実装意図を細かく書いておく
- 複雑なSQLは生のSQLをソースコードにコメントで埋め込む
- 将来的な修正はGitHub Issuesに起票しておく

### 詳細
#### ソースコードに実装意図を細かく書いておく
 ロジックの内容はコードを読めば分かるので、ロジックの意図、理由を細かく記載します。
一人開発であっても、理由や意図は時間経過とともに忘れていくのでしつこいぐらいに書きます。
#### 複雑なSQLは生のSQLをソースコードにコメントで埋め込む
今回の開発ではlaravelを採用しており、Eloquentというライブラリを使っています。
```sql
return User::select('name')
                ->where('id', 〇〇〇〇)
                ->where('deleted_at', null)
                ->get();
```
SQLをこんな感じに書けて便利なのですが、複雑なSQLになっていくと読むのが若干厄介になっていきます。そのため、動作確認も兼ねて適当なSQLエディタで生のSQLを書いて整形した後に、コメントとしてそのままコードに埋め込みました。
これはコードが冗長化することに繋がり兼ねないので良し悪しですが、自分のようなよわよわレベルだと生のSQLを書いておいたほうが後々把握しやすいのでこうしています。

 #### 将来的な修正はGitHub Issuesに起票しておく
issueとして起票しておくと、どの程度自分が負債を作っているのか可視化出来ます。
後々、把握していない負債が爆発するリスクを低減出来るとともに、リファクタリングする際にコミットやプルリクエストにissueを紐づけることでリファクタリング内容や意図を明確にすることが出来ます。
スプレッドシートやNotionで変更管理するよりは、変更を追いやすいと感じています。

# さいごに
個人開発は誰に縛られることもなく自由なので、せめて意図的な技術的負債は防ぎたいと思っていました。
しかし、主にリソース不足が原因でチーム開発よりむしろ増えた実感あります。
慎重な無意識の領域については言わずもがな、チーム開発ならシニアエンジニアに相談出来た部分を独力で解決しなければならないため、膨大な量の負債を溜め込んでいる自覚があります。

某Vtuber上場大手事務所のテックマネージャーの方を会話をする機会があり、その際に「技術的にも経営的にも安定した今、注力しているのは技術的負債の返済」と話されていたのが印象的でした。
大抵の負債はどこかで返済する必要があり、放置するほど開発が進み肥大化するので、せめて返済しやすいように準備しておきたいものです。
Cursorエディタのチャットウィンドウで、Ctrl-n で新しいチャットを開かないようにする（次の行に移動する）

キーバインドの設定から、`Cursor: New Chat` のキーバインドを Ctrl-n から変更する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47327/e55136e1-5607-4459-8119-ce18923ae6e3.png)


自分の場合には New Chat なので `Ctrl - n - c` にしました。

教えてくれた森くんありがとう。
そして知っていたけど教えてくれなかったq隊長…。
【UE5】EnumをC++で作成する方法メモ

タイトル通りです。
EnumはC++で宣言しないとC++で使えないということで、やり方を自分用にメモしました。

## Enum宣言用のクラス作成
Noneで作成する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115955/d0b4e857-2ebc-4b95-8de2-d6922394140c.png)



## C++実装
そもそも.cppはいらないので消す。
ヘッダーファイル（.h）でEnumを宣言する

```c++:EnumDeclaration.h
#pragma once

#include "CoreMinimal.h"
#include "EnumDeclaration.generated.h"

UENUM(BlueprintType)
enum class EMyEnum : uint8
{
    // 追加した列挙子
    Default = 0     UMETA(DisplayName = "Default"),
    Orange = 1    UMETA(DisplayName = "Orange"),
    Peach = 2     UMETA(DisplayName = "Peach"),
};
```

UEエディターを閉じてフルビルドして終わり。

## 参考

https://colory-games.net/site/ue_cpp_make_enum/
個人的備忘録：Mermaidを使ってNotionにデータベース構成図を描いてみた

## はじめに

Notionは、メモやタスク管理、データベース作成など、あらゆる情報を一元管理できる便利なツールです。

https://www.notion.com/ja

そんなNotionには、ちょっとしたコードで図を描画できる「Mermaid」という機能があります。今回は、Mermaidを使って簡単なデータベース（DB）の構成図を作る方法についてご紹介します。


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

最近、個人開発やチームでのアプリ開発に関わる中で、「データベースの構造を視覚的に説明したい」と感じる場面が増えてきました。図を手描きするのもいいですが、あとから編集しにくかったり、共有が面倒だったりします。

そんなとき、Notionの中で完結できる方法を探していて出会ったのが「Mermaid」です。

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

テキストで簡単に図を描ける上に、Notionでの共有もスムーズ。特にER図（エンティティ・リレーション図）をサッと描きたいときに非常に便利でした。

「コードっぽいけど覚えやすい」「図としても十分に読みやすい」という点で、初心者にもおすすめです。

## Mermaidを使ったDB構成図の例

コードブロックで `mermaid` と書き、以下のような記述を加えるだけでER図が作れます：

```
erDiagram
    USERS ||--o{ POSTS : has
    POSTS ||--o{ COMMENTS : has
    USERS ||--o{ COMMENTS : writes

    USERS {
        int id
        string name
        string email
    }

    POSTS {
        int id
        int user_id
        string title
        string content
    }

    COMMENTS {
        int id
        int post_id
        int user_id
        string comment
    }
```

**実際の作成したER図について**

![Screenshot 2025-04-11 at 15.03.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/c81b58e7-f489-410c-ac9a-2ff81617c9c8.png)

この図は以下のような関係性を表しています：
- `USERS` テーブルは複数の `POSTS` を持ちます（1対多）
- `POSTS` は複数の `COMMENTS` を持ちます（1対多）
- `USERS` は複数の `COMMENTS` を書くことができます（1対多）

## まとめ

Mermaidを使えば、Notion上で手軽に視覚的な情報整理が可能になります。

:::note warn
***特に、DB設計の共有や議論を進める際に威力を発揮します。***
:::

難しいツールを使わずとも、NotionとMermaidだけでここまでできるのはとても嬉しいですね。今後も業務や学習に活用していきたいと思います！！
即戦力化　ディープラーニング実習

# 大学院ゼミ　１年生の導入教育

## はじめに

こんにちは。大学・大学院で情報科学を専門とする教員をしています。  
本記事では、私のゼミに所属する大学院1年生を対象とした、ディープラーニング導入教育のカリキュラムをご紹介します。

この実習の目的は、以下のとおりです。

- 大学院での研究を円滑に開始するための準備
- ディープラーニングを「理論」ではなく「実装」で体得する
- Google Colab 上で完結する、実行可能なプログラムを中心とした学習

第10週まではColab上で完結する内容となっており、今後Qiita上で各週の内容を順次公開していく予定です。  
自習や指導の一助となれば幸いです。

本記事では、全15週のテーマを目次形式で紹介します。  
※Colabノートやコードの詳細は、各週の記事にて個別に解説していきます。
なお、11週目からはColab で出来なさそうなので、記事としてアップロードするのは最大で第10週までとなりまｓ

---

## カリキュラム全体（15週構成）

### 第1週
**Colabの環境設定と基礎確認**  
Google Colabの使い方、Hugging Faceの利用、PyTorch/TensorFlowの確認、GPUの動作確認
👉 [第1週の記事を読む](https://qiita.com/takenakayoichi/private/5c79f2961be6ce498df5)

---

### RNN編

**第2週**　テキスト自動生成  
ニューラルネットによる文章の続きを生成する
👉 [第2週の記事を読む](https://qiita.com/takenakayoichi/private/d410681de72322725554)  

**第3週**　翻訳と要約  
英文を日本語に翻訳し、記事を短く要約する
👉 [第3週の記事を読む](https://qiita.com/takenakayoichi/private/096fcb649e0881e36831)

**第4週**　文章の分類と感情の判定  
テキストをジャンルごとに分類し、感情を読み取る
👉 [第4週の記事を読む](https://qiita.com/takenakayoichi/items/0c83fcc645d524dca81c)

**第5週**　チャットボットと意味ベクトル  
会話を生成し、単語や文の意味を数値で表現する
👉 [第5週の記事を読む](https://qiita.com/takenakayoichi/items/e6113c794da3e4dae2bf)

**第6週**　情報の抽出  
人名や地名などの情報を文から抜き出す
👉 [第6週の記事を読む](https://qiita.com/takenakayoichi/items/63d77675fd67cfc71149)


**おまけ1**　音楽の生成  
👉 [おまけ1の記事を読む](https://qiita.com/takenakayoichi/items/96114be008c2924d3fc9)

テキストからメロディを作成する


**おまけ2**　音声合成  
テキストをAIに読んでもらう
👉 [おまけ2の記事を読む](
https://qiita.com/takenakayoichi/items/a5428c0d39bf2d5b0892)

---

### CNN編

**第7週**　画像の生成と変換  
文字や指示から画像を作ったり、画像のスタイルを変える
👉 [第7週の記事を読む](https://qiita.com/takenakayoichi/items/dfa4c9a6f0ffff635e95)


**第8週**　画像の特徴抽出  
画像からキーワードや特徴ベクトルを得る

**第9週**　物体の検出と領域の認識  
画像内のモノを見つけ、場所を特定する

**第10週**　画像の分類と応用  
画像をカテゴリごとに分け、既存モデルを再学習して使う

**おまけ**　動画生成と骨格推定  
映像を作ったり、人の動きを捉える

---

### 強化学習編

**第11週**　ゲームでの行動学習①  
落ちてくるボールを跳ね返す操作を学習させる（Breakout）

**第12週**　ゲームでの行動学習②  
四足歩行ロボットを歩かせる操作を学習させる

**第13週**　予測に基づく学習  
自分で未来の動きを予測しながら動作を最適化する

**第14週**　複数エージェントの協調学習  
いくつかのキャラが協力して目標を達成する行動を学ぶ

---

### まとめ

**第15週**　これまでの振り返り  
各週の実習内容を整理し、今後に活かすためのまとめを行う

---
## まとめとこれから

以上が、全15週の概要です。  
ディープラーニングを「動かしながら学ぶ」ことを重視したカリキュラムとなっています。

## 次回予告

次回は【**第1週** Colabの環境設定と基礎確認】を公開予定です。

## 謝辞

文章を易しくするにあたり、熊野ヘネ様に助言をいただいております。

ここに厚く御礼申し上げます。