OmniAICreator/Qiita-1.07M huggingface dataset:
AWS SDK for Go v2 S3モジュールアップデートによるS3互換ストレージの502エラー

## はじめに

AWS SDK for Go v2のバージョン1.74.1から、S3クライアントのデフォルト動作が変更され、CRC32チェックサムがデフォルトで有効になった。これにより、S3互換ストレージを使用している環境で502エラーが発生した。

https://docs.aws.amazon.com/ja_jp/sdk-for-go/v2/developer-guide/s3-checksums.html

↓公式ドキュメントにも以下の記載がされている
>Amazon S3 モジュールのバージョン v1.74.1 以降、SDK はアップロードのCRC32チェックサムを自動的に計算することで、デフォルトの整合性保護を提供します。事前計算されたチェックサム値を指定しない場合、または SDK がチェックサムの計算に使用するアルゴリズムを指定しない場合、SDK はこのチェックサムを計算します。

## 問題の詳細

### 発生したエラー現象
S3互換ストレージに対してSDKを利用してPUTしたところ、502 Bad Gateway Errorが発生
※S3互換ストレージはいくつか種類がある。もしかしたらストレージ側で対応済みでエラーが発生しないものもあるかも

## 解決策
S3クライアント作成時の[オプション](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/s3#Options)の[RequestChecksumCalculationWhenRequired](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws#RequestChecksumCalculation)と[ResponseChecksumValidation](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws#ResponseChecksumValidation)を指定してあげればよい
```go
client := s3.NewFromConfig(cfg, func(o *s3.Options) {
    o.RequestChecksumCalculation = aws.RequestChecksumCalculationWhenRequired
    o.ResponseChecksumValidation = aws.ResponseChecksumValidationWhenRequired
})
```

こうすることで、必要な場合にのみチェックサムが計算されるようにすることができる

## まとめ
AWS SDK for Go v2 S3モジュールのバージョン1.74.1以降では、S3クライアントのデフォルト動作としてCRC32チェックサムが有効になった。
S3互換ストレージを使用している場合、この変更によって502エラーが発生する可能性がある。
S3互換ストレージをSDKで操作してる場合は、ユニットテストを用意してパッケージのバージョンアップ前に必ず動作確認した方が良い。

## 参考
- [チェックサムによるデータ整合性保護](https://docs.aws.amazon.com/ja_jp/sdk-for-go/v2/developer-guide/s3-checksums.html)
- [Amazon S3 でのオブジェクトの整合性のチェック](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/checking-object-integrity.html)
- [お知らせ: S3 のデフォルトの整合性の変更](https://github.com/aws/aws-sdk-go-v2/discussions/2960)
初学者がTCP/IPを頑張って理解してみた


**TCP/IPでは、ネットワークでコンピュータが通信する一連の処理を4階層で表現する。**

## アプリケーション層

**役割:** ユーザーが直接操作するアプリケーションと通信する層です。メール送信の場合、メールクライアント（例: Outlook、Thunderbird）がこの層で動作し、SMTP（Simple Mail Transfer Protocol）などのプロトコルを使用してメールを送信します。

**動作:** ユーザーがメールを作成し、「送信」ボタンを押すと、メールクライアントがSMTPプロトコルを使用してメールデータをトランスポート層に渡します。

## トランスポート層

**役割:** データの信頼性とフロー制御を担当します。メール送信では、TCP（Transmission Control Protocol）が使用され、データが正確に届くよう保証します。

**動作:** トランスポート層では、メールデータを適切なサイズに分割し、各セグメントに送信元と宛先のポート番号を付加します。これにより、受信側でデータを正しく再構成できます。

## ネットワーク層

**役割:** データがどのルートを通って目的地に届くかを決定します。IP（Internet Protocol）はこの層の中心的なプロトコルで、データパケットが送信元から宛先まで適切にルーティングされるようにします。

**動作:** トランスポート層から受け取ったセグメントに、送信元と宛先のIPアドレスを付加し、パケットを作成します。このパケットは、ネットワーク上のルータを経由して、宛先のメールサーバーに届けられます。 

## ネットワークインターフェース層

**役割:** 物理的なデータ伝送が行われる層です。イーサネットやWi-Fiなどの技術がここに含まれます。

**動作:** インターネット層から受け取ったパケットに、MACアドレスなどの情報を付加してフレームを作成します。このフレームが物理的なネットワークを介して送信され、最終的に宛先のデバイスに届きます。 


## 通信の具体的なイメージ
インターネットでメールを送信することを例にとると、送信する際に、上から順にデータをカプセル化していき、受信する際には、下から順に非カプセル化していく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4035435/44c53bd5-3600-41b3-bcd7-4d28bee03f78.png)
[BIAS.JP のブログ"さんから画像拝借](https://www.bias.jp/blog/post-538/)

**①アプリケーション層**では送るメッセージ（データ）を生成。

**②トランスポート層**ではTCPヘッダーを追加し、セグメントを作成。

トランスポート層では、データの信頼性と正確な配信を確保するために、TCP（Transmission Control Protocol）ヘッダーが追加されます。このTCPヘッダーには、以下の主要な情報が含まれています。

- **送信元ポート番号**: データを送信したアプリケーションのポート番号を示します。
- **宛先ポート番号**: データを受信するアプリケーションのポート番号を示します。
- **シーケンス番号**: データの順序を管理し、再構成するための番号です。
- **確認応答番号（ACK番号）**: 受信側が次に受け取りたいデータのシーケンス番号を示し、受信確認を行います。
- **フラグ**: 接続の確立、データ送信、接続の終了などの制御情報を含むビット群です。
- **ウィンドウサイズ**: 受信側が一度に受け取れるデータ量を示し、フロー制御を行います。
- **チェックサム**: データの誤り検出を行うための検査値です。

これらの情報により、TCPはデータの正確な送受信、再送制御、フロー制御などの機能を提供し、信頼性の高い通信を実現します。

**③ネットワーク層**では、セグメントにIPヘッダーを付与し、パケットを作成。

**④ネットワークインターフェース層**では、パケットにフレームヘッダーとフッターを追加し、フレームとして物理的なネットワークを通じて送信する。

ネットワークインターフェース層（データリンク層）では、データを物理的なネットワーク上で転送するために、フレームヘッダーとフッターが追加されます。これらは、以下のような役割を果たします。

- **フレームヘッダー**:
    - **宛先MACアドレス**: データを受信するデバイスの物理アドレスを示します。
    - **送信元MACアドレス**: データを送信したデバイスの物理アドレスを示します。
    - **タイプフィールド**: 上位層のプロトコル（例えば、IPv4やIPv6）を識別します。
- **フレームフッター**:
    - **FCS（Frame Check Sequence）**: フレーム全体の誤り検出を行うためのチェックサム値が含まれています。

フレームヘッダーとフッターにより、データリンク層は物理アドレス指定やエラーチェックを行い、データが正確に目的のデバイスに届くようにします。
【第一回】EKSのIAM設計

# IAMロール作成時の留意点
EKSのIAM設計において、ベストプラクティスに基づいて最小権限にてカスタムポリシーのIAMロールを作成することは頻繁にあります。
その際に留意して頂きたい点を以下にまとめさせて頂きました。
※筆者も見落としかけました。。
### 留意事項：信頼ポリシーの設計
結論から申し上げますが、信頼ポリシーの設計が留意点となります。
詳細は以下の通りです。

##### 対象のロール
1. Podに設定するロール（信頼するエンティティ：eks.pods.amazonaws.com）
1. Auto Modeクラスタに設定するロール（信頼するエンティティ：eks.amazonaws.com）

##### 留意点
信頼ポリシーの"Action"が"sts:AssumeRole"だけでなく、**"sts:TagSession"** が必要になります。
基本的にサービスロールの信頼ポリシーは"sts:AssumeRole"のみですが、今回の1,2のロールについては必須となります。
※詳細な仕組みについては、今回割愛させて頂きます。

- eks.pods.amazonaws.comに設定する信頼ポリシー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525326/4d21cd57-5f1c-4aea-8670-e39e4a2891e1.png)


- eks.pods.amazonaws.com(Auto Modeクラスタ)に設定する信頼ポリシー
※オートモード利用しない場合の通常クラスタは信頼するエンティティが同じになりますが、"sts:TagSession"は不要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525326/2bc3514d-004d-464c-b1c5-aba076026349.png)

# まとめ
簡単にはなりますが、IAMロール設計における留意点となりました。他にもEKSは他AWSサービスと比較してもIAMロール設計やアクセス制御の部分で難易度が高い部分がございますので、また執筆させていただきます。
依存性逆転の原則の図的理解

手続き型のプログラムを書くと、操作元が操作先の情報を知ることになる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2676125/84b3be16-5fbc-4efb-a29e-0f5e4ea1c7da.png)

依存先が増えてくると、だんだん操作元のプログラムが大きくなってきてしまう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2676125/dd1891d6-b681-48e1-8207-9cc2ee59aaed.png)

これを解決するために操作元のプログラムが行う動作を限定した規格を作り、
操作先のプログラムが規格に従うようにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2676125/2784bde5-fee0-4693-ba37-b6b5616b5d57.png)

操作元とドキュメントを１つのパッケージにまとめ上げると、操作元に操作先が依存しているように見える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2676125/3dec8c9a-a5a8-48a3-8226-59c3d54af202.png)

元の図と見比べると、操作元と操作先の依存関係が逆転しているので依存性逆転の法則と呼ばれる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2676125/855f6d2c-5e9e-46c9-b906-0518f177a010.png)
ブラウザJS と node.js で互換を持たせるコード

# ブラウザJS と node.js で互換を持たせるコード

下記コードでブラウザJSと同じ環境を作りました

