OmniAICreator/Qiita-1.07M huggingface dataset:
SMCにおける送信の設定

Salesforce Marketing Cloud (SMC) では、メールの送信設定やドメイン管理を適切に行うことで、メールの到達率を向上させたり、送信者の信頼性を確保したりできます。  
以下、それぞれの用語について、実例を交えて解説します。

---

### **1. 送信者認証パッケージ（Sender Authentication Package, SAP）**
**概要:**  
SAPは、企業が自社ドメインを使ってSFMCからメールを送信できるようにするための設定パッケージです。これにより、メールが正しく認証され、迷惑メールに分類されにくくなります。

**実例:**  
例えば、「example.com」というドメインを持つ企業がSAPを設定すると、Marketing Cloud から送信するメールの送信元アドレスを `info@example.com` のように自社ドメインのものにできます。  
また、SAPには以下の設定が含まれます：
- **専用IPアドレス:** 企業専用のIPアドレスを割り当て、送信メールの評判を管理しやすくする。
- **ドメイン認証（DKIM, SPF, DMARC）：** メールの正当性を証明し、フィッシングやなりすましを防ぐ。
- **ブランド設定:** 送信者情報を企業ブランドに統一。

💡 **関係する設定:**  
SAPを設定すると、「ドメイン検証と送信者アドレス管理」の設定もスムーズに行えます。

---

### **2. 返信メール管理（Reply Mail Management, RMM）**
**概要:**  
受信者がメールに返信したときの管理を自動化する機能。返信の内容に応じて、自動応答や適切な部門への転送が可能です。

**実例:**  
例えば、マーケティングメールを送信した際、受信者が「配信停止してください」と返信した場合、RMMを設定しておくと自動で配信停止処理を実行できます。  
また、問い合わせメールの場合は、サポートチームへ転送するように設定できます。

💡 **関係する設定:**  
「送信者プロファイル」や「配信プロファイル」と組み合わせて、適切な返信メールの処理を管理します。

---

### **3. 送信分類（Send Classification）**
**概要:**  
メール送信時に「どの送信者情報を使うか」「どのIPアドレスを使うか」「どの返信管理設定を適用するか」を決める仕組み。

**実例:**  
- **トランザクションメール（注文確認、パスワードリセット）** と **マーケティングメール（キャンペーン告知）** では、送信元のアドレスや返信の処理を変える必要があります。  
- 送信分類を使うことで、例えば「noreply@example.com」から注文確認メールを送り、「marketing@example.com」からプロモーションメールを送る、といった管理が可能になります。

💡 **関係する設定:**  
「送信者プロファイル」「配信プロファイル」と組み合わせて使われます。

---

### **4. 送信者プロファイル（Sender Profile）**
**概要:**  
送信メールの「差出人名（From Name）」と「差出人メールアドレス（From Email）」を設定するもの。

**実例:**  
例えば、以下のような異なる差出人名とアドレスを設定できます：
- メールマガジン → **差出人名:** "ABCマーケティング" / **メールアドレス:** marketing@example.com  
- 顧客サポート → **差出人名:** "ABCサポート" / **メールアドレス:** support@example.com  

💡 **関係する設定:**  
「送信分類」と連携して、適切な送信者情報を選択します。

---

### **5. ドメイン検証と送信者アドレス管理（Domain Verification & Sender Address Management）**
**概要:**  
SFMCから送信するメールが正しいドメイン（企業のドメイン）から送られているかを検証する仕組み。

**実例:**  
企業が `example.com` を使用してメールを送信する場合、SPF、DKIM、DMARC という認証を設定し、ドメインがMarketing Cloudと連携していることを証明する必要があります。  
例えば、送信ドメイン認証がない場合、GmailやYahoo!メールの受信側で「このメールは本当に `example.com` から来たの？」と疑われ、迷惑メールフォルダに分類される可能性があります。

💡 **関係する設定:**  
SAPを導入すると、このドメイン認証の設定が一括で行われます。

---

### **6. 配信プロファイル（Delivery Profile）**
**概要:**  
メールを送信する際に、「どの送信IPアドレスを使用するか」「どの返信アドレスを設定するか」などを指定する設定。

**実例:**  
- プロモーションメールは `promo@example.com` というアドレスを使用し、送信元IPはマーケティング用のものを設定。  
- サポート関連のメールは `support@example.com` を使用し、異なるIPアドレスを設定。  

💡 **関係する設定:**  
「送信分類」と連携し、適切な送信プロファイルを選択します。

---

## **各設定の関係性まとめ**
📌 **基本的な流れとしては、以下のように設定を組み合わせて使います。**  

1. **SAPを導入**  
   → **ドメイン検証と送信者アドレス管理** の設定を行い、正しく認証された送信者情報を確保。  

2. **送信者プロファイルを作成**  
   → メールごとに適切な送信者名・アドレスを設定。  

3. **配信プロファイルを作成**  
   → どのIPアドレスと返信アドレスを使うか決める。  

4. **送信分類を作成**  
   → **送信者プロファイル** と **配信プロファイル** を組み合わせ、適切なメール送信設定を決定。  

5. **RMMを設定**  
   → 受信者からの返信を適切に管理し、自動応答や転送を行う。  

---

## **まとめ**
Salesforce Marketing Cloud のメール送信設定は、  
✔ **SAPを設定して送信ドメインを認証**  
✔ **送信者プロファイル・配信プロファイルを作成してメールの差出人情報を管理**  
✔ **送信分類で適切な設定を適用**  
✔ **返信メール管理（RMM）で受信者の返信対応を自動化**  
という流れで管理されます。

**これらを適切に設定することで、メールの信頼性を高め、到達率を向上させ、スパム扱いされるリスクを減らすことができます！** 🚀
Excel VBAで静的２次元配列を使用してみる

# 1. はじめに
* Excel VBAで2次元配列の使い方を知りたい

# 2. 開発環境
* VBA
* Excel 2021

# 3. サンプルコード
* Integer型の静的２次元配列(1, 2)を宣言する
* 各要素数には0を含む

```vb: Sample1()
Public Sub Sample1()

    ' 静的２次元配列の宣言
    Dim iArray(1, 2) As Integer
    
    iArray(0, 0) = 0
    iArray(0, 1) = 1
    iArray(0, 2) = 2
    iArray(1, 0) = 10
    iArray(1, 1) = 11
    iArray(1, 2) = 12
    
    For x = 0 To 1
        For y = 0 To 2
            Debug.Print iArray(x, y)
        Next y
    Next x

End Sub
```

```vb: 実行結果
 0 
 1 
 2 
 10 
 11 
 12 
```
# 4. 参考文献

https://www.minizaiko.com/entry/ZaiSis004
SMCのテナント、BU、Enterprise2.0

Salesforce Marketing Cloud（SFMC）の「テナント」「ビジネスユニット（BU）」「Enterprise 2.0」という用語について整理しました。  

---

## 1. **テナントとは？**
**テナント（Tenant）** は、Marketing Cloud のアカウント全体を指します。  
1つの会社が契約すると、基本的に1つのテナントが与えられます。

### 例：
- **A社がMarketing Cloudを契約**すると、「A社用のテナント」が作られる。
- その中に、複数の「ビジネスユニット（BU）」を作ることができる。

---

## 2. **ビジネスユニット（Business Unit, BU）とは？**
**ビジネスユニット（BU）** は、1つのテナント内でデータや設定を分割するための仕組みです。  
例えば、企業の部門やブランドごとに分けて、別々のメール配信やデータ管理ができるようになります。

### 例：
A社が3つの事業を展開している場合、それぞれの事業ごとにBUを作成できる。
- **A社のBU構成**
  - 本社（HQ BU）
  - ブランドA BU
  - ブランドB BU
  - ブランドC BU

各BUで、**独立したメール配信リストやコンテンツを管理**できるため、異なるブランドごとに適切なマーケティング施策を実施できる。

### **BUのポイント**
- **データやオーディエンスを分離できる**（顧客情報を共有する/しない設定が可能）
- **ブランドごと、国ごと、部門ごとに管理可能**
- **ユーザーごとにアクセス制限を設定できる**
  - 例：「ブランドAのマーケティング担当者は、ブランドBのデータを見れない」

---

## 3. **Enterprise 2.0とは？**
**Enterprise 2.0**は、大規模な企業向けのMarketing Cloud構成で、複数のBUを柔軟に管理するための仕組みです。

### **Enterprise 2.0の特徴**
- **中央管理用の"親BU"（Enterprise BU）がある**
- **複数のBU（子BU）を作成できる**
- **各BUでデータの共有ルールを設定可能**
- **Enterprise BUで一括管理（例えば、共通テンプレートやオーディエンスを管理）**

### **Enterprise 2.0の実例**
グローバル企業が、各国のマーケティングを統一的に管理するケース。

- **親BU（Enterprise BU）**
  - 全体のメールテンプレートや配信ポリシーを管理
  - 各国のBUに共通データを配布
- **子BU（各国ごとのBU）**
  - 日本 BU（日本向けのキャンペーン配信）
  - アメリカ BU（米国向けのキャンペーン配信）
  - ヨーロッパ BU（EU向けのキャンペーン配信）

この構成を使うと、**企業全体のガバナンスを維持しつつ、各国のマーケティング活動を独立して実施**できます。

---

## **まとめ**
| 用語           | 概要 |
|---------------|------------------|
| **テナント**  | Marketing Cloud のアカウント全体。企業ごとに1つ。 |
| **ビジネスユニット（BU）** | テナント内のデータ・配信管理単位。ブランドや国ごとに分けられる。 |
| **Enterprise 2.0** | 大規模企業向けのBU管理方式。親BUがあり、各BUのデータ管理を統括できる。 |

### **どのように使い分ける？**
- **小規模企業** → **1テナント+1BUで十分**（BUを増やさず単一管理）
- **中規模企業（複数ブランド/部門）** → **複数BUを活用**（ブランド別、部門別など）
- **大規模企業（グローバル運用）** → **Enterprise 2.0を導入**（親BU+各国BU）
Entra ID のAPI駆動型インバウンドプロビジョニングをやってみた - その1

