OmniAICreator/Qiita-1.07M huggingface dataset:
【Preignition】HTB WriteUp的な

:::note info
初めて自前のkali linuxからhtb専用のPwnBoxに切り替えて使ってますが、
かなり重いしラグもある...。絶対にkali linux使ったほうがいい...笑
:::


## 考察などをいつも通り箇条書き的に
### そもそもプレグニッションって・・・？
自動車エンジンの燃焼室内で、点火プラグ(注釈1)が火花を散らす前に、燃料と空気が自己着火してしまう異常燃焼現象のこと。簡単にまとめると通常のタイミングよりも早く燃焼が始まってしまう現象のことらしい。（関係の無い話ですが...気になったので...笑）

:::note info
点火プラグとは・・・
ガソリンを着火させるライターの役割を担っているパーツ。
:::

### ディレクトリバスティング
Webサーバー上の隠れたディレクトリやファイルを探索する機能。

### 思うようにいかない・・・
```
Starting Nmap 7.94SVN ( [https://nmap.org](https://nmap.org) ) at 2025-05-21 08:16 CDT
Note: Host seems down. If it is really up, but blocking our ping probes, try -Pn
Nmap done: 1 IP address (0 hosts up) scanned in 2.16 seconds
```
通常Webサーバーなどはping(つまり、icmpエコー)をブロックしている場合がある。
こういうときは実際にホストがダウンしているか、Nmapのping自体をFWがブロックしている場合が大半である。

**そのための解決策　-Pnオプションの使用**
・これによってホストの状態確認（ping）をスキップさせ、直接ポートスキャンを実行させるには、-Pnオプションを使用する。これによってnmap自身はホストが稼動していると仮定してスキャンを行う。
`nmap -Pn <target IP>`

**今回知った便利なオプション`-A`オプション：アグレッシブ（aggressive）スキャン**
ターゲットに関するより詳細な情報を収集するためのアグレッシブスキャンを実行する。
このオプションを指定すると、以下の機能が自動的に有効になる。
・OSの検出`-O`：ターゲットホストのオペレーティングシステムを推定する。
・バージョン検出(`-sV`)：開いているポートで稼働しているサービスのバージョン情報を取得する。
・スクリプトスキャン（`--script=default`）：Nmap Scripting Engine(NSE)を使用して、一般的な情報収集スクリプトを実行。
・トレースルート(`--tracetoute`)：ターゲットホストまでの経路を追跡する。

### -T4オプションやその他のT系オプション
**タイミングテンプレート**が由来である。
`-T0（遅い）`～`-T5(早い)`

https://nmap.org/man/ja/man-performance.html

詳しい話はこのサイトを見ればよい。

### gobusterは便利だ！！


```
sudo gobuster dir -w /usr/share/wordlists/common.txt -u <targetIP>
```
common.txtはgithubから引っ張ってこれる。wget使えば。

:::note info
wgetはWebからファイルをダウンロードするためのフリーソフトウェア。
:::


**phpファイルだけ重点的に探したいという場合**
`-x php`


### ランタイムインタラクションの概要
Nmapはスキャン中にキーボード入力を受け付け、特定のキー操作に応じて変更したり、情報を表示したりする。`Enter`はステータスメッセージ（つまり経過情報を）教えてくれる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575047/ae9efbc0-c841-46d6-8ede-6999652238bf.png)

このサイトを見てみたがよくわからない。

https://nmap.org/man/ja/man-runtime-interaction.html

これはまた別の機会に試してみることにする。

### 自動的にステータス表示もできる。
`nmap --stas-every 10s <target IP>`
このオプションを使用すると指定した間隔でスキャンのステータスが自動的に出力されるため、進捗状況を継続的に監視するのに便利。









## 参考文献（参照日2025年5月21日）

blob:https://app.hackthebox.com/1c911bc8-93f9-4108-9c37-7e2ad4c0fcfb
JavaScript：変数と定数（let / const / var）を手を動かしながら整理＆復習してみた

## はじめに

この記事は、JavaScriptの定数と変数の違いや使い方について、初学者の視点から学習内容を整理した備忘録です。

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

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

個人的にJavaScriptのキャッチアップをしたくて、勉強中の初学者として備忘録を兼ねて記録しています（仕事終わりに少しずつまとめています）。変数と定数の基本を理解することは、今後のJavaScript学習の土台になると考えています...！

## 内容

JavaScriptでの「定数」と「変数」について、説明します。

### 1. JavaScriptの変数・定数の宣言方法

| 種類    | キーワード   | 特徴              |
| ----- | ------- | --------------- |
| 変数    | `let`   | 値を変更できる         |
| 定数    | `const` | 一度決めたら変更できない    |
| （旧方式） | `var`   | 昔の書き方。現在は推奨されない |

**参考文献**

https://ma-vericks.com/blog/javascript-variable/

https://techplay.jp/column/1619

https://se-media.jp/javascript/4674/

### 2. 使い方の例

#### `let`（変数）

```javascript
let message = "こんにちは";
message = "こんばんは";  // 値を変えてもOK
console.log(message);   // こんばんは
```

**実際の画面**

![スクリーンショット 2025-05-21 22.29.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/b70f91fb-439d-4af5-b54c-9784017b3e2d.png)

#### `const`（定数）

```javascript
const greeting = "おはよう";
// greeting = "こんばんは"; // ❌ エラーになります（定数は変更できない）
console.log(greeting);   // おはよう
```

**実際のエラー画面**

![スクリーンショット 2025-05-21 22.31.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/7baae5a1-9341-4981-8c44-3df2ee26c962.png)

**コメントアウト後画面（エラーなし）**

![スクリーンショット 2025-05-21 22.32.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/e8b70939-1473-43e0-8000-2a65e6c38d92.png)

### 3. 使い分けのポイント

* 基本は `const` を使う（安全で意図が明確）
* 値をあとで変更したいときだけ `let`
* `var` は古い書き方なので、今から学ぶなら使わなくてOK（個人調べ）

### 4. 配列やオブジェクトに使うときの注意

```javascript
const colors = ["赤", "青"];
colors.push("緑");  // ✅ OK（中身の変更は可能）

// colors = ["黄色"];  // ❌ NG（再代入はできない）
```

**実際の画面**

![スクリーンショット 2025-05-21 22.59.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/9f1c8713-100e-4652-9cbd-30969fa7d560.png)

* `const` であっても「中身（配列やオブジェクト）」の変更は可能
* 完全に不変にしたいときは `Object.freeze()` を使う

**参考文献**

https://www.profuture.co.jp/mk/column/about-javascript-array

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze

## まとめ

ここまで読んでいただき、ありがとうございました！

* `const` は変更しない値に使うのが基本
* `let` は変更が必要なときだけ使う
* `var` は古い書き方のため基本的には使用しない
* 配列やオブジェクトは `const` でも中身の変更が可能だが、再代入は不可

簡単ですが、JavaScriptにおける定数と変数の基本として整理してみました。次は条件分岐や関数の書き方に進む予定です！
Web APIについて

## はじめに
Web APIについて理解が曖昧だったため、「プロになるための Web技術入門」を参考に、備忘録としてまとめました。

https://www.amazon.co.jp/%EF%BC%BB%E6%94%B9%E8%A8%82%E6%96%B0%E7%89%88%EF%BC%BD%E3%83%97%E3%83%AD%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AEWeb%E6%8A%80%E8%A1%93%E5%85%A5%E9%96%80-%E5%B0%8F%E6%A3%AE-%E8%A3%95%E4%BB%8B/dp/4297145715/ref=sr_1_4?adgrpid=52846719243&dib=eyJ2IjoiMSJ9.lnyAtj0TRqhx7UiArDQJQZ6qU4doVy-b7jM5Qk2s-ZzLR226531xRacIeiQzhpXU1hKvJP9-VCSPqFaBjvMjkGk0dxdnKo3ZeSpBTrba-7mPTavOO02-tiTS64AfbclY-s1XDgjKID1RHHlTcwS1YA5t9BfXI23MPJyDo4NVQ3JYKdJoQPLaKJdqTM5KrEN9AIq37oyZLbXpTeb6JPz7n8j-Jy14wBlB6H6qtXxpBy7TtA8ZR-fPRmOyFKTMGVyJdRai3RvjMCLPSzhU1ecP4pVJpp-IpfUiugGKOkw7Qlg.OoZO0X7SpyIRFD0tXBuPG_kWjo2EQpRFoogcc2YwwcY&dib_tag=se&hvadid=678964644948&hvdev=c&hvlocphy=1009309&hvnetw=g&hvqmt=b&hvrand=8277875670519633370&hvtargid=kwd-334531415191&hydadcr=16039_13711628&jp-ad-ap=0&keywords=web%E3%82%92%E6%94%AF%E3%81%88%E3%82%8B%E6%8A%80%E8%A1%93&mcid=73ade0070d4836d98052ee925b670219&qid=1747835495&sr=8-4


## Web APIに関する主要技術・プロトコル
### シンプルクロスオリジンリクエスト
①GETメソッドやHEADメソッドなどのサーバ側に影響を及ぼさないメソッド
②HTMLフォームで送信可能なPOSTリクエスト

:::note warn
- プリフライトリクエスト（事前確認リクエスト）は送信しない
- 送信されるヘッダは`Origin`のみ
:::

### サーバープッシュ
サーバ側を基点としてクライアント側へ情報を送信すること。
リアルタイム通知などに使用される。
<br/>

### キャッシュ
ブラウザはHTTP通信で取得したデータをデバイス上に保存し、次回以降同様のデータが必要になったときは、保存したデータを再利用する仕組み。
- 通信量の削減
- リロード時の通信量の削減とページ表示の体感速度が向上
- キャッシュには有効期限を設定することができ、その設定はサーバ側で指定可能
:::note
Webブラウザが備えるキャッシュの仕組みは `ブラウザキャッシュ` と呼ばれる。
:::

<br/>

### Comet（ロングポーリング）
ブラウザがサーバにHTTPリクエストを送信すると、サーバ側は意図的にレスポンスを保留し、情報が変化したタイミングでレスポンスを返す仕組み
ブラウザはレスポンスが返ってきたらすぐに再度リクエストを送信し、レスポンスが返ってくるのを待つ。


:::note
ポーリング：定期的にサーバに問い合わせを行うこと
:::

:::note warn
Cometの課題
- 高頻度な更新には不向き（再接続が必要なため）
- 通信が切断されやすい
- 情報がリアルタイムで変化する状況では、再接続のタイミングで変化した情報は取得できない（例：為替データ）
:::


