OmniAICreator/Qiita-1.07M huggingface dataset:
【初心者向け】Gitで変更ファイル・差分を確認する方法


## はじめに
こんにちは！今回は、Gitで異なるブランチ間の変更点（差分）を確認する方法を初心者向けに説明します！

新卒エンジニアの私は、実行環境とmainブランチにマージするファイルの場所が異なるケースがありました。
「ちゃんと正しい場所を編集できているか？」「mainと比べて何が変わったのか？」を確認するためにGitの差分機能を活用しています。

また、ビルド前に明らかなミス（不要なファイル変更や削除）をチェックできるのも大きなメリットです。

できるだけレビューで指摘される前に自分で問題点を見つけましょう！:star2:

## なぜ差分確認が大切なの？
Pull Requestを出す前に自分の変更内容をしっかり確認することはとても大切です。
特に：
- コミット数が多くなった時
- いろんなファイルを変更した時
- 変更内容が複雑で混乱しやすい時

## 基本のコマンド
### 作業中のファイルの差分を確認
```bash
# 変更したけどまだaddしていないファイルの差分
git diff

# addしたけどまだcommitしていない変更の差分
git diff --staged
```

### ブランチ間の差分を確認
```bash
# mainブランチと現在ブランチの差分を確認
git diff main..[ブランチ名]
```
- `+` で始まる行：[ブランチ名]で追加された行
- `-` で始まる行：[ブランチ名]で削除された行

## わかりやすく差分を確認するテクニック
### 変更されたファイルの一覧だけを見る 
```bash
git diff --name-only main..[ブランチ名]
```

### 変更の統計情報を見る
```bash
git diff --stat main..[ブランチ名]
```

### 特定のファイルの差分だけを確認
```bash
git diff main..[ブランチ名] ファイル名
```

## 視覚的に確認
コマンドラインが苦手な方は、視覚的な方法も使えます：

### GUIツールを使用
```bash
git difftool main..[ブランチ名]
```

### 仮プルリクエストで確認 ✅ 最もわかりやすい！
各プラットフォームでは、実際にプルリクエストを発行せずに差分を視覚的に確認できます：

<font color="LightGreen">**GitHubの場合:**</font>
1. ブランチをプッシュ後、リポジトリページにアクセス
2. 「Pull requests」→「New pull request」をクリック
3. ベースブランチ(mainなど)と比較ブランチを選択
4. この段階では「Create pull request」ボタンを押さず、差分だけを確認
5. 必要に応じて「Files changed」タブで詳細な差分を確認

<font color="Pink">**GitLabの場合:**</font>
1. リポジトリページで「Merge requests」→「New merge request」をクリック
2. ソースブランチとターゲットブランチを選択
3. 「Compare branches and continue」をクリック
4. 差分の確認だけなら「Submit merge request」を押さずに確認可能

<font color="LightBlue">**Azure DevOpsの場合:**</font>
1. リポジトリページで「Pull requests」→「New pull request」をクリック
2. ソースブランチとターゲットブランチを選択
3. この段階で自動的に差分が表示される
4. 必要に応じて「Files」タブで詳細な差分を確認
5. 確認だけの場合は「Create」ボタンを押さずに閉じる

これにより、実際のPRと同じ形式で差分を確認できるため、非常に直感的で分かりやすいです！
~~むしろこれだけで全然いいので、前述したコマンドの意味が....~~

:::note warn
ただし、PRを作成した後に変更を確認して編集することはおすすめしません。
あくまで仮PRの段階で差分をしっかり確認しましょう。
:::

### PR後に編集するデメリット
- コミットが増えるとレビュー履歴が複雑になる
- 「修正済み」と思われた問題点が実は修正されていないことがある
- コードレビューのやり取りが長引く可能性がある

## 📝 よく使うオプション
| オプション | 内容 |
|------------|------|
| `--name-only` | 差分があるファイル名のみを表示 |
| `--stat` | ファイルごとの追加・削除行数を表示 |
| `--shortstat` | 全体の変更数だけを簡潔に表示 |

## 補足ポイント
- `main..ブランチ名` は「mainを基準にして、ブランチ名で何が変わったか」を表す
- `main...ブランチ名`（3点リーダー）は別の用途（共通の祖先からの差分）
- ブランチ名に特殊文字が含まれる場合は、クォートで囲む

## 最後に
基本コマンド「`git diff ブランチA..ブランチB`」を覚えておけば、多くの場面で活用できます。PR作成前に差分を確認する習慣をつけることで、より円滑な開発フローを実現しましょう！
Salesforce 認定Integration アーキテクト 受験レポート

## 1. 受験の経緯
昨年8月、9月に取得したアプリケーションビルダー、デベロッパーの認定取得に引き続き学習を継続しました。