1.はじめに
Entra ID のAPI駆動型インバウンドプロビジョニングを、PowershellとCSVを使ってプロビジョニングする記事がなかったので自分の備忘として残します。

https://qiita.com/maka2025/private/cfb6db137693e770d47d

https://qiita.com/maka2025/private/0d7829306185ee1b3ab2

機能概要とかは MS Learn を読んでください
https://learn.microsoft.com/ja-jp/entra/identity/app-provisioning/inbound-provisioning-api-concepts

2.Entra ID にAPI駆動型インバウンドプロビジョニングアプリの作成

Entra 管理センターからエンタープライズアプリを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016871/4f4c2e30-2155-4a08-874f-9f57f505f97b.png)


検索に api-driven と入力し検索する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016871/79b27e2d-0a26-4437-a42d-22e055ed2385.png)

任意の名前を入力し作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016871/cb693554-d063-477a-ba28-13e0b484f4ee.png)

概要から作業開始する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016871/3f15234d-c1aa-4756-afc4-f9dfbce2af35.png)

プロビジョニングモードを自動にし保存
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016871/b2fedf2b-1371-4e6f-a98d-e1825786196c.png)

メール通知設定し、再度保存
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016871/f1e15ddf-91dc-4864-9785-c1229a4facaf.png)

マッピングリンクを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016871/06733761-41c0-432c-afdc-4ab9a147c904.png)

下記マッピングでは、SCIM のスキーマから Entra ID への取り込み用属性値がデフォルトでセットされている
このセットは、リソース元に合わせてカスタマイズも可能
※マッピングについての詳細はこちらの記事を参照
https://jpazureid.github.io/blog/azure-active-directory/introducing-a-new-flexible-way-of-bringing-identities-from-any/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016871/ee007777-9a2b-4beb-93b3-c2b9734b8217.png)

リソース元に合わせてマッピングを追加もできる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016871/682f5da1-9ce4-4b69-947f-66d5fa1050b8.png)

マッピング設定後、概要からプロビジョニングを開始する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016871/85f3f2d0-2fe4-4519-8542-d2561f8e5497.png)




＊本稿は、個人の見解に基づいた内容であり、所属する会社の公式見解ではありません。また、いかなる保証を与えるものでもありません。正式な情報は、各製品の販売元にご確認ください。
【個人的なメモ】LLMによく入力するプロンプト

## はじめに

私がよく仕事やコーティング,日常で使う。様々なプロンプトをメモがてら記載しました。

巷でもよく見かける一般的なものから、自分で考えたものも少量含まれます。

### hi
最も短いテスト的な挨拶プロンプト。
APIのテストをする時によく使う。

### 関西弁で話して
システムプロンプトのテスト。
API にテストをする時によく使う。


### わからないことがあったらわからないと言ってください。
ハルシネーション対策。


### 内容を変えずに整形してください
万能フォーマッター。


### (課題の名前)を解決できるまで私に質問してください
いわゆる反転インタラクションパターン
課題を解決するまで、LLMに質問してもらい、人間が答え、最後に LLM がまとめて結論を答えてくれる。


### 例
いわゆるfew shot prompt

```
例
---
入力1→出力1
入力2→出力2
入力3→
```

のように使う。


### 私は質問力がありません。
LLM 自身が質問を考え直してから答えてくれる。

### 動作できるように修正してください
コードにエラーがある場合

### (エラーメッセージ)
エラーメッセージをそのまま打ち込む。

### あなたは最高の◯◯です
いわゆるペルソナパターン
出力精度が向上する、らしい


### あなたは◯◯です。
いわゆるペルソナパターン。
なりきり。

あなたは最高のエンジニアであり、魔術師です。弟子に教えるかのように、Linuxコマンドを魔術の儀式に例えて説明してください。

### 私は◯◯です
いわゆるオーディエンスパターン
質問者の立場を理解して答えてくれる

### あなたは最高の◯◯です。私は◯◯です。
いわゆるペルソナオーディンスパターン

あなたは最高のエンジニアです。
私は Python コードの初心者です。

など。


### ステップバイステップに考えましょう
いわゆるChain of Thought CoT
単語の次に来る単語を確率的に推論しながら文章を作るLLMの性質を利用して、LLMがまるで論理的に考えて答え出してるかのようにふるわまさせる。



## おわりに
DeepSeekとかo3-miniのような推論するモデルが出てきて一部のプロントは必要なくなりつつありますが、SLM(小規模言語モデル)からも目が離せないため、まだまだ知っていて損はない技術かなと思います。
Unable to find gem rubocop-discourse; is the gem installed? Gem::MissingSpecError

## 背景
Railsプロジェクトの下にCloud Run Functionsのコードを置いておくことにした。そうしたら、rubocopを走らせる時に、以下のエラーが発生した

```rb
❯ rubocop .
Unable to find gem rubocop-discourse; is the gem installed? Gem::MissingSpecError
```

## 問題
Cloud Run Functionsの下のvendorをrubocopの対象から外さないと↑のエラーが発生するようです。

## 対応
```vim .rubocop.yml
AllCops:
   TargetRubyVersion: 3.2
   Exclude:
     - cloud_run_functions/function_name/vendor/**/*
```
ACMの証明書発行がずっと保留中の検証の対処方法

# 前書き
いつも通り CDK で `deploy` を行っていたところ、見覚えのない「443 に到達できない」というエラーが発生しました。調査してみると、ACM の証明書発行がずっと保留中であることが判明しました。
![716E5051-6D7B-4CDC-AEF1-65F49A572F48_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/41fdf73d-4ee0-491f-9ce1-b9e65cd7afc2.jpeg)

# 調査
ネット上の記事をいくつも拝見しましたが、ほとんどの内容は `Route 53` に証明書用の CNAME レコードを登録する方法についてでした。しかし、これまで同じコードで `cdk deploy` を実行して問題なく成功しており、今回もレコードの登録ができていることを確認しました。

別の原因がありそうです。

# 結論

登録ドメインの認証が必要でした。

`Route 53` で登録済みドメインのページを開いたところ、連絡先情報のメールアドレスの確認が必要であるという通知が表示されていました。確認メールを送信してもらい、そのメール内のリンクをクリックしたところ、認証フローが完了し、証明書の発行も無事に完了しました。

# 最後

`Route 53` でのドメイン取得は何度も行っていましたが、登録者のアドレス認証を後から求められたのは今回が初めてでした。この記事が誰かの参考になれば幸いです。
【個人メモ】Docker学習

# 学習にオススメの記事


> 入門Docker

https://y-ohgi.com/introduction-docker/


> docker公式日本語訳

https://docs.docker.jp/


> チームにdockerを布教することになったので、布教の教材を作ってみた。

https://zenn.dev/a1008u/books/6bf96a769bedb2be53ae/viewer/docker_compose

> play with docker

https://labs.play-with-docker.com/

> Dockerコマンド一覧

https://qiita.com/JK447/items/bed378680eee49c5f600

> Dockerのお掃除

https://qiita.com/MasanoriIwakura/items/53cb7968e44f7a25e083


# DockerFileの例

```dockerfile
# DockerHubにあるイメージファイルを指定
FROM php:8.0-fpm

# RUNコマンド：buildしたときに元となるdockerイメージに対して実行する処理を記述
# \（バックスラッシュ）：複数行に分けることが可能。
# ライブラリのインストール
RUN apt-get update
RUN apt-get install -y \
      sudo \
      libpq-dev \
      git \
      zip \
      unzip \
      vim
RUN docker-php-ext-install \
      pdo \
      bcmath \
      pdo_mysql

# Xdebugのインストール
RUN pecl install xdebug
RUN docker-php-ext-enable xdebug

# Composerのインストール & パス通す
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# nodeインストール(aptだとNodejsは古いため、パッケージマネージャの n を使用してインストール)
RUN apt install -y npm \
    && npm install n -g \
    && n stable

# 設定の置換
COPY php.ini /usr/local/etc/php/php.ini

# RUN , CMD , ENTRYPOINT , COPY , ADD を実行する時のワーキングディレクトリを指定
WORKDIR /var/www

```

## docker-compose.ymlの例

```docker
version: "3"

services:
  #  PHPコンテナ
  app:
    # コンテナの名前を指定
    container_name: app
    # Dockerファイルを使って、コンテナをビルドするという指定
    build: ./docker/php
    # ローカルのディレクトリとコンテナ上のディレクトリをリンクを設定
    volumes:
      - .:/var/www
    # x86_64アーキテクチャのイメージを強制的に使用（Mac用）
    platform: linux/x86_64
    depends_on:
      - db
  # nginxコンテナ
  nginx:
    image: nginx:1.24-alpine
    container_name: nginx
    # ホストの3000ポートをコンテナの3000ポートにマッピング
    ports:
      - 8000:80
    volumes:
      - .:/var/www
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    platform: linux/amd64
    working_dir: /var/www
    depends_on:
      - app
  # DBコンテナ
  db:
    # MySQL 5.7の公式イメージを使用
    image: mysql:5.7
    container_name: db
    environment:
      # MySQLのrootユーザーのパスワード
      MYSQL_ROOT_PASSWORD: root
      # 作成するデフォルトデータベース
      MYSQL_DATABASE: database
      # 作成するユーザー
      MYSQL_USER: db-user
      # 作成するユーザーのパスワード
      MYSQL_PASSWORD: db-pass
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
      - ./docker/db/data:/var/lib/mysql
      - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
      - ./docker/db/sql:/docker-entrypoint-initdb.d
    platform: linux/x86_64
    ports:
      - 3306:3306

```

## Docker起動

###### rootディレクトリにて、以下のコマンドを実行する
``` dockerビルド
docker-compose up -d --build
```

###### PHPのコンテナに入る
```
docker exec -it app /bin/bash
```
【RockyLinux 9.5 で WordPress 環境構築】PHPのインストールと設定

