OmniAICreator/Qiita-1.07M huggingface dataset:
DockerのMCP対応で広がるAI活用の可能性

流行ってるよね。MCP。
Docker Desktopの新機能として組み込まれるくらいには流行ってるよね。
今後、生成AI界隈で割と重要な概念になりそうなので調べておくよ。

# MCPってなぁんだ
MCPはModel Context Protocolの略。
公式）https://modelcontextprotocol.io/introduction

公式サイトにはAIアプリケーション用のUSB-Cポートのようなものと説明されていた。
USB-Cが周辺機器と接続するための標準化された方法を提供しているように、
MCPもAIモデルを色んなデータソースやツールに接続するための標準化された方法を提供しているらしい。

公式サイトにある概要図も貼っておきます
![スクリーンショット 2025-05-14 16.06.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247048/6f6573e3-1787-468c-a580-c2c5cc13320b.png)
引用）https://modelcontextprotocol.io/introduction#general-architecture


# 何が便利なの？
MCPを活用することで、AIエージェントが以下のことを可能になるらしい。
* データベースの検索する
* インターネット上の情報にアクセスする
* 外部連携が可能になる
    * GithubやDockerなどの開発ツールを操作できる
    * XやSlackなどとも連携できる

自分たちの取り扱いたいデータを最新の状態で取得できることにより、
”ぼくのかんがえたさいきょうのAIエージェント”を作り上げることができるみたい。

MCP公式で、各言語ごとのSDKが公開されている。
自作MCPを作ることも可能みたい。

https://github.com/modelcontextprotocol

めっちゃ便利だね！！！

# 会社で使うには怖いヨォ
流行りに流行っている便利なMCPツールを会社で使いたい。

でも、githubで公開されているMCPデータは信頼できるのか判断がつかない。
さらには、MCPによっては「ツール・ポイズニング」や「ツール・ラグプル」などといった
MCPの脆弱性も確認出来ているという流行り物あるある状態らしい。

# DockerにMCPツールの登場
そのような状況の中、つい最近Dockerが公式にMCP CatalogとMCP Toolkitを発表したらしい。(2025/5/5)
MCPサーバの検索、インストール、認証プロセスを安全でかつシンプルに提供する機能みたい。（直訳感）
まだベータ版の提供とのこと。

https://www.docker.com/blog/announcing-docker-mcp-catalog-and-toolkit-beta/?_gl=1*1obev69*_gcl_au*MTUyMjczNTE5MC4xNzQ3MjA0NDI2*_ga*NDgzMjk0MDgyLjE3NDcyMDM1MzQ.*_ga_XJWPQMJYHQ*czE3NDcyMDM1MzMkbzEkZzEkdDE3NDcyMDQ4ODAkajM0JGwwJGgw

## MCP Catalogとは

https://hub.docker.com/catalogs/mcp?_gl=1*1rlriay*_gcl_au*MTUyMjczNTE5MC4xNzQ3MjA0NDI2*_ga*NDgzMjk0MDgyLjE3NDcyMDM1MzQ.*_ga_XJWPQMJYHQ*czE3NDcyMDM1MzMkbzEkZzEkdDE3NDcyMDYyMDIkajYwJGwwJGgw

Docker Hub上で公開されている信頼されたMCPサーバを簡単に検索できる。
docker pullをすれば簡単にセットアップすることも可能。
pythonだとuvが必要だったりするらしいので楽ちん便利！

なんかめっちゃいっぱいある！！
![スクリーンショット 2025-05-14 16.34.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247048/3eb9fec1-3b7b-4a7e-bc2f-1118ae53c580.png)


## MCP Toolkitとは
コンテナ化されたMCPサーバをAIエージェントと統合するためのDocker Desktopの拡張機能らしい。
Docker Desktopが入ってないと使えない。Rancher Desktopに乗り換えてしまった。残念。

既に信頼された組み込みのセキュリティ機能を使うことができるので、
コンテナー内でMCPサーバーを簡単かつ安全に実行できるとのこと。
「ツール・ポイズニング」や「ツール・ラグプル」にも対処しているらしい。

# 自分たちでどう使えそう？

私が関わっているモッピーというプロダクトは、
今年で20周年を迎えた長寿サービスなので歴史がたくさん詰まっている。
プロダクトの機能も複雑で非常にハードなドメイン知識を求められる。

https://pc.moppy.jp/

wikiのようなドキュメントを作るのもよいが、作成コストと管理コストが嵩むことから
過去のタスクから内容を集約して教えてくれるエージェントを作ると仕事の助けになる予感はした。

弊社ではredmineを活用していることから、redmine用のMCPサーバを作成し
連携することで上記の実現ができると考えている。

会社のPCにDocker Desktopが未インストールであることや、
Redmineの管理者権限も持ってないので今の所妄想でおわりだけど…

弊社ではDifyを導入しており、AIエージェントが気軽に作れる環境がある。
DifyとMCPの連携も強化されているみたいなので、安定しない回答結果と収集が厳しいナレッジの作成から解放されることで本当に便利なものを作れる予感がした。

https://miralab.co.jp/media/dify_mcp_integration_tools/

# さいごに

調べてたらredmine用のMCPを作りたくなってきた。
外部のもので公開されているのでプライベートで遊んでみよう。

https://github.com/runekaagaard/mcp-redmine/tree/main
【React / Next.js】Error [TypeError]: res.status is not a function at handler の解決方法について

# はじめに
udemyのNext.jsハンズオンでデータベースから情報を取得する実装中に下記のエラーに遭遇しましたので、こちらの解決方法について記事にします。
前提条件として、ハンズオンではSupabaseによるAPIでのデータを取得しておりますが、今回CloudflareのD1を利用しております。


エラー内容

:::note warn
Error [TypeError]: res.status is not a function
    at handler (src/pages/api/index.ts:19:13)
:::

Edge Runtimeはres.statusは使えないということのようでした。


修正前コード
```.index.ts
import { getRequestContext } from "@cloudflare/next-on-pages";
import { NextApiRequest, NextApiResponse } from "next";

export const runtime = 'edge';

export default async function handler(
  req: NextApiRequest,
  res: NextApiResponse
) {
  const env = getRequestContext().env;

  const result = await env.DB.prepare("SELECT * FROM posts").all();
  console.log('result', result);

  if(!result) {
    return res.status(500).json({ error: "Server Error" });
  }

  return res.status(200).json(result.results);
}

```

【修正後】
```.index.ts
import { getRequestContext } from "@cloudflare/next-on-pages";

export const runtime = 'edge';

export default async function handler() {

  const env = getRequestContext().env;
  const result = await env.DB.prepare("SELECT * FROM posts").all();

  console.log('result', result);

  if(!result) {
    return new Response(JSON.stringify({ error: "Server Error" }))
  };
  return new Response(JSON.stringify(result.results));

}

```

# 参考
https://github.com/vercel/next.js/issues/46128




# おわりに
これでデータが取得できるようになりました。

<br>

# JISOUのメンバー募集中！
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？
興味のある方は、ぜひホームページをのぞいてみてください！
▼▼▼

https://projisou.jp
Javaの基礎的な文法

🔹 1. Javaとは？
オブジェクト指向プログラミング言語

クロスプラットフォーム（OSに依存しない）

Android開発にも使われている

🔹 2. 基本の構文
▶ クラスとメソッド
例
```java
public class Main {
  public static void main(String[] args) {
    System.out.println("Hello, Java!");
  }
}
```
public class Main：クラスの定義

mainメソッド：プログラムのスタート地点

System.out.println：コンソールに出力

🔹 3. 変数の宣言と型
例
```java
int age = 25;
String name = "Taro";
boolean isStudent = true;
```



🔹 4. if文（条件分岐）
例
```java
int score = 80;
if (score >= 60) {
  System.out.println("合格！");
} else {
  System.out.println("不合格");
}
```
🔹 5. for文（繰り返し）
例
```java
for (int i = 0; i < 5; i++) {
  System.out.println(i);
}
```
🔹 6. 配列
例
```java
int[] numbers = {10, 20, 30};
System.out.println(numbers[0]); // 10
```
🔹 7. メソッドの定義
例
```java
public static int add(int a, int b) {
  return a + b;
}
```
🔹 8. クラスとオブジェクト
例
```java
public class Person {
  String name;

  public void greet() {
    System.out.println("こんにちは、" + name + "です！");
  }
}
Person p = new Person();
p.name = "Taro";
p.greet();
```
📝 まとめ
Javaは型が厳密で、文法がしっかりしているので、基礎を押さえると応用も楽になる。

特にクラスやメソッドの書き方に慣れると、他の言語にも応用が効く。
Next.jsでWeb開発を勉強中：3Dゲーム「Crazy Cattle」を埋め込んだサイトを作ってみた

こんにちは、最近Web開発（特にNext.js）を勉強中の者です。

Unity製の3DゲームをWebページに組み込む練習として、「Crazy Cattle 3D」というゲーム紹介サイトを作成しました。

---

## 🎮 サイト概要