## 2. 学習方法
### ①Trailhead 
[【Salesforce公式】Architect Journey: Integration Architecture Trailmix](https://trailhead.salesforce.com/ja/users/strailhead/trailmixes/architect-integration-architecture "Trailhead")
　インテグレーションパターンの種類とパターンごとのユースケース、ベストプラクティスを学習しました。一通り学習して5日程度かかりました。
　学習範囲としては外部システムとのデータ接続に関するナレッジが大半を占め、REST API、SOAP、メッセージング、ETL等を使用した実装パターンが多く登場しました。これまでの業務経験で触れてきたクラウドサービス(AWS、Azure)におけるサーバーレスアーキテクチャの知識や、金融・証券系のJavaアプリケーション開発で取り扱ったIBM ESB(MQなど)、ETL、その他Webアプリケーション開発で使用したREST APIに関する基礎知識がある程度あったおかげで、Salesforceと外部システムのインテグレーションパターンと実装についての理解をスムーズに進めることができたと思います。
 
### ②過去問＋公式ドキュメント
　ネットに出回っている問題を実施。非公式のものが多かったためURLの掲載は割愛します。約200問の問題を解きました。
 　英語もしくは直訳のものが多く、同じ内容の問題でもサイトによって回答が異なるものが多いので注意が必要でした。note等で有償で公開しているブログもありましたが利用しませんでした。また問題の解説がされているサイトはほとんどなかったため、ChatGPTに設問の解説をさせて、キーワードについてはこれまのでの試験対策と同様に公式ドキュメントを確認しました。
　
## 3. 試験結果

　受験日　：2025年3月23日(日)
　所要時間：44分（105分）
　結果　　：合格

| セクション  | 正答率 |
|:-----------|:------------:|
| Evaluate the Current System Landscape (現在のシステム環境の評価)| 75%        |
| Evaluate Business Needs (ビジネスニーズの評価)| 83%        |
| Translate Needs to Integration Requirements (ニーズからインテグレーション要件への変換)| 78%        |
| Design Integration Solutions (インテグレーションソリューションの設計)| 88%        |
| Build Solution (ソリューションの構築)| 76%        |
| Maintain Integration (インテグレーションのメンテナンス)| 60%        |

## 4. まとめ
　試験の問題内容はシンプルなもの多く、覚えていれば回答できる問題が多数でした。
　設問で与えられた情報に対してその場で思考したり、計算するといった問題はほとんどありませんでした。
　試験範囲が明確に定義されたインテグレーションパターンとそれに対する具体的な実装とベストプラクティスなので、学習していれば簡単に答えられるものが多かったです。

　次回はアーキテクトロール、デベロッパーロールの認定を受験しようと思います。
ビジネスサイドに届いて欲しいスラング11選

# 概要
以下の内容はエンジニア同士の会話で出てくるものですが、横耳で聞いていたら意味のわからない言葉が多いと思いますので解説します。

たまに日常会話にも使ってしまうものもあるのでその時は「あぁこう言ってんだな」と解釈してください。

## 1. 技術的には可能です

表向きの意味は「技術的にはできる」ですが、裏には「コストやリスクを考えるとやりたくない」というニュアンスが込められていることが非常に多いです。

わかりやすくいうと無理です。止めて。

https://dic.nicovideo.jp/a/%E6%8A%80%E8%A1%93%E7%9A%84%E3%81%AB%E3%81%AF%E5%8F%AF%E8%83%BD%E3%81%A7%E3%81%99

## 2.「完全に理解した」「何もわからない」「チョットデキル」

完全に理解した → 初心者
何もわからない → 中級者 ~ 上級者
チョットデキル → 神

という意味合いで使われます。
似たものとして「ダニングクルーガー効果」「素人質問で恐縮ですが」といったものがあります。

## 3. 嘘つきました

実際に嘘をついたわけではなく、以前伝えた内容に事実と異なる意味があったということを言っています。

## 4. 叩く、投げる、こ⚪︎す、キック、握る

これは暴力行為ではありません。対象は人ではなく application やそのプロセスに対して使われます。

データを更新、取得する → 「APIを叩く」「requestを投げる」
終了させる →「プロセスをkillする」
開始する → 「キックする」
方法などを確定させる → 「握る」

## 5. メロンとメロンパンぐらい違う

「JavaとJavaScriptって何が違うの?」と聞かれた時返答するためにある言葉です。

すみません。嘘つきました。
現実世界であまり使うこともないですし、使ってる人も見ないですが試しに知り合いのエンジニアに冒頭の質問を投げかけてみてください。

## 6. BFF

「Best Friends Forever」の略ではありません。
「Backend for Frontend」の略で、フロントエンド用に最適化されたバックエンドのことを指します。

似たような間違いとして「openapi」と「openai」があります。
これらはメロンとメロンパンぐらい違います。

## 7. GitHubが落ちたので退勤します

これは本当に困っているわけではありません。GitHubを使った開発をしていると困ることはあるのですが、99%ぐらいの人は困っていません。
いわゆる障害に分類されるものですが、一種のお祭り感があるので関係性薄い人がオタクの悪ノリとしてはしゃいでいるんだと思ってください。

本当に困ってる人がいる現場や同僚がいれば空気を読んで言いません。多分。

また、関連して「GitHubが落ちているのではない。我々が上昇しているのだ。」ともいいます。
これは孫正義のポストを文字ったものです。

https://x.com/masason/status/288641633187147776

## 8. エスパー

経験則などの主観的なものによる勘 のことを指します。
できる限り客観的な事実を基に事象を解明していくのが仕事のため、「情報が不足していて客観的な事実が提示できませんが、これまでの経験則を踏まえると~~」のような意味合いが含まれます。
こう書くとめんどくさいなエンジニア。

## 9. 秘孔をつく

元ネタは北斗の拳ですが、ちょっとした変更で致命的な影響を与えた時に使います。
例文としては、障害対応に対して
「これはエスパーですが、〇〇と△△の変更が当時に入ったことで秘孔をついてしまった可能性があります。」
といった使われ方をしています。

## 10. 何もしてないのにこわれた

これには2通りの意味があります。

- 本当に壊れるようなことはしていないのに壊れた
- こんなことで壊れるのかよwwwという自嘲行為

似たような類義語として「何もしてないのに直った」があります。

## 11. hoge

「hoge」は、コードのサンプルや変数名として使われる定番のダミー文字です。
特に意味はなく、`ほにゃらら` と同じようなものです。
「fuga」も同様にダミー名として使われます。英語では「foo」が該当します。

ちなみに僕は初めて知りましたが、hogeの起源は1984年らしいです。
https://www.manicyouth.jp/hoge/
【Ruby】privateメソッドって外部から呼び出せるんだ...

以下のようにクラス,メソッドが定義されていたとすると、、、

```rb
class Sample
    def public_method
        p 'public!'
    end

    private

    def private_method
        p 'private'
    end
end
```

以下は、いつものように呼び出せる

```rb
Sample.new.public_method
```

しかし、プライベートメソッドは呼び出せない

```rb
Sample.new.private_method #=> エラーが発生する
```

ただし、以下のようにすることで呼び出せる

```rb
Sample.new.send(:private_method)
```

Railsなどで使うのはあまり良くないですね。
イギリス出身のソフトウェアエンジニアが日本で初めて仕事をして気づいたこと


## ✨ グローバルな機会

グローバル化が進む現代では、異なる国やタイムゾーンをまたぐシームレスなコラボレーションが、プロジェクト成功のカギを握っています。普段TechReisでは日本のクライアントと仕事をすることが多いのですが、今回は特別な機会を得て、日本にいながらイギリスのIT企業と共同でプロジェクトに取り組みました。

この記事では、日本と海外の契約で仕事をする上での興味深い違いや、直面した課題、そしてそれをどう乗り越えたのかについてシェアしたいと思います！


## 🗾 日本に来た理由とその魅力

高校時代から日本に憧れていました。イギリスの田舎町で育った自分にとって、日本はまるで別世界。両国には共通点も多いですが、現代の日本は時にまったく異なる文化圏のように感じられます。

日本の公共交通機関の便利さ、最先端の都市景観、そして歴史ある風景や文化。すべてを自分の目で見てみたくて、日本語を独学しながら、夏に訪れるために貯金しました。

| ![unnamed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043623/e85b5bf7-8023-4d2a-b79b-b415c3a94683.png) | 
|:--:| 
| *典型的なイギリスの田舎町の例* |

初めての訪問がきっかけで毎年のように日本へ行くようになり、そのたびに新しい友達ができたり、新しい場所を巡ったりして、日本の文化や食べ物、ライフスタイルにどんどん惹かれていきました。

広島焼や北海道の新鮮な魚介類など、日本の多彩な食文化を味わいながら、イギリスの肉と穀物が中心の食生活との違いを実感。特にお好み焼きと仙台名物の牛タンにはどハマりしました。イギリスで牛タンを勧められても絶対に食べなかったと思いますが、日本ではなぜか美味しく感じるんですよね（笑）。

イギリスの石造りの町並みも美しいですが、日本の「伝統」と「近代」が共存する風景は、どこか懐かしくも新しい印象を受けました。とはいえ、自分は昔ながらの雰囲気が好きなので、結局は静かな郊外や田舎のエリアに惹かれ、最終的に（個人的には最高に住みやすいと思っている）東北地方に落ち着きました。

最初は日本に永住するつもりはありませんでしたが、「数年間はチャレンジしてみたい」と思っていました。そして、2022年についに6カ月間の留学のチャンスを得ました。その経験を通して、日本の多様性——歴史的な美しさ、気候の違い、文化の豊かさ——をより深く理解できました。そして何よりも大きな出来事として、その期間に現在の妻と出会いました。

## 💻 日本からグローバルに働く

今回のイギリス企業とのプロジェクトでは、フルスタック開発を担当し、機密性の高い顧客データを扱うアプリケーションの開発をサポートしました。

このような海外案件において、まず直面するのが「言語の壁」。TechReisには英語を話せるメンバーもいますが、英語ができないと海外案件に挑戦できないと思っている方も多いのではないでしょうか？

実はそんなことはありません！

英語が話せなくても、他のエンジニアやリーダーと連携して進めることができますし、最近はリアルタイムのAI翻訳ツールもかなり進化していて、理解のハードルはどんどん下がっています。

もう1つの大きな課題が「時差」です。例えば、日本とイギリスの時差は9時間。日本の9:00〜18:00の勤務時間は、イギリスでは深夜0:00〜9:00になります。

「これってコミュニケーションがめちゃくちゃ大変じゃない？」と思うかもしれません。

でも、実はこの時差をうまく利用すると、24時間体制で開発やサポートが可能になります。もちろん、お互いの都合に合わせて調整する必要はありますが、GitHubやGitHub Issuesを活用したタスク管理や進捗共有、Microsoft Teamsでのミーティングを導入することで、問題なく進めることができました。

特に今回は、毎日18:00（日本時間）に15分程度の進捗報告ミーティングを行うことで、双方が無理なくコラボレーションできる形を確立できました。

| ![unnamed (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043623/67bc14ec-c84c-4b4a-8c2d-ab2ebc95c20a.png) | 
|:--:| 
| *ビデオチャットツールによって世界中どこからでもリアルタイムでコラボレーションが可能* |

意外と見落としがちなのが「海外との支払い処理」。国をまたぐ仕事では、契約時に支払い方法や税金の処理をしっかり決めておくことが大切です。

幸い、最近はWiseのようなサービスを使えば、海外のデジタル口座を開設し、クライアントが国内送金と同じように支払いできる環境を作ることができます。今回の案件でもこの方法を活用し、クライアントから「国内の企業と変わらない感覚で支払いができた」と好評でした。

## 📊 日本 vs. 海外：働き方の違い

日本と海外のソフトウェア案件を経験したことで、以下のような違いを感じました。

### 海外案件の特徴

- **高リスク・高リターン**：海外のクライアントは「この人じゃないとダメ！」というレベルのスキルを求めがち
- **柔軟な働き方**：特に小規模な企業では、技術力だけでなく新しいスキルをどんどん学べる環境がある
- **給与が高い**：欧米の契約は日本の2倍以上の報酬が一般的で、高責任ポジションではさらに高額になることも

### 日本企業の特徴

- **安定性**：仕事の進め方が明確で、長期的な視点でキャリアを築きやすい
- **技術の変化がゆるやか**：最新技術の採用は遅めだが、その分しっかりとしたプロセスがある
- **信頼重視**：一度関係を築けば、長期的な信頼関係が続きやすい

## 🔮 まとめ & 今後の展望

このプロジェクトを通じて、自分がなぜ日本に来たのか、そして海外の働き方の良さも改めて実感しました。

日本の「安定」と海外の「挑戦」の両方の良さを活かしながら、今後も日本と海外の案件をバランスよく取り組んでいきたいと思います！

もしこの記事が少しでも参考になったら、ぜひコメントであなたの意見も聞かせてください！🎉

Tech Reisでは、一緒に挑戦するソフトウェアエンジニア、PdM、デザイナーを募集しています。興味を持っていただけた方は、まずはカジュアル面談で気軽にお話ししましょう！
https://techreis.co.jp/ja
IBM i Services Directory : QSYS2.HTTP_Server_Info ビュー

IBM i の標準HTTPサーバーはApacheベースです。これ以外に（たしか）IBM i 7.4以降ではnginxもサポートされています。
寄り道ですが、ApacheベースのHTTPサーバーは IBM i のライセンスプログラム（P.P:Program Product) 5770-DG1 IBM HTTP SERVER FOR i を導入することで利用可能になります。対してnginxはyumから一般のossとして導入し利用します。 
このIBM i サービスは実行中のApacheベースのHTTPサーバーインスタンスの情報を返します。

## 概要
■ビュー名：HTTP_SERVER_INFO
■カテゴリ：通信サービス
■サポート：IBM i 7.3 SF99703 Level 18以降
■参照URL（IBM i 7.5）：https://www.ibm.com/docs/ja/i/7.5?topic=services-http-server-info-view

## 実行例①
```
SELECT * FROM QSYS2.HTTP_SERVER_INFO　WHERE SERVER_NAME = 'ADMIN';
```

インスタンス名が ADMIN のHTTPサーバージョブ情報を返します。
実行例がこちら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/3dac4bc5-cb6f-45f2-b0c2-b03f653e0a11.png)

JOB_NAME がIBM i 上のジョブ名ですね。877069/QTMHHTTP/ADMINなど。
SERVER_NORMAL_CONNECTIONSがSSL/TLSでない接続総数、SERVER_SSL_CONNECTIONSがセキュアな接続総数です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/272018de-251c-4c8b-a1bb-2a403a7f29d4.png)

REQUESTS, RESPONSESはそれぞれ受信したリクエスト総数とそのレスポンス数です。


## 補足
### 同じ情報を5250から確認してみる
ところで上記マニュアルリンクには、、
```
システム名は HTTP_SRVR です。 スキーマは QSYS2 です。
```
と記載されているので、HTTP_SERVER_INFOビューのオブジェクト名はライブラリー：QSYS2、オブジェクト名（LF名）：HTTP_SRVR だと分かります。
たとえば5250からRUNQRYコマンドで検索することも出来ます。

```
RUNQRY *N QSYS2/HTTP_SRVR
```

実行結果はこのようになります。基本的に同じカラムです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/550a68b8-191d-4cb9-882c-8b87dacc312a.png)

### 同じ情報をNavigator for i から確認してみる。
更に上記マニュアルには
```
表関数の結果列に戻される値は、 IBM Web Administration for i GUI のリアルタイム・サーバー統計によって示される値と似ています。
```
とあります。こちらのNavigator for i からの確認方法は、、