RockyLinux9.5でWordPress環境構築した際のメモです。
今回はPHPをインストールし設定します。

## phpをインストール

PHPのモジュールリストを確認
```
sudo dnf module list php
```

remi-8.2 モジュールのインストール
```
sudo dnf module install php:remi-8.2
sudo dnf install php
```

PHP拡張モジュールをインストール
利用目的によっては他の拡張モジュールが必要になるかもしれません。

```
sudo dnf install php-curl php-gd php-mysqlnd
```

## 設定ファイル（php.ini）の編集

オリジナルをバックアップ
```
sudo cp /etc/php.ini /etc/php.ini.org 
```

vimでphp.iniを編集
```
sudo vim /etc/php.ini
```

```ini:/etc/php.ini
; expose_php = On
↓
expose_php = Off

;post_max_size = 8M
↓
post_max_size = 128M

;upload_max_filesize = 2M
↓
upload_max_filesize = 128M

;date.timezone =
↓
date.timezone = "Asia/Tokyo"

;mbstring.language = Japanese
↓
mbstring.language = Japanese

;mbstring.internal_encoding =
↓
mbstring.internal_encoding = UTF-8

;mbstring.http_input =
↓
mbstring.http_input = UTF-8

;mbstring.http_output =
↓
mbstring.http_output = pass

;mbstring.encoding_translation = Off
↓
mbstring.encoding_translation = On

;mbstring.detect_order = auto
↓
mbstring.detect_order = auto

;mbstring.substitute_character = none
↓
mbstring.substitute_character = none
```

編集後、php-fpmとhttpdを再起動します。
```
systemctl restart php-fpm
systemctl restart httpd
```

## 確認

ドキュメントルートにphpinfo()を記述した ```index.php``` ファイルを作成します。

```
echo '<?php phpinfo(); ?>' > /var/www/yoursite.com/index.php
```

ブラウザ http://xxx.xxx.xxx.xxx (IPアドレス)からアクセスし、PHPの情報が表示されていれば成功です。

動作確認後、index.phpファイルは削除しておきます。
```
rm -f /var/www/yoursite.com/index.php
```

