OmniAICreator/Qiita-1.07M huggingface dataset:
ChatGPTを使用したアプリ開発記【株価チャート表示】

## Recharts の導入
```json
npm install recharts
```

## コード(不明行の記載)
```AppleStock.js
import React, {useEffect, useState} from 'react';
```
•	Reactの基本機能を読み込んでいます。
•	useState: 状態（データ）を管理するためのフック。
•	useEffect: コンポーネントのライフサイクル（初回マウント時など）に処理を実行するフック。

```AppleStock.js
import {
  LineChart, Line, XAxis, YAxis, Tooltip, CartesianGrid, ResponsiveContainer
} from 'recharts';
```
•	recharts ライブラリから株価チャートに必要なコンポーネント群を読み込み。
•	LineChart: 折れ線チャート全体のコンテナ。
•	Line: 実際の線（グラフ）を描画。
•	XAxis, YAxis: 軸。
•	Tooltip: マウスホバー時のポップアップ。
•	CartesianGrid: 背景のグリッド線。
•	ResponsiveContainer: ブラウザ幅に合わせて自動調整。

```AppleStock.js
  const [data, setData] = useState([]);
```
•	株価データを保持するステート変数 data と、それを更新する関数 setData を定義。
•	初期値は空の配列。

```AppleStock.js
  useEffect(() => {
```
•	コンポーネントが最初にレンダリングされた時（マウント時）にだけ実行される処理をここに書く。

```AppleStock.js
    const fetchStock = async () => {
```
•	非同期関数 fetchStock を定義。APIから株価を取得するためのもの。

```AppleStock.js
      try {
        const res = await fetch(
          `https://api.twelvedata.com/time_series?symbol=${SYMBOL}&interval=1min&apikey=${API_KEY}`
        );
```
•	Twelve Data API にリクエストを送り、1分間隔のApple株価データを取得。
•	await fetch(...) でデータを非同期で取得。

```AppleStock.js
        const json = await res.json();
```
•	レスポンスをJSONとしてパース。
    
```AppleStock.js
        if (json.values) {
```
•	values（データ本体）が存在するかチェック。

```AppleStock.js
          const reversed = [...json.values].reverse(); // 時系列順に並び替え
```
•	APIからは最新が最初に返ってくるため、**時系列順（過去→現在）**に並べ替えている。


```AppleStock.js
          const parsed = reversed.map(item => ({
            datetime: item.datetime.split(' ')[1], // 時間だけ取り出し
            close: parseFloat(item.close),
          }));
```
•	各データを整形：
•	datetime: YYYY-MM-DD HH:MM:SS 形式のうち、時間部分だけ取り出す。
•	close: 文字列を浮動小数点に変換。

    
```AppleStock.js
          setData(parsed.slice(-20)); // 最新20件表示
```
•	最新の20件だけを data に保存（チャートに表示する用）。

```AppleStock.js
    fetchStock();
  }, []);