### HTTPストリーミング
一度のリクエストに対して、サーバから複数回に分けてレスポンスを返す方式。
<br/>

### チャンク転送
リクエストやレスポンスを小さな塊（チャンク）に分割して転送する機能
<br/>

### SSE（Server-sent-events）
- サーバーからクライアントへの一方向通信
- 接続を維持しながらデータを送信できる
- クライアントかサーバのいずれかが通信を止めない限り通信は続く

| タグの種類 | 説明 |
|:-:|:-:|
| id  | イベントを識別するためのID  |
| event  | イベントの種類  |
| data  | サーバから通知される情報の本体
| |一つのイベントの中で複数出力可能|
| retry  | クライアントが再接続するまでの待ち時間（ミリ秒）  |

### WebSocket
初めにHTTPで接続を開始し、その後 `Upgrade` ヘッダーを用いてWebSocketプロトコルへ切り替え（アップグレード）を行う。
- 双方向かつリアルタイムな通信を実現するためのプロトコル
- 送受信に伴うオーバーヘッドが少ない
- プロトコルのアップグレードを行い、HTTPとは別の接続で通信する

:::note warn
<strong>WebSocketの課題</strong>
- 同時接続数の制限
- プロキシサーバによる通信を妨げる問題
- 負荷分散の問題
- 認証の問題
:::

## SSEとWebSocketの違い
| 特徴 | SSE | WebSocket |
|:-:|:-:|:-:|
| 通信方向  | サーバ　⇨ クライアント  | 双方向  |
| プロトコル  | HTTPベース  |  独自プロトコル（Upgrade） |
| 再接続  | 自動で可能  |  手動または実装次第 |
| 主な用途  | 通知、チャット  |  株価、ゲーム |


## おわりに
今後もWeb APIやリアルタイム通信の理解を深めていきます！
エンジニア語 → 日常語に変換してみた

# 【ゆるネタ】エンジニア語 → 日常語に変換してみたらこうなった

エンジニアって、知らない間に“通じない言葉”使ってませんか？  
そんなあなたのために、**よく使うIT用語を日常語に変換**してみました！

---

## 🔧 技術ワード → 🏠 日常ワード 変換表

| エンジニア語 | 日常語にするとこう |
|--------------|--------------------|
| リファクタリング | 大掃除（見た目変わらないけどスッキリ） |
| デプロイ | お披露目（部屋で作った作品を外に出す） |
| バグ | 変なクセ（直すの面倒だけど放置もできない） |
| API | 出前アプリ（裏で他の人に頼んでやってもらう） |
| Git | タイムマシン（やばかったら巻き戻せる） |
| CI/CD | 自動お片付けロボ（保存したら勝手に片付けてくれる） |
| レスポンシブ対応 | 服のサイズ調整（スマホでもPCでもちゃんと着れる） |
| コンフリクト | 意見がぶつかる（どっちのセリフが正しいの問題） |
| スクラム開発 | 学級会（毎朝みんなでちょっと話す） |
| プルリク | 提案書（これでどう？って出すやつ） |
| ペアプロ | 家庭教師（隣で一緒にやってくれる人） |
| ステージング環境 | リハーサル会場（本番っぽいけど本番じゃない） |

---

## 🔁 応用編：日常語 → 技術語にしてみたらこうなった

逆に、**普段の会話**をエンジニアっぽく言ってみると？

| 日常語 | エンジニア語に翻訳すると…？ |
|--------|--------------------------|
| 部屋が散らかってる | リファクタリングが必要 |
| 洗濯機が止まった | バグってる可能性アリ |
| 弁当買ってきたよ | 外部APIから取得済み |
| 調子悪いから寝る | サーバーダウンします |
| 家出るよ〜 | デプロイします！ |
| 忘れてた！ | キャッシュクリアしてなかった！ |

---

## 💡 なんでこんなこと考えたの？

- 技術ワードって身近なものに言い換えると一気に分かりやすくなる
---

## 🙌 最後に

こうやって身近な言葉に置き換えてみると、  
「技術」ってもっとフレンドリーな存在に見えてきませんか？

言葉を噛み砕く力は、**チーム開発でもコミュニケーションでもめっちゃ武器**になります💪  
ぜひみなさんの職場あるある変換もコメントで教えてください！

---

✅ この記事が面白かったら「いいね」や「ストック」してもらえると嬉しいです！
xdebugを設定する方法

ただの備忘録として、ここに記載する。

# 使用するファイル/前提の環境

- php.ini
- launch.json
- docker

# 手順

1. backend配下に、`php/conf.dev.d/php.ini`のファイルを作成
    ファイルに以下を記載
    
    ```php
    xdebug.mode=debug
    xdebug.start_with_request=yes
    xdebug.client_host=host.docker.internal
    xdebug.client_port=9003
    ```
    
    ※xdebug2の書き方になるので、もしxdebug3を使用する場合は異なる
    
    - `xdebug.mode=debug` → デバッグモードを有効化
    - `xdebug.start_with_request=yes` → リクエストごとにXdebugを開始
    - `xdebug.client_host=host.docker.internal` → Dockerコンテナ内のPHPがホストマシンに接続
    - `xdebug.client_port=9003` → VS Codeのリスナーポート
2. launch.jsonに以下を追記
    
    ```php
        "configurations": [
            {
                "name": "XDebug on docker",
                "type": "php",
                "request": "launch",
                "port": 9003,
                "pathMappings": {
                  "/var/task": "${workspaceRoot}/backend"
                }
            }
        ]
    ```
    
    - port番号をphp.iniと合わせる
    - pathMappingsについては、コンテナ内のパスとホストマシン（ローカル）のパスを紐付ける。VSCodeのデバック時に、どのファイルがどこにあるかを正しく認識できるようにしている。
    - docker-compose.ymlで、コンテナ内のどこにマッピングをしているかわかる。
        backendサービスが/var/taskに./backendをマッピングしている
        
        ```docker
          backend:
            image: bref/php-83-fpm-dev:2.3.10
            platform: linux/x86_64
            ports:
              - 8080:8000
            volumes:
              - ./backend:/var/task
              - ./backend/storage:/tmp/storage
            tty: true
            environment:
              HANDLER: public/index.php
              DOCUMENT_ROOT: public
              AWS_ACCESS_KEY_ID: minio
              AWS_SECRET_ACCESS_KEY: minio123
        ```
#98　エンジニア日常の勉強方法

## はじめに

どうもこんにちは。Yです。

ITは既に日常生活不可欠の一部になって、IT関連の仕事に就く方も徐々に増えています。
自分はエンジニアとして３年くらいの経験がありますが、まだまだ初心者であり、新しい知識が勉強しきれない速度で増えています。

今回はエンジニアとして、自分はどのように勉強して、技術を吸収することをシェアしたいと思います。

## 英語は積極的に勉強すること

Google翻訳やDeepL翻訳など今の翻訳サイトは素晴らしくて、外国語のドキュメントもわからなくても読める時代になりました。その反面ですが、専用語などは全く翻訳できないため、本文より読み辛くなるケースは大半です。
また日本語で技術やプログラミングの紹介やチュートリアルの文章は世の中に沢山ありますが、詳しい部分などは書いていないことも結構ありますので、わからないことがある場合、結局ドキュメントを読むしかありません。

言語の勉強は一生使える知識です。直接ドキュメントを読めることや、英語で検索できたら関連の結果も何倍増えることや、わからない時も英語で質問できるなど勉強、仕事上効率も上がります。

## 日常生活やニュースからIT知識を学ぶ

目標を決めて資格などのために勉強するのはいいことですが、それ以外日々の日常でIT関連のニュースや知識を学ぶこともできます。例えばいつも使っているサイトの仕様やデザイン、その良さと理由を考え、似たような状況が合ってもすぐいい案を出せることができます。
またdaily.devというサイトで日々新しいIT情報を上がっています。たまに気になる文章があれば見て、徐々に知識を身につけることが大事です。

## 脳内でソースをシミュレーションする

今から見ても不思議ですが、学生時代の時プログラミングの勉強や試験は全て手書き形式です。ソースを見て問題があるところを探すとかシチュエイションを分析してソースを書くとか、パソコンなしでやってきました。自分も含めて学生さん達も結構文句ありますが、脳に刻んでいるくらい一番効率高い勉強方法かもしれません。
今はChatGPTやGoogleでわからないところがあればすぐ答えが出てくる時代ですが、自分から色んなシチュエイションを分析し、脳内でデバッグをすることもいい勉強方法と考えています。

## 最後

AIやツールは凄く便利ではありますが、一つ忘れては行けないことがあります。エンジニアはツールを作る仕事です。AI・ツールを頼り過ぎず、適時を使用することでしっかり自分から答えを見つけ出すのが大事と思います。

以上は自分からの経験談でした。ご閲覧いただきましてありがとうございました。
インフラエンジニアとしての第一歩。Qiitaはじめました

## はじめに

こんにちは、**Termnix-IT** と申します！  
この記事がQiita初投稿になります。  
現在、インフラエンジニアとしてSES現場で働きつつ、日々スキルアップのために勉強や検証を続けています。  
Qiitaでは、自分の学びを言語化して整理しつつ、誰かの参考になれば嬉しいなって思って発信を始めました。

## 自己紹介と名前の由来

Qiitaでは **Termnix-IT** という名前で活動しています。

この名前は、「Terminal」や「Linux」といった自分が好きな技術要素に加えて、  
自分の本名のイニシャル「I（名字）」と「T（名前）」にも由来があります。

実は、両親が「将来ITの世界に進んでくれたら」という思いで名付けてくれたそうで、  
気づけばその通りにこの業界に関わっている自分がいます。

そんな背景もあって、「Termnix-IT」という名前には自然と愛着が湧きました。  
Qiitaでもこの名前で、少しずつでも価値のあるアウトプットをしていけたらと思っています。

## 経歴とこれまで

高校では情報科、専門学校ではネットワークセキュリティ学科に所属し、
高校生の時代はITパスポート、専門学生時代は基本情報技術者などの資格を取得しながら、
ネットワークやインフラの基礎を学びました。

卒業後は約３年半通信施工の現場でLANや光ケーブルの配線、ネットワーク機器の設置、進捗管理などに携わり、  
その後、一度転職してSESとして医療系システムの現場に勤務しています。  
現在はLinuxやネットワーク構成の理解を深めながら、インフラエンジニアとしての力をつけている最中です。

## Qiitaを始めたきっかけ

