OmniAICreator/Qiita-1.07M huggingface dataset:
【要点まとめ】『リーダブルコード』を読んで現場で使えるポイントを凝縮！

## 📖 はじめに

「読みやすいコードってなんだろう？」  
そんな疑問を持ったすべての開発者に読んでほしいのが **『リーダブルコード』**。

この本では、「他人が読んで理解しやすいコード」を書くための具体的なテクニックが紹介されています。  
この記事では、**現場で即使える要点をわかりやすく9項目にまとめました！**

---

## 1. コードは「コンピューター」ではなく「人間」が読む

- 読みやすいコードは、保守性が高く、バグも見つけやすい。
- 「自分以外の人」が読んでも理解できるように書こう。

---

## 2. 意味のある名前をつける

- `x` や `tmp` よりも `userList` や `elapsedTimeInDays`。
- 一貫性を持った命名を心がける（例：`get` と `fetch` を混ぜない）。

---

## 3. わかりやすい構造にする

- 関連する処理は近くにまとめる。
- 関数は1つのことだけを行う。

---

## 4. 無駄な情報を省く

- ノイズとなるコメントや冗長な変数名は省略。
- 必要な情報だけをシンプルに。

---

## 5. コメントには「なぜ」を書く

- 「何をしているか」よりも「なぜそうしたか」を書く。
- コメントで説明するより、コード自体をわかりやすく書く。

---

## 6. 制御構造をシンプルに

- ネストを深くしすぎない（早期リターンを使う）。
- 条件式を直感的に。

---

## 7. 例とテストで理解を助ける

- ドキュメントよりも具体的な使用例を。
- テストも読みやすく書くと理解が深まる。

---

## 8. 一貫性が最重要

- チームのスタイルガイドに従う。
- 「迷ったら既存コードに合わせる」こと。

---

## 9. リファクタリングは普通のこと

- 動くからといって放置せず、積極的に改善していく。

---

## 🎯 まとめ

- コードは未来の自分やチームの仲間への手紙。
- 「読みやすさ」はエンジニアとしての思いやり。

---

## 📚 参考書籍

- 『リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック』
[ご案内]Q11Q CSV Format v1.0（QSv1）構文仕様書：CSVの型地獄に終止符を打つ自己記述型構造

# Q11Q CSV Format v1.0（QSv1）とは？

Q11Q  CSV Format（通称：QSv1）は、従来のCSVフォーマットに3行の構造定義（列番号・データ型・列名）を追加することで、

- データ型の誤認識（例："0" → True）
- フィールド名の衝突（予約語・重複）
- 型変換エラーの原因不明
といったCSV処理における構造的課題を根本から解決する**自己記述型CSV構文である**。

本仕様は、AccessやExcelに限らず、Python（Pandas）、SQLデータベース（PostgreSQL/SQLite）、ETLツールなどあらゆるデータ連携環境で利用可能である。

---

## 📦 特徴

- ✅ 列番号による**順序保証**と**揺らぎ防止**
- ✅ データ型を明示することで**型推論の暴走回避**
- ✅ クォーテーション不要、TAB区切り推奨で**解析・編集が容易**
- ✅ 単体CSVで完結、**スキーマ定義ファイル不要**
- ✅ SQL DDLへの変換や自動テーブル生成にも対応
- ✅ AIが構造を把握しやすい

---

## 📘 想定使用者

- CSVをAccessやPythonに読み込む際に毎回型エラーと戦っている方
- SQLの予約語と列名がぶつかって困っている方
- Excel→CSV→Access変換で「255列制限」や「空文字 vs Null」問題に悩む方
- データベース設計・インポート仕様書を**CSVに同梱して自己記述化**したい方
- AI用のデータベースに変換したい方

---

本仕様書では、Q11Q CSV Format v1.0の構文定義、データ型仕様、処理上の利点、活用例（SQL自動生成など）について順を追って説明します。

👉 詳細仕様はこちら →https://qiita.com/Q11Q/items/c79321a8ab9d3b0a560a
Next.js の Middleware で GraphQL を呼び出したかった


# 前提

- Next.js 15.3
- GraphQL クライアントは `urql` を使用

# やりたかったこと

- App router でルーティングされた動的パスルートに入る前に GraphQL を叩いて、レスポンスを取得したかった。
- 取得したレスポンスを元に、結果が OK であればそのままルーティング、NG であれば 308 リダイレクトしたかった。

# 何があったのか？