```
•	fetchStock を実行（初回レンダリング時のみ、第二引数が [] なので1回だけ）。


```AppleStock.js
  return (
    <>
      <Header />
```
•	JSXの返り値。ページに表示されるUIの定義。

```AppleStock.js
        {data.length > 0 ? (
```
•	data があるときだけチャートを表示（なければ読み込み中表示）。

```AppleStock.js
          <ResponsiveContainer width="100%" height={300}>
            <LineChart data={data}>
              <CartesianGrid stroke="#ccc" strokeDasharray="5 5" />
              <XAxis dataKey="datetime" />
              <YAxis domain={['auto', 'auto']} />
              <Tooltip />
              <Line type="monotone" dataKey="close" stroke="#007aff" dot={false} />
            </LineChart>
          </ResponsiveContainer>
```
•	実際のチャート描画部分。
•	ResponsiveContainer: 親要素に応じて自動サイズ調整。
•	LineChart: 折れ線グラフ本体。
•	CartesianGrid: 格子線。
•	XAxis: 時間軸（横軸）に datetime。
•	YAxis: 自動スケーリング。
•	Tooltip: マウスで触れた位置のデータ表示。
•	Line: 線グラフの本体。dataKey="close" で終値を表示。青線、ドットなし。

```AppleStock.js
        ) : (
          <p>読み込み中...</p>
        )}
```
•	データがまだ読み込まれていない場合の表示。


## UI

![スクリーンショット 2025-05-26 7.03.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058366/18bf1c4f-e17f-4513-bb03-3c8863e0c66f.png)
Google Cloud認定Professional Data Engineer受験談＆学習方法

## 概要
2025年6月7日にGoogle Cloud認定Professional Data Engineerの試験を受けて合格しましたので、学習したこと等を情報共有として書いていきます。
データの持ち方や扱い方について、これまで意識したことがなかったので、かなり勉強になりました。

## 前提の知識と経験
パブリッククラウドとしてはAWSをメインに扱い、SAPやDOPの試験に合格しているということ、3週間前のProfessional Cloud Architectへの合格が、私の前提になっています。
ただデータ関連については、特に実務で扱ったことはないので、基本的な知識はゼロという状態です。

## 学習期間
今回は3週間くらいで、平日は1日2〜3時間、休日は5〜6時間くらいです。
前提知識がないため、この試験に集中して取り組んでいました。

## 学習教材
### 1. Google Cloud公式サンプル問題
Professional Data Engineerのサンプル問題が20問あります。レベル感としては、本番に比べて易しめで、同じような問題が試験に出たかな？という感じです。
2024年1月に改訂されたらしいですが、、、サンプル問題も改訂されてる？という感じです。

https://docs.google.com/forms/d/e/1FAIpQLSd4j4bcgbYenBRFIL6Kb0cvXp13qCQ-z6JzowgDxRaPITn56g/viewform?hl=ja

### 2. Google Cloud認定 Professional Data Engineer（PDE） 対策トレーニング

Udemyの動画講義と模擬試験2回分が付いてきています。動画で試験範囲のサービスを把握しつつ、模擬試験で力試ししていくのが良いかなと思います。
模試のレベルは本番と比べて易しめ、問題文や選択肢も短めですのです。とりあえず高得点を取れるようにしておきましょう。

https://www.udemy.com/course/google-cloud-professional-data-engineerpde


### 3. 【最新】Google Cloud Professional Data Engineer 模擬試験 2025年版
Udemyの模擬試験で、レベル感は本番より易しめです。こちらも問題文や選択肢も短めなので、90％くらいは解答できるようにしておきましょう。

https://www.udemy.com/course/google-cloud-professional-data-engineer-2025

## 本番試験
120分の試験時間で50問出題され、見直しを含め100分位かかりました。終了後に「合格」の文字が出た時にはホッとしましたが、かなり難しかったですね〜

実際に本番試験を受けてみましたが、上記の学習教材より難易度が高いと感じました。
出題範囲のサービスは合っていますが、さらっと触れている機能が出ているので、公式ドキュメント等で細かなところも把握しておく必要があるなと思います。

あと、なんとなく模試と似ている問題は少なく、しっかりとサービスの概要やユースケースなどは把握しないと解けない問題が多かったです。記憶力も必要ですが、問題文をよく読んで適切な答えを導き出せる応用力もいる試験でした。

## 最後に
Professional Data Engineerは、もう一回合格できるかと言われたら、あまり自信がないですね。50問中25問くらいは自信を持って解答できましたが、残り半分は不安でした。
ですので、合格できたのは、本当に嬉しかったです。

弊社はGoogle Cloudに力を入れているところですので、この資格取得で何かした力になればと考えていますので、よろしくお願いいたします。
MATSim入門②：環境構築からシミュレーション実行、可視化までの流れ


## 1. はじめに

都市交通の動きを仮想的に再現できるオープンソースのシミュレーションツール「MATSim（マットシム）」。

この記事では、MATSimの環境を構築し、シナリオを実行して、その結果を可視化するまでの流れの概要を紹介します。

---

## 2. MATSimとは（[前の記事](https://qiita.com/knj11/items/f0be98c48b8633ea7645)のおさらい）

MATSim（Multi-Agent Transport Simulation）は、以下のような特徴を持つ交通シミュレーションツールです。

- 各個人（エージェント）の1日の行動を再現
- 都市スケールの道路ネットワーク上で移動をシミュレート
- 渋滞や混雑の発生も含めて動的に再現
- オープンソース & 拡張可能(Java)

---

## 3. 環境構築の方法

MATSimは2つの方法で始めることができます。
（筆者は後者で取組んでいます）

### 3.1 方法①：GUI版

MATSimにはGUI付きのスターターアプリが用意されています。Javaさえインストールしていれば、実行可能です。

- **対応OS**：Windows / Mac / Linux
- **操作**：GUI上でconfigファイルを選んで実行
- **メリット**：ビルド不要、すぐに試せる
- **デメリット**：シナリオの拡張やプログラム的な制御は難しい

**→ ダウンロードはこちら：[https://matsim.org/install/](https://matsim.org/install/)**

まずは動かしてみたいという方に最適です。

---

### 3.2 方法②：GitHubからビルド（カスタマイズしたい方向け）

本格的に使いたい方や、独自のネットワークや人口データを使いたい方は、GitHubからソースを取得してビルドする方法をおすすめします。
(筆者はこちらの方法で取組んでいます)

#### 主な必要なツール

- Java（11 または 17）
- Git：https://github.com/matsim-org
- Maven（または Gradle）

#### 手順（概要）

1. 公式サンプルプロジェクトをクローン  
2. Mavenでビルド  
3. JARファイルを使ってシミュレーション実行


---

## 4. シミュレーションを実行する

シナリオを実行する方法は、**GUI版を使う方法**と**コマンドライン（CLI）で実行する方法**の2通りがあります。

### 4.1 GUI版（方法①）での実行

GUI版では、起動後に以下の操作でシナリオを実行できます：

1. `config.xml` を選択（サンプルプロジェクトに含まれています）  
2. [Run] ボタンをクリック  
3. `output/` フォルダに結果が出力される（場所は設定可能）

**ポイント：** GUIを使えば、XMLファイルの中身が分からなくても動作確認ができます。

---

### 4.2 コマンドライン（方法②）での実行

ビルドした`.jar`ファイルを使って、以下のようにシナリオを実行できます。

```bash
java -jar matsim-example-project-0.0.1-SNAPSHOT.jar
```

---


## 5. シミュレート結果の可視化

MATSimのシミュレーションが完了すると、以下のような出力ファイルが生成されます。(30ファイル程)

- `output_network.xml.gz`  
- `output_events.xml.gz`  


これらのファイルは非常に情報量が多く、テキストや統計だけで分析するには限界があります。そこで活躍するのが、**SimWrapper**という可視化ツールです。

---

### 5-1. SimWrapperとは？

SimWrapperは、MATSimの出力ファイルを、直感的に可視化・分析するための**オープンソースWebアプリケーション**です。

**主な特徴：**

- 地図ベースのアニメーションでエージェントの移動を可視化  
- 時間帯ごとの混雑状況・速度・交通量などを表示  
- 複数シナリオの比較や統計も可能  
- GUI/CLIのどちらで出力された結果も読み込み可能  

**開発元**：ドイツ・ベルリン工科大学の交通研究チーム（VSP）、主要開発者は Billy Charlton 博士  
**利用料金**：無料（MITライセンスのオープンソース）  
**公式サイト**：[https://simwrapper.app/](https://simwrapper.app/)

使用方法については、ファイルのアップロードまたはフォルダ選択により、すぐに可視化を開始できます。

---

### 5-2. 可視化の様子

以下は、東京都市圏パーソントリップ調査の集計データを基に、埼玉県川越市における**自動車のトリップをSimWrapperで可視化・再現**した様子です。黄緑色の▲が一台一台の自動車を表現するエージェントとなっています。

![スクリーンショット 2025-06-07 061734.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4082623/d5c5edda-ba21-4879-9af2-986a5ba90b26.png)


- **１つ１つのエージェントのネットワークを動く様子**が時系列のアニメーションで表示
- **時間スライダー**を使って任意の時間帯に切り替え可能  

実際に動かすと、「都市が動いている」感覚を直感的に味わえます。数値や統計表だけでは見えにくい、**交通の流れ・滞留・集中箇所**を把握することができます。

---

## 6.終わりに

MATsimは日本語でのドキュメントがあまりなく、javaやPythonを活用するため、筆者のような都市計画がバックグラウンドでエンジニア経験もないような方には、まだまだとっつきづらいかと思います。
（幸いChatGPTが登場してくれたおかげで、筆者はどうにか可視化まで漕ぎつけました。）

オープンソースで誰でもエージェントシミュレーションが構築できるため、このようなMATsimの紹介を通して、日本における都市・交通シミュレートの民主化に少しでも寄与できればと思っています。

**MATsimに少しでも興味がある方はぜひお気軽にお声がけください！**
Crystalのprivateメソッドはサブクラスから呼び出せないのでprotectedを使う！

## はじめに

AIがCrystalを書くときに `protected` メソッドを使いたがることに気が付きました。Rubyでは `protected` は存在するけれども実際には使わなくてよいことで有名です。

不思議に思って調べてみると、RubyとCrystalでは `private` メソッドの挙動が異なり、そのため `protected` が必要だということがわかりました。

# Crystalでは private メソッドはサブクラスから呼び出されない

Rubyでは、private メソッドはサブクラスから呼び出すことができます。しかし、Crystalでは private メソッドはサブクラスから呼び出すことができません。そのため protected で宣言する必要があります。

これはRubyとの大きな相違点で、たとえば、abstract class を定義して、継承して使う時に、誤って private メソッドなどを定義すると、継承先のクラスで呼べないということになります。

## まとめ

- privateメソッド：同じファイル内からのみアクセス可能
- protectedメソッド：同じクラスまたはサブクラスからアクセス可能


この記事は以上です。
WindowsでのLaravel Sailを用いた環境構築

# はじめに
私は現在エンジニア転職を目指して学習をしております！
今回、Dockerを用いたLaravelアプリケーションの環境構築(Laravel Sail)を学習していたところ、見事に苦戦したので備忘録として記事に残しておきます🤲

`⚠️この記事ではLaravel11.xを前提としています`

## 苦戦ログ

- ## curlコマンドのエラー
  まず [Laravel公式ドキュメント](https://laravel.com/docs/11.x/installation#sail-on-windows) にならって
  ```
  curl -s https://laravel.build/example-app | bash
  ```
  をVScodeのターミナル(bash)で実行したが、エラーが出てしまう
  <br>

- ## DockerとWSL2のインストール・設定

  `
  💡WSL2（Windows Subsystem for Linux）とはWindows上でLinuxのコマンドラインツールやGUIアプリケーションを直接実行できるようにする機能
  `
  
  [Laravel公式ドキュメント](https://laravel.com/docs/11.x/installation#sail-on-windows) を翻訳して読むと、事前に`Docker Desktop` `WSL2`のインストール・設定が必須でとの記載あり
  
  ### Dockerのインストール
  [Docker公式サイト](https://www.docker.com/ja-jp/) よりWindows版のAMD64をダウンロードし、インストール
  
 
   ### WSL2のインストール
   Zennに分かりやすく解説してある記事があったので、参考にしてPowerShellでWSL2をインストール
   [Zenn-[Windows] 新しくPC買ったのでWSL2を導入してみる](https://zenn.dev/ap_com/articles/install-wsl2-on-windows)
   
   ### Docker,WSL2の設定
   [Docker公式ドキュメント-Windows 上の Docker Desktop WSL 2 バックエンド](https://docs.docker.com/desktop/features/wsl/) を参考に、`Docker Desktop` `WSL2` を設定
<br>

- ## curlコマンド再実行→失敗→Ubuntuでの実行
  VScodeのターミナル(bash)で再度
   ```
  curl -s https://laravel.build/example-app | bash
  ```
  を実行したが、またエラー…

  関連する記事がなく、どん詰まりになったので、GPT先生に相談したところ

  以下のようなフィードバックを頂いた↓

  ### Dockerデスクトップの設定

    DockerDesktopの設定＞Resources＞WSL Integrationにて

    ``Ubuntu``にチェック
    
    ### PCを再起動

    Ubuntuでのcurlコマンド実行を促されたが、Ubuntuがうまく起動せず

    PCを再起動
    
    ### Ubuntuで実行→成功

    VScodeのターミナルでUbuntuを選択し、再度curlコマンドを実行
    ```
    curl -s https://laravel.build/example-app | bash
    ```
    バッチリ依存関係がダウンロードされました！！
mapKeys、mapValuesの使い方

Kotlinでキーや値を操作したい時に使用する`mapKeys`、`mapValues`の拡張関数の使い方をまとめます。キーだけ変更したい、値だけを2倍にしたい、そんな時に`mapKeys`と`mapValues` を使用します。 


`mapKeys` は「キーを変換する」ための関数で、値はそのままでキーだけを変えて新しいMapを返します。
```kotlin
// キーを大文字にする
val original = mapOf("one" to 1, "two" to 2)
val upperKeys = original.mapKeys { (key, _) -> key.uppercase() }

println(upperKeys)
// {ONE=1, TWO=2}
```


mapValues は「値を変換する」ための関数で、キーはそのままで値だけを加工した新しいMapを返します。
```kotlin
// 値を2倍にする
val scores = mapOf("A" to 10, "B" to 20)
val doubled = scores.mapValues { (_, value) -> value * 2 }

println(doubled)
// {A=20, B=40}
```

mapKeysやmapValuesをうまく使用すればよりシンプルで直感的なコードが書けます！
WooCommerce製品カテゴリーページに構造化データを実装し、B2B向けSEOを強化した話（WPCode＋FAQ展開）

# 概要

医療美容機器向けにYAGレーザー電源を提供するWooCommerceサイトの製品カテゴリーページ（英語）について、検索順位向上と構造化対応のため、以下のSEO強化を実施しました。

🔗 対象ページ：  
https://www.iplpowersupply.com/product-category/yag-laser-power-supply/

# 実施したこと

- カテゴリーページに独自HTMLセクション（`div.product-category-desc`）を活用し、語彙豊かな技術説明文を追加
- `div.faq-container`を活用し、JavaScriptで開閉可能なFAQブロックを挿入（ユーザー検索意図にマッチ）
- WPCodeスニペットを使ってJSON-LD形式の構造化データ（ItemList＋Product）をカテゴリーヘッダーに追加
- Nd:YAG / Q-switched / 808nm diodeなど、検索対象となる専門用語を自然に埋め込むことで、長尾キーワードも対策
- AIOSEOプラグインを併用し、meta descriptionの再構成とインデックス促進

# 結果と学び

- Google Search Consoleでインデックス速度と表示件数が改善
- Semrushの「ページの情報不足」警告が解消
- WordPress+WooCommerce環境におけるB2B SEOの構造最適化事例として再利用可能

---

もしB2B製品やニッチな業界向けカテゴリーページを最適化する際、Elementorなどが使えないテーマ環境でも、WPCode＋All in One SEOの併用でかなりの柔軟性が出せます。
shareX覚書

ポータブル版･windowsストアアプリ版は
デフォルトでは内部音声の録音ができない
私はステレオミキサーのloopback機能を使えば録音できる
私は無効化してしまってるので検証できないが、仮想ステミキ使えばおそらく物理ミキサーがなくても内部音声収録できるのだろう

C:\Program Files\Recorder Devices for ShareX
削除したアプリの痕跡を調べる方法



### ✅ **Revo Uninstallerを使って削除したアプリ**

→ **残留ファイルやレジストリもかなり丁寧に削除されている**ので、基本的には問題ありません。

---

### ❓ **問題：Revo導入前にアンインストールしたアプリの残骸をどう調べるか？**

以下の方法で **「すでに消えたけど痕跡が残っているアプリ」** を発見できます：

---

## 🧭 方法1：レジストリの残骸を探す（手動）

#### 📍 レジストリパス例：

```
HKEY_LOCAL_MACHINE\SOFTWARE\
HKEY_CURRENT_USER\SOFTWARE\
```

ここに **アプリ名や開発元名のキーが残っている**ことがあります。
たとえば「Adobe」「Epic Games」「Corel」など。

🔎 **手順：**

* `regedit` を起動
* Ctrl + F で、過去に使ったアプリ名で検索してみる
* 不要そうなキーが見つかったら、バックアップをとった上で削除（※慎重に！）

---

## 🧭 方法2：フォルダの残骸を探す（手動）

### 📂 よく残る場所：

| フォルダ                                | 内容            |
| ----------------------------------- | ------------- |
| `C:\Program Files\`                 | インストール先       |
| `C:\Program Files (x86)\`           | 32bitアプリ用     |
| `C:\Users\<ユーザー名>\AppData\Local\`   | アプリの設定データなど   |
| `C:\Users\<ユーザー名>\AppData\Roaming\` | 設定やライセンス情報など  |
| `C:\ProgramData\`                   | グローバルな設定（非表示） |

🔎 **例：**

* `AppData\Local\Adobe`
* `ProgramData\NVIDIA Corporation`

---

## 🧭 方法3：専用ツールで痕跡を一括検索（半自動）

### ✅ おすすめツール：

| ツール                      | 用途                                 |
| ------------------------ | ---------------------------------- |
| **Everything**           | インストールされていた可能性のあるファイルやフォルダを高速検索    |
| **RegScanner**           | レジストリ内のキーワード一括検索（レジストリキーの痕跡調査に超便利） |
| **Geek Uninstaller（無料）** | 残っている可能性のある古いアンインストール履歴を表示         |

---

## ✅ 補足：どこまで削除すべきか？

* **明確にもう使わないアプリ** → フォルダやレジストリを削除してOK
* **少しでも不安がある場合** → **レジストリバックアップをとってから削除**してください

---

## 🔄 希望があれば…

* お使いのPC内を「Everything」や「RegScanner」でどのようにキーワード検索すればいいか
* Safeにレジストリ削除するための具体的手順
* AppDataのどれが「安全に消していい残骸」かチェックする

なども一緒に進められます。
やってみたい手順を教えてください。
$を1回押しただけで自動的に$$を挿入する方法(VSCode,LaTeX)

## 概要
VSCodeのLaTeXで\\$を1回押しただけで自動的に\\$\\$を挿入し、その中にカーソルが入るようにする方法を解説します。Vscode側の設定でうまくいかなかったので力技です。この方法では、latex-workshopがアップデートされる度、元に戻ってしまうので自動アップデートは切っておくことをおすすめします。

## 環境
OS:Mac(Windowsでも全く同じです)
VSCode:v1.100.3
latex-workshop:v10.10.0



## 手順
### 1.ターミナルを開く
ホームディレクトリから次の場所に行きます。
```
~/.vscode/extensions/james-yu.latex-workshop-10.10.0/syntax
```
⚠️ 注意1：.vscodeは隠しファイルなのでlsでは表示されません。ls -aで表示させましょう。

⚠️ 注意2：latex-workshopのバージョンに注意してください。

上のディレクトリの中に
```
latex-language-configuration.json
```
というファイルがあるはずなのでエディタで開いてください。

### 2.エディタで編集

"autoClosingPairs" という項目があるはずなのでその中に["\\$","\\$"]
を入れます。以下のようになっていればokです。
```
        "autoClosingPairs": [
                ["\\begin{", ""],
                ["\\left(", ""],
                ["\\left[", ""],
                ["\\left{", ""],
                ["\\bigl(", ""],
                ["\\bigl[", ""],
                ["\\bigl{", ""],
                ["\\Bigl(", ""],
                ["\\Bigl[", ""],
                ["\\Bigl{", ""],
                ["\\biggl(", ""],
                ["\\biggl[", ""],
                ["\\biggl{", ""],
                ["\\Biggl(", ""],
                ["\\Biggl[", ""],
                ["\\Biggl{", ""],
                ["\\(", ""],
                ["\\[", ""],
                ["\\{", ""],
                ["@(", ""],
                ["@[", ""],
                ["@{", ""],
                ["{", "}"],
                ["[", "]"],
                ["(", ")"],
                ["`", "'"],
                ["$","$"]
        ],
```
### 3.再起動
VSCodeを再起動します。


## まとめ
とりあえずは補間されるようになると思います。誰かもっとマシな方法を知ってたら教えてください。
FFmpegでできることまとめ


## 🎥 動画関連

* 動画形式の変換（例：MP4 → AVI）
* 動画の切り出し（開始〜終了時間の指定）
* 動画の解像度変更（リサイズ）
* 動画から音声だけを抽出
* 動画の音量調整
* 動画の一部分だけを抽出
* 複数の動画を結合
* 動画の回転・反転・クロップ（切り取り）
* 動画のフレームレートを変更
* 動画に字幕を追加または抽出

---

## 🎧 音声関連

* 音声ファイルの形式変換（例：WAV → MP3）
* 複数の音声を合成
* 音声の速度を変更
* 無音部分の検出や削除
* 音声の一部を切り出し
* 音声のチャンネル数変更（ステレオ⇄モノラル）

---

## 📸 画像関連

* 動画を1フレームずつ画像として保存
* 連番画像から動画を作成
* GIFの作成や変換
* 画像のリサイズやトリミング

---

## 📡 配信・ストリーミング関連

* ライブストリーミングの配信（例：RTMP）
* ストリーミング用のHLSファイル生成
* Webカメラ映像の録画

---

## 📂 その他

* メタデータの表示・編集
* ファイル情報（ビットレート・コーデックなど）の取得
* 特定フォーマットへの書き出し設定（品質や圧縮率）
* 透かしやロゴの追加
* フィルター（ぼかし、エッジ検出など）の適用
PowerShellのスクショを公開するときにユーザー名を非表示にするコマンド



PowerShellの画面をスクリーンショットで公開する際、
`C:\Users\ユーザー名` が表示されると**個人情報が漏れる可能性**があります。

公開前に以下のコマンドを実行しておけば安心です：

```powershell
cd C:\
```

これでプロンプトが `PS C:\>` となり、**ユーザー名が非表示になります**。
PowerShellでWindowsにFFmpegをインストールする方法

https://qiita.com/Tadataka_Takahashi/items/9dcb0cf308db6f5dc31b

こちらの記事を参考にさせていただきました、ありがとうございます


powershell管理者権限
↓
次のコマンドを実行します：
winget install --id=Gyan.FFmpeg -e
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072777/6d1468e2-4d11-4481-87c5-a87a83831755.png)


この画面から動かない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072777/7fa46343-1463-4b6a-8542-175f1c030264.png)
)

一回くりっくして enterおしたらなおった↓ので、
他のウインドウがアクティブになていたせいかも。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072777/3036a081-553f-4226-8e48-92cf297a6af1.png)

これでバージョン確認できるけどpowershellの再起動必須
``ffmpeg -version``

成功画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072777/12f49004-c7fe-4bc8-9d55-2363e96ae38c.png)


再起動しないと以下のようなメッセージがでます
```ffmpeg : 用語 'ffmpeg' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認して
から、再試行してください。
発生場所 行:1 文字:1
+ ffmpeg -version
+ ~~~~~~
    + CategoryInfo          : ObjectNotFound: (ffmpeg:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException```
PowerShellで文字化けが発生したときの対処法

# PowerShellで文字化けが発生したときの対処法（FFmpegインストール例）
*文字化けしていてもインストール自体は普通にできます。

## 🧩 この記事でわかること

- PowerShellで日本語が「■■■」と文字化けする原因
- 文字化けの簡単な直し方（フォント変更＋コードページ設定）

---

## 🧨 症状：PowerShellで文字化け発生

PowerShellで`winget` コマンドなどを実行すると、以下のように「■」が大量に表示されることがあります。

```powershell
winget install --id=Gyan.FFmpeg -e
````

実行時の様子：

!文字化けの例![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072777/95132976-8b85-4990-81f1-4e2c3fb9e72d.png)


主に以下の2つが原因です：

1. PowerShellの**フォント**が日本語非対応
2. PowerShellの**コードページ**がUTF-8でない

---

## 🛠 解決方法

### ✅ ① フォントを日本語対応のものに変更

1. PowerShellウィンドウのタイトルバーを**右クリック** → 「プロパティ」
2. 「フォント」タブで、\*\*「MS ゴシック」**や**「Yu Gothic UI」\*\*などを選択
3. OKで保存＆PowerShellを再起動

---

### ✅ ② コードページを UTF-8 に変更

以下のコマンドを実行：

```powershell
chcp 65001
```

出力例：

```
Active code page: 65001
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072777/cd4cf0ef-0cd7-4d5d-b5b3-15bdb7f32d5c.png)

---



## 🔚 まとめ

| 項目     | 設定内容                               |
| ------ | ---------------------------------- |
| フォント   | MS ゴシック / Yu Gothic UI など日本語対応フォント |
| コードページ | 65001（UTF-8）                       |
| コマンド   | `chcp 65001` + `winget install`    |
VSCodeで画像に簡単に赤マーク！手順書が爆速に。AI×人間で半日開発した「ImageMarkPengent」

# VSCodeで画像に簡単に赤マーク！手順書が爆速に。AI×人間で半日開発した「ImageMarkPengent」

tags:
- VSCode
- 手順書作成
- 画像加工
- 開発ツール
- AI活用事例
- OSS

---

## はじめに

みなさん、画像に「ちょっと赤マーク」つけたい時、どうしてますか？

- スクショ → PowerPoint → 赤丸 → 再保存  
- スクショ → ペイント → 赤線 → 保存  
- スクショ → Photoshop → 重い …  

毎回めんどくさいですよね 🫠。  
私自身も **手順書や社内QA用に大量に画像マーク作業** があり、すごく非効率でした。

そこで → 作りました 🚀

---

## ImageMarkPengent とは？

👉 VSCode で画像に簡単に赤丸マークや注釈ができる拡張機能です。  

**特徴：**

✅ PNG / JPG を VSCode で開いてそのままマーク  
✅ 赤丸マーク追加、色・太さ変更、移動・拡大縮小・削除  
✅ Undo / Redo  
✅ 元画像は変更せず、新規保存  
✅ **超軽快！**

![画面](https://github.com/pengent-ai/imagemarkpengent/blob/52690bd69110f36a587cf753ef5836ff660444e1/readme/images/top.png?raw=true)


VSCode(Marketplace):
* https://marketplace.visualstudio.com/items?itemName=PengentAIRyohYA.imagemarkpengent


---

## 開発の背景 〜 Markdown時代の手順書作成をもっとラクに 〜

仕事や開発の中で、手順書やマニュアル、社内ドキュメントを作成する機会が多くあります。

その際に画像に「ここをクリック」など **赤丸や注釈マーク** をつける作業が意外と手間です。

- Word / Excel / PowerPoint でマークをつけて再保存
- ファイルが複雑化して更新しづらい
- Markdown＋画像で完結したいのに別ツールに行き来する手間  
→ 非効率…

「Markdownベースで完結できたら一番効率的」と考え、今回この拡張機能を作成しました。

---

## AIと協力した開発フロー

今回は **AIエージェントと共同開発** という形で試してみました。  
使ったのは：

- **Cursor**  
  → 実装（コード生成、リファクタリング）を担当
- **Pengent AI**  
  → 設計とPR文案（README、Qiita記事草案など）を担当
- **私（人間）**  
  → 2つのエージェントがハマりかけた時に補助、手動で解決

結果として：

- **私1人だと 3〜5日** かかる規模感のものが  
- **半日** で完成 ✨  

AI × 人間の組み合わせは非常に効果的でした。

---


## 使い方

### 1️⃣ 画像を開く

- PNG / JPG をエクスプローラーで右クリック →  
`Open in ImageMarkPengent`  
- または コマンドパレットで  
`ImageMarkPengent: Open in ImageMarkPengent`

### 2️⃣ 赤丸マーク追加

- 「マーク追加」ボタン または `Ctrl + ドラッグ`

### 3️⃣ 編集

- 移動・拡大縮小・削除（Delete）・色や太さ変更  
- Undo / Redo にも対応

### 4️⃣ 保存

- 「保存」ボタンからPNG出力  
- 元画像はそのまま、別ファイルとして保存

---

## よくある質問

**Q. 元画像は上書きされますか？**  
A. いいえ、新しいファイル名で保存できます。元画像は無変更です。(元の画像に上書きも可能です)


**Q. 複数マーク選択は？**  
A. 現在は未対応、今後対応予定です。

---

## まとめ

| 機能 |  説明 |
|-------|------|
| 赤丸マーク | 追加・移動・拡大縮小・削除 |
| Undo / Redo | あり |
| 保存 | 元画像とは別に保存 |
| ショートカット | Ctrl+ドラッグ、Ctrl+Z/Y、Delete |

---

Markdownで完結する手順書作成を効率化したい方におすすめです！  
**AIエージェントとの協力開発事例**としてもぜひ参考にしてみてください 🚀。
CPUをつくろう


## 【1】ALU（Arithmetic Logic Unit）

### ◉ 内部構成と論理回路

#### 入力：

* `A`, `B`：演算対象（1ビット）
* `OP`：演算モード（2bitまたは3bit制御線）
* `CIN`：キャリイン（ADD命令時）

#### 出力：

* `OUT`：演算結果（1ビット）
* `COUT`：キャリアウト（加算結果が2進数1桁に収まらなかった場合）

#### ◉ 内部構造（例）：

```plaintext
           A ─────┐
                  │
           B ─────┼──[AND]──┐
                  │         │
                  ├──[ OR ]─┼────[MUX (OP)]───> OUT
                  │         │
                  └──[XOR]──┘
```

※ ADDはXORとCINで計算 → フルアダーを内部に持つ。

#### ◉ Python的実装例：

```python
def alu(a, b, op, cin=0):
    if op == "00":       # AND
        return a & b, 0
    elif op == "01":     # OR
        return a | b, 0
    elif op == "10":     # XOR
        return a ^ b, 0
    elif op == "11":     # ADD (1-bit full adder)
        sum_ = (a ^ b) ^ cin
        carry = (a & b) | (b & cin) | (a & cin)
        return sum_, carry
```

---

## 【2】Program Counter（PC）

### ◉ 回路的視点

* `PC`は**フリップフロップのレジスタ列**で実装（通常3〜4bit）。
* 通常は `PC = PC + 1`。ただしジャンプ命令が来たら `PC = addr`。
* ジャンプ制御には `Load Enable` 信号と`PC_in`バスが必要。

### ◉ ハードウェア的構成：

```plaintext
[Adder] <── PC ──┐
                 │
[Multiplexer] <──┘← Jump信号が1ならジャンプ先を選択
    ↑
Jump Address（命令から）
    ↓
[PC Register] ───→ 次クロックで値を保持
```

---

## 【3】Instruction Decoder（命令デコーダ）

### ◉ 目的と処理

* 命令（バイナリ）を読み取り、**制御信号群**に変換：

  * ALU操作（OPコード）
  * レジスタの読み/書き
  * メモリアクセスの有無
  * PC制御（ジャンプか加算か）

### ◉ 信号例：

| フィールド | ビット数 | 意味例           |
| ----- | ---- | ------------- |
| OP    | 4bit | 操作（例：AND、ADD） |
| ADDR  | 4bit | メモリアドレス       |
| IMM   | 1bit | 即値データ（必要時）    |

### ◉ 制御信号出力の例（疑似コード）：

```python
if opcode == 0b0001:  # LOAD A, MEM[x]
    alu_op = "NOP"
    load_mem = True
    reg_write = True
elif opcode == 0b0110:  # ADD A, B
    alu_op = "11"
    reg_write = True
elif opcode == 0b0111:  # JUMP addr
    jump_flag = True
    jump_address = addr
```

---

## 【4】動作シーケンス（クロック単位）

| クロック | 処理段階 | 処理内容                           |
| ---- | ---- | ------------------------------ |
| 1    | フェッチ | ROM\[PC]から命令を読み出す              |
| 2    | デコード | 命令コードを解析し、ALU/メモリ/レジスタに制御信号を送る |
| 3    | 実行   | ALUによる演算 or メモリ読み書き            |
| 4    | 書き戻し | 演算結果をレジスタやメモリに保存               |
| 5    | PC更新 | 次命令のアドレスに進める。ジャンプならジャンプ先に上書き   |

---

## 【全体構成ブロック図】

```plaintext
        ┌──────────────┐
        │ Program Counter │◀───┐
        └─────┬────────┘    │
              ▼             │
        ┌──────────────┐    │
        │ Instruction ROM │    │
        └─────┬────────┘    │
              ▼             │
       ┌────────────────────┐
       │ Instruction Decoder │
       └─────┬────┬────┬────┘
             ▼    ▼    ▼
         ┌─────┐ ┌─────┐ ┌─────┐
         │  ALU │ │ Reg │ │ RAM │
         └─────┘ └─────┘ └─────┘
```

---

## 【拡張提案】

* ステートマシンで命令サイクルを管理
* デバッグ用レジスタ表示LED（エミュレータ）
* Verilog/VHDLによるFPGA実装

---
【備忘録】VirtualBoxを使ってDHCPサーバー、DNSサーバーを構築してみた

## 目的
- DHCPサーバー、DNSサーバー、Webサーバーの構築を体験
- ファイアウォール設定でアクセス制御を理解する

## 環境概要
- VirtualBox上に複数の仮想マシン（VM）を用意
- VM2をDHCP/DNSサーバーとして設定
- VM3にWebサーバーを構築
- VM1をクライアントとして利用

## 1. DHCPサーバーの構築（VM2で実施）
### 1. isc-dhcp-serverをインストール
```bash
sudo dnf install -y dhcp-server
```
### 2. 設定ファイル /etc/dhcp/dhcpd.conf を編集
```bash
sudo vi /etc/dhcp/dhcpd.conf
```
```/etc/dhcp/dhcpd.conf
subnet 192.168.10.0 netmask 255.255.255.0 {
  range 192.168.10.100 192.168.10.200;
  option routers 192.168.10.1;
  option domain-name-servers 8.8.8.8;
  default-lease-time 600;
  max-lease-time 7200;
}
```
### 3. /etc/sysconfig/dhcpdでインターフェース指定
```bash
sudo vi /etc/sysconfig/dhcpd
```

```/etc/sysconfig/dhcpd
# 追記
DHCPDARGS="enp0s9" # VM2の内部ネットワーク側NIC を指定
```

### 4. サービスを起動・有効化
```bash
sudo systemctl enable --now dhcpd
sudo systemctl status dhcpd
```

### 5. VM1をDHCPクライアントに変更
```bash
sudo nmcli con mod enp0s8 ipv4.method auto
sudo nmcli con down enp0s8
sudo nmcli con up enp0s8
```
### VM1で以下を確認：
```bash
ip a
```

## 2. DNSサーバーの構築（VM2で実施）
### 1. dnsmasqインストール
```bash
sudo dnf install -y dnsmasq
```

### 2. 設定ファイル編集
```bash
# 元の設定をバックアップ
sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.bak
sudo vi /etc/dnsmasq.conf
```

```/etc/dnsmasq.conf
interface=enp0s9  # DHCP配布を行っている内部ネットワーク側NIC
server=8.8.8.8
address=/webserver.local/192.168.10.50
domain-needed
bogus-priv
```

### 3. 起動と有効化
```bash
sudo systemctl restart dnsmasq
sudo systemctl enable dnsmasq
```

### 4. ファイアウォール設定（必要に応じて）
```bash
sudo firewall-cmd --add-service=dns --permanent
sudo firewall-cmd --reload
```
### VM1で以下を確認：
```bash
cat /etc/resolv.conf
```
```/etc/resolv.conf
nameserver 192.168.10.1
nameserver 8.8.8.8
```
```bash
ping webserver.local
```
※ 192.168.10.50 のVMがまだないので,pingが飛ぶのを確認できればOK


## 3.VM3（192.168.10.50）にWebサーバーを構築
### 1. VirtualBoxでVM1を完全クローン
- Macアドレスのポリシーは「全てのネットワークアダプターでMacアドレスを生成」
- ネットワーク設定は 「内部ネットワーク」のみ

### 2. IPアドレスの固定設定（VM3で実施）
- VM3でネットワークインターフェース名を確認
```bash
ip a
```
- インターフェース名（例: enp0s8）をメモし、固定IPを設定
```bash
sudo nmcli con mod enp0s8 ipv4.addresses 192.168.10.50/24
sudo nmcli con mod enp0s8 ipv4.gateway 192.168.10.1  # VM2のIP（ルーター役）
sudo nmcli con mod enp0s8 ipv4.method manual
sudo nmcli con up enp0s8
```

- 設定が反映されているか確認
```bash
ip a | grep 192.168.10.50
```

### 3.Webサーバー（簡易版）のインストールと起動
- PythonのHTTPサーバーを利用（手軽）
```bash
cd /tmp
python3 -m http.server 80
```
※ python3 が無ければインストール：
```bash
sudo dnf install python3
```

### 4. VM1からWebアクセスの確認
```bash
curl http://webserver.local
```
### 5.ファイアウォールの設定(オプション）
- VM3でファイアウォール設定を確認

```bash
sudo firewall-cmd --list-all
```
- HTTPを許可（開放）
```bash
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --reload
```




## まとめ
VirtualBox上での仮想環境を活用し、
- DHCPでIPアドレスを自動割り当て
- DNSで名前解決
- Webサーバー構築とアクセス
- ファイアウォール設定によるセキュリティ管理

を体験しました。
Savings Planのコミットとディスカウント方法の整理

## はじめに
先日、業務でFargateのComputeSavingsPlan（以下 SP）について、カスタムコミットの見積もりを依頼される機会がありました。
当時はSPの知識がほぼなかったため、1から調査し、特に理解が難しかった「コミット」の概念とディスカウントのロジックについてまとめます。

公式ドキュメントでは分かりづらい部分も多く、同じように困る方がいるのではと思い、この記事を書くに至りました。
※SPの基本概要や Fargate のコスト算出方法の詳細はこの記事では触れません。

## Savings Plan（SP）とは？
公式には以下のように説明されています。
[AWS Black Belt: Savings Plans 2025/04より](https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2025_SavingsPlans_0430_v1.pdf)
>Savings Plans は、１時間あたり Nドル を必ず⽀払う（コミットメント）のでNドル 分までディスカウント後の
料⾦で利⽤できるというディスカウントプランです。

ざっくり言うと、「毎時 $N 払うことを約束すれば、その範囲でリソースを安く使える」という仕組みです。

ただ、ここで疑問になるのが
・「コミットって具体的に何？」
・「ディスカウントの計算ロジックはどうなってるの？」
という点です。
以下、それらを噛み砕いて解説していきます。
## コミットとは？
「コミット」とは、リソースの利用量に関係なく、1時間あたり $N を必ず支払う契約のことです。
つまり、実際の利用が少なければ少ないほど、**損をする（オーバーコミット）**リスクがあります。
逆に、利用量が十分であれば、割引が受けられるという仕組みです。
## ディスカウントの考え方

ディスカウントの理解には、2つの視点があります
① コスト基準：同じコストでも、オンデマンドより多くのリソースを使える
② 利用量基準：同じ利用量でも、オンデマンドよりコストが安く済む

それぞれ、具体例で説明します。
#### 単価の前提（仮定）

| 項目 | オンデマンド | 	SP 適用時 |
|:-----------|:-----------|:-----------|
| メモリ単価（/GB）     | $1        | 	$0.8         |
| CPU単価（/GB）     | $1      | 	$0.8      |

:::note warn
実際の単価は異なります。
説明のため概算として「SPはオンデマンドより約20%安い」想定で進めます。
（正確な価格は[参考文献 3及び4](#参考文献)を参照ください）
:::


#### シミュレーション
上記の単価前提のもと、ある1時間において一定の利用量があった場合のシミュレーションをしながら
説明をしていきます。

#### ケース①：コスト基準の考え方
コミット：$5/h
オンデマンドで「CPU 2.5GB、メモリ 2.5GB」を1時間使用すると：
```bash:bash
(2.5GB × $1) + (2.5GB × $1) = $5
```
これを SP 適用価格で使うと：
```bash:bash
(3.125GB × $0.8) + (3.125GB × $0.8) = $5
```
→ 同じ $5 で、SPでは 3.125GB × 2 のリソースが使える ＝ 20% 多く使える

#### ケース②：利用量基準の考え方
コミット：$5/h
「CPU 3.125GB、メモリ 3.125GB」を1時間使った場合のオンデマンドとSP適用時を比較します。
・オンデマンド：
```bash:bash
(3.125GB × $1) + (3.125GB × $1) = $6.25
```
・SP 適用時：
```bash:bash
(3.125GB × $0.8) + (3.125GB × $0.8) = $5
```
→ 節約額：$6.25 − $5.00 = $1.25（節約率:20%）

## オーバーコミット(番外編)
SPは安定して利用されるワークロード向けであり、オーバーコミットを避ける設計が基本です。
ただ、参考として以下のケースも紹介します。

#### シナリオ
利用量：「CPU 3.125GB、メモリ 3.125GB」を1時間使った場合
コミット：$10

```bash:bash
節約額 = (オンデマンド：$6.25 - SP：$5) + (コミット損失：-$10 + 利用コスト：5$) = -$3.75
```
→ spの単価によるディスカウント分より、必ず支払うコミットのマイナス額の方が大きくなり
最終的な損益はマイナスとなってしまいます。
このようなコミットをオーバコミットと呼ぶ場合があります。
#### 対策
オーバーコミットの対策としては下記2点が有効ですので検討いただけると良いと思います。
・Purchase Analyzerを活用した利用予測シミュレーション
・アカウント共有（SPの共有） によるオーバーコミットの吸収
（詳細は[参考文献 2](#参考文献)を参照ください）

## まとめ
・コミット：毎時一定額を支払う契約。使わなくても払う。
・ディスカウントのロジック：「同じ金額で多く使える」または「同じ量で安く使える」の2軸で理解できる。
・利用量が少ないとオーバーコミットにより損をするリスクがある。

コミットとディスカウントの仕組みについて理解いただけたでしょうか？
私自身、未使用でも課金されることを理解しておらず
毎月700$くらい損をするカスタムコミットを見積もりかけたことがありました...笑
同じように悩む方の参考になれば嬉しいです。

## 参考文献
1. [AWS Savings Plans 公式ユーザーガイド](https://docs.aws.amazon.com/ja_jp/savingsplans/latest/userguide/what-is-savings-plans.html)
2. [AWS Black Belt: Savings Plans 2025/04](https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2025_SavingsPlans_0430_v1.pdf)
3. [AWS Compute Savings Plan の料金
](https://aws.amazon.com/jp/savingsplans/compute-pricing/)
4. [AWS Fargate 料金表](https://aws.amazon.com/jp/fargate/pricing/)
【初心者向け🔰】ICTにおけるインフラエンジニアのお仕事とは（プロセス編）

アディクシィ株式会社でインフラアーキテクトとして従事している
おんたまと申します。記事に目を止めていただきありがとうございます。
>アディクシィ株式会社
>https://adixi.co.jp

本記事は以下の方向けに記載をしております。

:::note info
・ICT業界に興味を持っていただいた方
・インフラ領域に興味がある方
・インフラエンジニアとしてのキャリア形成について考えている方
:::

# インフラエンジニアのお仕事とは（プロセス編）
「そもそもインフラエンジニアってどんな仕事があるの？」という疑問に回答したいと思います！！
あくまでざっくりとしたお仕事の紹介なので、興味のある方は調べてみて下さい。

# インフラ構築のプロセスについて
アプリケーション開発などでは「アジャイル開発」や「DevSecOps」などと言ったサイクル型の手法がトレンドになっていますが、インフラ構築の場合には一般的に「ウォーターフォール型」の開発手法が採用されることが多いです。

# ウォーターフォール型開発とは？
ウォーターフォール型開発は、開発プロセスの中でも伝統的な手法の一つです。名前の通り「滝（ウォーターフォール）」のように、開発工程が順番に一方向に流れて進んでいく形態を指します。一般的な手順をまず図でご説明します。

![スクリーンショット 2025-06-07 23.41.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3977382/aa9f4fd3-412d-446a-96cb-99fa42aa13e2.png)

ザックリと説明すると上記の流れになります。
上のレイヤーに行くほど経験や知見が求められ、単価・収入が高くなります。
下のレイヤーに行くほど実務に即した仕事となり、関わる人数が多くなります。
インフラエンジニア初心者は下のレイヤーから入っていくことが多いので、下から解説します。

# ①運用(保守)
インフラシステムの安定稼働を維持して、障害対応や変更要求に対応します。システムが正常に動いているか毎日チェックします。

【主な作業例】
　・監視とアラート対応
　・障害調査と復旧対応
　・定期メンテナンス（OSパッチ、FWルール更新）
　・性能監視・キャパシティプランニング
　・バックアップ運用と復元
　・変更管理（新規構築・改修時の検証と実施）
　・利用者サポートや問い合わせ対応

 # ②テスト（＋導入）
設計通りにインフラが動作しているか、性能・冗長性・セキュリティ面を検証します。また、本番へ移行しサービス開始に向けた最終セットアップを行います。

 【主な作業例】
　・ネットワークの疎通確認
　・帯域やサーバ性能の検証
　・冗長構成のフェイルオーバーテスト
　・セキュリティテスト（アクセス制御の確認、脆弱性検査）
　・バックアップ・リストアの検証
　・監視アラートの動作確認
　・運用手順の検証（障害対応手順など）
　・本番環境設定（既に構築済みの場合はデータ移行）
　・ユーザーアクセスの切り替え
　・運用チームへの引き渡し、マニュアル整備

 # ③構築(設定)
設計書に基づき、物理機器や仮想環境、クラウドリソースのセットアップと設定を行います。実際にサーバーを置いたり、ネットワークの機械をつなげたりします。

 【主な作業例】
　・サーバの設置、OSインストール、初期設定
　・ネットワーク機器の設置と設定（スイッチ、ルーター、FWなど）
　・仮想環境やクラウドリソースの展開
　・ストレージの設定
　・セキュリティ設定（ファイアウォールルール設定、アクセス制御など）
　・監視ツールやバックアップツールの導入と設定
　・運用用スクリプトや自動化ツールの準備

 # ④設計（基本設計・詳細設計）
要件を満たすインフラ構成を具体化し、設計仕様としてまとめます。全体構成から細部構成まで計画します。「サーバーはこの台数で、この順番でつなぐ」「パソコンはこういうネットワークにする」みたいに図にします。

 【主な作業例】
　・ネットワーク図作成（LAN、WAN、サブネット、VLAN、FWルール）
　・サーバ構成の決定（OS、仮想化環境、クラウドリソース）
　・ストレージ設計（RAID構成、ディスク種類、容量割り当て）
　・冗長化・バックアップ設計（クラスタ構成、DRサイト）
　・セキュリティ設計（アクセス制御リスト、認証方式、ログ管理）
　・運用設計（監視ツール選定、アラート設定、保守手順）
　・ネットワーク機器やサーバのスペック決定
　・IPアドレス設計・割り当て計画

 # ⑤要件定義
システムやサービスの利用目的、必要な機能・性能、可用性、セキュリティ要件などをクライアントや利用者とすり合わせて明確にします。何のためのシステムなのかを話し合って決めます。どれくらいの機械が必要か、どんな速さや安全性が必要かを決めます。

【主な作業例】
　・どんなサービスを支えるインフラなのか（例：Webサービス、社内業務基盤など）
　・必要なサーバ数や種類（物理・仮想・クラウド）
　・ネットワーク構成（VPN、ファイアウォール、帯域要件）
　・ストレージ要件（容量、速度、冗長化）
　・可用性目標（SLA、冗長構成の要否）
　・セキュリティポリシー（アクセス制御、監査要件）
　・運用・保守体制の要求（監視、バックアップ）
　・予算や納期の制約条件

 # 他にはどんな仕事があるの？
 一連の開発の流れを横断的にサポートする仕事として以下の仕事があります。
 システム開発のプロセスを横断的に関わるお仕事のため、高度な知見と実務経験が求められます。
 
・プロジェクトマネジメント（PM・PMO）
システム開発のプロジェクト全体の進捗を管理し、スケジュール通りのシステム開発の進行を推進します。

・システムアーキテクト
システム開発における全体の品質管理を担当し、適切なソリューション、設計方法を提案するなど、システム開発の技術サポートを全般的に行います。

・システムコンサルタント
システム開発にあたり、企画・提案段階からシステム運用に至るまで課題の分析や助言を行います。

# 終わりに
今回はインフラエンジニアのお仕事をプロセスごとに解説してみました。
ザックリと書いてますのでわからないことは調べてみて下さい。
色々なプロセスを経験することで興味のある分野の探求や、キャリア形成の参考にしてみて下さい。
AtCoderをPythonで取り組んだ振り返り(ABC409 A~B,Cは考えたところまで)

どうもこんにちは！

今週のコンテストはBまで完答。CはTLEにはなるコードをなんとか書けたという程度でした。

# 問題

問題は以下のリンクから。解説を踏まえてCまでを振り返ります。

https://atcoder.jp/contests/abc409/tasks

https://atcoder.jp/contests/abc409/editorial

## A - Conflict -
長さNの数列が2つ与えられ、いずれかの番目の値が〇で一致するならYes,一致するところがないならNoを出力する問題。
シンプルに数列を最初から順番に比較して、いずれかの場所で一致しかつ値が〇のところがあればYesを出力するとしました。なお、コンテスト時は値が〇で一致するというところをケアしておらず2つ×を付けました。。
~~~Python
n = int(input())
t = list(input())
a = list(input())

ans = False
for i in range(n):
    if t[i] == a[i] and t[i] == 'o':
        ans = True
        break

if ans == True:
    print('Yes')
else:
    print('No')
~~~

## B - Citation -
長さNの非負整数列が与えられるので、この数列にx以上の要素が重複を含めてx回以上現れる最大の値xを求めるという問題。例えば数列が1 2 2 3 1なら、x = 2としたときに3回現れますが、x = 3 だと1回しか現れないので答えは2となります。なお数列の長さの最大は100です。つまりxとなりうる最大値は100です。
さて、解説をみると、長さNということはxとなりうる値はN以下なので、全部数えたら終わりということでした。コンテスト中はものすごく難しく考えたらしく、前回のコンテストであったいもす法を使って0からそれ以上の値が何個あるか計算してみたいなことやってました。。変に勉強するとそれを使いたくなるやつですかね。なんとか完答はしていますが、この時点でだいたい1時間ほど使っていました。
~~~Python:さすがに非効率・・・
n = int(input())
s = [int(x) for x in input().split()]
count = [0 for _ in range(101)]
total = [0 for _ in range(101)]

for i in s:
    count[min(100,i)] += 1

total[100] = count[100]
for i in range(99,-1,-1):
    total[i] = total[i+1] + count[i]

ans = 0
for i in range(101):
    if total[i] >= i:
        ans = i
    else:
        break
print(ans)
~~~

## C - Equilateral Triangle -
円周がLの円があり、この円周上にN個の点が配置されています。1個目を基準として、i+1番目の点はi番目から$d_i$進んだ位置にあるして与えられます。円周上の点a,b,cがすべて異なる位置にあり、この3点を頂点とする参加角形が正三角形になる点の組み合わせの個数を求めるという問題。円周および円周上の点の数は最大で$3×10^5$です。
円周上の3点を結んで正三角形になるには、各点間の長さが同じになるはずです。円周をちょうど3分割する形ですね。
あまりに時間がなくてすべての点の組み合わせでそのようになるかを判定するコードを実装まではできたんですが、TLEとなりました。以下はコンテスト中に作ったコードです。。
~~~Python:3重ループはさすがに計算量が多い
n, l = map(int,input().split())
s = [int(x) for x in input().split()]
s.insert(0,0)

length = [0 for x in range(n)]
for i in range(1,n):
    length[i] = (length[i-1] + s[i]) % l
ans = 0
for i in range(n):
    for j in range(i,n):
        for k in range(j,n):
            a = length[j]-length[i]
            b = length[k]-length[j]
            c = length[i]-length[k]
            if a < 0:
                a += l
            if b < 0:
                b += l
            if c < 0:
                c += l      
            if a == b and b == c and a > 0 and b > 0 and c > 0:
                ans += 1
print(ans)
~~~

解説をみると、円周をL等分してそれぞれの位置に何個点があるかを計算し、基準点から$L/3$先の点と$2L/3$先の点の数を掛けたのを足し合わせたのが答えということでした。例えば円周が6なら、$d_1$と$d_3$と$d_5$にある点の数をかけたものと、$d_2$と$d_4$と$d_6$にある点の数をかけたものの合計ということでした。各点の位置ではなく、位置ごとの点の数に着目するのがポイントだったんですね。


ではでは。
ABC409回答メモ

# 0.はじめに
　最近成績が振るわない今日この頃。
　今回は特に調子が上がらないうえ、FireFoxでの
　コードテスト結果の出力表示がされなかったりと
　あわやAのみ正解となりそうな感じでした。
　その後調子を戻し、久々のDまで正解できました。
　レートも+14で721となりました。


# 1. A - Conflict
　TとSを一文字ずつ比べ、両方ともoの時Yesを
　出力して終了。
　最後まで両方ともoの列が無ければ
　No出力して終了でACとなりました。

　https://atcoder.jp/contests/abc409/submissions/66512463


# 2.B - Citation
　B問題史上最もてこずった問題。
　制限が緩いので力技でもなんとかなりそうでしたが
　その力技の方式すら思いつかずてこずりました。

　ACをもらった今でも何で解けたのかが分からない位ですが
　1時間近くかけてやっと解けました。

　【考え方】
　　１）リストAを大きい順に並べ一つずつカウントしながら見ていく
　　　-１.リストAの値とカウントが一緒の場合その値と同じ数の値が存在し
　　　　かつ、後ろから見ている＝最大値となるのでリストの値をXとして出力して終了
　　　-２.リストAの値よりもカウントが大きかった場合
　　　　→例、5 5 1 1 1
　　　　　　3つ目の1をチェックするタイミングでカウント３でリストAの値が１となる
　　　　この場合は、カウントの値がそのままXとなるので出力して終了
　　　-3.上記以外の場合、カウント数まだはＸとして補償されるので回答用項目にansを
　　　　セットして保持
　　・上記の流れで終了となっていない場合は、ansの値を出力して終了
　　　→例、6 6 6 6 6　のような場合、カウントは５でチェックが終わるので
　　　　Xの値は５となる。

　https://atcoder.jp/contests/abc409/submissions/66559197


# 3.C - Equilateral Triangle
　ややこしい図形問題かと思いきや、よくよく読めばそれほどでもない問題でした。
　【考え方】
　　　・整数のみの問題なのでLが3の倍数でない場合は条件を満たす組はないので0を出力して終了
　　　・3点間の距離はLを3で割った値なので、XにL÷3をセットして保持
　　　・円周上の各点の位置を保持するため、Dを加算してD２に保持していき
　　　　別リストPに点毎の円周上の位置を保持（D2％L）
　　　・Counter関数で円周上の位置毎の点の数を集計
　　　・円周上の0からX未満の点を起点（P1）に、P2（P1+X）、P3(P2+X)の
　　　　3つの位置の点の数を掛け合わせて足し込んでいく。
　　　・最後に集計した数を出力して終了

　https://atcoder.jp/contests/abc409/submissions/66567826


# 4.D - String Rotation
　残り20分で取り掛かったのであきらめムードでしたが
　意外と簡単な問題だったので行けました。
　【考え方】
　　・先頭から文字列を見ていき、次の文字より大きい文字があったら
　　　そこを起点に入れ替える→入れ替える文字をKとしてキープする
　　・入れ替え先は、入れ替えた文字より後ろの文字で、Kより大きい文字
　　　があった場合に、Kを差し込む
　　・最後まで差し込む位置が無かった場合は、Kを後ろにつける

　https://atcoder.jp/contests/abc409/submissions/66577622


以上
どんなインプットも読みやすい左サイドバー目次付きの議事録にするプロンプト文

### 概要

最近の生成AIは、扱える文字数も増えて書き漏れも減りました。しかし、「議事録作って」という指示だけだと毎回違う書式で作られてしまいます。業務で多くの議事録を読むときは **「毎回同じ書式で出力する」** ということが重要だと思います。素早い情報把握には統一された書式が必須です。

そこで今回は、毎回同じ書式で議事録が出力されるプロンプト文を共有します。

### 実行例
https://x.com/00oichan/status/1931256198679912809


### プロンプト文

１）以下を生成AIに貼り付けます。
２）2回目のチャットで、インプットを追加で貼り付けてください。
３）HTMLが出力されますので、メモ帳などで拡張子を.htmlにしてください。

```
インプット情報を網羅的に理解し、デジタル雑誌のイメージで、
あなたが考える最高に洗練されたデザイン性の高い単一HTMLお客様向けビジネス議事録を作成してください。
Apple・note風のミニマルデザインで、左サイドバーの固定目次が最重要です。

必須構成（**A3横サイズ**・固定フォーマット）

【表紙セクション】
  - 魅力的なタイトル（h1タグ、中央揃え）
  - 会議概要（3-4行）
  - ヒーローエリア（背景）

【第1章 エグゼクティブサマリー】
  - 1.1 概要（500-1500文字）
  - 1.2 決定事項（表形式）：`|#|決定事項|決定内容|`
  - 1.3 アクションアイテム（表形式）：`|#|アクション|担当者|期限|備考|`

【第2章以降 詳細議事内容】
  各テーマごとに必ず以下構成：
  - 2.1 {テーマ1}
    - 概要：500-1500文字（小ヒーローエリア：CSS/SVG必須）
    - 議論内容：詳細を読み応えある文章で網羅的出力（文字数制限なし）
    - 図解：HTML+CSSで表・図・グラフ・チャート必ず作成
    - 結論：番号付きリスト（3-5項目）
  - 2.2以降同様継続

  【最終章 補足・参考情報】

デザイン仕様（厳守）
  左サイドバー目次（絶対要件）
  - position: fixed; left: 0; width: 250px; height: 100vh;
  - 本文は`margin-left: 270px`で重なり絶対禁止
  - クリック可能なアンカーリンク
  - 表紙と各章のヒーローセクションはテーマに沿った写真をimages.unsplash.comから探し背景にする。リンク切れ注意
  - 章・節タイトルの下に長い区切り線でアクセント

レイアウト安定化
  - 各章・節を枠線で囲み、右下にページ番号
  - `box-sizing: border-box`全要素適用
  - Flexbox/Grid使用時は`min-width: 0`設定
  - ヒーローエリア：`background: linear-gradient(135deg, #色1, #色2)`またはインラインSVG
  - 図表：各テーマで最低1つ、上部概要150文字・下部解説800-1000文字
  - テーマ沿った落ち着いたモダンカラー使用
  - 可読性の高いモダンなフォント
  - LLMの最大トークン数を出力する

内容の充実化
  - 参加していない人でも完全理解可能な網羅性と強調表示
  - 新社会人でも読みやすい好感の持てる平易な文章。
  - 音声文字起こしなどの不明瞭な単語は全体の文脈を理解して自然な文章に修正・補記
  - 全体テーマの意図を正確に反映し自然な文章に整形
  - 入力情報の90%以上の内容を網羅する

文章品質基準
  - 簡潔性：一文25語以内、能動態優先、結論→理由→詳細の構成
  - 明瞭性：専門用語は説明併記、重要情報は文頭配置
  - 国際性：ブラウザの機械翻訳で適切に変換されるような読みやすい文章

厳守事項
  禁止
  - JavaScript、Mermaid、外部画像URL
  - 箇条書き中黒（・）→番号付きリスト必須
  - 体言止め表現、AI作成示唆記述
  - インプットにない数値表現


出力前必須チェック
  1. [ ] 左サイドバー固定配置・本文重なりなし
  2. [ ] 全章節に番号、表紙は1章カウント外
  3. [ ] 各セクションにヒーローエリアが存在
  4. [ ] ヒーローエリアにリンク切れなし
  5. [ ] グラフやチャートの形崩れなし
  6. [ ] 要点に強調表示あり（マーカー、太字、アンダーライン）


出力形式：
　完全なHTMLコードで出力する。コードをそのまま別のシステムに使用するためコードのみを出力する。冒頭・末文は不要。
　
インプット：
　（次のチャットで指示をしますので、何も出力せずに待機しててください）


```
インプットは、会議の資料やメモ、音声文字起こしなどがいいです。

### まとめ

このプロンプト文を活用することで、会議の内容を網羅的に理解し、参加者はもちろん、不参加者にも分かりやすく、そして何よりも洗練されたデザインの議事録を効率的に作成することができます。ぜひ一度お試しください。

気に入って頂けましたらぜひ「いいね」をおして頂けると嬉しいです
　
　
　
▼ 議事録ではないレポート作成バージョンのプロンプト文です ▼

https://qiita.com/oichan00/items/ef2c158e165152f2083d

　
▼ プロンプト集を用意しています。ぜひご覧ください ▼

https://qiita.com/tags/nori%e5%bc%8f%e3%83%97%e3%83%ad%e3%83%b3%e3%83%97%e3%83%88%e9%9b%86
Difyをローカルでデバッグする

Dify にコントリビューションする機会があり、その時に調べたデバッグモードで起動する方法を記事に残す。

## 結論
公式リポジトリの `/api` フォルダと、 `/web` フォルダ内にある `README.md` の内容を参考にして、デバッグモードで起動する。（少し前に公式ドキュメントにも書いてあった気がするが、見当たらなくなってしまった）

### ２回目以降の起動手順
環境変数ファイルのセットアップを省いたもの。初回で既に各種セットアップが完了していることが前提。

```bash
cd dify

# middleware
cd docker
docker compose -f docker-compose.middleware.yaml --profile weaviate -p dify up -d

# backend
cd ../api
uv sync --dev
uv run flask db upgrade
uv run flask run --host 0.0.0.0 --port=5001 --debug

# (任意) async worker
uv run celery -A app.celery worker -P gevent -c 1 --loglevel INFO -Q dataset,generation,mail,ops_trace,app_deletion

# frontend
cd ../web
pnpm install
pnpm run dev

# http://localhost:3000/
```


## 起動手順
Dify はバックエンドとフロントエンドに分かれているため、それぞれを別々に起動する。

### バックエンドの起動手順
参考：https://github.com/langgenius/dify/blob/main/api/README.md

#### middleware の起動
バックエンドは各種ミドルウェア（PostgreSQL, Redis, Weaviate, ...）に依存しているため、まずはミドルウェアを起動する。
```bash
cd dify

# 環境変数の設定
cd docker
cp -b middleware.env.example middleware.env

# ミドルウェアの起動
docker compose -f docker-compose.middleware.yaml --profile weaviate -p dify up -d
```

#### backend の環境変数を設定
まずはデフォルトの環境変数から、デバッグ用の環境変数を作り出す。
```bash
cd ../api
cp .env.example .env 
```

セッションや、データベース暗号化用の `SECRET_KEY` を発行する。`sed` コマンドの動作が若干 OS によって違うので、Linux と Mac ユーザはここで読み替える。
> セッションクッキーを安全に署名し、データベース上の機密情報を暗号化するためのキー。
> https://docs.dify.ai/ja-jp/getting-started/install-self-hosted/environments#secret-key

**Linux**
```bash
sed -i "/^SECRET_KEY=/c\SECRET_KEY=$(openssl rand -base64 42)" .env
```

**macOS**
```bash
secret_key=$(openssl rand -base64 42)
sed -i '' "/^SECRET_KEY=/c\\
SECRET_KEY=${secret_key}" .env
```

#### backend の仮想環境を構築

backend を起動するために、[uv](https://docs.astral.sh/uv/) を使って仮想環境を作っておく。

（初回のみ）uv をインストール

```bash
curl -LsSf https://astral.sh/uv/install.sh | sh
```

`pyproject.toml` から依存パッケージをインストールする

```bash
uv sync --dev
```

データベースのマイグレーションを行う。

```bash
uv run flask db upgrade
```

:::note info
コードを読むと、`api/migrations` 配下のデータが使われて Flask-Migrate が DB をマイグレートしていることが分かる
:::

#### backend を起動
backend を起動する。

```bash
uv run flask run --host 0.0.0.0 --port=5001 --debug
```

続けてフロントエンドの起動を行う。

#### （任意）ナレッジベース等の非同期機能を使いたい場合
データセット読み込みや、ドキュメントのインデックスなどの非同期機能を使いたい場合は、worker サービスも起動する

```bash
uv run celery -A app.celery worker -P gevent -c 1 --loglevel INFO -Q dataset,generation,mail,ops_trace,app_deletion
```


### フロンエンドの起動手順
参考：https://github.com/langgenius/dify/blob/main/web/README.md

#### 前提条件
- [Node.js](https://nodejs.org) >= v22.11.x
- [pnpm](https://pnpm.io) v10.x

#### 依存パッケージのインストール

```bash
pnpm install
```

#### 環境変数の設定
まずはデフォルトの環境変数から、デバッグ用の環境変数を作り出す。

```bash
cp .env.example .env.local
```

必要に応じて `.env.local` を編集し、環境変数を適用する。
```
# コンソールアプリの Base URL
NEXT_PUBLIC_API_PREFIX=http://localhost:5001/console/api

# Web APP の Base URL
NEXT_PUBLIC_PUBLIC_API_PREFIX=http://localhost:5001/api

# SENTRY
NEXT_PUBLIC_SENTRY_DSN=
```

#### フロントエンドを起動
フロントエンドのコンポーネントを起動する。

```bash
pnpm run dev
```

Dify には `http://localhost:3000` でアクセスできる。ホットリロードに対応しているので、`/app` 配下を修正すると即時反映される。
【Python初心者】Base64エンコードとデコードの基本まとめ

今回は、バイナリデータや文字列をBase64という形式に変換したり、元に戻したりする方法について学んだことをまとめました。Base64は、データを安全に送受信するために使われる形式の一つです。

## Base64とは？

Base64とは、バイナリデータ（画像・音声・ファイルなど）を、ASCII文字だけで表現できるように変換する方法のひとつです。URLやメールなどでデータを扱いやすくするために使われます。



## Base64エンコード（`base64.b64encode()`）

まずは、文字列をBase64にエンコードしてみます。エンコードするには、最初にバイト型に変換してから `b64encode()` を使います。

```python
import base64

original = "hello world"
original_bytes = original.encode("utf-8")

encoded_bytes = base64.b64encode(original_bytes)
encoded_str = encoded_bytes.decode("utf-8")

print(encoded_str)
```

```
aGVsbG8gd29ybGQ=
```


## Base64デコード（`base64.b64decode()`）

Base64文字列を元のデータに戻すには `b64decode()` を使います。

```python
import base64

encoded_str = "aGVsbG8gd29ybGQ="
decoded_bytes = base64.b64decode(encoded_str)
decoded_str = decoded_bytes.decode("utf-8")

print(decoded_str)
```

```
hello world
```


## バイナリデータ（画像など）にも使える

Base64は文字列だけでなく、バイナリファイル（画像や音声など）にも使えます。たとえば画像をBase64にエンコードするときは次のようになります。

```python
with open("image.png", "rb") as f:
    image_data = f.read()

encoded = base64.b64encode(image_data)
print(encoded[:60])  # 先頭だけ表示
```

```
b'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABFklEQVQ4T6WTsQ2DMAxF3'
```


## Base64の用途例

- メール添付ファイルのエンコード
- JSONなどでバイナリデータを含むとき
- Basic認証のユーザー名＋パスワードのエンコード
- Web APIでの画像データの送受信



## おわりに

Base64はバイナリデータを文字列として扱うための基本的な方法です。画像や音声などをWeb経由で送信したり、認証情報を一時的に扱うときに使われる場面が多いようなので、基礎だけでも覚えておこうと思います。
IBM Cloud Databases（PostgreSQL/Redisなど）を特定VPCからのみアクセス可能にする

# IBM Cloud Databasesのアクセス制御

IBM Cloud の Cloud Databases (PostgreSQL, Redis など) は、Public Endpoint, Private Endpointでのアクセス制限が可能である。
しかし、Private Endpointは"IBM Cloud 内バックボーン経由"となるだけで、テナント境界を分離しない。つまり、別のアカウント上のコンポーネントやVPCからもアクセス可能となる。
そこで、Context-based Restriction (CBR) を用いて"特定のVPCからのみ"DBへアクセスできるような制御を実装する。


**Context-based Restrictionについて**：
（Event-NotificationsのDocumentだが、内容的には同じと思われる）

https://cloud.ibm.com/docs/event-notifications?topic=event-notifications-en-access-control-cbr


## 設定手順
今回はDatabases for PostgreSQLを一つのVPC(名前: your-vpc)からのみアクセスできるように制限してみる。
Databasesの適当なリソースを開き、Settingsの中段よりContext-based RestrictionsのCreate ruleをクリックすることで新規ルールの作成が可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3363316/ad8c22e7-9a05-47e8-a29b-7764c3b03a3f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3363316/435bdda4-5cda-4a44-bc49-4ded51a64cdc.png)

### 新規ルールの作成

サービスには今回制限したいサービスを選択する。

**APIセクションのサービスAPIには"Data plane (0)"を選択すること。**

:::note warn
一見AllやControl Planeを選択しないと意味を為さないように見えるが、それらは選択するとエラーとなる。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3363316/b27e5e1b-32ee-4500-8e42-b449016a0951.png)