これまではインプット中心の学習が多かったのですが、  
「学んだことを整理してアウトプットすることで、理解も定着も深まる」と感じるようになり、  
その第一歩としてQiitaを選びました。

自分がつまずいたポイントや、構築の中で気づいたこと、資格勉強のまとめなどを  
できるだけ分かりやすく、そして誰かが検索したときに引っかかるような内容で書いていけたらと思っています。

## 技術にハマったきっかけ

ITに興味を持った原点は中学生のとき、Life is Techというプログラミング教育団体のプログラムに参加したことでした。  
初めてスマホアプリを自分の手で作ったときのワクワク感は、今でも鮮明に覚えています。

「もっといろんな機能を作ってみたい」「次の作品をつくりたい」と思ったのがきっかけで、  
自然とITの世界にのめり込んでいきました。

そこから専門学校でネットワークやセキュリティを学び、今の仕事に繋がっています。

## 最近ハマっていること

最近は、自宅のネットワークをTP-Linkのルーターとスイッチで整理しながら、  
実際に構成を組んで勉強するのが楽しくなっています。  
業務とは違って、自分の好きなように試せる環境があるのはありがたいですね。

このへんの構成や設定も、Qiitaで少しずつ共有していけたらと思っています。

## 今後書いていきたいこと

まだまだ勉強中ではありますが、以下のようなテーマを中心に書いていく予定です。

- Linux / LPIC試験の学習メモや補足
- Zabbixなどの監視ツールの導入・設定
- ネットワーク構成やルーター/スイッチの設定（TP-Link製品が多めです）
- Webサーバの構築メモ（Apache/Nginxなど）
- 興味を持った生成AIの活用方法や実験メモ

今はLinuxやネットワーク構成、資格勉強（LPICなど）を中心に学んでおり、  
その中で「自分がつまずいたところ」や「調べて解決したこと」を少しずつ整理していこうと思っています。

あとは「自分がやってみたこと・うまくいったこと・うまくいかなかったこと」や
興味があり、その技術に触れてみたことを書いていきたいと思ってます。

## 最後に

ここまで読んでいただき、ありがとうございました！  
Qiitaはまだ初心者ですが、自分なりに試行錯誤しながら、続けていけたらと思っています。

技術も文章も未熟ですが、「これ分かりやすかった！」「自分もやってみようかな」と  
誰かが思ってくれたら嬉しいです。

よろしくお願いします！
関数について

Python学習における備忘録を記載する記事です。

## 関数とは

### ◯語源
- 関数はfunction（ファンクション）と呼ばれる
- 本来ファンクションは「機能」という意味
- 何故ファンクションを「機能」と呼ばず、「関数」と表しているか？
- 諸説として、functionのfunが中国語で「函」と訳されて、中国語の「函数」を日本でも使用されていた。
- しかし函が当用漢字から除かれたため、代わりに「関数」と書くようになった。
  ※「函」は入れる箱という意味らしい。

 
### ◯関数の利点
- 機能を部品化して再利用することが出来る。
- 繰り返し同じ・似たような処理を繰り返して使う場合、コードを毎回作成していると、大変である。
- 関数にすることで、ひとまとまりの処理を一つの部品としてまとめることが出来る。
- バグあった場合、関数にしておくと関数を修正するだけでOKなので、手間が省ける。
- 関数を作成していくことで、プログラミングは楽になり、開発スピードも上がる。

### ◯関数の定義

```py:例）
def 関数名(引数1, 引数2, ...):
    処理
    処理
    処理
    return 戻り値
```

引数：関数に渡された値
戻り値：関数が返す値
※いずれも省略は可
【学習記録5月21日】AWS SAA対策：ネットワーク接続／監視／通知／EBSのバックアップ

# 【学習記録5月21日】AWS SAA対策：ネットワーク接続／監視／通知／EBSのバックアップ

---

## 🔗 オンプレミス環境とAWSの接続方法

オンプレミスとAWSを接続するには、主に以下の2つの方法があります：

1. **AWS Direct Connect（専用線接続）**
2. **AWS Site-to-Site VPN（VPN接続）**

### ✅ Direct Connect の利点
- 専用線を用いた接続により、**低レイテンシーかつ高可用性**を実現
- 安定した帯域幅と高いセキュリティを確保可能
- 重要な業務システムに適している

### ✅ Site-to-Site VPN の利点
- 低コストかつ素早く導入可能
- AWSの仮想プライベートゲートウェイを経由して接続

---

## 📈 Amazon CloudWatch × Amazon SNS による監視と通知

- **Amazon CloudWatch** を使ってアプリケーションの**異常・正常状態を監視**
- 通知には **Amazon SNS** を使用

### 🔔 SNSによる通知方法
- SNSトピックを作成し、メールアドレスなどをサブスクライブ
- **SMS通知の場合**：電話番号に直接送信可能（トピックにサブスクライブ不要）

---

## 💾 Amazon DLMによるEBSスナップショットの自動化

**Amazon Data Lifecycle Manager (DLM)** は、EBSボリュームのスナップショットを以下のように管理可能：

- **作成（定期的）**
- **保存期間の設定**
- **古いスナップショットの削除**

### 💡 メリット
- 手動管理不要
- 一貫したバックアップポリシーを適用可能
- スナップショットの保持コスト削減

---

## 📝 まとめ

本記事では、ネットワーク接続の設計、システム監視と通知、EBSのバックアップ自動化など、AWSインフラの運用管理に関する知識を学びました。特にSAA試験では、選択肢における要件適合性の見極めが重要になります。

---
AWS構築学習記 #1｜静的Webサイト編：S3 + CloudFront + Route53 + ACMでセキュア公開

AWS学習のはじめとして以下の内容で試験的に静的Webサイト公開をしてみました！
（すでに作成したサイトは閉じています。）

以下のWebページを参考に作成をしています。
Hosting a Static Website on AWS Using S3, CloudFront, and Route53, with Just 7 Steps：
https://dev.to/aws-builders/guide-to-hosting-a-static-website-on-aws-using-s3-cloudfront-and-route53-with-just-7-steps-220b


## プロジェクト名		
静的Webサイト公開		
		
## 目的		
静的webサイトの高速・セキュア配信構築
S3 + CloudFront + Route53 + Certificate Manager(ACM) 	
		
## 対象ユーザー		
サービスの閲覧者（一般ユーザー）		
Webサイトの管理者（ファイルアップロード担当）		
		
## 全体構成概要		
外部ネットワーク → Route53 → CloudFront(Certificate Manager) → S3
		
## 使用サービス一覧		
Amazon S3	--------------
静的Webサイトホスティング（HTML/CSS/JS）の配置	
https://aws.amazon.com/jp/s3/?did=ft_card&trk=ft_card

Amazon Route 53	--------------
独自ドメインでのアクセスおよびDNSルーティング	
https://aws.amazon.com/jp/route53/?did=ap_card&trk=ap_card

Amazon CloudFront --------------
グローバルCDNキャッシュ・HTTPS対応・オリジン保護	
https://aws.amazon.com/jp/cloudfront/?did=ap_card&trk=ap_card

AWS Certificate Manager --------------
SSL証明書の発行とCloudFrontへの紐づけ
https://aws.amazon.com/jp/certificate-manager/
		
## ユースケース		
ユーザーが独自ドメインを入力することで、CloudFront経由でS3上のコンテンツに
安全・高速にアクセスできる。
		
## 非機能要件		
セキュリティ	HTTPSによる通信の暗号化	
可用性	CloudFrontによる冗長構成とCDN	
コスト最適化	S3標準ストレージ + CloudFrontのキャッシュで転送料削減	
		
		
		
## 想定トラフィック		
低トラフィック（テスト環境）		
		
## 成果物		
ドメインでアクセスできるWebサイト		
HLD / LLDドキュメント、構成図など	

## 簡単な作成概要
1.S3ストレージの作成と静的Webサイトの設定 --------------
　ここはコスト面を抑えるために、バージニア北部(us-east-1)を選択。
 　サイトの利用場所とリージョンの場所が遠すぎると通信の遅延が発生するが、
　CloudFrontを導入することで、サイトのキャッシュが使えるようになり、
 　一度閲覧したサイトページでは、距離的な通信遅延が発生しにくくなる

2.CloudFrontとS3の紐づけ --------------
　CloudFrontにて対象のS3を選択し、どのファイルをデフォルト表示にするかを設定。
　設定後に表示されるディストリビューションドメイン名をシークレットモードに入力し、
　設定したファイルのサイトページが閲覧できることを確認できればok

3.Route 53での独自ドメインの発行及びACMでの証明書発行 --------------
　Route53での独自ドメインの発行（10分程度）
 　独自ドメインが発行された後、ACMにて独自ドメインの証明書も発行（1時間程度）

4.作成した独自ドメインとCloudFrontの紐づけ --------------
　CloudFrontの設定項目に「Alternate domain name(CNAME)」の項目に、
　Route53で発行した独自ドメインを入力し、CloudFrontと紐づける。
 　設定後、シークレットモードにて独自ドメインを入力し、
  　記載したファイルのサイトページが閲覧できることを確認する。

## 感想
初めての構築　想定通りに動かなかった点としては、以下の通りでした。
・S3バケット作成時に、デフォルトのindex.htmlの部分に用意したhtmlファイル名を入力するが、index.htmlのまま入力してしまった
・CloudFront作成時に、Default root object - optionalにhtmlファイルを入れることを忘れ、403エラーが発生した
・CloudFrontのディストリビューションドメイン名にて対象のhtmlファイルの閲覧が可能になっても、Route53との連携がうまくいかなかった
→結果としてはCloudFrontで独自ドメインを使用するためには、証明書が必須であることをネットより確認して、ACMを用いて証明書を発行
　その後、再度設定を行うと問題なく実装ができた。

全体的な感想としては、特にコスト関連の検討が面白かったです。
CloudFrontのキャッシュ利用はコスト削減にも効果的。
アクセスの大半がCloudFrontから配信されるため、S3へのリクエスト回数が抑えられる。
※S3はデータの読み書きでも料金が発生するため
安価なリージョンのS3 + CloudFrontの構成で、高速かつ低コストな運用が可能になる。
今後は「どこまでCloudFrontで賄えるのか」に着目して、最適なアーキテクチャを模索していきたいです。

## 改善案
今回はS3→CloudFront→ACM→Route53の順で構築を進めましたが、
証明書の発行に時間がかかることを踏まえると、次回以降は先にRoute53とACMの設定を進めておき、証明書の発行待ち時間中に他の構成要素を並行して進める方が効率的だと感じました。