- Next.js の [Middleware](https://nextjs.org/docs/app/building-your-application/routing/middleware) から GraphQL は叩けなかった
- 厳密にはローカルでは叩けるが、 `next build` で失敗してしまい、デプロイできなかった

```sh
Failed to compile.

./src/lib/urql/graphql-client.ts
Dynamic Code Evaluation (e. g. 'eval', 'new Function', 'WebAssembly.compile') not allowed in Edge Runtime
Used by persistedExchange
Learn More: https://nextjs.org/docs/messages/edge-dynamic-code-evaluation

The error was caused by importing '@urql/exchange-persisted/dist/urql-exchange-persisted.mjs' in './src/lib/urql/graphql-client.ts'.

Import trace for requested module:
  ./src/lib/urql/graphql-client.ts
  ./src/lib/urql/index.ts
  ./src/features/lib/redirect-info.ts
  ./src/middleware.ts


> Build failed because of webpack errors
 ELIFECYCLE  Command failed with exit code 1.
```

# 何このエラー？

- Next.js は実は 2 つのランタイムを持っていて、1 つは `Node.js`、もう 1 つは `Edge` というもの
- Edge ランタイムでは、軽量で高速である一方、Node.js の機能は一部しか使えない
- Middleware のようなすべてのリクエストに対して実行されるものは、Edge ランタイムの方がパフォーマンスが良いとされている
- **GraphQL クライアントなど、特定のライブラリは、Node.js の機能を使用しているため、Edge ランタイムでは動作しない**

### Edge ランタイムってなに？

https://edge-runtime.vercel.app/

Edge ランタイム自体は Edge コンピューティングでの使用を想定しているようです。  
Edge コンピューティングといえば

- Cloudflare Workers
- Vercel Edge Functions
- AWS Lambda@Edge

ですね。

（ということはつまり、Vercel にデプロイしないと旨みがない・・・？）

# 試したこと

Middleware で GraphQL を叩けない以上、別のアプローチを試してみました。

## 1. page.tsx から GraphQL を叩く

これはダメでした。  
GraphQL を実行して結果が NG だった場合、リダイレクトする必要があったのですが、リダイレクト前のページが先に一瞬レンダリングされてしまい、ユーザーに不自然な体験を与えてしまいました。

- 例えば、 `/users/1` にアクセスしたときに、 `/users/1` のページが一瞬表示されてしまう
- その後、リダイレクトされて `/search` に遷移する

という挙動です。

さらに本来は 308 リダイレクトをしたかったのですが、実際の挙動は `/users/1` に 200 ステータスが返ってきて、 `/search` に 200 ステータスが返ってくるというものでした。
（リダイレクトではなく RSC の fetch が走っていました。）

## 2. layout.tsx から GraphQL を叩く

page.tsx と同じ挙動でした。

# 解決策

現時点では、手詰まりです。

# 朗報

Middleware のランタイムを切り替えることが将来できるようになるようです。

https://nextjs.org/docs/app/building-your-application/routing/middleware

現在は canary バージョンであれば次のように `next.config.ts` に記述することで、Node.js ランタイムを使用することができるようです。

```sh package.json
{
  "dependencies": {
    "next": "canary"
  }
}
```

```js next.config.ts
import type { NextConfig } from 'next'

const nextConfig: NextConfig = {
  experimental: {
    nodeMiddleware: true,
  },
}

export default nextConfig
```

```ts middleware.ts
export const config = {
  runtime: 'nodejs',
};
```

次回の安定版まで待ちます。
高校数学2と3で学ぶLLM × 機械学習 × 生成AI


###  第1部：LLM・生成AIと数学の関係を知る

| 単元  | 内容                                                                    |
| --- | --------------------------------------------------------------------- |
| 1.1 | **AIは何を最適化しているのか？**〜損失関数と「最小値」〜<br>▶ 数Ⅱ「関数の最大・最小」と結びつけて学ぶ             |
| 1.2 | **AIにおける指数関数の正体**：e, log, Sigmoid, Softmax の意味<br>▶ 数Ⅱ「指数・対数関数」から理解する |
| 1.3 | **モデルはどう「曲線」を学ぶか？**〜多項式回帰・最小二乗法〜<br>▶ 数Ⅱ「2次関数・近似」応用編                  |
| 1.4 | **確率で言葉を作るAIの仕組み**：条件付き確率と生成モデル<br>▶ 数A「確率」＋数Ⅲ「条件付き確率」の活用             |
| 1.5 | **ベクトルとAIの“似てる”を測る方法**：内積とコサイン類似度<br>▶ 数B「ベクトル」を使って意味距離を計算            |

---

###  第2部：数学Ⅲで強化する「モデルを動かす計算力」

| 単元  | 内容                                                                    |
| --- | --------------------------------------------------------------------- |
| 2.1 | **偏微分ってなに？**：機械学習における勾配と誤差の最小化<br>▶ 数Ⅲ「微分法」から「勾配降下法」へつなげる             |
| 2.2 | **関数の合成と連鎖律**：ニューラルネットの誤差伝播の数学<br>▶ 数Ⅲの連鎖法則を実用的に体感                    |
| 2.3 | **積分＝意味の合計？**：Softmaxの正規化・確率密度関数と積分<br>▶ 数Ⅲ「積分法」から確率的発想へ              |
| 2.4 | **行列と多変量関数**：Transformerの背後にある線形代数入門<br>▶ 数C相当（もしくは拡張）：「行列の積」「ベクトル変換」 |
| 2.5 | **AIは「変化」をどう学ぶのか？**：接線、傾き、最急降下のイメージ統合                                 |

---

###  第3部：数学 × プログラミング演習（Pythonベース）

| 単元  | 内容（NumPy・Matplotlib・PyTorchでの演習）           |
| --- | ------------------------------------------ |
| 3.1 | グラフで見る「最小値」〜損失関数と学習率〜<br>2次関数の最小化をシミュレーション |
| 3.2 | Softmaxと確率の可視化〜指数関数と対数の操作〜                 |
| 3.3 | ベクトル内積と類似度を図形とコードで理解する                     |
| 3.4 | 偏微分と勾配降下法：簡易ニューラルネットの学習体験                  |
| 3.5 | ChatGPT的文章生成：確率と選択のPythonミニ実装（n-gramや確率分布） |

---

###  第4部：高校生にもできる生成AI活用と社会実装

| 単元  | 内容                                    |
| --- | ------------------------------------- |
| 4.1 | プロンプトエンジニアリング入門：ChatGPTに数式を教える/教えてもらう |
| 4.2 | 生成AIで学習補助：数学の証明説明、図形問題の分解、作文添削        |
| 4.3 | 数学×創作：AIに短歌、詩、ストーリーを生成させて構造を解析する      |
| 4.4 | AIに頼る危うさと倫理：数学的に「正しいこと」と「納得できること」は違う？ |
| 4.5 | 卒業研究・探究活動に活かすAI：レポート生成・表作成・資料要約の活用術   |

---
あなたのReactフォーム、まだsetStateを分けてるの？一括管理の最適解はこれ！

# はじめに
Reactでフォームを作成する際、複数のinput要素の値を効率的に状態管理するには、`handleChange`関数をうまく設計することが重要です。本記事では、`handleChange`関数を使って`formData`の状態を一元的に更新する方法を紹介します。

# よくある課題：inputごとに個別のsetState？

フォームに複数の入力欄があると、以下のように`setState`関数をinputごとに分けて書いてしまいがちです。

```jsx
const [formData, setFormData] = useState({ name: '', email: '' });

const handleNameChange = (e) => setFormData({ ...formData, name: e.target.value });
const handleEmailChange = (e) => setFormData({ ...formData, email: e.target.value });
```

このようなコードは冗長になりがちで、input項目が増えるたびに関数を追加する必要があります。

# 解決策：スプレッド文＋動的key更新

以下のように、`input`タグに設定された`name`属性を活用することで、**すべてのinput要素に対する状態更新を1つの関数にまとめる**ことができます。

```javascript
const handleChange = (e) => {
  setFormData({ 
    ...formData, 
    [e.target.name]: e.target.value 
  });
};
```

* `e.target.name` でどのフィールドかを特定
* `e.target.value` をそのフィールドの新しい値としてセット
* オブジェクトスプレッド構文 (`...formData`) によって、既存の値は保持され、該当のキーだけが更新されます

# 使用例：複数のinputに対応

```javascript:MultiStepForm.jsx
import { useState } from 'react';

const initialFormData = {
  name: '',
  email: '',
  password: '',
};

export default function MultiStepForm() {
  const [step, setStep] = useState(1);
  const [formData, setFormData] = useState(initialFormData);

  const handleChange = (e) => {
    setFormData({
      ...formData,
      [e.target.name]: e.target.value,
    });
  };

  const nextStep = () => setStep((prev) => prev + 1);
  const prevStep = () => setStep((prev) => prev - 1);

  return (
    <div>
      {step === 1 && (
        <div>
          <h2>Step 1: 名前</h2>
          <input
            type="text"
            name="name"
            value={formData.name}
            onChange={handleChange}
            placeholder="Your Name"
          />
          <button onClick={nextStep}>次へ</button>
        </div>
      )}
      {step === 2 && (
        <div>
          <h2>Step 2: メールアドレス</h2>
          <input
            type="email"
            name="email"
            value={formData.email}
            onChange={handleChange}
            placeholder="Your Email"
          />
          <button onClick={prevStep}>戻る</button>
          <button onClick={nextStep}>次へ</button>
        </div>
      )}
      {step === 3 && (
        <div>
          <h2>Step 3: パスワード</h2>
          <input
            type="password"
            name="password"
            value={formData.password}
            onChange={handleChange}
            placeholder="Your Password"
          />
          <button onClick={prevStep}>戻る</button>
          <button onClick={() => console.log(formData)}>送信</button>
        </div>
      )}
    </div>
  );
}
```

これで、inputの数が増えても`handleChange`一つで対応可能になります！

# まとめ

* `input`の`name`属性を活用すると、1つの`handleChange`関数で複数の状態更新に対応可能
* 冗長なコードを減らし、保守性が高く、スケーラブルなフォーム実装ができる

このテクニックはReactでフォームを扱う際の定番パターンなので、ぜひ覚えておきましょう！
【AWS】ALBのタイムアウト設定

## はじめに
EC2(APP)直アクセスの構成からALB経由のAPPサーバー2台構成に変更した際、
大量のCSVデータ出力でタイムアウトが発生するようになった。

## 原因
EC2のnginxの設定は5分としていたので従来はタイムアウトにならなかったが、
ALB側にもタイムアウトの設定があり、こちらに抵触しタイムアウトとなっていた。

## 対応
ALBのタイムアウト設定をEC2のnginxの設定と同じように5分に変更することで解決。

## 設定方法
EC2 > ロードバランサー > 対象ALB より
属性の編集にある接続アイドルタイムアウトの時間を変更すればOK。
![ALB _1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3083940/7d16a5ce-c3ff-40dc-96c9-907c97a7f9ed.png)

![ALB _2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3083940/b60f406f-609c-435a-921c-15be9083f6bb.png)
【Python】`%3b`が`%253bs`に...なぜ？原因は「URL エンコードが二重に適用」されてしまっていたためだった

# 概要

```python
sample_param=hoge_flag:true;foo_flag:true
```

上記の形で指定してパラメータをクエリに付与したく、
pythonコード上で

```python
sample_param=hoge_flag:true%3bfoo_flag:true
```

と記載しました（`%3b`はセミコロン`;`を表す）。

しかし、AWS上でいざデバッグ結果を見ると

```python
sample_param=hoge_flag%3Atrue%253bfoo_flag%3Atrue
```

という結果で処理されてしまっていることがわかりました。
原因と解決方法を紹介します。

# 原因

`%3b`が`%253bs`になっていたのはURLエンコードが二重に適用されてしまっていたため、でした。

`%3b` は URL エンコードされたセミコロン (`;`) を表しますが、
`%253b` は `%3b` をさらに URL エンコードしたものです。

なぜ二重エンコードが発生してしまったのでしょうか。

それは、コード上で

```python
sample_param=hoge_flag%3Atrue%3bfoo_flag%3Atrue
```

と設定した後に、pythonのリクエストライブラリ（私の場合は`requests`）が再度エンコードしてしまっていたため、と考えられます。

既にエンコードした値を与えてしまったので、自動でさらにエンコードされてしまったのですね。

## 解決方法
リクエストライブラリで使う値をエンコードせずにそのまま設定し、ライブラリに任せる形にしたら、二重エンコードがなくなりました。

つまり、以下のようにセミコロンをそのまま使用します。


```python
sample_param=hoge_flag:true;foo_flag:true
```

これで、クエリパラメータ上では「`%3b`」で表示されることを確認できました。

ライブラリにエンコードを任せるのが良いのですね。

#### (参考)
`requests`モジュールでは、標準ライブラリの`urllib.parse.urlencode`などを使って自動的にエンコードを実施しているようです。

https://docs.python.org/ja/3/library/urllib.parse.html#urllib.parse.urlencode
【未経験者研修２か月目】SessionにDBのリストを格納する、WEBサービスは設計として正しいのでしょうか、、

セッションにリストを保持する設計は正しいのか？ 〜研修での実装から考える〜

現在、研修で作成したアプリケーションでは、以下のように
DBから取得したクイズ情報（問題文と4つの選択肢）をセッションに格納しています。
```
quizList = examService.getQuizFormsByMode(mode);
session.setAttribute("quizList", quizList);
```
この処理は、クイズの各問題を画面遷移ごとに表示する目的で、あらかじめ全ての問題をセッションに保持しておく設計です。ローカル環境では特にパフォーマンスの問題もなく動作していますが、本番環境を想定した場合、この設計が適切か否か、疑問が残ります。

自己紹介
改めまして、自己紹介させていただきます。
2001年生まれの24歳で、2025年4月よりエンジニア職としてSES企業に転職いたしました。

現在までに学習した主な技術スタックは以下の通りです：
Java / JavaScript / MySQL / HTML・CSS / VBA

成果物（チーム開発）
プロジェクト概要

開発形式：4人の小規模チームによるWebアプリケーション開発

使用技術：Spring Framework

担当工程：要件定義〜設計〜開発〜テスト

開発期間：約3週間

バージョン管理：Git

画面単位で担当を分け、1人が1画面のバックエンドからフロントエンドまでを一貫して開発する体制で進めました。

担当・貢献ポイント
プロジェクトにおいて、自身が発揮したバリューは以下の通りです：

要件定義フェーズでの顧客ヒアリングの実施

セキュリティ・運用面を考慮した仕様提案と顧客との調整

Springの設計思想を踏まえた、チーム内ソースコードのレビューおよび指摘

複数のDB連携が関与する画面の設計および実装

UI/UXを意識した画面設計、および非同期通信処理の実装（Ajax等）

各種機能に対するテストケースの設計・作成

現在の学習目標
基本情報技術者試験（FE） 合格に向けた学習

Java Silver認定資格 の取得に向けた学習

個人開発の取り組み
現在は、Reactを用いたSPA（Single Page Application）サイトの作成に取り組んでおり、フロントエンド技術の実践的な習得を進めています。

最後に
エンジニアとしての成長を第一に、技術力・設計力・コミュニケーション力のバランスを意識しながら、今後も業務・個人学習に取り組んでまいります。
何卒よろしくお願いいたします。
Salesforce Inspector を使用したデバッグログの一括削除

# 概要

デバッグログを一括削除する方法はいくつかありますが、Chrome 拡張機能の [Salesforce Inspector Reloaded](https://chromewebstore.google.com/detail/salesforce-inspector-relo/hpijlohoihegkfehhibggnkbjhoemldh) を使用した方法が楽だったので記事にしました。

:::note warn
[Salesforce inspector](https://chromewebstore.google.com/detail/salesforce-inspector/aodjmnfhjibkcdimpodiifdjnnncaafh) は Chrome 拡張機能のベストプラクティスに沿っていないため使用できなくなりました。Salesforce inspector の後継となる Salesforce Inspector Reloaded を使用してください。
:::

# 手順

1. 画面右端の出っ張りをクリックして Inspector の画面を開き、「Data Export」をクリック
    
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950738/1bae6afb-4975-442b-b9a3-ce22eff24fe7.png)
    
2. 「Tooling API?」にチェックを付けて「Export Query」欄に削除したいデバッグログ（ApexLog オブジェクト）を抽出する SOQL を入力し、「Run Export」ボタンをクリック
    
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950738/5260f584-bc63-4188-a505-5bdfca6ac1ae.png)

    :::note
    私がよく使う SOQL を添付します。
    
    - 全てのデバッグログを取得
        ```sql
        SELECT Id, StartTime, Status, LogUserId, Operation, DurationMilliseconds, LogLength, Application, Location, Request, RequestIdentifier FROM ApexLog ORDER BY StartTime DESC
        ```
    - 今日より前のデバッグログを取得
        ```sql
        SELECT Id, StartTime, Status, LogUserId, Operation, DurationMilliseconds, LogLength, Application, Location, Request, RequestIdentifier FROM ApexLog WHERE StartTime < TODAY ORDER BY StartTime DESC
        ```
    - 指定した開始時刻より前のデバッグログを取得（`2000-01-01T00:00:00+0900` の部分を任意の日時に置き換えてください）
        ```sql
        SELECT Id, StartTime, Status, LogUserId, Operation, DurationMilliseconds, LogLength, Application, Location, Request, RequestIdentifier FROM ApexLog WHERE StartTime < 2000-01-01T00:00:00+0900 ORDER BY StartTime DESC
        ```
    :::

3. 「Copy (CSV)」ボタンをクリック

4. 画面右端の出っ張りをクリックして Inspector の画面を開き、「Data Import」をクリック
    
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950738/f70b32d1-cde4-4616-9840-8bfb00aede2d.png)
    