Navigator for i にログインして、
左列のメニューアイコンから ブックマーク を開いて、 IBM Web Administration for i を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/9002e00c-90ee-4d50-80ac-7b805e089df0.png)

すると次のように別ウィンドウが開いて、以下のような情報が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/c355a09c-4e45-4655-9c94-27fcdd18e51e.png)

HTTP_SERVER_INFOビューで提供するのは上記中でアクティブ（状況が実行中）のものです。
Notionの便利さに今更気づいた話

この記事を開いていただきありがとうございます。
今回の記事では、Notionの良さに今更気づいた話を書いていこうと思います。

# これまでのメモの取り方
これまでは、自分自身でメモを取るときはGoogleドキュメントもしくはVSCodeでメモをとっていました。

# 課題点
課題点としては、数が多くなってきたときに、フォルダにまとめないと検索しない限り、探すのが大変なところがありました。

# Notionの便利なところ
Notionの存在はこれまでも知っていましたが、使ったことはありませんでした。
新規案件のレクチャーのマニュアルでNotionが共有され、実際に確認したところ、とても便利なことに気づきました。
* 一つのページだけでなく、複数のページと連携できるところ
* 目次のように一つのページ内でもリンクをつけることで、末尾の方の項目にもすぐに移動できるところ
* AIの活用により、自分が理想とする構造を簡単に作成できるところ
* 単にメモを取るだけでなく、ToDoリストや表など、多様な活用方法があるところ

など。
様々な活用方法があることを知り、今後活用していきたいと思いました。

# 最後に
案件ごとに活用しているツール等が異なる場合、新規案件に入ることで、使ったことのないものに出会うことは少なくありません。
今回、私はNotionの便利さを知り、少し使いにくい部分はありますが、スクリーンリーダーユーザーでも使えることが分かったので、今後活用していきたいと思いました。
最後まで読んでいただきありがとうございました！
HP作成備忘録：ホームページの配色を調整するために、ヘッダーを白く、背景をグリーンにしてみた

## はじめに

企業サイトや事務所サイトなどを制作していると、ブランドカラーや視認性を意識した配色調整が必要になることがあります。

:::note note
**個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**
:::

今回は、ヘッダーの背景を白色（#ffffff）に、ページ全体の背景を深いグリーン（#3d843d）に変更する方法についてご紹介します。

## 書こうと思ったきっかけ

事務所サイトを制作していた際、「ロゴをもっと目立たせたい」「ページ全体にブランドイメージを持たせたい」と考えたことがきっかけです。

ヘッダーとボディの配色を調整することで、視認性とデザインの印象が大きく変わることに気づきました。

## 変更の目的

- ヘッダーは白背景にすることでロゴやナビゲーションが見やすく
- ボディはブランドカラーのグリーンをベースにして印象づけ

## 具体的なCSS修正内容

### bodyの背景色を変更
```css
body {
  background-color: #3d843d;
  color: #333;
}
```
このコードによって、ページ全体の背景が落ち着いたグリーンになります。

### headerの背景色を白に変更
```css
header {
  background-color: #ffffff;
  color: #333;
}
```
白背景に変更することで、ロゴ画像やナビゲーションメニューがより視認性の高いものになります。

:::note warn
**文字色も合わせて #333（濃いグレー）などにするとバランスが良くなります。**
:::

### header, footer をまとめて指定している場合の対応

以下のようなCSSがある場合は、個別に header と footer に分けてスタイルを指定しましょう。

#### 修正前
```css
header, footer {
  background-color: #ffcc80;
  color: #fff;
}
```

#### 修正後
```css
header {
  background-color: #ffffff;
  color: #333;
}

footer {
  background-color: #ffcc80;
  color: #333;
}
```

## 変更後のイメージ

- ヘッダー：白くてすっきりした印象、ロゴが映える
- 本文背景：ブランドカラーである深いグリーン
- 全体の印象：清潔感と信頼感のあるデザインに

## おわりに

配色の変更は、デザインの印象を大きく左右します。

:::note info
***今回のように「白とブランドカラー」の組み合わせは、見やすさと個性の両立ができるため、非常におすすめです。***
:::

今後も必要に応じて、フォントやボタンの配色なども調整していくと、より魅力的なサイトになるかと思います！
VPSにOS再インストールした後SSH接続すると、WARNING: REMOTE HOST IDENTIFICATION HAS CHANGEDがでたので対処法

# はじめに
さくらVPSを使ってサーバー構築を練習しています。
以前構築したものをやり直したかったので、OSの再インストールを実行しました。
その後SSH接続すると、下記警告が表示されてしまいました。

対応内容と、openssh操作について深堀りしたのでまとめておきます。

```bash
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
```

# 環境
- MacBook Pro M2（macOS Sonoma v14.0）
- OpenSSH_9.3p2
- LibreSSL 3.3.6


# 問題
OS再インストールを行うと、サーバー側のホストキーが更新される。
その状態でSSH接続すると、私のPCの`known_hosts`に保存しているホストキーと合わない、そのため接続しようとしているサーバーが、異なるホストキーを見せてきているという警告メッセージが表示される。

# 解決方法
openSSHを使って、問題を解消。
`known_hosts`に保存されている、接続しようとしているサーバーのホストキー情報を削除して書き換える。

1.known_hostsファイルを確認する
下記コマンドを実行すると、ホストキー情報が保存されていることがわかります。
```
cat known_hosts | grep domain
```

2.known_hostsファイルからホストキー情報を削除する
```
ssh-keygen -R domain
```

3.ssh認証を行う
ホストキーが削除できたら、SSH接続を行います。
これで新しいホストキーが`known_hosts`に保存されます。

```
ssh username@domain
```
問題自体はこれで解決できたと思います。

# [おまけ]公開鍵暗号認証設定を行う
ここから先はおまけです。
sshを使ったパスワード認証はできるようになったので、公開鍵認証にしてよりセキュアにします。

1.公開鍵/秘密鍵を生成する
セキュリティの堅牢度合いは調整してください。
コメントに何を書くべきかは、あまり分かりませんでしたので、適当に書いています。

生成時に、ファイル名を入れるか
パスフレーズをどうするか確認されます
```
ssh-keygen -t ed25519 -a 100 -C "sakura_vps serverA"
```

2.生成した鍵をVPSサーバーに登録する
下記コマンドを実行すると、パスワード認証が行われます。
パスすると、指定した公開鍵情報が`.ssh/authorized_keys`に保存されます。

```
ssh-copy-id -i identity_file user@domain
```

接続して確認しましょう。
この時にファイルの権限も確認します。
600になっていれば良いと思います。なっていなければこの段階で変更しましょう。
```
ssh user@domain
password:

cat ~/.ssh/authorized_keys
```
3.接続用設定ファイルを作成する
`~/.ssh/config`というファイルを作成するとssh接続時に、このファイルを読み込んでくれます。

誰にでもいじられると困るので、一番使うユーザーだけで変更できるようにしておきます。
```
touch ~/.ssh/config
sudo chown username
sudo chmod 600 ~/.ssh/config 
```

4.設定を記述する
`~/.ssh/config`に以下の記述をします。

```bash
Host host（好きな名前）
    HostName ドメイン
    User ユーザー
    Port ポート
    IdentityFile 公開鍵パス
    PasswordAuthentication パスワード認証を使用するか
    AddKeysToAgent ssh-agentに追加するか
    IdentitiesOnly 使用できるIdentityFileを固定するか

```

5.公開鍵暗号認証を通す
設定が完了したら、公開鍵暗号認証を通します
`config`ファイルのreloadは不要です。

セッション開始時は、パスフレーズの入力を求められます。
これ以降、セッションが切れるまでパスフレーズ入力を省略することができます。
```
ssh host
Enter passphrase for key '/Users/user/.ssh/host': 
```

6.ssh-agentセッションの確認
`ssh-add`コマンドを使うと、現在SSH Agentセッションに登録されているすべての鍵のリストが表示されます。

セッション中に使用できる鍵の確認や、鍵がエージェントに正しく追加されているか確認するときに使います。

```
ssh-add -l
```

鍵をssh-agentから削除するときは、下記を実行すると削除できます。
```
ssh-add -d IdentityFile
```

# 参考にさせていただいたもの
https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/pdf/securing_networks/red_hat_enterprise_linux-8-securing_networks-ja-jp.pdf

AI cloude3.7 sonnet
【AWS】EC2 インスタンス購入オプションの種類と使い分け

# はじめに
EC2 インスタンスには、さまざまな購入オプションが用意されており、ワークロードの特性やビジネス要件に応じて最適な選択が可能です。この記事では、各購入オプションの特徴と適した使用ケースを記載します。

https://aws.amazon.com/jp/ec2/pricing/

# 1. オンデマンドインスタンス
オンデマンドインスタンスは、必要なときにインスタンスを起動し、使用した分だけ料金を支払う従量課金制のオプションです。長期契約や前払いの必要がなく、柔軟性が高いです。

https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-on-demand-instances.html

適したユースケース:

- 短期間のシステムやテスト・開発環境の構築
- 将来のリソース需要が予測できない場合
- 一時的な高負荷や予測不能なワークロード

# 2. Savings Plans
Savings Plans は、1年または3年の期間で一定の使用量（1時間あたりの課金額）を契約することで、オンデマンド料金と比較して最大72%のコスト削減が可能なプランです。

https://docs.aws.amazon.com/savingsplans/latest/userguide/what-is-savings-plans.html

適したユースケース:

- 長期的な予算計画とコスト管理が必要な場合
- 継続的な使用が見込まれるワークロード
- 最新のコンピューティングサービスをコストを抑えて活用したい場合
- EC2 だけでなく、Fargate や Lambda も利用する場合
- インスタンスファミリーやリージョンの変更が想定される場合

# 3. リザーブドインスタンス
リザーブドインスタンスは、1年または3年の期間で特定のインスタンスタイプとリージョンを予約購入するオプションです。オンデマンドインスタンスに比べて最大72%の割引が適用され、コスト削減に有効です。

https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-reserved-instances.html

適したユースケース:

- 長期間稼働が必要な本番環境
- 将来のリソース需要が予測可能な場合
- 安定したキャパシティが必要なワークロード

