OmniAICreator/Qiita-1.07M huggingface dataset:
キーボード遍歴とKeychron Q11に落ち着いた理由

## はじめに
仕事や趣味でキーボードを触る時間が多いと、キーボードの選択は重要です。この記事では、私のキーボード遍歴と、最終的にKeychron Q11に落ち着いた理由をまとめます。

## 遍歴

### Macビルトイン（日本語配列）
初めはMacBookの日本語配列キーボードを使用していました。日本語入力に特化しており、JIS配列に慣れている人には親しみやすい環境でした。

### HHKB Professional HYBRID Type-S 日本語配列／白
ビルトインキーボードで満足していたのですが、コロナ禍のリモートワーク時にエンターキーの接触が悪くなってしまいHHKB Professional HYBRID Type-S 日本語配列／白を購入。
キー配置を変更できることに魅力を感じ、親指周辺のキーをエンターにしてみたりしました。

### Macビルトイン（英語配列）
その後、MacBookの英語配列に挑戦しました。日本語配列に比べてシンプルで、キーの配置が直感的に感じられ、プログラミングなどにも向いていると実感しました。

### HHKB Professional HYBRID Type-S 英語配列／墨
HHKB Professional HYBRID Type-Sの英語配列モデルを導入。コンパクトさと打鍵感はそのままに、US配列によるスッキリしたキー配置を体感できました。

### Keychron Q11
そして現在はKeychron Q11をメインに使用しています。スプリット型のレイアウトやカスタマイズ性の高さ、QMK/VIA対応による柔軟なキーリマップが決め手です。

## 現在のKeychron Q11のキーマップ
### Layer0
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431477/735a56e3-ab51-47f5-af2a-4ae18c0834dd.png)
### Layer1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431477/cc91db4c-4370-477b-8f97-82fb35a99325.png)

## Keychron Q11に落ち着いた理由

### 親指シフトができる
親指シフトを快適に実現するため、Q11の分割キーボードデザインが役立っています。右の親指に適した位置にシフトキーを配置し、自然な入力が可能になりました。

### セミコロンfn（一般におすすめはできないが参考までに）
少しマニアックですが、右手小指の「;」キーをfnに設定しています。一般的な設定ではないので万人におすすめはできませんが、私にとっては非常に便利な方法です。

### 小指fnで矢印やエンターキーを効率化
小指でfnを押しながら、矢印キーやEnterキーを操作することで、ホームポジションから指を大きく移動せずに済むようになりました。これにより、入力のリズムやスピードが向上しています。

### 小指の付け根で押すfnも要検討
どうしてもセミコロンfnではセミコロンの配置に迷ってしまうので、小指の付け根でfnを押せるマップにした方が良いかもと思っています。


## まとめ
キーボードの配列や機能は作業スタイルに直結します。私自身、試行錯誤を繰り返してKeychron Q11にたどり着きましたが、あなたに合ったキーボードを探すヒントになれば幸いです。質問やフィードバックがあれば、ぜひコメントで教えてください！
BigQueryにおけるGeminiの活用方法まとめ

## はじめに
近年、Google CloudのBigQueryにおいて、生成AIの力を活用できる「Gemini」が話題になっています。この記事では、BigQueryにおけるGeminiの基本的な活用方法や具体例を紹介します。

## Geminiとは？
Geminiは、Googleが提供する生成AIサービスです。BigQueryのエコシステムに統合されており、自然言語によるSQL生成やクエリ最適化の提案など、データ分析業務をサポートしてくれます。

## BigQueryにおけるGeminiの役割
- **自然言語からのSQL生成**: データの要件を自然言語で記述するだけで、適切なSQLを生成してくれます。
- **クエリの改善・最適化提案**: 既存のクエリをより効率的な形にリライトしてくれるケースがあります。
- **スキーマ提案・ドキュメント化**: テーブル設計のアドバイスや、自動ドキュメント化をサポートすることも可能です。

## Geminiの使い方
BigQueryのコンソールやGoogle CloudのUIに、Gemini機能が統合されています。例えば以下の手順で利用できます:

1. **BigQueryコンソールを開く**
2. Gemini機能が有効な環境では、SQLエディタ上部に「Geminiアシスト」などのボタンが表示されています。
3. 質問や要件を自然言語で入力すると、自動的にSQLが生成されます。

例:  
「2023年の売上データを月別に集計するクエリを作成してください」  
と入力すると、適切なSQLが生成されます。

## 具体的な活用例
- **データ探索クエリの作成**: まだどのカラムを使えば良いか分からない段階でも、要件を自然言語で書けば、探索クエリの叩き台を作成できます。
- **クエリのリライト**: パフォーマンスに課題があるクエリを、Geminiに相談して改善案をもらうことも可能です。
- **ドキュメント作成**: スキーマ情報から自動的にテーブル説明やER図を生成する機能を併用できます。

## 注意点・コツ
- **過信は禁物**: Geminiが生成するSQLはあくまで提案。実際の要件に合っているか必ず検証しましょう。
- **自然言語の明確化**: 「どのテーブルのデータか」など、曖昧さを減らすほど生成結果の精度が高まります。

## まとめ
BigQueryのGemini機能は、SQL生成やクエリ改善の強力なアシスタントです。うまく活用して、データ分析業務を効率化しましょう！
Macのトラックパッドでpdfに手書き署名を追加する

iPadとか使わなくても、Macだけでpdfに署名を追加できる方法があった。Macのプレビューは最強ではないか？

1. pdfをプレビューで開く
1. 「マークアップツールバーを表示」ボタンを押す
1. 「署名」を押す
1. トラックパッドでサインをすると、サインの画像が貼り付けられる
1. 保存して終了
![スクリーンショット 2025-05-27 4.04.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549431/833e795e-1ef3-474e-a74b-40c17d0e4b95.png)
![スクリーンショット 2025-05-27 4.07.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549431/6e9f8869-8c68-4633-9193-7be8ea292992.png)
最先端AI技術2025：映像、教育、自動車まで広がる進化

 映像制作の革新：GoogleのVeo 3
GoogleはI/O 2025で、テキストや画像の指示から高品質な動画を生成するAI「Veo 3」を発表しました。この技術は、音声や効果音の同期も可能で、映像制作のプロセスを大幅に効率化します。一方で、俳優や監督などの伝統的な職業への影響も懸念されています。 
Wikipedia
+2
The Times of India
+2
WIRED
+2

🎮 ゲームとAIの融合：FortniteのAIダース・ベイダー
Epic Gamesは、FortniteにAIで制御されたダース・ベイダーを導入しました。故ジェームズ・アール・ジョーンズの声を再現し、リアルな対話が可能です。しかし、AIの予測不能な行動や倫理的な問題も指摘されています。 
Business Insider

🚗 自動車産業の進化：XpengのAI搭載スポーツセダン
中国の電気自動車メーカーXpengは、AIを搭載した新型スポーツセダンを発表しました。この車両は、自動運転機能や音声アシスタントを備え、Porsche Taycanに匹敵する性能を目指しています。 
The Irish Sun

🏠 スマートホームの普及：家庭用ロボットの進展
英国では、ロボット掃除機や芝刈り機などのスマート家電が急速に普及しています。特に25〜34歳の若年層での導入が進んでおり、家庭内の作業をAIが担う時代が到来しています。 
The Times

🎓 教育分野でのAI活用：エストニアの取り組み
エストニアは、スマートフォンの学校内使用を禁止するのではなく、AIを活用した教育を推進しています。「AI Leap」プログラムでは、生徒に個人用AIアカウントを提供し、教育の質を向上させています。 
The Guardian

💰 AIへの巨額投資：Cathay Innovationの新ファンド
フランスのCathay Innovationは、AIスタートアップへの投資を目的とした10億ドルのベンチャーファンドを設立しました。このファンドは、デジタルヘルスやフィンテックなど、さまざまな分野のAI企業を支援します。 
WSJ

🧠 AIモデルの進化：GoogleのGemini 2.5 Pro
Googleは、最新のAIモデル「Gemini 2.5 Pro」を発表しました。このモデルは、複雑なタスクへの対応能力や、ユーザーとの長期的な対話履歴の保持など、従来のモデルを凌駕する性能を備えています。 
Wikipedia

🧬 AIによるバイオテクノロジーの進展：esmGFPの開発
元Metaの研究者が設立したEvolutionaryScaleは、AIを用いて新しい蛍光タンパク質「esmGFP」を開発しました。このタンパク質は、自然界には存在しないもので、医療や環境科学への応用が期待されています。 
Wikipedia

2025年のAI技術は、映像制作、ゲーム、自動車、教育、投資、バイオテクノロジーなど、さまざまな分野で革新をもたらしています。これらの進展は、私たちの生活や社会の在り方を大きく変える可能性を秘めています。
Laravelのルーティングでよく見る `::class` と `use` 文とは？初学者にもわかるしくみと使い方


### はじめに

Laravelのルーティングを書くとき、こんなコードを見ませんか？

```php:php
use App\Http\Controllers\TestController;

Route::get('/hello', [TestController::class, 'hello']);
```

この記事では、 ::class と use について、Laravel初心者の方でもわかりやすいように、
この2つのキーワードがどんな役割を持っていて、なぜ一緒に使うのか？を
丁寧に解説していきます。

#### 💡この記事で分かること

•	::class が実際に何をしているか
•	use 文の意味と役割
•	ルーティングでこの2つがどう活躍しているのか
•	クラス名変更などのリファクタリングに強い理由


#### 📚 目次
1.	::class とは？
2.	クラスの「フルネーム」とは？
3.	::class を使う理由
4.	use 文の役割と関係性
5.	併用によるメリットと設計上の利点
6.	まとめ
7.	プラスα ⭐️  Laravel内の動作イメージを擬人化して捉えたら
8.	参考リンク