5. 「Configure Import」欄に以下の内容を入力
    
    | 項目 | 値 |
    | - | - |
    | API Type | Tooling |
    | Action | Delete |
    | Object | ApexLog |
    | Format | CSV |
    | Data | 先ほどコピーしたCSVを貼り付け |

6. 「Skip all unknown fields」ボタンをクリックして Id 項目のみマッピングし、「Run Delete」ボタンをクリック→確認画面が表示されるので「Delete」をクリック

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950738/82f16a1f-fb74-4fd2-bbfd-4a4a980b2a44.png)

7. 全て「Succeeded」になれば削除完了
OSI参照モデルの7階層とその役割

　OSI参照モデルは、通信を行うための機能を7つの階層に分け、それぞれの役割を定めている（表）。
　送信元からデータを送る際には、上の層（レイヤ7）から順番に各階層で、通信に必要な情報が付加される。

 表
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/b85203c4-6f0d-4650-88d4-75418e05e5d4.png)

　各階層はレイヤと呼ばれ、上から順番にレイヤ7、レイヤ6となり、一番下の物理層がレイヤ1となる。省略すると、レイヤはL7やL6といった表記となる。
　それぞれの層の役割を見ていく。

## アプリケーション層
　ユーザが利用するアプリケーション間での通信に関して規定している。
　WebブラウザであればWeb用のプロトコル、メーラーであればメール用のプロトコルといった、ユーザが利用するアプリケーションで使用するプロトコルが規定されている。

## プレゼンテーション層
　通信する際の文字コードなどといった、データの表現方式に関して規定している。
　データを送信する際に、プレゼンテーション層で送信側アプリケーションが使用している独自の表現方式から、共通の方式に変換する。そして受信側では、受け取ったデータを受信側アプリケーションで使用する表現形式に復元することで、送信元と宛先の機器で使用するアプリケーションが異なった表現方式を使用していても通信できるようになる。

## セッション層
　通信が開始してから終了するまでを管理するひとかたまりを**セッション**といい、そのセッションの確立や終了に関して規定している。セッションが確立することでアプリケーション間での通信が可能となる。
　機器では複数のアプリケーションを利用して通信を行っていることがある。その際に、あるアプリケーションでやり取りしているデータが別のアプリケーションに届かないように制御している。

## トランスポート層
　ノード間の通信の制御に関して規定している。
　送信元から送られたデータは、途中で様々な機器を経由して宛先まで運ばれていく。経由していく中でデータが欠けてしまうと、宛先は正しくデータを処理できない。そうならないように、送信元から送信されたデータを欠けることなく宛先に届けるといった**通信の信頼性**に関する機能が提供されている。

## ネットワーク層
　複数のネットワークをまたがった**エンドツーエンド**（通信を開始する送信元から最終的な宛先までの端末間）の通信に関して規定している。データを送信する際には、そのデータの届け先を指定する必要がある。そうした宛先を識別するために必要となる**IPアドレス**などに関するプロトコルが規定されている。
　また、宛先に向かうためにはいくつかの機器を経由していく場合がある。その際、どういった経路を通ればよいのかを決定する機能が提供されている。こうしたネットワーク層の機能により、エンドツーエンドでの通信ができるようになる。

## データリンク層
　直接接続されたノード間の通信に関して規定している。
　通信の最終的な宛先は、ネットワーク層で規定されたアドレスにより指定できる。ただそこに向かうためには、直接接続している機器間でデータを転送していく必要がある。そうした直接接続されている機器間で、相手を識別するためのアドレスに関する規定やエラーの検出といった機能が提供されている。

## 物理層
　データを電気信号に変換するといったことや、物理的な接続に関して規定している。物理層でノード間を接続するケーブルやその接続口の規格などを規定することで、機器間を物理的に接続することを可能にする。

　このように、機能ごとに階層を分けることで、どこかの層で仕様の変更などがあっても、その層の機能を満たしていれば、他の層に影響を与えることがない。

## OSI参照モデルのメリット
・各階層に機能を分けることにより、ネットワーク設計者やアプリケーション開発者が各階層の役割を理解しやすい
・標準化されているため、各ベンダーの製品やプロトコルを組み合わせて設計や構築が可能
・プログラムの開発や改修が容易
・階層が分かれているため、ネットワーク障害などの問題の早期切り分けや解決が可能

## 参考文献
シスコ技術者認定教科書 CCNA 完全合格テキスト&問題集[対応試験]200-301 単行本（ソフトカバー） – 2020/6/24
林口 裕志 (著), 浦川 晃 (著), 中道 賢 (監修)
p.9-11
毎日の清掃管理をAppSheetでチェックリスト化してみた！

みなさまこんにちはしらせです。3回目の投稿になります。
今回はタイトルにもあるように毎日夜の方が清掃している個所のチェックリストAppSheetを作成しました！

