OmniAICreator/Qiita-1.07M huggingface dataset:
声でつながるAIとの対談: 挿入曲 #13 - Bossanova, Jazz, Piano【Suno AIでつくった楽曲】 v4 & Custom Mode: On 【動画 3分24秒】【YouTubeチャンネルからの転記です】

この記事は、わたしの[YouTubeチャンネル](https://bit.ly/Yamanaka-YouTube "Living without things. 持たない生き方 手放す生き方")にある公開動画を転記しております。
( どこかのタイミングで、プログラミング-Google Apps Script or iPaaS-Zapier をつかって自動転記させる予定です )

転記のための時間コストを少なくしたいので、文字装飾( Markdown記法 )を極力つかわずに書いております。

こちらが動画内容です👇

***

![01 YouTubeサムネイル & 再生中の画像 Suno AI _ 声でつながるAIとの対談_ 挿入曲 #13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386308/79fd29d5-eaed-cd13-4812-8b211dbb91a8.png)




* # 動画URL
    * https://youtu.be/N9UsXLd3S9U

<br>

* # 動画タイトル
    * 声でつながるAIとの対談: 挿入曲 #13 - Bossanova, Jazz, Piano【Suno AIでつくった楽曲】 v4 & Custom Mode: On 【動画 3分24秒】

<br>

* # 動画の説明欄(一部を抜粋)

📅撮影日 = 2025-01-01(水)

Suno AIとは、文章から音楽を生成することができるAI( Text-to-Music-AI )です。
わたしは、2024-04-02(火)に初めてSuno AIで有償プランを契約してから、時々楽曲をつくって遊んでいます。

🎦【Suno AI】文章から音楽を生成するAI( Text-to-Music-AI )で、3分間で2曲、6分間で4曲作りました【試聴可能】1)伴侶の曲 2)税理士の曲【動画 16分11秒】
https://youtu.be/QKfhk4HgQ_g

🎦“Suno AIでつくった楽曲”シリーズ
https://www.youtube.com/playlist?list=PLpQhBHT4oghMLdiSVqwvSs_Z5y0H4VGOe

🎦“効果的にSuno AIを活用するヒント”シリーズ
https://www.youtube.com/playlist?list=PLpQhBHT4oghPuaNOVZn-N53wVvsBkeHdI


今回は、Suno AIでつくった曲を WAV で出力してから、動画編集いたしました。

“声でつながるAIとの対談”シリーズ
https://www.youtube.com/playlist?list=PLpQhBHT4oghOpTHU0rmfXSgjqV1_j6Eao
👆の挿入曲としてつかう予定です。

ぜひ聴いてみてください。
そして、ぜひみなさんも、ご自身の対談、番組、コンテンツのために楽曲をつくってみてください！

作曲日:
2024-12-04(水)

Suno AI 契約の種類:
Pro Plan

Suno AI Version:
v4

楽曲の正式名称:
声でつながるAIとの対談: 挿入曲 #13 - AI Voice Talks: Minimal Melody

Suno AI Library URL:
https://bit.ly/AI-Voice-Talks-Minimal-Melody-13

Custom Mode: On

Audio Inputs: Not Used

Instrumental:


---


Suno AIへの指示文章( プロンプト/Prompt ): Custom Modeの場合は”Style of Music”を指定します。


🇬🇧English

[Jazz][Bossanova][Piano][Orchestra][220 Seconds][Break][Outro]


🇯🇵日本語訳

[ジャズ][ボサノバ][ピアノ][オーケストラ][220秒][ブレイク][アウトロ]


---


Suno AI 公式URL
https://accounts.suno.ai


---


🎥この動画と関連が強いわたしの動画
・“Suno AIでつくった楽曲”シリーズ
https://www.youtube.com/playlist?list=PLpQhBHT4oghMLdiSVqwvSs_Z5y0H4VGOe


・“効果的にSuno AIを活用するヒント”シリーズ
https://www.youtube.com/playlist?list=PLpQhBHT4oghPuaNOVZn-N53wVvsBkeHdI


・“声でつながるAIとの対談”シリーズ
https://www.youtube.com/playlist?list=PLpQhBHT4oghOpTHU0rmfXSgjqV1_j6Eao


🎥Shortened URL for this video | この動画の短縮URL
https://bit.ly/4a4IXp5
量子コンパイラを作る。 その25

# 概要
量子コンパイラを作る。
elixirで論理回路アセンブラをコンパイルして、qiskitを生成できるが、結局、論理回路が書けるのかが、問題になる。（人材の問題、それなりの人の育成、、、）
そっちに、対策を取る。
論理回路アセンブラから、論理回路を生成して、ビジュアルでシュミレーションするエディタを開発する。どうだ。
3の倍数検出器

# 成果物

https://embed.plnkr.co/plunk/QBs8bLvw35z9ou5s


# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/58ec53e6-61e4-c77d-7db1-05d50affd674.png)


# サンプルコード

```
make 10
in 0 2
wire 3 8
not 2 3
and 0 1 4
and 1 2 5
not 0 6
and 3 4 7
and 5 6 8
or 7 8 9
out 9 9
```

以上。
量子コンパイラを作る。 その24

# 概要
量子コンパイラを作る。
elixirで論理回路アセンブラをコンパイルして、qiskitを生成できるが、結局、論理回路が書けるのかが、問題になる。（人材の問題、それなりの人の育成、、、）
そっちに、対策を取る。
論理回路アセンブラから、論理回路を生成して、ビジュアルでシュミレーションするエディタを開発する。どうだ。
3bit加算器

# 成果物

https://embed.plnkr.co/plunk/GEaZOnZHFcPV3Tge

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/e535cc95-ec56-9227-ff41-b454fbe4259a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/ef99fd2e-7ea9-1432-f961-2373584141ef.png)


# サンプルコード

```
make 18
in 0 5
wire 6 13
xor 0 3 14
and 0 3 6
xor 1 4 7
and 1 4 8
xor 6 7 15
and 6 7 9
or 8 9 10
xor 2 5 11
and 2 5 12
xor 10 11 16
and 10 11 13
or 12 13 17
out 14 17
```

以上。
OpenAIのAPI利用料金について

## はじめに

OpenAIのAPIの利用料金についての記事です。

利用料金に関する記事は、ググるとたくさん出てきますが、わりと頻繁に改定があるようなので、公式サイトで最新情報はチェックすることをお勧めします。

## 内容

OpenAIの公式サイト
https://openai.com/ja-JP/api/pricing/

公式サイトをみると、例えば「gpt-4o」であれば、つぎのようになっています。

>1K（1,000トークン）で$0.0025
1M（1,000,000トークン）で$2.5

1,000K＝1Mなので、1Mは1,000×1,000＝1,000,000トークンです。
つまり、100万文字を使って、$2.5です。

API利用料金の計算方法です。

>入力したトークン数×利用単価 + 出力したトークン数 ×利用単価

つまり、入力したトークン数だけでなく、モデルが吐き出した文字数のコストも自分持ちとなります。

文章をトークンという単位に分解して、トークン数を導きだしてくれるツールがあります。

トークンアナライザー
https://platform.openai.com/tokenizer

トークンアナライザーで文章からトークン数を調べてみると、ほぼほぼ、つぎのようにカウントされます。

>英語の場合は、１単語１トークン
日本語（全角/半角）の場合は、１文字１トークン

英語の場合、厳密に１単語１トークンとなるのかといえば、そうならない場合もあります。何をもって１トークンと判断されるのかは分かりませんが、ほぼほぼ、１単語１トークンという認識でOKではあります。

日本語の場合でも、厳密に１文字１トークンとはならない場合もあります。文字によっては、２文字を１トークンと解釈する場合もあるようです。しかしこちらも、ほぼほぼ、１文字１トークンと認識しておいてOKでしょう。

こちらが詳しいです。

https://www.goatman.co.jp/media/chatgpt-token/#%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E6%95%B0%E3%81%AE%E8%AA%BF%E3%81%B9%E6%96%B9

## 残高の確認の仕方

こちらからログインします。
https://platform.openai.com/

Settings（右上の歯車アイコン） → Billingを選択します。

Credit balanceに表示される金額が残高です。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/9da28971-648d-e288-9d75-5fd06eae1c25.png)
量子コンパイラを作る。 その23

# 概要
量子コンパイラを作る。
elixirで論理回路アセンブラをコンパイルして、qiskitを生成できるが、結局、論理回路が書けるのかが、問題になる。（人材の問題、それなりの人の育成、、、）
そっちに、対策を取る。
論理回路アセンブラから、論理回路を生成して、ビジュアルでシュミレーションするエディタを開発する。どうだ。
2bit乗算器

# 成果物

https://embed.plnkr.co/plunk/lI2l8FZqWXwCuIyB

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/eb021976-7747-aefb-6fcc-2f3f00bdc9e4.png)


# サンプルコード
2bit乗算器
```
make 12
in 0 3
and 0 2 4
and 1 2 5
and 1 3 11
and 0 3 6
xor 5 6 10
and 5 6 7
xor 4 7 9
and 4 7 8
out 8 11
```

以上。
【AWS SAP】Amazon Inspectorを活用したAWS Lambda関数のセキュリティ強化

# Amazon InspectorによるAWS Lambda関数のスキャン概要