## 次回予告
LAMPアプリ構築準備中...
アプリ開発100本ノックDay5 うるさい飼い猫をなだめさせるiosアプリ開発

## Day 5: 猫の反応する音再生アプリ開発 - iOSアプリで夜の静寂を取り戻す 😴

**目的:**  夜間における飼い猫たちの活動による騒音問題を解決するため、猫が反応する特定の音声を再生するiOSアプリを開発する。

**背景:** 2匹の飼い猫の夜間における活発な活動は、しばしば安眠を妨げる 😫 。子猫の鳴き声やピンポン音などの特定の音声は、猫の注意を惹きつけ、活動を鎮静化させる効果が経験的に確認されている。しかし、YouTube等でこれらの音声を再生する操作は煩雑であるため、簡便な音声再生アプリの開発が必要となった。

**アプリ概要:**

タップ操作で特定の音声を再生するシンプルなiOSアプリ📱。

**使用言語:** Swift

**実装コード:**

```swift
//
//  ContentView.swift
//  catsound
//
//  Created by y s on 2025/05/06.
//

import SwiftUI
import AVFoundation

struct ContentView: View {
    // 音声プレーヤー
    var audioPlayer: AVAudioPlayer?

    init() {
        // 音声ファイルのURLを取得
        if let soundURL = Bundle.main.url(forResource: "kitty", withExtension: "mp3") { // tap_sound.mp3をプロジェクトに追加
            do {
                // 音声プレーヤーを初期化
                audioPlayer = try AVAudioPlayer(contentsOf: soundURL)
                audioPlayer?.prepareToPlay() // 再生準備
            } catch {
                print("Error loading sound: \(error)")
            }
        }
    }


    var body: some View {
        ZStack { // 画面全体をタップ可能にするためZStackを使用
            Color.orange // 背景色

            Text("子猫")
                .font(.largeTitle)
                .foregroundColor(.white)
        }
        .onTapGesture {
            // タップされたときに音を鳴らす
            audioPlayer?.play()
        }
    }
}
```

**重要だと思った点 💡**
オプショナル型(AVAudioPlayer?): 音声ファイルの読み込み失敗等によるアプリのクラッシュを防ぐため、音声プレーヤーをオプショナル型で定義。  安全第一！
エラー処理(do-catch構文): 音声プレーヤーの初期化処理における潜在的なエラーを捕捉し、適切なログ出力を行う。 
リソースアクセス(Bundle.main.url): アプリにバンドルされた音声ファイルへのアクセス方法。 

**開発における課題:**
TestFlightを用いたアプリ配布において、Apple Developer Programへの登録とバンドルIDの設定に時間を要した。VPN接続が原因で登録手続きが阻害されたが、接続解除後に正常に完了した。💦

**成果物**
![スクリーンショット 2025-05-21 21.39.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045700/efb5afe5-b0b3-4f93-b698-3f035b29a48e.png)



**今後の展望:**
音声バリエーションの追加: 猫の反応を観察し、効果的な音声を追加することでアプリの利便性を向上させる。😼
音量調整機能の実装: ユーザーによる音量調整を可能にする。 🔊
# 📘基本情報技術者試験のためのやさしいIT用語まとめ【自分用メモ5月21日】

# 📘基本情報技術者試験のためのやさしいIT用語まとめ【自分用メモ】

基本情報技術者試験の勉強を進める中で、わかりにくかった用語をできるだけやさしく、身近な言葉でまとめてみました！  
「言葉だけで混乱する」ことを減らしたい方におすすめの用語解説です✍️

---

## 💻 コンピュータの基本用語

### 🔹 ニモニックコード  
**コンピュータにわかりやすく命令を出すための、かんたんな文字のコード。**

### 🔹 命令取り出し（フェッチ）  
**コンピュータが命令を1つ取り出す作業のこと。**

### 🔹 クロック周波数  
**コンピュータが「1秒間に何回うごけるか」をあらわすスピードの単位。**

### 🔹 ページング  
**コンピュータのメモリ（作業机）を小さなページに分けて、必要なところだけ使う方法。**

### 🔹 投機実行  
**コンピュータが先に「こうなるかも！」と予想して、仕事を先に進めちゃうこと。**

---

## ⚙️ コンピュータの仕組みや管理

### 🔹 メモリリーク  
**コンピュータが使っていたメモリ（作業のための机）を片づけずに放置しちゃうこと。**

### 🔹 SDRAM  
**パソコンが「いま作業していることをすばやく覚えておくための特別なメモリ」。**

### 🔹 ストライピング  
**データを小さく分けて、いくつかのハードディスクに分けて保存する方法。**

### 🔹 ライトスルー方式  
**データをすぐにメモリに書き込む方式。**

### 🔹 ライトバック方式  
**データは一度キャッシュに書いて、あとでメモリに書く方式。**

### 🔹 ロールバック  
**なにかうまくいかなかったときに、元の状態にもどすこと。**

### 🔹 コールドスタート  
**コンピュータやサービスを最初に起動するとき、まだ準備ができていない状態のこと。**

---

## 🛡️ セキュリティ

### 🔹 SMTP-AUTH  
**メールを送るときに「この人が本当にメールを送っていい人か？」をチェックするしくみ。**

### 🔹 ディレクトリトラバーサル攻撃  
**本来見せちゃいけないパソコンの中のファイルを、ズルして見ようとする攻撃のこと。**

---

## 🏭 生産管理・業務系

### 🔹 MRP（資材所要量計画）  
**「モノを作るために、必要な材料をいつ、どれだけ準備するかを決める方法」。**

### 🔹 PLM（製品ライフサイクル管理）  
**モノを「作る前から作った後までず〜っと見守るしくみ」のこと。**

---

## 🧠 経営・分析・計画

### 🔹 SWOT分析  
**自分たちの「いいところ・わるいところ」と、まわりの「チャンス・ピンチ」をはっきりさせて、どう動くか考える方法。**

### 🔹 FS関係（Finish to Start）  
**ある作業が「終わったあとに、次の作業が始められる」というつながり方のこと。**

### 🔹 KPI  
**目標に向かって、うまく進んでいるかをはかる数字のこと。**

### 🔹 ナレッジマネジメント  
**みんなの知っていることや経験を集めて、大切にして、みんなが使いやすくすること。**

### 🔹 ベンチマーキング  
**他の会社やチームがどうやってうまくやっているかを調べて、まねして自分たちもよくすること。**

### 🔹 プロダクトライフサイクル  
**商品（プロダクト）が生まれてから売れなくなるまでの一生の流れのこと。**

---

## 🌐 ネットワーク・インフラ

### 🔹 ゲートウェイ  
**ちがう種類のコンピュータのネットワーク同士をつなぐ「入り口」や「門」のこと。**

### 🔹 スループット  
**コンピュータやネットワークが、どれくらい速くデータを送ったり処理したりできるかのはかり。**

### 🔹 HAクラスター構成  
**コンピュータやサーバーを2台以上つなげて、もし1台が壊れてももう1台がすぐに代わりをする仕組み。**

---

## 🕒 CPUのスケジューリング方式

### 🔹 ラウンドロビン方式  
**コンピュータが「みんなに順番で、同じ時間だけ仕事をさせる」しくみ。**

---

## ⚙️ ソフトウェア技術

### 🔹 Javaサーブレット  
**インターネットのウェブページを作るときに、Javaというプログラミングで動く「裏の仕組み」。**

---

## 🛠️ 問題解決・パフォーマンス

### 🔹 ボトルネック  
**全体の動きを遅くしてしまう、一番細くて大変なところのこと。**

---

## 📝 まとめ

IT用語は、難しく感じても「身近なもの」に置きかえると一気にイメージしやすくなります！  
今後もこうした形で、試験対策メモをどんどんまとめていきます💪

---
【Mac】コマンドでOSをアップデートする方法


`softwareupdate`コマンドを使用してmacOSをアップデートできます。

## 利用可能なアップデートの一覧を取得

以下のコマンドを実行すると利用可能なアップデートの一覧が出力されます。

```terminal
softwareupdate -l
```

```terminal
$ softwareupdate -l

Software Update found the following new or updated software:
* Label: Command Line Tools for Xcode-15.3
	Title: Command Line Tools for Xcode, Version: 15.3, Size: 707501KiB, Recommended: YES, 
* Label: Command Line Tools beta 2 for Xcode-16.0
	Title: Command Line Tools beta 2 for Xcode, Version: 16.0, Size: 743581KiB, Recommended: YES
```

## 利用可能なすべてのアップデートをインストール

次のコマンドを実行すると利用可能なすべてのアップデートをインストールできます。

```terminal
sudo softwareupdate -i -a
```

## 特定のアップデートをインストール

アップデート名を指定すると特定のアップデートのみインストールできます。

```terminal
sudo softwareupdate -i "アップデート名"
```
Javaの基礎復習２

インターフェースについて学習したことをまとめていきます。

## インターフェースについて
インターフェースとは、実装したクラスに対して共通の機能を持たせたいときに定義するルールのようなものです。主にメソッド名・引数・戻り値のみを定義します。

インターフェースを実装するときはimplementsキーワードを使って実装します。実装したクラスは必ず定義されているメソッドをオーバーライドしなければなりません。
また、インターフェースは抽象クラスと違って多重継承が可能です。

```
// インターフェースの定義
public interface Animal {
    void type();
}

public interface Cry {
    void speak();
}

// インターフェースを実装するクラス（多重継承）
public class Dog implements Animal, Cry {
    public void type() {
        System.out.println("柴犬");
    }

     public void speak() {
        System.out.println("ワンワン！");
    }
}
```

## 実装を持つメソッドについて
インターフェースには、実装を持つことのできるメソッドが３種類あります。

・デフォルトメソッド
・staticメソッド
・privateメソッド

デフォルトメソッドはインターフェース特有のメソッドで、defaultキーワードを使うことで追加できます。
実装クラスでオーバーライドする必要がありません。（オーバーライドしてもエラーにはなりません）

staticメソッドはインターフェース自身に紐づくため、インターフェース名.メソッド名()で呼び出せます。

privateメソッドは完全内部処理用のメソッドですので、外部から呼び出すことはできません。

```
public interface Animal {
    void methodA();

    default void methodB() {
        System.out.println("Default Method");
    }
    
    static void methodC() {
        System.out.println("Static Method");
    }

    private void methodD() {
        System.out.println("Private Method");
    }
}

public class Dog implements Animal {
    public void methodA() {
        System.out.println("Method");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.methodA();  // Method
        dog.methodB();  // Default Method
        Animal.methodC(); // Static Method
    }
}
```

