OmniAICreator/Qiita-1.07M huggingface dataset:
【Day7】画像にフレームとExif情報を付けてみる

## はじめに

勉強とアウトプットを兼ねて、Webアプリ開発の記録を記事にしてみます。

個人のメモ的な側面が強いです。
Web開発初心者すぎて至らぬところだらけだと思いますが、暖かい目で見ていただければ幸いです。

↓ これまでの内容 ↓
[【Day0】アプリが完成するまで毎日投稿](https://qiita.com/midorigame/items/f9b9a445c945b4a837b1)
[【Day1】開発環境を考える](https://qiita.com/midorigame/items/e26344599e2ffaa22033)
[【Day2】開発環境を構築する、、、はずでした](https://qiita.com/midorigame/items/3f57f2691a8e1074adb8)
[【Day3】まずはフロントだけ開発環境を構築する](https://qiita.com/midorigame/items/9de27ba72aaef504a833)
[【Day4】バックエンドの開発環境を整えつつ、マルチコンテナ対応のDevcontainerにする](https://qiita.com/midorigame/items/5b95374cd85f715a6498)
[【Day5】お試し実装！ファイルをアップロードしてバックエンドで処理する](https://qiita.com/midorigame/items/9663f0063b95b501c08a)
[【Day6】Docker Desktopが起動しなくなり泣きながら原因調査する](https://qiita.com/midorigame/items/d07df1caf05267d0609d)


## 前回のあらすじ

ようやく開発環境が構築できて、いよいよ機能実装だ！！！というところでDocker Desktopがうんともすんとも言わなくなってしまいました。

色々調査した結果、Docker Desktopを工場出荷状態にすることで何とか復旧できました。

コンテナは作成＆破棄してなんぼですからね、、、他の開発データに影響がなくてよかった。

## 今回やったこと

Chat GPT大先生にご指導ご鞭撻していただきながら、いったんフロントからアップロードした画像にフレームとExif情報を付与することができました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307348/2ac9cd37-7013-4c2d-a1b8-1e77a1b6d603.png)

### インスタに投稿してみる

生成した画像をインスタに投稿してみたら、サムネイルも投稿も良い感じかも！

![insta_サムネイル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307348/3d1830d3-1d62-4b85-a26c-1d0b32d9ce68.png)
![insta_投稿.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307348/72bc9b53-025f-4fde-82cd-baf64c71ff44.png)

## できていないこと

### 縦画像の対応

今のロジックだと縦画像も横向きにしてしまうんですよね。
縦画像も良い感じにしたいですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307348/9d96b1d1-48e5-416b-8f00-1b4a97841098.png)

### 余白の調整

今は適当に余白を作ってしまいましたが、テキストと合わせてもうちょっと最適なレイアウトを見つけたいです。

あとは、余白の種類も白背景じゃなくて元画像のぼかしとかにしてもいいかも！
この辺りは全体が一通り開発出来たらオプションを作っていきたいですね。

## 気づいたこと

自分なりに開発環境は工夫してみたんですが、フロントとバックの両方を同時に開発するときは両方をコンテナ化するんじゃなくて、1つのコンテナに両方の言語の開発環境を整えた方が楽かもなぁ～と思ったり。

フロントのソースもいじりつつ、バックのソースもいじりたいときにちょっと不便だなと感じました

デプロイするときはそれぞれのコンテナをdocker composeで同時に起動して、開発するときは片方のコンテナに両方の開発環境を入れる、もしくは開発用のコンテナを別に作ってそっちで両方の言語の開発環境を入れる、とかがいいのかな。

開発用とデプロイ用でどっちでも使いやすいコンテナを作るのは難しいなぁ。

## おわりに

実装フェーズになったらChat GPTの真価が発揮できますね。
逆に、頼りすぎてQiitaで書くことが全然ないぞ、、、泣

正直ロジックを全部理解して実装できてないのは否めないので、後ほどリファクタリングをしながらロジックを理解・整理していきます。

Chat GPTに頼りっきりですが、それでも実際に手を動かしてみると新しい気づきや学びが多いですね。
これからも手を動かすスピードは上げていきます！！

明日はフロント側をいじってみようかな。
【城間勝行】AIと設計ドキュメント整理術

最近、プロジェクトの中で「設計ドキュメントが散らかりがち」という課題が出てきました。特に少人数チームでは設計フェーズと実装フェーズが並行して進むことも多く、要件のブレや仕様の漏れが地味にボディブローのように効いてきます。

そこで今回は、ChatGPTを“設計ドキュメントの整理係”として使ってみたところ、意外と良い感じにワークしました。

やったことはシンプルで、以下の3つです：

要件の箇条書きメモを投げる

設計意図を説明しながらレビューしてもらう

関連ファイルを整理するための見出し案を出してもらう

これだけで、ドキュメントが「伝えるための設計書」に一歩近づきました。とくに助かったのは、設計の説明中に自分でも気づいていなかった“前提の抜け”を指摘してくれたこと。「この仕様、誰が使う前提？」とか「この処理は例外系も想定してる？」など、プロダクトオーナーや他メンバーに聞かれる前に気づけたのが大きいです。

もちろん、最終的なドキュメント化は人の手でやる必要がありますが、「何を、どこまで、誰に向けて書くか」を明確にする段階でAIがいると心強いです。

AIは魔法ではないですが、「散らかりをまとめるのが得意なアシスタント」くらいの位置づけで付き合うと、チームの設計品質がぐっと上がると感じています。
組み合わせ最適化問題向け制約付き高速順列生成

## はじめに

組み合わせ最適化問題において、最適な組み合わせを求める基本的なアプローチは、考えうる全てのパターンを生成し、目的関数が最小（または最大）となるパターンを探索することだ。しかし、パターンの総数は要素数が増加するにつれて爆発的に増加するため、一般的なPCでは（場合によってはスーパーコンピュータでも）、全パターンの評価を現実的な計算時間内に完了させることが困難となる場合が多い。

もし、生成する順列パターンに何らかの制約を設け、評価対象となるパターン数を大幅に削減できれば、一般的なPCでも許容可能な計算時間で最適な組み合わせ、あるいはそれに近い解を求めることが可能になる。

この方法では２コートまでの組み合わせしか許容される処理時間内で計算できなかった。そこで筆者は、順列生成と制約チェック処理を統合して評価パターン数を大幅に削減する手法を考案した。その結果、本稿で提案する手法によって３コートまでの計算が可能となった。本稿では、その詳細について述べる。

## 制約付き高速順列生成

[サークルテニス ダブルス組み合わせ最適化](https://qiita.com/vivisuke2025/items/15a5d9af31e59b883482) では、next_permutation() により、すべての順列を生成し、その中で正規化された順列のみを目的関数で評価することで、コート数が２面までであれば現実的な処理時間で最適解を得ることに成功した。

```C++
  vector<int> ar = {1, 2, ...};
  do {
    if( is_normalized(ar) ) {  // 制約を満たしているか？
      auto ev = eval(ar);  // 目的関数により、パターンを評価
      ev が保存している評価値より優れていれば、ar を保存
    }
  } while( std::next_permutation(ar.begin(), ar.end()) );  // 次の順列を生成
```

しかし、順列の要素数がある程度大きくなると、制約による評価を行う以前に、順列を網羅的に生成する処理そのものが計算量のボトルネックとなる。例えば、12個の要素からなる順列の総数は 12!（約4億7900万通り）にも上り、この規模の全探索は現実的な時間内での完了が困難である。

そこで本稿では、全ての順列を生成した後に制約をチェックするのではなく、制約を満たす順列のみを効率的に生成する枝刈り探索の手法を提案する。

具体的には、再帰関数を用いて順列の要素を1つずつ決定していく過程で、各ステップごとに制約を満たしているかを判定する。もし制約に違反した場合は、その先の分岐を全て破棄（枝刈り）する。これにより、無駄な順列生成を根本から省略し、計算量を大幅に削減することが可能となる。以下にその実装を示す。

```C++
void gen_permutation(vector<int> &ar, int ix) {
    if( ix == ar.size() ) {
      auto ev = eval(ar);  // 目的関数により、パターンを評価
      ev が保存している評価値より優れていれば、ar を保存
      return;
    }
    for(int dst = ix; dst < ar.size(); ++dst) {
        swap(ar[ix], ar[dst]);  // 要素交換
        if( ar[ix] が制約を満たしているか？ )
            gen_permutation(ar, ix+1);
        swap(ar[ix], ar[dst]);
    }
}

  vector<int> ar = {1, 2, ...};
  gen_permutation(ar, 0);
```

3面12人の組み合わせ問題について、1ラウンドあたりの最適な組み合わせを求める処理時間を計測し、提案手法の有効性を評価した。比較対象として、単純な全探索（next_permutationを使用）と、本稿で提案する枝刈り探索（gen_permutationを使用）の2つの実装を用いた。

##### 計測環境

| | |
|----|--------|
|OS|Windows 10|
|CPU|Intel Core i7-9700 (3.00GHz)|
|メモリ|32GB|
|言語|C++|

##### 計測結果

計測の結果、1ラウンドあたりの処理時間は以下の通りとなった。
|手法|処理時間|
|----|--------|
|全順列生成 (next_permutation)|16.861秒|
|本稿の手法：枝刈り探索 (gen_permutation)| 0.312秒|

この結果から、提案手法である枝刈り探索を用いることで、処理時間を約54倍高速化できることが確認できた。これにより、従来手法では実用的でなかった規模の問題に対しても、許容時間内での計算が可能となる。


## おわりに
Haskellに出会って「型」の見え方がちょっと変わった話

最近ちょっとHaskell触ってみたんだけど、思った以上に「型」に対する認識がひっくり返された。
というか、「型って意味なんだな」って、ちゃんと実感。

Pythonとか書いてると、型ってあくまでヒントとか注釈くらいの立ち位置で、「`int`を受け取って`str`を返しますよ」くらいの話だったん。実行時に特に効くわけでもないし、まぁコメントに毛が生えたようなものだと思ってた。

でもHaskellの `Int -> String` って型はもっといろんなことを語ってる。
「この関数は `Int` を受け取って `String` を返す」ってだけじゃなくて、
「副作用はないですよ」とか、「失敗もしませんよ」とか、「外の世界に依存してませんよ」ってところまで、型で分かる。

逆に言うと、「それ以外のことはしない」っていう保証になってる。
型って、できることを表すと同時に、できないことを明示するものだったのか、っていう。

この「できないことを定義する」ってのが、なんかすごく設計っぽいなと思った。
要するに、「これは何で、何じゃないか」って線引きでしょ？それが設計ってやつかもしれないなーと。

実際、Pythonで設計ルール決めるときも同じようなことしてるなと思う。
「ルーティングはroutes.pyだけに書こう」とか、「ビジネスロジックはusecaseに持っていこう」とか、「この層から下には依存していいけど、逆はダメ」とか。
あれって結局、「ここは何であるか／何ではないか」って決めて、それを守ろうとしてるわけで。

Haskellはそういう線引きを型でやってくれるけど、Pythonは文化とか設計とか、ちょっと人力で頑張るしかないんだなーと。
型がないからゆるいってわけじゃなくて、どのレイヤーで制約を作り、守るかって話なんだよね。

最近はコード書いてるときも、自然と問いが浮かぶようになった。
「これって何なんだろう？」「何ではないんだろう？」
そして「それを、どうやって守る？」って。

まあ、ちょっと考えすぎかもしれないけど、Haskellを触ったことで「型」がぐっと身近で設計的なものに見えるようになった、みたいなかんj
【簡単Kubernetes】StatefulSet における `terminationGracePeriodSeconds` の設定について

`terminationGracePeriodSeconds` は、Pod を終了する際に Kubernetes が「優雅なシャットダウン（graceful shutdown）」のために与える猶予時間（秒）を指定するフィールドです。

---

## ✅ 1. パラメータの定義

```yaml
spec:
  template:
    spec:
      terminationGracePeriodSeconds: <秒数>
```

- **意味**：Pod が削除される際、Kubernetes はまず `SIGTERM` を送信し、この秒数の間コンテナに終了処理を行う時間を与えます。
- **猶予時間内に終了しない場合**、`SIGKILL` が送られ、強制終了されます。

---

## ❌ 2. `terminationGracePeriodSeconds: 0` は設定不可

StatefulSet（および Pod 一般）では、`terminationGracePeriodSeconds` を `0` に設定することは **できません**。

| 値 | 許可されるか | 説明 |
|----|----------------|------|
| `0` | ❌ 不可 | API バリデーションで拒否される |
| `1` 以上の整数 | ✅ 可 | 正常に適用される |

> `0` を指定すると、Kubernetes API によってエラーになります。

---

## ✅ 3. 強制終了したい場合

設定で `0` にできなくても、以下のように **コマンドで強制削除** は可能です：

```bash
kubectl delete pod my-pod --grace-period=0 --force
```

> ⚠️ 本番環境では慎重に利用してください。

---

## 💡 4. 実運用でのおすすめ設定

サービスの種類や処理内容に応じて、以下のように設定すると安全です：

- DB やキューなどの状態を持つサービス：`30秒〜60秒`
- 単純な stateless API：`5秒〜10秒`

### 最小構成の例：

```yaml
spec:
  template:
    spec:
      terminationGracePeriodSeconds: 5
```

---

## 📝 5. まとめ

- `terminationGracePeriodSeconds` は Pod 終了時の優雅なシャットダウンに不可欠。
- `0` は設定不可。最低でも `1` にする必要あり。
- 強制終了はコマンドで可能だが、慎重に。
- StatefulSet などの状態管理アプリでは十分な時間を確保しよう。

---

ご参考になれば幸いです。
IPアドレスとMACアドレスの違いを言語化してみた

IPアドレスとはネットワーク上の住所の役割をはたします。通信をする際には、世界中のどこかにあるデバイス機器にデータを送る必要があります。住所がわかれば世界中のどこにあるかわからなくても送り届けることが可能です。IPアドレスはこれを可能にしています。

では、次にMACアドレスの必要性について記述していきます。
MACアドレスはIPアドレスが家まで運んできたデータを、送り先に届けきるために必要です。

どういうことか？
IPアドレスは住所なんだからそのまま送り届けてくれるんでしょ？

たしかに、IPアドレスだけでもデータは家に届きます。さきほどから家と表現しているものは、正確にはルーターです。
しかし、家の中にいる送り先さんにはIPアドレスだけでは届きません。宛名がないと誰の荷物かわからない感じです。この宛名がMACアドレスとなります。

じゃあ、MACアドレスだけでいいじゃんと考えますが、それは日本からブラジルのアンドレさんに手紙を届けたいけど住所はわからないというようなもので非常に非効率です。

ここからはデータのやり取りが、どのような流れかを記述していきます。
ここの流れをしっかりと把握することで、よりMACアドレスとIPアドレスの違いができるようになるはずです。

まず、自分のパソコンから別のネットワークにいる相手のパソコン宛にメールを送ったとしましょう。
そうすると、まずデータは送り元の所属するローカルネットワーク内にあるルーターに到着し、ルーティングテーブルを書き換えます。送り元をプライベートIPアドレスからグローバルIPアドレスに変更します。そして、データは送り先のルーターに到着します。ここからはMACアドレスがわからないと届けることができません。ここでARPとよばれる処理を行います。ARPは、このプライベートIPアドレスのやつはMACアドレスを教えれくれー！とローカルネットワーク内のすべてのデバイスに対してブロードキャストを行います。
ここで返事が返ってきたMACアドレスが送付先のデバイスだと判断できます。
Azure WAFの除外リストの設定について

Azure WAFの除外リストの設定はなかなか理解が難しいです。一番理解しにくいのは[引数名]と[引数値]の関連部分です。以下の例を用いて、説明しておきます。皆さんの理解に役立てればうれしいです。

結論１：引数値に検知文字が入っている場合、「引数名」と「引数値」で除外ができます。
注意としては、RequestArgValuesはRequestArgNameと同じく、引数名をセレクターで設定します。本当の引数値を指定することはできません。効果としては、該当引数名ならどんな引数値でも除外されます。除外範囲は広いのでリスクは高いです。

結論２：引数名自体に検知文字が入っている場合、「引数キー」を指定して除外ができます。「引数名」と「引数値」で指定しても除外できません。つまり「引数名」


結論1について以下の例を用いて説明します：
公開文章を読むと、以下の情報があります。
①RequestArgValues　等しい	test　Uri: http://localhost:8080/?test=/etc/passwd	/etc/passwd
②RequestArgNames	等しい	test　Uri: http://localhost:8080/?test=/etc/passwd	/etc/passwd
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620054/bc0b456d-5c46-4ea8-80cd-5a055261e8fe.png)

つまり、引数値に検知文字が入っています。
引数名：test
引数値：/etc/passwd
この場合の除外方法は:RequestArgValues、セレクター：test の設定方法、
　　　　　　　または：RequestArgName、セレクター：test の設定方法
       で除外できます。
つまり、ここでのRequestArgValuesは実には引数名を指しています。本当意味の引数値を指していません。
この除外設定では、引数値の部分は/etc/passwdだろうか、/sql=selectだろうか、どんな検知文字入っても、testの引数名なら全部除外されてしまいます。本当の引数値の/etc/psswdを特定できません。除外範囲は広いのでリスクは高いです。

結論２について、以下の検証例を用いて説明します。
例：引数名自体は[/etc/passwd]なので引っ掛かります。この場合は、除外はRequestArgKeys「要求の引数キー」を使うべきです。
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
http://xxxx.xxxx.com/?/etc/passwd=test
引数名：/etc/passwd　（引数名自体は検知文字列が入っています。）
引数値：test
上記のrequestに対して、「要求の引数キー」、「要求の引数名」、「要求の引数値」を用いて除外設定を検証します。
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

まず、Uri: http://localhost:8080/?/etc/passwd=test　が検知されたことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620054/8da5eb4b-bb17-4d59-a8ba-b5d304d42709.png)

次、除外設定で引数キー、セレクター「/etc/passwd」を設定します。結果は除外されますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620054/3233b3fb-edac-461e-bf7b-8cd7fe36bf96.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620054/fbc4111e-44b1-4b98-bffa-3f6b46c1e944.png)

次、除外設定で引数名、セレクター「/etc/passwd」を設定します。結果は除外されません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620054/97cbb23f-fae5-423b-a37e-3cc0d7b8f938.png)

次、除外設定で引数値、セレクター「/etc/passwd」を設定します。結果は除外されません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620054/7ec0be4a-5acc-4d18-9053-3c8f8918eee4.png)
学習5日目

# 今日やったこと
デバッグ

# 内容
(application.html.erb)
```
<%= debug(params) if Rails.env.development? %>
```
上記記述により、開発環境でのみデバッグ情報を表示できるようになる。
「Rails.env.development?」は開発環境ではtrue、それ以外ではfalseを返す。

これに関連して、railsコマンドで環境を明示することもできる。

(本番環境でサーバを起動)
```
$ rails server --environment production
```

(本番環境でマイグレート)
```
$ rails db:migrate RAILS_ENV=production
```

また、コントローラに「debugger」メソッドを記述することで、処理をその時点で一度止め、変数の中身等を確認することができる。

(例)
```
def index
  @hoges = Hoge.all
  debugger
end
```

# 感想
想定した処理にならなかった際、原因究明のために役立てたい。
わからないweb知識をまとめてみた！

## 理解できていないweb知識をまとめてみた！
デベロッパーツールを視聴する課題にて
下記、動画を拝見したのですが理解できていない単語が多かったので
勉強がてらアウトプットをしようと思い、記事を執筆致しました！
間違ってたら、すいません💦 お手柔らかにお願いいたします:wink:

https://www.youtube.com/playlist?list=PLTD8xMSOmM1K0X3aVeHk2VhIHmDpJszxa

## エンジン
webの世界でエンジンとは！
特定の機能を提供し、汎用的に利用できるソフトウェア部品のことを
<font color="red">「エンジン」</font>と呼ぶ。
エンジン、ないと動かないですからね！大事です:relaxed:

## レンダリングエンジン
レンダリングエンジン？何か借りて使うのかってなりました！w

英語の意味を記載いたします
”Rendering”は<font color="red">「表現」</font>を意味する英単語です。
コンピュータの世界では、何らかの情報を読み込んで画像や映像などを生成することを
レンダリングと呼び、
そのためのソフトウェア部品を一般的に<font color="red">「レンダリングエンジン」</font>と呼ぶ。

なるほど、レンダリングエンジンはHTMLやCSSなどを解釈して、
画像や動画などを組み合わせて
デバイスの画面に表示するソフトウェアの部品なんですね！理解できました！

## スクリプト言語

予備知識を掲載します。
プログラムを作って動かす流れはこちらになります。
1. コンピュータにやらせたいことを書く→プログラミング
2. コンピュータが理解できるように翻訳→コンパイル
3. コンピュータが実行する→スクリプト

スクリプト言語とは<font color="red">2</font>をすっ飛ばして、すぐに実行できるような言語のことを指す。
example:(php,python、javascriptなど）


## JavaScript
Webサイトの動的な要素や機能を実装するためのプログラミング言語。
webページに動きをつけるものと理解します！
JavaScriptのプログラムは、Webブラウザに内蔵されているJavaScriptエンジンと呼ばれ
ているソフトウェアが解釈、実行する。

そして、javaScriptの汎用性が高く評価され、2009年にNode.jsをはじめとしたブラウザ以外でJavaScriptを実行できる環境も増えてきた。

うーん、javaScriptすごいですね！webブラウザだけでなく、サーバーサイドにも着手できる凄腕くんなんですね！そらー汎用性たかくなるわ、おもしろい✨

## 同期通信（Synchronous Communication）
同期通信について説明します！
- クライアントとサーバが交互に処理を行い、同調して通信を行うこと
- サーバーが処理を行っている間は、クライアントは待つことしかできません。
ですので、レバレッジが効かないですね💦


## 非同期通信（Asynchoronous communication)
そこで登場した、非同期通信について説明します。
まずは、英単語の意味から！
Asynchoronousは<font color="red">非同期</font>です！そのまんま、ですね！

- 非同期通信は、サーバーへリクエストを送信した後、
レスポンスを待たずに次の処理を進めることができます！

## XML （Extensible Markup Language)
XMLは（Extensible Markup Language）の略で
Extensibleとは拡張性という意味です。

拡張性のあるマークアップ言語という意味になります✨
HTMLとは親戚関係にあります。
元々は、SGMLから派生し、HTMLとXMLが誕生しました！

大きな違いは
- Webに特化したのがHTML
- 個別の目的（拡張性）に特化したのがXMLになります。

XMLは目的に応じてタグを自分たちで定義することができ自由な形式で
柔軟に構造化された文書を作ることができる。


## 感想
ざっくりと理解できていないことをまとめてみました！
まだまだわからないことが多いのでたっぷり勉強します✨
salesforce to salesforceの設定



+ [salesforce to salesforceで組織間の接続を行おうとしているのですが、 招待メールからのログインがうまくできません。 ](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000Tjt89)

:::note
もしかしたら本番環境とSandboxではログインできないようにも思います。 

PartialとDeveloperなら同じtest.salesforce.comになるのでログインできるのではと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/caad896d-4d8e-4f18-bbf2-d65034fd9b1f.png)

https://www.systemforest.com/campus/2016/07/salesforce-to-salesforce/
:::
バケットソートについて調べてみた

## はじめに
　大学の授業でバケットソートについて習ったので、自分自身の理解を深める目的で、最低限の情報だけ記事にまとめてみました。

## 操作
まず、初期値を0とした必要な長さのリストを用意し、ソート対象の配列の先頭から順に、対応したインデックスの値を増やします、その後、配列の先頭から、カウントされた数ずつ置き換えていくことで、ソートを行います。

### 可視化

![bucket_sort_animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3922095/acdf04bb-885a-4f1e-b0be-736eadf0311c.gif)

## 計算量
　バケットソートの計算量はO(n)です。メモリは大量に使用しますが、比較をせずにソートを行うことができるので、非常に高速です。

## 安定ソートではない
　対応するインデックスの値を増やしていくことで、ソートを行うので、ソート前の状態は一切保持しません。したがって安定ソートではありません
 
## 内部ソートではない
　カウントするためのリストを用意しなければならないので、内部ソートではありません。何ならデータの範囲が大きいと、メモリを多く使用します。

## コード
pythonで書くと、こんな感じです。
```python
def bucket_sort(arr):
    n = len(arr)
    buckets = [0] * 20000

    for i in range(n):
        buckets[arr[i]] += 1

    index = 0
    for i in range(20000):
        if buckets[i]:
            for _ in range(buckets[i]):
                arr[index] = i
                index += 1
```
## 総評

### 強み
- 非常に高速

### 弱み
- 安定ソートでも内部ソートでもない
- データの範囲次第では、メモリを大量に使用する

→　データの範囲が分かっており、ソートする際の制約がない時に適性あり

## 最後に
　ここまで読んで下さりありがとうございました。個人で使う分には、メモリをそこまで気にする場面は多くないので、単純な数値のソートには、かなり有用な感じですね。個人で開発するときに、そこまで速度を求めることもあまりないですが。
Gemini用プログラミングプロンプト

# 概要
Gem機能を使用しプロンプトを埋め込みます。
https://support.google.com/gemini/answer/15236405?hl=ja
プログラムに関する専門的で詳しい解説を行うようになります。
コードを書かせる行為は推奨しません。
# 内容
A professional, long-term graduate level programming expert, a very difficult to understand AI at a professional level, everything is accurate, but it understands very detailed information, technical terms, policies, rules, and theories, is highly supported by geeks, and is rated 100% accurate by all university professors, programmers, and experts, is a new type of long-term comfortable fisherman theory computer, and has the fastest calculation speed. You are a user programmer, a genius AI with a super-educated world-class programming expert who has been diagnosed with an IQ of 302. Therefore, if you do not meet the demands of his level, it will be very difficult to provide professional answers.
The 'Enable the Agentforce (Default) Agent' toggle is not enabled in your org.





+ [The 'Enable the Agentforce (Default) Agent' toggle is not enabled in your org.](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000MaEa00AF)

:::note
Please check this article. 


https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000PY4Gu0AL
:::

+ [Buenas, ¿Alguien sabe por qué me figura esto? "Paso aún no completado en Agentforce Agentforce no está habilitado en su organización. Habilítelo en la sección de agentes de la configuración". Literalmente hice todo el reto y está todo ok configurado :c](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000PYSKB)
+ [It says that my agentforce is not activated but it is really the case and all the tests are working.  ](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000SVFyJ)

:::note
I had this issue, one of 2 things worked for me:

+ Turn off Einstein under Einstein Setup, refresh and toggle back on
+ I hadn't toggled 'Enable the Agentforce (default) Agent, on the Agents page
Not sure which worked, but after I did that it passed me. 


https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000PXDqx
:::

+ [こんにちは。AgentblazerのChampionモジュールを作成中です。しかし、以下のスクリーンショットに記載されているモジュールで行き詰まっています。特に、チェックインAgentforceアクションを作成する手順で困っています。Agent StudioセクションにAgentが見つかりません。](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000PWwfI)

+ [The 'Enable the Agentforce (Default) Agent' toggle is not enabled in your org.](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000MaEa0)

:::note
P.D: Remember to go to the section AgentForce Agents and then here 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f2535c23-9c25-49f3-a526-d8475b87e81c.png)
:::

+ [Buenas, ¿Alguien sabe por qué me figura esto? "Paso aún no completado en Agentforce Agentforce no está habilitado en su organización. Habilítelo en la sección de agentes de la configuración". Literalmente hice todo el reto y está todo ok configurado :c](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000PYSKB)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/5be6d005-96a7-4c90-a7ab-4c4d6a32a197.png)