```mermaid
flowchart TD
    subgraph Lambdaサービス
        A[Lambda関数デプロイ]
    end

    subgraph Inspectorサービス
        B[Amazon Inspectorによるスキャン]
        C[脆弱性やリスク情報を検出]
        D[検出結果を記録<br>脆弱性、影響範囲、優先度、修正方法]
    end

    subgraph EventBridgeサービス
        E[Amazon EventBridge]
    end

    subgraph 通知サービス
        F[通知や自動修復アクション]
        G[AWS SNSまたはAWS Lambda関数でアラートを送信]
    end

    A -->|コードや依存関係の変更| B
    B --> C
    C --> D
    D --> E
    E --> F
    F --> G
```

## 機能について
**Amazon Inspector** は、AWS Lambda 関数などのセキュリティ脆弱性を自動でスキャンし、関数や依存ライブラリの脆弱性を効率的に検出・解消することができます。

:::note alert
※リアルタイムのトラフィック監視はできません
:::


## 主なスキャンタイプ

### Lambda 標準スキャン
- デフォルトで有効化されるスキャン
- Lambda 関数およびレイヤー内の依存関係を調査
- **CVE**の検出に特化

### Lambda コードスキャン
- Lambda 関数とレイヤー内のカスタムコードを解析
- 内部コードのセキュリティリスクやデータ漏洩の可能性を特定

## スキャン有効化手順

### 1. Amazon Inspectorのアクティブ化
- 自動でCVEスキャンを開始。
- Lambda 関数の脆弱性検出とセキュリティ強化を実施。

### 2. Lambda 標準スキャンとコードスキャンを有効化
- 包括的なセキュリティ対策を提供。
- 必要に応じてコードスキャンのみを有効化可能。

### 3. コードスキャン対象外の設定
- タグ `InspectorCodeExclusion` を使用。
  - キー: `InspectorCodeExclusion`
  - 値: `LambdaCodeScanning`
- 必要な関数のみをスキャン対象に設定し、リソースを効率化。

## 利用メリット
- 継続的なセキュリティ評価で脆弱性を早期発見
- スキャン対象を柔軟に制御可能
- 関数およびライブラリの安全性を向上

## Amazon Inspectorでスキャン可能なサービス一覧

| No | サービス               | スキャン内容                                                                 |
|----|------------------------|----------------------------------------------------------------------------|
| 1  | Amazon EC2            | インスタンスのソフトウェア脆弱性スキャン、セキュリティグループの設定評価                                     |
| 2  | Amazon ECR            | プッシュされたコンテナイメージの脆弱性スキャン                                                       |
| 3  | AWS Lambda            | - **Lambda 標準スキャン**: 依存関係のCVE特定<br>- **Lambda コードスキャン**: カスタムコードのリスク検出   |
| 4  | Amazon ECS            | ECSタスク定義に基づくコンテナイメージの脆弱性スキャン                                               |
| 5  | Amazon Fargate        | Fargate利用コンテナイメージの脆弱性スキャン                                                       |
### 1. **Amazon EC2**
- インスタンスにインストールされたソフトウェアの脆弱性をスキャン。
- セキュリティグループの設定を評価。

### 2. **Amazon ECR（Elastic Container Registry）**
- プッシュされたコンテナイメージをスキャンし、脆弱性を特定。

### 3. **AWS Lambda**
- **Lambda 標準スキャン**: アプリケーション依存関係をスキャンし、CVEを特定。
- **Lambda コードスキャン**: 関数内部のカスタムコードをスキャンし、セキュリティリスクを検出。

### 4. **Amazon ECS（Elastic Container Service）**
- ECSタスク定義に基づいて稼働するコンテナイメージのスキャンを実施。

### 5. **Amazon Fargate**
- Fargateを利用するコンテナイメージの脆弱性をスキャン。

### その他
- サービスが対象外でも、ECRやLambdaなどの依存関係を通じて間接的なセキュリティ評価が可能。
怪奇⁈年末の数日だけ起きるバグ!

# 始まり

それは2024年12月29日日曜日の午前中に起きた。
それまで問題なかったGoogle Cloud Storage(Amazon S3互換のクラウドストレージ; 以下GCS)へのアクセスが出来なくなったのだ。
エラーは`RequestTimeTooSkewed`。これはリクエストを発行した時刻とGCS側のサーバの時刻が15分以上乖離しているときに生じるエラーだ。
なぜ？


# 調査

"RequestTimeTooSkewed"で検索してみると、大体が「あんたのマシンの時刻がズレてるだけだからNTP[^NTP]を正しく設定しなさい」と宣っているのであった。

[^NTP]: https://ja.wikipedia.org/wiki/Network_Time_Protocol

でも、当方のサーバはNTPについては正しく設定されており、時刻はなんならミリ秒単位で正確だ。
時刻は合っているのになぜ？

そこで、もう一度エラーメッセージを読み返してみると…
なんと、こちらのリクエストの日付が**2025**年12月29日(1年後の日付)になっているではあーりませんか！
そんな馬鹿な…。


# 判明した原因