# 目次
- [完成品](#完成品)
- [使用アプリ一覧](#使用アプリ一覧)
- [このアプリを作成しようとした背景](#このアプリを作成しようとした背景)
- [作成手順](#作成手順)
- [実際に使用してもらいました](#実際に使用してもらいました)
- [しらせの感想](#しらせの感想)



 



## 完成品

https://x.com/Ic8ICt6crO343/status/1924440369879765469

<h2 id="feature">使用アプリ一覧</h2>

Googleスプレッドシート
AppSheet

## このアプリを作成しようとした背景

紙媒体の管理表があるので、**アナログ脱却したい**と思ったからです。
この仕事は毎日やる事なので紙に記入するよりスマホで手軽にできたらいいなと思ったからです。また、自部門は最近学生アルバイトがこの数か月で増え、ベテランさんの指導係から**毎回教えるのに時間がかかる**という意見をもらいました。そこで、目視でわかるチェックリストがあればいいなと思い、作成に臨みました。また、この清掃個所は夜の方が実施しますが、私自身は仕事内容を把握していないため、今回この**AppSheetを通して仕事内容を知りたい**、夜の担当の方と仲良くなりたいとおもい作成しました。具体的には私が退勤するころに出勤するので、必ずあいさつしに行くことや、最近の進捗、困りごとを聞きたいと思っています！

<h2 id="feature">作成手順</h2>

## ①Googleスプレッドシートを作成する

![スクリーンショット (37).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4051643/341deed8-5dcb-45ad-90a8-280328e2d4a1.png)

私は項目を日付、担当者、清掃個所、状態、写真、コメントの項目を追加しました
拡張機能→アプリ作成をクリックする

![スクリーンショット (38).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4051643/f3790440-c299-47f9-8ab6-eb0d7c6869a9.png)

## ②項目を変更
①日付のTYPEをDateに変更する
②担当者をEnumに変更　左側のペンマークをクリックする
Type Dtails→ValuesでAddクリックする→名前を記入→Dropdown→右上のDoneをクリックする
③清掃個所も②と同じように記入
③状態はEnumにし、完了、未完了と記入。Buttonsに選択したほうが良い
④写真はimageに変更


![スクリーンショット (39).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4051643/35aaf282-5215-4b04-9895-375cbb090f89.png)

## ③青のチェックボックスを下記のように設定する
![スクリーンショット (40).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4051643/95bdc602-1b9b-4b3a-9ad4-a28fbd14da2b.png)

## ④右側のプレビューで確認する
青い＋ボタンをクリックして新しく追加してみましょう

![スクリーンショット (41).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4051643/227c7ba4-98e8-484c-b089-90222f76a680.png)
スプレッドシートに移動し、新しく記入されていれば成功です。

<h2 id="feature">実際に使用してもらいました</h2>
使用してくれたTさんについて

夜の仕事（清掃、値引き）をしていて、現指導係
**プログラミングの勉強をしていたのでシフトや製造計画のフォーマットを作成してもらっていて、非常にデジタルに長けている**男性

このプロトタイプを使用してみて、いいと思ったところ、改善したほうがいいところを教えてくださいと聞きました。

**フィードバック**
①現状は清掃個所１つにつき、タブが1つなので、毎回１回ずつだとデータが膨大になるので（今回の例だと清掃個所が８か所あるので８個のタブができる）１個のタブの中に**８個まとめて入力できる**のがいい

②日付がバラバラなので整列してほしい

③その日のシフトの担当者を組み込んだほうがいい（この記事では毎回選択）

④日付選択する（例2025/06で検索してその月だけが出るようにする）

良いところは未経験で作るの凄いといわれました（まだまだですね、、、）
<h2 id="feature">修正してみました</h2>

https://x.com/Ic8ICt6crO343/status/1925536563116875790

私ができる限りの範囲で①と②を解決しました！
清掃個所がひとつにまとまったので見やすくなりました
残り2つは時間が許せば頑張ります！

<h2 id="feature">しらせの感想</h2>
今までの記事は誰かに使用してもらうということをしてこなかったので、第3者からの意見は非常に勉強になりました。（Tさんは特に経験者のため）実際に作成しているものは他人に使用してもらって、初めて機能するので

これからプロトタイプを作るときは周りに協力を仰ぎたいです。
また、意見をもらって改善しようとする場合
**このアプリでは実現可能なのか**など、使用するアプリの特性も勉強しておかなければならないと同時に感じました。なるべき期待に応えたいので！

本日はここまでです読んで下さりありがとうございました！
BioNavi のインストール方法「生合成の逆合成解析ツール 」

# 概要
Ruibo Wu が報告した天然物の生合成の"逆合成解析"ツール BioNavi のインストールログ。

BioNavi は、天然物の生合成経路を予測するための深層学習に基づく新しいツール。Transformer ニューラルネットワークと AND-OR 木に基づいた計画アルゴリズムを組み合わせている。これにより、既知の生合成反応と有機化学反応のデータを活用して、天然物から単純な出発原料への複数の経路を効率的に検索することができる。このツールは、テストセットにおいて既存の手法よりも高い精度と効率を示し、新しい経路の発見や既知の経路の再構築に役立つことが示されている。

BioNavi の元論文は以下。
<a href="https://www.nature.com/articles/s41467-022-30970-9">2022 年 Nature Communication</a>
<a href="https://pubs.acs.org/doi/10.1021/jacsau.4c00228">2024 年 JACS Au</a>

# 検証環境
CPU: Ryzen 9 7950x
GPU: Nvidia A6000 (vRAM:48GB)
RAM: 96 GB
Fedora40

# インストール手順
```shell
# BioNavi のダウンロード
sudo git clone https://github.com/zengtsysu/BioNavi
# miniconda の設定
sudo wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh
bash miniconda.sh
source ~/miniconda3/etc/profile.d/conda.sh
conda init bash
conda create -n bionavi python==3.7
conda activate bionavi

# BioNavi のインストール
cd BioNavi
sh install.sh # /opt で実行すると権限エラーで止まる。

# 学習済みモデルの配置
cd transformer/checkpoints
wget https://figshare.com/ndownloader/files/44330843
unzip 44330843
```

# 実行
`BioNavi/config/bionavi_conf.yaml` を編集する。
1 行目の target_mol の部分に探索対象の化合物の smiles を記入する。
buliding_block_path のデータセットの csv ファイルを切り替える。
生合成の逆合成解析の場合は、bio_building_block.csv を使用する。
結果を保存するために、viz: Fales を viz: True に変更する。

```shell
# 以下のコマンドで計算を実行する
cd BioNavi
# export PYTHONPATH=$PYTHONPATH:$(pwd)/onmt
python run_bionavi.py
```

5 - 10 分ほどで計算は完了する。
探索結果は、BioNavi/viz に保存される。
search_tree  は terminal、svg ファイルは web ブラウザで開く。

以下のように search_tree というファイルに smiles の一覧が書かれている。

```shell
digraph G {
	rankdir=LR
	node [shape=box]
	"1 | C=C1C(=O)C(OC(=O)c2c(C)cc(O)c(CC=C(C)C)c2O)=C2CC3CC(C)(C(=O)O)CC3C12C" [color=aquamarine shape=box style=filled]
	1 [color=aquamarine shape=rarrow style=filled]
	"1 | C=C1C(=O)C(OC(=O)c2c(C)cc(O)c(CC=C(C)C)c2O)=C2CC3CC(C)(C(=O)O)CC3C12C" -> 1 [label="0.45B/C"]
	2 [color=aquamarine shape=rarrow style=filled]
	"1 | C=C1C(=O)C(OC(=O)c2c(C)cc(O)c(CC=C(C)C)c2O)=C2CC3CC(C)(C(=O)O)CC3C12C" -> 2 [label="0.40B/C"]
	3 [color=aquamarine shape=rarrow style=filled]
	"1 | C=C1C(=O)C(OC(=O)c2c(C)cc(O)c(CC=C(C)C)c2O)=C2CC3CC(C)(C(=O)O)CC3C12C" -> 3 [label="0.07bio"]
	4 [color=aquamarine shape=rarrow style=filled]
	"1 | C=C1C(=O)C(OC(=O)c2c(C)cc(O)c(CC=C(C)C)c2O)=C2CC3CC(C)(C(=O)O)CC3C12C" -> 4 [label="0.04bio"]
	5 [color=aquamarine shape=rarrow style=filled]
	"1 | C=C1C(=O)C(OC(=O)c2c(C)cc(O)c(CC=C(C)C)c2O)=C2CC3CC(C)(C(=O)O)CC3C12C" -> 5 [label="0.02B/C"]
...    
```

search_tree.svg に下図のように代謝経路が示される。

![search_tree.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4035613/8b03d408-b970-4cc6-9ae2-f0c6c4d5fc52.png)


smiles 表記は、以下のサイトを利用すると簡単に構造式に変換できる。
https://www.hpc.co.jp/tools/index_smi_to_2d.html
[Java]mapのキーの値をストリーム（anyMatch）でチェックして値が空なら例外スロー

キーの値に空文字があれば、例外スロー

```java
Map<String, String> map = Map.of(
	    "username", "admin",
	    "password", "",   // 空
	    "role", "editor"
	);

map.entrySet().stream()
    .filter(entry -> entry.getValue().isEmpty())
    .findFirst()
    .ifPresent(entry -> {
        throw new IllegalArgumentException("Empty value found for key: " + entry.getKey());
    });
```

キーの値にnull、または、空文字があれば、例外スロー

```java
Map<String, String> map = Map.of(
	    "username", "admin",
	    "password", "",   // 空
	    "role", "editor"
	);

map.entrySet().stream()
    .filter(entry -> entry.getValue() == null || entry.getValue().isEmpty())
    .findFirst()
    .ifPresent(entry -> {
        throw new IllegalArgumentException("Empty value found for key: " + entry.getKey());
    });
```

補足：複数のキーを収集したい場合

```java
Map<String, String> map = Map.of(
	    "username", "",  // 空
	    "password", "",   // 空
	    "role", "editor"
	);
    
List<String> invalidKeys = map.entrySet().stream()
    .filter(entry -> entry.getValue() == null || entry.getValue().isEmpty())
    .map(Map.Entry::getKey)
    .collect(Collectors.toList());

if (!invalidKeys.isEmpty()) {
    throw new IllegalArgumentException("Empty or null values found for keys: " + invalidKeys);
}
```

出力の一部

```sh
Caused by: java.lang.IllegalArgumentException: Empty or null values found for keys: [password, username]
```
【読書感想】AI分析でわかったトップ5%社員の読書術

ランニングしながらAudibleで聴いた本の感想です。
本のまとめというより、自分が心に残ったことを3つだけ書いてます。
とりあえず思ったことをメモするのが大切と思い、なるべく30分以内で書き上げています。

# 聴いた本

AI分析でわかったトップ5%社員の読書術
越川慎司 (著)

読書・Audibleの有用性と、そのコツを説いている本です。
個人的には、ランニングしながらAudibleをもう聴いているような人は対象外の本・・・といった感覚がしました。あと、「AI分析」の要素があまり分かりませんでした・・・
これから読書をしてみよう、という方にはオススメかなと思います。
（個人的満足度１．５／３、一般的なおすすめ度１．５／３）

# 心に残ったこと

## セレンディピティ5:2の法則

セレンディピティ（偶然の幸運）という言葉があります。自分の好奇心・行動と、受け入れ・柔軟性について、5:2の割合を一つの目安として意識していくと良いそうです。

本書では、読書において、**自分に関係がある・勉強になる本を5、関係はないけど面白そうな本を2の割合**で読んでいくと良い、とのことでした。
もちろん、「仕事論の名著」などのほうが、読んで結果が出やすいとは思います。ただ、私も「偶然の出会い」で良い本に当たることはあると思っており、
引き続き、「**勉強になるか分からないけど面白そう**」という本を読んでいこうかなと思いました。

また、「マルチリーディング」で複数の分野の本を同時並行で読むことで、異なる知識を結びつけ、イノベーションなどが生まれやすいそうです。
その点でも、色々な分野の本に手を出すのは重要かなと感じました。

## 瞬読

読書に慣れた人だと、**1ページ見開きをパッと見ただけで大体の内容が入ってくること**があり、これを速読のように「瞬読」と言うそうです。

私は初めて聞いた言葉でしたが、確かに、「新聞をパッと見で大体分かる」「資料をひと目見ただけで大体分かる」ということがあり、これが「瞬読」なのかなと思いました。
逆に「瞬読できる文章」を意識して書いていくことが、仕事などでは重要なのかなと感じました。

## 一次情報化、10分以内にアウトプット

本を読むという行為自体はインプットで、「体験した人から聞いた」という点では「二次情報」と言えます。
何かを学習した後に重要なのは、**学習した内容を自分で体験して、一次情報にすること**である。つまり、「一次情報化」が必要とのことでした。
その一次情報化として、内容を読み返してまとめたり、読書感想としてアウトプットしたりすることが有益、とのことでした。
勉強などでも、教科書を読んだだけでは二次情報のままで忘れやすく、例題を解いたり実際の社会に応用してはじめて身に付くところがあり、一次情報化が重要だと感じました。

また、「なるべく早く、**10分以内にアウトプットすること**も重要」とのことでした。
私も、聞いてから30分後などにメモを取ると内容を半分くらいしか覚えておらす、読んだらすぐ自分用メモを取ることが重要だと感じており、この点は共感しました。
MBOX ファイルを Gmail アカウントに簡単に移行/インポートする方法は?

<p>現代のデジタル時代において、多くのユーザーがMBOXファイルをGmailに無料で簡単に転送する方法を探しています。これはMBOXを使用するすべての人にとって重要な問題です。様々なAIプラットフォームを駆使することで、お客様の問題に対する解決策を見つけました。無料版ではMBOXからGmailへの直接転送を提供することで、お客様のお役に立ちます。Gmailは最も人気のあるオンラインメールサービスであることは広く認められています。連絡先、カレンダー、メモなどの機能を備えており、メールの添付ファイルの管理にも役立ちます。そのメリットから、普段使っているメールクライアントからGmailへの乗り換えを検討している人が増えています。</p>
<h2>優れたアドバイス：BLR MBOXコンバーターソフトウェアを使用してMBOXファイルをGmailに追加します</h2>
<p>互換性のあるメールプログラムであれば、MBOXファイルをGmailにエクスポートする最適な方法をご利用いただけます。MBOXファイルを広く普及しているウェブメールに変換できます。Apple Mail、Mozilla Thunderbird、Opera Mail、Eudora、Entourage、SeaMonkeyのMBOXメールは、自動的にGmailアカウントに変換されます。</p>
<ul>
<li><strong>シンプルなグラフィカルユーザーインターフェース：</strong>この高度なアプリケーションは、技術者でも非技術者でもMBOXファイルをGmailアカウントに変換できる、シンプルで使いやすいインターフェースも提供しています。BLR MBOXファイル変換ツールは、初心者でも簡単に変換できる基本的なユーザーインターフェースを提供します。MBOXファイルをG Suiteに一括エクスポートする場合、このツールの機能は、初心者でも理解できる迅速で簡単な機能も提供します。</li>
<li><strong>数回クリックするだけでMBOXファイルを一括転送</strong>：BLR変換ツー を使用すると、MBOXメールをGmailアカウントに一括インポートできます。MBOXファイルをGmailまたはG Suiteアカウントにエクスポートするこのプログラムは、データを消去することなく、必要なMBOXコンポーネントを転送できます。MBOXをGmailにダウンロードするのは無料で、エラーはありません。</li>
<li><strong>MBOXファイルまたはフォルダを効果的にアップロード</strong>：MBOXからGmailへのアプリケーションでは、「ファイルの追加」と「フォルダの追加のオプション」の2つの方法でMBOXファイルを読み込むことができます。これらのオプションのいずれかを使用して、ファイルやフォルダを好きな方法でアップロードできます。</li>
<li><strong>MBOXメールファイルの階層構造を維持</strong>：MBOXファイルをGmailに変換する際、そのファイルのすべての特性が維持されます。変換プロセス後、ユーザーは正確な結果を受け取ることができます。そのため、このMBOXからGmail/G Suiteアカウントへの変換では、メッセージヘッダー、件名、日時、コピー、BCC、宛先など、データの整合性に関するすべての情報が保持されます。</li>
</ul>
<h3>MBOXデータをGmailにエクスポートする方法</h3>
<p>このプログラムを使用するには、まずコンピューターにダウンロードまたはインストールする必要があります。その後、以下の手順に従ってください。</p>
<ul>
<li><strong>BLR Tools <a href="https://www.blrtools.com/mbox-exporter-tool.html" target="_blank">MBOXファイル変換ツー</a></strong>ルをインストールします。</li>
<li>「ファイルの追加」または「フォルダの追加」を使用して、Gmailアカウントに転送するMBOXファイルを読み込みます。</li>
<li>MBOXメールファイルが読み込まれたら、「次へ」をクリックします。</li>
<li>次のいずれかのオプションを選択します。1. すべてのMBOXファイルを1つのGmailアカウントに変換する、または2.</li>
<li>&bull; 各MBOXファイルを別のGmailまたはG Suiteアカウントに保存する。</li>
<li>もう一度「次へ」ボタンを押して続行します。</li>
<li>MBOXメールを変換するには、Gmailのログイン認証情報を入力し「エクスポート」オプションをクリックします。</li>
<li>緑色のステータスバーで、MBOXからGmailへの変換プロセスを確 できます。</li>
<li>操作を完了するには、移行が完了したら「OK」ボタンをクリックします。</li>
</ul>
<h3><strong>結論</strong></h3>
<p>MBOXメールをGmailアカウントにエクスポートする理由と要件はすべて、この記事で網羅されています。このMBOXコンバータープログラムは無料で、MBOXファイルを正確かつ安全にGmailに変換します。さらに、このツールはWindows 11、10、8.1、8、7、XP、Vistaなど、複数のバージョンのWindows OSをサポートしています。また、プログラムの無料試用版もご用意していますので、ぜひお試しください。この試用版では、完全に無料で提供されるこの製品の機能と全体的な操作方法を習得できます。</p>
情報セキュリティの概念と特性

## 情報セキュリティの概念
### セキュリティとは
「*守らなければならない大切なものが、危害や損傷を受けない正常な状態*」
### 情報セキュリティとは
「**情報の機密性、完全性及び可用性を維持すること。さらに、真正性、責任追跡性、否認防止性、信頼性などの特性を維持することを含めることもある**」(JIS Q 27000 ファミリー)

企業や組織の重要な財産である情報は、顧客情報、社員情報、商品情報などがある

情報セキュリティは「**物理的セキュリティ**」と「**論理的セキュリティ**」に分類される
* **物理的セキュリティ**
  * 建物や設備など、物理的なセキュリティ
  * 具体例
    * 耐震設備・防火設備
    * 電源・回線ケーブルの保護
    * 入退室管理設備
    * **バックアップセンターの設備**
    * **停電・瞬電に備えた[UPS](https://www.ntt-f.co.jp/service/ups/about/)**

* **論理的セキュリティ**
  * 物理的セキュリティ以外。以下に分類できる
  * **システム的セキュリティ**
    * 情報システムやネットワークにおける技術的なセキュリティ対策
    * 例:アクセス制御、認証、暗号化、マルウェア対策...etc
  * **管理的セキュリティ**
    * 組織や情報システムの運用管理面におけるセキュリティ対策
    * 例:情報セキュリティポリシの作成・運用・監視・見直し、ソフトウェアのライセンス管理...etc
  * **人的セキュリティ**
    * 管理的セキュリティに含められることもある
    * 例:雇用契約/委託契約におけるセキュリティ対策、教育、訓練、セキュリティ事件・事故及び誤動作への対処、ホリシ違反の懲戒手続き...etc

## 情報セキュリティの特性
### ３つの特性
* 機密性
  * アクセスを許可されたもの(権限者)だけが許可された範囲内で活動できるようにすること
    * アクセス制御、認証、暗号化 など
* 完全性
  * データの正当性、正確性、網羅性、一貫性を維持すること
    * ハッシュ関数、デジタル署名 など
* 可用性
  * 情報システムをいつでも正常なサービスを提供できる状態を維持する
    * システム・ネットワークの二重化、システムリソース(メモリなど)の十分な確保、データバックアップ など
### 付加的な特性
* 真正性
  * 利用者、プロセス、システム、情報などが主張通りであることを確実にする特性
    * 複数の要素を用いて対象を識別する(パスワードと生体情報による認証など)
* 責任追跡性
  * 利用者、プロセス、システムなどの動作について、その主体と動作内容を一意に追跡できることを確実にする
    * 情報資産の取扱い状況に関する記録、物理区画への入退室記録、システムのログの取得 など
* 否認防止性
  * 起こった事象を後から否認されないように証明できること
    * 真正性・責任追跡性を確保する、デジタル署名、タイムスタンプなど
* 信頼性
  * 実行した操作や処理の結果に矛盾がなく、期待される結果と整合が取れていること
    * 信頼性の高い機器や部品を用いたシステムの構築、保守点検、ソフトウェアのバグ・脆弱性の発見と迅速な対処 など
平均以上の数を列挙　reduce()とfilter()



Paizaの「平均以上の値を出力する問題」に挑戦したら、配列メソッドの使い分けがめっちゃ学びになったので、まとめる！
<br>

## 📝 問題内容

1行目に整数 `N`
2行目に `N` 個の整数が与えられる。

この `N` 個の整数のうち、平均以上の値をすべて出力するという問題
<br>

入力例：

    5
    1 2 3 4 5

出力例る：

    3
    4
    5
<br>

https://paiza.jp/works/mondai/array_primer/array_primer__array_ave_step3

<br><br>

## ✅ 解法その1：forEachで1つずつチェック
```js
const rl = require('readline').createInterface({ input: process.stdin });
const lines = [];

rl.on('line', (input) => {
    lines.push(input);
});


rl.on('close', () => {
    const N = Number(lines[0]);
    const nums = lines[1].split(' ').map(Number);

    let total = 0;
    nums.forEach(num => total += num);

    const average = total / N;

    nums.forEach(num => {
        if (num >= average) {
            console.log(num);
        }
    });

});
```
解説：

- `forEach()` で2回ループを回している
    - 1回目で合計を出し、
    - 2回目で平均以上の値をチェックして出力。
     
- 直感的にわかりやすくて、初心者にもおすすめの書き方！

## <br>✅ 解法その2：filter()＋forEach()でスリムに
```js
const rl = require('readline').createInterface({ input: process.stdin });
const lines = [];

rl.on('line', (input) => {
    lines.push(input);
});


rl.on('close', () => {
    const nums = lines[1].split(' ').map(Number);
    const average = nums.reduce((sum, num) => sum + num, 0) / nums.length;

    nums
        .filter(num => num >= average)
        .forEach(num => console.log(num));

});
```
解説：

- `reduce()` で一発で合計を出して平均を計算。
- `filter()` で平均以上の要素だけを抽出。
- そのまま `forEach()` で順番通りに出力。

<Br><br>

## 🎓 新しく学んだことまとめ

### reduce()：
- 配列の要素を累積的に処理して、1つの値にまとめる。
- 合計や積など、累積系処理に大活躍！

書き方↓
```js
array.reduce((acc, cur) => acc + cur, 初期値);
```


### filter()：
- 条件に合う要素だけを残して、新しい配列を作る。



<br><br><br>[僕の失敗談(´;ω;｀)と解決法🐈](https://paizabeginner.wordpress.com/2025/05/22/paiza%e3%81%a7%e5%9f%ba%e6%9c%ac%e3%83%9e%e3%82%b9%e3%82%bf%e3%83%bc%ef%bc%9a%e5%b9%b3%e5%9d%87%e4%bb%a5%e4%b8%8a%e3%81%ae%e6%95%b0%e3%82%92%e5%88%97%e6%8c%99%e3%80%80reduce%e3%81%a8filter/)
新しく環境構築&githubを使用する際の手順まとめ（pyenvも使用）

環境構築する機会は度々あるのですが、いつも忘れた頃にやってくるので、個人用メモを含めて手順を記載します。
この記事の前提条件としては
- AWSでの環境構築
- pythonがすでにインストールされているが、別のバージョンのpythonを使いたい（=pyenvを使う）
- bashにあまり詳しくないので、簡単めなことも書いています
です。


# pyenv
- pyenvのインストール
```terminal: 
curl https://pyenv.run | bash
```

- .bashrcに追記（.bashrcファイルの末尾に書き加えられる）
1行ずつ実行してもまとめてでもOK
これをしないとpyenvが認識されない
```terminal:
echo '' >> ~/.bashrc
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init --path)"' >> ~/.bashrc
source ~/.bashrc
```

- pythonのインストール
例）pyenv install 3.10.12
```terminal
pyenv install <pythonバージョン>
```

- 仮想環境の作成
例）pyenv install 3.10.12 myenv
```terminal
pyenv virtualenv <pythonバージョン> <仮想環境名>
```
    
- アクティベイト
```terminal
pyenv activate <仮想環境名>
```
- pythonライブラリのインストール
```
pip install <ライブラリ>
```

（参考）
- https://zenn.dev/hr0t15/articles/8ae3564bde2cce
- https://qiita.com/teri_man95/items/b15fd8f1964612331be2

# github
- public keyとprivate keyを.sshフォルダに作成

＜もしssh keyを作成、githubに登録していない場合は実行↓＞
適宜.sshがあるフォルダに移動します
```terminal
cd ~/.ssh
```
↓
public/private keyを作成
```terminal
ssh-keygen
```
※こちらのサイトなどを参考に確認してください！
https://qiita.com/soma_sekimoto/items/35845495bc565c38ae9d
↓
githubにkeyを登録

- gitへ接続
`git clone...`

- コミット
`git add ファイル名`, `git commit`

## エラー①
私の場合`git clone`しようとしたところなぜか`ssh: connect to host github.com port 22: Operation timed out`エラーになってしまいました。色々調べたら、port:443を使うことで改善する可能性がある、とのことだったので、configファイルを作成しました。

- ~/.ssh/configファイルの作成
```
Host github.com
    Hostname ssh.github.com
    Port 443
    User git
    IdentityFile <private keyのパス>
```
そうすると以下のような警告が表示されます
```
# The authenticity of host '[ssh.github.com]:443 ([140.82.112.36]:443)' can't be established.
# ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU.
# This host key is known by the following other names/addresses:
#     ~/.ssh/known_hosts:32: github.com
# Are you sure you want to continue connecting (yes/no/[fingerprint])?
```
githubの公式も安全と言っているのでyesと実行し先に進みましょう。
（参考）
https://docs.github.com/ja/authentication/troubleshooting-ssh/using-ssh-over-the-https-port

## エラー②
鍵の設定の仕方が悪かったのか、私はさらに`Permissions 0644 for {鍵の名前} are too open.`というエラーになってしまいました。
なので以下のようにファイルの設定を変更します。
```terminal
chmod 600 <private keyのパス>
```

（参考）
https://stackoverflow.com/questions/9270734/ssh-permissions-are-too-openzqz

そうしたらやっと接続することができました。

## エラー③
`git add ファイル名`, `git commit`で進もうとしたところ、以下のエラーが返ってくることがある。
```
*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"
to set your account's default identity.
```
これはgit config にユーザー情報が未登録な場合に出るため、アドレスとユーザー名を自分のものに置き換えてターミナルで実行する。
```
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
```

その後再度`git commit`するとpushできるようになる。

（参考）
https://qiita.com/C_HERO/items/c35e679f0b03a5f06469（--globalや--localの違いについて）
【学生限定】Google AI Proが15ヶ月無料！賢く使って大学生活をアップデート！【申し込み期限 2025 年 6 月 30 日】

# はじめに

AIが学習や日常を大きく変えようとしている今、大学生の皆さんにビッグニュースです！

Googleの最先端AIサービス「Google AI Pro」（Google One AIプレミアムプランの一部、中核技術「Gemini」）が、なんと学生向けに15ヶ月間も無料で使えるキャンペーンを開始しました。

通常なら月額2,900円、総額43,500円相当のサービスが無料になるこのチャンス、見逃せません！！


## キャンペーンのポイント

- 無料期間： 最長15ヶ月（2026年6月30日まで）
- 登録締切： 2025年6月30日 
- 対象者： 日本など5カ国在住の18歳以上の学生（要学生認証）
- 通常料金： 無料期間終了後は月額2,900円（解約可）

## Google AI Proで何ができる？学生生活がこう変わる！

この無料特典で、学生生活が劇的に便利になる Google の AI 機能が利用できます！

- 最先端AI「Gemini 2.5 Pro」： レポート作成、複雑な問題解決、プログラミング学習などを強力にサポート 。長文読解や要約も得意です。

- 2TBの大容量ストレージ： 課題や研究データ、写真もたっぷり保存可能。

- Google Workspace連携： Gmailやドキュメント、スライド内でGeminiのAI機能を直接利用。メール作成や資料作成が格段に効率化します。

- NotebookLM： アップロードした資料（授業ノート、論文PDFなど）をAIが理解し、学習ガイド作成や要約をサポート。授業内容のメモ＆まとめに最適。

- 画像・動画生成（Whisk & Veo 2）： テキストからオリジナルの画像や動画を簡単に作成。プレゼン資料やSNS投稿に活用できます。

- Deep Research： AIが詳細なリサーチを行い、レポートを自動生成。論文調査や複雑なトピックの理解に役立ちます。

- Gemini Live & 音声概要： AIとの音声会話や、資料内容のポッドキャスト化で「ながら学習」も可能に。

# 簡単登録！無料トライアル申し込み手順
以下のステップで簡単に登録できます。

1. キャンペーンページへアクセス： 

https://gemini.google/students/


2. 「特典を入手」をクリック。

- 学生認証： 学校発行のメールアドレス（例：xxx@yyy.ac.jp）で認証します。

- Google One登録と支払い情報入力： 無料期間終了後のための情報登録です。無料期間中に解約すれば料金はかかりません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/2d9b8e3e-c4ba-4c9e-9015-5635fa56e37c.png)

## 【超重要】 無料期間終了後の自動課金と解約忘れ対策
無料期間終了後は、解約しない限り自動で月額2,900円の有料プランに移行します。

継続利用しない場合は、必ず無料期間中にGoogle Oneの設定から解約手続きを行いましょう。カレンダーにリマインダーを設定するなど、解約忘れ対策をお忘れなく！

# さいごに

この記事は [Google Gemini](https://gemini.google.com/app?hl=ja) に書いてもらいました。
LLMと生成AIの理論と実践



---

###  第1部：基礎理論と土台となる技術

> **目的：** LLMと生成AIを理解するための自然言語処理・トランスフォーマーの基本を習得

| 単元  | 内容                                              |
| --- | ----------------------------------------------- |
| 1.1 | 自然言語処理の基礎：トークン化、形態素解析、文脈依存の意味理解                 |
| 1.2 | 分散表現：Word2Vec, GloVe, FastText、意味空間における語の埋め込み   |
| 1.3 | トランスフォーマーの基本構造：Self-Attention、残差接続、LayerNormの役割 |
| 1.4 | LLMの全体像：BERT（双方向）・GPT（自己回帰）・T5（統一モデル）の構造と用途比較   |
| 1.5 | 言語モデルの評価指標：パープレキシティ、BLEU、ROUGE、ログ尤度とその解釈        |

---

###  第2部：生成AIと大規模モデルの設計

> **目的：** LLMの学習構造と最先端の多モーダル・多言語生成技術を理解

| 単元  | 内容                                             |
| --- | ---------------------------------------------- |
| 2.1 | 自己回帰言語モデル：GPT系列におけるDecoder-Only構造の意義           |
| 2.2 | 事前学習とファインチューニング：マスク付き（BERT）と因果言語モデリング（GPT）     |
| 2.3 | インストラクション・チューニングとRLHF：ChatGPTに代表される人間中心学習の仕組み  |
| 2.4 | 多言語・多モーダルモデル：LLAVA, Flamingo, Geminiなどの設計と応用分野 |
| 2.5 | モデルスケーリング法則：パラメータ数・データ量・計算量の関係と性能予測            |

---

###  第3部：LLMの実装と応用演習

> **目的：** 実践的にLLMを扱い、独自アプリケーションやプロトタイプを作成

| 単元  | 内容                                                             |
| --- | -------------------------------------------------------------- |
| 3.1 | Hugging Face Transformersでのモデルロードと推論（GPT-2, BERT, T5など）        |
| 3.2 | トークナイザの理解と独自コーパスへの適用（Tokenizer Training）                       |
| 3.3 | 軽量ファインチューニング技術：LoRA、PEFT、Adapterなどの活用                          |
| 3.4 | RAG（Retrieval Augmented Generation）：外部知識を利用した生成モデル構築           |
| 3.5 | LLMのAPI活用とUI統合：OpenAI、Claude、Cohere＋GradioやStreamlitでのUI開発     |
| 3.6 | **プロンプトエンジニアリング**：Few-shot, Zero-shot, Chain-of-Thought等の設計と評価 |

---
scikit-rfを使ってS21のグラフをいい感じに表示させる

# 概要

scikit-rfという高周波回路の測定データをグラフ化できるライブラリで、Jupyter Notebook使っていい感じにS21を表示してpngファイルに保存するコードを生成AIの力を借りつつ書いたけど意外と手間だったので、忘れないようにメモ。

# 環境

Windows 11 Pro
scikit-rf                 1.7.0
matplotlib                3.10.3

# インストールとJupyter Notebook起動

容量が大きいのでvenvで仮想環境作ってインストールするのが良いかも

```python
> python -m venv myenv
> .\myenv\Scripts\activate
> pip install scikit-rf
> pip install matplotlib
> jupyter notebook
```

# フォルダツリー

```
root
├─dat（データ保存場所）
│      aaa.s2p
│      bbb.s2p
│      ccc.s2p
│          
├─plots（グラフ保存場所）
│          
└─myenv (仮想環境）
```

# コード

```pythonimport skrf as rf
import numpy as np
import os
from matplotlib import pyplot as plt
from matplotlib import style

# S2P ファイルの読み込み
aaa = rf.Network('../dat/aaa.s2p',f_unit='ghz')
bbb = rf.Network('../dat/bbb.s2p',f_unit='ghz')
ccc = rf.Network('../dat/ccc.s2p',f_unit='ghz')

# スタイル設定
mpl_style = "seaborn-ticks"
mpl_style = mpl_style if mpl_style in style.available else "seaborn-v0_8-ticks"

# 保存先フォルダ
output_dir = '../plots'
os.makedirs(output_dir, exist_ok=True)

# グラフタイトル
title_str = "ATT 5dB measurements by sweep points"

# 0除算のwarningを回避する
np.seterr(divide = 'ignore') 

# グラフ表示
with style.context(mpl_style):

    # aaa の S21 プロット、破線表示
    aaa.plot_s_db(m=1, n=0, label='aaa', linestyle = '--')
    
    # bbb の S21 プロット
    bbb.plot_s_db(m=1, n=0, label='bbb')

    # ccc の S21 プロット
    ccc.plot_s_db(m=1, n=0, label='ccc')

    # グラフの表示変更
    plt.xlabel('Frequency [GHz]')
    plt.ylabel('Magnitude [dB]')
    # plt.title(title_str) # グラフタイトル
    plt.grid(True)
    
    # 凡例を装飾して表示
    legend = plt.legend(loc='lower left', frameon=True)
    legend.get_frame().set_edgecolor('gray')
    legend.get_frame().set_linewidth(1.0)
    legend.get_frame().set_facecolor('white')

    # ファイル名に使えない文字を置換
    safe_name = title_str.replace(' ', '_').replace('/', '_')
    filename = f"{safe_name}.png"
    filepath = os.path.join(output_dir, filename)

    # PNGとして保存
    plt.savefig(filepath, dpi=300, bbox_inches='tight')
    print(f"Saved plot as: {filepath}")
```

# グラフ表示例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601058/b5b3ae78-84c8-4464-90b8-8d30edb65284.png)
謎のスプレッド演算子 ** が進化していた！(その名はExpansion operators) 

2025年3月に発見された、Snowflakeの演算子 ** が、いつの間にかテーブルの検索結果にも使えるようになっていたのでお知らせします。

https://docs.snowflake.com/en/sql-reference/operators-expansion

発見当初は↓みたいな感じで使えて、カラムには対応していませんでした。
```sql
select 1 in (**[1, 2, 3, 4]);
```
↓これはエラーだった。
```sql
SELECT ** col1
FROM hoge_table;
```

先ほどドキュメントが更新されてたので確認したところ、サンプルがありました。
```sql
> SELECT * FROM spread_demo;

+------+------+
| COL1 | COL2 |
|------+------|
|    1 | a    |
|    2 | b    |
|    3 | c    |
|    4 | d    |
|    5 | e    |
+------+------+

> SELECT * FROM spread_demo
  WHERE col1 IN (** [3, 4])
  ORDER BY col1;

+------+------+
| COL1 | COL2 |
|------+------|
|    3 | c    |
|    4 | d    |
+------+------+
```

あれ、思ってたのと使い方違う。
前回エラーだったやつを投げてみると、やっぱりエラー。

```sql
> select **col1
FROM spread_demo;

000002 (0A000): Unsupported feature 'spread argument with non-constant array input'.
```

ドキュメントの最初に書いてあるのですが、
・IN句
・システム定義関数の呼び出し
・UDF
・バインド変数を使用するストアドプロシージャ
とかを想定しているようです。
カラムにArrayを入れて、それをどうにかする系ではなかったです。

また進化していたらお知らせします。ではまた。
サーバーコンポーネントとクライアントコンポーネントの違いをまとめたい

## はじめに
Next.jsをつかってフロントエンドの開発をする際に、どうやらこの2つは意識して書きわけたほうがいいことに気づいた。

また、この2つを厳密にかかないと赤文字で警告されｲﾗｯ💢ときたため、きもちよく心持ちにするためにもこのあたりを整理しようと思う。


## 🧠サーバーコンポーネントってなんですの？
React18以降で必須の概念で、18以降の登場した新手のモンスターですね。ブラウザではなく「サーバー上で実行されるReactコンポーネント」です。

Next.js 13+ ではデフォルトでこの形式になるようです。

画面表示するデータ取得（DB、API）をサーバでやってしまえちゃいます。クライアントに余計なJsが送られることなく、表示が早くなります。

## 🖐️クライアントサイドコンポーネントってなんですの？
同じみ、Reactコンポーネントです。`useState`etc...
状態管理・イベント・ユーザー操作といったものを指します。

## `</>`それぞれどんな感じなのか？

サーバーコンポーネントはこんなかんじ。

DBにアクセスできる処理だったり、データを加工してがちゃがちゃする処理とか含める感じですよね。

```.tsx
import { getUser } from '@/lib/db';

export default async function Page() {
  const user = await getUser(); // DBアクセスできる！
  return <h1>Hello, {user.name}</h1>;
}
```

一方で、クライアントコンポーネントはこんなかんじ。

```.tsx
'use client'; // 大事

import { useState } from 'react';

export default function Counter() {
  const [count, setCount] = useState(0);
  return (
    <button onClick={() => setCount(count + 1)}>
      Count: {count}
    </button>
  );
}
```

`use client`と記述することでクライアントコンポーネントですよ！って明示できちゃうんです。

個人的に本や動画教材などでは、あんまりこれをどこで応用するのかピンとこなかったんですが、ここで使うのか！って理解しました。

コードの読み手にも、伝わる内容になっていいですよね。

## こいつはどっちになるんだ？と迷ったら

ここはあくまで主観ですが、`use client`をつけるかつけないか迷った時、自分はこう考えています。

**→ どこで動かしたい？何を動かしたい？**

例：
- DBやAPIでデータを取得したい（コンテナ層的な考え？）なら`use client`をつかわない！
- ボタンをクリックしたいなら`use client`をつかう！

ここを自分の中に問うことでクリアになっていくのではないでしょうか？


## おわりに
どこまでクライアントにするのか、そもそもサーバーコンポーネントを活用するべきか？

SEOとかを意識しているの？初期表示速度あげたいの？なども検討の上でサーバーコンポーネントを扱っていきたいですね。
vscodeでオシャレなコメントを生成する拡張機能

# 概要
- オシャレなコメントをパパっと生成したくてVS Codeの拡張機能をつくりました
- 1行で区切り線を生成するか，複数行でテキストボックスを生成できます

<br>

- Marketplace

https://marketplace.visualstudio.com/items?itemName=KaiManabe.comment-box-generator

- GitHubリポジトリ

https://github.com/KaiManabe/vscode-commentbox/tree/main

# 使用方法
## 1行で区切り線を生成
1. `---Hello world!---`を入力
1. 補完候補に`Generate oneline comment`が表示されるので`Enter`
1. `// ----------------- Hello world! -----------------`が生成されます
![oneline.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4018129/4f04b6f4-3bf7-4caa-b3a5-ca908a889f40.gif)


## 複数行でコメントボックスを生成
1. `===Hello world!===`を入力
1. 補完候補に`Generate oneline comment`が表示されるので`Enter`
1. ↓が生成されます
    ```
    /* ----------------------------------------------+
    | Hello world!                                   |
    +---------------------------------------------- */
    ```

![multiline.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4018129/81710a80-c550-4465-b3e2-269869094865.gif)


# 設定方法
- 以下の項目はconfigで設定できます
    - コメントを囲うスニペット (`---`や`===`)
    - 1行あたりの幅
    - 線を構成する文字列
    - 全角文字の幅
- 詳しくは[リポジトリ内のドキュメント](https://github.com/KaiManabe/vscode-commentbox/blob/main/media/CONFIG.md)を参照してください

# 免責事項
- **実務未経験のガキンチョが作成しました**
- `Ctrl + z`が効くので大事には至らないと考えていますが，もし使用してくださる場合は自己責任で使用してください
Geminiで掃除機を使う魔法少女を描いてみた。

# 概要

Geminiで掃除機を使う魔法少女を描いてみました。

# 実装

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

```
聖なる掃除機を使う魔法少女を描いてください。
```

![聖なる掃除機を使う魔法少女_20250522.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/d5bab838-40af-45a7-9dc6-5ebd20d9e3fb.png)

# まとめ

可愛いかも。
何かの役に立てばと。
Node.js で node-speaker を使って PCM のオーディオデータをスピーカーから再生してみる

## はじめに

以下の「node-speaker」を使って、Node.js 上で PCM（Pulse-Code Modulation）オーディオデータを、直接スピーカーから再生する、という内容を試しました。

●speaker - npm
　https://www.npmjs.com/package/speaker

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/e2872685-e439-45cc-b1d7-f87468f0543e.png)


### これを試した背景

今回の内容をやろうと思った背景は、Google I/O 2025 で発表された以下の音楽生成を使い、Node.js で受信したデータから音を鳴らす、ということをやりたかったためです。

●Music generation  |  Gemini API  |  Google AI for Developers
　https://ai.google.dev/gemini-api/docs/music-generation

●Lyria RealTime - Google DeepMind
　https://deepmind.google/models/lyria/realtime/

ちなみに、上記のサンプルコード内の音を鳴らす処理は「// Application logic: buffer and play using Web Audio API etc.」と書いてあり、何らか自分で用意する必要がある状態でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/bb77175d-169c-4d3a-b1a5-ebae8e3e8a69.png)


## 実際に試していく

今回、node-speaker は初めて使うので、「シンプルな音のデータを単純に鳴らす」ということだけやってみます。

まず公式ページ上のサンプルを見てみると、以下が書かれています。

```javascript
const Speaker = require('speaker');

// Create the Speaker instance
const speaker = new Speaker({
  channels: 2,          // 2 channels
  bitDepth: 16,         // 16-bit samples
  sampleRate: 44100     // 44,100 Hz sample rate
});

// PCM data from stdin gets piped into the speaker
process.stdin.pipe(speaker);
```

これだけだと、音は鳴らない状態です。


### 音を鳴らす

#### 下準備

今回の内容を試す下準備として、node-speaker をインストールします。
※ ちなみに、自分がこれを試している環境は Mac です

```zsh
npm install speaker
```


#### 自前の実装

鳴らす音の元データを作る部分と、それを鳴らす部分とを実装してみました。


```javascript
import Speaker from "speaker";

const speaker = new Speaker({
  channels: 2,
  bitDepth: 16,
  sampleRate: 44100,
  signed: true,
  float: false,
});

const durationSec = 2;
const freq = 440; // Hz
const sampleRate = 44100;
const totalSamples = sampleRate * durationSec;
let i = 0;

// 1サンプルあたり4バイト (ステレオ×16bit)
const CHUNK_SIZE = 1024; // サンプル数
function writeChunk() {
  if (i >= totalSamples) {
    speaker.end();
    return;
  }
  const count = Math.min(CHUNK_SIZE, totalSamples - i);
  const buf = Buffer.alloc(count * 4);
  for (let j = 0; j < count; j++, i++) {
    const t = i / sampleRate;
    const v = Math.round(Math.sin(2 * Math.PI * freq * t) * 32767);
    buf.writeInt16LE(v, j * 4); // 左
    buf.writeInt16LE(v, j * 4 + 2); // 右
  }
  if (!speaker.write(buf)) {
    speaker.once("drain", writeChunk);
  } else {
    setImmediate(writeChunk);
  }
}

writeChunk();
```

これを実行すると、短い時間、シンプルな音が鳴るのが確認できました。

とりあえず、Node.js で　node-speaker を使ってスピーカーから音を鳴らす、という内容は実現できました。



## 【追記】

その後、当初やりたかった「Gemini API での音楽生成に使う」というのも、無事に実装できました。

（やたらと文字が出力されているのは、実装を試す途中でエラーが出たり、エラーは出ないけど音が鳴らなかったりという状態になって、データ受信や各処理の動作を確認するデバッグ情報を出してるためです）

<iframe width="560" height="315" src="https://www.youtube.com/embed/IEA-_dGOo-o?si=Ki6l6idpIJRJspLW" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
【学習記録5月21日】AWS SAA対策④：ネットワーク設計・ログ・暗号化・フェールオーバー構成

# 【学習記録】AWS SAA対策④：ネットワーク設計・ログ・暗号化・フェールオーバー構成

---

## 🧯 スケジュールドリザーブドインスタンスの廃止

かつて存在していた **スケジュールドリザーブドインスタンス** は現在廃止されています。今後のスケジューリングには他の方法（EventBridge + Lambdaなど）を検討する必要があります。

---

## 🌐 プライベートサブネットとNATの活用

プライベートサブネット内のEC2インスタンスがインターネットアクセスを必要とする場合、**NAT Gateway** もしくは **NATインスタンス** を使用して以下を実現します：

- インターネットからの直接アクセスは遮断
- **アドレス変換機能（NAT）** により外部への通信は可能
- **ソフトウェア更新やバッチのダウンロード**が安全に行える

### 🛠 パターン例

- Webサーバー：**パブリックサブネット**
- DBサーバー：**プライベートサブネット**
- NAT Gateway：**パブリックサブネット**

---

## 📶 Amazon MQ への移行

ActiveMQのメッセージキューを使用している場合は、**Amazon MQ** のマネージドサービスへ移行するのが推奨されます。

- フルマネージドサービス
- 可用性と信頼性の向上
- 運用コストの削減

---

## 🔍 VPCフローログと監査機能

### ✅ VPCフローログ
- EC2のネットワークインターフェース単位でログを取得可能
- セキュリティトラブル時のトラフィック解析に有効

### ✅ CloudWatch & CloudTrail
- **CloudWatch Logs Insights** によるリアルタイム分析
- **CloudTrail** による API 操作の追跡
- マルチアカウント・リージョン対応の **中央ロギング構成** を実現

---

## 💾 Data Lifecycle Manager（DLM）の活用

- **EBSスナップショット**の作成・削除を自動化
- 定期的なバックアップ運用が可能
- コスト最適化と人的ミスの削減

---

## 🔐 S3のサーバーサイド暗号化（SSE）

### 🔑 SSE-C（Customer-Provided Keys）
- ユーザー自身が管理する暗号鍵を使用
- AWSに鍵は保存されず、**毎回リクエスト時に提供**
- 実装には **SDK等の活用** が必要
- 誤って鍵を失うと復号不可

---

## 🔁 Route 53のヘルスチェックとフェールオーバー構成

- Route 53の **ヘルスチェック機能** を利用し、アクティブ-スタンバイ構成を実現
- ヘルスチェックにより異常検知 → スタンバイサーバーに自動切替
- マルチリージョン／高可用性設計に有効

---

## 📝 まとめ

今回学んだトピックは、AWSインフラの可用性・セキュリティ・監視に密接に関わる重要分野です。SAA試験において、システムの構成とその理由を論理的に判断する能力が問われます。

---