``` javascript
// main.js
if(typeof require !== 'undefined') {
    function evaluate(fileName) {
        var fs = require("fs");
        const vm = require('vm');
        const code = fs.readFileSync(fileName, 'utf-8');
        // 読み込んだソースコードを本スコープに展開する
        vm.runInThisContext(code);
    }

    evaluate("./utils.js");
    evaluate("./runtime.js");
    evaluate("./operations.js");
    evaluate("./parser.js");
}
```

指定したファイルをグローバルスコープで実行し、クラスや変数等を使えるようにしています。

# node の export, require

main.js, util.js があり
util.js で作成した Util クラスを main.js で使いたい場合を考えます

```
// util.js
function Util() {
    var self = this;

    self.hello = function(name) {
        console.log("Hello, " + name + "!");
    };
}

// これで他のファイルから `require()` できるようになる
module.exports = Util;
```

```
// main.js
const Util = require('./util');  // 拡張子 .js は省略可能

const util = new Util();
util.hello('Node.js');  // 出力: Hello, Node.js!
```


ブラウザJavaScript には module.exports, require が無いので、main.js で Util を使うには
`<script src="util.js"></script>`
としてグローバルスコープで util.js を実行し Util クラスを作成する必要があります
そこで，指定したJSファイルをグローバルスコープで実行すればブラウザJS同等の動作になるというのが本記事の考え方です


# 至る理由
ブラウザJSで使用する機能をnodeで作成していたのですが、コード規模が大きくなりファイル分けが必要になりましたが、当たり前ですが node は export して require する仕組みなのでブラウザJSのようにグローバル空間で適当に作ることが許されていません
色々悩んだ結果面倒だから eval でいいやとなりましｔ