🔗 [https://cattlecrazy3d.com/](https://cattlecrazy3d.com/)

![Crazy Cattle 3D サイト](https://cattlecrazy3d.com/og-image.png)

- Unity製3Dゲームをiframeで埋め込み表示
- ゲームの背景、紹介文、SEO対応などを実装
- モバイル端末にも対応したレスポンシブ設計

---

## 🛠️ 使用技術

- フレームワーク：Next.js (App Router構成)
- スタイリング：Tailwind CSS
- デプロイ：Netlify
- iFrameを使った外部ゲームの埋め込み
- OGP/SEO対応：`generateMetadata()` を使用

---

## 💬 感想

- iFrameの高さ調整に少し苦戦しましたが、レスポンシブ対応の良い練習になりました。
- OGP画像やタイトル、説明などのSEO設定も意識してみました。
- 次はユーザーの操作履歴やスコア管理もやってみたいです。

---

## 👀 ぜひ遊んでみてください！

**▶️ [https://cattlecrazy3d.com/](https://cattlecrazy3d.com/)**

フィードバックも大歓迎です 🙌
【Salesforce】GmailやGoogleカレンダー連携を削除する方法

☆お客様からのご要望
・活動キャプチャに表示されているお客様とのメールを削除したい
→解決策：一度活動キャプチャを削除して、再度Googleとの連携を実施する

☆方法
〇連携の削除
1．クイック検索→設定（活動キャプチャ）→構成タブ→Googleアカウントの編集→設定を確認のメールの☑を外す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4039092/1afcabf0-de16-41f3-a155-43f06dd579b4.png)


〇メールの削除
2．クイック検索→メールと行動を削除→メールアドレスかユーザを指定してメールを削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4039092/a9f7e1c1-36e4-4b9a-9fa1-2fa1e609edd7.png)

〇再連携
※手順2の削除が完了してから実施
3．ユーザの個人設定→メールとカレンダーアカウント（接続済みアカウント）→接続されているGoogleアカウントの”切断”→再度接続

上記を行えば、Googleカレンダー（過去分含む）の連携とこれまで連携されていたメールの削除がｋ
rex0220 画像横並びプラグイン

kintone の添付ファイル項目の画像を横並びに表示するプラグインです。

# 概要

添付ファイル項目の複数の画像を横並びに表示します。
画像が多い場合に表示枠を有効に利用できます。

画像横並びプラグインの特徴
・添付ファイル項目の画像を横並びに表示
・横並びと縦並びの切替機能
・PC 環境のみ対応

## 詳細画面表示例

![2025-05-14_15h09_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/7fe92300-fe71-4f0c-a419-b660d820efd4.png)

## 編集画面表示例

![2025-05-14_15h09_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/d81d72ab-966b-42ff-8376-f03c62d4154f.png)

## テーブル表示例

![2025-05-14_15h11_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/0d97872b-8831-4ca5-b30a-760bc0db4657.png)

## 複数の添付ファイル項目の例

![2025-05-14_17h48_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/b883962d-4ce9-492f-b3ab-04ab55120690.png)

## 複数テーブルを横並び表示

[横並びプラグイン](https://qiita.com/rex0220/items/b24c41d6c3b6ce3f3d78)で複数テーブルを横並び表示した例です。

![2025-05-14_17h52_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/bef39af1-446b-4c19-8631-ba4ebe281a90.png)

## 印刷画面

印刷画面にも画像横並びが適用されます。

![2025-05-14_18h14_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/1c306696-5aac-4972-85c5-8463fe341f29.png)


# 横並びと縦並びの切り替え

ヘッダー部の「横並び切替」アイコンをクリックすると、横並びと縦並びの切り替えを行います。

![2025-05-14_15h14_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/4c6324fa-803f-42ff-9f52-f39b54e0aafa.png)

# 編集画面の画像ドラッグ移動

横並び表示中は、画像をドラッグすると行の先頭にのみ移動となります。
画像位置を細かく変更したい場合は、画像を縦表示に変更して行ってください。

- 横並びのドラッグ移動
![2025-05-14_17h20_46.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/013ae4e1-07be-462c-9b71-5eb0c6ea8f68.gif)

- 縦並びのドラッグ移動： kintone 標準の操作
![2025-05-14_17h25_23.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/44280848-c379-44a6-883e-7bb46cc52d35.gif)

# アプリフォーム設定

添付ファイル項目の横幅は、表示する画像に合わせて十分に大きく設定してください。

![2025-05-14_17h17_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/64da32be-75c0-42a3-9631-b41bf0bbc2fc.png)


# 画像横並びプラグイン設定

添付ファイル項目が表示されますので、横並び表示を行う項目をチェックします。

- NOTE：　メモ用
- 説明：　設定内容の説明
- プラグイン有効
- タイプ：　ROW/SUBTABLE/GROUP
- 親項目：　テーブル・グループ
- ラベル：　添付ファイル項目のラベル
- フィールドコード：　添付ファイル項目のフィールドコード
- 項目幅：　添付ファイル項目の横幅（マージンを除く）
- サムネイル：　画像のサムネイル幅（マージンを含む）
- 画像数/行：　行当たりの表示画像数のだいたいの目安
- ファイル名：　編集画面でファイル名を表示する場合にチェック
- 運用環境に反映：　直接運用環境に反映します

![2025-05-14_15h21_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/3c85e8b1-cdf1-4f85-ac5b-bb2ae803486b.png)


# 注意事項

- 既に、JavaScript によるカスタマイズを行っているアプリの場合、処理が競合して、エラーになる場合があります。その場合は、該当するアプリでプラグインの使用を中止してください
例 
・ちょっと便利なプラグイン
　F08 画像ファイルを横並び：画像のレイアウト表示の不具合
【Ruby】デフォルト引数を使わないとこうなる

## はじめに

「デフォルト引数なんて使うのか？？」と思ってたところで痛い目を見ました。

## 問題

> 引数が渡された場合、「○○最高！！」という文字列を返し、渡されない場合は「Ruby最高！！」という文字列を返すdecideメソッドを定義せよ。
>なお、キーワード引数は使用しないこととする。

## 自分の解法

『aという条件を満たしたらAを、満たさなかったらB、よしif文で瞬殺や！』

『けどどうやって引数が渡された/渡されなかったを判定するんや？？』

『う〜ん？引数のsizeが1未満だったら、引数が渡されてないって判定できるのでは？名案キター♪───Ｏ（≧∇≦）Ｏ────♪』

```ruby
def decide(*arguments)
	if arguments.size < 1
		return "Ruby最高！！"
	end
	
	arguments.each do |argument|
		if argument.size >= 1
		 return "#{argument}最高！！"
		end
	end
end

puts decide
```

## 望ましい解法

デフォルト引数を使うと・・・

```ruby
def decide(argument = 'Ruby')
	"#{argument}最高！！"
end

puts decide
```

こんなにコンパクトに書けてしまいます。
【ポートフォリオ開発記】 #1 アプリの題材について 

## はじめに
転職活動に向けてポートフォリオを作成していく過程を記事にしていこうと思います。  
これから転職しようと考えている方にとって、少しでも参考になれば嬉しいです！


## アプリの題材：ノートアプリ

今回は **Markdownベースのノートアプリ** を作ります。  
イメージとしては、Obsidianのように使えるものを目指します。

## なぜノートアプリ？

私は実務・勉強でマークダウンでメモを取ることが多いのですが、「こういう機能があれば…」と思うことが多く、そういった思いをモチベーションにポートフォリオを作成していけそう！と思ったのでノートアプリを題材にしました！完成次第、こちらのアプリを使って勉強できるのが理想です！

## 使用技術

- フロントエンド：Next.js
- サーバーサイド：SpringBoot（Java）
- その他：Git/GitHub、Docker

## 機能一覧

- ユーザー登録／ログイン機能
- ノートの作成・編集・削除・一覧表示（CRUD）
- Markdown記法での記入・保存

まずはこれだけあれば、シンプルなノートアプリとして成立するはずです。

## まとめ
ひとまずやりきることを目標に頑張ります！
どのタイミングで投稿頻度はどの粒度でやるかは悩み中です！

## 今後について

どのタイミングでどのくらいの粒度で投稿するかはまだ悩み中ですが、  
**まずは「やりきる」ことを目標に、一歩ずつ進めていきます！**
大文字から小文字への変換

大文字小文字が混ざった文字列、「これ全部小文字にするやつどう書くの!?」ってなったけど、便利なメソッドがあった！

<br>

## 問題概要

大文字と小文字のアルファベットが混ざった文字列 `S` が与えられるので、`S` を全て小文字にした文字列を出力せよ。

入力例：

    PAIZA

出力例：

    paiza

<br>
https://paiza.jp/works/mondai/string_primer/normal_step6

<br><br>

## ✅コード例
```js
const rl = require('readline').createInterface({input:process.stdin});

rl.once('line',(input)=>{

    let lowerCaseText = input.toLowerCase();
    console.log(lowerCaseText); 
    
    rl.close();
});
```
入力を `.toLowerCase()` で小文字に変換して `console.log` で出力！

<br><br>

## .toLowerCase()とは？

`.toLowerCase()` は、JavaScript において 文字列をすべて小文字に変換するためのメソッド。

### 🔧 基本構文
```js
let str = "HeLLo";
let lower = str.toLowerCase(); // "hello"
```
<Br>

### 📌 特徴とポイント

![スクリーンショット 2025-05-13 122602.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4018208/d42c118b-8c54-49aa-92d3-a6e70a9bc3dd.png)

<br>

###📚 使用例
```js
console.log("JAVASCRIPT".toLowerCase()); // "javascript"
console.log("PaIZa123!".toLowerCase());   // "paiza123!"
```
<Br>

### ⚠ 注意点

- 数字・記号・空白などは影響を受けない
```js
"123!@#ABC".toLowerCase() // → "123!@#abc"
```

- undefined や null に使おうとするとエラーになる。文字列型であることを確認して使う。

<br>

### 🔍 実践での活用シーン例

ユーザーの入力を 大文字小文字を区別せずに比較したいとき：
```js
if (userInput.toLowerCase() === "yes") {
    // OK
}
```
<Br><br>


## 💡気づきメモ

- .toLowerCase()は非破壊的（元の文字列を変えない）
- アルファベットだけ小文字化。数字や記号、日本語はそのまま
- 判定処理にも活用できる！

<br>

## 新しく学んだこと 

- `String.toLowerCase()` → 小文字変換の王道
- `typeof` で文字列チェックしてから使うと安心
- 入力に応じた柔軟な前処理の大切さ
- `.toUpperCase()`：こっちは大文字に変換。処理の逆方向。

<br>

## まとめ

文字列の大小文字を処理するのに `.toLowerCase()` は超定番！

<Br><br><br>[僕の失敗談(´;ω;｀)と解決法🐈](https://paizabeginner.wordpress.com/about/)
【tailwindcss】動的に当てるクラスを変えてみた

ユーザーの選択したカテゴリごとに背景色を変えることが必要で、試行錯誤しながらやったのでそのメモです

## 一応動くけど...

最初とりあえず実装進めていた時は、背景色変えたいvueファイル全部に下のコード書いてました。
色変えたくなったら使用箇所全部修正するんか...？って思いますよねえ

```ts
switch (props.categoryId) {
    case 1: //カテゴリ1
        bgColorClass = "bg-red-400";
        break;
    case 2: //カテゴリ2
        bgColorClass = "bg-blue-300";
        break;
    case 3: //カテゴリ3
        bgColorClass = "bg-purple-300";
        break;
    // 〜〜〜〜
}
```

## 正気に戻った(最終的にやったこと)
冷静になって、色の指定は1箇所で完結させたいと思って実装したのが次です

```ts
// Color.ts
export const ColorList = {
  1: { //カテゴリ1
    normal: 'bg-red-700',
    light: 'bg-red-400',
  },
  2: { //カテゴリ2
    normal: 'bg-blue-600',
    light: 'bg-blue-300',
  },
  3: { //カテゴリ3
    normal: 'bg-purple-500',
    light: 'bg-purple-300',
  },
};
```
色指定用のtsファイルにカテゴリIDごとの色指定をして、使用したいvueファイルで、
```vue
<script setup lang="ts">
import {ColorList} from "@/script/Common/Color";

const props = defineProps({
  category: {
    type: Object,
    required: true,
  },
});
</script>

<template>
    <h2 :class="ColorList[props.category.id].light">{{props.category.name}}</h2>
</template>
```

これで色の変更したい時は、色指定のファイルだけ変えれば済むのでらくちんになりました〜

もっといいやり方がありそうな気はしつつ、受け取った値によって当てるクラスを変えたい場合に使いやすく変更できたと思います！
🐾 Zoom Team Chatで使える！便利小技3選 🐾

# はじめに
こんにちは！今回は、Zoom Team Chatをもっと便利に使いこなすための小技を3つご紹介します。
どれも簡単なのに、ちょっと知っているだけでスマートさがアップします。✨
Zoomでのやり取りをもっと快適にするために、ぜひチェックしてみてください！

# 🌟 小技その1：さくっとスクショ！✨

**Cmd+Tでスクショをクリップボードに保存！**

![Screenshot 2025-05-14 at 16.26.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442226/1b420b8b-7a15-428f-8af3-8e7ec95baab1.png)

Zoom Team Chatでは、**Cmd+T（WinならCtrl+T）**を押すことで、
スクリーンショットをクリップボードに保存できます。
保存したスクリーンショットは、そのままチャット欄に**ペースト**すれば、すぐに共有可能ですし、他のアプリやWebサービスに貼り付ける時も便利〜🚀

:::note info
ちょっとした画面の共有や、素早く情報を伝えたいときに便利です。
:::

# 🌟 小技その2：引用をスマートに！ 📝

**右クリックでQuote Textを使う！**

![Screenshot 2025-05-14 at 16.27.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442226/9e83c73a-cfd1-4c1b-bc0d-c719272ffa44.png)


チャット欄のメッセージを**右クリック**し、`Quote Text` を選択するだけで、
簡単に引用を作成できます。

:::note info
前のメッセージを引き合いに出して話を続ける際に、スマートな使い方ができます。
:::

# 🌟 小技その3：すばやく修正！⏪

**上矢印キー ⬆️ で直前のメッセージを再編集！**

![screen_recording_with_text.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442226/e62a9ca2-c78b-4192-94fc-d5799ab2e6aa.gif)

直前のメッセージに誤字や修正したい箇所がある場合は、
**上矢印キー** ⬆️ を押すだけで、すぐに編集モードに切り替わります。
そのまま修正して、Enterを押せば更新完了です。

## 🎀 まとめ 🎀

Zoom Team Chatをもっと便利に使うための小技を3つご紹介しました。
普段のやり取りがもっとスムーズになるので、ぜひ試してみてくださいね！💖
Zoom Video SDKをGlitchで試す

# はじめに

Zoom Video SDKを使ってリアルタイムビデオアプリケーションを構築するためのミニマムなサンプルをGlitch上でデプロイできるようにしました。これにより、環境構築が難しい人でも簡単に試せるようになっています。

## なぜGlitchを使うのか？

GitHubリポジトリを直接クローンして使うのが難しいという声が多かったため、Glitch上で試せる形にしました。特に「Gitやコマンドラインは苦手かも…💦」という方にも便利です。

# デプロイ方法 🍀

## 1. GlitchプロジェクトをRemixする

以下のリンクからプロジェクトをRemixしてください。

https://glitch.com/edit/#!/antique-typical-archduchess

## 2. 環境変数の設定

`.env` ファイルを編集して、以下の環境変数を埋めてください。

```
ZOOM_SDK_KEY
ZOOM_SDK_SECRET
```
:::note info
ちなみにPORTも記載があるかもですが、こちらは影響がないので必要あれば `8080` とかを記載しておいていただく形で構いません。
:::

## 3. プロジェクトを起動する 🚀

### Roleとボタンの使い方

- **Role（Participant/Host）**：参加者かホストかを選択できます。
  - **Participant**：セッションに参加者として参加する
  - **Host**：セッションをホストとして開始する
- **Join/Start the Session**：選択したRoleでZoomセッションに参加または開始します。
- **Leave/End the Session**：Zoomセッションから退出します。ホストの場合はセッションを終了します。


![01.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442226/062995bf-1700-4ce5-bc35-c87b1276e130.jpeg)

プロジェクトがリビルドされ、自動的に起動します。`🔎PREVIEW` ボタンをクリックしてブラウザをウィンドウを開き、動作確認をしてください。

# このプロジェクトについて 💡

## ベースとなるリポジトリ

今回のGlitchプロジェクトは以下のGitHubリポジトリをベースにしています。

https://github.com/bitzed/vsdkbasic

## 既存記事の補足

以前書いた記事でもZoom Video SDKを試す方法を紹介しましたが、Git cloneやローカル環境の構築にハードルを感じる方のために、今回はGlitchを使ってより手軽に実行できる環境を用意しました。

https://qiita.com/michitakasugi/items/7f3dc8954f5c92ea878f

# まとめ 🌸

Zoom Video SDKをGlitchで試すことで、初心者でも簡単にリアルタイムビデオの動作確認が可能になります。ぜひ試してみてください！

ご意見やフィードバックがあれば、コメントで教えてください！
Azure AI Services リソースを即座に削除する

Azure AI Services が削除できなくて詰まったので、その対処方法のまとめ

## Azure AI Services のリソース名の制約
少し本題から外れるが、先に Azure AI Services のリソース名の制約について書く。

Azure AI Services (Azure Cognitive Services) は、Microsoft Azure における AI 系サービスの総称である。

Azure CLI を使うとその一覧が確認できる。(Azure Portal 上では Azure AI Search なども Azure AI Services の一種という扱いになっているが、このリストには入っていないようだ。そのへんはよくわからない。)

``` console
$ az cognitiveservices account list-kinds
[
  "AIServices",
  "AnomalyDetector",
  "CognitiveServices",
  "ComputerVision",
  "ContentModerator",
  "ContentSafety",
  "ConversationalLanguageUnderstanding",
  "CustomVision.Prediction",
  "CustomVision.Training",
  "Face",
  "FormRecognizer",
  "HealthInsights",
  "ImmersiveReader",
  "Internal.AllInOne",
  "LUIS.Authoring",
  "LanguageAuthoring",
  "MetricsAdvisor",
  "OpenAI",
  "Personalizer",
  "QnAMaker.v2",
  "SpeechServices",
  "TextAnalytics",
  "TextTranslation"
]
```

Azure AI Services には厄介な成約があって、**同一リソースグループ内では Azure AI Services リソース名は重複できない。**

例えば、既に `myproject` という名前で Computer Vision リソースが作成されている場合、`myproject` という名前の Azure OpenAI リソースを新規作成することができない。作成しようとしても `指定された名前が既に使用されています。別の名前を選択してください。` `(UpdateKindNotAllowed) It's not allowed to update kind of API account.` などとエラーが出る。

そのため、同一リソースグループで複数の Azure AI Services リソースを作成したい場合は `cv-myproject` `aoai-myproject` のようにリソース名を分ける必要がある。

## リソース削除後の制約
何らかの事情で、どうしても `myproject` という名前で Computer Vision リソースを作成したいが、既に同名の Azure OpenAI リソースが存在していて困っているとする。この場合は既存の Azure OpenAI リソース `myproject` を削除すれば同名の Computer Vision リソースが作成できるようになる。

**ただし削除してから48時間待つ必要がある。** どうやら Azure AI Services での削除はあくまで論理削除であって、48時間の猶予のあとで物理削除されるらしい。

## 48時間を待たずに物理削除する方法
論理削除したあと、リソースの purge を行うと48時間を待たずして物理削除することができる。[^recover-purge-resources]

Azure Portal だと「削除されたリソースの管理」から purge できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16369/abf3b7c3-2345-4a43-babe-77167e68f58f.png)

また、Azure CLI でも purge できる。

``` console
$ az cognitiveservices account purge \
    --subscription aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa \
    --resource-group myproject \
    --name myproject \
    --location japaneast
```

[^recover-purge-resources]: [削除された Azure AI サービス リソースの復旧または消去 - Azure AI services | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/ai-services/recover-purge-resources)
今回のトラブル＆解決までの流れまとめ


#### ①環境設定のずれ（ポート番号・URLマッピング）

:writing_hand_tone1: Eclipse のサーバー設定でポートを8081に変えていたため、意図せず localhost:8080 と食い違いが発生。

:writing_hand_tone1: その後 8080 に戻したものの、web.xml のマッピングが重複／競合（/PersonList.do と *.do）していて、リクエストが思ったコントローラに届かなかった。

#### ②フレームワーク（HttpServletMain）と独自サーブレットの混同

:nose_tone1:　共通フレームワークでは HttpServletMain → doAction() をオーバーライドする設計。

:nose_tone2:　ところが最初、自力で doGet／doPost を書いて動かそうとしてクラスキャスト例外や “Servletではありません” エラーに。

:nose_tone3:　結果、PersonList クラスに doAction() が二重定義され、ビルドエラーにもなっていた。

#### ③JSP／サーブレットの呼び出しルートが不明確

:fist_tone1:　PersonList.jsp を直接ブラウザで開いてしまい、ビーンへの初期化処理が走らず真っ白に。

:fist_tone2: 正しくは ```<form action="PersonList.do">``` 経由でコントローラ→ビーン→JSP の順にリクエストを流す必要があった。

#### ④複数ファイル・複数段階の画面遷移

:raised_hand_tone1: 新規登録・一覧・詳細・確認・完了の５画面をまたいで値渡しをするため、

:raised_hand: form_name／action_cmd／search_info など hidden 項目の管理

:raised_hand_tone2: Bean の serialize／deserialize
が煩雑になり、どのタイミングでどの画面を呼ぶべきか迷走。

#### なぜ時間がかかったか
:v_tone1: 原因切り分けが後手に：
問題が一気に複数（ポート、マッピング、フレームワーク設計、JSP直叩き）重なり、どこから手をつけるべきか判然としなかった。

###### フレームワークへの理解不足：
:v_tone2: HttpServletMain を軸にした開発手順／クラス構成のルールを初見で把握するまでに手間がかかった。

###### 画面／URL／クラス名の多重パターン：
:v_tone3: 画面ごとに JSP が複数バージョンあり、その呼び出し先も「.jsp」「.do」「.html」と混在。

#### 次回からの対策 :runner_tone2:
###### ①基本構成図をまず描く

「ブラウザ→サーブレット（.do）→Bean→JSP」の大まかなフローを可視化し、JSP直叩きになっていないか常にチェックする。

###### ②web.xml は一元管理 & コメント整備:runner_tone5:

個別マッピング（/PersonList.do）とワイルドカード（*.do）が両立しない場合はどちらか一方に集約。

「何番ポートで起動中か」「context path」も明示的にコメントに残す。

###### ③フレームワークのテンプレートを踏襲:runner_tone2: 

共通の HttpServletMain を使うなら、

```
public class MyController extends HttpServletMain {
  @Override
  public void doAction() { … }
  @Override
  public void doInit() { … }
}
```
doGet／doPost を直接オーバーライドしないパターンに慣れる。

###### ④単体テスト的に段階確認:runner_tone5:

まず「.do にアクセス→ログに”controller hit”」と出るか確認。

次に「forward 先の JSP で簡易メッセージ表示」を挟んで順序をトレース。

最終的にビーンを経由して本来画面を出す。
VMware HCX について調べもの備忘録

# 1. はじめに

仮想環境間の移行で大活躍する VMware HCX について調べることがあったので、
参考にした資料などまとめておきます。随時更新予定です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/75ba773b-1eef-4d53-b3eb-a08aff721911.png)


# 2. VMware HCX のコンポーネントと必要スペック (VMware HCX 4.11)

##  アプライアンス仮想マシンの仮想ハードウェア要件

VMware 仮想環境同士での移行時に利用するコンポーネント一覧です。
各コンポーネントはアプライアンス仮想マシン (VM) として稼働し、HCX Manager 経由で必要なコンポーネントがデプロイされます。

| アプライアンス | vCPU (Cores) | メモリ | ディスク容量/IOPS |
|--------------|------|------|----------------|
| HCX Manager| 4 | 12 GB | 60 GB |
| HCX Interconnect (HCX-IX) | 8 | 6 GB | 2 GB |
| HCX Network Extension (HCX-NE)※ | 8 | 3 GB | 2 GB |
| HCX WAN Optimization (HCX-WAN-OPT) | 8 | 14 GB | 100 GB / 5000 IOPS |

※HCX Network Extension (HCX-NE)は L2 延伸を構成する場合にのみ必要となります。

詳細な情報は Broadcom TechDocs を参照ください。 

https://techdocs.broadcom.com/us/en/vmware-cis/hcx/vmware-hcx/4-11/vmware-hcx-user-guide-4-11/preparing-for-hcx-installations/system-requirements-for-hcx.html

##  そのほかの要件

他にも VMware vSphere バージョンや、ネットワーク観点でも通信ポート、レイテンシなどの要件があります。
最新情報はこちらをご確認ください。

https://techdocs.broadcom.com/us/en/vmware-cis/hcx/vmware-hcx/4-11/vmware-hcx-user-guide-4-11/preparing-for-hcx-installations/software-version-requirements.html


# 3. VMware HCX 参考資料

## VMware Japan Blog (VMware HCX)

VMware HCX について詳細に日本語でまとめてくださっているので、まずはこちらがおsです。

https://blogs.vmware.com/vmware-japan/tag/hcx


## Broadcom by VMware 公式資料

基本的に英語ですが、仕様やセットアップ方法など詳細まで確認したい場合はこちら。

https://techdocs.broadcom.com/us/en/vmware-cis/hcx.html

## 解説ブログ

@mtoyoda  さんの良記事です。

https://qiita.com/mtoyoda/items/803a11b09fb103fde476

@damepanda_supra さんの良記事です。

https://qiita.com/damepanda_supra/items/cdf4e6335d986af960be
react-app-rewired

# react-app-rewired とは？

`react-app-rewired` は、`create-react-app` (CRA) で作成した React プロジェクトにおいて、`eject` をせずに webpack や Babel の設定をカスタマイズできるツールです。

---

## なぜ必要なのか？

CRA は内部の設定（webpack, Babelなど）を隠しており、デフォルトではユーザーが直接変更することができません。  
設定を変更するには `eject` を使う必要がありますが、これを使うと構成ファイルが大量に展開され、管理が複雑になります。

`react-app-rewired` を使えば、**`eject` せずに設定を上書き（オーバーライド）** することが可能です。

---

## 基本的な使い方

### 1. インストール

```terminal
npm install react-app-rewired --save-dev
```

### 2. スクリプトの変更（package.json）

```json
"scripts": {
  "start": "react-app-rewired start",
  "build": "react-app-rewired build",
  "test": "react-app-rewired test"
}
```

### 3. `config-overrides.js` を作成

プロジェクトルートに `config-overrides.js` ファイルを作成し、設定をカスタマイズします。

```javascript
// config-overrides.js
const path = require('path');

module.exports = function override(config, env) {
  config.resolve.alias = {
    ...config.resolve.alias,
    '@': path.resolve(__dirname, 'src'),
    "react/jsx-runtime": require.resolve("react/jsx-runtime.js"), // などなど
  };
  return config;
};
```
---

## よく一緒に使われるライブラリ：`customize-cra`

`react-app-rewired` 単体でも使えますが、`customize-cra` を併用すると簡潔に設定ができます。



## 注意点

- `react-app-rewired` は CRA の**公式な機能ではありません**。
- CRA v5 以降では webpack 5 が導入され、一部の設定がうまく動作しない場合があります。
- 代替として [CRACO](https://github.com/dilanx/craco) が人気で、より活発にメンテナンスされています。

---
【プライベートサブネット】EC2インスタンスでセッションマネージャーを利用する

プライベートサブネット上のEC2インスタンス（プライベートインスタンス）へ
セッションマネージャーを利用してコンソール接続するための環境設定手順です。
本当に必要な最低限の設定を調べたので共有します。

# セッションマネージャーとは

SSH&キーペアを使用せずSSMという通信を使用してブラウザでシェルの操作ができます。
EC2 Instance ConnectやSSHクライアントとは異なり、パブリックIPアドレスが不要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079386/e0955fe6-76de-40d6-ac6d-bd10d12fafc7.png)





# 前提条件
・VPCおよびプライベートサブネットを作成済み
・EC2インスタンスを上記に作成済み
　※SSMエージェントがインストールされているAMIを使用
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079386/2d15a6d0-3240-4d8d-a156-5bfb26b8389f.png)
　「Amazon Linux 2」は含まれています。