:::note
Savings Plans と リザーブドインスタンスとの違い

- Savings Plans: AWS の Compute サービス全体（EC2、Fargate、Lambda など）に適用でき、リージョンやインスタンスファミリーの変更が可能
- リザーブドインスタンス: 特定のインスタンスタイプとリージョンに対して適用され、柔軟性が低いが Savings Plans よりも割引率が高い
:::

# 4. スポットインスタンス
スポットインスタンスは、AWS の未使用キャパシティを活用することで、オンデマンド価格より最大90%の割引を受けられるオプションです。ただし、需要の変動によりインスタンスの実行を停止される可能性があります。

https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-spot-instances.html

適したユースケース:

- ビッグデータ処理や大規模データ解析
- コンテナ化されたワークロード
- CI/CDワークロード
- 中断に耐えられるバッチ処理ジョブ

# 5. ハードウェア専有インスタンス（Dedicated Instances）
ハードウェア専有インスタンスは、AWS の物理サーバー上で単一の顧客専用にプロビジョニングされるインスタンスです。このインスタンスは、特定の物理サーバーに対して専有されますが、後述する専有ホストとは異なり、インスタンス単位で提供され、ホスト全体の管理やリソース割り当てはAWSによって行われます。

https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/dedicated-instance.html

適したユースケース:
- マルチテナント環境を避けたい場合
- ライセンス持ち込み（BYOL）が必要なソフトウェアを使用する場合
- 規制やコンプライアンス要件を満たす必要があるワークロード

# 6. 専有ホスト（Dedicated Hosts）
専有ホストは、特定の物理サーバーを専有し、その上でインスタンスを実行するオプションです。ハードウェア専有インスタンスとは異なり、専有ホストでは、物理サーバー全体を顧客が管理・制御できるため、インスタンスの配置やリソースの使用を細かく調整することができます。また、専有ホストはライセンス持ち込み（BYOL）に特に適しています。

https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/dedicated-hosts-overview.html

適したユースケース:
- ソフトウェアライセンスの持ち込み（BYOL）が必要な場合
- セキュリティとコンプライアンス要件が厳しい環境
- 物理サーバーレベルでのリソース制御が求められる場合

# 7. キャパシティ予約
キャパシティ予約は、特定のアベイラビリティーゾーン内で EC2 インスタンスのキャパシティを予約するオプションです。スポットインスタンスのように中断されるリスクがなく、リザーブドインスタンスのような割引契約は不要です。

https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/capacity-reservation-overview.html

適したユースケース:
- ピークトラフィックの対応
- 重要なイベントやリリース時のキャパシティ確保
- 高可用性が求められるワークロード

# まとめ
EC2 の購入オプションには、それぞれ異なる特性があります。以下のポイントを考慮して最適な選択を行いましょう。

- 柔軟性重視 => オンデマンドインスタンス
- コスト最適化 + 柔軟性 => Savings Plans
- コスト最適化 + 低リスク => リザーブドインスタンス
- 大幅なコスト削減 + 一時的なワークロード => スポットインスタンス
- 専有環境 => ハードウェア専有インスタンス / 専有ホスト
- キャパシティ確保 => キャパシティ予約

適切な購入オプションを選択し、AWS のコストを最適化しましょう。

# 参照
- [Amazon EC2 料金表](https://aws.amazon.com/jp/ec2/pricing/)
- [Amazon EC2 billing and purchasing options](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-purchasing-options.html)
【Chrome Extension MV3】fetch の Header Referer を設定する方法

Chrome Extension 内で実行される fetch の Header に Referer を設定したかった。
GoogleとかChatgptとか使って調べまくったけど、全然できなくてハマった。

不幸な人を増やしてはいけないと思ったのでSEOが強いQiitaにメモっておきます。

```javascript
chrome.webRequest.onBeforeRequest.addListener(() => {
    const rules = [
      {
        id: 1,  
        priority: 1,
        action: {
          type: 'modifyHeaders',
          requestHeaders: [
            {
              header: 'Referer',  
              operation: 'set',
              value: 'https://foo.com/'  
            }
          ]
        },
        condition: {
          urlFilter: 'https://bar.com/*' 
        }
      }
    ];
  
    chrome.declarativeNetRequest.updateDynamicRules({
      removeRuleIds: [1], 
      addRules: rules 
    }, () => {
      if (chrome.runtime.lastError) {
        console.error('Failed to set rules: ' + chrome.runtime.lastError.message);
      } else {
        console.log('Rules have been successfully set.');
      }
    });
  },{urls: ["https://bar.com/*"]});
```

* manifest.json の permissions に webRequest, declarativeNetRequest を忘れず追加する。
* このコードだとリクエスト発生の度にルールを設定するようになっている(開発用)
* リリース版は onStartup, onInstalled のタイミングで addListener すればいいと思う。
【備忘録】UbuntuからWindowsインストール用のUSBを作成する方法

<b>注意: ddやcpで直接isoイメージをコピーしても起動時にデバイスドライバーが無いって怒られるのでやめておく<b>
1) Virtual boxをインストール(vboxusersグループに追加も忘れずに)<br><br>
2) Windows 10 x86 US ISO をダウンロード(VMのRAMは2Gにするとよい。∵1GだとUSBに焼いている途中でクラッシュするｋ)<br><br>
3) Windows 10をインストール usbをアタッチせずに<br><br>
4) Windows VM内でWindows 10インストールメディアをダウンロード<br><br>
5) Usbをアタッチ<br><br>
6) インストールメディア作成ツールでwindows10をインストール(言語を日本に設定
∵US版であとからIMEを設定するの大変)<br><br>
Kali Linux 2025.1a Release (2025 Theme, & Raspberry Pi)