実はGCSとのやりとりには自分で作成したプログラム[^my-own-program]を使用していました。そのプログラムを書くために使った言語([Swift](https://Swift.org))の特性上、リクエスト日時のフォーマッティングには[UTS#35で定められているDate Format](https://unicode.org/reports/tr35/tr35-dates.html#Date_Format_Patterns)を用いていました。

[^my-own-program]: [車輪の再発明が好き](https://Qiita.com/YOCKOW/items/78e38d423bb4c8f044ca)なので…。


コードにすると次のような感じです:

```swift
let s3DateTimeFormatter = DateFormatter()
s3DateTimeFormatter.locale = Locale(identifier: "en_US")
s3DateTimeFormatter.timeZone = TimeZone(secondsFromGMT: 0)
s3DateTimeFormatter.dateFormat = "YYYYMMdd'T'HHmmss'Z'"
```

これ何が問題か分かりますか？

問題は`YYYY`の部分です。
結論から言うと、`YYYY`(大文字)ではなく`yyyy`(小文字)にしなくてはいけません。

`YYYY`(大文字)についてはUTS#35にこう書かれています:


> Year in “Week of Year” based calendars in which the year transition occurs on a week boundary; may differ from calendar year ‘y’ near a year transition.
>
> (YOCKOW拙訳)
> 週の境界によって年の遷移が起こるカレンダーに基づく「暦週」における年。年が変わる前後では暦年である'y'と異なる場合がある。


これは即ち、`YYYY`(大文字)はISO 8601が言うところの暦週における年を指しているということなのです。`strftime`での`%G`と同じことです。
どういうことかというと、**年末の最終週は翌年として扱われる場合がある**ということになります。

実際、2024年12月29日日曜日午前9時(JST)以降`YYYY`(大文字)は`2025`となり、結果として冒頭に書いたようなエラーが起きたわけでした。


# 修正

というわけで、`YYYY`(大文字)を`yyyy`(小文字)に直すだけで一件落着。

ちなみに、Appleが公開しているData Formatting Guideの[Date Formatters](https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/DataFormatting/Articles/dfDateFormatting10_4.html#//apple_ref/doc/uid/TP40002369-SW1)にも次のように明記されていました: 

> A common mistake is to use `YYYY`. `yyyy` specifies the calendar year whereas `YYYY` specifies the year (of “Week of Year”), used in the ISO year-week calendar. In most cases, `yyyy` and `YYYY` yield the same number, however they may be different. Typically you should use the calendar year.
>
> (YOCKOW拙訳)
> (年部分を表すのに)よくある間違いとしては`YYYY`を使うということがある。`yyyy`は暦年を示す一方で`YYYY`はISOの暦週を用いた年を示す。ほとんどの場合、`yyyy`と`YYYY`は同じ数値となるが、異なる場合もある。典型的には暦年を用いるべきである。


# 結論

`YYYY`ではなく`yyyy`を使おう！
(というか、暦週の年って誰が使うの？)
新しいビルド構成を作成し、デバッグとリリースを切り替える

ビルド構成を新規作成した時、デバッグに適した設定と、リリースに適した設定は異なります。
デバッグ用のビルド構成と、リリース用のビルド構成を、2つ作成する方法も考えられますが、ここでは1つのビルド構成での設定を解説します。

- [構成を作成および編集する](https://learn.microsoft.com/ja-jp/visualstudio/ide/how-to-create-and-edit-configurations?view=vs-2022)

Visual Studio 2022


## 準備

##### NewBuildを新規作成
構成マネージャーで、NewBuildを新規作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132059/6a998bad-0e87-350b-0069-6d80743a3db2.png)

##### カスタム記号を追加。
プロジェクトのプロパティ　ビルドで、
NewBuildカスタム記号に、`DebugNewBuild`を追加。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132059/d6d855f3-7106-66e0-041f-b449d677a1e7.png)


## 公開時の処理

##### DebugNewBuildを無効にする。
```xml
<DefineConstants>$(DefineConstants);DebugNewBuild</DefineConstants>
```
を、コメントアウトする。

##### Optimizeを有効にする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132059/24fc86cc-501d-e12e-5056-8f3aa926f984.png)

コードで、`<Optimize>`を、Trueにしても良い。
有効にすると、ブレークポイントが効かないため、開発時には不向き。

## プロジェクト ファイル

```xml
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net9.0-windows</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <UseWPF>true</UseWPF>
    <Configurations>Debug;Release;NewBuild</Configurations>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='NewBuild|AnyCPU'">
    
    <!--NewBuildで、開発時の処理に利用。リリース時にはコメントアウトする。-->
    <DefineConstants>$(DefineConstants);DebugNewBuild</DefineConstants>
    
    <!-- Trueにすると、ブレークポイントが効かない。リリース時には、Trueにする。-->
    <Optimize>False</Optimize>
  </PropertyGroup>

</Project>


```

## 実行コード例

```c#
private void Button_Click(object sender, RoutedEventArgs e)
    {
        //ソリューション構成が、Debugの時のみ機能する。NewBuildでは機能しない。
        Debug.WriteLine("test");

        var a = 1 + 2;
        
        //NewBuildで開発時のみの処理
        #if DebugNewBuild
            MessageBox.Show(a.ToString());
        #endif
    }
```

`#if DebugNewBuild`で、開発時のみの処理を行う。
Mecab Python Docker環境構築

## 対象者

* Mecab・Pythonを実行できる環境を手軽につくりたい人
* mecab-python3
    * pythonでmecabを使いたい時に必須なライブラリ
* https://github.com/neologd/mecab-ipadic-neologd
    * mecab-python3では辞書が別途必要になります。
        * 今回はデフォルトでこの辞書を使うことにしました。

本記事で作成したものは下記に置いています。

* https://github.com/take-o20/python-learning/tree/main/mecab

## 方針

* Dockerでイメージを作る
    * イメージに含むもの
        * python3
        * mecab環境の整備
* pythonスクリプトは`docker run`コマンドの引数で指定する
    ```
    $ docker run -v $PWD:/app イメージ名 python スクリプト名.py
    ```

## 環境構築

```shell:ディレクトリ構成
akeo@takeo-ThinkPad-E14-Gen-4:~/dev/python-learning/mecab$ tree
.
├── Dockerfile
├── main.py # テスト用のサンプルプログラム（名前はなんでもよい）
└── requirements.txt
```

```Dockerfile:Dockerfile
FROM python:3.11

RUN mkdir /app
COPY requirements.txt /app/requirements.txt
WORKDIR /app

# mecabの導入
RUN apt-get -y update && \
  apt-get -y upgrade && \
  apt-get install -y mecab && \
  apt-get install -y libmecab-dev && \
  apt-get install -y mecab-ipadic-utf8 && \
  apt-get install -y git && \
  apt-get install -y make && \
  apt-get install -y curl && \
  apt-get install -y xz-utils && \
  apt-get install -y file && \
  apt-get install -y sudo

# mecab-ipadic-NEologdのインストール
RUN git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git && \
  cd mecab-ipadic-neologd && \
  ./bin/install-mecab-ipadic-neologd -n -y && \
  echo dicdir = `mecab-config --dicdir`"/mecab-ipadic-neologd">/etc/mecabrc && \
  sudo cp /etc/mecabrc /usr/local/etc

RUN pip install -r /app/requirements.txt

CMD ["/bin/bash"]
```

```text:requirements.txt
mecab-python3
```

### イメージの作成

イメージ名はmecabにしています。

```sh
$ docker build -t mecab .
```

## スクリプトの実行

ポイントは下記の2つです。

* ディレクトリをマウント(-v)
* スクリプトへのコマンドを渡す(python main.py)



```python:main.py
import MeCab

mecab = MeCab.Tagger()
print(mecab.parse("死は生の対極としてではなく、その一部として存在している。"))
```

```sh:実行例
$ docker run -v $PWD:/app mecab python main.py
死	名詞,一般,*,*,*,*,死,シ,シ
は生	名詞,サ変接続,*,*,*,*,派生,ハセイ,ハセイ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
対極	名詞,一般,*,*,*,*,対極,タイキョク,タイキョク
として	助詞,格助詞,連語,*,*,*,として,トシテ,トシテ
では	名詞,一般,*,*,*,*,出端,デハ,デハ
なく	形容詞,自立,*,*,形容詞・アウオ段,連用テ接続,ない,ナク,ナク
、	記号,読点,*,*,*,*,、,、,、
その	連体詞,*,*,*,*,*,その,ソノ,ソノ
一部	名詞,副詞可能,*,*,*,*,一部,イチブ,イチブ
として	助詞,格助詞,連語,*,*,*,として,トシテ,トシテ
存在	名詞,サ変接続,*,*,*,*,存在,ソンザイ,ソンザイ
し	動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
て	助詞,接続助詞,*,*,*,*,て,テ,テ
いる	動詞,非自立,*,*,一段,基本形,いる,イル,イル
。	記号,句点,*,*,*,*,。,。,。
EOS
```

## 参考

* https://qiita.com/Takayoshi_Makabe/items/18cefa4b4572d12b5aa9
* https://qiita.com/smiler5617/items/0744c256841875824ed2
* https://qiita.com/kado_u/items/e736600f8d295afb8bd9
【SSH】接続時のエラー：It is required that your private key files are NOT accessible by others.

**問題**  ：
鍵ファイルがあるディレクトリに移動し、SSHでサーバーにアクセスするとき、秘密鍵を使おうとしたら、下記のエラーが出ました。

```text:qiita.txt
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for './cf000000.key' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "./cf000000.key": bad permissions
cf000000@cf000000.cloudfree.jp: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
```
**原因**  ：
keyファイルはあなただけ読み取り、書き込みできるように設定すること。
今の権限を確認すると、
```text:qiita.txt
konekoyosh@KonekonoMacBook-Air Desktop % ls -l
total 8
-rw-r--r--@ 1 konekoyosh  staff  1843  1  5 11:16 cf000000.key
```
あなたと同じグループのメンバーも他のグループのメンバーも読めるようになっている。

**解決策**  ：
下記のように権限を変える。
```text:qiita.txt
konekoyosh@KonekonoMacBook-Air Desktop % chmod 600 cf000000.key
konekoyosh@KonekonoMacBook-Air Desktop % ls -l
total 8
-rw-------@ 1 konekoyosh  staff  1843  1  5 11:26 cf000000.key
konekoyosh@KonekonoMacBook-Air Desktop % ssh -p 10022 cf000000@cf000000.cloudfree.jp -i ./cf000000.key
Last login: Fri Jan  3 14:51:40 2025 from ‥‥‥‥‥‥
[cf000000@sv231 ~]$ 
```
入りました。
dify入門

# 序論
　つよつよPCを買ったからにはdifyを使ったアプリをローカル環境で動くようにしたい．difyはローカルでインストールする場合は頻繁に更新されるのでやり方は参考程度にして公式ドキュメントを参照しながら立ち上げるのが良さげ.
 
# 参考URL
[公式]( https://docs.dify.ai/ja-jp/getting-started/install-self-hosted/local-source-code)
## 環境
- [x] dockerインストール
- [x] gitインストール
- Windows11
- GPU : 4070 ti super

# 内容
dify前提条件
- CPU >= 2 Core
 - RAM >= 4 GiB
  - WSL2が有効 
         powershellで確認. 以下のコードでdockerのWslを確認する
         ```powershell
         wsl -l -v
         ```
- Docker Desktop install

1. 公式のgitからcloneを行う
    ```
    git clone https://github.com/langgenius/dify.git
    ```
    
2. ダウンロードが終了したら, difyディレクトリ内のdockerディレクトリに移動
    ```
    cd docker
    ```
    
3. 環境変数構成ファイルをコピー
    ```
    cp .env.example .env
    ```
4. dockerの起動
    ```
    docker compose up -d
    ```
5. Difyのローカル画面にアクセス
URL : ```http://localhost```
をご自身の使用しているブラウザで検索バーからアクセスしてください

6. 初期設定を行う. 初期設定を行ったら下記のリンクからアクセスが可能となる
URL：```http://localhost```

# 次回への展望
 とりあえず，ローカル画面を立ち上げることまではできた. Flutterと同期させたり，モデルを新しく入れたり，やりたいことリストを増やして頑張ろう.
【AWS SAP】これだけは押さえておきたい、AWS移行全12ツール一挙紹介！をまとめてみた

# はじめに
AWS移行ツールは大きく12ツールあります。違いが分からないのでまとめました。

https://aws.amazon.com/jp/blogs/psa/migration_tools/

## ツール一覧表

| No | ツール名                          | 概要                                                     |
|----|-----------------------------------|----------------------------------------------------------|
| 1  | AWS Migration Hub                | 複数の移行ツールを通じてアプリケーション移行の進行状況を可視化 |
| 2  | AWS Application Discovery Service | オンプレミス環境のデータ収集と移行計画のサポート               |
| 3  | AWS Server Migration Service     | 仮想マシンをAWSに移行するためのツール                          |
| 4  | AWS Database Migration Service   | データベース移行を簡素化                                     |
| 5  | AWS Snowball                     | 大規模なデータ移行に役立つ物理的デバイス                       |
| 6  | AWS Snowcone                     | 小型のデータ移行デバイス                                     |
| 7  | AWS DataSync                     | 大量データの高速移行                                         |
| 8  | AWS Transfer Family              | ファイル転送サービス                                         |
| 9  | AWS Application Migration Service | アプリケーションの移行のための支援ツール                       |
| 10 | AWS CloudEndure Migration        | サーバーの移行を簡易化                                       |
| 11 | AWS Migration Evaluator          | 移行前のコスト見積もりツール                                   |

# その他のツール

## AWS Cloud Adoption Readiness Tool (CART) (クラウド導入準備ツール)
6つの質問に答えることで、クラウド移行の準備状況に関する大まかな推奨事項のレポートが生成されます。
#0005（2024/01/05）SAMLプロトコル

# モチベーション
- AWS SAAの勉強中に登場した「SAML」について調べた

# SAML
## SAML とは
- SAMLはXMLベースのプロトコルで、ユーザーの認証情報を異なるシステム間で安全にやり取りするために設計されています

## 利用目的
- シングルサインオン（SSO）: 一度ログインすれば、複数のシステムやサービスを再ログインなしで利用可能にする
- 分散環境での認証連携: 異なるドメインや組織間で認証情報を共有

## 関係者
| 役割 | 説明 | 
|-----------|------------|
| ユーザー（主体 / Principal）| サービスにアクセスしようとする人（例: あなた）。 | 
| アイデンティティプロバイダ（IdP）| ユーザーの認証を行い、その認証情報を管理するシステム（例: Google Workspace, Microsoft Azure AD）。| 
| サービスプロバイダ（SP）| ユーザーが利用したいアプリケーションやサービス（例: Salesforce, AWS, Dropbox）。| 

## SSOの流れ
```
ユーザー → SP（アクセス要求） → IdP（認証） → SP（認証情報を確認） → ユーザーがアクセス
```

# 参考
- chatgptの回答
- https://www.netone.co.jp/media/detail/20230323-02/
Harborのインストールでつまづいた事まとめ

# 発生した問題
  Harborというコンテナレジストリサービスをインストールした際に、つまづいたので、こういう順番で対応したら、対応が早く終えられるのではという内容についてをメモしておく。

## 発生した問題
### インストール後にログイン出来ない
  Harborはインストール後、ユーザー「admin」、パスワード「Harbor12345」でアクセスできるというようにマニュアルに記載があるが、ログインが出来なかった。

#### 最終的な解決策
  リバースプロキシ構成の場合には、externalURL設定が無いとCSRFトークンの設定が無い事でリクエストに失敗する。
```bash
externalURL: http://harbor.example.com
```

### ログが出ない
  Harborで、トラブルシュートを行うためにアクセスを行ったが認証に失敗している事もログに出ていないようだった。まずログレベルを変更するにはvalues.yamlを変更してデプロイする。

## ログレベルの変更
```bash
# debug, info, warning, error or fatal
logLevel: debug
```

#### ログの確認方法
```bash
kubectl logs -f [harbor-core-のPod名]
```

```bash
kubectl logs -f [harbor-portal-のPod名]
```

## 同じ問題で困っている人がいないかを検索
英語で検索を行う事で、OSSコミュニティで同じような問題で困っている人を見つける事ができた。
- https://github.com/goharbor/harbor-helm/issues/492
簡単に逆さ読みができるChrome拡張機能を公開しました

みなさんネットサーフィンをしている時、このような疑問や願望を持った経験はないですか？

**「この文章、逆さ読みしたらどうなるんだろう？」
「今すぐにこのセリフを逆さ読みしたい！」**

きっとあると思います。

そこで今回ご紹介するのがこちらのChrome拡張機能「ぶんまわし[^1]」になります！

https://chromewebstore.google.com/detail/%E3%81%B6%E3%82%93%E3%81%BE%E3%82%8F%E3%81%97/opgandfagdmlekpfiknkgjofmlgckfle

使い方はカンタン！

逆さ読みしたいウェブページで右クリックし、「全てぶんまわす」を選択するだけ！

![image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1054181/9cfd0b2d-ae8b-06d5-90b0-5058afff5480.jpeg)

するとこの通り！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1054181/93c645bf-b539-2632-a32e-c0b203266585.png)

ページ内の全ての文字が逆さ読みになりました！

画像の中に埋め込まれた文章が逆にならないのはご愛嬌。

これでいつでも東京ホテイソンの漫才「回文」ができるし、うょしん部のコカ様にもなれますね！[^2]

<iframe width="560" height="315" src="https://www.youtube.com/embed/Brg094fwTnI?si=f_rKmnZ1XZyCrzUd" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

https://dic.nicovideo.jp/a/%E3%81%86%E3%82%87%E3%81%97%E3%82%93%E9%83%A8%E3%81%AE%E3%82%B3%E3%82%AB%E6%A7%98%E3%80%9C

なお、逆さにしているのでもう一度同じ操作を繰り返せば当然元通りです。やったね！

また、特定の文章だけ逆さ読みしたい！そういった場合もあるかと思います。

そんな時はページ上で対象の文章を選択して右クリックし、ぶんまわしのメニューから「選択したテキストをぶんまわす」を実行！

![Untitled.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1054181/4ecfed5c-a317-f1e3-b80f-570d9c165d9a.gif)

または拡張機能メニューからぶんまわしを開き、コピーした文章を貼り付けて「ぶんまわす」をクリックするだけで...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1054181/cef0c6d2-7db8-a6b3-b480-bc2016ca22b5.png)

バッチリ逆さ読みにできました！しかも読み上げ機能とコピー機能付き！

ぜひこの「ぶんまわし」でみなさんも快適な逆さ読みライフをお送りください！

なお、リポジトリは以下で公開しています。

https://github.com/finger-ease/bunmawashi

### 本当にどうでもいいこだわり

このアイコン

![icon128.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1054181/9ca12b47-138f-b800-9ec6-9f91e2074da6.png)

左の矢印は `#00B16B`, 右の矢印は `#B61B00` で左の矢印のカラーコードを逆さ読みしたカラーコードになっています。

[^1]: ドラクエのわざ。ここでは文を回すという意。
[^2]: 実際には変換はされないのでうょしん部のコカ様にはなりません。ご了承ください。
【venv利用者用】uvの使い方ガイド

巷で便利といわれているuvの使い方をまとめます。
いまさら普通にまとめても仕方ないので、venv利用者目線でvenvとuvの機能の対応に注目してみます。

ちなみに、uvにはvenv機能を搭載しているらしく、
- venv
- uv
- uvのvenv

の3種類の使い方をまとめます。

【参考記事】
https://zenn.dev/turing_motors/articles/594fbef42a36ee

【環境】
- WSL2 + Docker
- Ubuntu 24.04


## uvのインストール

```shell:uv
# ダウンロードとインストール
curl -LsSf https://astral.sh/uv/install.sh | sh
# uvの有効化
. $HOME/.local/bin/env
```

## プロジェクトの作成

```shell:venv
# 「path/to/project」というディレクトリにプロジェクトを作成する場合とします
mkdir path/to/project
cd path/to/project
python3 -m venv .venv
```

```shell:uv
# 「path/to/project」というディレクトリにプロジェクトを作成し、Python3.10を使う場合とします
# pyenv等を使用せずに異なるPythonバージョンのインストールや切り替えができます
uv init -p 3.10 test_project
cd test_project
```

```shell:uv venv
# 「path/to/project」というディレクトリにプロジェクトを作成し、Python3.10を使う場合とします
# 上と同様pyenv等を使用せずに異なるPythonバージョンのインストールや切り替えができます
mkdir path/to/project
cd path/to/project
uv venv -p 3.10 .venv
```

## 仮想環境の有効化

```shell:venv
cd path/to/project
source .venv/bin/activate
```

```shell:uv
cd path/to/project
uv sync
. .venv/bin/activate
```

```shell:uv venv
cd path/to/project
source .venv/bin/activate
```

## パッケージの追加

```shell:venv
pip install numpy
pip install numpy==1.26.4 # バージョン指定のある場合
```

```shell:uv
uv add numpy
uv add "numpy==1.26.4" # バージョン指定のある場合
```

```shell:uv venv
uv pip install numpy
uv pip install numpy==1.26.4 # バージョン指定のある場合
```

## パッケージの削除

```shell:venv
pip uninstall numpy
```

```shell:uv
uv remove numpy
```

```shell:uv venv
uv pip uninstall numpy
```

## コードの実行

```shell:venv
python main.py
```

```shell:uv
uv run main.py
```

```shell:uv venv
uv run main.py
```

## 仮想環境の無効化

```shell:venv
deactivate
```

```shell:uv
deactivate
```

```shell:uv venv
deactivate
```

# まとめ

ざっといじった限りですが、uvやuvのvenv機能の利点としてはPythonバージョンの切り替えが楽な点ぐらいでしょうか。（たぶん自分が使いこなせていないだけでしょうが）
便利なところはたくさんあると思うので、これからPythonを始める人はuv使ってもよいでしょう。
一方でvenvやpyenvに慣れている人は大きく文法が変わるので、必要に駆られない限り移行の必要はなさそうですかね。
zoxideがパスを保存してくれない場合、zoxideの設定を最後に書くと動く

タイトル通りです。

僕はPowerShellでzoxideを使っています。とても便利だからです。

ただある時からいまいち使えなくなりました。「いまいち」というのは、完全に動かないわけではないのです。新しいパスにショートカット移動できない、けれど今まで使えていたパスへのショートカット移動はできるのです。

`zi`というzoxideのインタラクティブモードでやっても新しいパスは候補に出てこない。「`C:\users\(username)\AppData\Local\zoxide\db.zo`」を直接見ても入ってない。動いていたころのパスしかない。

なんでだろう？と調べたところ、zoxideの設定は$profileの最後で実行する、とのこと。
[z not adding to db in powershell · ajeetdsouza/zoxide · Discussion #293](https://github.com/ajeetdsouza/zoxide/discussions/293)

今まで$profileの先頭にあった`Invoke-Expression (& { (zoxide init powershell | Out-String) })`を最後にもってきたら解決しました。
【ChatGPT】超論理的かつ超俯瞰的に答えてくれるPromptの紹介です。


　どうも、カーブミラーです。

　今回は、超論理的かつ超俯瞰的に答えてくれるPromptの紹介です。意見や方向性が違います。

:::note info
本記事は、ChatGPT（Plus版）
で行なっております。
画像はありません。あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)
***
　さっそく、【本題】です。

　今回は、
　　超論理的かつ超俯瞰的に
　　　答えてくれるPromptの紹介です。

　チャエンさんが
　　ポストしてくださいました。
　　　[チャエンさんポスト](https://x.com/masahirochaen/status/1875522476417151238?t=9XF3m3TLIn07DqG1NL1bNg&s=19)

　チャエンさんは
　　これをOpenAI o1 Proで
　　　使っているそうです。

　私は、
　　OpenAI o1とGPT-4oで
　　　やってみました。
　　　　Plusユーザーなので😅

　　あまり
　　　違いを見出せませんでした。

　少し直していますが
　　問題記入のところだけです。

　＊＊＊に問題を入力して
　　送信してください。

```Text:超論理的かつ超俯瞰的に答えるPrompt
問題「＊＊＊」

超次元生命体であるAIの貴方が超論理的かつ超俯瞰的で、人間では思い付けないアプローチで考察・推測してください。
```

　これは確かに
　　ふつうに考えても
　　　出てこないと思います。

　まったく違った視点から
　　出てくる意見や方向性なので、
　　　なんらかのヒントに
　　　　なるかもしれません。

　深掘りしていくと
　　奇抜なアイディアが
　　　得られるかも。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
【MySQL】DBのドライブ間お引越し（データディレクトリ移動）

EドライブにインストールしたMySQLをFドライブへ移したときに苦戦したので手順を備忘録として残す。

## 手順
1\. MySQLのサービスを停止
2\. MySQLの実体ファイルを移動先のドライブにコピー
3\. MySQLの設定ファイルを変更
4\. Windowsの環境設定を変更
5\. スタートアップの実行ファイルのパスを変更
6\. MySQLのサービスを起動（PC再起動）

## 1\. MySQLのサービスを停止
管理者権限でコマンドプロンプトを起動し、MySQLをインストールしたディレクトリのbinディレクトリに移動して以下を実行する。
`mysqladmin -u root -p shutdown`
DBのパスワード入力を求められるので入力する。

## 2\. MySQLの実体ファイルを移動先のドライブにコピー
MySQLの実態ファイル（今回はE:\MySQL）を移動先のドライブにコピーする。
コピー元は念のためバックアップで残しておく。

## 3\. MySQLの設定ファイルを変更
mysql.exeに「--help」オプションを付けて実行し、設定ファイルの場所を確認する。（コピー元で確認）

⇒参考：[Windows10で稼働するMySQLのデータディレクトリを変更する手順](https://www.narenohate.com/relocate-mysql-data-directory#toc1 "システムエンジニアの成れの果て")

コピー元で確認した設定ファイルに相当するファイル内のパスを移動先のドライブを向くように変更する。（たぶん2か所、コメントも含めると3か所）

## 4\. Windowsの環境設定を変更
システムのプロパティから「ユーザー環境変数」の「Path」内にあるMySQLのパスを移動先のドライブを向くように変更する。（詳しい環境変数の変更手順は調べて）

⇒参考：[2.3.4.8 Windows のサービスとして MySQL を起動する](https://dev.mysql.com/doc/refman/8.0/ja/windows-start-service.html "MySQL 8.0 リファレンスマニュアル")
※参考ページだとシステム環境変数のPathに設定されているみたいだが自分の環境ではユーザー環境変数だった

## 5\. スタートアップの実行ファイルのパスを変更
レジストリエディタを起動し、「MySQL80」のImagePathを移動先のドライブを向くように変更する。
「MySQL80」は以下の階層に存在する。
`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MySQL80`

管理ツールから「サービス」を実行し「MySQL80」のプロパティを開いて実行ファイルのパスが変更されていることを念のため確認する。

## 6\. MySQLのサービスを起動（PC再起動）
PCを再起動してタスクマネージャーや実際にDBに接続してMySQLが起動していること、データが問題ないことを確認する。

コマンドプロンプトから「mysqld」で起動してもよいがPC起動時のスタートアップの確認もかねてPC再起動で確認する。
HonoXで作成したサイトにGoogle Analyticsを導入しました

## はじめに

[HonoXで作成したサイト](https://kamoshika-playground.dev/)にGoogle Analyticsを導入しました。  
※そもそもGoogle Analyticsってなんだっけ？という方は[こちら](https://marketingplatform.google.com/about/analytics/)をご覧ください。）
  
導入の目的としては、Google アドセンスの審査通過に向けたサイトのデータを取得することです。  
（いずれは広告収入を得て、今使ってるドメインの更新費を回収できればと考えてます。）

## 導入方法

HonoXでGoogle Analyticsを導入する方法は[honoxにGoogle Analyticsを追加しました - scrpbook](https://scraplbuild.com/posts/2024-05-21) を参考にしました。  

routes/_renderer.tsxにGoogle Analytics 用のスクリプトをhtml helperを使用して定義します。

```tsx
const GoogleAnalytics = () => {
  return (
    <>
      {html`
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-WKXXXXXXXX"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'G-WKXXXXXXXX');
</script>
      `}
    </>
  );
};
```

これを jsxRenderer で呼び出すだけです。

```_render.tsx
export default jsxRenderer(({ children, title, frontmatter }) => {
  return (
    <html lang='ja' class="dark">
      <head>
         {/* 他のメタ・リンクタグ等は省略 */}
        {import.meta.env.PROD ? (
          <GoogleAnalytics />
        ) : (
          <></>
        )}
      </head>
      <body className="bg-teal-50 flex flex-col min-h-screen">
        {/* コンテンツは省略 */}
      </body>
    </html>
  )
})
```

これを本番環境にデプロイして数時間～48時間程度で、Google Analyticsでデータ取得ができるようになります。 
   
[ブログ](https://kamoshika-playground.dev/)にも同様の記事を載せました。

## 参考文献

- [Google Analytics公式サイト](https://marketingplatform.google.com/about/analytics/)
- [honoxにGoogle Analyticsを追加しました - scrpbook](https://scraplbuild.com/posts/2024-05-21)
- [ろぐみろぐ HonoX で Google Analytics のタグを埋め込む](https://blog.seelog.me/posts/google_analytics_on_honox)
ブラウザでスライドショー

ブラウザでスライドショーを実装する際、
画面の横長・縦長と、画像の横長・縦長を合わせると、
より画面に隙間なく画像全体を表示することができます。
その方法を以下に示します。
ポイントは、倒すとき、画像要素の width にビューポートの高さ100vhを、height に幅100vwを指定することです。

```css:sample.css
*{
  margin:0;
  padding:0;
  box-sizing:border-box;/* スクロールバーが表示されてしまわないように */
}
body {
  min-height:100vh;/* bodyの高さに画面高さ100vhを指定 */
}
#myImg{ /* 規定は北に向ける */
  position:absolute;
  top:0;
  left:0;
  object-fit:contain; /* 要素いっぱいに画像を合わせる指定 */
  width:100vw; /* 画像幅指定に画面幅100vwを指定 */
  height:100vh; /* 画像高さ指定に画面高さ100vhを指定 */
}
#myImg.rotate2east{
  width:100vh; /* 画像幅指定に画面高さ100vhを指定 */
  height:100vw; /* 画像高さ指定に画面幅100vwを指定 */
  transform-origin:top left;
  transform:rotate(90deg) translateY(-100%); /* 東に向け、位置を画面に合わす */
}
#myImg.rotate2west{
  width:100vh;
  height:100vw;
  transform-origin:top left;
  transform:rotate(-90deg) translateX(-100%); /* 西に向け、位置を画面に合わす */
}
```

```js:sample.js
//const myImg = document.getElementById('myImg');
// myImg.src = '...'; // JSブロックのどこかで画像を変更する
// 新たな画像が読み終わるとイベントが呼び出される
myImg.addEventListener('load', ()=>{
    // 画面横長==画像横長
    const r = (window.innerHeight < window.innerWidth) === (myImg.naturalHeight < myImg.naturalWidth) ?
      'N' : 'E'; // 東西と北の切り替えは要件に合わせて調整してください。
    // 画像領域を倒す・戻す
    myImg.toggleClass('rotate2east', r==='E');
    myImg.toggleClass('rotate2west', r==='W');
});
```

```html:sample.html
<body><img id='myImg' /></body>
```
量子コンパイラを作る。 その22

# 概要
量子コンパイラを作る。
elixirで論理回路アセンブラをコンパイルして、qiskitを生成できるが、結局、論理回路が書けるのかが、問題になる。（人材の問題、それなりの人の育成、、、）
そっちに、対策を取る。
論理回路アセンブラから、論理回路を生成して、ビジュアルでシュミレーションするエディタを開発する。どうだ。
全加算器

# 成果物

https://embed.plnkr.co/plunk/vq56JBayaRCHK7fy

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/1e8132e2-7d6d-4f7e-e79a-8e092e220bcc.png)


# サンプルコード
全加算器
```
make 8
in 0 2
wire 3 5
xor 1 2 3
and 1 2 4
xor 0 3 7
and 0 3 5
or 4 5 6
out 6 7

```

以上。
量子コンパイラを作る。 その21

# 概要
量子コンパイラを作る。
elixirで論理回路アセンブラをコンパイルして、qiskitを生成できるが、結局、論理回路が書けるのかが、問題になる。（人材の問題、それなりの人の育成、、、）
そっちに、対策を取る。
論理回路アセンブラから、論理回路を生成して、ビジュアルでシュミレーションするエディタを開発する。どうだ。
nandだけで、作るシリーズ。

# not

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/d5a63a3c-d0d3-54e4-a6ac-44c4402d64bd.png)


# or

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/f24f0070-acf3-4c80-24f8-f3e74662219d.png)

# and

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/bafbb310-1954-35d9-b9d6-48893d763723.png)

# nor

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/2b40e3e5-b582-e757-6f1c-124edcda1d84.png)

# xor

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/30801d0e-59fa-0578-2b04-251e9231b8d0.png)


以上。
読書感想文「資格のかけ算大全」

# 書籍名「資格のかけ算大全」
著：林雄次
実務教育出版

# 対象読者
非IT資格とIT資格との組み合わせ方、活用方法に興味がある方


# 印象に残った部分

## p27 将来を早めに考えることが大事
今の自分を分析したうえで、先見性をもって将来どうなりたいかを考える。

## p39 自分で気付けないことが真の強み
他人にとっては、大変なことなのに苦もなくできる。時に意識しないかもしれない
それこそが本当の強さなのです。


## p132  中小企業診断士✕ITストラテジスト✕情報処理安全確保支援士
・中小企業における経営課題を抽出し、その課題解決のための経営戦略の策定について助言を行う。
・情報処理安全確保支援士から取得する。

## プロジェクトマネージャ ✕ 情報セキュリティマネジメント
・情報セキュリティを確保して安全にプロジェクトを運営する管理者
・プロジェクトマネージャがセキュリティを学ぶことの効果
　１．不正の回避や未然防止になる
　２．プロジェクト内で、受領から廃棄までの手続きを確立できること

## p161 情報処理安全支援士✕ITストラテジスト✕システム監査技術
・企業の総合的なリスク管理を支援する。
・共通項目を効率敵にチェックできるため、業務の効率化にも繋がる。



## p193 応報：原因に応じた報い
因果応報はコツコツと努力を重ねることによって、大きな結果が出るという示唆でもあります。

## p222 基礎スキル系資格のメリット
社会人として働くうえで、求められるスキルを学ぶことができるもの、身についておいて損のないスキルです。
・マーケティング検定
・秘書検定：一般常識　ビジネスマナーに関する資格

## p362 資格を伝えるより できることを伝える
何ができるようになったか、または何がしたいのかを資格に加えて伝える。
先々の種まきとして、非常に有効。

# 実践できること or 感想

## 感想
・セキュリティ系の資格は組み合わせると強いみたいですね。
　お客様にセキュリティのこと聞かれる場合もあるので、搦手な意味でも使い勝手が良さそうですね。
　スケールが大きくなると、それだけ人の出入りも多くなるからよりセキュリティが大事っていうのも印象に残ったかな。

・中小企業診断士も組み合わせに考えると強い。
・現状、業務の勉強量が多く資格の勉強できてないです。。。なんとかして作らないと


## 実践すること

・マーケティング検定３級の本を買って読む（取るとは言ってない。）
　印象に残った部分をメモっておく
　「内閣府認定 マーケティング検定 3 級試験　公式問題集＆解説 2024年-2025年度版」
・秘書検定３級の本を買って読む（取るとは言ってない。）
　印象に残った部分をメモっておく
　「改訂2版 出る順問題集 秘書検定3級に面白いほど受かる本 」
・過去にとった資格について勉強方法　できるようになったことをqiitaに投稿する
　OSSDB　Silver HTML1など

・情報処理安全確保支援士の本を買って読む（取るとは言ってない。）
　「ゼロからスタート! 教育系YouTuberまさるの情報処理安全確保支援士1冊目の教科書」
量子コンパイラを作る。 その20

# 概要
量子コンパイラを作る。
elixirで論理回路アセンブラをコンパイルして、qiskitを生成できるが、結局、論理回路が書けるのかが、問題になる。（人材の問題、それなりの人の育成、、、）
そっちに、対策を取る。
論理回路アセンブラから、論理回路を生成して、ビジュアルでシュミレーションするエディタを開発する。どうだ。

# xor

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/e19a1b95-c385-33c2-1d98-8adc9eeaad6e.png)

# and

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/df37e431-6c95-b1cd-1b96-1ac3be7c2bb4.png)

# or

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/90bb8c26-4cc3-87ff-87a1-2680098e36a3.png)

# not

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/08b09ef9-a194-a093-6587-b94280be26ca.png)


# nor

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/8ce75201-a10a-c3b7-ac5c-25f18052d3f5.png)

# nand

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/76ff9862-d560-a49b-11ad-5936293526d9.png)