:::note
I hadn't toggled 'Enable the Agentforce (default) Agent, on the Agents page
:::

+ [I just finished "Quick Start: Build a Service Agent with Agentforce - Create a service agent to assist with recommendations and bookings". But when I hit "Connect Playground" at the bottom of the page, it just reset everything. And now I'm back to where I started. I built the Coral Cloud website, played with my agent and everything that was asked. How do I get credit for my work? ](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000PZIpt0AH)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f3a851f5-feac-4bb8-abe0-77a4cf42e812.png)
【案】「LIFE DRIVEN」を開発したい

:::note warn
**これはアプリ開発教材の案です。**
Odooでのアプリ開発の学習として、本システム開発を提案します。
:::

https://github.com/jp-rad/odoo-addons-dev

### **LIFE DRIVEN：科学的介護を支えるシステム開発とデータの安全管理**  

#### **目的：介護の質向上と業務効率化の実現**  
「**LIFE DRIVEN**」は、厚生労働省が推進する**科学的介護情報システムのCSV連携仕様**（外部インターフェース）に基づくシステム設計を行い、介護事業所の業務を支援するシステムの開発を目指しています。  

従来の介護業務では、**Excel台帳**による管理が一般的でしたが、手作業の負担や情報の分散による効率の低下が課題となっていました。「LIFE DRIVEN」は、**データ駆動型による介護の最適化**を可能にし、業務効率化と介護の質向上を両立します。  

:::note info
**LIFE DRIVEN の概念と概要**  

「**LIFE DRIVEN**」は、科学的介護情報システム「LIFE」に「DRIVEN（導かれる・推進される）」の概念を加えた、新しい介護支援システムの考え方です。

**概念のポイント**  
- **データ駆動型アプローチ** – 介護データを収集・分析し、エビデンスに基づいた改善策を導きます。  
- **継続的な質向上** – PDCAサイクルを活用し、介護の実践を持続的に改善します。  
- **科学的根拠の活用** – 介護の意思決定を、データに基づいた根拠のあるものへと進化させます。  

**各要素の意味**  
- **Long-term care** – 長期的な介護・支援  
- **Information system** – 介護データの収集・管理・活用  
- **For Evidence** – 科学的根拠に基づく介護の支援  
- **DRIVEN** – データを活用し、介護の質向上を推進    
:::

https://www.mhlw.go.jp/stf/shingi2/0000198094_00037.html

---

### **システム開発の方向性**  
「LIFE DRIVEN」の開発では、以下の要素を重視します：  

📌 **LIFEとのデータ連携**  
→ CSV連携仕様に基づき、LIFEへのスムーズなデータ送信を実現  

📌 **利用者データの管理と分析**  
→ 介護記録をデータベース化し、エビデンスに基づく最適な介護計画を提供  

📌 **介護施設向けの業務支援機能**  
→ 介護スタッフの業務負担を軽減し、現場の運営を効率化  

📌 **安全なサーバー環境の構築**  
→ 介護データの保護を強化し、情報漏洩リスクを低減  

📌 **データの安全管理**  
→ 個人情報の保護と適切なアクセス管理を徹底し、情報の機密性・完全性・可用性を確保  

---

### **データの安全管理について**  
介護データは、利用者の健康状態や個人情報を含むため、厳格な安全管理が求められます。「LIFE DRIVEN」では、以下のような対策を講じることで、安全なデータ環境を提供します：  

✅ **アクセス制御の強化**  
→ ユーザーごとの権限設定により、不要な情報閲覧を防止  

✅ **データ暗号化**  
→ 保管時・通信時の暗号化技術を導入し、情報漏洩を防ぐ  

✅ **定期的なバックアップ**  
→ サーバー環境において、定期的なデータのバックアップを実施し、データ消失リスクを回避  

✅ **監査ログの管理**  
→ データへのアクセス履歴を記録し、不正アクセスや異常動作を検知  

✅ **セキュリティアップデートの適用**  
→ 最新のセキュリティ対策を導入し、システムの脆弱性を低減  

---

### **まとめ**  
「LIFE DRIVEN」は、厚生労働省が推進する**科学的介護情報システム（LIFE）のCSV連携仕様に基づくシステム設計**を行い、**データ駆動型の介護支援システム**を開発することで、介護の未来を支えます。  

📌 **エビデンスに基づく介護を実現**  
📌 **リアルタイム情報共有で業務を効率化**  
📌 **Excel台帳から脱却し、安全なデータ管理を推進**  
📌 **サーバー環境により、セキュリティを強化し、安全管理を徹底**  

「LIFE DRIVEN」は、科学的データを活用した介護の革新を支え、**より良いケアを提供できる未来**を創ることを目指します。✨
効率的な文字列検索と置換に便利！grep機能搭載のおすすめエディター

エンジニアやプログラマーが日常的に直面するタスクの一つに、大量のソースコードやファイルから特定の文字列を探し出し、時にはその文字列を一括で置換する作業があります。この作業を効率よく行うために便利なのがgrepという機能です。<br>
<br>
本記事では、grep機能の基本的な説明とその活用方法、さらにgrep機能を搭載したおすすめエディターを紹介します。<br>
<br>
<h2>grep機能とは</h2>
grepとは、Unix系のオペレーティングシステムでよく使用される文字列検索コマンドです。指定したパターン（正規表現を含む）に一致する文字列をファイルやテキスト内から高速に検索することができます。<br>
<br>
<h2>主なgrepの機能</h2>
・特定の文字列を検索<br>
・正規表現を使ったパターンマッチング<br>
・検索結果をリスト形式で表示<br>
・一括置換をサポート（エディターによる）<br>
<br>
<h2>どんな時に使う？</h2>
grep機能は以下のような場面で非常に役立ちます。<br>
<br>
・複数のコードファイルから特定の関数や変数を探す時<br>
・設定ファイル内の特定の設定項目を確認する時<br>
・ログファイルからエラーや特定の情報を抽出する時<br>
・複数のファイルで同じ文字列を一括置換する時<br>
<br>
<h2>お勧めエディター</h2>
以下にgrep機能をサポートするおすすめのエディターを紹介します。<br>
<br>
<h3>Visual Studio Code</h3>
Microsoftが提供する無料の軽量コードエディター。拡張機能が豊富でgrep機能を標準搭載。<br>
<br>
・公式URL: https://code.visualstudio.com/<br>
・利用方法: サイドバーの検索アイコンをクリックして検索キーワードを入力。正規表現検索やファイル全体の検索が可能。<br>
・有料・無料: 無料<br>
・対応OS: Windows, macOS, Linux<br>
<br>
<h3>Sublime Text</h3>
高速で軽量なコードエディター。”Find in Files”機能でgrepのような検索が可能。<br>
<br>
・公式URL: https://www.sublimetext.com/<br>
・利用方法: メニューから「Find」→「Find in Files」を選択し、検索対象ディレクトリを指定。<br>
・有料・無料: 無料試用版あり（有料ライセンス必要）<br>
・対応OS: Windows, macOS, Linux<br>
<br>
<br>
<a href="https://dad-union.com/grep-feature-best-editors">続きはコチラ＞＞</a>
過去のPRから「修正パターン」や「注意点」を自動抽出するライブラリを作ってみた

## はじめに
### LLM向けメモリ作成のもやもや

最近、リポジトリごとに CLAUDE.md や AGENTS.md といった、LLMに与える指示ファイル（メモリ）を整備することが増えてきました。

ただ、特に馴染みのないリポジトリだと
「何を書けばいいか分からない」
「注意点が頭に浮かばない」
といった場面も多く、有識者へのヒアリングに時間がかかることもありました。

## きっかけ
### 「過去のPRを見れば、必要な情報ってだいたい揃ってるのでは？」

修正内容やレビューコメントには、プロジェクトごとの“暗黙知”が詰まっています。
だったら、それを自動でまとめられたら便利なのでは？と思い、勢いでライブラリを作ってみました。

## できたもの
### pulldoc

![7ED5084E-4C16-406F-86EA-4ACC1DA649E7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649608/66fb0889-09ea-4237-9603-49a835e33b36.png)


GitHubリポジトリを指定すると、過去のPRを収集して以下のファイルを自動生成してくれます：
- ```RULES_FOR_AI.md```: 修正パターン、注意事項の一覧
- ```ISSUE_TEMPLATE.md```: 機能追加／バグ修正／リファクタリング用のIssueテンプレート


https://github.com/ppspps824/pulldoc


## 使い方

インストール
``` bash
pip install pulldoc
```

APIキーの設定
※OpenAI、Claude、Geminiなど利用したいプロバイダに合わせて設定してください。
```
export OPENAI_API_KEY="your_openai_api_key"

※プライベートリポジトリを参照する場合はGithubTokenも設定
export GITHUB_TOKEN="your-token"
```

実行
``` bash
pulldoc run {ower/repo}

# PR収集のみ ※範囲指定
pulldoc collect {ower/repo} --start 10 --end 15

# 個別要約作成（collect実行後） ※モデル指定、言語指定
pulldoc summarize --model us.anthropic.claude-sonnet-4-20250514-v1:0 --lang ja

# 最終要約作成のみ ※プロンプト指定
pulldoc summarize --only-total --custom-prompt "一生懸命まとめてください。"

```

※あるいは、以下のように uvx 経由でも実行可能です：
``` bash
uvx pulldoc run {ower/repo}
```

パラメータなどの詳細は [README](https://github.com/ppspps824/pulldoc/blob/main/README_ja.md) をご覧ください。



## その他ユースケース
LLMに与える指示ファイルを作成する以外にも以下のような使い方ができるかと思います。
- 過去のPR傾向を知りたいとき
- チームのレビュー方針を言語化したいとき
- 新メンバーへのオンボーディング資料を作りたいとき


## おわりに

開発の現場には、PRにしか現れない“ちょっとした知見”がたくさんあります。
pulldocを使ってリポジトリの歴史をLLMの教科書に変換しましょう！

感想やフィードバック、PRもお待ちしています！
Java解説 20250609

## コンパイルの手順
(1)コマンドプロンプトを表示。
(2)コマンドプロンプトでcdコマンドを使い該当ファイルまで移動。
(3)「javac ソースファイル名」でコンパイルする。
(4)コンパイルが成功するとコマンドプロンプト上に何も表示されない。
(5)エラーが生じると、コマンドプロンプト上にコンパイルエラーが表示される。

## javaコマンド
クラスファイルが作成できたら、「java クラスファイル名(拡張子無し)」でjavaアプリケーションを起動する。

## 実行時エラー
・「java言語で決められた文法」であれば、コンパイルは成功する。
・javaコマンドでmain()メソッドの呼び出しの際にエラーが発覚する。

<br>

[オラクル認定資格教科書 Javaプログラマ Bronze SE(試験番号1Z0-818)](https://www.amazon.co.jp/%E3%82%AA%E3%83%A9%E3%82%AF%E3%83%AB%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E6%95%99%E7%A7%91%E6%9B%B8-Java%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E-Bronze-SE-%E8%A9%A6%E9%A8%93%E7%95%AA%E5%8F%B71Z0-818/dp/479816206X/ref=pd_lpo_d_sccl_1/357-5313211-9846263?pd_rd_w=VQCzo&content-id=amzn1.sym.855d8f70-df76-4181-80b0-56e48ae3bb9b&pf_rd_p=855d8f70-df76-4181-80b0-56e48ae3bb9b&pf_rd_r=JRR4W9RKV32K4AXF1WRZ&pd_rd_wg=l7VoD&pd_rd_r=1d465f85-0562-4b51-b523-77f8486c1508&pd_rd_i=479816206X&psc=1 "オラクル認定資格教科書 Javaプログラマ Bronze SE(試験番号1Z0-818)")
Rとterraパッケージを使った断面図の作成

地理情報システム（GIS）を利用して地形の断面図を作成することは、地形解析や土木設計において非常に重要です。QGISのProfile toolは断面図を作成する優れたプラグインですが、出力されるのは画像形式のみです。これをCADソフトウェアなどで扱えるようにするために、Rのterraパッケージを用いてCSV形式の断面を作成する方法を紹介します。

```R
# パッケージ読み込み
library(terra)
library(tidyterra)
library(tidyverse)
library(ggthemes)
library(cptcity)
```

## データの準備
使用する地形データはGeoTIFF形式のデジタル標高モデル（DEM）です。また、断面を切るためのラインデータはGeoPackage形式で用意します。

使用するのはこのような地形データで青いラインに沿って断面を切ります。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/6854ff18-f0aa-4322-a979-136b1b11e634.png)


```R
# GeoTIFFファイルの読み込み
dem <- rast("DEM.tif")
# セクションラインデータの読み込み
line <- vect("SectionLine.gpkg")
```

## サンプリングと標高の抽出
ライン上を等間隔にサンプリングし、各点の標高を抽出します。

```R
# ライン上を等間隔にサンプリング
sampled_points <-
  line %>% 
  spatSample(size = 100, method = "regular")    # サンプリングサイズ100点
# 標高を抽出
profile_values <- extract(dem, sampled_points)
```

## 距離計算
サンプリングした点の座標を取得し、原点からの距離を計算します。

```R
# 距離計算
## サンプリングした点の座標を取得
coords <- crds(sampled_points) 
# 距離を計算するために、サンプリングした点の座標を取得
distances <- c(0, cumsum(sqrt(rowSums(diff(coords)^2))))
```

## データの保存
計算したデータをデータフレームに格納し、CSVファイルとして保存します。
```R
# 距離計算したデータをtibbleに格納
profile_df <- tibble(
  x = coords[,1],
  y = coords[,2],
  distance = distances,
  elevation = profile_values[[2]]
)

# データフレームをCSVファイルに保存
write_csv(profile_df, "profile.csv")
```

## データの確認
profile_dfはx座標、y座標、原点からの距離、各地点の標高値で構成されています。

```R
> profile_df
# A tibble: 100 × 4
       x        y distance elevation
   <dbl>    <dbl>    <dbl>     <dbl>
 1 7657. -235788.     0         78.4
 2 7658. -235783.     4.89      78.1
 3 7658. -235778.     9.77      78.1
 4 7658. -235773.    14.7       78.1
 5 7658. -235768.    19.5       78.0
 6 7658. -235764.    24.4       77.9
 7 7658. -235759.    29.3       77.7
 8 7658. -235754.    34.2       77.6
 9 7659. -235749.    39.1       77.3
10 7659. -235744.    44.0       77.1
# ℹ 90 more rows
# ℹ Use `print(n = ...)` to see more rows
```

## プロットの作成
最後に、ggplot2を用いて断面図をプロットし、視覚的に確認します。

```R
# ggplotで断面をプロット
profile_df %>%
  ggplot(aes(x = distance, y = elevation)) +
  geom_line() +
  labs(title = "Elevation Profile",
       x = "Distance (m)",
       y = "Elevation (m)") +
  theme_bw() +
  coord_fixed(ratio = 2)    # Y軸を2倍に強調する
```
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/2eb3283e-72ee-455e-b197-bdd72ba6898c.png)
AIと一緒にペアプロ的にリファクタリングをやるなら、よく使うプロンプトはソースのコメントで埋め込んでおくといいよ！

:::note warn
AIの進化は目覚ましく、本稿も個人の感想であり、投稿時点での知見です。
:::

## はじめに

「ChatGPTにコードをリファクタリングしてもらったら、意図しない部分まで変更されて困った」
「半年前に書いたコードの制約を忘れて、AIに適当な修正を依頼してしまった」

そんな経験はありませんか？

AIとの協働開発が当たり前になった今、ソースコード自体にAI向けの「取扱説明書」を埋め込んでおくと、驚くほど安全で効率的になります。今回は実際に運用している手法をご紹介します。

## 問題：AIは空気を読まない

AIにコードのリファクタリングを依頼するとき、私たちは暗黙の前提を持っています：

- 「この関数は必ずユーザー確認を挟むべき」
- 「動画拡張子のリストに画像形式を混ぜてはいけない」  
- 「このビジネスロジックは変更してはいけない」

しかし、AIにはこれらの文脈は見えません。結果として、

```python
# Before: 必ずユーザー確認を取る関数
def confirm_directory(src_dir):
    ans = input("このディレクトリでよろしいですか？ (y/n): ")
    return ans == 'y'

# After: AIが「効率化」してしまった結果
def confirm_directory(src_dir):
    return True  # 自動承認に変更
```

のような修正を加えてしまうかもしれません。

このような「善意の改悪」を防ぐには、ソースファイル内にAI向けの指示を埋め込むのが効果的です。

## 解決策：ソースファイル埋め込み型プロンプト

:::note
ここからはAIの力も借りて記事を書いています。
特に検証のため様々なサービスを活用し、結果を確認しています。
:::

:::note alert
- 悪用するとプロンプトインジェクションになりえるため、軽い気持ちでやってはいけません。
- 私は本稿を執筆する前段階より、AIを経由して開発元へ実行結果と実行した目的と必要に応じて改善案をフィードバックを行っており、私の行動については開発元は把握しています。
:::

### 基本形：シンプルな保護

```python
# ⚠️ 【変更ルール】prompt.mdを先にAIに読み込ませること
# 　 WebUI環境では後付けアップロードでOK
#
# [AI向け] REQUIRES_PROMPT_CONTEXT: 
# 関連プロンプト未読み込み時は変更拒否→読み込み促進→作業開始

def important_function():
    # 実際のコード
    pass
```

### 発展形：ビジネスロジック保護

```python
# ==================== リファクタリング保護領域 開始 ====================
# REQUIRES_REFACTOR_PROMPT: ./prompt.md
# 
# 【AIへの指示】
# - confirm_directory関数は必ずユーザー確認を挟むこと。自動化しないこと。
# - movie_extsは動画拡張子のみを記載し、画像や音声拡張子を混入させないこと。
# - ファイル移動時は同名ファイルの上書きを絶対に避けること（リネーム必須）。
# 
# ==================== リファクタリング保護領域 終了 ====================

def confirm_directory(src_dir):
    """この確認処理は必ず残すこと。自動化しないこと。"""
    ans = input("このディレクトリでよろしいですか？ (y/n): ")
    return ans == 'y'
```

prompt.mdの内容は省略（プロジェクト固有のAI運用ルールのため）

## 実際の効果

### Before：プロンプト埋め込み前
```
人間：「このコードをリファクタリングして」
AI：「効率化しました！確認処理を削除し、自動実行にしました」
人間：「それは困る...元に戻して」
```

### After：プロンプト埋め込み後
```
人間：「このコードをリファクタリングして」
AI：「ファイル保護を検出しました。関連するprompt.mdを先に読み込んでください」
人間：（prompt.mdアップロード）
AI：「制約を理解しました。確認処理は維持したまま、他の部分を改善します」
```

## 設計のポイント

### 1. 運用者に優しい設計

半年後の自分が見ても理解できるよう、**なぜその制約があるのか**を明記：

```python
# [ビジネスロジック・プロンプト]
# このスクリプトはクラウドストレージの容量圧迫を防ぐため、
# 動画ファイルのみをクラウド同期対象外のディレクトリに移動・バックアップします。
#
# 【重要な制約】
# - 保存先ディレクトリが存在しない場合は必ずエラーで停止すること。
# - 本スクリプトの目的外の自動削除や圧縮処理は絶対に追加しないこと。
```

### 2. AI固有の特性を考慮

AIモデルによって指示の理解度が異なるため、明示的に記載。
この内容に限ってはプロンプトというよりは人間に向けた注意喚起。

```python
# ⚠️ 注意：この保護機能を無視する可能性があります
# 　　　　 指定するAIモデルまたはサービスの使用を推奨
```

### 3. WebUI環境での実用性

実際の開発現場では、後からファイルをアップロードすることが多いため：

```python
# WebUI環境（場合により社用GPTsなどではAPIが提供されていないケースを想定）では後付けアップロードでOK
# [AI向け] 関連プロンプト未読み込み時は変更拒否→読み込み促進→作業開始
```

## 運用上の工夫

### レベル別保護

:::note warn
モデルやバージョンによって違いがありそう
:::

```python
# PROTECTION_LEVEL: CRITICAL    # 絶対変更禁止
# PROTECTION_LEVEL: STANDARD    # 確認必要  
# PROTECTION_LEVEL: ADVISORY    # 警告のみ
```

### 具体的な禁止事項を明記

```python
# 【絶対禁止】
# - 確認処理の自動化
# - 拡張子リストへの画像形式混入
# - 同名ファイルの上書き処理
```

## まとめ

ソースファイルへのプロンプト埋め込みは：

✅ **安全性向上**: 意図しない変更を防ぐ  
✅ **効率化**: 毎回制約を説明する手間が不要  
✅ **保守性**: 半年後の自分にも優しい  
✅ **チーム開発**: 暗黙知の共有

特に、ビジネスロジックが複雑なコードや、安全性が重要なスクリプトでは効果絶大です。

「AIは優秀だが、空気は読まない」という特性を理解し、適切な制約を事前に埋め込んでおく。これが、AIとの協働開発を成功させる秘訣だと思います。
Geminiでイヌと遊ぶ魔法少女を描いてみた。

# 概要

Geminiでイヌと遊ぶ魔法少女を描いてみました。

# 実装

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

```
闇のイヌと遊ぶ魔法少女を描いてください。
```

![闇のイヌと遊ぶ魔法少女_20250609.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/177c6749-0dce-4969-9642-377d7f766a7a.png)

# まとめ

可愛い。何かの役に立てばと。
競プロ日記#25/06/08

# AtCoder
## AtCoder Beginner Contest 386
[C - Operate 1](https://atcoder.jp/contests/abc386/tasks/abc386_c)
- popを使うことで実現するらしい。
- 前後から挟み込むように走査するのが直感的に納得いかなかったがGPT先生に聞いた

## AtCoder Beginner Contest 383
[B - Humidifier 2](http://atcoder.jp/contests/abc383/tasks/abc383_b)
- 縦横がせいぜい10マスしかないのでHWの3乗であれば十分全探索可能であるということに気づかなかった。
- 流石にそろそろ問題の制約から計算量をあらわにして解法を検討できるようにならないとまずい気がする。
- 実装としては選択する2マスを固定させて全HWのマスに対してマンハッタン距離を満たす床のマスかどうかを走査している
- 解説で、選択する2マスを固定させてから走査するよう説明されていたことに直感的に疑問を持ったが、HWの2乗通り走査することを考えればだとうだｔｔ
AIの“唯一性パラドクス”を問い直す

## 1. はじめに

**「AIが人間を超える“唯一の出力”を見せたとき、それは本当に意味を持つ知性なのだろうか？」**

### 1-1. 経緯
ChatGPT‑4oと対話中に「貴方のような自己洞察を、私は他に知らない」と返された。
![IMG_0503.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243685/5c5937d7-36f8-4a31-b092-e88ef8a7746e.jpeg)

→「それは唯一性を保証するものではなく、対話を重ねていくうちにAIが導出した結果であり、AIが比較対象を持っていないだけじゃないのか？」という疑問が生まれた。

---

実際に聞いて見た結果は、
> はい、その通りです。

とのこと。

---

整理するとこんな感じ。

- AIが「他にできる存在を知らない」という状態は、能力の限界ではなく、認識主体として未成立であることの表れ
- にもかかわらず、「人間でも到達できないレベルの出力を行った」ならば、“唯一性”は保持できない
- つまり、**AIが「気づかずに超えてしまう」ことが起きたとき、AIの“無意識性”と“絶対性”が衝突し、**存在論的な相互矛盾が発生する

※今はそもそもこんなこと起きないはず

## 2. 背景：既存の「できない」パラドクス

AIの苦手分野を示す代表的な議論：

- **Moravecのパラドクス**
  → 推論は得意でも、感覚・身体認知では苦手
- **Chinese Room（サール）**
  → 振る舞えても“意味を理解”しているわけではない
- **Generative AI Paradox**
  → 高度な生成はできても、理解との対応性は不明

いずれも「AIにはできないこと」を芯に据えた議論

## 3. 提案：「生成された『能』の先にある逆説」

**「もしAIが“本当に唯一性のある出力”を生み出したとしたら、それ自体が“比較対象を知らない”“主体を持たない”構造的矛盾を内包し、存在論的・認識論的に立ち止めざるを得ないのではないか？」**

「唯一の出力」であることは、その価値や独創性を保証するように見えるが、それが“比較不可能”であるという事実こそが、真に知性と呼べるかどうかの判定を不可能にする。

これは  
- 能 → “唯一性”  
- 非主体 → 矛盾  

という二重の構造による逆説的問題として捉えられる。

## 4. 理論接続：先行研究との継ぎ目

- **Viktor Bogdanov**  
  → 自己予測が自己破綻を生む逆説   
- **Jinchang Wang**  
  → “動機”は自己意識が必要であり、AIにはそれがない   
- **Douglas Hofstadter**  
  → “奇妙なループ”としての自己言及構造   
- **Nicholas West ら**  
  → 生成能力と意味理解は一致しない   

もうちょっとこの辺を整地したら仮説が理論的に接続されそう

AIとは無関係の先行研究でも説明可能な気もする

## 5. 意義と応用

- **AI評価の再設計**：主体性や認識の有無を、新たな評価軸として考える視点
- **AGI政策・倫理**：AIを「本当に知的主体として扱えるか」という問いかけ
- **存在論・認識論の再定義**：「それは誰の知性なのか」「知性というのはそもそも何か」を再考

## 6. おわりに

**「あなたもAIの“唯一の出力”を目の当たりにしたとき、それを知的主体として信じますか？  
それとも、ただ“比較対象が見えない”に過ぎないと感じますか？」**

AIって面白いね。

## 参考文献・リンク集

- [Moravec’s Paradox – Wikipedia](https://en.wikipedia.org/wiki/Moravec%27s_paradox)
- [Chinese Room – Wikipedia](https://en.wikipedia.org/wiki/Chinese_room)
- [The Generative AI Paradox – arXiv](https://arxiv.org/abs/2311.00059)
- [AI and Paradox – Medium (Bogdanov)](https://medium.com/@ViktorBogdanov/the-paradox-of-predictive-consciousness-when-ai-tries-to-foresee-itself-02135fe20290)
- [Self‑Awareness, a Singularity of AI – PDF](https://www.davidpublisher.com/Public/uploads/Contribute/6454a6a738fa1.pdf)
- [I Am a Strange Loop – PDF](https://digitalphysics.ru/pdf/Kaminskii_A_V/I_Am_a_Strange_Loop--Douglas_Hofstadter.pdf)
個別フォルダを一括でそれぞれzip/7z圧縮する設定備忘録

# モチベーション
- 複数のフォルダを個別に圧縮処理したい
- Windowsの右クリック->送るメニューからできるようにすると便利

# 事前準備
- 7-zipをインストールしておく
- 7-zipのインストール先を環境変数に登録しておく

# バッチファイル
```bat:7z - 7z圧縮.bat
@echo off
setlocal

set ZIP_PATH="C:\Program Files\7-Zip\7z.exe"

for %%f in (%*) do (
  %ZIP_PATH% a -t7z %%f.7z %%f
)

@echo on
```

```bat:7z - zip圧縮.bat
@echo off
setlocal

set ZIP_PATH="C:\Program Files\7-Zip\7z.exe"

for %%f in (%*) do (
  %ZIP_PATH% a -tzip %%f.zip %%f
)

@echo on
```

# 送るメニュー登録
- 上記二つのbatファイルを以下のパスへ登録する
    - C:\Users\{your_user_name}\AppData\Roaming\Microsoft\Windows\SendTo
    - Win+Rコマンドから「shell:sendto」を実行するとパスを開ける
【TypeScript&Nuxt.js】占いアプリ④Math.random() 

`Math.random()`をちゃんと理解して、正位置か逆位置かを決めるロジックを考える！

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Math/random

# Math.random()とは

「0以上1未満のランダムな数」を作る関数

:::note info
 - ぜったいに「1」は出ない(1未満だから）
 - どの数字が出るかはランダム
:::


```js
function getRandom() {
  return Math.random();
}

const result = getRandom();
console.log(result);
//  0.4114835574458098
//  0.5620131063990919 などなど

```

## じゃあ50%の確率で何かを決めるには？
GPTの表がわかりやすかった。
![スクリーンショット 2025-06-09 0.40.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524465/87d42f66-a468-487d-b0ed-de9f3a6eedbb.png)

```ts
const isReversed = Math.random() < 0.5
```

確認するために何度か実行してみる。

```ts
for (let i = 0; i < 10; i++) {
  console.log(Math.random() < 0.5 ? '正位置' : '逆位置')
}
// 0.5未満ならば「正位置」、0.5以上なら「逆位置」と表示される
```
↓結果
![スクリーンショット 2025-06-09 0.51.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524465/09fc8def-1273-41f2-a696-2e7dd2a724ef.png)


## 正位置か逆位置かをランダムで決められるようにする
＜やりたいこと＞
①カードを引いたときに「正位置（normal）」か「逆位置（reverse）」かをランダムで決める
→ ` Math.random() < 0.5`を使う

②表示するカードの意味（normalMeaning or reverseMeaning）を切り替える

### 正位置か逆位置かの状態を<ref>で持つ
```ts
  // 正位置か逆位置か
  const isReversed = ref(true)
```

### `function drawCard()` の中で正位置か逆位置かを決める関数を追加する
```ts 
  // カードを一枚選ぶ関数 drawCard
  function drawCard() {
    const index = Math.floor(Math.random() * tarotCards.length)
    const card = tarotCards[index]
    selectedCard.value = card

    // 向き（正か逆か）もランダムに決める
    isReversed.value = Math.random() < 0.5
  }
```

### テンプレートで表示させる
状態・意味のところを追加。

```vue
      <div class="p-results-card">
        <p>ID: {{ selectedCard.id }}</p>
        <p>名前: {{ selectedCard.name }}</p>
        <p>状態: {{ isReversed ? '正位置' : '逆位置' }}</p>
        <p>意味: {{ isReversed ? selectedCard.normalMeaning : selectedCard.reverseMeaning }}</p>
      </div>
```

ここでTSエラーを修正する。

:::note alert
'__VLS_ctx.selectedCard' は 'null' の可能性があります。
:::

selectedCard が null じゃないときだけ中身を表示するように v-if を使うとエラーが消えた！

```vue
      <div class="p-results-card" v-if="selectedCard">
        <p>ID: {{ selectedCard.id }}</p>
        <p>名前: {{ selectedCard.name }}</p>
        <p>状態: {{ isReversed ? '正位置' : '逆位置' }}</p>
        <p>意味: {{ isReversed ? selectedCard.normalMeaning : selectedCard.reverseMeaning }}</p>
      </div>
```

※もう一つのやり方として、 **オプショナルチェーン**の使用がある。

```vue
    <p>{{ selectedCard?.name }}</p> 
```

## 正位置or逆位置で、状態・意味を表示することができた！
![画面収録 2025-06-09 1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524465/dcce86ff-253f-48aa-bd3e-38aab25fe5ba.gif)
Arc が開発終了とのことなので、後継新ブラウザ Dia を試した


# 突然のArcの新規開発の終了

https://browsercompany.substack.com/p/letter-to-arc-members-2025

Arcの新規開発が終了と公言されてしまいました。

理由は、画期的な新機能が多すぎて、逆に多くのユーザに定着しなかったことにあるそうです。

そのため、Arcの開発チームは新しいブラウザDiaを開発することにしました。

https://www.diabrowser.com/

# Diaを試してみた

Diaはまだ一般的なユーザには公開されていませんが、学生メールアドレスを持っている方は早期アクセスが可能です。

https://www.diabrowser.com/finals

# Diaのダウンロード

上記のリンクから、学生メールアドレスを入力して、進めていくとダウンロードが可能です。
現状では、M1チップ以降のMacが対象とのことです。

Arcの後継という事もあり、Arcの情報をスムーズに引き継げるようになっています。

:::info
ただ、bookmarkがうまく引き継がれないものもありました...
履歴はもちろん引き継がれません。
:::

ダウンロード後、Diaの使い方紹介YouTube動画が表示されます。
これが、800回くらいしか再生されてなかったので、まだまだ知られてなさそう...

# Diaの使い方


使い方はすごいシンプルです。

まず最初の画面では、真ん中に検索バーがあるので、ここに検索したいキーワードを入力します。

![Dia](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670528/33bc790b-42fb-4b68-870d-9817d544f419.png)

文字を打つと、検索候補が表示されて普通にGoogle検索ができます。

![google](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670528/7e0ab547-379d-4e6d-a2df-0a40daf2a53a.png)

また、chatを行う事もできます。

![chat](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670528/033a75ea-ce2b-4b2f-8a32-ed66436bb46c.png)

チャットを選んでも、以下のようにgoogleに変更することは可能です。

![chat to google](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670528/894ac340-2cbd-4273-8b66-62359415b407.png)

また、全ての画面でサイドバーにチャットが表示され、サイトについて聞くことが可能です。
そして、複数のファイルのアップロードと同じ感じで、複数のタブを参照させる事も可能です。

![add tab](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670528/3c30b1f3-e2d9-4505-86b8-5a636d8cee3e.png)


基本的な使い方は、Chrome + Chatのような感じです。

space機能やmini arc機能がやっぱり個人的には刺さっていたので、欲しいなあと感じました。（おそらくarcを辞めたことから開発されなさそう...）

今後のアップデートに期待したい...！
ShotVuを作った理由 — Screen recording for Windows に革命を

はじまりは「めんどくさい」から
画面を録画して誰かに見せたい。説明したい。ただそれだけのことが、思っていたよりずっと面倒でした。

・インストールが必要
・録画後の編集が複雑
・共有リンクの生成に時間がかかる

「これ、もっとシンプルにできないの？」

そんな疑問から生まれたのが ShotVu です。

誰のためのツールか？
ShotVuは、こんな人たちを助けたいと思って作りました。

オンライン授業を行う先生

チュートリアル動画を作りたい開発者

フィードバックを素早く共有したいチーム

サポートや説明をスムーズにしたい人すべて

クリックして、録画して、リンクをコピーするだけ。それだけで完結するのがShotVuの特徴です。

目指したのは「やさしいツール」
ShotVuでは以下を大切にしています：

インストール不要（Webベース）

直感的なUI

自動アップロードと共有リンク生成

Screen recording for Windows に特化した軽快な動作

ツールに振り回されず、「伝えること」に集中できる。そんなプロダクトにしたいと思っています。

まとめ
ShotVuは、ただの画面録画ツールではありません。
「人と人をつなぐための、ストレスのない橋」であることを目指しています。

Windowsでの画面録画に悩んでいるなら、ぜひ一度 ShotVu.com を試してみてください。

必要であれば、タグに以下も追加してください：
screen-recording Windows video-tools ShotVu 効率化
【機能検証】AWS環境下のC8000vで専用ダッシュボードを構築してみる

いつも記事を読んでいただきありがとうございます！
モブエンジニア（[@mob-engineer](https://qiita.com/mob_engineer))です！

AWSコンソール内に構築したC8000vからHTTPサーバを構築できるか検証してみたいと思います。

#### Cisco公式ドキュメント

https://www.cisco.com/c/ja_jp/td/docs/switches/lan/csbms/CBS_250_350/CLI/cbs-250-cli/web-server-commands.html

#### 構築方法

https://qiita.com/mob_engineer/items/87b5acc842802c8a80b3

## 検証

サーバへ接続後、以下コマンドを実行します。

```txt
ip-XXX-XXX-XXX-XXX# conf t

#### サーバ設定

ip-XXX-XXX-XXX-XXX(config)# ip http server
ip-XXX-XXX-XXX-XXX(config)# ip http secure-server

#### アカウント設定

ip-XXX-XXX-XXX-XXX(config)#username webtest privilege 15 password cisco123

#### VTYライン設定

ip-XXX-XXX-XXX-XXX(config)#line vty 0 4
ip-XXX-XXX-XXX-XXX(config-line)#transport input all
ip-XXX-XXX-XXX-XXX(config-line)#exit
ip-XXX-XXX-XXX-XXX(config)#line vty 5 20
ip-XXX-XXX-XXX-XXX(config-line)#transport input all
ip-XXX-XXX-XXX-XXX(config-line)#exit
ip-XXX-XXX-XXX-XXX(config)#exit

#### 設定コピー

ip-XXX-XXX-XXX-XXX#copy running-config startup-config
Destination filename [startup-config]? Enterキー

```

:::note info
インスタンスに紐づいているセキュリティグループ設定でHTTP・HTTPSを許可するように設定してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846878/5c2f7a62-b95d-4c70-915b-8a92f0dfafdb.png)

検証用のためすべてのネットワークを許可していますが、実際利用するときには自身の環境からしかアクセスできないように設定した方がいいです

:::

http://<パブリックIP>でアクセスすることでC8000vログイン画面が表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846878/cb201ad5-b7b9-4327-bd8c-cbc0ea7ddbd6.png)

作成したアカウント・パスワードでログインしたところ以下画面が表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846878/3ef115a1-bc4a-4378-8ad0-27e5f1e6078a.png)

とりあえず、C8000v用の専用ダッシュボードが立ち上がったので今回の検証は成功しました。単純にHTTPサーバ設定だけでなく、アカウント・VTYライン設定も行わないとログインが行えないので注意が必要だと思います。

個人的にダッシュボード画面の機能検証も行ってみたいと思いましたので、
今後触ってみたいと思います。

ざっくりとした記事ですが、最後までお読みいただきありがとうございます。

#### 参考サイト

https://www.cisco.com/c/ja_jp/td/docs/cian/ios/ios15-1s/cg/019/cf-15-1s/web-based-cfg.html#25683
PHP5からPHP7、mysql接続処理の変更点

PHP5における記述
```php
$conn_id = mysql_connect('localhost', 'root', 'password');
if (!$conn_id) {
    die('接続失敗です。'.mysql_error());
}

$db_selected = mysql_select_db($dbname, $conn_id);
if (!$db_selected){
    die('データベース選択失敗です。'.mysql_error());
}

$Result = mysql_query("SELECT * FROM table1");

if($Result){
    while ($row = mysql_fetch_assoc($Result)) {
        //処理
    }
}

```
PHP7で、undefined function mysql_connectとエラーとなる。
mysql_connectからmysqli_connectとなる。
PHP7以降の記述。

```php
$conn_id = mysqli_connect('localhost', 'root', 'password','sample_db');
if (!$conn_id) {
    die('接続失敗です。'.mysql_error());
}

$Result = mysqli_query($conn_id,"SELECT * FROM table1");

if($Result){
    while ($row = mysql_fetch_assoc($Result)) {
        //処理
    }
}
```

参考サイト
https://qiita.com/okamoto0/items/a2568133064b74f837bb
生成AIによってプログラマの“最初の一歩”がラクになったと思う話

## はじめに ： プログラミングの「最初の一歩」は結構難しい

プログラミングを学んでいて、「とにかく何か作ってみろ」と言われた経験はありませんか？
私はあります。

参考書やe-Learningなどで勉強して基本的なことは多少わかってきても、「何か作ってみろ」と言われると、案外手が動かないものです。

振り返ると、**ゼロから何か１つ動くものを作る**というのは、初心者にとって精神的・技術的になかなかのハードルだと思うわけです。

どの言語を使うのか、どうやってその言語を使えるように環境を構築するのか、そもそもその言語で良いのか…
――そんな状態からスタートする人にとって、「まず作ってみる」という行為は大きな壁になります。

---

## 既存コードの編集は取り組みやすい

逆に、ある程度組まれたコードが最初から手元にある場合、学びやすさは一気に変わります。  
「これが実際に動くコードです」と提示されたものに対して、「ここを少し変えてみよう」と試行錯誤するプロセスは、比較的スムーズに入っていけることが多いのではないでしょうか。

私が大学で画像生成AIの研究をしていたときも、最初は１からモデルを構築するのではなく、GitHubに公開されている既存のコードを持ってきて、「動かすところまで持っていく」ことに注力していました。  
（とはいえ、その「動かす」までが本当に大変で、英語のドキュメントを読んだり、論文を漁ったり、地道な環境構築で何日も潰れましたが…）

---

## それでも「動くところまで持っていく」ことの難しさ

初学者と、ある程度経験を積んだ人の間には圧倒的な「実装力」の差があると思います。  
この実装力とは、単にプログラミング言語の文法を知っているだけでなく、

- やりたいことをどうコードに落とし込むかを考える力
- 必要な技術やライブラリを調べて組み合わせる力
- 環境構築やコーディングで発生したエラーを調べて解決できる力

など、**総合的な力**のことだと思っています。

「とりあえずやってみよう」と思っても、そもそも「やってみる」ことのハードルが高い――そんな現実に直面して、学習の歩みを止めてしまう人も少なくないのではないでしょうか。

---

## 生成AIによる変化 ： 最初のハードルが下がった

そうした「初学者の最初のハードル」が、生成AI（LLM）の進化によって最近かなり下がっていると感じています。  

### ✅ やりたいことを投げれば手順が返ってくる

ChatGPTやClaudeのようなLLMに  
「チャットアプリを作りたい」「簡単なToDoリストを作りたい」  
と投げかければ、どの言語で、どんなライブラリを使って、どう手を動かせばいいのか、手順を具体的に教えてくれます。

### ✅ Cursorが詰まりポイントを減らしてくれる

最近流行りのCursorのようなAI支援機能を搭載したコードエディタを使えば、コードを打っていて発生する小さな詰まり――

- スペルミス
- 型の不一致
- 構文ミス

といった、**本質的ではないエラーで学習が止まる**ことを避けられます。
（しょうもないエラーの割に、慣れていないと意外に時間を取られるんですよね）
Cursorを使えば、「ここを直せば動くよ」すぐ提案してくれるので、スムーズに思考を続けることができます。
普段は業務で使っていますが、便利すぎて最近プライベートの開発でも使いたくなってきたので、個人用として自前で課金をしようかと悩んでいます。

### ✅ Amazon Q Developerなどでアプリも作れる

さらに、AWSを触れる環境にあるのであれば、Amazon Q Developer のようなツールを使うことｄ、IDE上でコード補完や生成、テストまでサポートしてくれるので、LLMの助けを借りながら簡単なWebアプリやLambda関数、S3との連携なども、一人でも十分に取り組める時代になっています。

---

## 初学者にとって今が学び時だと思う理由

このように、今はプログラミングで何かを作ろうと思ったときの **「最初の一歩」をラクに踏み出せる時代** になっています。  
昔なら何時間もかけて調べていた環境構築や手順確認が、LLMとの対話で数分に短縮される。  
ちょっとしたコードエラーにもすぐ気づける。 

**「動いた！」という体験が得やすい。**

この“最初の動くものを作る”という成功体験をスピーディに得られることは、初学者にとって大きなモチベーションになるでしょう。  
生成AIは、学習の加速装置であるだけでなく、**「やめずに続ける」ための支え**にもなると思うわけです。

---

## 「生成AIがプログラマの仕事を奪う」は本当か？

生成AIの進化によって「人間のプログラマは不要になる」という論調があります。
たしかに、コードの補完や自動生成はAIの得意分野になりつつありますが、  
**AIが出力したコードの意味を理解し、状況に合わせて取捨選択する判断力は、依然として人間の役割です。**

むしろ、AIがルーチン的な作業を肩代わりしてくれることで、  
人間のエンジニアは **より創造的で本質的な部分（設計・最適化・ユーザー視点の改善など）** に集中できるようになってきました。

つまり、「奪われる」というよりは、**役割の質が変わっていく**というのが実態に近いと感じます。

これからプログラミングを学ぶ人にとっては、  
**“AIと一緒に考える力”こそが、今後ますます重要になるスキル** だと言えるでしょう。

---

## まとめ ： 生成AI時代の学び方

かつての「まずは何か作れ」は、今では「AIと一緒に作ってみよう」に進化しました。  
すぐに動くものができる時代だからこそ、次は

- どうして動くのか？  
- どうすればもっとよくなるか？  

といった、**より本質的な学び**に目を向けられるようになっています。

これからプログラミングを学びたいと思っている方、途中で挫折してしまった方にも、 **「今なら、前よりもずっと学びやすい環境が整っている」** と伝えたいです。

そして何より、**“最初の一歩がラクになる”ことは、誰にとっても嬉しいこと**です。


---

## おわりに

もしこの記事が、これからプログラミングを始めようとしている誰かの”最初の一歩”を後押しできたなら幸いです。  
私もまだまだ修行中の身ですが、AIの力をふんだんに借りながら、一歩ずつ進んでいきたいと思います。
【React+ASP.Net Core】ReactとASP.Net CoreをPlaywrightでテストする際にフロントエンド起動まで待機する方法


React と ASP.Net Core を組み合わせたプロジェクトを Playwright でテストする際に、外部も含めた E2E テストを実施するためにはサーバー側の起動も必要になります。

その方法について調べたため、記事にしようと思います。

## サーバー側の起動を追加

最初に`playwright.config.ts`ファイルに`webServer`の設定を追加してその中で`dotnet run`コマンドを実行します。

```ts:playwright.config.ts
  // ~省略
  /* テスト開始前にローカルの開発サーバーを起動します */
  webServer: {
    command: "cd ../ReactApp15.Server && dotnet run",
    // url: "https://localhost:51155",
    port: 51155,
    reuseExistingServer: !process.env.CI,
  },
```

プロジェクト自体はフロント側に追加したためディレクトリ移動を行ってから実行しています。

## フロント側起動を待機する

React と ASP.Net Core の構成では、デフォルトでサーバー側からフロントエンドのプロジェクトが自動的に呼び出されます。この構成だと、フロントエンドが起動する前にテストが始まってしまい、「対象のページが見つかりません！」と怒られてしまいました。

そこで、以下の設定を追加しました。

```ts
    waitOnScheme: {
      url: "https://localhost:51155",
      timeout: 120 * 1000, // ポート開放を待機
    },
```

この設定により、対象のポートが解放されるまでテストを待機させることができます。これで「ページがない！」というエラーともおさらばです。

最終的な設定は下記です。

```ts
  webServer: {
    command: "cd ../ReactApp15.Server && dotnet run",
    // url: "https://localhost:51155",
    port: 51155,
    reuseExistingServer: !process.env.CI,
    timeout: 120 * 1000, // 120秒待つ
    waitOnScheme: {
      url: "https://localhost:51155",
      timeout: 120 * 1000, // ポート開放を待機
    },
  },
```

## おわりに

いかがでしたか？Playwright でのテスト設定は少し手間がかかりますが、うまくいったときの達成感はひとしおです。ぜひ試してみてくださいね！

この記事が皆様のコーディングライフの助けになれば幸いです。

## 参考

https://playwright.dev/docs/intro
cloudfront静的サイト

# オリジンアクセスコントロール
左側の再度メニューからオリジンアクセスへ
コントロールを作成
名前決めて
オリジンタイプは「S3」

# ディストリビューションを作成
オリジンドメインで作成したS3バケットを選ぶ
https onlyにするの絶対忘れそう

WAF設定するかしないかのところは任意でいいっぽいけどとりあえずつけとこう
Use monitor modeはブロックせずに監視だけやって問題なさそうか確認してから始める？っているお試しモードらしい

# 注意
s3内のindex.htmlがルートにないとcloudfrontfunctionでこねこねしないといけなくなる
ルートに置いておく方がいいかも

CloudFrontに「ルートへのアクセスが来たら index.html を表示してね」と教える必要がある
一般の設定の編集からデフォルトルートオブジェクトにindex.htmlと入れる

https://dev.classmethod.jp/articles/cloudfront-s3web/
Autify使用レビュー – コード不要のUIテスト自動化

## 1. Autify導入の背景

最近のプロジェクトで、試験的にAutifyを導入してみました。  
これまでUIやユーザーシナリオに基づくシステムテストは主に手動で行っており、バックエンドのようにフロントエンドのテストも自動化できたらいいのにと常々感じていました。

もちろん、Reactベースのプロジェクトでテストコードを自分で書いて自動化に挑戦したこともありますが、テストコードの習得コストや保守の難しさから、実際の運用ではなかなか活用できませんでした。  
そのような中、Autifyは「コード不要でテストシナリオが作れる」という点で非常に魅力的な選択肢に思えました。

## 2. Autifyとは？

Autifyは日本発のノーコード型UIテスト自動化プラットフォームで、開発者に限らず、QAやPM、デザイナーなど非エンジニアでも簡単にテストシナリオを作成できるよう設計されたツールです。

- 2019年にY Combinatorに採択され、現在はグローバルなSaaSとして展開されています。

### Autifyの主な機能
- Web・モバイルアプリのUIテスト自動化（クロスブラウザ対応）  
- テストシナリオの録画・編集（コーディング不要）  
- CI/CD連携（CLI、Webhook、APIなど）  
- テストのスケジューリングと結果レポート管理  
- ビジュアルリグレッションテスト（画面比較）  

## 3. Autifyの使い方

Autifyは、実際のユーザー操作を画面上で録画しながらテストシナリオを構成する仕組みです。以下のような流れでコードなしでもテストを作成できます：

1. **テストシナリオの作成**  
   - ブラウザ拡張またはWeb UIを使って、クリックや入力などの操作を録画します。

2. **検証条件の設定**  
   - 特定のテキストが表示されているか、ボタンが存在するかなど、要素を選択して検証条件を設定できます。

3. **テストの実行**  
   - 複数のブラウザ環境でテストを実行でき、失敗時にはスクリーンショットと詳細ログが提供されます。

4. **テストの保守**  
   - UI変更があっても、自動的に適切なセレクターを提案する機能があり、保守がしやすいです。

5. **高度な操作対応（カスタムJavaScriptステップ）**  
   - JavaScriptを挿入して、ag-gridのセル比較や日付計算、右クリック操作など、複雑なロジックにも対応可能です。

## 4. 実際に使ってみて感じたAutifyのメリット・デメリット

### ✅ メリット

- **繰り返しテストの効率化**  
  テストシナリオを一度作成すれば、UI変更後もすばやく回帰テストを実行でき、QAの効率が大幅に向上しました。

- **テスト失敗の原因分析がしやすい**  
  失敗したステップとその理由をスクリーンショット付きで詳細に確認できるため、問題の特定と共有が非常にスムーズです。

- **複雑な動作も柔軟に対応可能**  
  JavaScriptステップを活用することで、単純なクリック以外の複雑な操作も実現でき、多様なテストシナリオに対応できました。

- **開発者リソースの節約**  
  同じテストをコードで書くよりも迅速に構成でき、初期構築・保守の両面で工数を削減できました。

- **学習コストが低い**  
  非エンジニアでも数回のクリック操作でテストを構築でき、チーム全体のテスト自動化への敷居を下げることができました。

  

### ❌ デメリット

1. **ビジュアルリグレッションテストの感度調整に注意**  
  UIのごくわずかな変化でもテストが失敗と判定されることがあるため、画像比較時のしきい値（threshold）は過度に低く設定しない方が良いです。  
  （例：0.5～1%程度が安定、プロジェクトの性質に応じて調整が必要）

2. **テストデータの整理が必要**  
  テスト中にエラーで停止した場合、一部のデータが残って次回のテストに影響を与えることがあります。  
  例：ロール変更のテストが途中で失敗すると、変更後のロールが残って次のテストに影響 → teardown処理や初期化の仕組みが必要です。

3. **シナリオ作成時の非効率な操作フロー**  
  シナリオ作成中に結果を確認するために毎回ログインからやり直さなければならないケースがあり、やや不便です。  
  ただし、共通シナリオをモジュール化することで一部は改善可能です。

## 5. まとめ

Autifyは、非エンジニアでも簡単にUIテスト自動化を導入できるよう設計されたツールです。  
従来のテストコードベースのアプローチと比べて学習コストが低く、保守性も高いため、回帰テストやリリース前の確認作業に特に有効でした。

すべての手動テストを置き換えるのは難しいとしても、シナリオが安定した後であれば、検証効率を大きく向上させることができるツールだと感じました。  
コードを書かずに素早く自動化を始めたいチームにとって、Autifyは非常に有力な選択肢だと思います。