・EC2インスタンスに紐づくセキュリティグループは
　アウトバウンド：HTTPS(443)を許可。
　通常はすべてのトラフィックを許可しているかと思います。
　ステートフルですのでインバウンドは特に追加不要です。


# 環境設定
## IAMロールを作成しEC2インスタンスにアタッチする
「AmazonSSMManagedInstanceCore」というポリシーを追加したIAMロールを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079386/d4a5250a-4439-4ef6-aae9-56e5fbc717cd.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079386/0b798b63-0c74-436c-bc0d-ae2d885cca06.png)

作成したIAMロールをEC2インスタンスにアタッチします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079386/306c5b74-ab4e-45c2-b818-8f1dd1a5ea50.png)



SSMを利用するにあたり、IAMロールアタッチ後はEC2インスタンスの再起動が必要と情報あります。
時間がかかるだけで再起動せずとも問題ないかもしれません。

## VPCエンドポイントを作成する
プライベートサブネットにVPCエンドポイントを作成します。

なお「com.amazonaws.ap-northeast-1.ssm」「com.amazonaws.ap-northeast-1.ssmmessages」の２つのサービスが必要となりますが、
１つのエンドポイントに１サービスしか選択できないため、
２つエンドポイントを作成することになります。

### （１）SSM用VPNエンドポイントで使用するセキュリティグループ