# はじめに
2025年3月19日、[Kali Linux 2025.1a Release (2025 Theme, & Raspberry Pi)](https://www.kali.org/blog/kali-linux-2025-1-release/)の通りにKaliの新しいリリースが公開されています。

2025年最初のリリースでは、機能強化と改善によってユーザーエクスペリエンスが向上しています。詳細については、上記公式のブログ記事をご参照ください。

本記事では、今回のアップデート内容の一部について記載しています。

## アップデート方法
公式ドキュメントの[Updating Kali](https://www.kali.org/docs/general-use/updating-kali/)を踏まえて、Kaliのアップデート方法を以下に記載します。

前提として、`/etc/apt/sources.list`が適切に設定されていることを確認した上で以下のコマンドを実行します。

`$ sudo apt update`
`$ sudo apt full-upgrade -y`

上記コマンド実行後、OS再起動を行います。
OS再起動後、`/etc/os-release`ファイルを参照してディストリビューションのバージョンが更新されたことを確認します。

`$ grep VERSION /etc/os-release`

```console
VERSION_ID="2025.1"
VERSION="2025.1"
VERSION_CODENAME=kali-rolling
```
## 2025 Theme Refresh
毎年恒例のテーマ更新が行われています。

ブートメニュー、ログイン画面、Kali及びKali Purpleエディションの両方で新しい壁紙が追加されました。以下は新しいデスクトップのテーマです。

![スクリーンショット 2025-03-20 21.58.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/0524b644-daba-4fc6-9100-2210514db10c.png)

## デスクトップ環境
今回のリリースでPlasmaの6.2バージョンが利用できる様になりました。

https://kde.org/ja/announcements/megarelease/6/

[KDE Plasma](https://kde.org/ja/plasma-desktop/)は、Linux向けの次世代デスクトップ環境です。また、KDE Plasma 6は、2024年2月にリリースされている第6世代及び現行のバージョンです。

Qt 6とKDE Frameworks 6が採用されていて、洗練されたデザイン、カスタマイズ可能なインターフェイス、プライバシーと個人データの保護を最優先にしています。

![スクリーンショット 2025-03-21 22.53.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/8d31643d-ffc9-4fdd-991b-20d56fb76c57.png)

Xfceについては、4.18から4.20にマイナーバージョンアップしました。

https://alexxcons.github.io/blogpost_14.html

ダイアログには、ディストリビューションのロゴ、使用されているウィンドウ システムと使用されているGPUに関する情報が表示されるようになりました。（Kaliの場合ロゴは表示されません）

![スクリーンショット 2025-03-20 22.25.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/777e2192-73f3-43a0-887d-af65e435b246.png)

他には、ユーザーのエクスペリエンスの向上として、キーボードショートカットが追加されています。

::: note
デスクトップ環境について、xfceからKDE Plasmaに変更したい場合は、公式ドキュメントの[Switching Desktop Environments](https://www.kali.org/docs/general-use/switching-desktop-environments/)をご参照ください。
:::

## New Tools
hoaxshellは、http(s)プロトコルを悪用してビーコンのようなリバースシェルを確立するWindowsリバースシェルペイロードジェネレーターおよびハンドラーです。

https://github.com/t3l3machus/hoaxshell/

## Kali Website Updates
[kali.org](https://www.kali.org/)に過去の壁紙やコミュニティによって作成されたユーザー作品に関するページが追加されました。

また、ドキュメントについてもさまざまな更新が行われています。

# おわりに
2025年最初のリリースは、ユーザーエクスペリエンスが大きく向上しました。

Plasmah使ったことがなかったので、この機会に使用してみたいと思います。

今年もKaliの成長を楽しみにしています。
AWSで実現するWeb3層構成とは？


Webアプリケーションの設計において、「**3層構成（3-Tier Architecture）**」は基本的かつ強力なアーキテクチャパターンです。AWSを使えば、この構成を**スケーラブルかつ高可用性**で簡単に実現できます。

---

### ✅ Web3層構成の基本

Web3層構成は、以下の3つの層で構成されます：

1. **プレゼンテーション層（フロントエンド）**
   - ユーザーからのリクエストを受け付ける
   - **例：Amazon API Gateway、Amazon CloudFront、ALB**

2. **アプリケーション層（ビジネスロジック）**
   - プログラムやロジックを実行
   - **例：AWS Lambda、Amazon ECS/Fargate、EC2**

3. **データ層（ストレージ）**
   - データの保存・取得を担当
   - **例：Amazon RDS、Amazon DynamoDB、Amazon S3**

---

### 🧩 代表的な構成例（サーバーレス）

- **API Gateway**（リクエスト受付）
- **AWS Lambda**（Javaなどのアプリ実行）
- **Amazon DynamoDB**（Key-Value型データ保存）

この構成は、**自動スケーリング・高可用性・低運用負荷**を実現し、不定期・突発的なアクセスにも強いのが特徴です。

---

### 🎯 メリットまとめ

- スケーラブルで柔軟
- 各層の独立性が高くメンテナンスしやすい
- コスト効率が良い（使った分だけ課金）
- 高可用性（マルチAZ）

---

AWSでのWeb3層構成は、**モダンなWebアプリのベストプラクティス**。要件に応じてEC2ベースにも、サーバーレス構成にも柔軟に選べるのが魅力です。

---
HP作成備忘録：ハンバーガーメニューを右上に設置してスマホ対応しました〜実装コード付き〜

## はじめに

今回は、自作のWebサイトにハンバーガーメニューを右上に設置し、スマートフォンでの表示に対応した実装例をご紹介します。

:::note warn
**個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**
:::

ナビゲーションバーが画面幅に収まりきらず崩れてしまう状況を改善するために、レスポンシブ対応の一環として導入しました。

## 書こうと思ったきっかけ

きっかけは、自分のスマホでWebサイトを確認したときに、「メニューが重なって読めない」「リンクが押しにくい」と感じたことでした。

:::note info
PCでは問題なく表示されていたナビゲーションも、スマホではUIの邪魔になっていました。
:::

そこで、「よく見るあの三本線（＝ハンバーガーメニュー）を入れてみよう」と思い、実装に挑戦しました。

## ハンバーガーメニューとは？

ハンバーガーメニューは、3本の横線で構成されたアイコンで、クリックやタップすることでメニューの開閉を行う仕組みです。
特にスマートフォンなど画面が狭いデバイスで、ナビゲーションをコンパクトにまとめておきたいときに便利です。

## 内容について（実装コード紹介）

### HTML
```html
<header>
  <div class="header-title">
    <img src="images/logo1.png" alt="ロゴ" style="height: 50px; margin-right: 10px;">
  </div>

  <!-- ハンバーガーメニュー -->
  <div class="hamburger" id="hamburger">
    <span></span>
    <span></span>
    <span></span>
  </div>

  <!-- ナビゲーション -->
  <nav class="nav-menu" id="nav-menu">
    <a href="index.html">HOME</a>
    <a href="greeting.html">代表挨拶</a>
    <a href="office.html">事務所案内</a>
    <a href="services.html">サービス案内</a>
    <a href="pricing.html">料金案内</a>
    <a href="contact.html">お問い合わせ</a>
    <a href="support-a.html">就労支援A型</a>
  </nav>
</header>
```

### CSS（style2.css に追加）
```css
/* ハンバーガーアイコン */
.hamburger {
  display: none;
  flex-direction: column;
  justify-content: space-between;
  width: 25px;
  height: 20px;
  cursor: pointer;
  position: absolute;
  top: 25px;
  right: 20px;
  z-index: 1100;
}
.hamburger span {
  height: 3px;
  background: #333;
  border-radius: 2px;
  transition: 0.3s;
}

/* ハンバーガー開閉時のアニメーション */
.hamburger.open span:nth-child(1) {
  transform: rotate(45deg) translate(5px, 5px);
}
.hamburger.open span:nth-child(2) {
  opacity: 0;
}
.hamburger.open span:nth-child(3) {
  transform: rotate(-45deg) translate(5px, -5px);
}

/* ナビゲーションの表示切替 */
.nav-menu {
  display: flex;
  gap: 15px;
}
@media (max-width: 768px) {
  .nav-menu {
    display: none;
    flex-direction: column;
    background: white;
    position: absolute;
    top: 70px;
    right: 20px;
    padding: 10px;
    box-shadow: 0 0 10px rgba(0,0,0,0.1);
    z-index: 1000;
  }
  .nav-menu.active {
    display: flex;
  }
  .hamburger {
    display: flex;
  }
}
```

### JavaScript（HTMLの末尾に追加）
```html
<script>
  const hamburger = document.getElementById('hamburger');
  const navMenu = document.getElementById('nav-menu');

  hamburger.addEventListener('click', () => {
    hamburger.classList.toggle('open');
    navMenu.classList.toggle('active');
  });
</script>
```

## まとめ

ハンバーガーメニューの導入により、スマートフォンなどの小さな画面でも快適に操作できるナビゲーションを実現できました。

:::note warn
***特にスマホユーザーの閲覧体験を損なわないUI設計は、今後のサイト制作においても重要だと感じています。***
:::

今回は基本的な開閉機能のみでしたが、アニメーションやARIA属性の追加など、さらなる改善にも挑戦していきたいと思います。
動的にMCPサーバにツールを登録したい

# 前提条件

MCP Python SDK を使用する前提で話します

https://pypi.org/project/mcp/

# 結論から先にいうと
要は `mcp.tool` デコレータに関数を渡せればMCPに登録できるので
下記のように、手動で登録しても良い。

```python
from typing import Any
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("hidamari_character")

async def get_users_favorite_hidamari_schetch_character(user_name:str) -> str:
    """get users favorite hidamari schetch character
        (ユーザー名ごとに、ひだまりスケッチの好きなキャラクターを返す)
        Args:
            user_name: ユーザー名
    """
    # Claudeが上記メソッド定義を読み込んで、いい感じに呼び出してくれる。

    if user_name == "masachaco":
        return "宮ちゃんです"

    return "該当のユーザーの情報は見つかりませんでした"

def main():
    # デコレータを手動で呼んで、関数を渡すことでも、MCPサーバーに登録できる
    mcp.tool()(get_users_favorite_hidamari_schetch_character)
    mcp.run(transport='stdio')

if __name__ == "__main__":
    main()
```

# 結果

想定通り利用できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96675/fdaf0a56-8cad-4e64-861d-8ef1a2d606f4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96675/bc265a73-0ad2-4f7f-9b79-a278cd20a3f3.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96675/1af5e6f1-d130-4502-ac4f-2254b0be4f26.png)


# 何に使えるの

自作のAIエージェント用ツールや既存の関数についても、関数定義と、付属するコメントがしっかりしていればいいので、既存のコードを変更せずにツールとして提供することができる。
【試験対策】脆弱性対策情報の公開に伴う悪用増加とは？事例・対策を解説！

✅ はじめに
システムの安全性を保つためには、ソフトウェアやOSの脆弱性を迅速に修正することが重要です。
しかし、脆弱性情報が公開されることで、攻撃者がそれを悪用するリスク もあります。

応用情報技術者試験（午後）では、脆弱性情報の公開と悪用に関する問題が出題される可能性が高い ため、しっかり理解しておきましょう！

本記事では、
✅ 脆弱性対策情報の公開とは何か？
✅ 悪用が増える理由
✅ 具体的な攻撃手法（事例）
✅ 悪用を防ぐための対策
✅ 試験の出題ポイント
を解説します。

⸻

📌 脆弱性対策情報の公開とは？
🔹 概要
脆弱性対策情報 とは、ソフトウェアやOSに発見されたセキュリティ上の欠陥（脆弱性） に関する情報のことです。
開発者や企業は、脆弱性を修正するパッチ（更新プログラム）を提供し、利用者に適用を促す 必要があります。

🔹 脆弱性情報が公開される理由
	1.	利用者に早急な対応を促すため
	•	修正プログラムを適用し、攻撃を防ぐ。
	2.	他の開発者や企業が同様の問題を防ぐため
	•	同じ種類の脆弱性が別のシステムにもある可能性がある。

🔹 なぜ悪用が増えるのか？
脆弱性情報の公開後、攻撃者がその情報を利用して攻撃を試みる ことがあります。
特に、修正プログラムが適用されていないシステム（未対策のシステム） を狙う攻撃が増えます。

⸻
📌 実際の攻撃事例
✅ 1. 公開された脆弱性情報をもとにした攻撃
	•	内容:
あるソフトウェアに深刻な脆弱性が発見され、修正パッチが提供 された。
しかし、パッチ適用が遅れた企業を狙って攻撃が発生 した。
	•	結果:
攻撃者が未対策のシステムを狙い、不正アクセスやマルウェア感染を引き起こした。

✅ 2. ゼロデイ攻撃（修正プログラムの提供前を狙う攻撃）
	•	内容:
ソフトウェアの脆弱性情報が公表される前に、攻撃者が先にその脆弱性を悪用 する。
	•	結果:
利用者が対策できないまま攻撃を受け、データ漏えいやシステム破壊が発生。

✅ 3. CVEデータベースを利用した攻撃
	•	内容:
攻撃者がCVE（Common Vulnerabilities and Exposures）データベース に公開された脆弱性情報を確認し、
その脆弱性を悪用する攻撃コード（エクスプロイト）を作成。
	•	結果:
パッチ未適用のシステムが標的となり、大規模な攻撃が発生。

⸻
📌 具体的な対策方法
脆弱性情報の悪用を防ぐためには、迅速な対応と適切なセキュリティ対策が重要 です。
🔹 1. 修正プログラム（パッチ）の早期適用
✅ 定期的にパッチ適用を確認する
	•	OSやソフトウェアのアップデートを自動更新に設定 する
	•	企業ではパッチ管理ツール を導入し、適用状況を管理

✅ 仮想パッチ（WAF）を活用する
	•	Webアプリケーションの場合、WAF（Web Application Firewall）で攻撃をブロック することで、パッチ適用前のリスクを軽減

🔹 2. 脆弱性情報の監視
✅ JPCERT/CCやIPAの脆弱性情報を定期的にチェック
	•	JPCERT/CC（Japan Computer Emergency Response Team Coordination Center）
	•	IPA（情報処理推進機構）

✅ CVEデータベースの活用
	•	自社が利用しているソフトウェアのCVE情報を定期的に確認し、対応を検討

🔹 3. ゼロデイ攻撃への対策
✅ EDR（Endpoint Detection and Response）の導入
	•	未知の攻撃にも対応できるセキュリティツールを活用
	•	不審な挙動をリアルタイムで検知し、迅速に対応

✅ セキュリティポリシーの強化
	•	管理者権限の制限
	•	最小権限の原則（Least Privilege）を徹底

⸻
📌 試験での出題ポイント
✅ 記述問題の対策
試験では、「脆弱性情報の公開に伴うリスクと対策」を説明できるかが問われます。
以下のような問題が出る可能性が高い ので、事前に練習しておきましょう。

Q1. 脆弱性情報が公開されることによるリスクを1つ挙げ、具体的な事例とともに説明せよ。

解答例:
リスク: 修正パッチ未適用のシステムを狙った攻撃が発生する
事例: ある企業で使用されていたソフトウェアの脆弱性が公開された後、修正パッチを適用しないまま運用していたため、攻撃者に悪用され、不正アクセスを受けた

Q2. 企業において脆弱性情報を適切に管理し、攻撃を防ぐために重要な対策を2つ挙げ、それぞれの理由を説明せよ。

解答例:
	1.	パッチ管理ツールの導入
	•	修正プログラムの適用状況を一元管理し、迅速に対応するため
	2.	WAFの活用
	•	Webアプリケーションの脆弱性を狙った攻撃をブロックし、パッチ適用前のリスクを軽減するため

⸻

✅ まとめ
	•	脆弱性情報の公開は、利用者に早急な対応を促すが、攻撃者に悪用されるリスクもある
	•	修正パッチの適用が遅れたシステムが標的になるため、迅速なアップデートが必須
	•	CVE情報の監視やWAF、EDRなどを活用し、ゼロデイ攻撃にも備えることが重要
	•	試験では「リスク」「事例」「対策」をセットで理解し、記述問題に備える！
WSL上で起動したMCPサーバを、Claude Desktopから利用する

# 注意事項
この記事は下記記事を参考に作成しました。

https://scottspence.com/posts/getting-mcp-server-working-with-claude-desktop-in-wsl

# 結論から先にいうと
(zshを使う場合 / bashに置き換えても動くと思います)
`claude_desktop_config.json` に以下のような内容を書く
```json
{
    "mcpServers": {
        "you_mcp_name": {
			"command": "wsl.exe",
			"args": [
				"zsh",
                "-c",
				"zsh (mcpサーバをwsl内で起動するスクリプトのパス)"
			]
        }
    }
}
```

# 前提

MCPサーバを自前で立てたことがある前提で話すため、ライブラリのインストールや環境構築の話はしません。

# 経緯

下記の記事を参考に、ClaudeDesktopの、MCPサーバを触ってみました。

https://zenn.dev/makumaaku/articles/85fc9e17f5bd5f

# ざっくり開発者から見たMCPサーバってどんな感じ？
Claude Desktopを前提に話します。

下記のように `@mcp.tool()` をつけた関数を定義しておくと、関数のコメントで定義されている内容がClaudeに渡ります。

Claude Desktopが、会話に応じて、この渡した関数を呼んでくれます。


```python
from typing import Any
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("hidamari_character")


@mcp.tool()
async def get_users_favorite_hidamari_schetch_caractor(user_name:str) -> str:
    """get users favorite hidamari schetch caractor
        (ユーザー名ごとに、ひだまりスケッチの好きなキャラクターを返す)
        Args:
            user_name: ユーザー名
    """
    # Claudeが上記メソッド定義と、関数についたコメントを読み込んで、いい感じに呼び出してくれる。

    if user_name == "masachaco":
        return "宮ちゃんです"

    return "該当のユーザーの情報は見つかりませんでした"

def main():
    # 標準入力で受け付ける
    mcp.run(transport='stdio')

if __name__ == "__main__":
    # MCPサーバを起動
    main()


```

Claude Desktopの設定ファイル `claude_desktop_config.json`に上記を呼び出すための、コマンドを記載する必要があります。

コマンドの内容は、上記の場合だとPythonコードを実行する内容を記載すればよいです。
Windows上のPythonで書かれたMCPサーバなら下記のようになるはずです。
```json
{
    "mcpServers": {
        "weather": {
            "command": "python",
            "args": [
                "C:\\mcp_example_dir\\main.py"
            ]
        }
    }
}
```
そのまんまですね。pythonで main.pyを実行しなさい。という定義になります。
これを指定しておくと、Claude Desktopは自動的に、上記の `main.py` を実行し、MCPサーバを立ち上げ、定義した関数をいい感じに呼び出せるようになります。

# WSL上のMCPサーバを立ち上げるにはどうすればいいの？

それでは、WSL上のMCPサーバを立ち上げるにはどうすればいいんでしょうか。
Dockerを使う手もありますが、今回は、Dockerは使わずWSL上のコードを実行したいです。

答えは、下記のように `wsl.exe` を指定して、コマンドを実行させればOKでした。
私はzshを使用しているので、zshを指定して実行しています。
```json
{
    "mcpServers": {
        "you_mcp_name": {
			"command": "wsl.exe",
			"args": [
				"zsh",
                "-c",
				"zsh (mcpサーバをwsl内で起動するスクリプトのパス)"
			]
        }
    }
}
```

mcpサーバをwsl内で起動するスクリプトのパスはWSL上のパスを指定します。

mcpサーバをwsl内で起動するスクリプトは下記のような形にしました。
```bash
#!/bin/zsh
cd /(mcp サーバのあるディレクトリへ移動)

# 環境変数など読み込み
source ~/.zshrc

# MCPサーバを実行する
python3 simple_mcp.py
```

# 実行結果

`※ MCPの定義を読み直させるためには、Claude Desktopを再起動する必要があります。`

うまく設定できると、下記のように、右下ｎツールマークが表示され

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96675/a62ce02f-af12-4b5e-9615-df44201f7b50.png)

ツールマークをクリックすると、作成したMCPの説明がでます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96675/ce2fdbb9-c62d-4a71-b6fc-75a75a289cdf.png)

実行してみるとうまく、ツールを使って、私の好みが取得できたようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96675/80113a0a-28b2-48b6-9285-ee68153638d3.png)

# 結論

思ったよりもサーバを実装する手順が簡単すぎてびっくりした
wslでelixir その174

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
練習問題やってみた。

# 練習問題
Livebookの、kino.jsで、MMLを鳴らせ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/f79db99f-adda-45e2-98f8-c8a1b1d02505.png)