リソースとして特定のリソースを選択し、今回制限をかけたいDBのインスタンス(Databases for PostgreSQL)を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3363316/d30bbf20-99f0-4260-b5b6-ffd73856d427.png)
次へを選択してコンテキストの追加へ進む。

Endpointsのラジオボタンを有効化し、使用しているエンドポイントのチェックをいれる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3363316/7bea8f50-5533-4644-99a2-d568cb86a84f.png)
ネットワーク・ゾーンの追加を行う。
作成をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3363316/e31d1988-737f-4c49-982a-6c9353d67914.png)

適当な名前を入力し、許可されたVPCのセクションにて、ドロップダウンよりVPCを選択する。
ここで選択したVPCからのみのアクセスに制限される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3363316/082ce878-cee4-4539-ae39-c3ecb04954ee.png)
レビュー -> Create
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3363316/f83d6160-d04b-48a1-9f18-4b78402b7ad2.png)
その後、忘れずに左下の”追加”をクリックすること。
追加して画面右側のコンテキストに表示されないと、設定は有効にならない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3363316/c46756d0-882c-4283-82e6-c79865426cf8.png)
次のページにてルールの詳細として適当な説明（名前）を入力し、適用をクリックすることでルールは作成される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3363316/739fb4d4-806d-45df-8bbd-ea0fc7814b4d.png)
ルールの一覧に作成したルールが表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3363316/c1eae187-1b6a-4558-b90f-c90a81b465f9.png)