インバウンド：HTTPS(443)　アウトバウンド：すべての通信　の
セキュリティグループを作成しておいてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079386/53cccd51-961a-4bf7-bfc6-b65a03a47e8c.png)


### （２）「com.amazonaws.ap-northeast-1.ssm」用エンドポイント
「VPC」にてエンドポイントを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079386/c7109141-502a-4b0f-83fb-f3202070c765.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079386/2295504e-c7cb-4abd-86f5-d4d3bee8c68d.png)

対象のプライベートサブネットを指定してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079386/0072c803-4aba-4d92-9a96-84cc483f531a.png)

作成したセキュリティグループを指定してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079386/ff688748-0976-4084-bded-09e2962ad187.png)


### （３）「com.amazonaws.ap-northeast-1.ssmmessages」用エンドポイント
同じ要領で作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079386/110965ac-3064-4f3a-bc7b-1572b71622cd.png)

### デフォルトのセキュリティグループを使用したらどうなるか？
VPCエンドポイントを作成する際、セキュリティグループを指定しない場合、defaultが使用されます。
インバウンドを見て一見問題ないんじゃないの？と思いましたが、ソースが自セキュリティグループとなっています。
これではEC2インスタンスへHTTPS(443)の通信が届きません。
なのでこちらでHTTPS(443)を許可することもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079386/2eef80d7-0fc2-44ce-bbf4-90347e228b76.png)