#### 1. ::class とは？

::class は、そのクラスの「フルネーム（名前空間付きクラス名）」を文字列として取り出すPHPの機能です。

Laravelで出てくるこちらの書き方
```php:php
TestController::class
```
次の文字列とまったく同じ意味になります
```php:php
"App\Http\Controllers\TestController"
```


#### 2. クラスの「フルネーム」とは？

PHPの世界では、クラス名が被らないように「名前空間（namespace）」という仕組みがあります。

たとえば、次のような場所にファイルがあるとします
```php
app/Http/Controllers/TestController.php
```
この場合のクラスのフルネームは
```php
App\Http\Controllers\TestController
```

つまり、TestController::class は、このフルネームを「文字列」として返してくれる仕組みです。


#### 3. ::class を使う理由

Laravelで ::class を使う理由は主に3つあります。

##### ☑️ 1. タイプミスが減る
```php:php
// 悪い例（手打ち）
["App\Http\Controllers\TestController", "hello"]
```
これは打ち間違いやすく、変更にも弱いです。
```php:php
// 良い例
[TestController::class, 'hello']
```

::class を使うことによりクラス名を間違えにくくなります。

##### ☑️ 2. 補完が効く（VSCodeなどで）

TestController::class を書き始めると、エディタが自動補完してくれるので速くて正確です。

##### ☑️ 3. 名前を変更しても追従できる（リファクタリングに強い）

クラス名やフォルダ構成をあとで変更しても、エディタが追従してくれるため、大規模開発でも保守性が高くなります。

##### 💡 リファクタリングとは？
動作は変えずに、コードの構造や書き方を改善すること。
可読性を上げたり、保守性を高めたりする目的で行います。
::class を使うことで、このリファクタリングがしやすくなり、ミスも起こりにくくなります。


#### 4. use 文の役割と関係性
```php:php
use App\Http\Controllers\TestController;
```
この use 文は、「このファイル内では TestController と書いたら、App\Http\Controllers\TestController のこととして使用する」という宣言です。

::class を使うときは、PHPに「それどこのクラス？」と迷わせないために use が必要になります。


#### 5. 併用によるメリットと設計上の利点
```php:php
use App\Http\Controllers\TestController;

Route::get('/hello', [TestController::class, 'hello']);
```

この組み合わせによって
	•	コードが短くて読みやすい
	•	自動補完が効いて書きやすい
	•	変更にも強い安全なコードになる

という、実用面でも可読性でも推奨される理にかなった記述スタイルとなります。



#### 6. まとめ

::class	➡️ クラスの「フルネーム文字列」を取り出す機能
use 文	➡️ クラスのフルネームを事前に定義しておくための宣言
組み合わせ ➡️ 誤りに強く、メンテナンス性にも優れた設計手法



#### 7. プラスα　⭐️  Laravel内の動作イメージを擬人化して捉えたら

Laravel：「このURL リクエスト、どのコントローラで処理すればいい？」
Me ：「'TestController::class' を指定してるから、そこにある 'hello' メソッドを使って！」
Laravel：「OK！'use' 文で名前空間も指定されてるから、探しに行くね！」
→ 処理完了！


```php:php
// ① ルーティングの登録（routes/web.php）
use App\Http\Controllers\TestController;
Route::get('/hello', [TestController::class, 'hello']);

// ② リクエストが来ると、LaravelがURLとHTTPメソッドでルートを探す
// 例: GET /hello に対して、↑のルートがマッチ

// ③ Laravelがコントローラを呼び出す
$controller = new TestController();
$response = $controller->hello();

// ④ 処理が終わったら、結果（ビューや文字列など）をブラウザに返す
return $response;
```
※内部処理は簡易化しています
#### 🔗 参考リンク
•	Laravel公式ドキュメント：Routing
https://laravel.com/docs/12.x/routing
•	Laravel公式ドキュメント：Controllers
https://laravel.com/docs/12.x/controllers
•	PHP公式ドキュメント：名前空間と use 文
https://www.php.net/manual/en/language.namespaces.importing.php
•	PHP公式ドキュメント：クラス定義と ::class
https://www.php.net/manual/en/language.oop5.basic.php
作ってるチャットシステムのメモ

いろいろ勉強したいので勉強のためのプラットフォームを作ってみてる。

特に一番実践したいのが以下の記事のような EventSourcing で構築されたシステム。

https://qiita.com/kuwavar/private/b890c12df8da7378863b

event をメッセージブローカーに入れて、各マイクロサービスは最新情報を必要としない限りは、各サービスが必要なデータをメッセージブローカーからマテリアライズして(ここではKTable)参照することでサービスの独立性を高めるような設計。

あとは Go に慣れるため。
こんな感じの slack のまがい物を作ってる

![スクリーンショット 2025-05-27 2.09.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213002/f2b909ca-bfa8-4dfc-9894-10dad1b74d6e.png)

https://github.com/chrkwbr/boardroom

DI的なお作法無知すぎて main.go が悲惨なことになってる。

# 全体図

![boardroom.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213002/f1594254-4dcc-453f-8f75-ce164075984a.png)

とりあえず今の段階の構成図

## chat service

### command project
普通の Rest API  
chatの更新/編集/削除

#### イベントの保存
一旦すべてのイベントをRDBのイベントテーブルに保存、同じトランザクションでoutboxテーブルにも保存

:::note
RDB を Single Source of Truth 扱いにしている。しかし今後は Kafka に情報源を任せたい。
:::

#### Kafka へイベントのpublish
イベントの保存が成功したら Hub を経由して goroutine 経由で outbox processor を呼び出す
outbox processor は RDB の outbox テーブルから Kafka へ未連携のデータを取得し、Kafka へ publish
Kafka への publish が成功したら RDB の outbox テーブルからレコードを削除

### WebSocket project
#### Kafka subscribe
Kafka を subscribe して、Hub に通知、Broadcat する
Kafka の subscriber が Hub を経由するのは、ws の接続数だけ Kafka のクライアントを作りたくなくて ws 用に 1 つにしたかったから。

#### server push
Hub から通知を受信したら、ws 経由でサーバープッシュし、リアルタイムで画面に最新情報を反映

### query project
#### ReadModel の構築
Kafka を subscribe して、query ようの ReadModel を構築

#### query endpoint
画面アクセスのタイミングで Redis から最新 chat 一覧を取得し画面に表示。一度最新を表示できたらその後は WebSocket 経由で最新情報に更新する

:::note
今は ReadModel を Redis だけに構築しているが、本当はちゃんと永続化考えなければ。
:::

#### Redis
クエリのためだけのデータストア

- `chat:${chatId}` (string)
    - chat_id をキーにして、string型で json formatted な chat を保存
    - 最初は Hash 型で持たせようとしていたが、Redis の Hash型には MGet 操作がなかったため N+1 をしたくなくて string型に
- `chats:${roomId}` (zset)
    - chatId の sorted sets
    - room 毎の chatId をソートしてアプリが持てるようにするため
    - 指定された room のソートした chatIds を取得し、取得した chatIds をベースに `chat:${chatId}` から MGet することで対象の chat を一括取得
- `chats:${chatId}:history` (list)
    - chat 毎の編集履歴を保持する
        - `chat:${chatId}` は最新データのみを上書きして持ち、`chats:${chatId}:history` は List型で保持し、編集のたびに LPush していく
    - RDB であれば `chats:${chatId}:history` 相当のテーブルさえ用意しておけば最新 chat の一覧のみの取得も SQL で表現できそうではあるが、Redis では厳しそう
    - `chat:${chatId}` と `chats:${chatId}:history` で両方に最新の chat を保持することになってしまうが、 ReadModel だし Redis なので良いとする

## room service
ToDo これから作る

多分 chat とは別の境界づけられたコンテキストにしそう。
room には認証認可の機能があって複雑にはなりそう。

chat 登録時に、room と ユーザーの Validation も必要になってくる。
従来であれば 
1. chat service -(post:chat)> room service
    1. 登録前の chat情報を post し、room service に対して room と user の validation を依頼する
1. chat service -(get:roomId)> room service
    1. chat service が room service から roomId をキーに所属メンバーを問い合わせ
    1. chat service が room service から取得した情報をもとに validation 実施
1. chat service -(get:userId)> user service (まだない)
    1. 2番目と同じような感じ。取得のキーが userId になりそうな感じ

がよくあるパターンだった気がする。

今回やりたいのは、
1. room にユーザーが所属したときに、所属イベントを Kafka に publish
1. chat service が Kafka Streams でイベントを購読し、 KTable にマテリアライズ
1. chat 登録時は KTable を参照して Validation
    1. ユーザーの room 所属と、新規ユーザーの chat ポストは厳密なリアルタイム性は多分なくて大丈夫そうだし
    1.
getent - get entries from Name Service Switch libraries

# getent

```shell
getent passwd ubuntu

getent group ubuntu

getent hosts google.com
```

# Name Service Switch (NSS) 

```conf
/etc/nsswitch.conf

# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.

passwd:         files systemd
group:          files systemd
shadow:         files
gshadow:        files

hosts:          files dns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis
```
Kubernetes 1.33: 変更点まとめリンク集

このエントリは、Kubernetes 1.33 の変更点のまとめページです。