## RockyLinux9.5でWordPress環境構築
1. [さくらのVPS設定](https://qiita.com/tfz/items/58a8a185573ff7080599)
1. [Apacheのインストールと設定](https://qiita.com/tfz/items/f4d74b8a5d93068fe675)
1. PHPのインストールと設定
1. [mariaDBのインストールと設定](https://qiita.com/tfz/items/ffb4eaaba2eea68211fe)
1. [WordPressのインストールと設定](https://qiita.com/tfz/items/95b355127e3f034b78bb)
1. [DNS設定とCertbotによるSSL証明書の取得と設定](https://qiita.com/tfz/items/546cc990465b876bc5de)
VScodeでER図を作成してGithubで共有する

## はじめに
VScodeでER図を作成するためにMermaidを使用します。
Mermaidはコードベースで書いたものを図にすることができるツールです。
GithubとVScodeもサポートされているので、Githubでコード管理しているプロジェクトにとってDB設計を共有しやすいです。

https://mermaid.js.org/syntax/entityRelationshipDiagram.html

## 使い方
- VScodeで拡張を入れる
プレビュー機能を使用すると、書きながらER図を確認できるので便利です。

https://marketplace.visualstudio.com/items?itemName=bierner.markdown-mermaid

- Mermaidコードに色がつく拡張

https://marketplace.visualstudio.com/items?itemName=bpruitt-goddard.mermaid-markdown-syntax-highlighting

![スクリーンショット 2025-02-21 22.43.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015674/0b646de2-bd96-4c02-8591-5dd9611093e1.png)



- コードブロックにmermaidと記載すると、Mermaid記法で書いたものが図になります
- erDiagramと記載するとER図が作成できます

````
```mermaid
erDiagram

    Companies ||--|{ Employees : "会社は複数の社員を持つ"

    
	Companies {
		String id   PK "会社ID"
		String name    "会社名"
	}
    
	Employees {
		String id        PK "社員ID"
		String companyId FK "会社ID"
		String name         "社員名"
		Int    age          "年齢"
	}
```
````
```mermaid
erDiagram

    Companies ||--|{ Employees : "会社は複数の社員を持つ"


	Companies {
		String id   PK "会社ID"
		String name    "会社名"
	}

	Employees {
		String id        PK "社員ID"
		String companyId FK "会社ID"
		String name         "社員名"
		Int    age          "年齢"
	}
```

- #### テーブル同士の関係を表す際に使用する記法と意味は下記の通り。
```
|o	o|	・・・　０または1
||	||	・・・　1
}o	o{	・・・　0以上
}|	|{	・・・　1以上
```

READMEに記載すれば、プロジェクトのDB設計がすぐに確認できます。
またPRでもコードブロックにmermaidを記載すれば、図を表示することができます。

![スクリーンショット 2025-02-21 22.00.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015674/8b86f32a-bbc2-4079-ac21-e5edf66134d4.png)

## おわりに
VScodeとGithubに対応しているのはありがたい。
erDiagramについて紹介しましたが、円グラフやマインドマップ等も作成できるみたいです。
面白いので他のものもどんどん使おうと思います。

https://mermaid.js.org/intro/
未経験からフロントエンドを目指す

今日もプロゲートにてHTMLとCSS初級レッスンを学びました。
まずは前日の復習を行い、
今回はCSSによる背景色の変更、リストタグのひとつの要素だけの色の変更などについて学びました。・をつける位置や、要素の変更に用いる言語などの復習をしっかり行っていきたいと思います。
次のレッスンでは、これまでの学習を踏まえた目標物の作成を行います。
AzureでInsight SQL Testing使ってみた

Insight SQL TestingのManagerサーバは
- AWS EC2
- Azure VM
- 仮想アプライアンス
- 物理サーバ(Red HatまたはOracle Linux)

等の環境でそれぞれ動作させることが可能です。
実際の利用シーンではAWS環境を利用いただくことが多いですが、今回はAzureでのManagerサーバ構築についてご紹介します。とはいっても、VM Imageを配布しているのでAMIによる起動と大きく変わったことはありません。

## VMの作成
仮想マシンコンソールから「作成」→「Azure仮想マシン」を押下。
![20250220_Testingの概念説明（スクリプト用） (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895179/5063586a-d782-43fd-b313-6d35832300ec.png)

インスタンス名などは必要に応じて各自の環境に応じたものを設定します。
![20250220_Testingの概念説明（スクリプト用） (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895179/8d259b7a-1712-44cf-939b-a6cf63230945.png)

ポイントは「イメージ」の選択で「すべてのイメージを表示」より
![20250220_Testingの概念説明（スクリプト用） (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895179/999256a2-797c-4dac-bfd4-f5365af9bc53.png)

Marketplaceで「sql testing」で検索し（下記のキャプチャでは「insight」を省略してもヒットします）、プルダウンより最新版のものを選択します。
![20250220_Testingの概念説明（スクリプト用） (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895179/aa3a79b9-0fba-4495-a6ea-da2d30caa43f.png)

元の設定画面に戻るので、以降の設定は基本デフォルトで大丈夫ですが、こちらも利用する環境に応じて適宜変更してください。

最終的に仮想マシンが起動したのち、デフォルトの設定で既に賄えていることですが、「ネットワーク設定」から「受信ポートの規則」を確認します（EC2で言う所のインバウンドルールですね）
![20250220_Testingの概念説明（スクリプト用） (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895179/d2932064-d536-4c5f-8df8-16fc3b79b299.png)

基本的にユーザは「http://<<発行されたIPアドレス>>:7777/idt/」にアクセスしてTestingの各種操作を行いますので、7777が開いていること、また、何らかメンテナンスや管理者としてSSHでアクセスすることも想定されますので22が開いていることも確認しておきます。

最後に、上記が確認できれば「http://<<発行されたIPアドレス>>:7777/idt/」にアクセスするといつものログイン画面にたどり着くことを確認しましょう。

画面が問題なく表示されればAzureでInsight SQL Testingが利用できます！

---
もし試してみたい方がいらっしゃいましたら以下のInsight SQL Testingのページ、またはAzure Marketplaceのページより是非お問合せください。
- SQLテストソフトウェア「Insight SQL Testing」
- https://www.insight-tec.com/products/sqltesting/
- Azure Marketplace-Insight SQL Testing
- https://azuremarketplace.microsoft.com/ja-jp/marketplace/apps/instight-technology.insight_database_testing_byol?tab=overview
.env ファイルをどう運用する？安全かつ効率的な共有方法まとめ


プロジェクトで API キーやデータベース接続情報などを管理する際に、`.env` ファイルを利用するケースは多いですよね。しかし、セキュリティ上の理由から `.env` ファイルは外部に漏れないよう十分な注意が必要です。本記事では、`.env` ファイルをチーム内で安全に共有するための運用方法・事例をまとめました。



## 【大前提】なぜ `.env` ファイルを外部に公開してはいけないのか？

- `.env` ファイルには **認証情報や API キー**、**データベース接続情報** など、機密情報が含まれていることが多いです。  
- これらの情報が外部に漏れると、サービスの乗っ取りや不正アクセスなど **大きなセキュリティリスク** につながります。  
- GitHub のような **公開レポジトリにプッシュ** すると、検索エンジンやクローラーにより漏洩が起こる可能性が高まります。


## `.env` ファイル運用に関する会話のまとめ

今回、上司やチームメンバーとのやり取りから得られた知見をざっくりまとめると、以下のようになります。

> **Q: `.env` ファイルは GitHub にプッシュせずに、チームでどのように共有するのが一般的ですか？**  
> **A:**  
> - 基本的には **プロジェクトメンバーのみ** がアクセスできる場所に保管する。  
> - 以前のプロジェクトでは **Backlog** に `.env` ファイルを置いてダウンロードしてもらっていた。  
> -  **Box** などのセキュリティが担保されたストレージに配置する運用も多い。

### 実際の運用例

1. **バックアップ & 共有ストレージに配置する**  
   - Box、Backlog、などを利用して `.env` を保管する。  
   - 誰が編集・ダウンロードしたか分かるようにバージョン管理や権限設定をしておく。  

2. **Git のプライベートリポジトリで管理**  
   - 完全にメンバー限定の **プライベートリポジトリ** であればコミットする手段もある。  
   - ただし、**万が一リポジトリがパブリックになったときのリスク** を考えると、やや慎重になる必要がある。  
   - 認証情報が含まれない `.env`（開発用のデフォルト値のみ）ならコミットしておくケースもある。  

3. **定期的なキーの再生成**  
   - 認証情報が含まれているなら **キーを定期的に再生成** しておき、長期間同じ認証情報を使わない。  
   - 認証情報の寿命を短くすることで、万が一情報が漏洩してもリスクを軽減できる。  

4. **直渡し（手渡し）の回避**  
   - USB メモリなどの **オフラインでの受け渡し** は、一見セキュリティが高そうでも、紛失や人的ミスが起きればリスクが高まる。  
   - 都度、新メンバーがプロジェクトに参加するたびに渡すのは手間も大きい。  
   - 組織でセキュリティが確保されたオンラインストレージを使う方がベター。



## 一般的な `.env` 管理フローの一例

1. **リポジトリには `.env` を含めない**  
   - `.gitignore` に `.env` を追加し、誤ってコミットしないようにする。  

2. **チーム内限定でアクセス可能なストレージに `.env` を保管**  
   - Box や Backlog、Google Drive（権限管理付き）などを活用。  
   - ファイル変更があったときはチーム内に周知し、誰がいつ変更したかトラッキングできるようにする。  

3. **環境構築手順書（マニュアル）に保管場所と入手方法を明記**  
   - 新規メンバーは手順書通りにストレージへアクセスし、`.env` をダウンロード。  
   - 必要があれば **API キーの取得先**（例：AWS、Stripe など）を記載し、取得までのフローを分かりやすく示す。  

4. **キーの定期的な再生成と不要になったキーの削除**  
   - 本番環境での API キー等はプロジェクトのフェーズごとや定期的に更新し、常に最新のキーを使う。  



## まとめ

- `.env` ファイルは非常に重要な機密情報を含むため、**決してパブリックな場に公開しない** ことが大原則です。  
- チームで共有する際は、**メンバー限定アクセスが保証** されるストレージやプライベートリポジトリを利用するのが一般的。  
- 運用方法はプロジェクトの規模やセキュリティポリシーによって変わりますが、**ストレージでの一元管理** と **アクセス権限の厳格な制御** はほぼ共通したポイントです。  
- 認証情報を含む場合は、**キーの定期的な再生成** を行い、漏洩リスクを下げる取り組みも大切です。  

プロジェクトのセキュリティを守るためにも、適切な `.env` ファイルの管理を心がけておきましょう。
#0053（2024/02/21）PythonのHydraモジュール

# PythonのHydraモジュールとは？

Hydraは、Pythonアプリケーションの**設定管理**を簡潔かつ柔軟に行うためのフレームワークです。  
複雑な設定ファイルを階層的に管理し、コマンドラインからのオーバーライドや複数の実験（マルチラン）を容易に実現できるため、特に機械学習や大規模アプリケーションの開発において重宝されています。



## 主な役割と機能

- **階層的な設定管理**  
  YAML形式などを用いて設定ファイルを階層化・モジュール化できるため、設定内容を論理的に整理しやすくなります。

- **動的な構成の合成**  
  複数の設定ソースを組み合わせて、実行時に動的に構成（コンフィギュレーション）を生成できます。

- **コマンドラインからのオーバーライド**  
  アプリケーション実行時に、設定ファイルの内容をコマンドライン引数で簡単に上書きでき、柔軟な実行環境の変更が可能です。

- **マルチラン実験のサポート**  
  複数のパラメータセットを一度に試すことができるため、実験やハイパーパラメータの探索を効率化できます。

- **出力の自動管理**  
  実行結果やログ、設定のスナップショットを自動で整理・保存する機能があり、再現性や実験のトラッキングに役立ちます。



## 名前の由来

Hydraという名前は、**ギリシャ神話に登場する多頭の蛇「ヒュドラ」**に由来しています。  
- ヒュドラは、切り落とした頭から新たな頭が生えてくるという性質を持ち、多様な局面や変化に対応する象徴とされています。  
- 同様に、Hydraモジュールは複数の設定（「頭」）を動的かつ柔軟に管理・組み合わせることで、複雑なアプリケーションの構成を容易にしてくれます。


## まとめ

- **Hydraは、設定管理をシンプルにするPythonフレームワーク**であり、階層的な設定ファイルの管理やコマンドラインからの動的なオーバーライド、マルチラン実験のサポートなど、複雑なアプリケーションの設定を効率化します。
`ls` コマンドのオプションとその由来

💡 `ls` コマンドは **「list（一覧表示）」の略** で、ディレクトリの中のファイルやフォルダを表示する基本コマンドです。  
オプションを付けることで、より詳細な情報を表示したり、表示形式を変更できます。

それぞれのオプションの **意味** と **由来（英単語の頭文字など）** を解説します！



## **📌 1. 基本的なオプション**
| オプション | 由来 | 説明 |
|-----------|------|------|
| `-a` | **all（すべて）** | **「.（ドット）」で始まる隠しファイルも表示** |
| `-l` | **long（長い形式）** | **詳細な情報（パーミッション、所有者、サイズなど）を表示** |
| `-h` | **human-readable（人間が読める）** | **サイズを「KB, MB, GB」などの単位で表示** |
| `-r` | **reverse（逆順）** | **逆順で並べ替える** |
| `-t` | **time（時間）** | **更新日時順に並べる** |

💡 **実際の例**
```bash
ls -a   # 隠しファイルを含めて表示
ls -l   # 詳細情報を表示
ls -lh  # 人間が読めるサイズで詳細表示
ls -lt  # 更新日時順に並べる
```



## **📌 2. 並び順を変更するオプション**
| オプション | 由来 | 説明 |
|-----------|------|------|
| `-S` | **size（サイズ）** | **ファイルサイズ順に並べる** |
| `-t` | **time（時間）** | **更新日時順に並べる** |
| `-r` | **reverse（逆順）** | **逆順で表示** |
| `-X` | **eXtension（拡張子）** | **拡張子順で並べる** |

💡 **実際の例**
```bash
ls -S   # ファイルサイズが大きい順に表示
ls -t   # 更新日時が新しい順に表示
ls -r   # 逆順に表示
ls -X   # 拡張子順に並べる
```



## **📌 3. 表示形式を変更するオプション**
| オプション | 由来 | 説明 |
|-----------|------|------|
| `-1` | **one（1行1ファイル）** | **1行に1つずつ表示** |
| `-C` | **columns（列）** | **複数列で表示（デフォルト）** |
| `-m` | **comma（カンマ）** | **カンマで区切って表示** |
| `-x` | **across（横並び）** | **横方向に並べる** |

💡 **実際の例**
```bash
ls -1   # 1行に1つずつ表示
ls -m   # カンマ区切りで表示
ls -x   # 横方向に並べる
```



## **📌 4. ファイル情報を表示するオプション**
| オプション | 由来 | 説明 |
|-----------|------|------|
| `-i` | **inode（iノード）** | **ファイルの i ノード番号を表示** |
| `-s` | **size（サイズ）** | **ブロックサイズを表示** |
| `-d` | **directory（ディレクトリ）** | **ディレクトリ自身の情報を表示（中身を表示しない）** |

💡 **実際の例**
```bash
ls -i   # iノード番号を表示
ls -s   # 各ファイルのサイズ（ブロック数）を表示
ls -d /etc   # /etc ディレクトリの情報だけ表示（中身は表示しない）
```



## **📌 5. 色や装飾をつけるオプション**
| オプション | 由来 | 説明 |
|-----------|------|------|
| `--color=auto` | **color（色）** | **ファイルの種類ごとに色分け** |
| `-F` | **file type（ファイル種別）** | **ファイル名の末尾に `/, *, @` などを付ける** |

💡 **実際の例**
```bash
ls --color=auto  # 色を付けて表示
ls -F   # ファイル種別を表示
```
📌 `ls -F` の出力例：
```
dir/  script.sh*  link@
```
- `/` → **ディレクトリ**
- `*` → **実行ファイル**
- `@` → **シンボリックリンク**



## **📌 6. よく使われる組み合わせ**
| コマンド | 説明 |
|---------|------|
| `ls -al` | **隠しファイルを含めて詳細表示** |
| `ls -lh` | **ファイルサイズを「MB, GB」などの単位で表示** |
| `ls -lt` | **更新日時順に並べる** |
| `ls -Sr` | **ファイルサイズ順（小さい順）に並べる** |
| `ls -d */` | **ディレクトリだけ表示** |

💡 **例：最近更新されたファイルを表示**
```bash
ls -lt | head
```



## **📌 まとめ**
| オプション | 由来 | 説明 |
|-----------|------|------|
| `-a` | **all** | 隠しファイルを含める |
| `-l` | **long** | 詳細表示 |
| `-h` | **human-readable** | サイズを「KB, MB, GB」で表示 |
| `-r` | **reverse** | 逆順で並べる |
| `-t` | **time** | 更新日時順に並べる |
| `-S` | **size** | ファイルサイズ順に並べる |
| `-X` | **eXtension** | 拡張子順に並べる |
| `-i` | **inode** | i ノード番号を表示 |
| `-s` | **size** | ブロックサイズを表示 |
| `-d` | **directory** | ディレクトリ自身を表示 |
| `--color=auto` | **color** | 色付きで表示 |
| `-F` | **file type** | ファイル名の末尾に `*/@` を付ける |

**これで `ls` コマンドのオプションとその由来がバッチリ**
エンジニアとクリエイターの壁をなくす！思考法の違いと共創の実践

# 技術的視点とクリエイティブ思考を活かすコミュニケーション戦略

こんにちは！クリエイターだけど、エンジニア育成事業の責任者をしているクリエイティブディレクターの大泉です。「エンジニアがわからない」ことを「クリエイティブの視点」という武器に変えて、なんとかやってます。

本記事では、エンジニアとクリエイターの思考法の違いを踏まえたチーム開発の進め方を紹介します。
    
    この記事で得られること
    ・エンジニア×クリエイターの「思考法の違い」を理解し、チームでの意識合わせに活かせる
    ・加点法・減点法を上手く使い分けるディスカッションの進め方
    ・チーム内でのコミュニケーションギャップを減らすTips
    
    こんな方におすすめ
    ・デザイナーなどクリエイター(事業責任者含む)と一緒にプロジェクトを進めているエンジニア
    ・エンジニアとのやり取りに苦戦しているデザイナーやディレクター
    ・ChatGPTなどAIを活用して企画・開発を円滑に進めたい方

## 1️⃣思考法の違い：加点法 vs 減点法

1-1. クリエイターの思考法：加点法
私たちクリエイターは、アイデアを積み上げていく「加点法」で考えることが多いです。
    
    「このアイデア、いいね！ここをもっと膨らませよう」
    「ここに○○を足したら面白くなりそう！」
アイデアの種を大切に育て、そこから可能性を広げていくのが得意。完璧でなくても魅力的な部分があれば価値を見出し、それを伸ばす思考回路を持っています。

1-2. エンジニアの思考法：減点法
一方、エンジニアの皆さんは「減点法」で考えることが多いです。
    
    「このコードのここにバグがある」
    「この仕様だと○○の場合に破綻する」
一つのミスがシステム全体を機能不全にする可能性があるため、問題点を先に洗い出し、ひとつずつ解決していく思考が身についています。これは決して否定的なわけでなく、プロダクト品質を担保するために不可欠なスキルです。

![スクリーンショット 2025-02-21 20.12.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3991729/8527ca31-042d-4582-8c3f-ca00f21eeb34.png)


## 2️⃣なぜギャップが起こるのか？
この思考法の違いが、時としてコミュニケーションギャップを生みます。
    
    クリエイター側の反応
    「アイデアを出したのに、すぐに問題点を指摘される…」
    「もっと可能性を広げて考えてほしい」

    エンジニア側の反応
    「技術的な制約を無視した非現実的な提案が多い」
    「問題点を指摘しているだけなのに、否定されたと思われる」

ここを上手く橋渡しできるかどうかが、チームの成果を大きく左右します。


## 3️⃣ギャップを埋める：共創のための実践アプローチ
3-1. 議論のフェーズを明確に分ける
アイデア発散フェーズ
「まずは技術的制約は置いておいて、理想を語ろう」と宣言する
この段階では「Yes, and...」の精神で意見を積み上げる

実現性検討フェーズ
「では、現実的に実装するとしたらどうなるか？」と切り替える
この段階で技術的な制約や懸念点を出し合う

Tips: FigmaでアイデアのUIをざっくり描いて共有する
例：「アイデアのゴール」「想定ユーザー」「技術リスク」をあらかじめ洗い出しておくと、議論のフェーズを自然と分けやすいです。

3-2. 言い回しを工夫する
    
    クリエイターからエンジニアへ
    ×「このアイデアでやりたい！」
    ○「このアイデアの核心は○○なんだけど、技術的に実現可能な形にするにはどうすればいい？」
    
    エンジニアからクリエイターへ
    ×「それはできない」
    ○「その方向性は面白いね。技術的には○○という制約があるけど、代わりに△△という方法なら近い体験が実現でき
      そう」
    
## 4️⃣共創成功事例：AI comic 英単語『コミ単』の開発プロセス

AI comic 英単語『コミ単』とは？
「コミ単」は英単語学習×生成AIを組み合わせたWebアプリです。中高生の「英単語がなかなか覚えられない」「単語帳がつまらない」という課題に対し、入力した英単語からAIが漫画を生成することで楽しく学習できる...と思ったけど、AIが生成する漫画の内容が面白くないので”自分で面白くする”仕組みにすることで、生成AIへの興味喚起と英単語学習の両方を実現しました。

![スクリーンショット 2025-02-21 20.19.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3991729/bc207531-c676-4125-afc5-8b39dc5f0326.png)



4-1. ステップ1：ビジョン共有（加点法）
英単語を覚えるのが楽しくなる体験をビジョンとして提示
エンジニアも含めて周辺の中高生へのヒアリングを実施
この段階では技術的な実現性よりも「学習を楽しくする」というビジョンに全員が集中

4-2. ステップ2：技術的検証（減点法）
エンジニアチームが各アイデアの技術的実現性を検証
クリエイターも技術的制約を理解し、「AIの生成時間が長いなら、待ち時間を魅力に変えられないか？」と提案
「できない」ではなく「どうすればできるか」を全員で考える姿勢が重要

4-3. ステップ3：クリエイティブ解決（加点法×減点法）
技術的制約（リアルタイム生成が難しいなど）を前提に、新しいクリエイティブソリューションを共に考案
例：「テンプレート＋部分生成の組み合わせ」で最終的に面白い漫画体験を実装
エンジニアが「AIはそもそもユーモアがない」といった限界を逆手に取り、「つまらない漫画を先に出して、人間が面白くする」という発想が誕生
結果、役割の垣根を超えて創発された、どちらだけでは生まれなかったプロダクトが完成しました。


## ▣まとめ & 次回予告
加点法・減点法が混ざると衝突が起きがちだけど、段階を分けて活用すれば最強のタッグになる
言い回しやコミュニケーション手段をちょっと工夫するだけで、生産性が大きく向上する
Figma、生成AIなど、ツール連携を積極的に取り入れると“共創”が加速

    あなたの組織ではどうしていますか？
    クリエイター×エンジニア間で「これは役立った！」というコミュニケーションの工夫やツール活用事例があれ
    ば、ぜひコメントで教えてください！
    逆に「こんな失敗談があった…」というリアルなエピソードも大歓迎です。

次回予告：「世間のエンジニア像 vs 実際のエンジニア」
エンジニアに対する誤解やステレオタイプをどう崩していくか？
“職人気質”と“柔軟性”を両立する開発チームの事例
お楽しみに！
AI活用すごい…けど、よくわからんので用語まとめてみた

## はじめに
先日、エンジニア組織でのAI活用に関するセミナーを視聴しました。しかし、初心者の自分にはわからないことも多く、「なんかすごいことやってるなぁ…（小並感）」という感想しか出てきませんでした。

備忘録として、知っているものも含めて簡単に用語を整理してみようと思います。

## AI Agent
AI Agent は、特定の目的に応じて自律的に動作する AI システムのことを指します。たとえば、

・チャットボット（カスタマーサポートやFAQ対応）
・自動コードレビュー（PRのチェックやリファクタリング提案）
・タスク自動化（スケジュール管理、ドキュメント生成など）

最近では、エンジニアリング業務でも AI Agent を活用し、作業を効率化する取り組みが増えています。


## Copilot
GitHub Copilot は、AI を活用したコード補助ツールです。OpenAI の Codex をベースにしており、

・コードの自動補完
・関数の提案
・コメントからコード生成

といった機能を提供します。
単純な補完だけでなく、「この関数のテストコードを書いて」などの指示にも対応できるため、開発の効率が大きく向上します。

## CodeQL

CodeQL は、GitHub が提供するコード解析ツールです。SQL に似たクエリ言語を用いてコードをスキャンし、セキュリティの脆弱性やバグを検出できます。

・静的解析 によるバグや脆弱性の発見
・カスタムクエリ を作成して特定のコードパターンを検出
・GitHub Actions との統合 により、CI/CD パイプラインに組み込み可能

セキュリティ対策の一環として、特に大規模プロジェクトでの導入が進んでいます。


## RAG（Retrieval-Augmented Generation）
RAG（検索拡張生成） は、検索技術と生成 AI を組み合わせた手法です。AI が事前に学習したデータだけでなく、リアルタイムの情報を検索しながら回答を生成するため、より正確で最新の情報を提供できます。

エンジニアリングの分野では、

・ドキュメント検索の強化（社内ナレッジベースやAPIドキュメントの参照）
・コード補完の精度向上（プロジェクト内の過去コードを参照しながら提案）

といった用途で活用されつつあります。

## DORA
DORA（DevOps Research and Assessment） は、ソフトウェア開発チームのパフォーマンスを測定するための指標を提供するフレームワークです。
Google Cloud の DevOps チームが開発し、以下の 4 つの指標が有名です。

・デプロイ頻度（Deployment Frequency） - どれくらいの頻度で本番環境にリリースしているか
・変更リードタイム（Lead Time for Changes） - コード変更が本番に反映されるまでの時間
・変更失敗率（Change Failure Rate） - デプロイ後に問題が発生する割合
・サービス復元時間（Time to Restore Service） - 障害発生時の復旧までの時間

この指標を活用することで、開発チームの改善ポイントが明確になり、より効率的な開発が可能になります。

## 終わりに
エンジニアってコード書いている時間よりも、周辺作業に多くの時間を費やしているいますよね。
PR のタイトルや説明文の自動生成は、地味ですが非常に便利だと感じました。
PR 作成のような簡単な作業でも、一つ一つが積み重なると大きな時間になるため、こうした部分から生成AIを活用していきたいと思いました。

また、活用と同時に、定性的評価と効率化による定量的評価の難しさも感じました。

テストの自動生成や AI によるコードレビューの分野はまだ発展途上であり、どこまで信頼できるのかが課題として残っているように思います。
今後は AI 活用の進化とその評価基準についても注目しつつ、エンジニア業務の効率化に役立つ情報を整理していきたいです。
どうしてもWPFのWindows10OCRがフォームで使いたい

環境はVisual Studio 2022です
色々ドハマリしすぎてヤケクソになっていたので色々お許しを
```cs
using System.Drawing.Imaging;
using System.IO;
using Windows.Media.Ocr;

namespace OCRTest;

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        OcrWin10();
    }

    public async Task OcrWin10()
    {
        var Stream = new MemoryStream();
        var Image = System.Windows.Forms.Clipboard.GetImage();
        if (Image == null)
        {
            label1.Text = "画像ファイルがグリップボードにありません";
            return;
        }
        Image.Save(Stream, ImageFormat.Png);
        var RandomStream = WindowsRuntimeStreamExtensions.AsRandomAccessStream(Stream);
        var decoder = await Windows.Graphics.Imaging.BitmapDecoder.CreateAsync(RandomStream);
        OcrEngine ocrEngine = OcrEngine.TryCreateFromUserProfileLanguages();
        var OcrResult = await ocrEngine.RecognizeAsync(await decoder.GetSoftwareBitmapAsync());
        label1.Text = OcrResult.Text;
    }
}
```
クリップボードの画像を取得してラベルにOCR結果を表示するというものです
Microsoft.Windows.CsWinRTをnugetから落としまくってください
https://www.nuget.org/packages/Microsoft.Windows.CsWinRT/2.2.0?_src=template

# おまけ
bufferやunsafeコードを使ってる方々がいっぱいいたんですけど
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3527018/6ce9d376-2533-4868-809e-feba2ea53984.png)
https://learn.microsoft.com/ja-jp/windows/uwp/audio-video-camera/imaging#create-or-edit-a-softwarebitmap-programmatically
Bufferが取れん爆破したるぞとか思っていたら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3527018/9c713522-8d83-4ec9-a800-c620e0ad6928.png)
なんか二つおんなじ名前のブツが出てきたり(Bufferが取れるのは下のXamlの方)
unsafeはコピペで使うの怖いし...

丸々半日掛かってようやく書けた...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3527018/25bddb97-73b3-44f5-8c87-830baeb91582.png)
私が使いたかった用途だと精度が低くて使えなかった。私の半日...
Win10標準機能のOcrはもっと別の用途だと使えるのかもしれないが、ちっちゃめのスクショを読み取るのはあまりに無謀だったようだ
GoogleのRust採用がAndroidのメモリ脆弱性を68%削減

https://thehackernews.com/2024/09/googles-shift-to-rust-programming-cuts.html

https://security.googleblog.com/2024/09/eliminating-memory-safety-vulnerabilities-Android.html?m=1

## はじめに

Androidの開発において、メモリ安全性は常に重要な課題でした。2019年から2024年にかけて、GoogleはAndroidの開発にRustを導入することで、メモリ関連の脆弱性を大幅に削減することに成功したそうです。特筆すべきは、メモリ安全性に関する脆弱性の割合が76%から24%にまで低下したことです。

## 背景：メモリ安全性の課題

従来のAndroid開発では、C++などが多く使用されていました。これにより、以下のような問題が発生していました：

- メモリ関連の脆弱性が頻発し、セキュリティ対策に多大なリソースが必要
- 他の脆弱性と比べて深刻度が高く、リモートからの攻撃に悪用されやすい
- 新機能開発時のリスク管理が複雑化

## メモリ安全性への取り組みの進化

Googleのセキュリティ対策は、以下のような段階を経て進化してきました：

1. **事後対応の時代**
   - 脆弱性が発見された後に修正を行う
   - ユーザーが未知の脆弱性にさらされ続ける
   - 修正のためのコストが継続的に発生

2. **予防的な緩和策の時代**
   - スタックカナリアやコントロールフロー保護などの対策を導入
   - パフォーマンスへの影響が課題に
   - 攻撃者との終わりのない競争に

3. **積極的な脆弱性発見の時代**
   - サニタイザーやファジングテストの活用
   - 根本的な原因への対処ではなく、症状への対処に留まる

4. **安全性重視の設計へ（現在）**
   - Rustなどのメモリ安全言語の採用
   - 開発段階からセキュリティを考慮
   - コードの品質と生産性の向上

## なぜRustへの移行が効果的だったのか

### 脆弱性の性質に関する重要な発見

Googleはコードの脆弱性には以下のような特徴があるとしています：

1. **脆弱性は指数関数的に減少する**
   - 時間とともにコードは成熟し、安全性が向上
   - 5年経過したコードは、新しいコードと比べて3.4〜7.4倍安全

![脆弱性は指数関数的に減少する](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiY1Fp0sUM3d7vOI11Kdae3wdsekNW_GqUdUL6LnhpjSS2cyKxvp_Dr4_N8AGVAf5VDmOAUbcMpXLLH2aYcfeszpY3hr1ttvRclMb3IWMvh9npCkY9Pc5v3jvcnJom80scnkfVBbikWLN-AcfFXSO03gEPiGDE6XSEftV6DBbUYD5HX1BQLnO0bB5-iGb0/s1600/image7.png)

2. **新しいコードに脆弱性が集中する理由**
   - 新コードは十分なテストや実運用での検証を経ていない
   - 修正時に予期せぬ副作用が発生する可能性
   - 既存のセキュリティ対策との干渉リスク

### Rustの採用による具体的な効果

1. **生産性の向上**
   - Rustによる変更は、C++と比べてロールバック率が半分以下
   - コードの正確性が向上し、バグの早期発見が可能に

2. **段階的な移行の成功**
   - 既存コードの全面書き換えは不要
   - C++、Kotlinとの相互運用性を重視
   - 新機能開発から優先的に導入

## 実際の成果

1. **脆弱性の大幅な削減**
   - 2019年：223件
   - 2024年：50件未満に低下
   - 業界平均70%に対し、24%まで低下

2. **コストとリスクの効果的な低減**
   - セキュリティ対策のための継続的なコストを削減
   - 新規開発時の安全性が向上
   - 既存コードの自然な安全性向上を活用

![脆弱性の大幅な削減](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLLibKDXpz8xiDGfAT_CHM0JEFukwW0E4mBV1FbS1WBh-ySzWYqjDK3mocOaly9voiWpXe_-o5AGgphtma0wHE3UMz7tIHksGmPopqwGuNZxLAypRF1LCb7tg5hyphenhyphenH7oy0uNvbZ3yrsaSqyFnjPpzrkAcsOfy61xWGpxjc2IGnTShE5zg1FHz1BLrimjwrn/s728-rw-e365/flaws.png)

## 実践的な教訓

この事例から、以下のような実践的な教訓が得られます：

1. **段階的な移行の重要性**
   - 新規開発からメモリ安全言語を導入
   - 既存コードは必要に応じて段階的に移行
   - 相互運用性を重視した移行戦略

2. **安全性と生産性の両立**
   - 事前のセキュリティ設計により、後からの修正コストを削減
   - 開発者の生産性向上にも貢献
   - テストやデバッグの効率化

## まとめ

Googleの事例は、メモリ安全言語への移行が実際のプロジェクトでどのような効果をもたらすかのよい例だと思います：

- 新規開発からの段階的な移行が効果的
- 脆弱性は時間とともに減少する特性がある
- 安全性と開発効率を両立するバランスをとる
Javascriptで実際に動く画面を作ってみたい！！

# はじめに
引き続きフロント触ってみたシリーズとなります

今回は以前Reactで作った画面のようなものを実際に作ってみることにします
ただ、同じものを作っても面白みがないので何かしら変化させます

# ひとまず
どこいじって良いかもわからない状況なので、スタートアップの画面から軽く修正をしてどこが変更されるかを確認しながら作業をします

例えば`npm run dev`した後の画面がありますが、こちらを管理しているのは「App.vue」というファイルです

そちらの中身を軽くいじってみると、変化が確認できます
本来はYou did it!と表示されていましたがWelcome!!と表示されていますね

これでApp.vueをいじればtop画面が変わっていくという雰囲気がわかりました

```vue
# 変更前
<HelloWorld msg="You did it!" />

# 変更後
<HelloWorld msg="Welcome!!" />
```

![スクリーンショット 2025-02-20 22.24.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701238/d7091c92-93b5-4abc-bb10-b75888336dbf.png)

# さっそく
ではtop画面に変化をつけるにはApp.vueをいじれば良いということがわかったので、自分で手を加えていきたいと思います

今回はサンプル画面の右側の部分にいくつかの要素を表示して、画面を表示した時にフェードイン(もわっと)出てくるような感じにしてみたいと思います

調べてみるとフェードイン・アウトを実現するためには`transition`というタグを使うと簡単にできるみたいです

使い方としては以下の通りで3つのコンポーネントに分けて必要なものが存在しています(デフォルトであったscriptタグのところは省略しています)

```vue
<template>
    <div class="container">
      <transition>
        <h1 v-if="show">list 1</h1>
      </transition>
      <transition>
        <h1 v-if="show">list 2</h1>
      </transition>
      <transition>
        <h1 v-if="show">list 3</h1>
      </transition>
      <transition>
        <h1 v-if="show">list 4</h1>
      </transition>
      <transition>
        <h1 v-if="show">list 5</h1>
      </transition>
      <transition>
        <h1 v-if="show">list 6</h1>
      </transition>
      <transition>
        <h1 v-if="show">list 7</h1>
      </transition>
    </div>
</template>

<script>
export default {
  data() {
    return {
      show: false, // 最初は非表示
    };
  },
  mounted() {
    // 画面表示後に `show` を `true` にしてフェードイン
    setTimeout(() => {
      this.show = true;
    }, 100); // 少し遅延させると自然なフェードインになる
  },
};
</script>

<style>
.v-enter-active {
  transition: opacity 2s;
}

.v-enter-from {
  opacity: 0;
}
</style>

```

## templateの部分
こちらはHTMLの構造（画面の見た目）を定義する部分です
表示したい文などをHTMLタグを使用してコーディングしていきます
今回は大きくヘッダーで表示したものをフェードインさせようと思います

ここで注意しておかなければいけないところはtransitionタグの中には要素が一つしか入れられないということです

なので以下のような書き方はエラーになってしまいます

```vue
<!-- これはエラー -->
<transition>
    <h1 v-if="show">list 1</h1>
    <h1 v-if="show">list 2</h1>
</transition>
```
なのでh1それぞれを囲むようにしています

## scriptの部分
ここにはデータやメソッド（処理）を記述します
今回実装した処理はtemplateで記載したh1タグの初期表示状態の設定と画面を開いた際にフェードインを有効にさせる処理を記載しています

mounted()というものが画面が表示された時に呼び出される関数のようです
なので画面が表示された際にはh1タグに設定しているshowフラグをtrueに変更し、フェードインができるようにするといった内容になっています

## styleの部分
CSSでデザインを設定する部分です
今後は結構ここがポイントになってくる部分ですね

今回だとフェードインの表示具合などをどうするかここに記載しています([公式説明](https://ja.vuejs.org/guide/built-ins/transition))
.v-enter-fromでフェードイン対象の初期状態を表し、.v-enter-activeでフェードイン・フェードアウト中の状態を表しているそうです

今回、初期状態は見えない状態でいて欲しいので.v-enter-fromないのopacity(不透明度)は0に設定しておきます
また、フェードイン中は徐々にopacityの値が増加していって欲しいのでtransition: opacityとし、2sごとに変化させているといった内容になります

# おわりに
ということで、フェードイン処理を使用して実際に動く画面を作ることができました
まだまだ、変更を加えて良いものを作ってから完成系はこうなりましたというものを見せられたらなと思います

乞うご期待です
Zscaler入れたらSSL証明書エラーが出るようになった

# 概要
会社がZscalerを入れたら、以下のエラーが出るようになった（Azure CLIのUpdateが出来ない）
```
HTTPSConnectionPool(host='aka.ms', port=443): Max retries exceeded with url: /installazurecliwindowsx64 (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1000)')))
```

# 対応方法
1. ZscalerのSSL証明書（拡張子が.crt）をローカルにダウンロードする
2. 1をメモ帳等で開き内容をコピーする
3. 「C:\Program Files\Microsoft SDKs\Azure\CLI2\Lib\site-packages\certifi\cacert.pem」を管理者権限でメモ帳で開く
4. 2の内容を最後に加える（見ればわかる）

以上！
「Qwenで実現するAIエージェント開発！」参加レポート

2025年2月18日、株式会社レッジで開催されたセミナーに参加しました。本セミナーは**Alibaba Cloud**のクラウド環境で、AIアプリケーション開発を体験するハンズオン形式で進められました。

Alibaba CloudやQwenの概要を紹介しつつ、セミナーの内容や実際に触れて感じたことをレポートします。

## **はじめてのAlibaba Cloud**

今回のハンズオンで利用したのは**Alibaba Cloud**。  
Alibaba Cloudは、2009年にAlibabaグループのクラウドコンピューティング部門として設立され、現在では29のデータセンター地域と87のアベイラビリティゾーン（AZ）を持ち、200以上の国と地域でサービスを展開しています。

提供されるサービスは、エラスティックコンピューティング、データベース、ストレージ、ネットワーク、セキュリティ、AIなど多岐にわたります。AI関連の機能も充実しており、QwenをはじめとするAIモデルを簡単にデプロイして利用するサービスも提供されています。

### **実際に触れてみた感想**
初めてAlibaba Cloudを利用するため事前のアカウント作成が必要でしたが、アカウント作成や最初のログインの手順が少し独特だと感じました。

他に気になったのは、コンソールのメニューをクリックすると新規タブ/ウィンドウが開くことが多いように感じて、個人的には少し使いにくいと感じました。また画面の一部に中国語が表示されることもあります。

一方で**ノーコードでAIモデルをファインチューニングできる機能**があるようです。これは非常に魅力的なので、試してみたいポイントの一つです。

## **Qwen2.5：高性能な日本語対応LLM**

本セミナーではAlibaba Cloudが開発した**Qwen 2.5**を使ってAIエージェントの開発をしました。  

### **Qwenの特徴**
- **日本語対応の精度が高い**  
  多言語対応のLLMの中でも、日本語の処理能力が優れているそうです。ハンズオンセミナーで利用していても日本語の違和感は全く感じませんでした

- **オープンソース版が公開**  
  Hugging Faceなどでオープンソース版が提供されています

- **多様なモデルサイズ**  
  500M（0.5億）パラメータの小型モデルから、72B（72億）パラメータの大規模モデルまで、用途に応じて選択可能

- **マルチモーダル対応**  
  テキストだけでなく画像・動画・音声を処理できるモデルもあります
---

## **Model Studio：直感的に使えるAI開発環境**

Alibaba Cloudの**Model Studio**は、**Qwenや他のAIモデルを使ったAIアプリを開発できるプラットフォーム**です。類似のツールを利用した経験があったので、操作は直感的に理解できました。

まずはPlaygroundでQwenのモデルを試しました。

![01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/930390/fd632f60-aafc-4d82-b3b3-0455d6d9465f.jpeg)





Model Studioには、**プロンプトのサンプルが豊富に登録**されていました。比較的シンプルなプロンプトが多く、もう少し高度なものがあっても良いのでは？と感じましたが、初心者にはわかりやすく学習の入り口として適しているのかもしれません。

![04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/930390/ddc81483-e648-46b3-a74c-4e017618a3a4.jpeg)


---

## **RAGアプリケーションの開発**


ハンズオンではRAGアプリケーションを作成しました。アプリケーションのテンプレートから構築できるので簡単です。

![02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/930390/166eebbb-2f16-49c0-9b3a-bddf8ffaf0a9.jpeg)

左側の設定メニューを順番に埋めていけば短時間で構築できます。

![05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/930390/2dcc1464-1ff4-4160-bd30-2c67fbc0e6d8.jpeg)

RAGのナレッジとしてPDFをアップロードしました。そのチャンクを表示すると、全て中国語に翻訳されていました！内部では中国語で処理されているようです。

![06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/930390/259e8ec6-cf17-498e-bb18-21002e2affb8.jpeg)


---

## **ネットワーキング：活発な情報交換の場に**

セミナー後のネットワーキングでは、ほぼ全員が参加。これだけ出席率が高いのは珍しいのではないでしょうか。皆さん積極的に交流されていました。  
参加者の層も幅広く、**若手エンジニアから経験豊富な技術者まで、さまざまなバックグラウンドを持つ方々**とお話しができました。

会場の広さや人数のバランスが絶妙で、自然に会話が生まれる環境でした。**「今どんな技術が注目されているのか？」といったトレンドの話**も多く、非常に有意義な時間となりました。

---

## **まとめ：Alibaba CloudとQwenの可能性**

短い時間でしたが今回のハンズオンセミナーを通じて、**Alibaba CloudとQwenを活用したAIアプリ開発の流れ**を体験しました。特に以下のポイントが印象に残りました。

- **Alibaba Cloudの機能が充実しているが、最初は慣れが必要**
- **Qwenは日本語対応の精度が高い**
- **ノーコードでRAGエージェントを素早く作ることができる**
- **Model Studioは直感的に使え、初心者にも優しい設計**
- **有意義だったネットワーキング**

馴染みのなかったAlibaba CloudとQwenですが、今後は選択肢の1つとして考えられそうだと感じました。アカウント作成時に与えられたクーポンが残っているので、他のサービスも試したいと思います。
AWS KMSのユースケースと活用方法

AWS Key Management Service（AWS KMS）は、暗号化キーの作成、管理、および使用を安全に行うためのマネージドサービスです。この記事では、AWS KMSを活用できるさまざまなユースケースを分かりやすく紹介します。

## 1. データの暗号化
AWS KMSは、データを安全に保護するために広く利用されます。

- **Amazon S3の暗号化**
![aws_kms_s3_暗号化.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294049/99428ab5-d49d-46b4-b6e4-48eafac1eba9.png)

  - S3バケットに保存するデータをKMSのキー（CMK）で暗号化できます。
  - サーバー側暗号化（SSE-KMS）を利用することで、データの機密性を向上。
- **Amazon RDSの暗号化**
![aws_kms_rds_暗号化.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294049/32176650-bff2-461a-bea2-165b9c9366b1.png)

  - データベースインスタンスとスナップショットをKMSキーで暗号化。
- **Amazon EBSの暗号化**
  - EC2のストレージ（EBSボリューム）を暗号化し、スナップショットも保護。
- **Amazon DynamoDBの暗号化**
  - データを保存時に暗号化し、不正アクセスを防止。

## 2. アプリケーションでのデータ暗号化
![aws_kms_アプリケーション暗号化.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294049/304c17a0-026a-461a-9571-89cf251aa512.png)

AWS KMSを利用すると、アプリケーションレベルで機密情報を安全に管理できます。

- **KMS APIを活用**
  - `Encrypt` APIでデータを暗号化し、`Decrypt` APIで復号。
  - クレジットカード情報や個人情報の保護に活用。
- **エンベロープ暗号化（Envelope Encryption）**
  - KMSでデータキー（Data Key）を生成し、アプリ内でデータを暗号化。
  - KMSには暗号化済みのデータキーのみを保存し、必要なときに復号。

## 3. IAM認証とアクセス管理
AWS KMSはIAMと統合され、アクセス権を細かく設定できます。

- **IAMポリシーを利用した権限制御**
  - 特定のIAMユーザーやロールに対して、KMSキーの使用権限を付与。
  - 本番環境と開発環境で異なるキーを使用し、セキュリティを強化。
- **AWS Organizationsとの連携**
  - 複数のAWSアカウント間でKMSキーを共有し、一元管理。

## 4. TLS証明書と鍵の管理
AWS KMSは、暗号化通信を安全に管理するためにも活用できます。

- **AWS Certificate Manager（ACM）と統合**
  - TLS/SSL証明書のプライベートキーをKMSで保護。
- **Amazon CloudFrontとの連携**
  - CloudFrontのカスタムオリジンとの通信をTLSで保護。

## 5. AWS Lambdaとの統合
AWS Lambda関数の機密情報管理にもKMSが役立ちます。

- **環境変数の暗号化**
  - 機密情報をKMSで暗号化し、安全に保存。
- **AWS Secrets Managerとの連携**
  - データベースの認証情報などのシークレットを暗号化管理。

## 6. ログデータの保護
システムの監査ログやアクティビティログを安全に保存できます。

- **AWS CloudTrailのログ暗号化**
  - S3に保存するCloudTrailのログをKMSキーで暗号化。
- **Amazon CloudWatch Logsの暗号化**

![aws_kms_cloudwatch_logs_暗号化.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294049/33f9bc01-11ce-49e2-a4c7-e107ec2bd56e.png)

  - ログデータの改ざん防止とセキュリティ向上。

## 7. クロスアカウントでのKMSキー共有
AWS KMSのキーを異なるAWSアカウント間で安全に共有できます。

- **本番環境と開発環境で共通のキーを利用**
  - セキュリティポリシーを統一し、運用の効率化。
- **別のAWSアカウントのサービスに安全なアクセスを提供**
  - 監査やデータ共有のユースケースで活用。

## 8. HSM（ハードウェアセキュリティモジュール）の代替
AWS KMSは、オンプレミスのHSMを置き換える選択肢としても有効です。

- **AWS CloudHSMとの比較**
  - KMSは管理負担を軽減し、簡単に暗号鍵を運用。
  - HSMの高いコンプライアンス要件が必要な場合はCloudHSMを選択。

## まとめ
AWS KMSは、データ保護や暗号化キー管理を効率化し、多くのAWSサービスと統合できます。システムのセキュリティ強化やコンプライアンス要件の遵守に活用できるため、適切なユースケースを選びながら導入してみてください。
RHELにWindowsリモートデスクトップ接続(XRDP)

Windows付属のリモートデスクトップせつぞｋアプリ（mstsc）を使って、
Linux(RHEL)にリモートデスクトップ接続する方法です。

1. LinuxにGUI(GNOME)をインストールする
```bash:Linux:bash
dnf groupinstall "Server with GUI"
```
　
2. TigerVNC Serverをインストールする
```bash:Linux:bash
dnf install tigervnc-server
```
　
3. XRDPパッケージが格納されているEPELリポジトリを有効化する
```bash:Linux:bash (RHEL8の場合)
dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
```
```bash:Linux:bash (RHEL9の場合)
dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
```
```bash:Linux:bash (RHEL10の場合)
dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-10.noarch.rpm
```
　
4. XRDPパッケージと依存パッケージをEPELリポジトリからインストールする
```bash:Linux:bash
dnf install xrdp
```
　
5. ファイアウォールに穴をあける
```bash:Linux:bash
firewall-cmd --add-port=3389/tcp --permanent
firewall-cmd--reload
```
　
6. CRDPサービスを起動する
```bash:Linux:bash
systemctl start --now xrdp
```
　
7. Windowsリモートデスクトップ(mstsc)アプリで接続する
```bat:Windows
mstsc /v:<SERVER_IP>:3389
```
・Windowsリモートデスクトップ接続時はコンピュータ名のみ指定すれば良い。
・Linuxログインするユーザとパスワードはその次に表示される画面で入力する。
　
参考
https://dev.classmethod.jp/articles/202501-installing-gui-on-rhel-9/
https://dev.classmethod.jp/articles/installing-gui-on-rhel-8/
https://access.redhat.com/solutions/3358
【gPhoto2】WSL2（Ubuntu）でデジタルカメラを操作

# 必要なソフトウェア・環境
* Windows11(24H2)
* Ubuntu(WSL2：WSL バージョン: 2.0.14.0、カーネル バージョン: 5.15.133.1-1)
* [usbipd](https://github.com/dorssel/usbipd-win/releases)(usbipd-win 4.4.1)
* gphoto2(gphoto2 2.5.27)

gphoto2のインストールは下記をターミナルへ入力

```bash:bash
sudo apt install gphoto2

//エラーが出たとき
sudo apt-get update
```
USBデバイスをWSL2で認識するように設定する。
下記の場合は、`<busid>`に`6-3`に置き換える。

```Powershell:powershell
> usbipd list

Connected:
BUSID  VID:PID    DEVICE                                                        STATE
2-6    0a12:0001  Generic Bluetooth Radio                                       Not shared
6-1    046d:c52b  Logitech USB Input Device, USB 入力デバイス                   Not shared
6-3    04a9:32e2  Canon EOS RP                                                  Shared (forced)

# 管理者権限で下記を実行する。
> usbipd bind --busid 3-10

> usbipd attach --wsl --busid <busid>
```
## カメラの設定
MENU →（セットアップ）→［USB接続］→ PCリモート

# インストールの確認（バージョン確認）

```bash: bash
> gphoto2 --version

gphoto2 2.5.27

Copyright (c) 2000-2021 Marcus Meissner and others

gphoto2 comes with NO WARRANTY, to the extent permitted by law. You may
redistribute copies of gphoto2 under the terms of the GNU General Public
License. For more information about these matters, see the files named COPYING.

This version of gphoto2 is using the following software versions and options:
gphoto2         2.5.27         gcc, popt(m), exif, cdk, aa, jpeg, readline
libgphoto2      2.5.27         standard camlibs, gcc, ltdl, EXIF
libgphoto2_port 0.12.0         iolibs: disk ptpip serial usb1 usbdiskdirect usbscsi, gcc, ltdl, EXIF, USB, serial without locking
```
## カメラを接続するたびに必要なこと
```powershell:powershell
> usbipd attach --wsl --busid 3-10

usbipd: info: Using WSL distribution 'Ubuntu' to attach; the device will be available in all WSL 2 distributions.
usbipd: info: Detected networking mode 'nat'.
usbipd: info: Using IP address 172.25.xxx.x to reach the host.

```

# 接続の確認
```bash:bash
> lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 005: ID 04a9:32e2 Canon, Inc. Canon Digital Camera
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```
となり、
```bash:bash
> gphoto2 --summary

Camera summary:
Manufacturer: Canon.Inc
Model: Canon EOS RP
  Version: 3-1.6.0
  (続く)
```
となれば接続完了！

## Sony Alpha-A7 III の場合
セットアップ4 > UBS接続 >PCリモート
PC Control -> Image Capture, Trigger Capture, Liveview, Configuration

http://www.gphoto.org/proj/libgphoto2/support.php

# 撮影
```bash:bash
gphoto2 --capture-image
```

# 参考文献
https://github.com/luisch/eclipse_tool

https://learn.microsoft.com/ja-jp/windows/wsl/connect-usb

https://note.com/trapezium_orion/n/n68c5246fe1cb

https://github.com/luisch/eclipse_tool

## gphoto2対応カメラ一覧

http://www.gphoto.org/proj/libgphoto2/support.php
N＋１問題回避って何？　リレーショナルデータベース　Laravel

いつも通りコントローラーでリレーション使いながらお仕事をしていた時。

view側を見ると
こんなコードが

    <tr>
        <th colspan="4" rowspan="2">果物を収穫した農園主</th>
        <th colspan="2">農園の所在地</th>
        <td colspan="8">{{ $fruit->field->owner->region }}{{ $fruit->field->owner->farm_address }}</td>
    </tr>

コントローラーを見ると

    $fruit = Work::where('orchard_id', $orchard->id)
                 ->whereNull('rotten_at')
                 ->with('branch')
                 ->with('field')
                 ->with('basket')
                 ->with('basket.seed')
                 ->with('picker')
                 ->with('customer')
                 ->findOrFail($fruitId);

withでとってきていないな。
ん？これでも取得できるんだ「へー」となっておりました。

そんで調べてみたら
N+1問題を回避するためにはコントローラーでまとめたほうが良いよ！

と書いてある。

何じゃ？
ということでもうちょっと調べてみた。

## N+1ってまずなに

### パターン紹介

ユーザー一覧を取得する。

    SELECT * FROM users;

→100人いました！！！

その後各ユーザーの投稿件数を数えるためには100回クエリの実行が必要になる。

    SELECT * FROM posts WHERE user_id = 1;
    SELECT * FROM posts WHERE user_id = 2;
    ...
    SELECT * FROM posts WHERE user_id = 100;

### 結果
合計ユーザー一覧で1回、ユーザーごとの投稿数を取得するのに100回のSQLを実行した。

欲しいのはユーザーごと(100人分)の投稿数。
クエリの実行が合計101回となるということでN+1問題ということらしい。

この数が多くなればなるほどどんどんパフォーマンスが落ちるよ〜ということ。


それを解決するのがいつもコントローラーでやっていたあれ。

    $users = User::with('posts')->get();

これでユーザーと投稿をひとまとめで取得できる。
ユーザーを取得するクエリとこのクエリの合計2回で済むってことらしい。

このwithメソッドはEager loadingというらしい。



SQL文を利用すると

    $users = User::select('users.*')
        ->leftJoin('posts', 'users.id', '=', 'posts.user_id')
        ->groupBy('users.id')
        ->selectRaw('count(posts.id) as post_count')
        ->get();

つまりviewに記載していたのはクエリを余分に実行してしまっていた。

なので


     $fruit = Work::where('orchard_id', $orchard->id)
                     ->whereNull('rotten_at')
                     ->with('branch')
                     ->with('field')
                     ->with('basket')
                     ->with('basket.seed')
                     ->with('picker')
                     ->with('customer')
                     ->with('owner') //追加
                     ->findOrFail($fruitId);

としてこう書き換えた

       <tr>
            <th colspan="4" rowspan="2">果物を収穫した農園主</th>
            <th colspan="2">農園の所在地</th>
            <td colspan="8">{{ $fruit->owner->region }}{{ $fruit->owner->farm_address }}</td>
        </tr>

これでクエリの実行回数は減ったんだろう。
ローカルの数が少ないところでやっているので速度はわからないが。



## クエリって何？

クエリクエリ言ってなんとなく使っていたけど
クエリはDBに質問する命令文のことを言うらしい。

SELECTやINSERT、UPDATE、DELETEのことだ。

機能の追加作業をやっているけど楽しいな。
そしてこういった要件決める人大変そう。