# 動作確認
無事に接続できるようになりました。
できない場合、時間を置くかインスタンスを再起動してみてくださ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079386/7027867e-04c5-47b7-adea-fcdc4cc93c3f.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079386/ec1276aa-940e-4caa-a40f-ebf60f2808e2.png)
課題でわからない言葉メモ


##### ポート番号: 
ネットワーク上で通信を行う際、プロセスごとに割り当てられる識別用番号。サーバーやアプリケーションがどのサービスへの通信かを判断するための「ドア」に相当します。

##### URLマッピング: 
クライアントからのURLリクエストを、対応するサーブレットやコントローラなどの処理コンポーネントに紐付ける仕組み。

##### マッピングの重複／競合: 
同一のURLパターンに対して複数のマッピング定義が存在し、どちらを適用すべきか不明瞭になっている状態。

##### コントローラ: 
MVC（Model–View–Controller）アーキテクチャにおいて、ユーザーからの入力を受け取り、処理を振り分ける役割を担うコンポーネント。

##### アーキテクチャ: 
ソフトウェアやシステム全体の構造・設計思想のこと。コンポーネント間の関係性やデータフローを規定します。

##### フレームワーク: 
アプリケーション開発のための共通機能や構造を提供し、開発効率を高める土台となるソフトウェアライブラリ。

##### サーブレット:
Javaで実装されたサーバーサイドプログラムで、HTTPリクエストを受け取り動的にレスポンスを生成する。

##### JSP直叩き: 
ブラウザからJSPファイルへ直接リクエストを送り、サーブレットを経由せずに処理・表示を行うこと。

##### ロジック: 
プログラム内で行われる一連の処理手順やアルゴリズム。

##### ビルドエラー: 
ソースコードのコンパイルやリンク処理中に発生し、実行可能プログラムが生成できないエラー。

##### コンパイル: 
人間が読めるソースコードを機械語（バイトコード）に変換する処理。

##### リンク:
複数のコンパイル済みコードやライブラリを結合し、実行可能プログラムを生成する処理。

##### 継承／オーバーライド:
オブジェクト指向において、子クラスが親クラスの機能を引き継ぎ（継承）、必要に応じて親のメソッドを再定義して振る舞いを上書きする（オーバーライド）仕組み。

##### ワイルドカード型: 
ジェネリクスで任意の型を扱うためのプレースホルダー記号（例: List<?>）。

自分用にメモでした。
いろんなアルゴリズム"00.00.00.16"