## インターフェースのフィールドについて
インターフェースのフィールドは定数しか定義できません。
"public static final"以外のキワードを使用するとコンパイルエラーとなります。
```
// 暗黙的にpublic static finalとして扱われる
public interface Animal {
    String name = "ポチ";
}
```

以上
【推しログ】推し活を推しが応援してくれるアプリをリリースしました

# ◆◇推し活をもっと楽しく、もっとカンタンに！◇◆
– 日々の推し活を記録して、推しともっと近くに –

http://apps.apple.com/us/app/%E6%8E%A8%E3%81%97%E3%83%AD%E3%82%B0-%E3%81%82%E3%81%AA%E3%81%9F%E3%81%AE%E6%8E%A8%E3%81%97%E6%B4%BB%E3%82%92%E6%8E%A8%E3%81%97%E3%81%8C%E5%BF%9C%E6%8F%B4%E3%81%97%E3%81%A6%E3%81%8F%E3%82%8C%E3%82%8B%E3%82%A2%E3%83%97%E3%83%AA/id6746085816

『推しログ』は、推しとの大切な時間を記録し、思い出として残せるファン専用の記録アプリです。
ライブ、グッズ購入、聖地巡礼などの体験を、タイムラインやマップで振り返ることができます。
さらに、推しからのリアクション（AIチャット）も届いて、日々の推し活がもっと楽しく！

# アプリ概要
アプリ内では、タイムライン・マップ・チャットなど複数の機能を通して、あなたの推し活をまるごと記録＆可視化します。

・タイムライン形式で、1日をイベント単位で記録
・マップ機能で、聖地巡礼を写真と一緒に保存
・AIによる「推し」からのチャット返信が届く！
・投稿に対して「推し」からメッセージが届くことも…!?

![推しログ (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/a518f706-45ce-4dc3-aa77-020e106db9e8.png)
# 主な機能

日付・時間ごとの推し活スケジュールの記録

聖地巡礼を地図と写真で保存＆閲覧

推しとのチャット風コミュニケーション

推し活記録に応じた「推し」からのメッセージ受信機能

思い出をSNS風の画面で一覧表示

あなたの「好き」がどんどんカタチになる、そんな体験を。
『推しログ』で、推し活をもっと特別なものにしませんか？

あなたの推し活を、記録・共有・応援する『推しログ』。
今すぐダウンロードして、毎日がもっと輝く推しライフをはじめましょう！
AITRIOS外部転送の送信時間

AITRIOSの運用を考えたときに、真っ先に外部転送が気になるのではないでしょうか。わたしは運用するわけでもなく、ただ遊んでいるだけですが、気になってしかたがありません。

Console、Azure Blob Storage、HTTP Serverを試したところ、HTTP Serverが一番速い感じだった（？）ので、HTTP Server形式でちょっとしたWebアプリを作ってみたりしました。

https://www.docswell.com/s/matsujirushi/KDN334-2025-02-08-204609

https://youtu.be/U0toeEwpCg0

https://github.com/matsujirushi/aitrioslocalserver

結果には満足していますが、、、
**本当にHTTP Serverが一番速いのか？**
という疑問がもやもやと胸の中に残っていました。

ということで、きちんと全種類の外部転送について、送信時間を測ってみました。

# 外部転送先は5種類

外部転送のおさらい。
AITRIOSは推論結果（や画像）を、4つのクラウドサービスと1つのローカルサーバーのいずれかへ転送することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/65d69204-193c-4eed-869d-59a2df716b93.png)

> ↑この図は少し間違っています。理解しやすいように雰囲気を重視しているためです。

1. **Console**
    Consoleの持つストレージに推論結果を**保存**します。

1. **AWS Amazon S3**
    AWSのストレージサービスで、推論結果を**保存**します。

1. **Azure Blob Storage**
    Azureのストレージサービスで、推論結果を**保存**します。

1. **Azure Event Hubs**
    Azureのイベントストリーミングサービスで、推論結果を**一時的に保存**します。永続的に保存したいときは別のサービスを組み合わせます。

1. **HTTP Server**
    自前HTTP Serverなので**いかようにでも**なります（手間がかかるけど）。通信が暗号化されないので、**盗聴や改ざんのリスク**があります。

# ConsoleとAzure Event Hubsが速い

ズバリ、こちらが推論結果の転送を実測した結果です！！

* 測定条件
  * Console Developer Edition
  * AIH-IVRW2
  * 推論結果のみを送信（画像は送信しない）
  * AIH-IVRW2の送受信パケットをキャプチャして算出（つまり、ここでいうTimeは、AIH-IVRW2が送信開始してから送信完結するまでの時間で、バックエンドがデータを利用できるまでの時間はふくまれな）
  * Packets,Bytes,Timeは数件送信したときの平均

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/acd091ff-2b94-4766-9898-ca4d9bd5dcbf.png)

HTTP Serverが一番速いと思っていたのですが、、、いやいや、**Console**と**Azure Event Hubs**のほうがもっと速かったです😅。

軽くｍ感じ、

* **AWS Amazon S3**と**Azure Blob Storage**は、送信毎にTCPコネクションを確立していて、毎回TLSネゴシエーションしている。だから遅い。
* **HTTP Server**は、送信毎にTCPコネクションを確立しているが、TLSネゴシエーションが無いので速い。
* **Console**は、TCPコネクションを維持していて、そこで送信するだけなのでメチャ速い。（TCPのPSHとACKの2パケットだけ！）
* **Azure Event Hubs**は、AIH-IVRW2からの送信は**Console**と同じ。メチャ速い。（Consoleの裏側でAzure Event Hubsに再転送している。）

あたりの影響が大きいようでした。

# 個々の実測データは次回

外部転送先毎の実測データについては、追ってQiita記事を書こうと思います。お楽しみに。
【C++入門】`lower_bound` と `upper_bound` を完全に理解

`std::set` や `std::map` などでよく登場する `lower_bound` と `upper_bound`。  
この記事では、これらの関数の**意味・違い・使い方**、さらに**競技プログラミングでの応用例**までわかりやすく解説します。

---

## ✅ 結論：`lower_bound` と `upper_bound` の違い

| 関数名 | 意味 | 条件 | 返すイテレータ |
|--------|------|------|----------------|
| `lower_bound(x)` | **x以上** の要素 | `>= x` | 最初の該当要素 |
| `upper_bound(x)` | **xより大きい** 要素 | `> x` | 最初の該当要素 |

---

## 🔰 基本使用例（`std::set`）

```cpp
#include <iostream>
#include <set>
using namespace std;

int main() {
    set<int> S = {10, 20, 30, 40, 50};

    auto it1 = S.lower_bound(25); // -> 30
    auto it2 = S.upper_bound(30); // -> 40

    if (it1 != S.end()) cout << "lower_bound(25): " << *it1 << endl;
    if (it2 != S.end()) cout << "upper_bound(30): " << *it2 << endl;
    return 0;
}
```
### ✅ 出力
```
lower_bound(25): 30
upper_bound(30): 40
```

---

## 🧪 動作まとめ表

`set<int> S = {10, 20, 30, 40, 50}` の場合：

| 検索値 x | `lower_bound(x)` | `upper_bound(x)` |
|----------|------------------|------------------|
| 10       | 10               | 20               |
| 25       | 30               | 30               |
| 30       | 30               | 40               |
| 50       | 50               | end()            |
| 60       | end()            | end()            |

---

## 🔄 std::vector との違い
#### vector の場合、lower_bound / upper_bound はalgorithmにある関数を使います。

```cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    vector<int> V = {10, 20, 30, 40, 50};

    auto it = lower_bound(V.begin(), V.end(), 25); // 30 の位置

    if (it != V.end())
        cout << *it << endl;  // 30
}
```

✅ 注意点：
vector はソートされている必要があります。

戻り値はイテレータなので、位置を知りたい場合は it - V.begin() で添字が得られます。

---
## 📌 競技プログラミングでの実用テクニック

### 🔁 `x以下の最大値` を探す方法

`std::set` は降順ソートができないので、次のように**負数を使って工夫**します：

```cpp
set<long long> S_neg;
S_neg.insert(-x); // 負の値を挿入（逆向き管理）

// x以下の最大の値を取得するには：
long long max_le_x = -(*S_neg.lower_bound(-x));
```
これにより、x以下の最大の値が O(log N) で求められます。

🧠 よくある使い分け
---
|目的|使用関数|説明|
|----------|---------------|--------------|
|x以上の最小値|lower_bound(x)	|範囲の開始・検索|
|xより大きい最小値|upper_bound(x)|範囲の終了・次の要素|
|x以下の最大値|lower_bound(x+1) のイメージ|降順管理や負数で工夫|
---
## 🔚 まとめ
#### ・lower_bound は「x以上」の最小値を返す
#### ・upper_bound は「xより大きい」の最小値を返す
#### ・x以下の最大値 を求める場合は、負の値を使うテクニックが有効
#### ・std::set, std::map と組み合わせて、O(log N) で高速に探索できる
---
## 📘 おすすめ学習リソース
cpprefjp - lower_bound
AtCoder典型90問やABCコンテストでの練習
Gemini API を開発環境で使うための手順（React + Vite）

## はじめに

Googleが提供する大規模言語モデル「Gemini API」を、React（Vite）で構築したアプリから呼び出し、英単語検索や要約・文章生成などに使う方法をまとめます。

## 今回のユースケース

### 英単語検索アプリ

![画面収録-2025-05-21-20.32.52-_1_.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3977506/6b9825bc-2f42-4b3a-a0ab-127a459fdf3d.gif)

検索欄に英単語を入力して「検索」ボタンを押すと、Gemini API がその単語の意味や品詞、発音記号、例文などを返してくれます。
これを整形してカード形式で画面に表示することで、ユーザーは視覚的にわかりやすく情報を得ることができます。

プロンプトに出力フォーマットを明示することで、APIの応答内容も安定し実用的な辞書アプリのような機能を実現できます。


## 開発環境

* React（Vite）
* Google Gemini API（無料枠）
* firebase

## 手順まとめ

### 1. Google Cloudでの準備

#### プロジェクト作成