## psqlでの接続を試す
ルールを作成した後、体感1分ほどすると設定が有効になるようだ。
限定アクセスとしたVPCにVPN接続しpsqlコマンドを叩いたところ、通常通りアクセス可能であった。
同じアカウントの有する別VPCや、別アカウントのVPCからVPN接続しpsqlコマンドを叩き、アクセスできないことを確認できれば完了。
【Python初心者】Webデータを取得・レスポンスを処理する基本まとめ

PythonでWeb上のデータを取得したり、レスポンスの中身を確認したりするための基本的な方法について学んだことをまとめました。`urllib.request` を使って、HTTPリクエストやレスポンスの処理を行います。

## Webページの内容を取得する（`urlopen()`）

指定したURLからHTMLやJSONなどのデータを取得できます。

```python
from urllib.request import urlopen

url = "https://www.example.com"
with urlopen(url) as response:
    html = response.read().decode("utf-8")

print(html[:200])  # 先頭200文字だけ表示
```

```
<!doctype html>
<html>
<head>
    <title>Example Domain</title>
    ...
```

## HTTPステータスコードを確認する

レスポンスのステータスコード（200, 404など）を取得できます。

```python
from urllib.request import urlopen

url = "https://www.example.com"
with urlopen(url) as response:
    print(response.status)
```