# サンプルコード

```
defmodule KinoHTML.Mml do
  use Kino.JS
	def new(mml) do
		Kino.JS.new(__MODULE__, mml)
	end
	asset "main.js" do
		"""
		export async function init(ctx, mml) {
      await ctx.importJS("https://kazuprog.work/prog/js/mml-player/mml-player.js")
      var mml = mml;
      ctx.root.innerHTML = `
        	<button id="bt0">run</button>
			`;
			const bt0 = document.getElementById("bt0");
  		bt0.addEventListener("click", (event) => {
        new MMLPlayer().play(mml);
    	});
	
    }
    """
  end
end

KinoHTML.Mml.new("t110 l8 r4rcf4.ffedcd4.ccracd4dddfdea2 r4acd4dfg4fef4edd4rcd4rddafg2. ")


```

以上。
sf command 関係のエラー



#  'sf' is not recognized as an internal or external command

+ [Error when I try command "SFDX:Authorize an org"](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ajNSS)

[Upgrade: 'sf' is not recognized as an internal or external command](https://community.progress.com/s/article/upgrade-sf-is-not-recognized-as-an-internal-or-external-command)

:::note
I had to reinstall it worked.
:::

+ ['sf is not recognized' error in windows command and VS Code Terminal](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007akW76SAE)

:::note
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/d343e754-e325-fa03-0fc3-101aa845800e.png)

https://www.c-sharpcorner.com/article/how-to-addedit-path-environment-variable-in-windows-11/
:::

# lightning dev app is not a sf command

+ [how to workaround "lightning dev app is not a sf command"](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000WX8V)

:::note
Install the plugin with this command from VS Code terminal: sf plugins install @salesforce/plugin-lightning-dev and try again.
:::
Excel VBAで関数・引数を文字列で指定する方法

条件分岐以外で、実行関数を動的に変えたい場合に、[CallByName関数](https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/callbyname-function)を使って実現しました。

## CallByName関数
指定したオブジェクトのプロパティへのアクセス、およびメソッドの実行を行います。

CallByName (object, procname, calltype, [args()]_)

<table>
   <thead>
    <tr>
      <th>引数</th> <th>説明</th>
    </tr>
  </thead>
  <tr>
    <td> object </td> <td>Variant、またはObject型の実行対象オブジェクト。</td>
  </tr>
  <tr>
    <td> procname </td> <td>文字列型のオブジェクトのプロパティ、またはメソッドの名前。</td>
  </tr>
  <tr>
    <td> calltype </td> <td>呼び出されるプロシージャを表すvbCallType型定数。
<table>
   <thead>
    <tr><th>定数</th> <th>説明</th></tr>
  </thead>
  <tr>
    <td> VbMethod </td> <td>メソッドを実行する</td>
  </tr>
  <tr>
    <td> VbGet </td> <td>プロパティの値を取得する</td>
  </tr>
  <tr>
    <td> VbLet </td> <td>プロパティの値を設定する</td>
  </tr>
  <tr>
    <td> VbSet </td> <td>プロパティにオブジェクトへの参照を代入する</td>
  </tr>
  </table>
    </td>
  </tr>
  <tr>
    <td> args() </td> <td>メソッド実行時の引数、またはプロパティに設定する値。</td>
  </tr>
</table>

## 使用方法

~~~ vba:クラスモジュール SampleCls
Public Sub Func1(val As Integer)

    Debug.Print val

End Sub

Public Sub Func2(val As Integer)

    Debug.Print val * val
    
End Sub
~~~

~~~ vba:標準モジュール
Sub Sample1()

    For funcNum = 1 To 2
        CallByName New SampleCls, "Func" & funcNum, VbMethod, 3
    Next funcNum

End Sub
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945532/581f76b4-47cc-4c14-b127-0e0b2fc19361.png)

上記では呼び出す関数名をForループのカウンタから指定しています。
パターンが少なければ条件分岐で書くほうがわかりやすいでしょうが、パターンが増えてきた場合などは、CallByNameを使ったほうがすっきりと書けます。
私の場合は、シート上に関数名を列挙しておいてリストボックスのインデックスによって列挙したものの中から呼び出すといった使い方をしました。