ピックアップされた変更点は、日本語でまとめられたものが公式で用意されているため、[そちら](https://kubernetes.io/ja/blog/2025/04/23/kubernetes-v1-33-release/)をご参照ください。

細かな変更点について、SIG毎に[CHANGELOG](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.33.md)をまとめた以下のリンクを参照してください。

# 変更点の詳細へのリンク

- [Metrics Changes と SIG Instrumentation](https://zenn.dev/tsuzu/articles/k8s-1-33-sig-instrumentation) @Tsuzu
- [SIG Apps](https://zenn.dev/musaprg/articles/kubernetes-changelog-1-33-sig-apps) [@musaprg](https://github.com/musaprg)
- [SIG API Machinery](https://qiita.com/Ladicle/items/814ca84ded9cb71af929) @Ladicle
- [SIG Auth](https://qiita.com/hiyosi/items/2330a791a6263df9547e) @hiyosi
- [SIG CLI](https://qiita.com/superbrothers/items/dac5debcf5eb3a38715a) @superbrothers
- [SIG Cluster Lifecycle](https://qiita.com/yuanying/items/ca8d07bef1f01b32416d) @yuanying 
- [SIG Storage](https://qiita.com/everpeace/items/450e9b8e56b4ece4b478) @everpeace 
- [SIG Network](https://qiita.com/uesyn/items/36c03fe5593b95141dc2) @uesyn
- [SIG Scheduling](https://qiita.com/ordovicia/items/7235c783f1424e48c78b) @ordovicia
- [SIG Node](https://qiita.com/y1r96/items/02a65c1738a89c01de6e) @y1r96
Laravel12のサービスプロバイダー DI検証

前回の続きからソースを記載し、個人的なメモとして残していく。
独自クラスTestRepositoryをIndexControllerで使えるようにする。
https://qiita.com/pig_buhi555/items/12ff451b45b78d6f94f6

# 1. ソース
TestServiceProviderを作成し、修正する。
```
php artisan make:provider TestServiceProvider
```

artisanコマンド実行後、App\Providers\TestServiceProvider::class,は自動で書き込まれる。
```laravel12/bootstrap/providers.php
<?php

return [
    App\Providers\AppServiceProvider::class,
    App\Providers\TestServiceProvider::class,
];

```

```laravel12/app/Providers/TestServiceProvider.php
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Http\Controllers\IndexController;
use App\Repositories\Repository;
use App\Repositories\TestRepository;

class TestServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     */
    public function register(): void
    {
        logger('register');
        // whenはDI(依存性注入)を行うコントローラー
        $this->app->when([
                   IndexController::class,
               ])
        // needsでDIする抽象クラス・インターフェース
              ->needs(Repository::class)
        // 具象クラス(インスタンス化できるクラス)
              ->give(fn() => new TestRepository());
    }

    /**
     * Bootstrap services.
     */
    public function boot(): void
    {
        //
        logger('boot');
    }
}

```

```laravel12/app/Repositories/TestRepository.php
<?php

namespace App\Repositories;

class TestRepository implements Repository
{
    public function test1()
    {
        logger('test1');
    }

    public function test2()
    {
        logger('test2');
    }

   public function test3()
    {
        logger('test3');
    }
}
```

```laravel12/app/Repositories/Repository.php
<?php

namespace App\Repositories;

interface Repository
{
    public function test1();

    public function test2();

    public function test3();
}
```

```laravel12/routes/web.php
<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\IndexController;

// Route::get('/', function () {
//     return view('welcome');
// });

Route::get('/', [IndexController::class, 'index']);
```

IndexControllerを作成。
```
php artisan make:controller IndexController 
```

```laravel12/app/Http/Controllers/IndexController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Repositories\Repository;


class IndexController extends Controller
{
    //
    public function __construct(
        // App\Repositories\TestRepositoryが使われる
        protected Repository $repository,
    )
    {}

    public function index()
    {
        $test1 = $this->repository->test1();
    }
}

```

# 2. URLにアクセス
http://localhost:8000/

# 3 ログ
```
[2025-05-26 16:15:41] local.DEBUG: register  
[2025-05-26 16:15:42] local.DEBUG: boot  
[2025-05-26 16:15:42] local.DEBUG: CustomEmptyStringsToNull  
[2025-05-26 16:15:42] local.DEBUG: AppendMiddleware  
[2025-05-26 16:15:42] local.DEBUG: test1  
```

# 4. 参考
ありがとうございました。
https://zenn.dev/kkatou/books/laravel-best-practices/viewer/setting-providers
SSRF攻撃

## SSRF攻撃とは？

**SSRF（Server-Side Request Forgery）** とは、攻撃者が外部から操作可能なサーバーを悪用して、内部ネットワークのリソースや外部サービスに対して意図しないリクエストを送信させる攻撃手法です。

## SSRFにおける「フォージェリ（forgery）」の意味

「forgery（偽装）」とは、何かを本物のように見せかけて騙す行為を意味します。

SSRFでは、攻撃者が自ら直接アクセスするのではなく、**サーバーに“偽装されたリクエスト”を送らせる**ことで、内部ネットワークなどの本来アクセスできないリソースに間接的にアクセスします。

このように、サーバーを“代理”として使い、信頼されたリソースへのアクセスを偽装することから「Server-Side Request Forgery」と呼びます。

## OWASP Top 10における位置づけ

SSRFは、OWASPが公開しているWebアプリケーション脆弱性の代表リスト「OWASP Top 10 2021」において、新たに追加されたカテゴリです。

* **A10:2021 - Server-Side Request Forgery (SSRF)**
* クラウドやマイクロサービス環境の拡大により、外部URLにアクセスする機能を持つアプリケーションが増加
* 攻撃者はこれを悪用し、内部ネットワークやクラウドメタデータへのアクセスを試みることが可能

そのため、SSRFは現代のWebアプリケーションにおいて非常に重要な脅威の一つとされています。


## SSRF攻撃の具体例

SSRFは、以下のような機能を持つWebサービスにおいて特に発生しやすいです。

### 1. URLプレビュー機能（OGP取得）

* **対象サービス例**: Slack、Facebook、LINEなどのチャットやSNS
* **概要**: ユーザーが投稿したURLをサーバーが取得し、タイトル・サムネイル画像・説明文などのOGP情報を表示
* **リスク**: 攻撃者が `http://localhost/admin` や `http://169.254.169.254/latest/meta-data/` などを指定することで、内部サービスへのアクセスが発生

### 2. 画像URLを指定してアップロードする機能

* **対象サービス例**: CMS、ブログ、プロフィール作成系Webサービス
* **概要**: ユーザーが画像のURLを入力すると、サーバーがそのURLから画像をダウンロードして保存
* **リスク**: 一見画像のように見せかけたURLで、内部IPやクラウドメタデータなどにアクセスさせる

### 3. PDFやスクリーンショット生成サービス

* **対象サービス例**: WebページをPDFや画像化して提供するサービス（例：アーカイブ系、契約書出力機能など）
* **概要**: 入力されたURLに対してサーバーがヘッドレスブラウザ等を用いてアクセスし、画面キャプチャやPDFを生成
* **リスク**: 内部ページや非公開エンドポイントをキャプチャされてしまう可能性がある

## SSRF攻撃による被害

* 内部ネットワーク情報の漏洩
* 内部サービスへの不正アクセス
* クラウドサービスのメタデータへのアクセス（例: AWSメタデータサービス）

## SSRF攻撃の具体的な対策

以下の具体的な対策を検討し、実施することが重要です。

### 1. 入力の厳密なバリデーション

* ユーザー入力からURLを取得する際に、許可されたドメインやスキーマ（http、https）を明示的に制限する。
* URLのスキーマや形式を正規表現で厳密にチェックする。

### 2. 入力値のサニタイズ

* 取得したURLをサニタイズし、不正な文字や不必要なクエリ文字列を削除する。
* 特殊な文字やエスケープ文字の処理を適切に行うことで攻撃に使われるパターンを防ぐ。

### 3. リクエスト先の制限

* リクエスト先のIPアドレスやホスト名が内部ネットワーク、ローカルホスト、特定のクラウドメタデータサービス（例: AWS EC2のメタデータURL 169.254.169.254）を指さないようチェックを実施する。
* DNS解決後のIPアドレスによるチェックを追加する。

### 4. ファイアウォールやネットワークACLの利用

* サーバーからの外部への通信を明示的に許可された先に限定し、不必要なアクセスを遮断する。
* 内部リソースへのアクセスを明示的に遮断するようなネットワーク構成を検討する。

SSRF攻撃は一度侵入を許してしまうと内部被害が甚大になります。
非常にクリティカルな攻撃のためもしリクエストでURLを受け取ってアクセスをするようなら必ず確認するようにしましょう。

https://owasp.org/Top10/ja/A10_2021-Server-Side_Request_Forgery_%28SSRF%29/

##### 追記

この記事はAIで添削しています。
Homebrewとは

こんにちは。
Homebrewとは、macOS・Linuxで、ユーザーが必要とする各種コマンドやライブラリをインストールするツールです。コマンドライン上で動かし、そのソースコードのダウンロード・ビルドを自動的に行います。

近年は、ビルド済みのコマンドやアプリケーションをダウンロードし、簡便にインストール・アップグレードできるパッケージマネージャへ進化しました。
競プロ日記#25/05/26

# 競技プログラミングの鉄則

[A13 - Close Pairs](https://atcoder.jp/contests/tessoku-book/tasks/tessoku_book_m)
- しゃくとり法の典型問題っぽい
- 例題だったので解説を読みながらにはなったが、R[]配列を用意してわざわざ前の```R[i] = R[i - 1];```で前のインデックスをR[i]に代入して...って進めて最後にまた```for (int i = 1;i < N;i++){
        ans += R[i] - i;
    }```で答えを求めることの二度手間感がすごかった
- これについてChatGPT先生に聞いてみたところ、応用的なアルゴリズム記法ではR[]配列で記憶しておくことが有効になりうるということらしい。

[B13 - Supermarket 2]()
- A13の内容を活かして自力で解こうとしたが惜しいところまで行ったもののACできず...。
- 実装自体は惜しかったのだが尺取り法そのものの理解はまだまだだったというのを痛感させられた。
- 例題を読んで実装しただけではちゃんと理解しきれない技法もあるので今後アルゴリズムを習う際にも注意したい。わかったつもりになるのが一番やばい。そういう意味では納得しきるまでChatGPT先生に聞くというのはとても有効な手段だった

```
int N,K;
int A[100009],R[100009];

int main() {
    cin >> N >> K;
    for (int i = 1;i <= N;i++){
        cin >> A[i];
    }

    for (int i = 1;i < N;i++){
        if (i == 1){
            R[i] = 1;
        }else{
            R[i] = R[i - 1];
            
        }
        while (R[i] < N && A[R[i] + 1] - A[i] <= K){
            R[i]++;
        }
        
        
    }

    long long ans = 0;
    for (int i = 1;i < N;i++){
        ans += R[i] - i;
    }
    cout << ans << endl;
}
```
DDoS Shieldのレビュー、実際に契約してみての評価


## はじめに

ほんと、タイトルの通りなんですけど、私は自宅サーバーを運用してまして、ある日突然、DDoS攻撃とやらに食らってしまって完全に詰んだわけですよ。

htopとかタスクマネージャーとかで色々みても、CPUが100%になっているのでサーバーの電源を切ってみても、まーだ回線がダウンしっぱなしで、対策をいろいろ調べて試したけどダメで、それはそれは困ったもんでしたね。

色々とGoogle先生に調べたら、なにやら「DDoS Shield」っていう私の条件に合う良さげなDDoS対策のサービスがあって、試したらすごい良かったです。攻撃に困った人たちのために、レビュー記事を残しておこうと思います。

## 経緯

うちは自宅にサーバー置いてて、マイクラサーバーとか、WordPressのECサイト（実家のお米販売）とか、色々ちょっとした趣味と副業の延長線みたいなITエンジニアごっこをやってました。
それで、自宅鯖運営するの楽しいなーなんてwordpressやらdocker composeやらをカタカタいじってた毎日で、ある日突然、回線がすごくラグくなって、最終的にはネットに繋がらなくなったんです。
so-net光を使ってるんですが、ONUがカチカチうるさい、なんとなく察しがついてたのですが「あ、これDDoSだわ」ってなりましたね。

## 対策サービスを探したけど、個人じゃ無理ゲー

「DDoS 対策 サービス」とかで検索すると、法人企業向けみたいな、数十万〜数百万のやつばっか出てきて、  
いやいや、個人の遊びの鯖運営に、月１０万以上の大金を毎月払ってわれるかって話ですわ笑
私の家の家賃６万なので、家の家賃よりも高いDDOS対策はちょっとね。。自宅鯖はお金がかからないのがメリットなのに、こんななったら本末転倒です。

## DDoS Shieldってのを見つけた

そんな中でひらすらGoogle先生とかで調べてでてきたのが「DDoS Shield」というサービス。  
GoogleでDDoS対策格安とかで調べたら出てきました、サイト見てみると月額500円から一番安いプランはあって、一番高いプランでも2000円ぐらいで個人の私でも現実的。
しかもレン鯖でもあんまりない専用IPが標準装備で、任意ポート番号が使えるらしい。
そもそもこれ日本製か？海外企業じゃないよな？とか思いながら、サイト内を色々創作しても、特に怪しい日本語とかも無い上に、Googleでこの運営会社の名前調べたら星５レビュー２つ付いてたんで、試す価値あるかと思って1ヶ月だけ契約して試すことにしました。

## 実際使ってみた感想

・サーバーに追加でソフトとか何も入れなくていい。サーバーの設定も特に変えずに、ドメインの設定を変えるだけでDDoS Shieldの保護が使えるように。
・自宅のネットがSo-net光で、v6プラスっていう謎のポート制限があるせいで自由なポート番号が使えなかったんですが、DDoS Shield使えば、それも自由なポート番号使える様になりました → これは嬉しい誤算

これ今までは微妙に困ってたポイントで、V6プラスだとマイクラの25565とか、wordpressの443とか使えなかったんで、Cloudflare Tunnelを使ってうまいことやってたんですよ。

でも、DDoS Shield使えばそれ無しでも443とか19132とか自由にポート番号が使える！

## 安いけど、ちゃんと対策効果あるの？

これが一番重要なところだろうけど、**今のところ攻撃は全部弾かれてるっぽいです。サーバーは安定してるし、回線も重くならない。**

前はWordpressのログでHTTP Flood？とかいう攻撃も来てたんですが、それもDDoS Shieldに切り替えた瞬間、来なくなりました。

Wordpressの攻撃はまじで対策が厄介で、去年ぐらいにGCPの無料枠を使ってnginxのサーバーを立てて、対策を自作しようと考えたことがあったんですが、普通に攻撃貫通するしアメリカリージョンだからping遅延するわで。

最終的にDDoS Shieldに全部任せる感じにしたら、一通りこちらもおちつきました。

DDoS Shieldって東京にPOPがあるんで、遅延もほぼなし。

専用IPもあるから、某レン鯖みたいに同じIPで同居してるサイトがないかとか気にする必要もないし、あとレイヤ−７の攻撃対策の性能がめちゃくちゃ高い。

ほんとはやっちゃダメなんだろうけど、DDoS Shieldで保護された自分の鯖にDDoSを仕掛けるテストってのをやったんですよ。普通に攻撃防いでくれました。
というか、そもそも攻撃が自宅鯖まで到達しなかったです。DDoS Shieldのとこで全部ブロックされて、でも正常な通信は普通に通るので、攻撃テスト開始後から完了までマイクラ鯖のプレイヤーは全く切断されたりとかは無かったです。

なにこれ、すげー優秀じゃん！とか思いながら、なんで今までこのサービスの存在知らなかったんだろうて感じでしたほんとに。

１つ注意点として「通信量無制限」とは書いてますが、まあ確かに無制限なのは本当。
でも、プランによってネットの通信速度が違ったので、一応書いておきます。
（公式サイトにも同じこと書かれてますけどね）
500円プラン -> 2Gbps
1000円プラン -> 4Gbps
2000円プラン -> 10Gbps

まあ、私の自宅のso-net光は登り下り1Gbpsしかでないですから、一番安い500円のプランでも必要十分ですね。
だけど、2000円のプレミアムのプランだと、複数人で共有して管理できたりとか、家族で小さい会社やってる僕らには好都合だったので、父親とも相談してそっちを契約したいってことに。

## お問い合わせして上位のプランに変えてもらった
ただ、一度アドバンスプランで契約して１ヶ月分のお金は払ってしまったので、こっからプレミアムにするとなると書い直すだろうなーって思って二重にお金がかかることは覚悟してました。

ただ、チャットサポートで事情を相談してみたら「差額をお支払いいただければプランの変更は可能です」って言われて、すでに払った金額と追加分の差額を払って、２ヶ月目以降は普通の料金で請求ってことで、余計なお金がかからないようにうまいこと対応してもらえました。
運営さん、柔軟な対応ほんとにありがとうございます、助かりました。

## 結論
DDoS Shieldは、こんな人におすすめ。
・自宅サーバーを運営してる人 or DDoS対策が無いレン鯖使ってる人
・v6プラスとかで自由なポート開けられなくて困ってる人  
・個人で安くDDoS対策したい人 

総合的にみて、めちゃくちゃアリだと思います。 
個人相手にここまで優秀なものをこんな激安で提供してくれるサービスはここ以外に滅多に見ないし、
月額500円の細客の私に対してもサポートの人、めっちゃ対応丁寧だったので、今のところ満足です。

---

DDoS Shieldが気になる人がいたら、サイト貼っときます。
https://shield.broccoli.network/


※ アフェリエイトリンクなどは含んでません。
ログ解析に使うawkコマンドまとめ

`awk '$NF > 50'` 

リクエストタイム50秒以上

`| awk -F'"' '{print $6}' | sort | uniq -c | sort -nr | head -10`

ユーザーエージェント

`| awk '{print $9}'| sort | uniq -c | sort -nr`

レスポンスヘッダー

`| awk '{print $(NF-1)}'| sort | uniq -c | sort -nr | head -n 20`

LBある時のIP

`awk '$9==2xx'` 

レスポンスコード指定したいとき

`awk '{print $4}' | cut -b 2-15 | sort | uniq -c`

時間帯別アクセス数

`| awk '{print $7}'| sort | uniq -c | sort -nr`

URL
OpenAI CodexでMavenを使用するときに必要なセットアップ内容

# 当記事の概要
2025年5月に研究プレビューとして、OpenAIから Codex がリリースされました。Codexはクラウド上で動作するSWエンジニアリングAIエージェントで、ローカルに開発環境が一切無くともCodexに指示を与えることでプログラム開発を進めることができます。

Codexは、タスクを与える都度、独立した環境を起動し、タスクを遂行します。この環境はタスクの起動時のみインターネットにアクセスすることができ、起動時に実行するセットアップスクリプトを設定することができます。タスクの実行中はインターネットにアクセスできないため、依存ライブラリのダウンロードなどは起動時のセットアップスクリプトで実行・完了させる必要があります。

当記事では、MavenでビルドするJavaアプリケーションをCodexの処理対象とする場合、Codexにどのようなセットアップが必要かを示します。


# 前提条件
- Codexが扱うJavaアプリケーションはMaven Wrapper(mvnw)でビルド可能な状態であること
- Maven Wrapper(mvnw)のスクリプト（ダウンローダー含む）はGitリポジトリに格納されていること

# 設定のポイントと事前準備
Codexはセットアップスクリプトにおいてインターネットにアクセスできますが、その際はプロキシを経由する必要があります。HTTP、HTTPSともに以下となります。

- ホスト名：proxy
- ポート：8080

**これらをMaven Wrapper、および、Maven本体に与えることが設定のポイント**となります。

そのために以下の準備を実施します。

- Gitリポジトリに `.codex` フォルダを作成（名前は何でもよい）
- 作成したフォルダに以下の2つのファイル（jvm.config、settings.xml）を作成し、Gitリポジトリにcommit, pushする

```properties:jvm.config
-Dhttp.proxyHost=proxy
-Dhttp.proxyPort=8080
-Dhttps.proxyHost=proxy
-Dhttps.proxyPort=8080
```

```xml:settings.xml
<settings>
  <proxies>
    <proxy>
      <id>defaultProxy</id>
      <active>true</active>
      <protocol>http</protocol>
      <host>proxy</host>
      <port>8080</port>
    </proxy>
    <proxy>
      <id>defaultSecureProxy</id>
      <active>true</active>
      <protocol>https</protocol>
      <host>proxy</host>
      <port>8080</port>
    </proxy>
  </proxies>
</settings>
```

# Codexのセットアップスクリプト
Codexの環境セットアップスクリプトとして以下を記述します。

```bash
# jvm.config を .mvn にコピー
cp .codex/jvm.config .mvn/

# settings.xml を ~/.m2/ にコピー
mkdir ~/.m2
cp .codex/settings.xml ~/.m2/

# 以下を実行し、一度テスト・パッケージ作成まで実行し、ライブラリをダウンロードする
./mvnw clean package
```

依存ライブラリのダウンロードであれば、`./mvnw dependency:go-offline` で全てダウンロードできるはずです。ただ、私が対象としたアプリケーション(Quarkusで作成したAPI)では、一部のライブラリが独自の依存関係を持っているのかライブラリ不足が発生しました。そのため、一度 `./mvnw clean package` を実行してテスト・パッケージ作成（および事前の依存ライブラリのダウンロード）までを実行するようにしています。

なお、jvm.config を最初から .mvn に配置しておかない理由は、ローカルやCI環境での実行時に適用されるのを防ぐためです。

# CodexのAGENTS.mdの設定
上記の状態でCodexにJavaアプリケーションに対する機能追加・修正などを依頼すると、Codexは処理完了前に `./mvnw test` を実行し、テストの正常完了をチェックするようになります。

ただ、`./mvnw test`の実行時点ではインターネットにアクセスできないため、`-o`（オフライン）オプションを付けて実行するようにCodexに指示する必要があります。

具体的には、Codexのルールファイルである `AGENTS.md`（Gitリポジトリのルートに配置）に以下の内容を記載します。

```markdown:AGENTS.md
- Codexがmvn, mvnw コマンドを実行する場合のみ、必ずオフライン実行のオプション「-o」を付けてください。README、Markdownファイル、コメントなどにmvn, mvnwコマンドについて記載する際は「-o」オプションは不要です。
```

これにより、mvnwを実行する際に`-o`オプションを付けて実行してくれるようになります。
phpでrate_limit

IPごとに一日100回、一日ごとに一日1000回まで実行できます

```php
<?php

$RATE_LIMIT_DIR = 'rate_limit';
if (!is_dir($RATE_LIMIT_DIR)) {
    mkdir($RATE_LIMIT_DIR, 0777, true);
}

$now = date('Y-m-dTH:i:s');
$user_filename = $RATE_LIMIT_DIR . '/' . $_SERVER['REMOTE_ADDR'] . '_' . date('Y-m-d') . '.txt';
if (file_exists($user_filename) && filesize($user_filename) / (strlen($now) + 1) >= 100) {
    http_response_code(429);
    exit;
}

file_put_contents($user_filename, $now . PHP_EOL, FILE_APPEND);

$today_filename = $RATE_LIMIT_DIR . '/' . date('Y-m-d') . '.txt';
if (file_exists($today_filename) && filesize($today_filename) / (strlen($now) + 1) >= 1000) {
    http_response_code(429);
    exit;
}

file_put_contents($today_filename, $now . PHP_EOL, FILE_APPEND);
```
【Java】三項演算子を使ってコードを書くと…

こんにちは！futureです。

今日は備忘録として、**三項演算子**について書いておきたいと思います。

条件を判定するにはif文や、switch文を使うことが多いと思います。
（最悪if文さえ分かっていれば、問題はないと思っていたので😅）

ただ、if文やswitch文でコードを書いてみると、
可読性悪いな〜って思うことがあるんですよね。

**判定している条件が単にtrueかfalseを判定しているのであれば、**
三項演算子を使うとif文に比べ、比較的簡潔なコードが書けるみたいです。


## まずはif文で書いてみよう
年齢が入る変数`age`を参照し、お酒が買える年齢かどうかを調べるコードを書いてみます。
```java
public class AgeCondition {

    public static void main(String[] args) {
        int age = 20;
        String result;
        
        if (age >= 20) {
            result = "お酒を購入できます。";
        } else {
            result = "まだお酒は早いですよ！";
        }
        
        System.out.println("あなたは" + age + "歳です。" + result);
        // "あなたは20歳です。お酒を購入できます。"が出力される。
    }
}
```

これでも十分なのでは？
…と思いますよね〜

では三項演算子でも書いてみます。

## 三項演算子で同じ条件文を書いてみよう

```java
public class AgeCondition2 {

    public static void main(String[] args) {
        int age = 20;
        String result = (age >= 20) ? "お酒を購入できます。" : "まだお酒は早いですよ！";
        
        System.out.println("あなたは" + age + "歳です。" + result);
        // "あなたは20歳です。お酒を購入できます。"が出力される。
    }
}
```

あれ？短くない？🤔
こんなに短く書いているのに、先ほど書いたif文と全く同じ結果を得られました。

## 三項演算子の使い方
```java
条件 ? 条件がtrueの場合 : 条件がfalseの場合
```
このように項が３つあることから**三項演算子**と呼ばれているみたいです。
実はtrue・falseの値を、直接変数に入れることもできちゃうんです！

先ほど使ったコードを見てみましょう。
```java
String result = (age >= 20) ? "お酒を購入できます。" : "まだお酒は早いですよ！";
```


`age >= 20`という条件が
・`true`の場合、"お酒を購入できます。"
・`false`の場合、"まだお酒は早いですよ！"
のように、条件判定結果によってそれぞれの文字列を`result`という変数に直接代入するコードなんです。



## 結論
複雑な条件、あるいは条件が多い場合にはif文を使いましょう。
単にtrueかfalseの判定によりある値を求める場合は、
三項演算子を使うことで綺麗なコードが書けることがわかりました！
`return`, `break`, `continue` の使い分けとコツ

# はじめに

JavaScript（他の多くの言語でも同様）では、処理の流れをコントロールするために `return`, `break`, `continue` という命令が使われます。

初心者のうちは「何がどう違うの？」「どう書けばきれいに見えるの？」と迷いやすいところ。本記事では**違い・使い分け・使い方のコツ**をやさしく解説します。

# ざっくり比較表

| 命令         | 処理対象        | 何をするか                 | よく使う場面                |
| ---------- | ----------- | --------------------- | --------------------- |
| `return`   | 関数          | 関数の実行を即座に終了し、値を返す     | 値を返したい／それ以上の処理不要なとき   |
| `break`    | ループ・switch文 | 処理を途中で打ち切って、ループ自体を抜ける | 条件が満たされたらループを終了したいとき  |
| `continue` | ループ         | 処理中の1回分をスキップし、次の繰り返しへ | 条件によって「今回だけ」スキップしたいとき |

# `return`：関数の出口

`return` は **関数の処理を終わらせて値を返す**ための命令です。

```js
function isEven(n) {
  if (n % 2 === 0) {
    return true;
  }
  return false;
}
```

条件が満たされた時点で早めに `return` することで、ネストが浅くなり読みやすいコードになります。

```js
function isAdult(age) {
  if (age < 18) return false;
  return true;
}
```

# `break`：ループの終了

`break` は **ループの途中でも、条件を満たしたら脱出する**命令です。

```js
for (let i = 0; i < 10; i++) {
  if (i === 5) break;
  console.log(i); // 0〜4だけ出力される
}
```

* 無限ループから脱出する条件に使うことも多いです

```js
while (true) {
  const input = getInput();
  if (input === 'exit') break;
  handle(input);
}
```

# `continue`：1回スキップ

`continue` は \*\*「今回は処理をスキップして次へ」\*\*という命令です。

```js
for (let i = 1; i <= 5; i++) {
  if (i === 3) continue;
  console.log(i); // 1, 2, 4, 5 を出力（3だけスキップ）
}
```

* 条件によって「不要な処理を飛ばしたい」ときに使う
* 複雑な `if` のネストを避けてコードを読みやすくできます

```js
for (const item of items) {
  if (!item.isActive) continue;
  process(item);
}
```

# 実践Tips：ネストを減らすと読みやすい！

例：早期 `return` を使って `if-else` を避ける

**悪い例：**

```js
function getStatus(user) {
  if (user) {
    return 'ログイン済み';
  } else {
    return '未ログイン';
  }
}
```

**良い例：**

```js
function getStatus(user) {
  if (!user) return '未ログイン';
  return 'ログイン済み';
}
```

**✨もっと良い例：**

```js
function getStatus(user) {
  return user ? 'ログイン済み' : '未ログイン'
}
```

# おわりに

`return`, `break`, `continue` をうまく使えるようになると、**処理の流れをシンプルに保ちつつ、意図を明確にしたコード**が書けるようになります。

読みやすさを意識して、積極的に使い分けていきましょう！

| 命令         | 使う場面              | 書き方のコツ                  |
| ---------- | ----------------- | ----------------------- |
| `return`   | 関数から値を返す／早めに抜けたい  | 条件満たす → 即 return が◎     |
| `break`    | ループを抜ける（脱出）       | `while(true)` と組み合わせやすい |
| `continue` | ループ内で「今回はスキップ」したい | ネストを避けたいときに有効           |
実行時デバッグつらいなぁ

実行時にならないとエラーが表出しないってつらいなぁ。
実行時エラーなんだけど。
この辺、AIでどうにかなんないかなぁ。

AIがソースコードを読み込んでそれをAIの仮想環境で実行テストして、実行時エラーを検出してくれるとか。
そんなのが出たら最高だなぁ。

Rustはコンパイル時エラーを増やせるけど、それでも実行時エラーはあるからなぁ。
やはりAIの力と仮想化の力を借りないとだめだ。

ああ世界の天才がこの欲望をかなえてくれますように。
ラーメン。
【Mac】スクリーンショットのドロップシャドウを無効にする方法


## 無効にする方法

以下のコマンドを実行するとウィンドウのスクリーンショットを撮影した際のドロップシャドウが削除されます。

```terminal
defaults write com.apple.screencapture disable-shadow -bool true && killall SystemUIServer
```

## 実行前

![CDA3809A-7307-4BDE-9B78-542189D3B2C0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/20ecb311-2eba-46d0-a1af-042814a38d45.png)

## 実行後

![F301D01A-D0B2-4071-9FF5-FCCF542DBB8F.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/722df99e-f62f-4edb-b88f-5be2cc454590.png)

## 元に戻す方法

ドロップシャドウを元に戻すには以下のコマンドを実行します。

```terminal
defaults write com.apple.screencapture disable-shadow -bool false && killall SystemUIServer
```
【Salesforce】Summer '25 リリースノート気になるまとめ

[Summer '25 リリースノート](https://help.salesforce.com/s/articleView?id=release-notes.salesforce_release_notes.htm&release=256&type=5)

ぴえ的に気になったトピックだけのまとめです(\*'ω'*)見出しはリンクになっています！

#### [すべてのカスタム権限セットまたはプロファイルのオブジェクト権限を 1 ステップで更新](https://help.salesforce.com/s/articleView?id=release-notes.rn_permissions_object_summary_edit.htm&release=256&type=5)
一画面で１つのオブジェクトの権限を
すべての権限セットとプロファイルに対して設定できるようになるみたいです。
こういうUI改善は管理者・開発者には嬉しいですよね！

#### [権限セットの概要での権限の迅速な編集](https://help.salesforce.com/s/articleView?id=release-notes.rn_permissions_summary_edit.htm&release=256&type=5)
概要ビューで追加・除外ができるようになります。

#### [Agentforce DX](https://help.salesforce.com/s/articleView?id=release-notes.rn_tools_agentforce_dx.htm&release=256&type=5)

https://developer.salesforce.com/docs/einstein/genai/guide/agent-dx.html

> では、Agentforce DXとは何でしょうか？Salesforce Developer Experience（DX）は、Salesforce Platform上でアプリケーションを構築、テスト、リリースするためのツールセットです。Salesforce CLI、VS Code拡張機能、Code Builder、DevOps Centerなどが含まれます。また、スクラッチ組織やサンドボックスといった開発環境も含まれています。Agentforce DXは、これらのツールを拡張し、エージェントにも対応させます。

Salesforce開発ツール一式にAIエージェントを適用させるよ！ということだと解釈しました。
開発者向けAgentforceもAgentforce DXの一部ということであってる？
兎にも角にもAIの時代ですわ！置いてかれないように食いついていきましょう！

以上、はい、これくらいでした。気になるの少ない！
Apexも今回はシャバかったですね(;^ω^)

Summer '25のリリースは**2025/6/15**です！

### ワークフロールールとプロセスビルダーの廃止
書くこと少ないので完全に余談ですが
そういえばワークフロールールとプロセスビルダーって
いつ廃止されるか情報出たかな～と思いググったら

[ワークフロールール & プロセスビルダーのサポートの廃止](https://help.salesforce.com/s/articleView?id=001096524&type=1)

こちらが公開されていました。（１年前に出てたのか、、！）
サポート終了が2025年12月31日らしいです(/・ω・)/
> 2026年以降、ワークフロールールおよびプロセスビルダーの機能は引き続き動作しますが、カスタマーサポートや問題の修正は受けられません

とのこと、、

https://qiita.com/piepie1231/items/43e02d0b9a607a298566

3年前に書いた記事なので古いですがご参考までにどうぞ。
そろそろまた向き合わなきゃいけませんね( ﾟДﾟ)
【Python初心者】イテラブルとイテレータの違いを整理してみた

Pythonでfor文を使っていると、「イテラブル」や「イテレータ」という言葉が出てきます。  
なんとなくfor文で繰り返せるものがイテラブルなのかな？と思いながらも、  
明確に違いを整理しておきたいと思って今回まとめました。

## イテラブルとイテレータの定義

まずは公式ドキュメントに基づいた定義を確認します。

### イテラブル（Iterable）

- `__iter__()` メソッドを持ち、それがイテレータを返すオブジェクト
- `for` 文で繰り返し処理できるもの

### イテレータ（Iterator）

- `__iter__()` と `__next__()` の両方を持つ
- `__iter__()` は自分自身（self）を返す
- `next()` 関数で1つずつ要素を取り出せる

どちらも `collections.abc` で判定できます。  
`collections.abc` は、「このオブジェクトがどんな振る舞い（インターフェース）を持つか」を判定するための標準モジュールで、  
`Iterable` や `Iterator` のような抽象的な型（抽象基底クラス）を提供しています。

```python
from collections.abc import Iterable, Iterator

lst = [1, 2, 3]
it = iter(lst)

print(isinstance(lst, Iterable))   # True
print(isinstance(lst, Iterator))   # False

print(isinstance(it, Iterable))    # True
print(isinstance(it, Iterator))    # True
```

## 使用場面の違い

### イテラブルの使用場面

- for文で繰り返し処理したいとき
- 同じデータを何度も使い回したいとき

```python
lst = [1, 2, 3]
for x in lst:
    print(x)

for x in lst:  # 繰り返し可能
    print(x)
```

### イテレータの使用場面

- next() で1件ずつ値を取り出したいとき
- 途中で止めたり再開したりするような処理をしたいとき
- 使い切りでよい場合や大きなデータを少しずつ処理したいとき

```python
it = iter([10, 20, 30])
print(next(it))  # 10
print(next(it))  # 20
# ... 他の処理を挟んで ...
print(next(it))  # 30
```

## 実例

### イテラブル（list, str, range など）

```python
lst = [1, 2, 3]
print(hasattr(lst, '__iter__'))   # True
print(hasattr(lst, '__next__'))   # False
```

### イテレータ（iter(list), map(), zip() など）

```python
it = iter([1, 2, 3])
print(hasattr(it, '__iter__'))    # True
print(hasattr(it, '__next__'))    # True
print(it.__iter__() is it)        # True
```

## イテラブルとイテレータの関係とポイントまとめ

- イテレータはイテラブルの一種です（イテラブルでもあり、イテレータでもある）
- list や str などの普通のイテラブルは、`__iter__()` によってイテレータを生成できます
- イテラブルは何度でも繰り返し使える一方、イテレータは1回使い切ったら空になります

```python
lst = [1, 2, 3]        # イテラブル（イテレータではない）
it = iter(lst)         # イテレータを生成（使い切り）

print(next(it))        # 1
print(next(it))        # 2

# 再度繰り返すには新しいイテレータを作る必要がある
it2 = iter(lst)
print(next(it2))       # 1（また最初から）
```

## 判断基準のまとめ

| 判定観点 | イテラブル | イテレータ |
|----------|------------|------------|
| `__iter__()` を持つ | ✅ | ✅ |
| `__next__()` を持つ | ❌ | ✅ |
| `__iter__()` が自分自身を返す | ❌ | ✅ |
| `for` 文で使える | ✅ | ✅ |
| `next()` で使える | ❌ | ✅ |
| 繰り返し可能 | ✅（何度でも） | ❌（使い切り） |

## おわりに

調べていくうちに、イテラブルとイテレータの違いは「定義」だけでなく「どう使うか」「何ができるか」で整理すると理解が進むと感じました。  
今後は `print()` で中身が見えないときに「これはイテレータかもしれない」と考えたり、`list()` で展開すべきか判断する際にも活かせそうです。
もう追いつけない...！ 出遅れた人向けの生成AIまとめ

😵‍💫 **「また新しいAIサービス！？もう追いつけない…！」**  
そんな気持ち、ありませんか？

私も2025年に入ってから、毎週のように出てくるAIツールに**見てみぬふり**してます。  
でも「知らないと損する」感がすごいので、自分の整理用にまとめました👇  
ChatGPTやCopilotしか使ってない方（＝私）、ぜひ一緒にキャッチアップしていきましょう！

> 「これ良かったよ！」「それ気になってた！」などあればコメントで教えてください🙌

---

## 💻 まずはカテゴリ整理から！

| カテゴリ         | 代表ツール                                                                 |
|------------------|----------------------------------------------------------------------------|
| **コード生成**       | GitHub Copilot、ChatGPT、CodeWhisperer（Amazon）、Replit Ghostwriter     |
| **ドキュメント生成** | ChatGPT、Notion AI、Jitera、Copilot Chat                                 |
| **設計支援**         | Eraser AI、Galileo、Uizard、ChatGPT                                       |
| **テスト生成**       | Diffblue、CodiumAI、Ponicode、ChatGPT                                     |
| **画像生成** | Midjourney、Stable Diffusion、DALL-E 3、Adobe Firefly、Microsoft Designer|

---

## ✨ コード生成AI：もはや相棒。いや、先輩。

Copilotにコメントを書くとコードを補完してくれるし、  
ChatGPTに「Reactのコンポーネント作って」と頼めば秒で骨組みが出てきます。

### ✅ メリット
- ⏱ コード生成、秒速。手動で10行書く間に10ファイルできてる
- 🔍 文法ミスやタイポの防止、ヒューマンエラー削減
- 🐣 未経験者でも“それっぽい成果物”ができちゃう(学習コスト低減)

### ⚠️ 注意点
- たまに**クセ強なコード**が出るのでレビュー必須
- ググらなくなる（これは地味に危険）

### 💡 活用例
- Google：**社内コードの4割がAI生成**と発表（2024）
- GitHub：Copilotが書いたコードが**5割超え**の企業も
- Devin：設計〜実装〜テスト〜PR作成までやる**AI開発者**

---

## 📝 ドキュメント生成AI：「書類仕事、AIに丸投げしていいすか？」

要件定義書、詳細設計、READMEなど、  
ChatGPTに「このコードをわかりやすく説明して」と頼めば、それっぽく仕上げてくれます。

### ✍️ できること
- 要件定義の要約
- コードから設計書の自動作成
- READMEのひな形も◎

### ⚠️ 注意点
- 🙄 **ハルシネーション（AIの嘘）**に注意
- 業界用語や社内用フォーマットへの適応はまだ弱い
- 機密コードを貼るのはNG！社内ルールを必ず確認

### 💡 活用例
- JiteraでGitHubプロジェクトから設計書作成
- ChatGPTでドキュメント一括生成

---

## 🧠 設計支援AI：「モックUI、秒で誕生。」

**Eraser AI**や**Uizard**が話題。  
- Eraser AI：`「AWS構成図を出して」→即ビジュアル化`  
- Uizard、Galileo AI：`手描きスケッチ → モックアップ化`の魔法

### 👤 どんな人向け？
- 手よりパワポ動かしたい人
- UI/UXに強い**フリ**したいエンジニア（←私？）

---

## 🧪 テスト生成AI：「退屈なテスト、AIに投げよう」

テストコードって、お金を生まないからテンション上がらない…  
でもAIなら**カバレッジ爆上げ**してくれます。

### ✍️ できること
- テスト仕様からの自動コード生成
- 既存コードを分析 → JUnit / Pytest を自動生成

※とはいえ、**レビューはまだ必要です！**

---

## 🖼 画像生成AI：「アイキャッチ、AIに頼む時代」

MidjourneyやDALL-Eに「未来のオフィスでAIが働いてる様子」って聞いたら、  
**謎のサイバー猫**がPC使ってる画像が出てくる（それはそれで見たい）

### 💡 活用例
- 技術ブログや資料の「それっぽい図」作成に
- デザイナー不在でもバナーや素材を調達できる
- SNS映えする“ちょっと笑える画像”の量産にも！
- Photoshop×FireflyでAI背景生成＆編集

---

## 🚀 未来はこうなりそう：「AIで8割作って、人間が最後にちょい足し調整」

| トレンド             | 一言でいうと                                       |
|----------------------|----------------------------------------------------|
| **マルチモーダルAI**     | 「画像や動画を見てコード書くAI」もう出てます                     |
| **Devin系AIエージェント** | 設計〜実装〜PRまで丸投げできる**AIの同僚**                  |
| **自律型AI**             | バグ報告→修正→テスト→PRまで全部やってくれる(Auto-GPTやCopilot Workspace)               |
| **コンテキスト無限系**    | Claude 2で**10万トークン**。もはや辞書より物知り             |

---

## ✅ 結論：「2025は既にAIが(ほぼ)全部やってくれる時代」

コード書く、設計する、テストする……AIが全部できちゃう。  
でも大事なのは、

> **「何をAIに任せて、どこに人間の知恵を使うか」**という戦略。

じゃあエンジニアは？と聞かれたら、こう答えます。

> 💬 **“AIに指示出して、かっこつける”**

…でも、**ちゃんとレビューはしてくださいね（笑）**
2026年の自分が焦らないように、今のうちに試しておきましょう！
Samsung Galaxy S5をバッテリレスで使用する

## 回路は以下の通り

![回路.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242268/aef1b92e-700c-40f9-83b5-7f94731306f4.jpeg)

## なぜダイオードを２個直列にしているのか
Galaxy S5の内蔵バッテリは出力電圧 3.85V, 充電の入力電圧4.4Vです。 
ACアダプタ5Vは電圧が高すぎます。ダイオードを入れることで電圧を下げています。
またダイオードを入れることでスマホとPCをUSBケーブルで接続した際、ACアダプタ側に影響が出ないようにします。結果、adb shellやファイル転送が使えるようになります。
1N5822Gのデータシートをみると1A時必要な電圧＝0.39V、3A時は0.525Vです。  
電流1Aが流れる時、5.0V - 0.39V - 0.39V = 4.22V、3Aが流れる時は3.95Vの計算になります。 そのため、3.85V～4.4Vの電圧範囲で、3Aが使用可能なダイオード 1N5822を
2個直列しました。

## ACアダプタは何Aのものが必要か
ACアダプタ5V1Aを使用した際、ブート途中で再起動を繰り返し、ACアダプタ5V2Aを使用した際、ブートは成功しましたが、カメラアプリを起動して撮影すると再起動してしまい、2A以上消費する時があることが分かっています。  
ダイオード1N5822Gは最大電流3Aの規格です。  
このダイオードで無事カメラ撮影までできているので、2A以上3A未満のACアダプタが必要ということが分かっています。

## T端子とは
バッテリの温度をスマホに知らせる端子です。抵抗値で温度を検知するようです。テスタで測った際2.3kΩでした。なので2.4kΩの抵抗を入れています。

## 安物の電源ケーブルはやめましょう
最初USB充電ACアダプタとダイソーのUSB延長ケーブルを使ったのですが起動時再起動を繰り返し、ケーブルを替えると発生しなくなりました。ケーブルの太さには注意しましょう。
Macで無料・高速に文字起こししたいならwhisper.cpp一択だった話

# Macで無料・高速に文字起こししたいならwhisper.cpp一択だった話

最近、英語の技術解説を聞く機会が増え、「音声ファイルを無料で文字起こしできたら便利だな」と感じることが多くなりました。
特に、英語で話される技術セッションや学習用ポッドキャストは、音声よりも文字のほうが内容を理解しやすく、自分で見返すためにもテキスト化しておきたいというニーズがあります。
もちろん、日本語の音声にも使いたい🙆

そんなとき、OpenAIが提供している文字起こしモデル「Whisper」にたどり着きました。
ただし、Mac（特にApple Silicon）環境では選ぶべき実装に注意が必要です。

---

## 1. Whisper (Python版) はMacユーザーには非推奨

Whisper（Python版）は公式実装であり、CLIで簡単に使えるのが魅力です。  
ただし、**MacではGPU処理がうまく動作せず、CPUのみでの実行になるため非常に遅い**です。

- 6分のMP3ファイルで10分以上かかることもある
- 実行時に以下のような警告が出る  
  `UserWarning: FP16 is not supported on CPU; using FP32 instead`
- PyTorchのMPS対応が不完全で、GPU高速化を試みるとエラーで詰むことが多い
- 日本語への翻訳も精度が落ちる印象 → 文字起こし後にDeepLなどで翻訳するのが現実的

**結論：MacユーザーはPython版Whisperは避けた方が無難です。**

---

## 2. Macならwhisper.cpp一択

Apple Silicon (M1〜M3) のMacでは、**C++実装の [whisper.cpp](https://github.com/ggerganov/whisper.cpp) が非常に高速かつ安定**しています。  
Python環境も不要で、動作も軽量。自分の使った中ではこれが一番快適でした。

---

### セットアップ手順

以下の手順でインストール可能です。

```bash
xcode-select --install  # インストール済みなら不要
git clone https://github.com/ggerganov/whisper.cpp
cd whisper.cpp
./models/download-ggml-model.sh base.en  # baseは速度重視、mediumは精度重視
brew install cmake
make
cmake --build build --config Release
```

---

## 使い方（例）

```bash
./build/bin/whisper-cli -m ./models/ggml-base.en.bin -f "example.mp3" -otxt
```

- `-m` 使用するモデル（base.enやmedium.enなど）
- `-f` 文字起こししたい音声ファイル（MP3/WAV/MP4など）
- `-otxt` テキスト形式で出力
- `-oj` JSON形式でも出力可能

使い方の詳細は以下で確認できます。

```bash
./build/bin/whisper-cli -h
```

---

## 使用してみた感想

- Wihsperで10分以上かかっていたのが1分でできました！
- 精度も十分で、Python版と遜色なし
- `alias whisper='~/whisper.cpp/build/bin/whisper-cli ...'` のように設定すればより便利
- 翻訳が必要な場合は、DeepLなどにコピペでOK
- オプション　--translate で翻訳できるが精度・速度に不安がある
- JSON形式で出力すればタイムスタンプが出る（後で確認する場合も便利）

---

## まとめ

| ツール              | 特徴                                      | Macでの使用感                |
|---------------------|-------------------------------------------|------------------------------|
| Whisper (Python版)  | 正式実装。簡単に使えるが遅い              | GPUが使えず非現実的           |
| whisper.cpp         | Apple Siliconで高速動作。Python不要        | 爆速＆実用的                  |

---

Macで無料＆高速に文字起こししたいなら、**whisper.cpp一択**。  
Python版はCPU実行しかできず、実用性に欠けます。
音声ファイルを文字起こししておくと、学習の時短になるし、あとで内容を見直したいときにもすぐに検索できて便利です。  
---
|| と && と ?? の違い・活用例

# はじめに

JavaScriptにおける `||`（論理和）と `&&`（論理積）、そして `??`（null合体演算子）は、**条件分岐**や**値の選択処理**で非常に便利な演算子です。ただの「真偽値チェック」ではなく、**値の返し方に特徴がある**点が重要です。

本記事では以下の内容を解説します：

    * `||` / `&&` / `??` の違い
* よくある活用パターン（if なしで書ける！）
* React での使用例
* 使いこなしのコツと注意点

# `||` 、 `&&` 、 `??` の基本動作

JavaScriptでは、`||` 、 `&&` 、 `??` は **条件に応じてその値自体を返す**のが特徴です。

```js
console.log(false || 'default') // 左が falsy なら右を返す → 'default'
console.log(null ?? 'default') // 左が null/undefined なら右を返す → 'default'
console.log('hello' && 123)   // 左が truthy なら右を返す → 123
```

# 活用例①：デフォルト値の設定（`||`）

```js
const name = inputName || 'ゲスト';
```

`inputName` が空文字・null・undefined・0 などの falsy 値なら `'ゲスト'` が代入されます。

```js
const count = inputCount ?? 0;
```

* `inputCount` が `null` または `undefined` のときだけ `0` を使う
* `0` や `''` を許容したい場合は `??` を使うのがベスト

```js
const password = process.env.PASSWORD || "";
```
Node.jsなどで環境変数を使う場合、`process.env.XXX` は `string | undefined` になります。

明示的に `string` として扱いたいときに `|| ""` を使うと便利です。
* 型エラー回避
* `.trim()` などの文字列メソッドを安心して使えるようになります

# 活用例②：条件付きで処理実行（`&&`）

```js
isLoggedIn && showDashboard();
```

`isLoggedIn` が true の場合のみ `showDashboard()` を実行します。

```js
// 通常のif
if (user) {
  console.log(user.name);
}

// &&で簡潔に
user && console.log(user.name);
```
ifよりシンプルに書けます。

# 活用例③：複数条件と組み合わせる

```js
const msg = (isAdmin && '管理者') || '一般ユーザー';
```

→ `isAdmin` が true なら `'管理者'`、false なら `'一般ユーザー'` が代入されます。

# 補足：truthy / falsy を理解しておく

`||` は falsy 値すべてを無視します：

```js
false
0
''
null
undefined
NaN
```

一方 `??` は `null` と `undefined` だけを無視します。

```js
0 ?? 100 // → 0
0 || 100 // → 100
```

つまり、**`0` や `''` を有効な値として使いたいときは `??` を使うべき**です。

# おまけ：Reactでの活用

```jsx
{isLoading && <Spinner />}
{error && <ErrorMessage message={error} />}
```

JSX内でも `&&` はよく使われます。これも「trueなら右を評価」の応用ですね。

# おわりに

`||`, `&&`, `??` を理解し活用できるようになると、**if文を減らし、より宣言的で読みやすいコードが書けるようになります。**

* falsy 値か null/undefined かで適切な演算子を選ぶ
* JSX でも自然に使える
* 型安全にも貢献（`|| ""` で `string` に変換など）

ぜひ、日々のコーディングに取り入れてみてください💡
一流エンジニアは「理解」している

## 📌 はじめに

「一流エンジニア」と言われる人たちって、
- ごりごりコードを書いて
- ばんばんディスカッションして
- さくさく問題解決して

な感じで、圧倒的な生産性を生み出している人が多いかと思います。

では「一流エンジニア」~~と自分~~って何が違うのか？
その違いは、**ちゃんと理解しているかどうか**にあります。

## 💡 こんな経験、ありませんか？

- 実装したけど、なんで動いてるのかよく分からない…
- ミーティング後に「結局何をやればいいんだっけ？」ってなる
- 質問されても答えられない、応用がきかない
- お客さんや上司の前でのレビュー、めっちゃ怖い…

その原因は、**理解できていないから**です。

## 🧠 理解とは何か？

- **人に説明できること**
- **即座に取り出して使えること**
- **応用がきくこと**

逆に言えば、理解できていないと…

- 説明できない
- すぐに使えない
- 応用が効かない

つまり、知識が身につかず、最終的には生産性が下がってしまいます。

## 🏃‍♂️ 一流エンジニアは「理解」に時間をかけている

- 何時間もかけてドキュメントを読む
- 何度もデバッグする
- 動画を10回以上見返す

超優秀なエンジニアでさえ、理解には時間をかけているんです。  
だからこそ、**人に説明できて、応用が効いて、即座に取り出せる知識**が増え、高い生産性を発揮できるんですね。

## 🛠 理解を深めるための方法

1. **理解できていない状況を見逃さない**
2. **会議で分からないことは「とことん」質問する**  
   - 「すみません、ちょっと理解が追いついていません」  
   - 「私の理解では〇〇なんですけど、合っていますか？」
3. **ドキュメントを丁寧に読む**  
   - 分からなければ、聞く・ディスカッション・ChatGPT活用
4. **コードを読むときは「意図」を理解する**
5. **理解した内容をアウトプットする**  
   - チームで共有
   - Qiitaや勉強会で公開

## 🎯 まとめ

- 一流エンジニアはちゃんと「理解」している
- 時間をかけてちゃんと理解しよう
- その積み重ねがスキルとなり、一流に近づく

「分からん、分からん、分からん、分からん、分からん、、、、、分かった！」の快感はとても気持ちがいいものです！  
一流エンジニアを目指していきましょう！

## 参考

[世界一流エンジニアの思考法](https://www.amazon.co.jp/%E4%B8%96%E7%95%8C%E4%B8%80%E6%B5%81%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E6%80%9D%E8%80%83%E6%B3%95-%E7%89%9B%E5%B0%BE-%E5%89%9B/dp/4163917683)
GitHub Copilot Coding Agentの使い方

# 準備（Copilot Pro+かCopilot Enterpriseでリポジトリを許可）

1. https://github.com/ にログイン。無ければアカウント作成
1. GitHubのCopilotプランで、Copilot Pro+ か Copilot Enterprise を申し込む
    - [GitHub Copilot のプラン](https://docs.github.com/ja/copilot/about-github-copilot/plans-for-github-copilot)
1. 右上のアカウントのアイコン > Settings > Copilot > Coding agent > Repository access で、Coding Agentの使用を許可するリポジトリを設定

# 依頼の仕方（IssueにCopilotをAssign）

1. リポジトリを開く
1. Issuesで、Issueを作成か開き、AssigneesにCopilotを指定
1. Copilotが走り出し、PRを作成する
1. 作業が終わったら通知が来る、メール通知が有効ならメールも来る

# Copilot Coding Agentが動かない時（Copilotを再Assign）

PR作成完了後のレビューコメントで @copilot にメンションして指示しても反応してくれない時は。。

Issue の Assignees から Copilotを外して、少し経ってからCopilotを再び指定すると動くことがある。

# 参考

- [Best practices for using Copilot to work on tasks](https://docs.github.com/en/enterprise-cloud@latest/copilot/using-github-copilot/coding-agent/best-practices-for-using-copilot-to-work-on-tasks)

`.github/copilot-instructions.md` と `copilot-setup-steps.yml` も書くと、より良い感じになるらしい

# 次の一手（Agentにネットアクセスを許可）

- Agentにネットアクセスを許可 → [GitHub Copilot Coding AgentのFirewall設定](https://qiita.com/tmyymmt/items/04be2c498b76980f51c9)
ARC198(div.2)参加記

[ARC198(div.2)](https://atcoder.jp/contests/arc198)に参加しました。さて、命運やいかに...?

[A問題](https://atcoder.jp/contests/arc198/tasks/arc198_a)
ぱっと見難しそう...
でも、実験すると2の倍数を集めるのが最適そう。(実際にこれは最適だった)コーナーケースの ${N = 1}$ を忘れずに。
[提出コード](https://atcoder.jp/contests/arc198/submissions/66157241)(python,84ms)

```python
N = int(input())
if(N == 1):
  print(1)
  print(1)
else:
  A = []
  cnt = 2
  while cnt <= N:
    A.append(cnt)
    cnt += 2
  print(len(A))
  print(*A)
```

AC 3:12

[B問題](https://atcoder.jp/contests/arc198/tasks/arc198_b)

両隣の数のうち、${A_i}$未満の数がちょうど${A_i}$個
ちょっと考えると、0は最強(隣にどんな数を並べてもいい)と分かるので、それをベースに考察する。具体的には、ゼロとゼロの間の数の並びについて考える。
すると、以下の5パターンの組み合わせしか作れないことが分かる。
…0…
…0 2…
…0 1 1…
…0 1 2…
…0 1 2 1…
たとえば、上から二番目と一番下を組み合わせると、0 2 0 1 2 1となる。
※1の個数が奇数個のときは2を消費しなければいけない事を忘れずに。よって、これを適切に実装する。
[提出コード](https://atcoder.jp/contests/arc198/submissions/66161459)(python,397ms)
```python
#0121
#011
#021
#02
#0
T = int(input())
for i in range(T):
  X,Y,Z = map(int,input().split())
  mz = Z
  a = Y//2
  Y -= a*2
  Z -= a
  X -= a
  if(Y == 1):
    if(mz == 0):
      print("No")
      continue
    X -= 1
    Z -= 1
    Y -= 1
  if(X >= Z and X >= 0):
    print("Yes")
  else:
    print("No")
```

AC 32:44 (+2WA)

コンテスト終了&感想

C問題が解けなかったのは悔しかった。まあ、青パフォを出せたのでこれは勝ちと言っていいでしょう。対戦ありがとうございました。

603位 perf : <font color = "0000dd">1603</font>
rating:<font color = "00ced1">1322</font> → <font color = "00ced1">1354</font> (+=32)