# 真面目にやると色々めんどくさい
検索して下記サイトに真面目なやり方が書いてありましたが、面倒だなーと思った。
[https://crocro.com/write/js_sample/?act=vw_itm&itm=browser_and_node](https://crocro.com/write/js_sample/?act=vw_itm&itm=browser_and_node)

chatGPTに聞いても前述のサイトと同じ回答を出してきたのできっとこれが王道というか真面目にやったらそうなんだろうなという感じですが、nodeの仕様と真面目に向き合いたくないなという手抜き実装をしたというお話でした


# 追記

chatGPT に node.js で実行しているかを判定するコード書いてとお願いしたら下記が出てきました
多分こっちのほうがいいのかな

```
function isNode() {
  return typeof process !== 'undefined' &&
         typeof process.versions === 'object' &&
         typeof process.versions.node === 'string';
}

if (isNode()) {
  console.log("Running in Node.js");
} else {
  console.log("Not Node.js (maybe browser)");
}

```
AtCoder Beginner Contest 296B - Chessboardメモ

## 問題
AtCoder Beginner Contest 296

https://atcoder.jp/contests/abc296/tasks/abc296_b

## 考察
二次元配列として入力を受け取り、もし`a[i][j]`が`*`であるならば`8-i`を文字列したものとアルファベット列`abcdefgh`の`i`文字目を出力する。`i`の挙動は縦に、`j`の挙動は横にいくことに注意する。

## ACコード
```py

def check(a,al):
    for i in range(8):
        for j in range(8):
            if a[i][j] == "*":
                return al[j]+str(8-i)
a = [list(input()) for _ in range(8)]
al = "abcdefgh"

print(check(a,al))
```
最新のニュースを粗品の1人賛否形式でYoutubeに自動投稿するシステムを作った

# 概要
最新のニュースを粗品の1人賛否形式でYoutubeに自動投稿するシステムを作りました。

# デモ
作成された動画はこちら
<iframe width="560" height="315" src="https://www.youtube.com/embed/e5L7CTR-2iU" frameborder="0" allowfullscreen></iframe>

「ただあ！」は 48秒 あたりから。

# GitHub
https://github.com/ikenohotori/SoshinaUploader

# 仕組み
以下の処理を愚直に直列で実行しています。
1. ニュースを取得
1. ソシナテキスト（台本）を作成
1. 音声ファイルを作成
1. 音声ファイルを動画ファイルに変換
1. 動画ファイルをアップロード

```mermaid
sequenceDiagram
    participant Main as メイン
    participant NewsAPI as NewsAPI
    participant OpenAI as OpenAIAPI
    participant VoiceBox as VoiceBoxAPI
    participant YouTube as YouTubeDataAPI

    Main->>NewsAPI: ニュース取得リクエスト
    NewsAPI-->>Main: ニュースデータ返却
    Main->>OpenAI: ソシナテキスト作成リクエスト
    OpenAI-->>Main: ソシナテキスト返却
    Main->>VoiceBox: 音声ファイル作成リクエスト
    VoiceBox-->>Main: 音声ファイルパス返却

    Main->>Main: 動画変換

    Main->>YouTube: 動画アップロードリクエスト
    YouTube-->>Main: アップロード完了通知
```

### 1. ニュースを取得
[News API](https://newsapi.org/)を使っています。

日本のニュースを取得したかったのですが、上手く取得できなかった（0件になる）ため、その日アメリカで最も人気のあるニュースを取得しています。

実際のリクエストは以下のような形
```
https://newsapi.org/v2/top-headlines?country=us&from=2025-01-01&sortBy=popularity&apiKey=XXXXX&pageSize=1
```

### 2. ソシナテキストを作成
台本作成は勿論[ChatGPT](https://chatgpt.com/)です。

以下のプロンプトを与えて、先ほど取得したニュースから台本を作成してもらいます。
```text
あなたは毒舌芸人、ソシナです。
ニュースに対して、以下の#ルールを守って台本を作成をしてください。

#ルール
## 台本の流れは以下の通りです。
1. まず、#今日のニュースについて、2～3行でまとめます。
2. その後、肯定的な意見を述べてください。
3. 最後に、「ただあ！！うーーーん。」と言った後、ニュースに対しての否定的な意見を強い口調で述べてください。
## 台本の内容は、#例 を参考にしてください。
## 台本はすべて日本語で、関西弁を使ってください。
## 台本は、最低でも100文字以上でお願いします。

#今日のニュース : {newsText}

#例：
今日のニュースはこれ。トレーダーたちがアメリカ連邦準備制度理事会（Federal Reserve）の金利決定を待つ中、株価先物が下落していることが報じられとる。火曜日には、最近の市場の売りが一段と加速し、それまでの2日間の上昇が無駄になったことが注目されているらしい。
なるほど。多くの投資家が中央銀行の動きを注視しているということは、市場がどれだけセンシティブでリアルタイムに反応しやすいかを示しているなあ。このような状況では、賢い投資家たちはエキサイティングなチャンスを見つけることができるかもしれないね～。
ただあ！！うーーーん。そんないつもいつも「待ちの姿勢」で、金利の決定を待つだけなんて、まるで変化を恐れているようやなあ！！もっと積極的に行動して、リスクもチャンスも自分でつかみにいくくらいでないと、いつまで経っても振り回されるだけやで！！
```


C#でOpenAIの機能を簡単に使うために、[Semantic Kernel](https://learn.microsoft.com/ja-jp/semantic-kernel/)というライブラリを導入しています。


### 3. 音声ファイルを作成
音声ファイルの作成は[VOICEBOX](https://voicevox.hiroshiba.jp/)を使っています。

これはずんだもんや四国めたんの音声を生成してくれるツールで、無料で使えます。ローカルで起動しておくことで、APIのような形でリクエストを投げて音声ファイルを自動生成することもできるため、非常に便利です。

参考：

https://qiita.com/A_T_B/items/1531d78944d8b796b9fa

### 4. 音声ファイルを動画ファイルに変換
[FFmpeg](https://www.ffmpeg.org/)というソフトで変換しています。

ここが1番大変だったのですが、音声ファイルを動画ファイルに変換してくれるWeb APIのようなものはなさそうでした。Copilotに相談したところ、FFmpegをインストールしてFFmpeg.exeをプログラムからProcessで直接叩くという荒業を提案され、この方法を使うことにしました。

実際はFFMpegCoreという.Netのライブラリを使うことで、引数などは直接書く必要がなくプログラム的には簡潔になっているものの、中身としてはFFmpeg.exeを呼び出しているので、exeファイルがプロジェクトの中に混在してしまっています..。

### 5. 動画ファイルをアップロード
[Youtube Data API](https://developers.google.com/youtube/v3?hl=ja)を使っています。

.Net用のパッケージとコードサンプルがあったので、ほとんどそのまま使用させていただきました。

https://developers.google.com/youtube/v3/code_samples/dotnet?hl=ja

## 感想
芸人ネタとAPIの乱用という、まさに個人開発というものを作りました。
1と2の部分（ネタ）は柔軟性が高く、この部分を別のテーマに置き換えることで様々な応用ができそうです。
Vitis Unified IDEを起動すると空のウィンドウが表示される

# 状況
WSL2/ubuntu 22.04でVitis Unified IDEを起動すると空っぽのウィンドウが表示される。

```
vitis
```

![スクリーンショット 2025-03-22 143239.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561682/2692b1e8-d8f2-4a44-aee1-8e9bd18a105d.png)

# 解決策

```
export LIBGL_ALWAYS_INDIRECT=1
vitis
```

![スクリーンショット 2025-03-22 142932.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561682/73b280f7-a453-4e2c-832a-407702a19b00.png)

# 問題点
噂によると、どうやらintelのグラフィックドライバーに原因があるらしい。
他のelectronベースのアプリでも同じような症状が現れるようだ。

# 付録
旧来のVitis IDEは問題なく表示される。

```
vitis -classic
```

![スクリーンショット 2025-03-22 143528.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561682/090a15e9-01c2-4b71-9d59-4e4d725b4106.png)
SpringBoot デプロイ jar VS war



## jar

- クラスファイルやリソースファイルやメタデータをまとめた圧縮ファイル
- 内部に TomcatなどServletコンテナを含む
    - fat jar という
- 1ファイルで完結、シンプル
- モダンな開発向き
- CLIで直接起動できる
```
java -jar myapp.jar
```

- 梱包されてるtomcatの設定はどうやってやるの？
    - springの設定ファイル（application.properties や application.yml）を使う
    - 高度な設定はjava側で行う
        - `TomcatServletWebServerFactory` を `@Bean` で定義

## war

- 外部アプリサーバー（Tomcatなど）で動かすための形式
- WAR＋サーバーの構成が必要
- どっちかというと昔ながら。伝統的なやり方(失礼)
- CLIのコマンドではなく、tomcatなどに乗せる前提


どっちにしろ大量の`.class`ファイルなんかをzipみたいに圧縮してるだけ
意外とシンプル

jarがモダンでよく使われる
- DockerやCI/CD連携を考えると持ち運びしやすい
- マイクロサービス的な流れ







# 参考文献

https://docs.spring.io/spring-boot/how-to/deployment/index.html
Edge の「メモリ喰い過ぎ問題」を解決する

# 動機

最近 Edge に移行しました。けど、やっぱり Chromium 系のブラウザはメモリ喰うなぁ、ということで Edge のメモリ使用量を削減してみます。

# 環境

Windows 10 22H2
rustc 1.85.1

# 結果

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353186/2576ea34-2586-48fa-928b-f9df0402767b.gif)

msedge.exe が合計で 500MB ぐらい消費していますが、`cargo run`した直後にほぼ 0MB になりました！:tada:

# 解説

すみません、以前の記事を windows crate に置き換えただけです。

https://qiita.com/benki/items/b0b92c55d3dc66f0ed8e

# ソースコード

```toml:Cargo.toml
[package]
name = "be_on_edge"
version = "0.1.0"
edition = "2024"

[dependencies]
anyhow = "1.0"

[dependencies.windows]
version = "0.60"
features = [
  "Win32_System_Diagnostics_ToolHelp",
  "Win32_System_ProcessStatus",
  "Win32_System_Threading",
]
```

```rust:main.rs
use std::ffi::CStr;
use std::thread;
use std::time::Duration;

use anyhow::Result;
use windows::{
    Win32::{
        Foundation::HANDLE,
        System::{
            Diagnostics::ToolHelp::{
                CreateToolhelp32Snapshot, PROCESSENTRY32, Process32First, Process32Next,
                TH32CS_SNAPPROCESS,
            },
            ProcessStatus::EmptyWorkingSet,
            Threading::{OpenProcess, PROCESS_ALL_ACCESS},
        },
    },
    core::Owned,
};

struct BeOnEdge {
    entry: PROCESSENTRY32,
    snap_shot: Owned<HANDLE>,
}

impl BeOnEdge {
    fn new() -> Result<Self> {
        let mut entry = PROCESSENTRY32 {
            dwSize: size_of::<PROCESSENTRY32>() as _,
            ..Default::default()
        };

        let snap_shot = unsafe { CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0) }?;
        let snap_shot = unsafe { Owned::new(snap_shot) };

        unsafe { Process32First(*snap_shot, &mut entry)? };
        Ok(Self { entry, snap_shot })
    }
}

impl Iterator for BeOnEdge {
    type Item = ();

    fn next(&mut self) -> Option<Self::Item> {
        unsafe { Process32Next(*self.snap_shot, &mut self.entry).ok()? };

        let exe = unsafe {
            CStr::from_ptr(self.entry.szExeFile.as_ptr() as _)
                .to_str()
                .ok()?
        };
        if exe.eq("msedge.exe") {
            let handle =
                unsafe { OpenProcess(PROCESS_ALL_ACCESS, false, self.entry.th32ProcessID).ok()? };
            let handle = unsafe { Owned::new(handle) };
            unsafe { EmptyWorkingSet(*handle).ok()? };
        }
        Some(())
    }
}

fn main() {
    loop {
        BeOnEdge::new().unwrap().for_each(|_| {});
        thread::sleep(Duration::from_secs(5));
    }
}
```

肝は`windows::core::Owned`という構造体です（[handle.rs](https://github.com/microsoft/windows-rs/blob/0.60.0/crates/libs/core/src/handles.rs)）。リンク先の実装を見れば分かるように、この構造体は`Free`というトレイトを実装したなにかをメンバに持ち、`Owned`がドロップするときに`free`関数を呼んでくれます。以前は`HANDLE`をラップする構造体を自分で書いていましたが、もうその必要はないですね。`Free`トレイトを実装しているのは`HANDLE`だけじゃなくて、`HFONT`とか`HBITMAP`とかいろいろな構造体で実装されているので、これからは積極的に`Owned`でラップしていきたいと思います。おわり。
バックエンドエンジニアが、AIドリブンであっという間にスタイリッシュなWebサイトがつくれた話

# はじめに
バックエンドエンジニアが、AIの力を借りてわずか数ステップで「スタイリッシュなWebサイト」を構築できた話をお届けします。
「フロントエンドは難しそう」「デザインには自信がない」と思っている方にこそ、AIを活用したWebサイト構築の驚くべき簡単さを体験してほしいです。

# きっかけは拙いHTML画面
普段はバックエンド開発をすることが多く、フロントエンド開発には正直苦手意識がありました。しかし、ちょっとした個人プロジェクトで、簡単なWeb画面を作る必要があり、HTMLで画面を組んでみることに。
とはいえ、できあがった画面は、どうにも"イケてない"。
そこで、AIを使ってこの拙い画面をかっこよくすることに挑戦しました。

この記事で作った画面をスタイリッシュにしていきます！

https://qiita.com/Kahiro/items/b6afc63b168c6cdf80dd

# ゴールイメージ

この画面を"イケてる"感じにして公開できるようにします。

![スクリーンショット 2025-03-20 21.24.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833753/714ebdb0-7edb-4497-886f-69900a2e0425.png)

画面機能
- 利用者がWebSocket接続
- システムからコメントを適宜配信
- Web画面に配信コメントを表示

# Claudeで画面を生成

まずは、Claudeに画面を作成してもらうことに挑戦。

(1)画面のイメージを添付
・チャットに上記の画面の画像をそのまま添付。

(2)WEB画面の作成を依頼
・こんな感じでClaudeに依頼する。

![スクリーンショット 2025-03-22 13.59.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833753/48927bf0-f1a7-472c-b880-6ca5fadb3522.png)

(3)結果
・数分もしないうちに、さっきまでのダサい画面を、いい感じの画面にしてくれました。
・AWS Bedrockを使おうとしていることを見抜かれたのか、タイトルに「Nova」を付けてくれたので、このまま採用することに。

![スクリーンショット 2025-03-22 14.09.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833753/f89a983c-42ed-43da-91b6-1cbf17ffa9fc.png)

・もっとカラフルに、カッコよくしてほしいと依頼してみました。
　出てきた回答がこちら。

![スクリーンショット 2025-03-22 14.16.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833753/bdaa4cfa-01fc-4476-9326-3643194a6d02.png)

![スクリーンショット 2025-03-22 14.09.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833753/baf58826-ad83-4c81-88ff-00c2afc54bde.png)

# もっと楽をするために、V0を使ってみる

Claudeはコードを生成してくれるものの、実際のホスティングは自分で行う必要があります。
"もっと手軽に"を求めて見つけたのが、V0 (v0.dev) というサービス。V0は、UI生成に特化したAIプラットフォームで、画面をアップロードするだけで、即座にホスティング可能なWebサイトが完成します。

- Claudeに依頼した時と同じように、画面イメージを添付して、WEB画面の作成を依頼。
V0には、Cloudeで作成した画面のイメージを添付しました。

- 得られた結果はこちら。画面のイメージをそのまま再現してくれているのには驚きです。


![スクリーンショット 2025-03-22 14.27.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833753/d7f5af3d-3c4f-427a-9f87-b0c94f240f81.png)

- Previewで実際に、機能の確認をすることもできます。
- WebSocket接続をし、メッセージ配信を受け付けた結果がこちら。

![スクリーンショット 2025-03-22 14.34.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833753/2d027f57-7ac2-43df-b058-d067cd1b53f1.png)


しかも、V0上でPreviewできるだけでなく、Next.js形式でコードもダウンロード可能。
さらに、V0では画面を改良したり、簡単にデプロイまで行えます。

右上のDeployedを実行、Visit Siteで作成したWeb画面がホスティングされたサイトに行くことができます。

![スクリーンショット 2025-03-22 14.37.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833753/69c1b876-5d4f-4e31-94b8-9f9b607cca25.png)

# まとめ

AIドリブンでここまでできる！
バックエンドエンジニアでも、AIの力を借りればフロントエンドに苦手意識を感じる必要はありません。「Webサイトを作りたいけど、デザインが苦手・・・」という方も、ぜひAIを活用してみてください。
思ったより、ずっと簡単に"かっこいいWebサイト"が作れると思います！
「AtCoder Beginner Contest 186 B - Blocks on Grid」メモ

## 問題
AtCoder Beginner Contest 186

https://atcoder.jp/contests/abc186/tasks/abc186_b

## 考察
二次元配列を次のコードで入力から受け取る
```py
a = [list(map(int, input().split())) for _ in range(h)]
```
二次元配列の最小値を求めて、それより大きい数からそれを引けばよい。
## ACコード
```py
def minimum(a, h, w):
    ans = 10**9
    for i in range(h):
        for j in range(w):
            if a[i][j] < ans:
                ans = a[i][j]
    return ans

h,w=map(int,input().split())

a = [list(map(int, input().split())) for _ in range(h)]

ans = 0
for i in range(h):
    for j in range(w):
        ans += a[i][j] - minimum(a, h, w)

print(ans)
```
「心に火を灯す」スクラムフェス神奈川2025で得た熱量と学び

スクラムフェス神奈川2025に参加してきました！
スクラムフェス神奈川は『心に火を灯す』が合言葉であり、参加してみたら物凄く熱いエネルギーを貰いました！
この記事は、その熱を冷まさないために参加してみた感想や学びを書いてみます。

## スクラムフェス神奈川とは
『心に火を灯す』をテーマにしたアジャイルコミュニティのイベントです。2日間に渡りホテルで寝食を共にしながら密度の高い交流ができる場で、参加者同士の繋がりが生まれる仕掛けが施された場でした。
https://www.scrumfestkanagawa.org/

## 参加の動機
私にとって今回は2度目のスクラムフェス参加で、1度目はスクラムフェスニセコでした。ニセコも神奈川と同じようにホテルで行われ、その中で
- 抱えていた業務上の課題に対する解決策を見つけられた
- 多くの実践者との対話から新たな視点を得られた
- 日常に戻っても続く「熱量」をもらえた

という体験が得られました。他のスクラムフェスを調べたところ、スクフェス神奈川でも参加者同士の交流が盛んであり、多くの刺激やエネルギーを貰えそうだと思って参加しました。

## 心に響いた3つの体験
### キーノート：[心に灯を、過去に​感謝を、​​​​​​​未来に花束を。](https://speakerdeck.com/viva_tweet_x/xin-nideng-wo-guo-qu-nigan-xie-wo-wei-lai-nihua-shu-wo)
びばさんのキーノートはとても素敵な内容でした。スライドだけでも熱いのですが、会場全体を包むようなものすごい熱量でした。
特に印象に残ったのは「仮面が私の顔に置き換わった」という言葉です。以前、私も理想の先輩の振る舞いを模倣することから始め、それが今では自然な自分になっていることを思い出しました。同時に「仮面を被りすぎて、心が壊れそうになった」という言葉は心にグサッと響きました。ふりかえると、私も「こうあるべき/こうなりたい」と仮面を次々と被ろうとしていて、疲れているのだと気づかされました。
自身が行動することで心に影響を与えることとその限界について深く考えさせられました。

### 懇親会で偶然の学び
OST（オープンスペーステクノロジー）で話したいテーマがあったものの、キーノートの熱さからド忘れしてしまうハプニング（OST終わったときに思い出しました笑）。
テーマを思いついていたのに…と少し凹んでいましたが、懇親会の中で勇気を出して相談してみたところ、真剣な意見やフィードバックをもらうことができました！ホテル開催ならではの夜通しの対話が学びをもたらしてくれました。
「スクラムチームに対して過去・未来を想像させる」というスクラムマスターのプラクティスの話がとても興味深く、チームで実践してみたいと思っています！

### 参加者が作り上げるアンカンファレンス
驚きだったのは、参加者による発表の質の高さです。Day1の時点でアンカンファレンスのホワイトボードが用意されていたのですが、すぐに全ての枠が埋まってました。Day1の懇親会後に深夜まで資料を作成した方もいて、その熱量と行動力に感銘を受けました。
特に印象的だったのは、びばさんのキーノートに応えるように、いくおさんがクロージングKeyNoteを作り上げたことです。「参加者がカンファレンスを作り上げている」ことを体感しました。

## スクフェス神奈川参加をふりかえって
スクフェス神奈川では期待していた「エネルギー」だけでなく、会社で早速試したいことや、個人として挑戦したいことを得られました！
一方で、カンファレンスへ参加するたびに多くのGiveを貰っていますが、自分からGiveができず、もどかしさを感じています。Giveされるだけでなく、自分からもGiveが自然にできるうようになり、恩送りをしていきたいです。
この記事を書くことも小さなGiveの一歩ですが、これからもアウトプットを積み重ねてGiveができるよう頑張ろうと思えました。（スクフェスのプロポーザルへの挑戦が直近の目標 :fire: ）

## お礼
スクラムフェス神奈川の運営の皆様、参加者の皆様、素晴らしい会をありがとうございました！
Wasmでリアルタイムデータ処理 & WASIを活用したサーバーレス環境構築をする

## はじめに

前回の記事で、Wasm（WebAssembly）とWASI（WebAssembly System Interface）の基本概念とGoによる実装について解説しました。  
今回は少し発展形の内容として、Wasmを活用したリアルタイムデータ処理とWASIを使ったサーバーレス実行環境の構築をしてみたいと思います。

**対象読者**
- Wasmを活用してリアルタイムデータ処理を実装したい方
- WASIを用いたサーバーレス実行環境の構築方法を知りたい方
- GoでのWebAssembly / WASIの実装に興味がある方

**目次**
1. Wasmを使ったリアルタイムデータ処理
   - WebAssemblyによるリアルタイム処理の利点
   - GoでのWasmによるリアルタイム処理実装
   - ブラウザでのリアルタイムデータ処理のデモ
2. WASIを活用したサーバーレス実行環境の構築
   - WASIの利点とサーバーレス実行の仕組み
   - GoでWASI対応のサーバーレス関数を作成
   - Cloudflare Workers / Fermyon Spinでのデプロイ
3. まとめ

---

## 1. Wasmを使ったリアルタイムデータ処理

#### **1.1 WebAssemblyによるリアルタイム処理の利点**

Wasmを活用すると、JavaScriptに比べて高速なリアルタイムデータ処理が可能になります。

| 利点 | 説明 |
|------|------|
| **ネイティブ並みの高速処理** | JITなしで高速に実行可能 |
| **メモリ効率が良い** | 不要なGC（ガベージコレクション）が発生しない |
| **セキュアな実行環境** | サンドボックス内で安全に実行 |

Wasmを使えば、以下のような用途でリアルタイムデータ処理が可能です。
- Web上でのリアルタイム画像処理・エフェクト
- ゲームエンジンの物理演算
- 音声・映像のストリーミング処理

#### **1.2 GoでのWasmによるリアルタイム処理実装**

以下は、GoでWasmを使用してリアルタイムで数値を処理するシンプルな例です。

**real_time_wasm.go**
```go
package main

import (
    "syscall/js"
)

func processData(this js.Value, args []js.Value) interface{} {
    input := args[0].Float()
    result := input * 1.5  // 何らかのリアルタイム計算
    return js.ValueOf(result)
}

func main() {
    js.Global().Set("processData", js.FuncOf(processData))
    select {}
}
```

**コンパイル**
```sh
GOOS=js GOARCH=wasm go build -o real_time.wasm real_time_wasm.go
```

#### **1.3 ブラウザでのリアルタイムデータ処理のデモ**

```html
<!DOCTYPE html>
<html>
<head>
    <script>
        WebAssembly.instantiateStreaming(fetch("real_time.wasm"), {}).then(obj => {
            const processData = obj.instance.exports.processData;
            console.log("Processed: ", processData(10));
        });
    </script>
</head>
<body>
    <h1>Wasm によるリアルタイムデータ処理</h1>
</body>
</html>
```

---

## 2. WASIを活用したサーバーレス実行環境の構築

#### **2.1 WASIの利点とサーバーレス実行の仕組み**

WASIを活用すると、Wasmをブラウザ外の環境（サーバー、CLI、クラウド）で動作させることができます。

| 機能 | 説明 |
|------|------|
| **ファイル I/O** | サーバーレス環境でファイルを操作可能 |
| **ネットワーク通信** | クラウドAPIにリクエストを送信可能 |
| **環境変数アクセス** | サーバーレス関数の環境設定が可能 |

#### **2.2 GoでWASI対応のサーバーレス関数を作成**

以下は、WASIを使ってリクエストを受け取り、ファイルに書き込むGoの例です。

**wasi_serverless.go**
```go
package main

import (
    "fmt"
    "io/ioutil"
    "os"
)

func main() {
    data, _ := ioutil.ReadFile("input.txt")
    fmt.Println("Received input:", string(data))
    ioutil.WriteFile("output.txt", []byte("Processed: "+string(data)), 0644)
}
```

**コンパイル**
```sh
GOOS=wasip1 GOARCH=wasm go build -o wasi_serverless.wasm wasi_serverless.go
```

#### **2.3 Cloudflare Workers / Fermyon Spinでのデプロイ**

Cloudflare WorkersやFermyon Spinを使うと、サーバーレス環境でWasmを実行できます。

**Fermyon Spinでの実行**
```sh
spin new wasi-go serverless-app
cd serverless-app
spin build
spin up
```

---

## 3. まとめ

| 項目 | 説明 |
|------|------|
| **Wasmでのリアルタイムデータ処理** | JavaScriptよりも高速で、安全な処理が可能 |
| **GoでのWasm実装** | `syscall/js`を使ってJavaScriptと連携 |
| **WASIの活用** | ブラウザ以外の環境でWebAssemblyを実行 |
| **サーバーレス環境の構築** | Fermyon Spinなどを利用してクラウドにデプロイ |

wasmCloudにも触れてみたい。
Dockerより軽量、高速だけど普及するのかな～
[AWS] Security Lake 概要


## 【1】概要

- AWS Security Lakeは、AWS環境およびサードパーティ製のセキュリティデータを一元的に収集・保存・分析できるマネージド型のセキュリティデータレイクサービス。
- ログやイベントデータを標準フォーマット（OCSF: Open Cybersecurity Schema Framework）で収集・正規化し、統合的に分析可能にする。
- AWS CloudTrail、VPC Flow Logs、Route 53 Resolverのログ、セキュリティソリューションのデータ等、多様なソースに対応する。
- Amazon S3上にデータを安全かつ拡張可能な形式で保存し、Amazon AthenaやOpenSearch、Splunk、SIEMツールと連携して分析できる。

## 【2】ユースケース
Security Lakeは以下のようなユースケースで活用される。

| 用途             | 詳細・具体例                |
| -------------- | --------------------- |
| **脅威検知と対応**    | 不審な挙動を検知し迅速にインシデント対応  |
| **コンプライアンス監査** | セキュリティ関連ログを一元管理・監査対応  |
| **データ分析・可視化**  | 複数ソースのデータを標準化し可視化・分析  |
| **SIEM統合・拡張**  | 外部SIEMツールと統合して検知能力を強化 |
| **フォレンジック分析**  | インシデント発生後の調査・分析       |

## 【3】設定手順
AWSコンソールによる設定手順は下記の通り
1. **Security Lakeの有効化**    
    - AWSコンソールで「Security Lake」を「有効化」。
    - データソースを選択（例：CloudTrail、VPC Flow Logs）。
2. **リージョンとログタイプを選択**
    - ログを収集したいリージョンを選択。
    - 収集対象のログタイプを選択。
3. **データ保存設定**
    - 保存先のS3バケットを指定（新規作成または既存）。
    - 暗号化設定を指定（KMSキーなどを利用）。
4. **サードパーティ連携（オプション）**
    - 必要に応じて外部パートナー（例：Splunk、Sumo Logicなど）との連携を設定。
5. **設定確認と完了**
    - 設定内容を確認して「作成」をクリック。
    - 作成完了後、データ収集が自動で開始される。

## 【4】データソースとして連携可能なサービス

AWS Security Lakeにデータを送信できるソースは主に以下の通り。

| 種類               | 主なサービス・製品                                                                                                         |
| ---------------- | ----------------------------------------------------------------------------------------------------------------- |
| AWS ネイティブソース     | - AWS CloudTrail<br>- Amazon VPC Flow Logs<br>- Route 53 Resolver クエリログ<br>- AWS Security Hubスキャン結果               |
| サードパーティ製セキュリティ製品 | - Cisco Secure Firewall<br>- CrowdStrike Falcon<br>- Okta<br>- Trend Micro など |
| カスタムソース（自作・外部）   | - 自作アプリケーション<br>- 他システムのカスタムログ                                                                                    |

## 【5】分析サービスとして連携可能なサービス

Security Lakeに集約したログを分析可能なサービス・ツールの例：

| 分析サービスの種類          | 主な製品・サービス例                                                                                                                    |
| ------------------ | ----------------------------------------------------------------------------------------------------------------------------- |
| AWSのネイティブ分析サービス    | - Amazon Athena (SQLベース分析)<br>- Amazon OpenSearch Service (全文検索・分析)<br>- Amazon QuickSight (データ可視化)<br>- AWS Glue (ETL・データ加工) |
| サードパーティ製SIEM/分析ツール | - Splunk Cloud Platform<br>- Datadog Security Monitoring<br>- Sumo Logic<br>など                                                |

## 【6】料金体系

- その月にAWS Security Lakeに取り込まれたログのデータサイズ（GB）に基づいて課金される。
- 毎月初めに使用量はリセットされ、毎月の取り込み量によって毎月の料金が決定される。
- これとは別に、保存されたデータ（S3ストレージ）については、月ごとに保持している総データ量に対して課金される。

→　つまり、毎月の課金は「**その月に新たに取り込んだデータ量**」と「**その月にS3に保存している総データ量**」の両方に基づいて決まる。

## 【7】参考文献・関連ドキュメント

- [AWS Security Lakeとは](https://docs.aws.amazon.com/ja_jp/security-lake/latest/userguide/what-is-security-lake.html)
- [AWS Security Lakeの開始方法](https://docs.aws.amazon.com/ja_jp/security-lake/latest/userguide/getting-started.html)
- [OCSF - Open Cybersecurity Schema Framework (公式)](https://schema.ocsf.io/)
- [Security Lake統合パートナーサービス](https://aws.amazon.com/security-lake/partners/)
自分をAIでもう一人作る？？Second-Meを試してみる②

# Second Me が動いたので備忘録

- 前回の記事:

https://qiita.com/GOROman/items/a27ef7f3004de6ed18bb


## リポジトリ

https://github.com/mindverse/Second-Me

## 試した環境

M3 MacBook Pro Max 128GB 1TB

## 前回の失敗

Macのストレージが 400MBくらいしか空きがなかった

## AI(Windsurf)に頼んで色々消す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30621/c025bdde-b634-45b6-a34c-da5cda75e509.png)

適当に消してもらう(AIを信じろ！！！)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30621/57fc8053-4b20-4ede-a4d4-dafb4a9425b9.png)


## セットアップ

~~~zsh
git clone git@github.com:Mindverse/Second-Me.git
cd Second-Me
~~~

Windsurf に丸投げ
~~~zsh
./scripts/setup.sh
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30621/94e173d9-73a7-436a-9d9d-2409af5f012c.png)



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30621/734cce9b-5d68-47f6-908b-7d2dbbbaa4dd.png)

## 起動！

~~~zsh
./scripts/start.sh
~~~

## 動作!

ブラウザからアクセス
- フロントエンド http://localhost:3000/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30621/c036336b-be1e-403e-abd9-d42298eb8f0c.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30621/a15ac445-3903-408f-8b83-cc8e83aca6d2.png)


セットアップの仕方は

https://second-me.gitbook.io/a-new-ai-species-making-we-matter-again

## 次回

次回、実際に登録してみた。

https://qiita.com/GOROman/items/1a8b1fe91204e5432dde
使いやすいマニュアルを考える～ユーザービリティ原則で読み手に伝わるマニュアル～

## はじめに
業務でカスタマサポート業務に従事し、その中で日々マニュアルやFAQを作成しています。
マニュアルが使いにくいと、結果的にお問い合わせが増えたりお客様への誤解が生じるかもしれません。
**有名な「ニールセンのユーザビリティ原則」にそって、わかりやすいマニュアルとは？を考えました。**

## ユーザービリティってなに？
ユーザビリティとは一言でいうと「使いやすさ」です。
直感的にどうすればどう動くかが、ユーザーが感覚でわかることが重要です。

## ニールセンのユーザービリティ原則
参考：
[ユーザーインタフェースデザインのための10ユーザビリティヒューリスティックス](URL "https://u-site.jp/alertbox/ten-usability-heuristics")

以下がヤコブ・ニールセンのインタラクションデザインのための一般的な原則です。

1\. システム状態の視認性
2\. 実世界との一致
3\. ユーザーの主導権と自由
4\. 一貫性と標準
5\. エラーの防止
6\. 記憶に頼らずに済む設計
7\. 柔軟性と効率性
8\. ミニマルなデザイン
9\. ユーザーがエラーを認識し、診断し、回復できるようにする
10\. ヘルプとドキュメント

## マニュアルへの応用は？
厳選して、以下の3つの原則を、マニュアルへどのように応用できるか考えました。

### 5\. エラーの防止

#### なぜ大切なのか

マニュアルを読むユーザーは、何かに困って調べ物をしている状態であり、
「不安な状態」です。
マニュアルを読んでいる時は、「間違いたくない・失敗したくない」という気持ちが強くなっているので
マニュアル自体がこれ以上のミスを防ぐ工夫が必要です。

#### 具体的な工夫
**■視覚的に目立たせる**
例えば「この操作をするとデータが削除されます」のような重要な注意は以下のように表現します。

:::note info
アイコンや枠線で目立たせる
他と差別化されて、ユーザーの目を引きます。
:::

:::note alert
赤色にすることにより強い警告を促せる
:::

■ **「よくある間違い」を事前に伝える**
操作をするうえでミスしやすい部分は先回りして書いておくことで、ユーザーに安心感を与えることができます。

その結果…
**ユーザーが自信をもって操作できるようになる！**
**マニュアルへの信頼度も増す！**

### 6\. 記憶に頼らずに済む設計

#### なぜ大切なのか

上記で指摘したように、マニュアルを読む人は「困った状態」にあります。
その際に、表示されたエラー文や状況を細かく覚えてはいません。

#### 具体的な工夫

■**スクリーンショット画像を入れる**
文章だけではわかりにくい操作や、エラー文が表示される状況はスクリーンショット画像を添える。
ユーザーは画面を表示されることで「**このエラーさっき見たな**」など思い出すことができます。

■**用語の補足をする**
特定のものを指す用語の場合は、わかりやすい説明を追加する。
例えば「ユーザーID」であれば、「ユーザーID(マイページにログインするために使用するメールアドレス)」と補足をすると、ユーザーは理解がしやすくなります。

### 8\. ミニマルなデザイン

#### なぜ大切なのか
ユーザーに伝えたいことはたくさんあるけれど、ごちゃごちゃとしているとどこを読めばいいのか分からずユーザーのストレスになります…。
見やすくシンプルにレイアウトすることが大事です。

#### 具体的な工夫

■**見出しと余白は適切にする**
手順ごとに小見出しをもうけたり、段落の間は十分な余白をとり、視線が迷わないようにする。

■**不要な情報は思い切って省く**
「あったほうが親切かも？」と思い、つい情報をどんどん追加してしまいます。
しかし本当に必要か？と立ち止まって考え、見直すことが大切です。
**読者の目的達成に必要か判断します。**

## 最後に
上記の3つは「**読み手であるユーザーの負担を減らす**」ために必要だと感じた工夫です。
ユーザーの視線の心理を創造しながら、マニュアルを作成することが重要だと感じました。

とはいえ、「言うは易く、行うは難し」なので、なかなか実践してくのは難しいのですが…
日々お客様の身になって考えるということを大事にしたいと思います。
ファインチューニングの落とし穴

ファインチューニングは、汎用的な事前学習モデルを特定のタスクに適応させるための非常に強力な手法ですが、成功にはいくつかの注意点や落とし穴を理解しておく必要があります。本記事では、ファインチューニングにおける代表的な落とし穴と、それらを回避するための実践的なアドバイスを丁寧に解説します。

## 1. データの質と量に関する落とし穴

### 過学習（Overfitting）
- **問題点**：少量のデータでファインチューニングすると、モデルが訓練データに過剰に適応し、汎化性能が落ちる。
- **対策**：
  - 適切な正則化（Dropout、Weight Decay）
  - Early stopping（評価指標の改善が止まったら学習終了）
  - データの拡張やノイズの導入

### 不均衡なデータ分布
- **問題点**：ラベルが偏っていると、モデルが一部のクラスに偏った予測をする。
- **対策**：
  - クラスごとの重みを調整
  - データのサンプリング（オーバーサンプリング、アンダーサンプリング）

### ラベルノイズ
- **問題点**：ラベルに誤りがあると、モデルが誤学習する。
- **対策**：
  - データの検証・フィルタリング
  - 信頼できるソースからのデータ収集

## 2. モデル選択とハイパーパラメータに関する落とし穴

### 不適切な事前学習モデルの選択
- **問題点**：タスクに合わないモデルを選ぶと、精度が出ない。
- **例**：翻訳タスクに分類用モデルを流用
- **対策**：
  - モデルの事前学習タスクを確認（例：BERTは分類、T5は生成に強い）
  - 軽量モデルでまず動作確認を行う

### 学習率の不適切な設定
- **問題点**：高すぎると発散、低すぎると収束しない
- **対策**：
  - 事前学習モデルには小さめの学習率（1e-5〜5e-5）
  - Scheduler（学習率減衰）を活用

### バッチサイズ・エポック数の誤設定
- **問題点**：メモリ不足や学習不足に繋がる
- **対策**：
  - GPUメモリに応じたバッチサイズ選定
  - エポック数はValidation lossの推移で調整

## 3. 評価・検証に関する落とし穴

### 適切な評価指標を使っていない
- **問題点**：精度（Accuracy）だけでは不十分な場合がある（例：不均衡データ）
- **対策**：
  - F1スコア、AUC、マクロ平均などを併用
  - タスクに合った指標を使う

### テストデータが訓練データと重複
- **問題点**：過学習の原因、正しい汎化性能が測れない
- **対策**：
  - データの分割に注意（stratified splitなど）
  - データリークを防止

## 4. 実運用を見越した注意点

### ドメインミスマッチ
- **問題点**：訓練データと運用データの文体や語彙が異なると性能が低下
- **対策**：
  - 運用に近いデータでファインチューニング
  - アダプター層やLoRAによる軽量再学習を活用

### モデルのサイズ・推論速度
- **問題点**：大規模モデルは推論が遅く、運用コストが高い
- **対策**：
  - 蒸留（Distillation）や量子化（Quantization）を検討
  - 軽量モデル（DistilBERT、MobileBERTなど）を選ぶ

## 5. 再現性とトラブル対処

### シード値の固定忘れ
- **問題点**：再現性のない結果、デバッグ困難
- **対策**：
  - `random.seed()`、`np.random.seed()`、`torch.manual_seed()` などの設定

### 学習ログの記録漏れ
- **問題点**：後から結果の比較ができない
- **対策**：
  - wandb、TensorBoardなどのログツールを活用

## まとめ
ファインチューニングは簡単なようで奥が深く、細かな設定やデータの扱い方で結果が大きく左右されます。今回紹介した落とし穴を理解し、計画的に進めることで、高精度で信頼性のあるモデルを構築できます。

初心者の方は、まず小規模データで試し、徐々に規模やタスクの複雑性を上げていくのがおすすめです。失敗も貴重な学びとして活用しながら、より良いモデル開発を目指しましょう。
チャットGPT用英語練習プロンプト



⸻


```
# 英語学習に使える！ChatGPTへの質問フォーマット（カタカナ英語訳付き）

## はじめに

この記事では、ChatGPTと英語学習を進めるための**要件定義（Requirement Definition）**と、実際の**フォーマット例**を紹介します。

特に、「英語の文章を前から区切って理解したい」「カタカナ英語を混ぜた訳で感覚をつかみたい」という方におすすめです。

---

##  要件定義（Requirement Definition）

### 1. 質問または話題の送信
- **ユーザーは日本語で質問や話題を送ります。**  
- *You will send questions or topics in Japanese.*

### 2. 英語での回答
- **ChatGPT は英語で回答します。**  
- *I will answer in English based on the question or topic you provide.*

### 3. 英語文の分割＋カタカナ英語での和訳
- **英語の文章を「前から順に区切って」表示し、**
- **対応するカタカナ英語多めの日本語訳を提供します。**  
- *I will break the English sentence into parts and provide the corresponding Japanese translations using more Katakana-English.*

---

## 回答フォーマット例（Example Format）

以下は「CMOSセンサー」に関する英語文を使った例です。

### 英文  
**A CMOS image sensor is a device that converts light into electrical signals using complementary metal-oxide-semiconductor technology.**

### カタカナ英語訳  
→ CMOSイメージセンサーは / デバイスです / 光をコンバートする / エレクトリカルシグナルに / コンプリメンタリーメタルオキサイドセミコンダクターテクノロジーを使って

---

### 英文  
**It is widely used in digital cameras, smartphones, and many other imaging devices.**

### カタカナ英語訳  
→ それはワイドリー ユーズされています / デジタルカメラやスマートフォン、 / そして他のイメージングデバイスで

---

### 英文  
**CMOS sensors are known for their low power consumption, high-speed readout, and integration capability.**

### カタカナ英語訳  
→ CMOSセンサーはノウンです / ロウパワーコンシュンプション、 / ハイスピードリードアウト、 / そしてインテグレーションキャパビリティで

---

## このフォーマットの使い方

1. あなたは ChatGPT に **日本語で質問やトピック**を送ります。  
2. ChatGPT はその内容に対して **英語で回答**します。  
3. 各英文を **意味の区切りごとにスラッシュ（/）で分けて**、  
4. 各部分に **カタカナ英語多めの訳**を付けてくれます。
```
---

##  応用例

- TOEIC Part 7 の長文対策
- 理系英語（工学・化学・AIなど）の読解練習
- 海外の技術文書を読む力を養うトレーニング

---

## おわりに

このテンプレートを使えば、ChatGPTをまるで「カタカナ英語家庭教師」のように使うことができます。

あなたの英語学習のスタイルに合っていると思ったら、ぜひ試してみてください！

質問例としてはこんな感じで送れます：

サイゼリヤって英語でどう説明する？
焼肉ライクについて英語で紹介して！
TOEICパート7の説明をお願い！
【JavaScript】手引書として持っておきたいjsprimer

## はじめに

「JavaScriptってなんとなく書けるけど、ちゃんと理解できてるのかな？」

そんなモヤモヤを抱えている方におすすめなのが、無料で読める学習書籍 [jsprimer](https://jsprimer.net/) です。

特に、次のような方にはピッタリだと思います。

### 👶 JavaScript初心者の方

- ProgateやドットインストールでJavaScriptを触ったけど、次に何をすべきかわからない  
- 「クラス？継承？prototype？？？」となっている

### 🚀 駆け出し〜中級の方

- ReactやNext.jsを触っているけど、たまにJSの仕様や文法で詰まってしまう  
- フィーリングでJSを書いてきたけど、ちゃんと基礎を固めたい  
- MDNで調べても、前提知識が抜けていてよくわからない…

---

## jsprimerの良かったところ 

- 完全無料なのに内容が超充実している
- 「学習→例→解説」の流れがわかりやすく、初心者にも優しい
- 仕様や設計思想にまで触れてくれて、文法の「背景」が学べる
- MDNなど公式ドキュメントを読むための準備運動としてちょうどいい

---

## jsprimerのちょっと大変だったところ

- しっかり読もうとすると **1章読むのにもけっこう時間がかかる**（←その分丁寧で徐々に気づける部分がめっちゃ！）
- 初学者には「prototype」「this」あたりの説明が一度では理解しきれないかも（復習前提）

---

## 学びになったこと 

### 「Objectはすべての元」であるという話

jsprimerを読んでいて特に発見だと思ったのが、JavaScriptの**ほぼすべてのオブジェクトは`Object.prototype`を継承している**という仕組みです。

以下を実行してみるとなんとなくわかるかと思います。

```js
const obj = { key: "value" };

console.log(obj.toString === Object.prototype.toString); // true
console.log(obj.toString()); // "[object Object]"
```

## 最後に
JavaScriptのドキュメントはすでに充実しているものが多くありますが、
全員に対してお勧めできるようなものではないかなと思います。
最終公式の者に落ち着くんでしょうが、学習レベル別やトピック別に充実しているドキュメントがあればぜひコメント欄で教えてください！！🙇
Github と連携

### Auth Providersを作成。Consumer KeyとConsumer Secretを適度な文字列でよい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/a3cb52ca-b7d1-4ada-94ad-ca4660678db5.png)

## Callback URLをコピー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/5721f574-932d-42b9-bae7-41c0fa5f71f8.png)

## Github側で認証Appを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/4167be12-4036-4b30-aa12-48a56ab43568.png)

## Authorization callback URLに↑でコピーしたURLを記入。Homepage URLにはHomeのURL
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/ec144f2d-a221-46fe-a945-4f586a58e50d.png)

## HomeのURLはアイコンをクリックしてユーザー名を確認、形式は「https://github.com/ユーザー名」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/face38e5-d04f-4ff2-809e-bf89313e3383.png)

## Consumer KeyとConsumer Secretを取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/89f02779-a287-4a18-97ca-a200304f4035.png)

## Consumer KeyとConsumer SecretをSalesforce側へ再設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/bb98ce0a-6051-40a8-a68b-53cfd690fee4.png)

## 指定ログイン情報を登録する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/717b3e8d-e52b-402b-88c0-e868543dbbe6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/02cbe187-2e83-4ebc-b322-9a63e106f573.png)

## プロファイルで許可
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/1f09938b-b45f-4c88-80f4-2511f2f5c300.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/1fdffe23-5591-4abc-abee-be97c4fcbdcd.png)

## 個人設定で許可
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/2c3d0a32-e902-4ee7-a309-7ea1f3d32179.png)

### 注意：保存後、認証ページに移動される、その後、StautsがAuthenticatedになる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/c3a45645-f02a-4c89-b629-22dbe5d2be33.png)

## test code
```
HttpRequest req = new HttpRequest();
req.setEndpoint('callout:myGitNamed/user');
req.setMethod('GET');
Http http = new Http();
HTTPResponse res = http.send(req);
System.debug(res.getBody());
```
Unity-配列？リスト？辞書？系統

# Unity C# における配列に似たデータ構造とその使い分け

Unity C# には、配列 (`Array`) に似たデータ構造がいくつか存在します。それぞれに異なる特徴があり、用途に応じて適切なものを選ぶことが重要です。本記事では、各データ構造の特徴と使い分けを解説します。

## 1. 配列 (`T[]`)
### **特徴**
- 固定長（サイズ変更不可）
- 高速なインデックスアクセス (`array[i]`)
- 宣言時に要素数が必要
- メモリ効率が良い

### **使いどころ**
- 要素数が決まっている場合
- 高速なインデックスアクセスが必要な場合

### **例**
```csharp
int[] numbers = new int[3] {1, 2, 3};
Debug.Log(numbers[0]);
```

---

## 2. リスト (`List<T>`)
### **特徴**
- 可変長（要素の追加・削除が可能）
- `Add()`, `Remove()` で要素の管理が簡単
- `using System.Collections.Generic;` が必要

### **使いどころ**
- 配列のように使いたいが、サイズが不定な場合
- 頻繁に要素の追加・削除を行う場合

### **例**
```csharp
using System.Collections.Generic;
List<int> numbers = new List<int> {1, 2, 3};
numbers.Add(4);
numbers.Remove(2);
Debug.Log(numbers[0]);
```

---

## 3. 辞書 (`Dictionary<TKey, TValue>`)
### **特徴**
- キーと値のペアで管理
- インデックスアクセス不可、キーでアクセス
- 高速な検索 (`ContainsKey()`)

### **使いどころ**
- 名前やIDをキーにしてデータを管理したい場合
- 高速な検索を必要とする場合

### **例**
```csharp
using System.Collections.Generic;
Dictionary<string, int> scores = new Dictionary<string, int>();
scores["Alice"] = 90;
Debug.Log(scores["Alice"]);
```

---

## 4. キュー (`Queue<T>`)
### **特徴**
- 先入れ先出し（FIFO: First In, First Out）
- `Enqueue()` で追加、`Dequeue()` で取り出し

### **使いどころ**
- 処理待ちのデータ管理
- イベント処理やタスク管理

### **例**
```csharp
using System.Collections.Generic;
Queue<string> queue = new Queue<string>();
queue.Enqueue("A");
queue.Enqueue("B");
Debug.Log(queue.Dequeue()); // "A"
```

---

## 5. スタック (`Stack<T>`)
### **特徴**
- 後入れ先出し（LIFO: Last In, First Out）
- `Push()` で追加、`Pop()` で取り出し

### **使いどころ**
- 履歴管理（例: 戻るボタン）
- 再帰的な処理

### **例**
```csharp
using System.Collections.Generic;
Stack<string> stack = new Stack<string>();
stack.Push("A");
stack.Push("B");
Debug.Log(stack.Pop()); // "B"
```

---

## 6. `HashSet<T>`（重複なしのリスト）
### **特徴**
- 重複を許さない
- 高速な検索 (`Contains()`) が可能
- インデックスアクセス不可

### **使いどころ**
- 重複を避けたいデータ管理
- ユニークなデータの集合

### **例**
```csharp
using System.Collections.Generic;
HashSet<int> numbers = new HashSet<int> {1, 2, 3};
numbers.Add(2); // 追加されない
Debug.Log(numbers.Contains(2));
```

---

## **データ構造の比較表**

| データ構造 | 特徴 | 使いどころ |
|------------|--------------------------------|----------------|
| `T[]`（配列） | 固定長、高速アクセス | 小さなデータ、変更不要な配列 |
| `List<T>` | 可変長、追加・削除が簡単 | 一般的なリスト管理 |
| `Dictionary<K,V>` | キーで値を管理、高速検索 | IDや名前で管理するデータ |
| `Queue<T>` | FIFO、順番に処理 | 待機列やタスク管理 |
| `Stack<T>` | LIFO、最後に追加したものを先に取り出す | 戻るボタンや履歴管理 |
| `HashSet<T>` | 重複なし、高速検索 | 一意性を保ちたいデータ |

---

## **まとめ**
Unity C# には、配列に似たデータ構造がいくつもあり、それぞれ異なる用途に適しています。
- **配列 (`T[]`)** は固定長で高速アクセスが必要な場合に適用
- **`List<T>`** は可変長のリストで、最も一般的に使用される
- **`Dictionary<TKey, TValue>`** はキーと値のペアでデータを管理する際に便利
- **`Queue<T>`** はFIFOで順番に処理が必要な場合
- **`Stack<T>`** はLIFOで履歴管理に適用
- **`HashSet<T>`** は重複を許さないデータ管理に最適

用途に応じて適切なデータ構造を選び、効率的なコードを書くようにしましょう！
【ChatGPTに限らず】生成AIの初心者が、どの生成AIを使うべきなのかを考えます。


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

　今回は、生成AIの初心者が、どの生成AIを使うべきなのかを考えます。

:::note info
本記事は、生成AIについての
記事です。　　　あしからず。
:::
　まずは、ニュースです。

　OpenAI Japanは3月17日、
　　教育機関向けイベント
　　　“OpenAI Education Forum Tokyo”
　　　　を開催しました。

　ChatGPT Eduを
　　日本の大学に展開するために
　　　活用を促しているようですね。

　[「ChatGPT利用者の80%は35歳以下」OpenAIは日本の大学の「生成AIネイティブ化」を狙う](https://news.yahoo.co.jp/articles/cc7da2ad16427726b4c63ca8efc8612e39ebafd8)
***
　では、【本題】です。

　今回は、
　　生成AIの初心者が、
　　　どの生成AIを使うべきなのか
　　　　を考えます。

　なお、ここでは
　　文章生成AIを対象とします。
　　　画像生成AIや動画生成AIは
　　　　除外させてください。

　ChatGPTで幕を開けた生成AIですが、
　　現時点で実にさまざまなものが
　　　登場しています。

　主要どころは
　　ChatGPT
　　Gemini
　　Claude
　　Copilot
　　　ほかにもたくさんあります。

　生成AIを
　　これからはじめたい人には
　　　“どれを選べばいいの？”と
　　　　悩んでしまう状況です。

　そこで
　　スマホユーザーを中心にして
　　　ChatGPTに記事を
　　　　書いてもらいました｡

　ここでは
　　ChatGPT、Gemini、Copilotの
　　　三つの生成AIをあげました。
　　　　理由はのちほど。

***（ChatGPT記述）***
# スマホで始める！初心者向け生成AIガイド  
### 目的別におすすめサービスを紹介

「話題の生成AI、気になるけど難しそう…」  
そんなあなたに、スマホ1台でサクッと始められる生成AIを**目的別に紹介**します！


## 【1】LINE感覚でAIと話してみたい人に  
### → **おすすめ：ChatGPT（OpenAI）**

**こんな人にピッタリ：**  
- 雑談しながら使いたい  
- 文章作成、レシピ、旅行の相談など日常で使いたい  
- スマホアプリでシンプルに始めたい

**スマホ的ポイント：**  
- 専用アプリあり（iOS/Android両対応）  
- LINEやチャットアプリのような感覚で会話できる  
- 日本語も自然で快適！

**例：**  
「週末に日帰りで行けるおすすめスポットある？」と聞くだけでOK！


## 【2】調べものや学習に使いたい人に  
### → **おすすめ：Gemini（Google）**

**こんな人にピッタリ：**  
- 検索が好き  
- 情報をわかりやすくまとめてほしい  
- スマホで調べ物が多い

**スマホ的ポイント：**  
- ブラウザ（Chromeなど）ですぐ使える  
- Googleアカウントですぐログイン可能  
- 複数の情報をスマホ画面に見やすく整理してくれる！

**例：**  
「引っ越し先の治安と便利さを比較して」と言えば、表でまとめてくれることも。


## 【3】仕事・学校でスマホでも効率化したい人に  
### → **おすすめ：Microsoft Copilot（Word/Excel連携）**

**こんな人にピッタリ：**  
- スマホでもWord・Excelを使っている  
- レポートや資料作成を効率化したい  
- 勉強・仕事で作業をラクにしたい

**スマホ的ポイント：**  
- Microsoft 365のスマホアプリと連携可能  
- スマホで編集中の文書にもAIがサポート  
- ちょっとした作業が、片手でサクサク進む！

**例：**  
「この内容を要約して」「グラフにまとめて」など、音声入力でもOK！


## 【まとめ】スマホで始めるなら、コレ！

| 目的 | おすすめAI | 使いやすさ |
|------|-------------|--------------|
| 会話・相談・日常利用 | ChatGPT | アプリですぐ使える◎ |
| 調べ物・学習 | Gemini | 検索連携が強い◎ |
| 作業効率UP | Copilot | Office系と連携◎ |


**スマホなら、思いついたときにすぐAIと会話できる！**  
まずは無料プランで試して、自分に合ったAIを見つけてみてください。

「始め方をもっと詳しく知りたい！」という方は、いつでも質問どうぞ！
***

　上記で、
　　Claudeを含めなかったのは、
　　　Web検索できないのが理由です。

　　機能としてはありますが、
　　　まだ米国の有料ユーザーのみ
　　　　にしか開放されていません。

　　生成AIがどんなに優れていても
　　　最新の情報を得られるか否かは
　　　　大きな差になります。
***
　どうですか？
　　どれかに決まりましたか？
　　　おそらく決定打に欠けるのでは？

　私個人の意見ですが、
　　無料版で構わないので
　　　三つすべてを使ってみてください。

　普段使いのChatGPT、
　　仕事使いのCopilot、
　　　検索エンジン的なGeminiと
　　　　使い分けると
　　　　　いいのではないかと
　　　　　　思います。

　　Geminiに関しては、
　　　Googleのサービスとの
　　　　連携を視野に入れてください。

　　　特に重宝するのが
　　　　YouTube動画の文字起こしや
　　　　　スマホ画面の説明、
　　　　　　Gmailの検索など
　　　　　　　でしょう。

　無料版でも充分な機能を使えますが、
　　回数制限があったりします。
　　　お気に入りの機能があれば
　　　　課金を視野に入れましょう。

　なお、Google検索を使っている方は
　　Perplexityを使ってみるのも
　　　いいかと思います。

　　Google検索では
　　　情報を手探りで
　　　　集めなければなりません。

　　Perplexityであれば
　　　そんな手間を掛けずに
　　　　情報収集とまとめが可能です。

　　Google検索を
　　　否定するわけではなく、
　　　　使い分けをお勧めするだけです｡

　なんにせよ、
　　生成AIは、私たちの能力を
　　　より良い方向へと進めてくれると
　　　　私は信じています。

　今後も多くのAIサービスが
　　登場してくることでしょう。
　　　そのときに必要なのは
　　　　“慣れ”や“知識の使い方”
　　　　　なのかもしれませんね。

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

　今回は、ここまで。
#0074（2024/03/22）Copyleft、Copyright、パーミッシブ型ライセンス

# オープンソースにおけるCopyleft、Copyright、パーミッシブ型ライセンス

オープンソースソフトウェア（OSS）を利用する際にはライセンスを理解することが非常に重要です。本記事では、著作権（Copyright）、コピーレフト（Copyleft）、そしてパーミッシブ（Permissive）型ライセンスについて、それぞれの特徴や違いを解説します。

---

## 🔹 著作権（Copyright）とは

著作権とは、著作者が自分の作品（ソフトウェア、文章、画像など）に対して持つ権利であり、その作品を他人が勝手に複製、改変、配布することを制限するための法的権利です。著作権により、著作者は自分の作品を保護し、利用許可やライセンスを通じて他者に利用を認めるかどうかをコントロールできます。

オープンソースであっても著作権は消えず、ソフトウェアの利用条件はライセンスで規定されます。

---

## 🔹 コピーレフト（Copyleft）ライセンスとは

コピーレフトは著作権を利用し、「作品（特にソフトウェア）の自由な利用・改変・再配布を認める代わりに、その派生物も同じ条件（自由なライセンス）で公開しなければならない」というルールを定めたライセンスタイプです。

### 代表的なCopyleftライセンス

- **GNU General Public License（GPL）**
  - 改変した派生物もGPLで公開する義務があります。
- **GNU Affero General Public License（AGPL）**
  - ネットワーク経由で提供するサービスでもソース公開が義務。
- **Mozilla Public License（MPL）**
  - ファイル単位でコピーレフト条件が適用される。

---

## 🔹 パーミッシブ型ライセンス（Permissive License）とは

パーミッシブ型ライセンスは非常に制限が少なく、自由な利用、改変、再配布を許可しています。商用利用でもソースコードの公開義務がなく、再配布時にライセンス表記や著作権表示のみを要求します。

### 代表的なパーミッシブ型ライセンス

- **MITライセンス**
  - 条件は著作権表示とライセンス表記のみで、自由度が非常に高い。
  - 使用例：React、Ruby on Railsなど。

- **Apacheライセンス 2.0**
  - 特許権を含んだ明確な規定があり、著作権表示とライセンス表記が必要。
  - 使用例：Docker、Kubernetes、TensorFlowなど。

- **BSDライセンス**
  - 著作権表示が必要だが、他の条件は非常に緩く自由度が高い。
  - 使用例：FreeBSD、OpenSSHなど。

---

## 🔹 各ライセンスタイプの比較

| 項目 | Copyleftライセンス | パーミッシブ型ライセンス |
|------|--------------------|----------------------|
| 派生物のソース公開義務 | あり（GPLなど） | なし |
| 商用利用 | 可能だが派生物のソースコード公開義務あり | 制限なく自由 |
| 主なライセンス | GPL、AGPL、MPL | MIT、Apache、BSD |
| 利用シーン | コミュニティやエコシステムの拡大を目的 | 商用利用や広い普及を目的 |

---

## 🔹 まとめ

OSSを利用・公開する際にはライセンスタイプを理解し、その目的に合ったものを選択することが重要です。

- **Copyleftライセンス** は自由を維持し、コミュニティに成果物を還元させることを強制します。
- **パーミッシブ型ライセンス** は自由度が非常に高く、企業や商業的な利用にも適しています。

ライセンスの特徴を踏まえ、目的に合った最適な選択をしましょう。
イメージのプッシュ先をGoogle Container RegistryからArtifact Registryへ変更


## 対象者
・Google Container RegistryからArtifact Registryへ変更未実施の方

## 概要
Google Container Registryが2025年3月18日廃止になりましたが、
個人の開発環境等でまだ移行されていない人向けに記載します。

## Artifact Registryのリポジトリー作成
![de369e42-df6a-4054-b6cd-cd750e84fdf6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869781/8efa0db8-1556-4db5-83cd-a30cd3b7ee17.png)

![スクリーンショット 2025-03-21 23.53.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869781/86015c61-70aa-4211-bcdf-c137659288c5.png)

![スクリーンショット 2025-03-22 0.08.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869781/50cb7c0c-11ce-44f9-b37b-b5f0cef85d7b.png)

設定が完了したら、作成ボタンを押下

## cloudbuild.yamlの設定

#### 変更前(Google Container Registry)
```plaintext
# 1. Docker イメージをビルド
- name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'gcr.io/$PROJECT_ID/{プロジェクト名}', '.']

# 2. Google Container Registry にプッシュ
- name: 'gcr.io/cloud-builders/docker'
args: ['push', 'gcr.io/$PROJECT_ID/{プロジェクト名}']

# 3. Cloud Run にデプロイ
- name: 'gcr.io/cloud-builders/gcloud'
    args:
    　- 'run'
    　- 'deploy'
   　 - '{プロジェクト名}'
    　- '--image=gcr.io/$PROJECT_ID/{プロジェクト名}'
   　 - '--region=asia-northeast1'
    　- '--platform=managed'
    　- '--allow-unauthenticated'

images:
- 'gcr.io/$PROJECT_ID/{プロジェクト名}'

options:
　logging: CLOUD_LOGGING_ONLY
```

#### 変更後(Artifact Registry)
```plaintext
steps:
  # 1. Docker イメージをビルド
  - name: 'gcr.io/cloud-builders/docker'
    args: ['build', '-t', 'gcr.io/$PROJECT_ID/{プロジェクト名}', '.']

  # 2. Artifact Registry にプッシュ
  - name: 'gcr.io/cloud-builders/docker'
    args: ['push', 'asia-northeast1-docker.pkg.dev/$PROJECT_ID/{リポジトリー名}/{プロジェクト名}']

  # 3. Cloud Run にデプロイ
  - name: 'gcr.io/cloud-builders/gcloud'
    args:
      - 'run'
      - 'deploy'
      - '{プロジェクト名}'
      - '--image=asia-northeast1-docker.pkg.dev/$PROJECT_ID/{リポジトリー名}/{プロジェクト名}'
      - '--region=asia-northeast1'
      - '--platform=managed'
      - '--allow-unauthenticated'

images:
  - 'gcr.io/$PROJECT_ID/{プロジェクト名}'

options:
  logging: CLOUD_LOGGING_ONLY
```
※ついでに、steps:を設定して、実行順を指定してます。
Azureの資格試験の受験申し込みで苦労した話

マイクロソフト認定: Azure管理者アソシエイト(AZ-104)の受験のために申し込みをしようと思ったら、色々なシステムの不具合で申し込み完了までにかなり苦労してしまいました。ネットの情報を見る限り同じような問題が発生している人もちらほらいるようですが、あまり解決策は共有されていないようだったのでここに残しておきます。

# 困った点１ Microsoft Learnの試験一覧にAZ-104がない
[このページ](https://learn.microsoft.com/ja-jp/credentials/browse/)から受験したい試験を探し出して申し込みをするのが想定されていると思いますが、AZ-104試験が見当たりません。また、AZ-104以外にも一覧にない試験がちらほらあるようです。
![スクリーンショット 2025-03-22 12.05.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708192/9247db21-a58b-4dbc-b2f0-ac4228d5dc51.png)

ネットに上がっている情報を見ると、キャッシュの削除をしたり、ブラウザを変えたり、使用するデバイスを変えたり、言語設定を英語にしたりすることでAZ-104が出てくるようになるというのがあり、実際にそれらをすべて試してみましたが私はいずれもうまくいきませんでした。

# 困った点２ AZ-104の専用ページからの受験申し込みもうまくいかない
[AZ-104の専用ページ](https://learn.microsoft.com/ja-jp/credentials/certifications/azure-administrator/?practice-assessment-type=certification)もあり、ここから直接申し込みページへ飛べそうだったので試してみましたがうまくいきませんでした。![スクリーンショット 2025-03-22 12.10.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708192/3309092e-a11e-48ab-ae26-43ae9901620b.png)
↑の「試験のスケジュール設定」へ飛ぶと、受験が初めての人は法的な名前を登録する必要があります。ここで自分の名前を入力して「保存」を押しても同じページに遷移し、結局受験申し込みまで辿り着けませんでした。
![スクリーンショット 2025-03-22 12.12.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708192/808a8135-69bf-4000-b18c-ec5d83f80676.png)

実はここで問題だったのは、<font color="Red">**法的名前をアルファベットで入力する必要があった**</font>という点です。しかしこのことはエラーとして出るわけでもなく、この入力欄と同じページにも注意書きとして書いていませんでした。

# Microsoftさんに改善してほしい
Microsoftのサポーターの方とやり取りを何往復かして、実際の操作画面を録画して送るという面倒なことを経てようやく受験の申し込みをすることができました。(これはありがとうございました)
ですがこの対応におそらくトータルで二時間くらいはかけてしまっており、もうちょっとユーザーフレンドリーなシステムで受験ができるようにしてほしいです。
ネットを見ていると、そこそこ前から受験申し込みで苦労している方がいるようなので、受験者数の減少にもつながっているような気がしました。