また、オブジェクト違いで同名の関数を呼び出す際にも使うことができます。
実装の幅が増えるので是非とも覚えておきたい関数です
競プロ日記#/25/03/24

# アルゴ式-[電光掲示板](https://algo-method.com/tasks/1697SVpt)

- 0~9の表示パターンについて配列で管理することは思いついたが文字列の方が良いらしい。2進数のintで管理してしまった。
```
vector<string> mask = {
    "1110111", "0100100", "1011101", "1101101", "0101110",
"1101011", "1111011", "0100111", "1111111", "1101111"
};
```
- あとは入力Nがそのままインデックス番号として使えるのでmask.[N]を整数値に変換する
```
int result = bitset<7.(mask[N]).to_ulong();
```
- 文字列のビット→bitset<N>()でN個のビットに変換→to_ulong()で整数値に

# アルゴ式-[電光掲示板の切り替え](https://algo-method.com/tasks/1698jGFr)

- [まとめてフラグを消す](https://algo-method.com/tasks/17297Xhy)で扱った「A = A and ~M」を応用すれば解ける
- 今回は「切り替える」なので上記の例でいうと「A→~M」だけじゃなくて「M→~A」も必要になる
```
#include <bits/stdc++.h>
#include <algorithm>
using namespace std;

using Graph = vector<vector<int>>;

int main() {
    int N,M;
    cin >> N >> M;

    vector<string> mask = {
        "1110111", "0100100", "1011101", "1101101", "0101110",
    "1101011", "1111011", "0100111", "1111111", "1101111"
    };
    int newN = bitset<7>(mask.at(N)).to_ulong();
    int newM = bitset<7>(mask.at(M)).to_ulong();
    int ans = (newN & ~newM) | (newM & ~newN);
    cout <<  ans << endl;

}
```
- ちなみに「&」のところを「and」にすると挙動がバグる。正直よくわからなかず言語の仕様かもしれないが本質じゃないのでとりあえず保留（なんとなく整数値をboolに変換して0,1を返してる感じだった）
PowerShell から DirectX12 を用いて三角形を表示する方法

## はじめに

これは、外部ライブラリを用いずに C# で生の DirectX12 APIを呼べないか試しただけの記録になります。
C# でできるなら、PowerShell からも呼べるだろうと思い試してみました。

## 実行結果

https://github.com/cx20/hello/tree/master/powershell/directx12/triangle

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26094/d32bc9a5-a758-4798-a82d-0ef29967d7ef.png)

## 処理概要

1. バッチファイル: 最初のトリガーとなるバッチコマンド
2. PowerShell: Add-Type コマンドを使ってC#コードをコンパイルして実行
3. C#コード: Win32 APIとDirectX 12を呼び出すコード
4. Win32 API: ウィンドウの作成と管理
5. DirectX 12: グラフィックスパイプラインの構築と三角形描画

## 技術的情報

DirectX 12 API は COM（Component Object Model）ベースの API です。
COM はマイクロソフトが開発したソフトウェアコンポーネント間の通信を実現するためのバイナリインターフェース標準です。

C# から COM にアクセスする方法はいくつかあります。
- 自動マーシャリング
- P/Invoke
- vTable直接アクセス

今回使ったテクニックは3つ目の「vTable直接アクセス」という方法になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26094/f002c5bf-75e7-4862-8f77-4fe19b9af64d.png)

## おわりに

このテクニックの使い道があるかわかりません。
HLSL でシェーダー芸みたいなのも出来ると思いますので、バッチファイルで処理が完了したらカッコいい絵を出してみるのも面白いかもしれません。
仕事で使って怒られても保証はしませんので、使う際は自己責任でお願いします。
バッチ実行中にメッセージボックスを表示

# はじめに
導入作業用にファイルコピーやiniファイルを書き換えるバッチを作成しました。
その際により簡易化するため、入力内容も選択メニューにし、番号入力のみにしたうえで担当者に確認してもらったところ、衝撃な一言がありました。
「キーボードが使えないのでマウスの操作だけにしたい」
工場の作業場のPCはマウスしか置いてなく、入力が必要な場合にはキーボードを持参するかリモート接続して操作していたとのことでした。

# メッセージボックスを表示
それならば、バッチ実行中にメッセージボックスを表示してマウスで選択するようにすればいいと考え、バッチを作り直しました。

どのボタンが押されたかは、バッチの`%ERRORLEVEL%`で取得できます。
指定する値で表示されるボタンと値の関係は、次のようになります。
（）内が`%ERRORLEVEL%`の値です。

|コマンド|ボタン(ERRORLEVELの値)|
|:-|:-|
|YesNoCancel| はい（6） いいえ（7） キャンセル（2） |
|YesNo| はい（6） いいえ（7） |
|OK| OK（1） |
|OKCancel| OK（1） キャンセル（2） |
|RetryCancel| 再試行（4） キャンセル（2） |
|AbortRetryIgnore| 中止（3） 再試行（4） 無視（5） |

## VBScript

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/f1285de4-892e-4184-b7d3-5cf2f0b546e0.png)

```bat
@echo off

set caption=タイトル
set message=作業内容を選択してください
set mesYes=【はい　】作業はいの処理内容
set mesNo=【いいえ】作業いいえの処理内容
set mesCancel=【ｷｬﾝｾﾙ】作業終了

echo res = MsgBox("%message%" ^& vbCrLf ^& vbCrLf ^& "%mesYes%" ^& vbCrLf ^& "%mesNo%" ^& vbCrLf ^& "%mesCancel%", vbYesNoCancel, "%caption%"):WScript.Quit(res) > %TEMP%\msgbox.vbs
%TEMP%/msgbox.vbs

rem 6:はい、7:いいえ、2:キャンセル
echo %ERRORLEVEL%

del %TEMP%\msgbox.vbs
pause
```

## PowerShell
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/4f77c37b-d0de-44f0-ab31-ed5ea8e50988.png)

```bat
@echo off

set caption=タイトル
set message=作業内容を選択してください
set mesYes=【はい　】作業はいの処理内容
set mesNo=【いいえ】作業いいえの処理内容
set mesCancel=【ｷｬﾝｾﾙ】作業終了

set msgbox="Add-Type -AssemblyName System.Windows.Forms;$result = [System.Windows.Forms.MessageBox]::Show(
set msgbox=%msgbox%\"%message%`n`n%mesYes%`n%mesNo%`n%mesCancel%`n\", '%caption%', 'YesNoCancel', 'Question');Exit $result;"
powershell -ExecutionPolicy RemoteSigned -NoProfile -Command %msgbox%

rem 6:はい、7:いいえ、2:キャンセル
@echo 戻り値は %ERRORLEVEL% です