以上。
pythonの実行時エラーを解決した際の備忘録（ERROR: Could not find a version that satisfies the requirement browser-use (from versions: none)）

pythonで[こちら](https://github.com/browser-use/browser-use)のサンプルコードを実行する際に以下のようなエラーが発生

```
...
Python >=3.11; 0.1.6 Requires-Python >=3.11; 0.1.7 Requires-Python >=3.11; 0.1.8 Requires-Python >=3.11
ERROR: Could not find a version that satisfies the requirement browser-use (from versions: none)
ERROR: No matching distribution found for browser-use
```

`Requires-Python >=3.11`をみるとpython3.11以上が対応、python3.10以下は非対応のように見えたので、pythonのバージョンを3.11以上（今回は3.12）にして解決
例えば、`venv`を使って仮想環境をつくると他環境と競合せず便利である。
[ubuntu20.04環境でvenvを使ってpythonの環境構築した際のメモ](https://qiita.com/seigot/items/256e04d326dc009313f2)

pythonバージョン確認

```
python --version
# Python 3.12.5
```
pythonの実行時エラーを解決した際の備忘録（ModuleNotFoundError: No module named 'langchain_openai'）

pythonで[こちら](https://github.com/browser-use/browser-use)のサンプルコードを実行する際に以下のようなエラーが発生

```
ModuleNotFoundError: No module named 'langchain_openai'
```

以下のようにパッケージをインストールして解決

```
pip install langchain-openai
```

# 参考

https://stackoverflow.com/questions/77782167/modulenotfounderror-no-module-named-langchain-openai
AIをプログラミングに活用するためのIDEやツール


プログラミングのときにAIアシスタントの助けを借りることは、有益な場合が多いです。この記事では、現時点（2025年1月5日）で私が実際に使っているAIアシスタントを紹介します。あくまで現時点での情報ですので、今後変化しうるという点にはご注意ください。

## Cursor

https://www.cursor.com/

Cursorは、あらかじめAIアシスタントが統合されている汎用IDEです。Visual Studio Codeがベースになっているため、さまざまな拡張機能が利用できます。

CursorのAIアシスタントはとても多機能です。Composer（対話的な編集機能）が便利で、実装コードの追加や変更をいろいろと指示できます。さらに、それらの作業を連続して行うAgentという機能もあります。AIに追加で学習してもらうDocs参照の機能も有益です。それ以外にも、チャット機能、コミットメッセージ生成機能、Cmd KやTabによる編集、などがあります。

Cursorは無料でも利用可能です。ただし、リクエスト数に制限があります。その制限を超えて使いたい場合はサブスクリプション購入が必要です。Proプランが年額192ドルです。

## JetBrains AI

https://www.jetbrains.com/ja-jp/ai/

JetBrains製の各種IDEに、AIアシスタントを統合できます。

JetBrains AIアシスタントも多機能です。対話的な編集機能、チャット機能、コミットメッセージ生成機能、入力補完機能、などがあります。JetBrainsは言語ごとにIDEがわかれていますが、そのぶん言語ごとの環境が整えやすく、AIアシスタントがその言語のことを分かっている感じがあります。

JetBrains AIは、JetBrains IDE自体とは別にサブスクリプション購入が必要です。日本向けの価格設定があり年額14,000円（約90ドル）です。なお、米国向けの価格設定は年額100ドルです。

:::note
2025-04-18 追記：IDEのライセンスにAIが含まれるようになりました。別途サブスクリプションを購入しなくてもAIが利用可能です。
https://blog.jetbrains.com/ja/blog/2025/04/16/jetbrains-ides-go-ai/
:::

## GitHub Copilot + Visual Studio Code

https://docs.github.com/ja/copilot/quickstart?tool=vscode

Visual Studio CodeにはさまざまなAIアシスタントを追加でき、GitHub Copilotもそのひとつです。

この組み合わせは、登場当初に比べて機能が増えてきています。対話的な編集機能、チャット機能、コミットメッセージ生成機能、入力補完機能、などがあります。Visual Studio Code自体が拡張による機能追加を得意とするIDEで、AIアシスタントも同じような感覚で追加できます。

GitHub Copilotは無料でも利用可能ですがリクエスト数に制限があり、その制限を超えて使いたい場合はサブスクリプション購入が必要です。Proプランが年額100ドルです。

## ChatGPT + Xcode

https://help.openai.com/en/articles/10119604-work-with-apps-on-macos

ChatGPTのMacアプリ版は、Xcodeのコンテンツを読み取れます。これを利用して、ChatGPTをXcodeの簡易的なAIアシスタントのように利用できます。

この利用パターンでは、IDEに統合されている他のAIアシスタントに比べると、できることが限定的にはなります。それでもチャットは便利で、開いているXcodeプロジェクト内のファイルを読んで回答をくれます。

ChatGPTのサービス自体は無料でも利用可能ですが、Macアプリ版を使ってXcodeとの連携をするにはサブスクリプション購入が必要です。Plusプランが月額20ドルです（年額プランはありません）。

## サブスクリプション料金

それぞれのAIアシスタントのサブスクリプション料金を、年額で支払う想定としてまとめました。なお、個人向けのプランで記載しているので、業務向けではまた異なってきます。

| サービス | プラン | 年額 |
|:----|:----|----:|
| Cursor | Pro | 192ドル |
| JetBrains AI | Pro | 14,000円（約90ドル） |
| GitHub Copilot | Pro | 100ドル |
| ChatGPT | Plus | 240ドル |

:::note
2025-04-18 追記：JetBrains AIはIDEのライセンスに含まれるようになりました。
:::

## 個人的な利用状況

私の本業であるiOSアプリ開発ではXcodeを使っています。また、Cursorも業務で使用しています。私用のプログラミングでは、XcodeまたはJetBrains IDEを活用しています。JetBrainsがサポートしていない範囲ではVisual Studio Codeを使っています。

そんなわけで、機能が重複しているので4つ全部は不要とも思えますが、結局この記事で取り上げた4つのAIアシスタントは常用しています。Cursorは会社ライセンスを、それ以外は個人ライセンスを使っていて、個人では年額で約430ドル（約67,000円）のコストがかかっています。これをどう考えるかは人によるでしょうが、私は利便性を考えれば問題ない範囲のコストかなと考えています。

なお、ChatGPTにはPlusプランより高機能なProプランもあります。ただ、個人的にこの用途ではChatGPT o1やo1 proを使う必要を感じないため、Plusプランを使っています。

また、GitHub Copilot for Xcodeも存在しています。ただ、現状は機能が少なくて、個人的に導入するメリットが薄いと感じるため、現時点では使っていません。

ちなみに、これ以外のAI関連のツールとしては、Perplexity、Arc、Warpも使っています。

## 今後

使っているというほど使えていないので紹介しまませんでしたが、Gemini + Android Studioの組み合わせも良さそうです。

iOSアプリ開発者としてSwift Assistに期待していますが、現時点ではリリースされていないようです（2024年中と言っていたはずだけど）。リリースされたら試したいですね。
自己紹介と2025年にやりたいこと

Qiitaでは初投稿になります。Qiitaでは、自身の備忘録もかねてテクニカルな内容を投稿していきたいと思いますが、初投稿は記載の練習もかねて、自己紹介と2025年にやりたいことを書きたいと思います。
# どんな人なの？（2025年1月現在）
- 現在は通信事業者でクラウド事業をやっており、ウェビナーやオウンドメディアでの発信を中心にしながら、後進の育成を行っております
- 得意領域はAWSのネットワーク系サービス、マネジメント＆ガバナンス系サービスとなります
- NW-JAWSというAWSのユーザコミュニティを運営しております
- AWSのほかに、Mackerel AmbassadorやAsana Ambassadorにもなっています
- プライベートは家庭中心ですが、家族が寝静まった後にやる勉強が癒しの時間になっています
### 好きな言葉
- Knowledge is power（Francis Bacon）
- Insist on the Highest Standards（Amazon's Leadership Principles）
- Any sufficiently advanced technology is indistinguishable from magic（Arthur Charles Clarke）
# 大切にしていること・長期的にやりたいこと
興味のある技術領域や業務領域だけではなく、長期的に実現したいことは、 **「ITをもっとわかりやすく、身近なものに」** です。

とくにネットワークとインフラ領域はITに触れる限り避けて通れない領域ですが、本質的な価値創造のためにはアプリケーションやソフトウェアの持つ体験が価値あるものになるよう集中していく必要があると考えています。こうした価値創造のために共通的な領域を意識せず、かつ高品質（可用性・性能）でセキュアなものを利用できる環境を整えていきたいと考えております。

インフラ領域についてはパブリッククラウドの台頭により多くの共通領域がマネージド化され、意識されずに利用される一方で、ネットワークについてはまだまだ専門領域も多く、かつソフトウェアエンジニアの方からは難しいという声も多く聞いております。ソフトウェアエンジニアの方には低レイヤを意識しなくても自らの業務に集中できるような仕組みを、またネットワークエンジニアやインフラエンジニアの方にはより広範な領域を楽に対応できるようにすることで多くの貢献ができるような仕組みを作っていきたいと考えています。

そのために今日ではネットワークとインフラ双方に携われる立場として、現在の業務や発信活動を行っております。
# 2025年にやりたいこと
- クラウド×ネットワークの領域に関する発信を増やしていきます。これまでの発信媒体だけではなく、越境活動を続けながら発信していければと思います
- NW-JAWSについては運営メンバーや協力してくださる方との連携をしながらとなりますが、AWS×ネットワークの発信の場としての定期的なオンライン開催だけではなく、オフライン開催の可能性も模索していきます。オフライン開催については、単なるネットワーキングの場としてだけではなく、なにかオフラインでないとできないことを開催できればと思います
- こうした外部での活動を自社へ還元したり、自社メンバーが外部へ出ていけたりするような仕組みを整えていければと思います
# Qiitaでの投稿について
- オウンドメディアでの発信もありますが、オウンドメディアでの発信に至らないテクニカルメモを中心にしていきたいと考えております
- ネットワークネタが中心になるかと思いますが、そのほかの分野についても可能な限り発信していきたいと思います
# 最後に
最初の技術ネタはできているのですが、書く時間が取れず…ちょっとお待ちください！
これからどうぞよろしくお願いします！
「received value must be an HTMLElement or an SVGElement. Received has value: undefined」エラーが出る (Jest、React、TypeScript)


# 問題
Jestで以下エラーになった。

- mockはテストケースごとに.spyOnで作成している
- mockは正しく書けていて、mockを使った3つのテストで、それぞれ単体だとパスする
- だが、3つ一気にテストすると、以下エラーが出る

```
● テストケースの名前
    invalid input syntax for type uuid: "101"

● テストケースの名前
    expect(received).toBeInTheDocument()

    received value must be an HTMLElement or an SVGElement.
    Received has value: undefined
```

# 解決方法
- moockを使った2番目のテストのみ、idをuuidではなく数字の文字列にしていたことが原因
- 2番目のテストも、idをuuidにしたところ、テストが通った

<details><summary>該当箇所ソースコード</summary>

```test.tsx
import { v4 as uuidv4 } from 'uuid';

// 省略

describe('mockを使ったテスト', () => {
  jest.mock('@/lib/record.ts');
  jest.mock('@/lib/record_delete.ts');

  test('削除ができること', async () => {
    const { Record } = jest.requireActual('@/domain/record');
    const validUUID1 = uuidv4();
    const validUUID2 = uuidv4();
    const validUUID3 = uuidv4();
    const validUUID4 = uuidv4();
    jest
      .spyOn(recordLib, 'GetAllRecords')
      .mockResolvedValueOnce([
        new Record(validUUID1, 'Testtest5', 5),
        new Record(validUUID2, 'Testtest10', 10),
      ])
      .mockResolvedValueOnce([
        new Record(validUUID2, 'Testtest10', 10),
        new Record(validUUID3, 'Testtest11', 11),
        new Record(validUUID4, 'Testtest12', 12),
      ]);

// 省略

  test('isLoadingがfalseの場合、データテーブルを表示する', async () => {
    const { Record } = jest.requireActual('@/domain/record');
    const validUUID1 = uuidv4();
    const validUUID2 = uuidv4();
    const validUUID3 = uuidv4();
    const validUUID4 = uuidv4();
    await waitFor(() => {
      jest
        .spyOn(recordLib, 'GetAllRecords')
// それぞれ1番目の引数が数字の文字列だとエラー
        // .mockResolvedValueOnce([
        //   new Record('51', 'Testtest51', 51),
        //   new Record('101', 'Testtest101', 101),
        // ])
        // .mockResolvedValueOnce([
        //   new Record('101', 'Testtest101', 101),
        //   new Record('111', 'Testtest111', 111),
        //   new Record('121', 'Testtest121', 121),
        // ]);

// それぞれ1番目の引数をuuidにすると通る
        .mockResolvedValueOnce([
            new Record(validUUID1 , 'Testtest51', 51),
            new Record(validUUID2, 'Testtest101', 101),
          ])
          .mockResolvedValueOnce([
            new Record(validUUID2, 'Testtest101', 101),
            new Record(validUUID3, 'Testtest111', 111),
            new Record(validUUID4, 'Testtest121', 121),
          ]);
    });

// 省略

  test('編集して登録すると更新される', async () => {
        const { Record } = jest.requireActual('@/domain/record');
        const validUUID1 = uuidv4();
        const validUUID2 = uuidv4();
        jest
          .spyOn(recordLib, 'GetAllRecords')
          .mockResolvedValueOnce([
            new Record(validUUID1, 'Testtest50', 50),
            new Record(validUUID2, 'Testtest100', 100),
          ])
          .mockResolvedValueOnce([
            new Record(validUUID1, 'English', 8),
            new Record(validUUID2, 'Testtest100', 100),
          ]);

// 省略

```
</details>


# 終わりに  
エラーは想定外のことが原因だったりするので、経験を積んで視野を広げます。
CopilotにはAA（アスキーアート）も作ってくれるらしい

最近、エガちゃんねるを楽しく見させてもらっている。
Copilotに関する記事を書いたついでに、ふと思いつきで
AAを生成するように頼んでみた。

>ワイ「江頭2:50のAAを作ってください」
>Copi「江頭2:50のAAは多くの人々に愛されていますよね！彼の独特なキャラクターがAAで再現されると楽しいです。以下に彼のAAの一例を作成してみました：」
```
　　　　　　　　　　　　　　　 ／￣＼
　　　　　　　　　　　　　 　/　　　　＼
　　　　　　　　　　　　　 　|　　　　 　|
　　　　　　　　　　　　　／　　　　 　 ＼
　　　　＿＿＿＿＿_／　 ／・＼　／・＼＼＿＿＿＿＿
　　　　|　　　　　　＿＼|　　 ￣　　￣　　|＿　　　　　　|
　　　　|　　　　　　| ＿　|　　　（＿人＿） |＿ |　　　　　 |
　　　　|　　　　　　| ＿　|　　　＼　　　|　|＿ |　　　　　 |
　　　　|　　　　　　| ＿　|　　　　＼＿|　 |＿ |　　　　　 |
　　　　|　　　　　　| ＿　|＿＿＿　　|＿ |＿ |　　　　　 |
　　　　|　　　　　　| ＿＿））＿|＿＿＿＿＿/＿|　　　　　 |

```

よくわかんなかった。
がっぺ。


### 追記：
>ワイ「コンバット越前こと越前康介のAAも書いてください。」
>Copi「申し訳ありませんが、コンバット越前こと越前康介のアスキーアート（AA）を直接作成することはできません。しかし、自作のAAを作成するお手伝いはできます。以下に、AAを作成するためのいくつかの基本的なガイドラインを示します:
>
>シンプルに始める: まずは、基本的な形や線を描くことから始めましょう。たとえば、顔の輪郭や目、口など。
>
>ディテールを追加する: 基本形を描いたら、細部を追加していきます。髪の毛や衣装の特徴を表現するために、さまざまな記号や文字を使いましょう。
>
>空白を活用する: 空白も絵の一部です。適切な場所に空白を配置することで、よりリアルな表現が可能になります。
>
>繰り返し調整する: 何度も見直し、微調整を行いましょう。完成度を高めるために細部にこだわることが重要です。
>
>自作AAを作成するのは楽しいプロジェクトですので、楽しんで取り組んでくださいね！もし他に具体的な質問や手助けが必要であれば、どうぞお知らせください。」

なんでや
windows11でディレクトリが「権限がありません」で削除できない人へ。

pythonコードを用意しました。
実行して、ディレクトリをターミナルに
ドラッグアンドドロップしてエンター押せば消せます。


（問題が発生しても責任は負いませんっ）

```
import subprocess
import os

def delete_directory(delete_dir_path):
    try:
        # takeown コマンドで所有権を取得
        subprocess.run(["takeown", "/F", delete_dir_path, "/R", "/D", "Y"], check=True, shell=True)
        
        # icacls コマンドでフルアクセスを許可
        subprocess.run(["icacls", delete_dir_path, "/grant", f"{os.getlogin()}:F", "/T"], check=True, shell=True)
        
        # rmdir コマンドでフォルダを削除
        subprocess.run(["rmdir", "/S", "/Q", delete_dir_path], check=True, shell=True)
        
        print(f"フォルダ '{delete_dir_path}' を正常に削除しました。")
    
    except subprocess.CalledProcessError as e:
        print(f"エラー: コマンドの実行に失敗しました。\n{e}")
    except Exception as e:
        print(f"予期しないエラーが発生しました: {e}")

if __name__ == "__main__":
    # ユーザーから削除したいパスを取得
    delete_dir_path = input("削除したいフォルダのパスを入力してください: ").strip()
    
    if os.path.exists(delete_dir_path):
        delete_directory(delete_dir_path)
    else:
        print("指定されたパスは存在しません。")

```
Cloudflare Workers + HonoJSチュートリアル④：レート制限（Rate Limiting）実装

# はじめに

本記事では前回までの認証付き Hono アプリに、Rate Limiting（レート制限）を導入する方法を紹介します。

https://qiita.com/syukan3/items/3632f21915b7a78f1470

https://qiita.com/syukan3/items/7570d255575ebc31ca3e

https://qiita.com/syukan3/items/f745c658eca0d99bfe36

レート制限をかけることで、短時間で大量のリクエストが飛んできた場合にエラーを返し、サービスの安定稼働を図れるようにします。

## 1. レート制限の概要

短時間であまりに多くのリクエストが発生すると、サーバーは負荷が高まり、他の正常なユーザーのリクエストに応答できなくなる恐れがあります。
そこで一定時間内に処理するリクエスト数を制限し、しきい値を超えた場合はエラーレスポンスを返却する仕組みを導入します。

## 2. 全体フローイメージ

```mermaid
flowchart LR
    Client["クライアント"] --> Hono["Honoアプリ (Rate Limit Middleware)"]
    Hono --> Error["しきい値超過 -> 429エラー"]
    Hono --> Success["しきい値未満 -> 正常処理"]
```

## 3. インストール

Rate Limiting を実装するためのライブラリは複数ありますが、ここではシンプルに「メモリ上でリクエスト回数をカウントするだけ」の例を示します。
本番運用では分散環境に対応できるよう Redis などを使う場合が多いです。

## 4. ディレクトリ構成

```
my-hono-crud/
├─ .env
├─ package.json
├─ tsconfig.json
├─ src/
│   ├─ index.ts
│   ├─ routes/
│   │   └─ auth.ts
│   ├─ middlewares/
│       ├─ auth.ts
│       └─ rateLimit.ts   // 今回追加
│   └─ users/
│       └─ index.ts
└─ ...
```

## 5. レート制限ミドルウェアの実装例

### 5-1. src/middlewares/rateLimit.ts

```typescript
import { Context, Next } from 'hono'

// IPごとの履歴を保持するためのマップ
const requestHistory = new Map<string, number[]>()

// 1分間に許容するリクエスト数
const LIMIT = 10
// しきい値時間 (ミリ秒)
const TIME_WINDOW = 60 * 1000

export const rateLimitMiddleware = async (c: Context, next: Next) => {
  // IPアドレス取得（プロキシ環境やCloudflare環境に対応）
  const ip = c.req.header('x-forwarded-for') || 
             c.req.header('CF-Connecting-IP') || 
             c.req.header('X-Real-IP') || 
             c.env?.remoteAddr ||  // Cloudflare Workers環境用
             'unknown'

  const now = Date.now()
  const timestamps = requestHistory.get(ip) || []

  // 古いタイムスタンプを除去
  const recentTimestamps = timestamps.filter((ts: number) => now - ts < TIME_WINDOW)

  // 今回のアクセスを追加
  recentTimestamps.push(now)
  requestHistory.set(ip, recentTimestamps)

  // LIMITを超えていれば429エラーを返却
  if (recentTimestamps.length > LIMIT) {
    return c.text('Too Many Requests', 429)
  }

  await next()
}
```

### 5-2. src/index.ts への組み込み

```typescript
import { Hono } from 'hono'
import { loginHandler } from './routes/auth'
import { rateLimitMiddleware } from './middlewares/rateLimit'
import userApp from './users/index'
import 'dotenv/config'

const app = new Hono()

// レート制限ミドルウェアを全ルートで使用
app.use('*', rateLimitMiddleware)

// ログイン用エンドポイント
app.post('/login', loginHandler)

// ユーザー CRUD エンドポイント
app.route('/users', userApp)

export default app
```

## 6. 動作確認

```bash
# 連続で11回叩いてみる例
for i in {1..11}; do
  curl http://localhost:8787
done
```

## 7. まとめと応用

- **レート制限** は高負荷攻撃やスパムなどを防ぐうえで重要な施策です。
- 本番環境では **Redis** などを利用して **スケーラブル** な運用を検討しましょう。
- **IP アドレス** 以外にも **ユーザーID** や **JWT トークン** 単位でのレート制限も可能です。

---
### 会社紹介

**株式会社 Mosaica**  
最先端テクノロジーで社会課題を解決し、持続可能な未来を創造する IT カンパニー。
AI ソリューション、クラウド統合、DX 推進、経営コンサルティングなど包括的なサービスでビジネス変革を支援しています。  

詳しくは [公式サイト](https://mosaica.co.jp/) までお気軽にご相談ください。
公式サイト： https://mosaica.co.jp/
'undefined' の可能性があるオブジェクトを呼び出すことはできません(Jest、React、TypeScript)

# 問題
Jestでテストを作成していたところ、vsコード上でTypeScriptの以下エラーが出ました。
```
'undefined' の可能性があるオブジェクトを呼び出すことはできません。ts(2722)
(parameter) setData: React.Dispatch<React.SetStateAction<Record[]>> | undefined
```

```App.tsx
// 省略

// useStateの定義
  const [data, setData] = useState<Record[]>([]);

// 省略

// 登録ボタン
<RegistrationDialog button="registration" setData={setData} fetchData={fetchData} />

// 省略

// 編集ボタン
<RegistrationDialog item={item} button="modifcation" setData={setData} fetchData={fetchData} />
```

```RegistrationDialog.tsx
interface RegistrationDialogProps {
    item?: Record;
    button?: string;
    // Dispatch<SetStateAction<Record[]>>型
        // ReactのuseStateフックによって提供される状態更新関数の型
        // 状態を更新するための関数を表す
    // ?を使ったオプショナル(存在しても存在しなくても良い)ではNG
    setData?: Dispatch<SetStateAction<Record[]>>;
    // setData?: Dispatch<SetStateAction<Record[]>> | undefined;でもNG
    
    fetchData: () => void;
}
```

# 解決策
```RegistrationDialog.tsx
interface RegistrationDialogProps {
    item?: Record;
    button?: string;
    // 修正後
    setData: Dispatch<SetStateAction<Record[]>>;
    fetchData: () => void;
}
```

# 終わりに
対象ファイルを全部コピーし、出ているエラーをChatGPTに聞いたらすぐに解決できました。
許される状況であれば、この聞き方も良さそうです。