[知恵の館の目次](https://qiita.com/rionQ/items/0ba7a700620a1d617bc6)
# 立ち位置・仕様
* いろんなアルゴリズムをコピペできるように記録するのみ
* 最適化が目的でない
* たまにメモとして解説を残す
* 最低限でまとめる
* データを抽出しやすいように個別のIDを付与
* あるアルゴリズムにおいて、他のアルゴリズムが登場する際にはそのIDを付与
* IDは16進数表記
* なるべく最低限なパッケージで実装
* なるべく特殊なオブジェクト型は使用しない

# TargetID
00.00.00.16

# ReferenceID

# swiched run length encoding
* "同じ数値が連続する場合"と"隣接する数値が異なることが連続する場合"とでモードを交互に切り替える方法
* AAAABBBBのような場合、4A04Bというようになる。4A04B内の0は、隣接する数値が異なることが連続する場合"がないため、"何も無い"という数値が0個あるというような解釈となる。
* 同じ数値が連続する場合：例 AAAAA
* 隣接する数値が異なることが連続する場合：例 ABCBA
```python:
def getPacBits(string, index):
	max_count = len(string) - index
	count = 0
	code = string[index]
	index += 1
	count += 1
	encodeMode = None

	if code == string[index]:
		encodeMode = 0
		while index < len(string) and code == string[index] and count < max_count:
			code = string[index]
			index += 1
			count += 1
	else:
		encodeMode = 1
		while index < len(string) and code != string[index] and count < max_count:
			code = string[index]
			index += 1
			count += 1

		if index != len(string):
			index -= 1
			count -= 1
	return (count, index, encodeMode)

def switchedRunLengthEncoding(string):
	encode_list = []
	index = 0
	mode = 1
	while index < len(string) - 1:
		baseIndex = index
		count, index, encodeMode = getPacBits(string,index)

		if mode == 0:
			mode = 1
			if encodeMode == 1:
				encode_list.append(0)
				index = baseIndex
			else:
				# 同じ数値が連続する方は、2以上であるはずだから、count-1で表現することがある
				# (count, 数値)となることや(数値, count)となることや，それぞれで異なることがある
				encode_list.append((count, string[baseIndex])) 
		else:
			mode = 0
			if encodeMode == 0:
				encode_list.append(0)
				index = baseIndex
			else:
				encode_list.append((count,string[baseIndex:index])) 
	
	encode_string = ""
	for d in encode_list:
		if type(d) == int and d == 0:
			encode_string += str(d)
		else:
			encode_string += str(d[0])+str(d[1])
	
	return encode_string
```

# 使用方法
```python:
string = "AAAABCCCCABCAAA"
l = switchedRunLengthEncoding(string)
print(l) # 04A1B4C3ABC3A
```
【React / Next.js】include a call to the setupDevPlatform function in your config file の解決方法について

# はじめに
udemyのNext.jsハンズオンでデータベースから情報を取得する実装中に下記のエラーに遭遇しましたので、こちらの解決方法について記事にします。
前提条件として、ハンズオンではSupabaseによるAPIでのデータを取得しておりますが、今回CloudflareのD1で試みております。

エラー内容：

:::note warn
For local development (using the Next.js dev server) remember to include
a call to the `setupDevPlatform` function in your config file.

For more details visit:
https://github.com/cloudflare/next-on-pages/tree/3846730c/internal-packages/next-dev
:::

翻訳：ローカル開発（Next.js 開発サーバーを使用）の場合は、設定ファイルに `setupDevPlatform` 関数の呼び出しを含めることを忘れないでください。

詳細については、以下をご覧ください。
https://github.com/cloudflare/next-on-pages/tree/3846730c/internal-packages/next-dev

初期化ができていなかったようでした。

以下を追加

```.next.config.ts
if (process.env.NODE_ENV === "development") {
  require("@cloudflare/next-on-pages/next-dev").setupDevPlatform();
}
```
※ next.config.mjsなら

```.next.config.mjs
if (process.env.NODE_ENV === 'development') {
	setupDevPlatform();
}
```


# おわりに
これでこちらのエラーは解決することができました。

# JISOUのメンバー募集中！
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？
興味のある方は、ぜひホームページをのぞいてみてください！
▼▼▼

https://projisou.jp
UML入門　参考文献

# 3
・ウォーターフォールモデル（@IT情報マネジメント用語辞典） http://www.atmarkit.co.jp/aig/04biz/waterfall.html ・Winston Royceの論文 『Managing the Development of Large Software Systems』 Winston W. Rovce, Proceedings of IEEE Westcon, August 1970 http://www.cs.umd.edu/class/spring2003/cmsc838p/Process/waterfall.pdf

竹政 昭利; 林田 幸司; 大西 洋平; 三村 次朗; 藤本 陽啓; 伊藤 宏幸. かんたん UML入門［改訂2版］ (p.589). 株式会社技術評論社. Kindle 版. 
# 4 
・UML 2.4.1 仕様書 http://www.omg.org/spec/UML/2.4.1/Superstructure/PDF/ 
・UML 2.5仕様書
http://www.omg.org/spec/UML/2.5/PDF/ 

・『UMLモデリング教科書UMLモデリングL2 第２版』 桐越 信一、国正 聡、竹政 昭利、照井 康真、橋本 大輔 著　翔泳社 ・『OMG認定UML試験Fundamental対応UML速習リファレンス』 株式会社豆蔵、株式会社ピーエイ著、オブジェクトテクノロジー研究所 監修　ソフトバンククリエイティブ ・『実践UML 第３版 オブジェクト指向分析設計と反復型開発入門』 クレーグ・ラーマン著、依田 光江 訳、今野 睦、依田 智夫 監訳　ピアソンエデュケーション
# 7
・『その場でつかえるしっかり学べるUML2.0』 オージス総研オブジェクトの広場編集部 著、山内 亨和 監修　秀和システム ・『UMLモデリングのエッセンス第3版』 マーチン・ファウラー 著、羽生田 栄一 翻訳　翔泳社 
・『すぐに使えるUML事典』 竹政昭利 著　ナツメ社
山内 亨和 監修　秀和システム ・『UMLユーザーガイド』 グラディ・ブーチ 著、羽生田 栄一 監訳　ピアソン・エデュケーション

# 9
・『組み込みUML─eUMLによるオブジェクト指向組み込みシステム開発』 渡辺博之、堀松和人、渡辺 政彦、渡守武和記著　翔泳社 
・『ダイアグラム別UML徹底活用 第2版』 井上 樹 著　翔泳社
Wi-FiをAndroidを経由してPCに分配する (NetShare)

# 目的

スマホでアクセスしたWi-FiをPCに分配することができれば、接続台数の制限やパケットの制限など様々なシーンで活躍すると考えます。

# 手順
1. このアプリをAndroidにインストールします。

https://play.google.com/store/apps/details?id=kha.prog.mikrotik&hl=ja&pli=1

## Androidの設定
アプリをスタートして、`Start Wi-Fi Hotspotを押します。

## PCでの操作
PC側で表示されたSSIDに接続し、表示されたパスワードで接続します。
mac, windowsはスマホに記載のリンクを辿ってセットアップ完了です。

## Linuxの場合
環境変数でproxyを当てます。

```sh
export http_proxy=http://192.168.49.1:8282
export https_proxy=http://192.168.49.1:8282
```

適宜run_commandに設定してください。

また、Google Chromeとか実行したい場合は

```
google-chrome --proxy-server="http://192.168.49.1:8282"
```

を入力することでChromeでも接続できます。
bridge pointの使い方

Bridg　Pointをインストールしても、
動かし方がわからない。

BridgePointのサンプルプロジェクトを試す
https://qiita.com/kuboaki/items/0b2086b5bf578a8283f5

同じ画面にならない。

プロジェクトでNEWして、ファイルをImportしようとしてもうまくいかない。

該当するプロジェクトを直接ひらこうとしてもひらかない。
UML tool web

UMLやER図からプログラミングコードを生成するウェブサービス
https://www.genspark.ai/spark/uml%E3%82%84er%E5%9B%B3%E3%81%8B%E3%82%89%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E3%82%A6%E3%82%A7%E3%83%96%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9/11f2d477-3bd3-4f8e-8128-09f878bf87c6

UML モデルからのソース・コードの生成
https://www.ibm.com/docs/ja/rbd/9.5.1?topic=developing-generating-source-code-from-uml-models

11種類のソースコードを自動生成できる新UMLツールが登場
https://xtech.nikkei.com/it/free/NC/NEWS/20010926/1/

# AUTOSAR
UML Profile for AUTOSAR
https://www.autosar.org/fileadmin/standards/R2.1.20/CP/AUTOSAR_UML_Profile.pdf

Basic Software UML Model
https://www.autosar.org/fileadmin/user_upload/standards/classic/19-11/AUTOSAR_MOD_BSWUMLModel.zip

# PlantUML
一目でわかるPlantUML
https://plantuml.com/ja/

PlantUML
https://qiita.com/kaizen_nagoya/items/cb6802e6c7903efd1b46

Understand APIとPlantUMLを使ってC/C++のソースコードからシーケンス図を生成する
https://qiita.com/tomozoo3106/items/afb4491dc5723fe4c532

既存コードからシーケンス図を作成する方法
https://www.genspark.ai/spark/%E6%97%A2%E5%AD%98%E3%82%B3%E3%83%BC%E3%83%89%E3%81%8B%E3%82%89%E3%82%B7%E3%83%BC%E3%82%B1%E3%83%B3%E3%82%B9%E5%9B%B3%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/65afcde3-f7c1-4a3c-8aae-1fffa85b8269

C言語　シーケンス図　自動生成
https://cwnicol.hatenablog.com/entry/2016/07/16/205231

GIthub jupe/puml2code 
https://github.com/jupe/puml2code

# おすすめ

## open source
【2025年版】無料オープンソースのUMLエディタ おすすめ12選を徹底解説！
https://notepm.jp/blog/21305

Eclipse Papyrus
https://eclipse.dev/papyrus/


## web UML
おススメのUML図作成サイト6選
https://www.edrawsoft.com/jp/uml-diagram-online-generators.html

https://www.edrawmax.com/online/jp

https://www.lucidchart.com/pages/

https://www.drawio.com/

https://creately.com/

https://www.gliffy.com

https://cacoo.com/ja/

WEB上でシーケンス図を描けるツールUML Sequence Diagram Online Toolを使おう！
https://qiita.com/yucatio/items/507549bb3c48d73cbdab


# other tools
コードからの依存関係図の作成
https://learn.microsoft.com/ja-jp/visualstudio/modeling/create-layer-diagrams-from-your-code?view=vs-2022
猿でもわかるAIビジネス活用シリーズ 🐵📊人材採用にAIを活かす！面接・選考の自動化とは？

 

## 人材採用にAIを活かす！面接・選考の自動化とは？


### 🧩 はじめに：採用の現場における課題

人材採用は企業にとって最も重要な業務の一つですが、同時に最も非効率になりがちな領域でもあります。
大量の応募書類に目を通し、限られた時間で候補者を評価し、面接を調整するーー。人事担当者は日々、膨大なタスクに追われています。

> そんな中、AIによる「選考プロセスの自動化」が注目を集めています。

この記事では、**実際のAIモデルとコード例**を交えながら、AIを活用した面接・選考の自動化について、わかりやすく・実践的に解説していきます。

---

### 🧠 AIでできること：採用プロセスのどこに効く？

AIは採用業務の中で、以下のような領域で活用されています：

| プロセス | 活用例                     |
| ---- | ----------------------- |
| 書類選考 | 応募書類のスクリーニング、自動スコアリング   |
| 面接   | 自動面接ボット、表情・発話解析による評価    |
| 評価分析 | 過去の採用成功者との類似度分析、離職リスク予測 |

今回はこの中でも特に **「自動面接ボット」×「自然言語処理（NLP）」** にフォーカスして、以下のようなシナリオを構築してみましょう。

---

### 🔧 実践例：ChatGPT API + LangChain で作る「AI面接官」

#### 🗂️ 目標

候補者と対話し、以下の観点で評価を行うAI面接官を構築：

* 基本的なコミュニケーション能力
* 志望動機と職務経験の整合性
* ロジカルシンキング

#### 🧰 使用技術スタック

| 項目       | 技術                               |
| -------- | -------------------------------- |
| 言語       | Python 3.10                      |
| NLPライブラリ | OpenAI Chat API（GPT-4）、LangChain |
| フレームワーク  | Streamlit（Web UI用）               |
| その他      | pandas（評価スコアの記録）                 |

#### 📦 セットアップ

```bash
pip install openai langchain streamlit pandas
```

#### 🧪 コード例（抜粋）

```python
# ai_interviewer.py
import openai
from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage
import pandas as pd

openai.api_key = "sk-..."

llm = ChatOpenAI(model="gpt-4", temperature=0.3)

# 面接シナリオを構築
questions = [
    "自己紹介をお願いします。",
    "これまでの職務経験について教えてください。",
    "なぜ当社を志望されたのですか？",
    "最近、困難を乗り越えた経験はありますか？"
]

scores = []

for q in questions:
    print(f"[AI面接官] {q}")
    answer = input("あなた: ")
    eval_prompt = f"""
候補者の回答: 「{answer}」
この回答を以下の観点で5点満点で評価してください：
- 論理性
- 誠実性
- コミュニケーション力

フォーマット: 論理性: x点, 誠実性: x点, コミュニケーション力: x点
    """
    response = llm([HumanMessage(content=eval_prompt)])
    print(f"[評価結果] {response.content}")
    scores.append(response.content)
```

#### 🎮 実行イメージ

```text
[AI面接官] 自己紹介をお願いします。
あなた: はじめまして。営業として3年間働いており、顧客との信頼構築に自信があります。
[評価結果] 論理性: 4点, 誠実性: 5点, コミュニケーション力: 5点
```

---

### 💡 現場のTips：実運用に向けたアドバイス

#### ✅ 効果的な質問設計のポイント

* **抽象と具体をバランスよく**：抽象的な質問ばかりでは評価が難しくなります。
* **意図を明示する**：AIが質問の目的を理解できるよう、プロンプトで指示を補足しましょう。

#### ⚠️ よくあるミス

* **評価基準が曖昧**：プロンプトの評価基準を明確にしないと出力がブレます
* **バイアスの混入**：AIの学習データに偏りがあると、性別・学歴などに無意識のバイアスが出る恐れあり

---

### 🚀 応用アイデア：他のAIサービスとの連携

* **表情分析API**（例：Amazon Rekognition）と組み合わせて、非言語的な反応も評価対象に
* **履歴書自動スコアリング**：テキストからスキル抽出し、職種マッチ度を算出
* **Slack連携**：Slack上でAI面接が行えるBotを開発（社内利用向け）

---

### 🧾 まとめ：AI面接の可能性と限界

#### ✅ メリット

* 時間・コストの削減
* 評価基準の統一化
* データドリブンな意思決定

#### ❗ 注意点

* バイアスの除去には工夫が必要
* 最終判断は人間によるチェックが不可欠
* コンプライアンスや個人情報保護への配慮

---

### 🌈 今後の展望

AIによる選考は「人を機械的に選別する仕組み」ではなく、**人間とAIが協働してより良いマッチングを実現する手段**として捉えるべきです。

今後は、**人間らしさを補完するAI**が主流となり、企業文化や価値観にフィットする人材を見極める支援ツールとして進化していくでしょう。

---

📎 次回のシリーズでは、**AIチャットボットは本当に使える？導入のメリットと注意点**を深掘りしていきます。お楽しみに！
夜間メンテナンスの心得

BtoCで運用しているwebサービスは特性上、中々まとまったメンテ時間をとる事が難しいです。
来週夜間メンテが控えているので、初心に帰るつもりで記事化してみました。
なんとなくエンジニアになってから、メンテ要員に選ばれることが多い気がしなくもない。

# 1. 事前計画と準備

**手順書の作成**：
メンテナンスの目的、手順、スケジュールを明確にし、関係者に共有を行います。
スケジュール（というかメンテ時間）に関しては攻め攻めだと大体ろくな事がありません。
また、手順書に関しても時間的に高確率で頭が働いていない状態で挑むので、コピペで実行できる状態にしておくのがベターです。

**バックアップの取得**：
万が一のトラブルに備えて、必要があればバックアップを事前に取得しておきます。

**リソースの確認**：
日中に行ったことがない作業をする場合、必要なツールやアクセス権限が揃っているか確認します。
業務で使うPCを変えたばかりの時は結構な確率で何か発生します。

**リスクの評価**：
メンテナンスによるリスクを事前に評価し、必要があれば対策を考えます。

# 2. コミュニケーション
**関係者への通知**：
メンテナンスの日時、影響範囲、目的を事前に通知します。
取引先に関しては関連する人に連絡をお願いします。

**緊急連絡先の共有**：
トラブル発生時に迅速に対応できるよう、連絡先を確認します。
みんな寝てるので令和ですが容赦なく直電です。

# 3. メンテナンス実施

指定された時間にちゃんと出社する。

**手順の遵守**：
計画書に従って、手順を一つ一つ確認しながら進めます。
会社やチームの文化、メンテの目的に因って、
・**テストの時間を多めに割いて不具合が起きる可能性を減らす**
・**最低限のテストをしてリリースし、なにかあったらすぐ切り戻す**
を使い分ける感じですが、ここ最近は前者を選択する事が殆どです。
個人的には……内容による!!!!!

**ログの記録**：
作業中の変更や問題を詳細に記録し、後でのトラブルシューティングに備えます。
掛かった時間も残しておけば次回以降の計画を立てる際に役立ちます。

# 4. テストと確認
**動作確認**：
メンテナンス後にシステムが正常に動作するか確認します。
特に、主要な機能やサービスが問題なく稼働するかをチェックします。
hostsを書き換えたり、会社のIPだったらメンテナンス中でもフロントを確認可能だったり…等、色々と方法はあります。

**担当者に確認**：
必要に応じて、担当者に確認を依頼し、問題がないかフィードバックをもらいます。
…が、よっぽどの内容でない限り、夜中に確認するだけの人はいないです。
少なくとも今まで自分が携わった環境ではそうでした。

# 5. フォローアップ
**資料のまとめ**：
メンテナンスの結果をまとめて関係者に共有します。
今のげんではメンテナンス実施時の時間の記録等がそのまま該当します。

**問題のフィードバック**：
メンテナンス中に発生した問題や改善点を次回活かすために記録し、チームで共有します。

# 6. 過去にやらかしたTIPS

**必要なカラム、テーブルを消す**：
夜間メンテでよくあるやらかしシリーズ。
メンテ明けですぐ気付く！という内容は殆どなく、だいたい1週間後とかに発覚する場合が多い。
テーブル名やカラム名をロジックで組み立てて作って処理を書くのは本当にギルティ。
レビューで積極的に弾いていく。

**テーブル定義の変更時に必要な設定の漏れ**：
はい、わたしは既存テーブルのautoincrementを消したことがある重罪人です。
その節は申し訳ありませんでした。

**特定のバージョン、文字コード等しか発生しないレアな不具合**：
なにかのバージョンを上げた時によく引っ掛かる。
~~こういうのを完璧を目指して拾うようにするとテストが膨大になるので正直交通事故~~

**実は正常だったのに上司（担当者）に鬼電した**：
頭が働いてないから…ある。
普段から良い人間関係を築いていれば大丈夫な筈。

**オフィスを最終退出する方法が解らなかった**：
1人だったのでメンテ終わったら帰っていいのにも関わらず、みんなが出勤するまで待った。
最終退出者になったこともなかった。
悲しいね。

# 7. 最後に

プロダクトやチームの文化によって異なるところは沢山あると思いますが、何かの参考になったら幸いです。
一緒にメンテ作業をした人とは何となく絆が深まった感じもします。
それはそれとして今のプロダクトも個人的には3～4ヵ月に1回くらいで計画的にメンテ入れたい…。
なんとかなりませんか＞偉い人
c puzzle book op5.c



```c:op5.c
//  Y.Y.
#include<stdio.h>
#define PRINT(int) printf("int = %d\n",int)

int main()
{
	int x=1,y=1,z=1;

	x += y += z;//右から計算する 1:y = 2   2:x = 3
	PRINT( x < y ? y : x); //(x < y) これが真であればy 偽であればx


	PRINT( x < y ? x ++ : y ++);// x = 4  y = 3
	PRINT(x); PRINT(y);

	PRINT(x += x < y ? x ++ : y ++);
	PRINT(y); PRINT(x);


	x=3, y=z=4;
	PRINT( (x >= y >= x) ? 1 : 0 );
	PRINT( x >= y && y >= x); //偽だから0を返す
}

/*
int = 3
int = 2
int = 3
int = 3
int = 6
int = 4
int = 6
int = 0
int = 0
*/
```
【React / Next.js】 Error: can only be run inside the edge runtime の解決方法について

# はじめに
udemyのNext.jsハンズオンでデータベースから情報を取得する実装をしたところで下記のようなエラーに遭遇しましたので、こちらの解決方法について記事にします。
前提条件として、ハンズオンではSupabaseによるAPIでのデータを取得しておりますが、今回CloudflareのD1で試みております。

# エラー内容
:::note warn
Error: `getRequestContext` and `getOptionalRequestContext` can only be run
inside the edge runtime, so please make sure to have included
`export const runtime = 'edge'` in all the routes using such functions
:::
 

翻訳すると以下の内容のようでした。
エラー: `getRequestContext` と `getOptionalRequestContext` は Edge ランタイム内でのみ実行できます。そのため、これらの関数を使用するすべてのルートに `export const runtime = 'edge'` が含まれていることを確認してください

CloudfrareのD1などを使う時はEdge Runtimeで動かす必要があるようです。

こちらをapiディレクトリファイルに追加

```.ts
export const runtime = 'edge';
```

# 参考
https://nextjs.org/docs/app/building-your-application/rendering/edge-and-nodejs-runtimes

https://zenn.dev/takiko/scraps/99d7ec3bda94ac

# おわりに
これでとりあえずエラーは解決することができました。

# JISOUのメンバー募集中！
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？
興味のある方は、ぜひホームページをのぞいてみてください！
▼▼▼

https://projisou.jp
AWS × Docker × Spring Boot × PostgreSQL の TCP KeepAlive 設定完全ガイド

# AWS × Docker × Spring Boot × PostgreSQL の TCP KeepAlive 設定完全ガイド

AWS環境でSpring Boot（Java）とPostgreSQLをDockerで運用していると、**「タイムアウトで接続が切れる」「アプリが不安定になる」**といった問題が発生することがあります。

その原因の一つが、**TCP接続がアイドル状態で切断されてしまうこと**です。

本記事では、その対策として有効な **TCP KeepAlive の設定方法** を、以下の4レイヤーに分けて解説します。

---

## 設定すべき4つのレイヤー

| レイヤー         | 内容                                   |
|------------------|----------------------------------------|
| OS（ホスト）     | TCP KeepAliveのカーネルパラメータ設定 |
| Docker コンテナ  | sysctlによるコンテナ内の設定           |
| Javaアプリ       | JDBC URLでKeepAliveを有効にする       |
| PostgreSQL側     | サーバーのKeepAliveパラメータ設定     |

---

## 1. ホストOS（EC2など）での設定

LinuxカーネルのTCP KeepAlive設定を変更します。

### `/etc/sysctl.conf` に追記：

```bash
net.ipv4.tcp_keepalive_time = 60
net.ipv4.tcp_keepalive_intvl = 10
net.ipv4.tcp_keepalive_probes = 5
```

設定を反映：

```bash
sudo sysctl -p
```

---

## 2. Dockerコンテナの設定

Docker Compose で sysctl の値をコンテナに渡すことができます。

### `docker-compose.yml` の例：

```yaml
services:
  app:
    image: my-springboot-app
    sysctls:
      - net.ipv4.tcp_keepalive_time=60
      - net.ipv4.tcp_keepalive_intvl=10
      - net.ipv4.tcp_keepalive_probes=5
```

> 一部の環境では `cap_add: SYS_ADMIN` や `privileged: true` が必要になることがあります。

---

## 3. Javaアプリ（Spring Boot）での設定

PostgreSQL JDBCドライバは、URLに `tcpKeepAlive=true` を指定することで、TCP KeepAliveを有効化できます。

### `application.properties` の設定例：

```properties
spring.datasource.url=jdbc:postgresql://your-db-host:5432/yourdb?tcpKeepAlive=true
spring.datasource.username=your-username
spring.datasource.password=your-password
```

### `application.yml` の場合：

```yaml
spring:
  datasource:
    url: jdbc:postgresql://your-db-host:5432/yourdb?tcpKeepAlive=true
    username: your-username
    password: your-password
```

---

## 4. PostgreSQLサーバーの設定

PostgreSQLでも接続維持のためのパラメータが用意されています。

### `postgresql.conf` の例：

```conf
tcp_keepalives_idle = 60
tcp_keepalives_interval = 10
tcp_keepalives_count = 5
```

> **注意**：AWS RDS や Aurora PostgreSQL を利用している場合は、パラメータグループでの設定が必要です。RDS コンソールから該当インスタンスのパラメータグループを編集してください。

---

## AWSでの追加考慮事項

- **セキュリティグループの設定**：長時間接続があっても遮断されないように、セキュリティグループでタイムアウトやポート制限を確認しておきましょう。
- **RDSのパラメータグループ**：上記のPostgreSQL設定は、RDSでは`DBパラメータグループ`で管理します。編集後はRDSの再起動が必要です。

---

## まとめ

TCP KeepAlive を正しく設定することで、以下のようなメリットがあります。

- コネクションが不意に切れる問題の防止
- コネクションプールの安定運用
- ネットワーク障害時の早期検知

各レイヤーでしっかりと設定を行い、安定した通信を確保しましょう。
c puzzle book op4.c

What does the following program print?

```c:op4.c
#define PRINT(int) printf("int = %d\n",int)
main()
{
	int x, y, z;

	x = 03; y = 02; z = 01;
	PRINT( x : y & z );	// (Operators 4.1)
	PRINT( x : y & ~z );	// (Operators 4.2)
	PRINT( x ^ y & ~z );	// (Operators 4.3)
	PRINT( x & y && z );	// (Operators 4.4)

	x = 1; y = -1;
	PRINT( !x : x );	// (Operators 4.5)
	PRINT( ~x : x );	// (Operators 4.6)
	PRINT( x ^ x );		// (Operators 4.7)
	x <<= 3; PRINT(x);	// (Operators 4.8)
	y <<= 3; PRINT(y);	// (Operators 4.9)
	y >>= 3; PRINT(y);	// (Operators 4.10)
}

```

```sh:bash
$ gcc pazuru4.c
pazuru4.c:1:1: error: unknown type name ‘What’
    1 | What does the following program print?
      | ^~~~
pazuru4.c:1:11: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘the’
    1 | What does the following program print?
      |           ^~~
pazuru4.c:1:11: error: unknown type name ‘the’

```


```op4a.c
#include <stdio.h>
#define PRINT(int) printf("int = %d\n",int)

void main(void)
{
        int x, y, z;

        x = 03; y = 02; z = 01;
        PRINT( x | y & z );     // (Operators 4.1)
        PRINT( x | y & ~z );    // (Operators 4.2)
        PRINT( x ^ y & ~z );    // (Operators 4.3)
        PRINT( x & y && z );    // (Operators 4.4)

        x = 1; y = -1;
        PRINT( !x | x );        // (Operators 4.5)
        PRINT( ~x | x );        // (Operators 4.6)
        PRINT( x ^ x );         // (Operators 4.7)
        x <<= 3; PRINT(x);      // (Operators 4.8)
        y <<= 3; PRINT(y);      // (Operators 4.9)
        y >>= 3; PRINT(y);      // (Operators 4.10)
}


/*
int = 3
int = 3
int = 1
int = 1
int = 1
int = -1
int = 0
int = 8
int = -8
int = -1
*``````
```
【Rails初学者】初学者が知りました「ざっくり学んだログインの仕組み。SessionやCookieについて」

# 初学者が知った「ざっくり学んだログインの仕組み。SessionやCookieについて」

こんにちは。
Railsでアプリ開発を始めたばかりの初学者です。  
最近やっと「ログインってどう動いてるのだろうか」という仕組みを少しずつ理解してきたので、
自分用のメモもかねて、記載しました。

---

## そもそも「ログイン」って何だろか？

ユーザーが「自分はこの人です」とサーバーに伝えて、  
サーバーが「あ、あなたですね！OK」と認めること。

---

## ログイン処理って実際どうなってるのか

### 1. フォームに入力する
例えば
- メールアドレス：test@example.com
- パスワード：password123

### 2. サーバー側でユーザーを探す

```ruby
user = User.find_by(email: params[:email])
```
### 3. パスワードが一致するか確認
```ruby
user.valid_password?(params[:password])
```
- パスワードはハッシュ化される（元に戻せない）

## CookieとSessionのざっくり理解
### Cookie（クッキー）とは？
ブラウザに保存される小さなデータである
- サーバーが「この人の情報を記録」とブラウザに渡す
- 次回以降、ブラウザが自動でそのメモ（クッキー）を送ってくれる

###  CookieとSessionの関係
- サーバーがユーザーを認証したら、セッションに情報を保存
- そのセッションIDを暗号化してクッキーに保存
- 次のアクセスでクッキーを見て、「この人はログイン中のあの人だ」と判断できる

## クッキーが残っている限りは、ログイン状態も続く
以下の場合は
- クッキーが消えるとログアウトされる
- 有効期限が切れてもログアウトされる
- サーバー側がセッションを破棄してもログアウトされる

## パスワードをそのまま保存しない理由
もしそのまま保存してたら、データベースが盗まれたとき大惨事になるため

## 学び
- ログインは「名乗る → 確認される → 認められる」
- Cookieはブラウザのメモ帳、Sessionはサーバーのメモ帳という感じ
- パスワードは絶対にそのまま保存しないこと
- クッキーがあるから、ログイン状態が維持される

------

まだまだ勉強中ですが、ざっくり理解したことをまとめました。
間違ってたらすみません。
Route 53 パブリックホストゾーン プライベートホストゾーン

### パブリックホストゾーン

パブリックホストゾーンは、**インターネットからアクセス可能なドメイン名**のDNSレコードを管理するために使用する。

**特徴:**
  - 公開性: インターネット上のすべてのDNSリゾルバーから参照できる。
  - 用途: ウェブサイト、メールサーバーなど、インターネット経由でアクセスされるリソースのDNS解決に利用される。
  - 登録: ドメイン登録事業者（レジストラ）で取得したドメイン名をRoute 53に登録して使用する。
  - 料金: ホストゾーンの作成と、発行するクエリ数に応じて課金される。

**設定項目:**
  - SOA (Start of Authority) レコード
  - NS (Name Server) レコード
  - A (Address) レコード
  - AAAA (IPv6 Address) レコード
  - CNAME (Canonical Name) レコード
  - MX (Mail Exchanger) レコード
  - TXT (Text) レコード (SPF, DKIMなど)
  - SRV (Service Location) レコード
  - PTR (Pointer) レコード
  - CAA (Certificate Authority Authorization) レコード

**利用シーン例:**
  - 会社のウェブサイト (`example.com`) の公開
  - メールサーバー (`mail.example.com`) の運用
  - APIサーバー (`api.example.com`) の公開

---

### プライベートホストゾーン

プライベートホストゾーンは、**Amazon VPC (Virtual Private Cloud) 内のリソース**のDNSレコードを管理するために使用する。インターネットからはアクセスできない。

**特徴:**
  - 非公開性: 指定したVPC内のリソースからのみ参照できる。
  - 用途: VPC内のEC2インスタンス、RDSデータベースなどのプライベートIPアドレスに対する名前解決に利用される。
  - VPCとの関連付け: 一つ以上のVPCと関連付ける必要がある。
  - 料金: ホストゾーン作成料 + 関連付けられたVPC数に応じた料金（クエリ数による課金なし）。

**設定項目:**
  パブリックホストゾーンと同様のDNSレコードタイプ（A、AAAA、CNAME、MX、TXT、SRVなど）を設定できる。

**利用シーン例:**
  - VPC内のインスタンス間のホスト名通信 (`internal-app-server`)
  - VPC内のアプリケーションからデータベースへのホスト名接続 (`mydb.internal`)
  - マイクロサービス間の内部通信

---

### パブリックホストゾーンとプライベートホストゾーンの比較

| 特徴             | パブリックホストゾーン                                 | プライベートホストゾーン                                   |
| ---------------- | ------------------------------------------------------ | -------------------------------------------------------- |
| **アクセス範囲** | インターネット全体                                       | 関連付けられたVPC内                                      |
| **主な用途** | 公開されたリソースのDNS解決                               | VPC内のリソースのDNS解決                                  |
| **ドメイン名** | インターネットで有効なドメイン名が必要                   | 任意のドメイン名（例：`.internal`、`.local` など）を使用可能 |
| **関連付け** | ドメイン登録事業者                                     | Amazon VPC                                             |
| **料金体系** | ホストゾーン作成料 + クエリ数に応じた料金               | ホストゾーン作成料 + 関連付けられたVPC数に応じた料金     |