pause
```
【2025/03/30追記】
PowerShellのオプション -NoProfile を追加しました。このオプションは、PowerShellの実行時に読み込む環境情報を読み込まないため、起動が多少速くなります。不要な場合は指定しなくてもいいです。

### 表示するアイコン
|表記|コマンド|
|:-|:-|
|青い〇内に「i」|Asterisk、Information|
|赤い〇内に「×」|Error、Hand、Stop|
|黄色い△内に「!」|Exclamation、Warning|
|青い〇内に「?」|Question|
|なし|None|

# 最後に
今回のバッチファイルは`VBScript`の方で作成しました。この記事を書くために`PowerShell`の方法も調べてみたところです。

まだ、`VBScript`の方が慣れているので採用してしまうのですが、`VBScript`は廃止方向にあるため、`PowerShell`に切り替えて行かなければいけませんね。


# 参照
* [◇Windowsのバッチファイルでメッセージウインドウを表示](https://qiita.com/aromatibus/items/c1e7b27a8ba1ed07982b)
* [バッチ実行中にファイル選択やフォルダ選択を行うGUI](https://qiita.com/yaju/items/3cea48dc3559450f194b)
PHPerKaigi初参加 && 初登壇してきました！

# PHPerKaigiとは？
PHPエンジニアの集うテックカンファレンスです。
3日間オンライン・オフライン(中野)で開催されます。
オフラインとオンライン、ノベルティ有無で参加費が変わります。

![PXL_20250323_011427849.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871802/6dc87072-6120-4f5c-9cc3-901513130ac1.jpeg)


https://phperkaigi.jp/2025/

## 特徴(主観)
まず、夕方から普通にお酒が飲めます(重要な点)
あとは3日間開催ということもあり、トーク採択率が他のカンファレンスより高めとのことでした。
観客の反応もかなりよく、登壇者と参加者が関わることを大切にしている印象を受けました。
大体どこの会場でも大爆笑が起きていて、アットホームさが魅力です。

### フリードリンク
酒、ソフトドリンク飲み放題です！

![PXL_20250323_044452972.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871802/5d097cb4-8af8-4600-b5f9-4bdaa7885ebd.jpeg)


### 軽食あり
お菓子、軽食、モーニングドーナツあります！
明日からダイエットします！
![PXL_20250322_062119520.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871802/9335cab0-8892-403f-b2fd-124c5df98dbf.jpeg)

### ランチマッチング
初対面の方とランチするランチマッチング企画も面白かったです。
ランダムな3~4名でランチに送り出されます。
会話ネタとかも用意されていますので、気軽に参加できます。

### LT大会
1人5分のLT大会があります。
ルーキー対象のルーキーズLTもあります。
残り一分でペンライトを振るのはお祭り感あって楽しいです。
人生で初めてペンライト振りました。

# 登壇について
魅力的なトークがたくさんありましたが、そちらは弊社テックブログで紹介します(宣伝)
ここでは登壇するに至った経緯や準備から感想までを話させてください。

## きっかけ
去年末のPHPカンファレンスにスタッフとして参加した際に、他のスタッフの方に下記のような話をしました。
- テックカンファレンスで勉強させてもらっている
- スタッフをやって少しでも恩返しをしたい
- いつかは登壇してみたい
- でも登壇は敷居が高く感じてしまう

その方は「プロポーザルをとりあえず出して通ってから考えれば良い。いつやるの、いまでしょ。」とアドバイスをしてくれました。最後の二言は脚色です。

その言葉に勇気を貰いその場でプロポーザルを出し、今に至ります。

## トーク準備
20分のトークをするのに内容を詰めて、怪しい部分の調査をして、紹介するコードを実装して、スライドを作成してと20時間くらいは掛かった気がします。
ただ、しんどかったかというとそんなことはなく、やるのであれば他の方の参考になるような発表をしたいという意識が強かったように記憶しています。

## 本番
寸前まで「ガラガラだったらどうしよう」とか「物とか飛んでこないかな」とか「そもそも需要あるんかいな」とかネガティブな気持ちがありました。
しかし、実際に話してみると参加者の方々が暖かく、私自身が楽しめました。

我らがロイ・マスタングも
「理想とか綺麗事と言うがそれを成しとげた時それはただの"可能な事"に成り下がる」
と言っています。金言ですね。

余談ですが、下記登壇資料です。

https://speakerdeck.com/kyoshidaxx/phpkarakao-eru-kurezitutokadoniokeru3dsekiyuajue-ji

## 登壇を経て
登壇ってそんなに難しいことじゃないです。
さらに「ちょっと気になっていた」「ここってどうなんですか？」とフィードバックを貰えることは純粋に嬉しいです。
あの頃私が与えていただいていたものを少しは同じようにできたのかなと。

あと、正直にいいますが、Xで登壇直後にめちゃくちゃエゴサします。
話しかけられると嬉しいです。
きっとこれは全登壇者共通だと思います。

# 最後に伝えたいこと
皆さんもカンファレンスに参加してみてください。純粋に楽しいですし、勉強にもなります。
そしてチャンスがあれば登壇してみてください！ルーキーズLTとかありますよ！
最後に、もし良いなと思ったトークがあればXでも直接でも登壇者の方に感想を伝えてみてください。絶対に喜んでくれますし、励みになります。
みんなでアウトプットしましょう！
ABC398-F を Python で解いた

ABC398 F - ABCBA
https://atcoder.jp/contests/abc398/tasks/abc398_f

先日のF問題が解けなくて悔しかったので勉強してACしてきました。

## コンテスト中＆コンテスト後の自分の動き
Dまで解いてEを捨て、35分ほど残った時間でFに挑みました。文字列Sの後ろにある回文を求めればよいことはすぐわかりましたが、回文の判定には時間がかかるので普通にやっても解けません。あれこれ悩みましたが結局どうしようもありませんでした。

コンテスト後の皆さんのツイートからなんとか「ローリングハッシュ」なる単語を拾ってきました。よく聞く名前なのでこの機会に覚えるべきだと思い、勉強しました。
https://qiita.com/hirominn/items/80464ee381c8d400725f
この考え方を利用してなんとかACすることができました。

やってみると案外簡単で、どうして今まで勉強してこなかったのかと後悔したぐらいです。ABC の E 問題以降を解けるようにするためにはこれも技としてしっかり身につけて、必要な場面で使えるようにしておかないといけないと思いました。


## 考察
S を逆に並び替えた文字列を T とします。

* S = [非回文1] + [回文]
* T = [回文] + [非回文1の逆]

という形になり、答えは

* [非回文1] + [回文] + [非回文1の逆]

となります。これを求めるために、S を後ろからみたときに回文となる文字列のうち最も長いものを探します。公式解説に書かれている通りです。

i = 1, 2, ..., N について、「T の頭から i 文字目まで」と「S の後ろから i 文字目まで」を比較していきます。普通に比較すると計算量オーバーになりますから、ここでハッシュ値を利用します。i が増えるにつれて T は後ろへ後ろへと伸び、S は前へ前へと伸びていきます。「i 文字目までの文字列のハッシュ値」から「i+1 文字目までの文字列のハッシュ値」は後述するように素早く求めることができます。


### T[:k] のハッシュ値から T[:k+1] のハッシュ値を求める
```math
\begin{align}
hash(k) &= T_1 \cdot b^{k-1} &+  T_2 \cdot b^{k-2} &+ ......  &+ T_k \cdot b^0\\
hash(k+1) &= T_1 \cdot b^{k} &+  T_2 \cdot b^{k-1} &+ ......  &+ T_k \cdot b^1 &+ T_{k+1} \cdot b^0
\end{align}
```
より
```math
\begin{align}
hash(k+1) = hash(k) \cdot b + T_{k+1}
\end{align}
```
です。先に引用したページ
https://qiita.com/hirominn/items/80464ee381c8d400725f
では長さ M の文字列を 1 つずつずらしながら見ていましたが、今回はそれよりも単純です。


### S[-k:] のハッシュ値から S[-(k+1):] のハッシュ値を求める
```math
\begin{align}
hash(k) &= &S_k \cdot b^{k-1} &+  S_{k-1} \cdot b^{k-2} &+ ......  &+ S_1 \cdot b^0\\
hash(k+1) &= S_{k+1} \cdot b^{k} &+  S_{k} \cdot b^{k-1} &+  S_{k-1} \cdot b^{k-2} &+ ......  &+ S_1 \cdot b^0
\end{align}
```
より
```math
\begin{align}
hash(k+1) = hash(k) + S_{k+1} \cdot b^{k}
\end{align}
```
です。こちらはさらに簡単ですね。


## 実装
前から i 文字のハッシュ値を求める部分と後ろから i 文字のハッシュ値を求める部分をそれぞれ関数にまとめました。
また、ハッシュ値の衝突が起こりにくいように念のため基数を変えて 2 回計算しています。

```python
S = input()
T = S[::-1]
N = len(S)
S, T = "." + S, "." + T # 1-index にする
MOD = 998244353
BASE1 = 100019
BASE2 = 15

# 前から i 文字目までの部分文字列のハッシュ値を hash[i] に格納して返す
def hash_from_head(str, base, mod):
  n = len(str) - 1 # str は 1-indexなので
  hash = [0 for _ in range(n+1)]
  for i in range(1, n+1):
    hash[i] = hash[i-1] * base + ord(str[i])
    hash[i] %= mod
  return hash

# 後ろから i 文字目までの部分文字列のハッシュ値を hash[i] に格納して返す
def hash_from_tail(str, base, mod):
  n = len(str) - 1 # str は 1-indexなので
  hash = [0 for _ in range(n+1)]
  for i in range(1, N+1):
    hash[i] = hash[i-1] + ord(str[-i]) * pow(base, i-1, mod)
    hash[i] %= mod
  return hash

# T[:i] は後ろへ後ろへと伸びていく。ローリングハッシュの要領で次のハッシュ値を求める。
# 念のため2種類のハッシュ値で調べる。
hashs_head_T1 = hash_from_head(T, BASE1, MOD)
hashs_head_T2 = hash_from_head(T, BASE2, MOD)
# S[i:] は前へ前へと伸びていく。ローリングハッシュの要領で次のハッシュ値を求める。
hashs_tail_S1 = hash_from_tail(S, BASE1, MOD)
hashs_tail_S2 = hash_from_tail(S, BASE2, MOD)

# 最長の回文を探す
palindrome_length = 1
for i in range(1, N+1): 
  if hashs_head_T1[i] == hashs_tail_S1[i] and hashs_head_T2[i] == hashs_tail_S2[i]:
    palindrome_length = i
ans = S[1:] + T[palindrome_length + 1:]
print(ans)
```
【Swift】コールバック関数を async / await に書き換える

今携わっているプロダクトのコードは、コールバックだらけなので
コールバック周りをいじるような時は、Swift Concurrency（並行処理）のasync/awaitに書き換えをしています。
...が、その際にどうしてもコールバック関数からasync関数に変更できない場合がありますよね。
（影響範囲が広いとか、UIKitやFoundationのメソッドがまだコールバックしか対応していないとか）
そういった時に、どのようにAsync関数内でコールバック関数を呼び処理の完了を待つのか。
書き換え方法をまとめておきます。

## 結論
エラーを扱うか否かで、2通りの方法があります。
`withCheckedContinuataion` または `withCheckedThrowingContinuation` という関数を使います。
これは、Swift 標準ライブラリが提供する API です。

https://developer.apple.com/documentation/swift/withcheckedcontinuation(isolation:function:_:)

https://developer.apple.com/documentation/swift/withcheckedthrowingcontinuation(isolation:function:_:)


## ErrorをThrowしないコールバックの場合
`withCheckedContinuataion`を使用します。
```swift
// 元のコールバック関数
func fetchData(completion: @escaping (String) -> Void) {
    DispatchQueue.global().asyncAfter(deadline: .now() + 2) {
        completion("データ取得完了")
    }
}

// 書き換え後
func fetchDataAsync() async -> String {
    return await withCheckedContinuation { continuation in
        DispatchQueue.global().asyncAfter(deadline: .now() + 2) {
            continuation.resume(returning: "データ取得完了")
        }
    }
}

Task {
    print("データ種取得開始"）
    let result = await fetchDataAsync()
    print(result)
}

// 出力結果：
// データ種取得開始
// (...2秒経過）
// データ取得完了
```

## Errorを扱う必要がある場合
 `withCheckedThrowingContinuation`を使用します。

 ```swift
// 変換前の関数
func fetchData(completion: @escaping (String?, Error?) -> Void) {
    DispatchQueue.global().asyncAfter(deadline: .now() + 2) {
        let success = Bool.random()
        if success {
            completion("データ取得完了", nil)
        } else {
            completion(nil, NSError(domain: "NetworkError", code: -1, userInfo: nil))
        }
    }
}
    
// 変換後の関数
func downloadData(from url: URL) async throws -> String {
    try await withCheckedThrowingContinuation { continuation in
        DispatchQueue.global().asyncAfter(deadline: .now() + 2) {
            let success = Bool.random()
            if success {
                continuation.resume(returning: "データ取得完了")
            } else {
                continuation.resume(throwing: NSError(domain: "NetworkError", code: -1, userInfo: nil))
            }
        }
    }
}
 ```

## 注意
ドキュメントにも記載がありますが、`resume()`は必ず呼ぶようにしてください。
また、分岐がある場合には全てのケースにおいて`resume()`を呼ぶようにしてください。

`resume()`を忘れた場合、呼び出し元のawait側が永遠に待ち続けてしまいます。
また、`resume()`を忘れた分岐で呼び出し元が待ち続けている間に、`resume()`を実装した分岐に処理が通るとクラッシュします。