* [Google Cloud Console](https://console.cloud.google.com/) で新規プロジェクトを作成

#### Gemini API を有効化

* 「API とサービス」→「ライブラリ」→ `Generative Language API` を検索して「有効にする」

#### APIキーの作成

* 「認証情報」→「＋認証情報を作成」→「APIキー」
* 制限なしで作成して `.env` に設定

```env
VITE_GEMINI_API_KEY=（作成したAPIキー）
```

#### Viteの開発サーバーを再起動

```bash
npm run dev
```


### 2. Gemini API を呼び出すコードを書く

以下のコードは検索語を使って Gemini API を呼び出し、結果を画面に表示する一連の流れを実装したものです。

```tsx
// ボタンを押したときに実行される非同期関数を定義
const handleSearch = async () => {

  // Gemini API に送る質問文（プロンプト）を定義
  // APIに送る「質問文（プロンプト）」を定義しています。整った出力が得られるよう、形式を指定しています。
  const prompt = `
  次の英単語について、以下の形式で日本語で答えてください：

  1. 意味
  2. 品詞
  3. 発音記号
  4. 例文（英語と訳）

  単語: ${input}
  `;

  // Gemini API へ POST リクエストを送る
  // fetch関数でエンドポイントにアクセスし、headersとbodyを含めてリクエスト
  const res = await fetch(
    `https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=${import.meta.env.VITE_GEMINI_API_KEY}`,
    {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({
        contents: [{ parts: [{ text: prompt }] }]
      })
    }
  );

  // レスポンスを JSON 形式で取得し、候補の中の最初のテキスト部分を抽出
  const data = await res.json();
  const result = data.candidates?.[0]?.content?.parts?.[0]?.text;

  // テキストが取得できれば state にセット、なければエラーメッセージ
  setResult(result || '取得できませんでした');
};
```
## Gemini API特有の部分 

以下は会話の流れを構造的に扱うためのGemini API特有の部分です

```tsx
body: JSON.stringify({
contents: [{ parts: [{ text: prompt }] }]
```
### contents
「会話の全体（1回分の質問）」を表します。
配列なので、複数のやりとり（例：システム→ユーザー→アシスタント）をまとめて送れるようになっています。

1つの質問文（会話の1ターン）を1オブジェクトで表しています。

### parts
これは「その会話の中身（メッセージの断片）」を表します。
→ たとえば1つの文に「テキスト」「画像」など複数のパートを入れられます（今回はテキストだけ）

質問文の中で送る「テキスト」を指定している部分に該当します。

### text: prompt
あなたが書いた質問（＝プロンプト）。
たとえば「この単語の意味と例文を日本語で教えて」というような内容です。

このコードは [Google Generative Language API（Gemini）公式ドキュメント](https://ai.google.dev/docs) をもとに、Reactアプリ内での使用に最適化したサンプルです。プロンプトや取得方法は本プロジェクトのユースケースに合わせて調整しています。


### 3. モデルについて

| モデル名             | 特徴              |
| ---------------- | --------------- |
| gemini-1.5-flash | 高速・軽量・無料枠でも安定   |
| gemini-1.5-pro   | 高精度・無料枠は厳しい制限あり |

MVPや学習用途ではflashで十分な精度だと思いました。


## 今後の拡張性

* `prompt` の工夫で整形された出力が得られる
* 長文をカットしたい場合は `result.slice(0, 300)` などで調整可能
* 表示構造を整えたい場合は JSON形式での返答を促すことできる


## 補足

* `429 Too Many Requests` エラーが出た場合は時間をおいて再実行 or `pro`モデルから`flash`モデルへの切り替えを検討
* `.env`の変更後はViteを再起動しないと反映されません


以上がReactアプリにおけるGemini API連携の一通りの流れです。
Bedrockを利用したエラーログの解析効率化に取り組んでみた

# はじめに
こんにちは。NTTデータ先端技術の@tsuchidahrkです。
皆さんはエラーログから原因を切り分けする際、解析に時間がかかり、他の作業が圧迫されて困った経験はありませんか？
私は、AWSサービスを利用したシステムの運用保守業務に携わっており、毎日困っています！
業務でシステムエラーが発生したらBedorockに解析をさせて作業時間を短縮したいと考え、社内で若手メンバーの有志を募り、簡易的なシステムを作り検証してみたいと思います。
本記事では、検証内容やシステム構成について紹介します。

# 検証内容
業務では、以下のフローでシステムからエラーログの通知を受け取っています。
1. アプリケーションが出力したログをCloudWatch Logsに送信
2. メトリクスフィルターでエラーログを検出
3. CloudWatch Alarmが発報
4. 発報をトリガーにSNSでエラーログをメール通知

今回の検証では、上記3の処理後、イベント通知でLambda関数を起動し、Bedrockにエラーログを解析させ、解析結果をSNSによるメール通知で受け取るフローを試してみます。
フローとしては以下になります。
1. アプリケーションが出力したログをCloudWatch Logsに送信
2. メトリクスフィルターでエラーログを検出
3. CloudWatch Alarmが発報
4. 発報をトリガーにLambda関数を起動
5. Lambda関数によりBedrockでエラーログを解析
6. Lambda関数により解析結果をSNSでメール通知

メトリクスフィルターでのエラーログの検出をトリガーにLambdaが起動し、Bedrockにエラーログを解析させ、原文と解析結果をSNSを用いてメール通知と飛ばします。
 
# システム構成＆説明
![bedrockエラー解析v2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526081/4e40094d-2953-418b-b399-c84e7ca2c22d.png)

* EC2：稼働しているアプリケーションが動作している想定。こちらからエラーログを出力。
* CloudWatch Logs & Alarm : アプリケーションからのエラーログ出力を検知し、アラートを発報する。
* EventBridge：CloudWatch AlarmのアラートをトリガーにLambdaを起動させる。
* Lambda&Bedrock：エラーログをCloudWatch Logsから読み取り、これを入力文としてBedrockを実行する。分析した結果をSNSに出力する。
* SNS：Lambdaが出力したログをメールで通知する。
 
# 今後に向けて
今回の記事では、業務で課題に感じていたシステムエラーの解析をBedrockで効率化出来ないか考え、今後実施する検証内容や検証を行うシステムの構成について紹介してみました。
次回の記事では、実装内容について紹介したいと思います。
宣言はプレッシャーじゃない。ゆるく話しても目標は進む

「目標を立てたら誰かに宣言することで自分にプレッシャーを与える」
というアドバイスを見かける。
一理あると思う一方で、プレッシャーとは違う効果もあるのではないか？とも思う。

宣言するということは、目標を声や文字で表現するということ。  
その過程で「自分はこういう目標に向かって動こうとしてるんだ」という  
メタ認知ができるのも、宣言することの効果ではないだろうか。

自分はというと、追い込むために誰かに宣言するってことはないが、  
「こんなことやろうと思ってるんですよね～」と誰かに話すことはよくある。  
その話したことに対してはその後も自然と意識が向き続けるので、  
結果的にそれに向かって行動してるな～と感じる。
これがメタ認知なんだろうな、たぶん。
追い込んでる感覚はない、やろうとする意志がただ自然と湧いてくる。

何が言いたいかっていうと、目標を宣言することはとても有効。  
だけど「自分に圧をかけよう」というストイックな目的ではなく  
もっと緩い動機でいいんじゃないか？という話。

そもそも「誰かに宣言して自分にプレッシャーをかけよう」と思える心の強い人は、  
そんなことしなくても目標に向かって動ける人だと思う（笑）
スクショに説明をつけるためだけの簡易メモ帳をPython＋WebViewで作った


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53489/5bfbe8ad-2aa4-44a2-94d5-224c17b17ebe.png)

↑こういう「何もしない」エディタ作った。

### 完成ソース

```fukidasih.py
import webview

HTML = """
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title></title>
  <style>
    html, body {
      height: 100%;
      margin: 0;
      padding: 0;
      width: 100%;
      overflow: hidden;
    }
    textarea {
      width: 100vw;
      height: 100vh;
      box-sizing: border-box;
      font-size: 3em;
      border: 5px solid red;
      border-radius: 2px;
      resize: none;
      outline: none;
      margin: 0;
      padding: 5px;
    }
  </style>
</head>
<body>
  <textarea autofocus></textarea>
  <script>
    const textarea = document.querySelector('textarea');
    let fontSize = 3;
    window.addEventListener('keydown', function(event) {
      if (event.ctrlKey) {
        if (event.key === '+' || event.key === '=') {
          fontSize += 0.1;
          textarea.style.fontSize = fontSize + 'em';
          event.preventDefault();
        } else if (event.key === '-') {
          fontSize = Math.max(0.5, fontSize - 0.1);
          textarea.style.fontSize = fontSize + 'em';
          event.preventDefault();
        }
      }
    });
  </script>
</body>
</html>
"""

if __name__ == '__main__':
    webview.create_window(
        "",
        html=HTML,
        width=600,
        height=200,
        resizable=True  # デフォルトでTrueですが明示しています
    )
    webview.start()

```

動作を確認したはWindows11のみです。

### 作った背景

- スクショに吹き出しをつけるだけの仕事が多すぎる
- GoogleSlideに貼り付けて吹き出しをつけるんだけど、結局またそれもスクショにしてSlackとかに送ることになる。そしてGoogleSlideは自動的にファイルができちゃうのが邪魔
- メモ帳はメニューバーが邪魔
- windowsのpython＋Webviewが一番シンプルなGUIなのではないかと思って試してみたかった

### 本当はやりたかったけどやってないこと

- タイトルバーも消したかったけど、タイトルバーも消すと移動も終了もできなくなって不便だった
- 半透明にしたかったけど、透明にするとエディタにフォーカスがいかなかった
- Electronはタイトルバー消したり半透明にしたりできるけど、そこまでの大げさなものは要らない

### 満足したところ

- Windows＋Pythonでフレームワークに頼らずペラ1のGUIアプリが作れた
- これといったデザインオプションなどないが、ソースを直接いじればいいのであとはお前ら好きなようにいじれと言える
初心者エンジニア必読！成長を加速させる必携の4冊



こんにちは！エンジニアとしてのキャリアをスタートさせたばかりの方や、プログラミングの基礎を固めたい方に向けて、私が「絶対に買っておくべき」と太鼓判を押す4冊の技術書を紹介します。これらの本は、私自身のエンジニアとしての成長を大きく助けてくれた宝物です。

## 1. リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック
![スクリーンショット 2025-05-21 20.23.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116912/a2997059-f56e-4757-a083-81aeaa4d5577.png)

「動くコード」と「良いコード」は別物です。この本は、他の人が読んで理解しやすい、つまり「リーダブル」なコードを書くための実践的なテクニックが満載です。

### なぜオススメか？
- 変数の命名からコメントの書き方まで、コードの「美学」を学べる
- どんな言語でも適用できる普遍的な原則が身につく
- 実例が豊富で、「before/after」の比較がわかりやすい

### Amazonリンク
https://amzn.to/3H6EibV

## 2. ネットワークはなぜつながるのか

![スクリーンショット 2025-05-21 20.25.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116912/df94f230-ae0c-4192-9943-af76a654ec8e.png)


Web開発やクラウドサービスが当たり前の今、ネットワークの基礎知識は必須です。この本は難しい概念をイラストや例えを使って、驚くほどわかりやすく解説しています。

### なぜオススメか？
- 「パケットの旅」を追いながら、TCP/IPの仕組みがストーリーとして理解できる
- ルーターやDNSなど、普段意識しない「裏側」の動きがクリアになる
- 技術書とは思えないほど読みやすく、挫折しない

### Amazonリンク
https://amzn.to/3H6EibV

## 3. プログラムはなぜ動くのか

![スクリーンショット 2025-05-21 20.26.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116912/40396e0c-0880-4d76-a7a7-3554c5e7bd6d.png)

高級言語で書いたコードがどのようにしてマシン語に変換され、CPUで実行されるのか。この「黒魔術」のような過程を解き明かしてくれる一冊です。

### なぜオススメか？
- コンピュータの内部動作を知ることで、バグの原因がより理解しやすくなる
- メモリ管理やポインタなどの概念が腑に落ちる
- パフォーマンスを意識したコーディングができるようになる
- 
### Amazonリンク
https://amzn.to/4dnIxvA

## 4. プリンシプル オブ プログラミング

![スクリーンショット 2025-05-21 20.27.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116912/b078d5f4-1933-4f80-ab47-7327f9f72ef8.png)


「3年目の壁」を突破するために必要な、プログラミングの原則と設計の考え方が詰まった良書です。特に、オブジェクト指向プログラミングに関する深い理解が得られます。

### なぜオススメか？
- DRY、KISS、YAGNI、SOLIDなど重要な原則が実例とともに学べる
- デザインパターンの本質的な理解につながる
- 短期的な小細工ではなく、長期的に価値のあるコードを書くための思考法が身につく

### Amazonリンク
https://amzn.to/4kxOZCT

## まとめ：4冊を読むことでどう変わるか

これら4冊は単なる「ハウツー本」ではありません。エンジニアとしての**思考様式**と**視野**を大きく変えてくれる本です。

- **リーダブルコード**：「他者のため」のコードを書く姿勢
- **ネットワークはなぜつながるのか**：目に見えない通信の流れを把握する視点
- **プログラムはなぜ動くのか**：抽象化の裏にある実装の理解
- **プリンシプル オブ プログラミング**：持続可能なシステム設計の考え方

特に初学者のうちは「動くコードが書けた！」という達成感に満足しがちですが、これらの本を通じて「なぜそうなるのか」「もっと良い方法は？」と考える習慣がつけば、成長速度は格段に上がります。

ぜひ手に取ってみてください！皆さんの技術的な視野が広がることを願っています。
[Deno] Node.js をインストールせずに clean-css-cli を用いて CSS を minify する

`clean-css-cli` は npm パッケージのため従来は Node.js が必要でしたが、現在の Deno は Node.js と互換性があるため、Node.js をインストールせずに使用可能です。

(全ての Node.js 用のコードがそのまま Deno で動くとは限らないことに注意。)

参考「[Node and npm Compatibility](https://docs.deno.com/runtime/fundamentals/node/)」

Deno 自体のインストールは公式ドキュメント等を参照。

参考「[Installation](https://docs.deno.com/runtime/getting_started/installation/)」

# 1. インストール

`deno install` で npm パッケージをインストールします。

```bash:リモートの CSS を扱わない場合
deno install -g --allow-read --allow-write --allow-env -n cleancss npm:clean-css-cli
```

```bash:リモートの CSS を扱う場合
deno install -g --allow-read --allow-write --allow-net --allow-env -n cleancss npm:clean-css-cli
```

オプション:

- `-g`/`--global`: グローバル
- `--allow-read`,`--allow-write`, `--allow-net`, `--allow-env`: 許可
- `-n`/`--name`: 実行ファイル名

参考「[deno install](https://docs.deno.com/runtime/reference/cli/install/)」
参考「[Permissions - Security and permissions](https://docs.deno.com/runtime/fundamentals/security/#permissions)」
参考「[clean-css-cli - npm](https://www.npmjs.com/package/clean-css-cli)」

# 2. 使い方

インストール後は通常の `cleancss` のように CSS を minify 出来ます。

```bash
cleancss -o one.min.css one.css
```

参考「[GitHub - clean-css/clean-css-cli: The command line interface to clean-css CSS optimizer](https://github.com/clean-css/clean-css-cli)」

インストール時にオプション `--allow-net` を指定しなかった場合、リモートの CSS を扱うときにネットワークアクセスの許可が必要です。

# 3. アンインストール

アンインストール時はパッケージ名でなく実行ファイル名を指定します。

```bash
deno uninstall -g cleancss
```

参考「[deno uninstall](https://docs.deno.com/runtime/reference/cli/uninstall/)」
[terraform] aws_lakeformation_data_lake_settingsのインポート方法

TerraformでAWS Lakeformationをimportする機会があったのですが、
リソースの指定方法が特殊で躓いたため、共有します

# インポート方法
次の要領でインポートできます！

### tfファイル
```
resource "aws_lakeformation_data_lake_settings" "example_name" {
    admins = [
        "arn:aws:iam::${var.account_id}:role/examplerole",
        "arn:aws:iam::${var.account_id}:role/examplerole",
        "arn:aws:iam::${var.account_id}:role/examplerole"
    ]
}
```
ポイントはadminsを記載した状態でimportすることです！

### importコマンド
tfファイルが作成できたら、importコマンドの実行です
importブロックでもできると思います
```
terraform import aws_lakeformation_data_lake_settings.example_name "DataLakeSettings"
```

ポイントは、リソースID（っていうんですかね？　””で囲まれている部分）を 'DataLakeSettings' で統一することです

### 結び
リソースによってimport方法変えるのやめちくれ〜

以上になります。
【Rails7系】外部URLのリダイレクトについて

# Rails 7で外部URLにリダイレクトしようとするとエラーになる件（`UnsafeRedirectError`）

Rails 7にアップデートしたあと、外部URLに対して `redirect_to` を使おうとしたら、エラーが出るようになっていました。

エラー内容と、その対処法についてメモしておきます。同じようにハマった人の参考になれば嬉しいです！

## この記事について

- 自分の勉強・作業ログ的な内容です
- Rails 7へのアップデート対応で同じエラーに遭遇した人のヒントになれば幸いです

## 何が起きたのか？

Rails 7からは、**外部ホスト（他ドメイン）へのリダイレクト**がデフォルトで制限されるようになりました。

たとえば、以下のようなコードを書くと：

```ruby
redirect_to 'https://test.com'
```

次のようなエラーが発生します。

```ruby
ActionController::Redirecting::UnsafeRedirectError
```

詳しくは公式ガイドに記載されています👇
https://railsguides.jp/configuring.html#config-action-controller-raise-on-open-redirects

## 対処法
外部URLにリダイレクトする場合は、`redirect_to` に `allow_other_host: true` オプションを明示的に渡す必要があります。

```ruby
redirect_to 'https://test.com', allow_other_host: true
```
これでエラーが出ず、外部URLにリダイレクトできるようになります。

# おわりに
Railsのセキュリティ強化の一環でこういった仕様変更が入っているので、アップデート時には挙動確認しておいた方が安心です。

「今まで動いてたのにいきなり落ちるじゃん！」となりがちなポイントなので、誰かの助けになれば嬉しいです 🙌

# この記事について
試しに自分で適当に書いてみたあと、AIで添削してもらいました！
自分が書くよりかなり柔らかい印象になってました。これは良いかも...と思いました。
カシオES・EX(初代ClassWiz)の積分バグ範囲を探る

[カシオES・EX(初代ClassWiz)、絶対値の積分にバグ](https://qiita.com/harycurl/items/016da9705d5ff0905b76)で紹介したように、カシオES・EX機には絶対値の積分にバグがあることがわかった。

同じ式であっても正しい答が出る積分範囲と、誤った答が出る積分範囲があるので、今回はバグとなる積分範囲を探ってみることにした。

## CALC機能を使って手動でちまちま
とはいっても結局のところ手動でやっていくしかない。

$\int_{A}^{B}|x^2-3x|dx - \int_{A}^{B}x^2-3xdx$

と入力し、CALC機能でAとBの値を調整しながら探っていくことにした。
正しく積分されれば 9（か9に近い値）、誤った積分であれば 0 が返ってくる。

この式をCALC機能にかけると、x, A, B の値を聞いてくる。
x の値は何を入れてもよい（無視される）。続いて A, B の値も入力する。
どれか一つでも入力を省略すると、その時点で各変数に入っていた値をもとに計算してしまうため、同じ値であっても入力し直す。

そうして積分範囲の下限・上限を0.01単位で調べてみた結果が以下の通りである。

- 下限・上限に絶対値で同値となる値を入力した場合： 14.44 以上で積分バグ発生
- 下限を -15 にした時→上限 14.81 ～ 15.00 でバグ発生
- 下限を -16 にした時→上限 15.47 ～ 16.00 でバグ発生
- 下限を -17 にした時→上限 16.12 ～ 17.00 でバグ発生
- 下限を -20 にした時→上限 18.09 ～ 20.00 でバグ発生

ということで、発生範囲の傾向は掴めてきた。
- 下限・上限の絶対値が 約14.44 以上で発生
- 下限に対して上限は絶対値を少し小さくしても発生
- 上限のバグ発生範囲は下限の絶対値の値が大きいほど大きくなる。
下限の絶対値を 1 大きくした場合、上限の範囲は 約0.34 大きくなる。 

果たしてこのバグ範囲から原因の特定は可能なのだろうか。他の方の考察も見てみたい。
（カシオはCWと一部EX機でこのバグを修正できているので、原因が特定できたからどうということはないのだけれど。）
scoopを活用してWindows11で堅牢な開発環境を爆速構築

# Windows 11で作る堅牢な開発環境 - scoopを活用した効率的なセットアップ

こんにちは！最近新しいWindows 11マシンをセットアップする機会があり、開発環境を一から構築しました。この記事では、パッケージマネージャー「scoop」を中心に、効率的かつ堅牢な開発環境の構築手順を紹介します。

この方法のメリットは以下の通りです：
- コマンドラインからのインストールで効率的
- 環境の再現性が高い
- 管理者権限が最小限で済む
- アプリケーションの更新が容易

それでは、実際の手順を見ていきましょう。

## 1. Windows 11の初期セットアップ

新しいWindows 11マシンをセットアップした後、まずはパッケージマネージャーをインストールして環境構築を効率化します。

## 2. scoopのインストール

scoopはWindows用のコマンドラインインストーラーです。管理者権限なしで多くのアプリケーションをインストールできる点が特徴です。

PowerShellを開き、以下のコマンドを実行します：

```powershell
# スクリプト実行ポリシーを変更
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

# scoopのインストール
irm get.scoop.sh | iex
```

## 3. PowerShell 7 (pwsh)のインストール

PowerShell 7は標準のPowerShellより多くの機能を持っています。

```powershell
scoop install pwsh
```

## 4. Windows Terminalの設定

Windows Terminalは標準でインストールされていますが、デフォルトのシェルをPowerShell 7に変更します。

1. Windows Terminalを起動
2. 設定を開く
3. 「既定のプロファイル」からPowerShell 7を選択
4. 変更を保存

## 5. 基本的な開発ツールのインストール

Git、curl、解凍ツールなど、開発に必須のツールをインストールします。

```powershell
scoop install git curl unzip 7zip
```

管理者権限が必要な操作をする際に便利な`sudo`コマンドもインストールしておきます：

```powershell
scoop install sudo
```

## 6. extrasバケットの追加

scoopではデフォルトのバケット（リポジトリ）以外にも、多くのアプリケーションを提供する「extras」バケットがあります。

```powershell
scoop bucket add extras
```

## 7. 開発ツールのインストール

VSCode、ブラウザなど基本的な開発ツールをインストールします。

```powershell
scoop install vscode googlechrome cursor
```

## 8. Python環境のセットアップ

Pythonのバージョン管理ツール「pyenv」をインストールします。この際、管理者権限が必要なので`sudo`を使います。

```powershell
sudo scoop install pyenv
```

> ⚠️ 注意: pyenvのインストールには必ず`sudo`を付けてください。付けないと後々エラーになることがあります。

pyenvを使ってPythonをインストールします：

```powershell
# pyenvの更新
pyenv update

# Python 3.12.10のインストール
pyenv install 3.12.10

# グローバルPythonバージョンの設定
pyenv global 3.12.10
```

## まとめ

以上の手順で、Windows 11上に堅牢な開発環境を構築することができました。scoopを活用することで、コマンドラインから効率的にツールをインストールし、環境の再現性を高めることができます。

この環境構築方法のメリットは：

1. **スクリプト化が容易**: 一連のコマンドをスクリプトにまとめれば、新しいマシンでも短時間で同じ環境を再現できます
2. **アップデートが簡単**: `scoop update *`で全アプリケーションを更新可能
3. **クリーンな環境**: アプリケーションがシステムに広く影響を及ぼすことなくインストールされる

今回は基本的なセットアップのみ紹介しましたが、必要に応じてNode.js、Docker、データベースなども同様にscoopでインストールできます。

皆さんもぜひscoopを活用して、効率的な開発環境を構築してみてください！

## 参考リンク

- [scoop公式サイト](https://scoop.sh/)
- [pyenv-win GitHub](https://github.com/pyenv-win/pyenv-win)
- [Windows Terminal ドキュメント](https://docs.microsoft.com/ja-jp/windows/terminal/)

---

追記: このセットアップ手順は実際に使用して検証済みです。何か問題があれば、コメントでお知らせください。
元コンテンツ発信者が"質問しない新人"になってた失敗談 〜自走力と現場のギャップ〜

# はじめに
「ねえ、今何をしてるの？」
これは筆者がエンジニアとして入社して間もない頃、研修として先輩社員から与えられた課題アプリを実装していた際に聞かれたものです。
タイトルで少し触れてますが、筆者は過去にAI（人工知能）やデータ分析をテーマにした記事の執筆や教材作成を行っていました。
たまたまUdemyのとある講座の中で自走力や質問の質を重視する趣旨の話があり、筆者が当時在籍していた会社であった出来事のことを思い出しました。
多くの学習コンテンツで「自走力」という言葉が登場する中、筆者が当時の現場であった出来事を紹介することでエンジニアになって間もない方やこれから考えている方の参考になるのでは...?と考え久しぶりに記事を書こうと思い立ちました。
この記事ではその講座での話と筆者が会社であったことに触れ、筆者の何が問題だったかから「自走力」について今一度考えるという形で進めていきます。
# Udemyであった話
この講座で該当するお話があったのはエンジニアで伸びる人とそうでない人の違いはどこにあるかという文脈でのことでした。
結論としてはたくさん手を動かしている人で、自走力があるからこそ結果として質問してくる内容の質も変わってくると仰っていました。
このお話の中で肝になるのは**どれくらい自分でトライアンドエラーを繰り返し、解決まで辿り着けるか**という点だと思います。
# 会社であった話
冒頭でも触れましたが入社して間もない頃、与えられた課題としてアプリの実装を進めていた際に具体的に何をしているのかと直接聞かれました。
もう少し説明するとどのように実装すれば良いかやそもそも知らないことをGoogleで調べ、ソースコードを目の前の課題に落とし込むという進め方をしていました。
そもそもの趣旨として納期もあるわけだし、**知らないものはいくら考えても出てこないからちゃんと聞く癖をつけないとだよ**という注意を受けることとなりました。
# 何が問題だった？
以上の話は詰まるところ質問の量と質のどちらかを重視するかという方向に落ち着くのではないかと思います。
|  発言者  | 重視 | 発言の前提 |
| -- | ----------- |----------- |
| Udemy | 質 | エンジニアとして伸びるには自力でのトライアンドエラーがベースになる |
| 会社 | 量 | 納期の問題、知らないものは考えても出てこない |

この点から捉え方によっては質問の量と質は所謂自走力とトレードオフにあるのかもしれません。
ただ、これはあくまで場合によって分けて考えなくてはいけないもので、筆者の場合はコンテンツ発信での経験が裏目に出てしまったと感じています。
手前味噌になりますが、コンテンツ発信をしていた当時は依頼してくださった方に企画としての提案から実装まで全て自力で進めることもあったので、ある程度の自走力はなければ難しかったと思います。(ちなみに、ChatGPTなどが広まる前の話です)
聞く人がいない中で諸々解決させてきたことが悪癖となり、本来だったらすぐに聞けば済むものを自分で調べたりああでもないこうでもないといってる間に日が暮れていたという本末転倒の状態になっていたのを先輩社員は見ていたんじゃないかなと思っています。
これは研修での話でしたが、チームでの開発であれば必ず期限があり、それにちゃんと間に合わせるためにも手を動かす量や質問の質とまた違ったものが求められてくるという失敗エピソードでした。
# 終わりに
今回はUdemyと会社からあった質問に関する発言をピックアップし、現場で求められるのは自走力だけではなかったなというお話をさせてもらいました。
久々の記事となりましたが、最後までお読みくださりありがとうございました。
パスワードクラックツール「Hydra」

# Hydraの特徴
Hydra（正式名称：THC-Hydra）は、非常に強力で広く使われているパスワードクラックツールです。主にブルートフォース攻撃や辞書攻撃によって、さまざまなサービスへのログイン認証を突破することを目的としています。（From chat gpt）
KaliLinux標準搭載です！

| 特徴 | 説明 |
|:-:|:-:|
| 多様なプロトコルに対応 | FTP,SSH,Telnet,HTTP(S),SMB,RDP,MySQL,VNC....etc |
| 高速 | 並列処理による高速なクラックが可能 |
| 辞書攻撃対応 | ユーザ名およびパスワード共に辞書の使用が可能 |
| モジュール構造 | プロトコルごとのモジュールが用意され、柔軟な拡張が可能 |
| GUIでも使用可能 | xHydraも存在し、直感的な操作が可能 |

### 基本構文
```:bash
$ hydra -l admin -P passwords.txt ssh://192.168.0.10
```


### オプション一覧
| オプション | 概要 | 例 |
|:-:|:-:|:-:|
| -l | ユーザ名固定 | -l user01 |
| -L | ユーザー辞書指定 | -l /SecLists/Usernames/Names |
| -p | パスワード固定 | -p p@ssw0rd |
| -P | パスワードファイル指定 | -P rockyou.txt |
| -C | ユーザー名とパスワードがセットのファイル指定（`user:pass`形式） | -C combos.txt |
| -t | スレッド指定（デフォルト:16） | -t 20 |
| -s | サービスが使用するポート指定 | -s 2222 |
| -S | SSL接続を使用（HTTPS、SMTP等） | -S |
| -f | 最初にログインが成功した時点で攻撃を止める | -f |
| -F | 全てのユーザー名に対して最初の成功したパスワードを見つけたら攻撃を止める | -F |
| -o | 出力結果の保存 | -o `output.txt` |
| -v | 詳細な出力 | -v |
| -V | 施行されるユーザー名とパスワードの組み合わせをすべて表示 | -V |
| -x | パスワードを自動生成 | -x 3:5:aA1(3~5文字の小文字、大文字、数字を使用) |
| -e | 空のパスワード（n）、ユーザー名と同じパスワード（s）、逆のパスワード（r）を試行 | -nsr |
| -M | 複数のターゲットを含むファイルを指定 | -M `targets.txt` |


### 攻撃例
**sshに対してユーザー名がわかっているとき**
```:bash
$ hydra -l admin -P passwords.txt ssh://192.168.0.10
```
**webページに対してユーザ名がわかっているとき**
```:bash
$ hydra -l user -P /usr/share/wordlists/rockyou.txt 192.168.10.1 http-post-form "/login:username=^USER&password=^PASS^:F=incorrect" -V
```
:::note info
webへの攻撃の際、POSTデータを書き込みます。データの中では以下のような変数（？）を使う
^USER^ （ユーザー名）
^PASS^ （パスワード）
:::

**FTPに対してユーザ名パスワードの両方がわからないとき**
```:bash
$ hydra -L users.txt -P passwords.txt ftp://192.168.1.100
```

**SMTPに対してユーザ名パスワードの両方がわからないとき（Auth Login想定）**
```:bash
$ hydra -L users.txt -P passwords.txt ftp://192.168.1.100
```

**SMTPに対してユーザ名パスワードの両方がわからないとき（Starttls想定）**
```:bash
$ hydra -L users.txt -P passwords.txt ftp://192.168.1.100
```
※smtp-auth：Hydraの内部モジュール名（TLSなしでAUTH LOGIN対応のSMTP）