```
200
```

## レスポンスヘッダーを取得する

レスポンスに含まれるHTTPヘッダーの情報を確認できます。

```python
from urllib.request import urlopen

url = "https://www.example.com"
with urlopen(url) as response:
    headers = response.getheaders()
    for header in headers:
        print(header)
```

```
('Content-Type', 'text/html; charset=UTF-8')
('Content-Length', '1256')
...
```

個別のヘッダーだけを取得するには `getheader()` を使います。

```python
print(response.getheader("Content-Type"))
```

```
text/html; charset=UTF-8
```

## HTTPメソッドを指定して送信する（`Request` クラス）

GET以外のメソッド（POST, PUT, DELETEなど）を使いたいときは `Request` を使います。

```python
from urllib.request import Request, urlopen

url = "https://httpbin.org/put"
req = Request(url, method="PUT")

with urlopen(req) as response:
    print(response.status)
```

```
200
```

## POSTでデータを送信する

`data` にバイト列を渡すと、POSTリクエストになります。

```python
from urllib.request import Request, urlopen
from urllib.parse import urlencode

data = urlencode({'name': 'alice', 'age': 30}).encode("utf-8")
url = "https://httpbin.org/post"

req = Request(url, data=data, method="POST")

with urlopen(req) as response:
    print(response.read().decode("utf-8"))
```

```
{
  "form": {
    "age": "30",
    "name": "alice"
  },
  ...
}
```

## おわりに

今回はWebからのデータ取得や、レスポンスの内容を確認するための基本的な方法を整理しました。特にAPIを使う場面では、レスポンスヘッダーやステータスコードの扱いが重要になることもあるので、実際に手を動かして確認していきたいと思います。
rootにてコンソールログインした場合、SNSで通知する方法

## はじめに
色々ありまして、急遽こちらを対応することになりました。
対応終わった後気が抜けたのか、41度オーバーの発熱をしてえらい目にありました。

## 概要
今回のシステムは、rootにてコンソールログインを行った際自動でメールが届くというものです。メールを確認するとアカウント番号と接続元のIPがわかるようになっています。

## アーキテクチャ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882356/156fd066-3af1-4631-95ac-bd84a19cacda.png)


## 手順
**リソースはバージニアで作成すること**

①SNSにて通知先のメールアドレスを登録する

②EventBrigeを以下設定で作成します。
・イベントパターン
```
{
  "detail-type": ["AWS Console Sign In via CloudTrail"],
  "detail": {
    "eventType": ["AwsConsoleSignIn"],
    "userIdentity": {
      "type": ["Root"]
    }
  }
}
```
・先ほど作成したSNSをターゲットにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882356/60e59316-5abf-44f8-a7ac-9101b14dbb16.png)

・入力トランスフォーマーで以下を設定する
入力パス
```
{
  "account": "$.detail.userIdentity.accountId",
  "eventID": "$.detail.eventID",
  "eventName": "$.detail.eventName",
  "eventSource": "$.detail.eventSource",
  "eventTime": "$.detail.eventTime",
  "ipAddress": "$.detail.sourceIPAddress",
  "region": "$.detail.awsRegion",
  "userAgent": "$.detail.userAgent"
}
```
入力テンプレート
```
"[重要] ルート認証情報使用アラート"

"AWS アカウント: <account> でルート認証情報の使用が検出されました。"
"IPアドレス: <ipAddress>"

"早急に確認してください。"
```

:::note 
入力テンプレートで改行したい場合  " を行の両サイドに付ける必要があります。
:::

以上で設定は終わりです。
rootにてコンソールログインすると、SNSからメールが届きます
入力トランスフォーマーを利用しているので、見やすいかと思います。

## まとめ
イベントパターンの設定が中々できずに苦戦しておりました。
最終的には今回記載したイベントパターンですと成功しました。
誰かの参考になれば、幸いです。