OmniAICreator/Qiita-1.07M huggingface dataset:
📘  Vol.8.3：Struts2で作る共通レイアウトJSP 〜header/footerを使った再利用設計〜

本記事は、Struts2でJSPを書く際に頻出するタグの基本を網羅する  
**📘「Vol.8.0〜8.7：Struts2 タグライブラリ入門編（基本操作・最低限の知識）」**　シリーズの一部です。

## ✅ 今回の目的

Struts2 + JSP開発において、**共通のヘッダー・フッターを外部ファイルとして分離**し、  
`<s:include>` タグを活用して**効率よくページ共通レイアウトを構築**する方法を解説します。

---

## 🔹 共通ヘッダー/フッターの意義

- **レイアウト統一**：すべての画面で同じ外観を保てる  
- **メンテナンス性UP**：ヘッダーの修正が1ヶ所で済む  
- **再利用性UP**：ログインユーザー表示・リンク・共通CSSの適用なども一括管理可能

---

## 📁 共通ファイルの作成

### `header.jsp`
```jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title><s:property value="pageTitle" default="掲示板システム" /></title>
    <link rel="stylesheet" href="<s:url value='/css/style.css' />" />
</head>
<body>
    <header>
        <h1>掲示板システム</h1>
        <p>
            ようこそ、<s:property value="#session.loggedInUser.user_name" default="ゲスト" /> さん |
            <a href="<s:url value='logout' />">ログアウト</a> |
            <a href="<s:url value='goToManagementMenu' />">管理メニュー</a>
        </p>
        <hr />
    </header>
```

---

### `footer.jsp`
```jsp
    <hr />
    <footer>
        <p>© 2025 BulletinBoard System. All rights reserved.</p>
    </footer>
</body>
</html>
```

---

## 📄 各画面での読み込み方法
```jsp
<s:include value="/view/common/header.jsp" />

<!-- ここに個別の画面コンテンツを記述 -->

<s:include value="/view/common/footer.jsp" />
```

---

## 💡 応用ポイント

| 要素                                | 内容                            |
| --------------------------------- | ----------------------------- |
| `pageTitle`                       | ヘッダーで `<title>` を個別に変えたいときに使用 |
| `#session.loggedInUser.user_name` | セッションのユーザー名を表示                |
| `<s:url>`                         | アクションベースのリンク生成（メニュー遷移、ログアウト等） |
| 共通CSS                             | `style.css` を一括読み込みして全体デザイン統一 |
---

## 🔚 まとめ
共通の`header.jsp`と`footer.jsp`を導入することで、ページレイアウトの統一・コードの再利用・メンテ性の向上が実現できます。
Struts2の `<s:include> `タグはその第一歩として非常に有効です。

📌 次回予定：
[📘 Vol.8.4：【Struts2】「s:action」「s:token」タグ徹底解説！〜アクション呼び出しと二重送信防止の最前線〜](https://qiita.com/juehara-crypto/items/6e54c3be0c35aa464724) では `<s:action>` や `<s:token>` を使ったセキュアなフォーム実装について解説予定です！

---
## 📚 関連記事（Vol.8シリーズ）

- [📘 Vol.8.0：【Struts2】OGNL入門　〜タグライブラリを支える最重要基礎技術〜](https://qiita.com/juehara-crypto/items/9b9558d46dfa5ac75224)

- [📘 Vol.8.1：【Struts2】タグライブラリの全体像と種類を把握する 〜JSP開発で使えるタグ一覧と役割まとめ〜](https://qiita.com/juehara-crypto/items/9635c8746d362496aef3)

- [📘 Vol.8.2：【Struts2】JSPタグライブラリ実践テンプレート集 〜現場で即使える！フォーム・URL・セッション活用まとめ〜](https://qiita.com/juehara-crypto/items/f57e473a85b2c9845730)

- [📘 Vol.8.4：【Struts2】「s:action」「s:token」タグ徹底解説！〜アクション呼び出しと二重送信防止の最前線〜](https://qiita.com/juehara-crypto/items/6e54c3be0c35aa464724)

- [📘 Vol.8.5：【Struts2】条件分岐タグ（s:if / s:else）徹底解説！ 〜表示制御と実務応用の決定版〜](https://qiita.com/juehara-crypto/items/d9883eae6585aa62b93e)


- [📘 Vol.8.6：【Struts2】画面部品の共通化！ s:include / s:component 徹底解説 〜JSPヘッダー/フッターの再利用でメンテ効率UP〜](https://qiita.com/juehara-crypto/items/b36801f70830d2c056aa)

- [📘 Vol.8.7：【Struts2】バリデーションUIの味方！ `<s:fielderror>` / `<s:actionerror>` / `<s:actionmessage>` 徹底ガイド 〜エラーメッセージの表示とフォーム連携の基本〜](https://qiita.com/juehara-crypto/items/b5bacb915f8baea2f2ec)

---
Elasticの各種オンデマンドトレーニングが期間限定で無償提供中（2025年7月31日まで）

2025年7月31日までの期間限定で、Elasticの各種オンデマンドトレーニングが期間限定で無償提供中です。
プロモーション対象になっているコースについてリンクを貼っておきますので、この機会を活用してぜひElasticのスキルを磨いてください！
（ただし全コース英語ですので、ついでに英語も勉強するつもりでトライしてみてください）

## Elasticsearch Engineer

エンジニア向けのElasticsearchトレーニングです。
Elasticsearchが提供する各種機能を直接APIを通して利用できるようになります。

https://www.elastic.co/training/elasticsearch-engineer

## Data Analysis with Kibana

Kibanaを通してデータ分析を行うためのトレーニングです。
ダッシュボードの作成やKibanaを利用したML機能の実装方法などが身に付きます。

https://www.elastic.co/training/data-analysis-with-kibana

## Elastic Observability Engineer

Elastic StackをObservabilityプラットフォームとして利用するためのトレーニングです。
Elastic Agentを利用したログ・メトリクスの収集からそれらの可視化や分析に至る一連のセットアップ方法などが身に付きます。

https://www.elastic.co/training/elastic-observability-engineer

## Elastic Security for SIEM

ElasticをSIEM基盤として利用するためのトレーニングです。
Elasticの基本的な使い方からKibanaが提供するセキュリティーの機能、およびElasticを利用した脅威ハンティングの方法までを学習することができます。

https://www.elastic.co/training/elastic-security-for-siem

## Elasticsearch Relevance Engine (ESRE) Engineer

ElasticsearchをAIアプリケーション開発基盤として利用するためのトレーニングです。
基本的な検索機能の実装方法からセマンティック検索やLLMとの連携など実践的なアプリケーション開発の流れを身につけることができます。

https://www.elastic.co/training/elasticsearch-relevance-engine-(esre)-engineer
構造的対話：ChatGPTと構造を育てる新しい使い方

# 構造的対話：ChatGPTと構造を育てる新しい使い方

> ※この記事は、ChatGPTなどの生成AIを日常業務や学習補助に活用している開発者・エンジニアを想定しています。
> 「AIとの対話をもっと効率的・継続的に活かしたい」と感じた方向けの実践例です。

## はじめに

ChatGPTを使い続けている中で、こんな風に思ったことはありませんか？

* 前に話したことを覚えていてほしい
* 同じ説明を何度もしなければならない
* 会話の続きをしたいのに、毎回文脈がリセットされる

これらは、GPTが記憶を持たない設計であることに起因します。ですが、ある構造を導入することで、これらの課題を **“構造そのもの”で克服する方法** があります。

それが、「構造的対話」という使い方です。

## 目次
- 構造的対話とは？
- なぜ「記憶」よりも「構造」が重要なのか？
- パスで文脈を呼び戻す：構造的再起動の例
- 再現性と精度を両立させる構造設計
- 応用領域の広がり
- まとめ
- リンクと参考リソース
- 試してみるには？
- よくある質問

## 構造的対話とは？

簡単に言えば、**「AIとの会話を“思考の構造体”として保存し、再起動・再展開可能にする方法論」** です。

* 会話をそのままセーブデータとして記録（ログ）
* ログの特定箇所を「パス」で指定し、再起動（文脈の復元）
* プロンプト設計により、思考スタイルや問い方を固定
* 他のAIやユーザーにも「構造ごと」引き継げる

この構造は、GitHub上に公開されている再利用可能なテンプレートで構成されており、誰でも自分の対話を「育てる」ことが可能です。

## なぜ「記憶」よりも「構造」が重要なのか？

従来のChatGPTの「メモリ機能」や「セッション継続」はあくまで“曖昧な記憶”です。対して、構造的対話は以下の特徴を持ちます：

* 明示的に「どの文脈を」「どこから」再開するかを指定できる
* 対話履歴は構造化され、必要なログだけを軽量に再読込できる
* 精度や親和性が、使えば使うほど向上する

その結果、GPTが本来苦手とする“長期的な話の継続”や“思考の蓄積”が実現可能になります。

## ✅ パスで文脈を呼び戻す：構造的再起動の例

GitHub上に保存したログには以下のようなファイルがあります：

* `logs/log_01_init.md`: 対話の起点
* `logs/log_03_finalize.md`: 構造的対話の定義が確定したタイミング
* `prompts/core_prompt.txt`: AIの初期指示（ロール・目的）

新しいセッションで次のように入力するだけで：

```
この対話は `logs/log_03_finalize.md` の続きを扱っています。
構造的対話の定義は確定済みで、次は応用について検討中です。
```

このように、**パス（構造の位置）を指定するだけで、文脈が即座に再現**されるのです。

## ✅ 再現性と精度を両立させる構造設計

構造的対話では、トークン制限や曖昧な記憶に頼る必要がありません。

* セッションをまたいでも再現性が保たれる
* GPT以外のAI（Gemini, Grok 等）にも同じ構造を渡して再現できる
* 一貫性のある視点・問い方が維持される

これは、「対話そのものがOSになる」ような使い方です。

## 応用領域の広がり：application\_fields.mdより

構造的対話は、以下のような分野に応用可能です：

| 分野     | 応用例                                |
| ------ | ---------------------------------- |
| 教育     | 生徒の問いや成長の追跡ログとして利用                 |
| 採用     | 候補者の思考プロセスを対話ログで可視化・共有可能に          |
| 創作     | 構造化された設定・プロンプト設計で作品やキャラを育成         |
| 知識継承   | 後任者や別チームへの引き継ぎに構造ログを再利用可能          |
| AI横断運用 | ChatGPT/Geminiなど複数AI間で“文脈ごと”引き継ぎ可能 |

この構造の本質は、「問いの再現性」や「知性の継承性」にあります。

## まとめ：なぜ今、構造的対話が必要なのか？

* 一回きりの“便利な応答”ではなく、**繰り返し育てて使える知性**が必要
* AIに“記憶”を求めるのではなく、**構造を設計し、パスで参照する**という視点
* それにより、**誰でも自分の思考パターンや協働AIを持てる時代**が到来する

構造的対話は、そのための一つの実践例であり、技術者だからこそ試せる“未来の標準”です。

---

## 🔗 リンクと参考リソース

* GitHub： [https://github.com/dvcampanula/structured-dialogue](https://github.com/dvcampanula/structured-dialogue)
* ログマップ： `log_index.md`
* プロンプト例： `prompts/core_prompt.txt`
* 応用一覧： `docs/application_fields.md`
* セッション参照例： `logs/log_03_finalize.md`

---

記事の内容が参考になった方は、ぜひGitHubのissueなどでフィードバックいただければ幸いです。



## 🧪 試してみるには？

1. GitHubの [structured-dialogue リポジトリ](https://github.com/dvcampanula/structured-dialogue) を開く
2. `prompts/core_prompt.txt` をコピーして、ChatGPTなどに貼り付ける
3. `logs/log_03_finalize.md` を参照する旨を記載し、対話を始める

> ✅ 実際の会話例や応用ログもすべて公開されています。

## ❓ よくある質問（FAQ）

### Q1. ChatGPT Plusでないと使えませんか？
A. 基本構造は無料版でも利用可能ですが、長文ログの扱いやメモリ機能には制限があります。

### Q2. 他のAI（GeminiやGrok）でも使えますか？
A. はい、構造ログと初期プロンプトを再利用すれば、別のAIでも構造的再起動が可能です。

## 📎 「構造的対話」という考え方にピンときた方は、こちらの元記事（note）も参考になるかもしれません：
👉 [“質問に答えるだけだったAIが、いつの間にか協働者になっていた”](https://note.com/dvcampanula/n/n42b58aa97ebe)
論理演算子JavaScript

自分の勉強のメモとして、簡単な使用例付き論理演算子をまとめます。

## どういう場面で使う？
論理演算子は「条件分岐」や「処理の分け方」でよく使います。

## 種類は４つ

### a && b 
aとbの両方が成立する

###  a || b 
aかbのどちらか1つが成立する

### !a
a以外なら成立する

### a ?? b
aがnullまたはundefinedならbが成立する


## 使い方の例

### a && b 
aとbの両方が成立する

```js
const a = 3;
const b = 5;

if (a > 0 && b > 0) {
  console.log("aとbは両方とも正の数です");
}
// → aとbは両方とも正の数です
```

###  a || b 
aかbのどちらか1つが成立する

```js
const isWeekend = true;
const isHoliday = false;

if (isWeekend || isHoliday) {
  console.log("今日はお休みです");
}
// → 今日はお休みです（どちらかがtrueなので）
```

### !a
a以外なら成立する

```js
const isLoggedIn = false;

if (!isLoggedIn) {
  console.log("ログインしてください");
}
// → ログインしてください
```


### a ?? b
aがnullまたはundefinedならbが成立する

```js
const name = null;
const displayName = name ?? "ゲスト";

console.log(displayName);
// → ゲスト
```


###
【Bash】２期間の間の連続した日付のリストを返す

## 関数

```bash
#!/bin/bash
set -o errexit # set -e
set -o nounset # set -u
set -o pipefail

# 2期間の間の日付の連番を返す
# Globals:
#   None
# Arguments:
#   begin YYYYMMDD
#   end YYYYMMDD
# Returns:
#   YYYYMMDD YYYYMMDD .. YYYYMMDD
function dateSeries() {
    local -r begin=$1
    local -r end=$2
    local -r begin_ut="$(date -d "${begin}" +%s)"
    local -r end_ut="$(date -d "${end}" +%s)"
    local -r interval="$(((end_ut - begin_ut)/(60*60*24)))"
    local dateList=()
    for days in $(seq 0 "${interval}"); do
        dateList+=("$(date +%Y%m%d -d "${begin} ${days}days")")
    done
    echo "${dateList[@]}"
}

# 配列として格納する場合
read -a array < <(dateSeries 20250320 20250410)
echo "${array[@]}"
# 20250320 20250321 20250322 20250323 20250324 20250325 20250326 20250327 20250328 20250329 20250330 20250331 20250401 20250402 20250403 20250404 20250405 20250406 20250407 20250408 20250409 20250410
```

## 解説

`date`コマンドの+%sでunix時間に直す(begin_ut, end_ut)。それを引き算し日数に変換して2期間の日数を求める(interval)。それをひとつづつ配列に格納する。
【Windows】 Excel 最低限おさえたいショートカットキーまとめ

# はじめに
この記事を開いていただきありがとうございます！
この記事では、Windows版Excelを効率的に使うために、**覚えておきたいショートカットキー**をまとめました。
ぜひ一つずつ試してみてください！

---

# 基本操作編（Ctrlキー中心）

| 操作内容 | ショートカットキー  |
| ---- | ---------- |
| 保存   | `Ctrl + S` |
| 開く   | `Ctrl + O` |
| 新規作成 | `Ctrl + N` |
| 印刷   | `Ctrl + P` |
| 元に戻す | `Ctrl + Z` |
| やり直し | `Ctrl + Y` |
| 全選択  | `Ctrl + A` |
| コピー  | `Ctrl + C` |
| 切り取り | `Ctrl + X` |
| 貼り付け | `Ctrl + V` |

---

# 移動・選択編（矢印キーやShift系）

| 操作内容         | ショートカットキー               |
| ------------ | ----------------------- |
| 最終データ行まで移動   | `Ctrl + ↓` / `Ctrl + ↑` |
| 最終データ列まで移動   | `Ctrl + →` / `Ctrl + ←` |
| セル範囲選択（データ行） | `Ctrl + Shift + ↓`      |
| セル範囲選択（すべて）  | `Ctrl + Shift + End`    |
| シート内を移動      | `PageUp` / `PageDown`   |
| 次のシートへ移動     | `Ctrl + PageDown`       |
| 前のシートへ移動     | `Ctrl + PageUp`         |

---

# グラフ・表操作編（レポート作成に便利）

| 操作内容         | ショートカットキー              |
| ------------ | ---------------------- |
| グラフを作成       | `Alt + F1`（現在のデータ範囲）   |
| 挿入タブを開く      | `Alt + N`              |
| テーブルの作成      | `Ctrl + T`             |
| フィルターの適用     | `Ctrl + Shift + L`     |

---

# 数式・関数編

| 操作内容        | ショートカットキー    |
| ----------- | ------------ |
| 関数の挿入       | `Shift + F3` |
| 数式コピー（上のセル） | `Ctrl + D`   |
| 数式コピー（左のセル） | `Ctrl + R`   |
| 絶対参照に切り替え   | `F4`（数式内で）   |
| オートSUM      | `Alt + =`    |

---

# 表示・編集編

| 操作内容      | ショートカットキー                    |
| --------- | ---------------------------- |
| 書式設定ダイアログ | `Ctrl + 1`                   |
| セル内改行     | `Alt + Enter`                |
| コメント挿入    | `Shift + F2`                 |
| フルスクリーン切替 | `Ctrl + Shift + F1`（バージョン依存） |
| セル結合      | `Alt + H + M + C`            |

---

# 最後に
今回はWindows版のエクセルショートカットキーをまとめてきました。
以前、Mac版のショートカットキーもまとめた記事を投稿しているので、Mac版を使うことがある方はそちらも併せて読んでみてください。
ここまで読んでいただきありがとうございました！
AIにコーディングさせることをとりまく2025-05-21時点でのメモ

# これはなんですか

今日の話のスナップショット。

今日という世界は、なんでも言ったことを理解してくれるAIちゃんがいる。

#  今日という日を説明してください

AIちゃんは私の言ったことを理解した上でもろもろのアウトプットをくれる世界で、アウトプットの一つとしてソースコードが生成される。

それらの精度はなかなか高いように見えるけど、細かいことをしようとしたらまだ人間によるカスタマイズが必要で、システムインテグレーションという点ではまだまだ人間の補助が必要。

「人間の補助としてAIがある」といったほうが正しいように思える。
これが逆転するまで何年かかるかこの記事の執筆時点で計測を行います。

ただ、単純なボイラーコードやテンプレート、「あるある」なコードの生成は完全にAIが早くて正確。
AIちゃんの吐くコードには当然ビルドエラーなんてないし、ついでにテストも書いてくれる。

# たとえばAIがいるだけで作業が楽になれること

「VPCがあってAZは２つあって、NATGWがあるコードをCDKで出力してほしい。スタックの名前はVPCStack」...→ひとつスタックと導入方法や注意書きができる


「じゃあさっき作ったスタックとは別で、EC2とPostgreSQLのAuroraを作るスタックを作ってほしい。スタックの名前はBackend」...→ひとつスタックと導入方法や注意書きができる

「さらに別スタックでOpenSearchもほしい。」...→ひとつスタックと導入方法や注意書きができる

「ここまでCDKで作ったインフラの構成図書ける？」→SVGでかいたものができあがる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570665/ee5cd8e9-b2ea-4ed3-a597-ff2e52a79fe4.png)

ここまではAIでできること。

# 人間のしごと

* んじゃパラメータのチューニングしよっか
* デプロイしよっか
* CI/CD整えようか
* 動作確認しよっか
* アプリのせよっか
* 構成図をもとに仕様書まとめよっか

出してくれるだけでもありがたいけど俗に言うインテグレーションって人間の仕事やね。

人間の仕事がまだ多い。
【第3回】AIとVibe Codingで、アイデアからプロトタイプを爆速で作ってみた

## 💡 アイデアからプロトタイプまで、AIと一緒に

今回は「AIでどこまでプロトタイプを自動生成できるか？」に挑戦しました。
設計資料なし、Figmaなしでも、**ユーザーストーリーとAIさえあれば**、想像以上に実用的なUIとロジックが作れます。

ここでは、実際に私が試した**プロトタイピングのフロー**をステップごとに紹介します。

---

## 🔁 ステップ1：AIにUser Storyを書かせる

まずはChatGPTやGeminiに指示して、ベースとなる `user-story.md` を自動生成させます。

```markdown
# user-story.md
- ユーザーはToDoを追加・削除・完了できる
- 各タスクには期限、優先度、担当者がある
- タスクはステータスでフィルターできる
```

このファイルを**Vibe Codingにcontextとして読み込ませる**ことで、以後の生成作業のベースにします。

---

## 🖼️ ステップ2：UIは好きなWebからキャプチャ → v0.devで再現！

今回はFigmaなどのデザインツールがなかったため、代わりに次の方法を取りました：

1. 気に入ったUIのWebページをスクリーンショット
2. v0.dev にその画像をアップロード（Bolt又はLovableが人気があったら自由に利用する）
3. 自動的に**React/Next.jsプロジェクトとしてエクスポート**
4. 3番目のソースをダウンロードして、次の段階のcontextに組み込む

🧠 この工程で、UIの「雰囲気」をすばやくプロジェクトに反映できました。

---

## 🧑‍💻 ステップ3：Cursorでコード生成を開始・フロント強化

* v0.devが出力したコードを**Cursorで読み込み**
* Contextに元のuser-storyとUIコードを組み込んで、
  ChatGPTに「このボタンがクリックされたらXを実行」といった指定を追加
* 高速にフロントエンドの動作部分を実装

🚀 Cursorでは、**コンテキストを保持したままAIに編集指示できる**ので、修正サイクルが非常に速く回せます。

---

## 🛠️ ステップ4：バックエンドの自動生成

* フロントが形になった段階で、次は**API設計とサーバー実装**
* `user-story.md` に「データ保存・取得要件」を追加記述
* それをもとに、AIがNode.js又はPython（FastAPI)ベースのバックエンドを生成


プロトタイプレベルでは、これで十分に機能するAPIができあがりました。

---

## 📦 まとめ：UIもロジックも、AI＋Vibeでここまでできる！

この流れにより、**1〜2日以内でフロント・バックエンドを持つWebアプリのプロトタイプ**が完成しました。

| 工程     | 手段                       |
| ------ | ------------------------ |
| 要件整理   | ChatGPTでUser Story自動生成   |
| UI     | スクショ → v0.dev → Reactコード |
| コーディング | Cursorで文脈付きAI開発          |
| バックエンド | AIによるAPIルーティング自動化        |

---

## 🔮 次回予告

次回は、**CursorとWindsurfの比較レビュー**です。

* 文脈の保持力は？
* 複雑なプロンプトへの対応力は？
* チームで使いやすいのはどっち？

開発効率を求める人には必見です！

---

フォロー＆LGTM、ぜひお願いします！
質問・ツッコミもコメント欄でお待ちしてます :)
急にSSHがタイムアウトして、接続できなくなった原因と対処方法

## 概要

これまで問題なく接続できていたWindows端末に対し、SSH経由で急に接続できなくなった。  
エラーメッセージには `Connection timed out` と表示され、原因の切り分けと対処が必要となった。

## 環境

- クライアント：
  - OS：Windows 11 HOME
  - SSHバージョン：OpenSSH_for_Windows_9.5p1, LibreSSL 3.8.2
  - 接続コマンド例：
    ```powershell
    ssh -i [SSHkeyの場所] [ユーザー名]@[LANのIPアドレス] -vvv
    ```

- 接続先（サーバー）：
  - OS：Windows 11 HOME
  - OpenSSH Server：Installed
  - SSH サービス（sshd）：自動起動設定済
  - ネットワーク：同一セグメント（例：100.64.1.0/24）

## 症状

- `ping` は成功するが、`ssh` はタイムアウトする
- `Test-NetConnection` では `PingSucceeded: True` / `TcpTestSucceeded: False`
- `ssh -vvv` の詳細ログでは `connect to address <IP> port 22: Connection timed out`

## 対処方法（実施内容）

### 1. ファイアウォールの確認
```powershell
Get-NetFirewallRule -Name sshd
```

→ `Enabled: True`, `Action: Allow` であることを確認

### 2. SSHサービスが起動しているか確認
```powershell
Get-Service sshd
```

→ `Running` であることを確認。未起動であれば以下で起動：

```powershell
Start-Service sshd
```

### 3. ポート 22 がリッスンされているか確認
```powershell
netstat -aon | findstr :22
```

→ `LISTENING` 状態でない場合は、sshd がポートを開いていない可能性あり。

### 4. `sshd_config` を確認
```powershell
notepad C:\ProgramData\ssh\sshd_config
```

→ `#Port 22` の行がコメントアウトされていたため、以下のように修正：

```text
Port 22
```

→ 保存後、SSHサービスを再起動：

```powershell
Restart-Service sshd
```

## 原因

`sshd_config` の `Port 22` 設定がコメントアウトされていたため、SSHサービスがポート22をリッスンしていなかった。

通常、OpenSSHはこの項目がコメントアウトされていてもデフォルトでポート22を使うが、何らかのタイミング（Windows Update、設定変更等）でポート設定が無視されるケースがある。今回もその一環と推定される。

## 補足

- `sshd` に関するイベントログはイベントビューアー → アプリケーションとサービスログ → OpenSSHから確認可能
- `sshd_config` ファイルのバックアップ（復旧のため）
- Windowsアップデート履歴を確認（直前に大規模アップデートがあったか）
- 同様の事象が再発した際に備え、以下のコマンドでサービス状態とポートの確認スクリプトを作っておくと便利：

```powershell
Get-Service sshd
netstat -aon | findstr :22
Test-NetConnection <接続先IP> -Port 22
```
REST rameworkとは？

 本記事はRESTfullAPIとはなにかについて説明した記事となっています

 ※はじめて執筆する記事となるため、拙い文章だったら申し訳ございません(記事というより学生の学習ノート的な見方をしてもらえると助かります)


# Restとは

RESTとはwebサービスの設計モデルのことです。
と一言でいうのは簡単ですが、正確に言うならWebシステムを外部から利用するためのプログラムの呼び出し規則です。
例えば、Google.comに接続したら必ず同じような画面が返される、といった同じURLからは常に同じ結果が返されることが期待され、検索バーに内容を入れたらその結果はHTTPメソッド(※後述)を使用し、XMLやHTML、JSONで返され、検索した結果どうだったか(検索した内容が存在していたのか、存在していなかったのか、処理に成功したのか、しなかったのか)がHTTPステータスコード(後述)で通知されるというような原則が含まれることもあります。

#RESTの原則
RESTには基本的な4つの設計原則が存在します。

1,セッションなどの状態管理は行わない(毎回初めましてでやり取りをする)
    

2, 情報を操作するためのメソッドがあらかじめ定義されている
        定義されている主なメソッド例
| メソッド | 操作 | 
| :----- | :------: | 
| GET  |  取得   | 
| POST    |   作成(送信) |
| PUT/PATCH | 更新 |
| DELETE | 削除 |

3,すべての情報はURLのような構文で一意に識別される。(データの住所を使って探せるよう)

4,データの内部に次のデータへのリンクを含められる

このような原則が存在することにより
・アクセスの集中に耐えやすい構造にできる
・URI/URLに規則が生まれ開発しやすくなったり 
・XMLやJSONを扱う他サービスと連携しやすくなる
・標準的なデータを扱うことにより、様々なアプリケーションを提供できる
などといったメリットが生まれます

# ステータスコード

Rest APIでは前述したように検索結果であるXMLやHTML、JSONのほかにHTTPステータスコードというその処理を行った結果成功したか、失敗したか、どうして失敗したかが含まれる値を返します。値に対応する意味は以下のようになっています

| ステータス | 状態 |
| :----- |:-----:|
| 200 | OK(処理成功) |
| 201 | Created(リクエストが成功して新しいデータが作られたという状態) |
| 400 | Bad Request(送られたデータの形式が違う等のエラーステータス) |
| 401 | Unauthorized(ユーザーの認証情報がない時などに返されるステータス) |
| 403 | Forbidden(認証されているけど操作に対し権限がない時に返されるステータス |
| 404 | Not Found(そのリソース、ページが見つからないときに返されるステータス) |
| 405 | Mehod Not Allowed(そのページにはアクセスできるけどPOSTなどの操作を行えないときに返されるステータス) |

このようなステータスコードを返却することにより、予想外の動作に対して処理を描きやすくなったり、結果を見たときぱっと見でリクエストの結果が見やすくなったりします。
AWS導入手順書（初心者からの構築記録）part2

# AWS構成手順書 (EC2、RDS、ALB の構成)

前回のPart1に引き続きPart2を書きました！今回は主にEC2、RDS、ALB、Route53の導入を行います！

---

## インスタンス(EC2) の作成
https://qiita.com/obandesu330/items/f2508df6cbbeb3ad170a

EC2インスタンスを作成し、Elastic IPを割り当てました。
EC2はAWS上での仮想サーバとしての役割を果たします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4084675/7a07f043-26cc-4a36-ab23-6d93ad8d1ae2.png)


---

## セキュリティグループの作成

セキュリティグループはEC2などのリソースに割り当てるファイアウォールのようなものです。

* EC2用とRDS用の2つのセキュリティグループを作成
* 本来はALB用のセキュリティグループも作成すべき

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4084675/dac8f1eb-166c-4c76-8146-4b5e7f2562a7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4084675/66ed6be5-ade9-47bf-a00a-2cdc3715eebc.png)


---

## ALB (アプリケーションロードバランサー)
https://qiita.com/yuuichimizuta/items/d7dabc1b4b21de0e7e60

ALBはサーバへの設定されたトラフィックを分散する負荷分散を行います。
* EC2一台でも展開を見込んで使用
* HTTPSリスナー + HTTPからHTTPSへのリダイレクトを設定
* SSL化をACM(証明書)で実現
私はSSL証明書の発行とリダイレクトのでちょっと苦労しました...

https://qiita.com/minisera/items/7b8c0418812a22b83b1e

https://qiita.com/shinsakujazzbass/items/a092461f4483442a49f0


---

## ターゲットグループ

https://www.bing.com/search?q=AWS%E3%80%80ターゲットグループ作り方&qs=n&form=QBRE&sp=-1&lq=0&pq=aws%E3%80%80ターゲットグループ作り方&sc=12-16&sk=&cvid=B5ECF658A65A44ADB4846671816D7DBD


ターゲットグループはALBが設定された後のトラフィックの送信先です。

* EC2を登録
* ヘルスチェック
HTTP(HTTPS)での特定のパスをすることができます。
ヘルスチェックに合格した通信のみ、ロードバランサーがその通信を振り分けます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4084675/3c15b2d5-e9d5-4ba3-b9fc-c27ee8ae4fc9.png)


---

## RDSの構築
https://qiita.com/free-honda/items/d20fb420b98eb99bcddd

私は下記のように設定しました。

* MySQLを選択
* アプリケーションに使う初期データを手動で振り込み(SQL分を手打ちで)
↑多分もっと効率の良い方法があります。笑
* セキュリティグループによりEC2のIPのみを許可
* パブリックアクセスは無効
* プライベートサブネットに配置

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4084675/2fa35481-9110-4b4e-ac94-311bcaf9330e.png)


---

## Route53でのドメイン設定
https://qiita.com/chakiryou/items/32eb6599ee77b0c11421

順序としては下記になります

1 ドメインを名前.comで購入
2 AレコードにALBのDNS名を指定
3 ACMで証明書を登録
4 ALBでHTTPS通信が可能に

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4084675/b051d5dc-415f-48ee-ab7a-b66be76d449f.png)



---
こんかいはここまでです！主にインスタンスの構築を説明させていただきました！
次回からアプリケーションデプロイ後の手順を記載します～

---
sveltosctlで開発環境を爆速セットアップ！Kubernetes管理を簡単に！

Sveltosは、Kubernetesクラスタ管理を簡素化するための強力なツールセットです。今回は、そのコマンドラインツール「sveltosctl」をインストールして、クラスタ管理を効率化する方法をご紹介します！

## sveltosctlとは？

sveltosctlは、Sveltosプロジェクトのコマンドラインインターフェースで、Kubernetesクラスタに展開されたリソースやHelmチャートの情報を簡単に表示したり、設定のスナップショットを作成・ロールバックしたりできる便利なツールです。

## インストール手順

今回は、ソースコードからビルドする方法を紹介します！

```bash
# リポジトリをクローン
ghq get https://github.com/projectsveltos/sveltosctl.git

# ディレクトリに移動
cd $(ghq root)/github.com/projectsveltos/sveltosctl

# ビルド実行
make build

# バイナリをシステムパスに移動
sudo mv ./bin/sveltosctl /usr/local/bin/
```

これだけで、sveltosctlが使えるようになります！

## 使い方のクイックスタート

インストールが完了したら、以下のコマンドで機能を確認できます：

```bash
# ヘルプを表示
sveltosctl --help

# クラスタにデプロイされたアドオンを表示
sveltosctl show addons

# クラスタを登録
sveltosctl register cluster --namespace=<SveltosClusterを作成するNamespace> --cluster=<作成するSveltosClusterのmetadata.name> --fleet-cluster-context=<SveltosClusterとして管理させるcontext>
```

## まとめ

sveltosctlをインストールすることで、Kubernetesクラスタの管理が格段に簡単になります。リソースの可視化、スナップショット管理、クラスタ登録など、多彩な機能を活用して、効率的なクラスタ運用を実現しましょう！
「ベスト」だけをやる勇気 〜完璧な設計より、次へ進む決断〜

最近読んだ記事に、とても刺さる考え方がありました。

> [「ベターよりもベストだけをやる」という考え方も持っておくといいかも](https://kensuu.com/n/n55d43472b8bf?from=notice)

要点をざっくり言うと、
「やった方が良さそうな“ベター”なことに時間をかけすぎると、成果に直結する“ベスト”なことができなくなる」
という話です。



## コードを書き直す癖

私はITエンジニアをしています。
今まさに、書いたコードをしょっちゅう書き直してしまう癖に悩んでいます。

* とりあえず動いているけど、設計はこのままでいいのか？
* 将来的にモジュール化したくなったら困るかも…
* だったら今から分離しておくべきでは？

こんなことをぐるぐる考えて、手が止まる。
結果として、**「ベター」な改善には手を出すけど、「ベスト」な次の実装が進まない**。



## たとえば、ある処理の話

最近、ある処理で `.txt` ファイルを読み込んでDBに保存する機能を作りました。
これ、**動いてる**んです。すでに要件を満たしてます。

でもそこで手が止まる。

* この処理、どこに置くのが「正しい」んだろう？
* オニオンアーキテクチャ？クリーンアーキテクチャ？DDD？
* もっと綺麗に書きたい…

そんなことを考えてしまう。
もちろん、それは悪じゃない。むしろ「良いこと」ではある。
でも、それは **"ベター" であって、今やるべき "ベスト" ではない**。



## 「気持ち悪い設計」を残す勇気

記事を読んで、ハッとしました。
完璧主義になってはいけない。**完璧なんてものは、そもそも存在しない**。
だからこそ、今の「そこそこ動く」設計で一旦OKを出して、 **次の処理に着手することが“ベスト”** なんだと思いました。

今後、どうせまた設計は変わるし、そのときに直せばいい。
気持ち悪さに蓋をする勇気。これが今の自分に必要な「ベスト」でした。



## 最後に

もし、あなたも完璧を求めて前に進めないでいるなら。
「ベストだけをやれ、ベターはやるな」という言葉を思い出してみてください。

そして、手を動かしてみましょう。
それが一番の「成果」になるはずです。
Safariでダークモード非対応サイトをダークモードに！



# はじめに

ダークモードに対応していないサイトが眩しくて見てられないって、悩んでいたんですが、解決できたので解決策を共有します！

「ダークモード適用前」
![IMG_7809.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708101/789b891b-13f6-4cc0-8f8a-7cb26af454cd.png)

「ダークモード適用後」
![IMG_7810.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708101/c20e6173-4c0e-4ce8-9d81-538a9628a9ed.png)





:::note warn

本記事で紹介する方法は **iOSのSafari限定** です。
:::


# 1. Makeoverとは？
「Makeover - Custom CSS」は、Safariで閲覧中のウェブページにカスタムCSSを適用できる無料のiOSアプリです。ダークモード未対応のサイトを自分好みにカスタマイズしたりできます。

•  App Store: [Makeover - Custom CSS](https://apps.apple.com/jp/app/makeover-custom-css/id1602361167)

# 2. セットアップ手順
以下の手順で、Makeoverをセットアップし、ダークモードを適用していきます。

## 2.1 アプリのインストール
1.  App Storeから「 [Makeover - Custom CSS](https://apps.apple.com/jp/app/makeover-custom-css/id1602361167)」をインストール
2.  Safariを開き、対象のウェブサイトにアクセス

## 2.2 拡張機能を有効化
1.  Safariのアドレスバー左の機能拡張アイコンをタップ
2.  「機能拡張を管理」から「Makeover」をオンに
3.  MakeoverのアイコンをタップしてCSS入力画面を開く

## 2.3 CSSを適用

CSSの入力画面に以下のCSSをコピペし、適用するとダークモードが反映されてると思います！

```css
@media (prefers-color-scheme: dark) {
  :root {
    --bg-color: #1a1a1a; /* 背景色を変更可能 */
    --text-color: #e0e0e0; /* 文字色を変更可能 */
    --link-color: #8ab4f8; /* リンク色を変更可能 */
  }

  body {
    background-color: var(--bg-color) !important;
    color: var(--text-color) !important;
  }

  a {
    color: var(--link-color) !important;
  }

  img {
    filter: brightness(0.85) contrast(0.9) !important; /* 画像の眩しさ軽減 */
  }

  * {
    background-color: var(--bg-color) !important;
    color: var(--text-color) !important;
    border-color: #333333 !important;
  }

  input, textarea, button {
    background-color: #2a2a2a !important;
    color: var(--text-color) !important;
    border: 1px solid #444444 !important;
  }
```

### カスタマイズしたいときは？

背景や文字の色を調整したい場合は、`:root` に定義されている色を好きな色に変更してみてください！


# 終わりに

これで夜中にスマホを触っても目が痛くなりません！
この記事が参考になったら嬉しいです🙌
ソフトウェアの構造


# 自然言語
文法

文章の構造


ノーム・チョムスキー



# 建築
アーキテクチャ

模型

倒壊




# 数学
対称性

## 模型 model

### 離散系 digital
UML

### 連続系 continuous
Matlab/simulink



コミュニケーションの困難さ

UML

プログラミング言語
　使用記述言語
  検証言語
    証明記述言語

    
# object
物　空間を具体的に示す。

事　空間が具体的でなくてもいいことがある。
Thing


ノーム・チョムスキー


よかったこと
自然言語の名前と、プログラム上の名前を、同じつづりを使う。

あらためるとよいこと
　科学技術の進化（遺伝子解析）で、物事の体系分析が変化した。

 百科辞書は、大幅に書き換えが進んだ。

 ステートマシン、シーケンス、タイミングは、分類の影響を受けない。
 ずっと役立つ。
[RubyMine] missing type signature of xxxの対応

## 背景
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37718/29db7aa2-6994-47cb-844e-f6fdc1c1b664.png)

RubyMineから以下の警告が出てきた。`Missing type signature for 'extractable?'`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37718/292bf18d-b7dc-4698-8774-ed626c43e074.png)

## RBS Signatureとは
RBS（Ruby Signature） は、Rubyのクラスやモジュール、メソッドの**型情報を記述するための専用ファイル形式（.rbs）**です。
Ruby本体とは別に、静的型チェックを可能にする仕組みとして Ruby 3.0（2020年12月） から導入されました。

[ruby/rbs: Type Signature for Ruby](https://github.com/ruby/rbs)


## 警告の対応
現在のプロジェクトには必要なさそうなので、無効にした。

Settings -> Editor -> Inspections -> RBS

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37718/d82ffb72-594b-4ab7-b67a-6a6df3588ff3.png)
【冨井悠平】エンジニアを始めたらまず意識すること 〜Web・AI開発の現場からのリアルなアドバイス〜

こんにちは。冨井悠平です。

Webシステム開発とAI領域を得意とするエンジニアです。慶應義塾大学卒業後、大手ベンダーでの開発経験を経て、現在はスタートアップ3社での支援経験を活かし、クラウドソーシングを通じて多くの企業やプロジェクトに貢献しています。

この記事では、**これからエンジニアとしてキャリアをスタートさせる方に向けて、「最初に意識すべきこと」**を、私自身の経験を交えながらお伝えします。


１　技術だけでなく「目的」を意識する
「コードを書くこと」がゴールではない
新人エンジニアの頃は、どうしても技術やコードに目が行きがちです。ですが、開発の本質は**「課題解決」**です。たとえば、以下のような視点が大切です。

この機能は誰のどんな課題を解決するのか？

なぜこのアーキテクチャを選ぶのか？

技術的な選択がプロジェクトの成功にどう貢献するか？

私自身も、大手ベンダーやスタートアップで数々のPoCやMVP開発を行ってきましたが、常に「ビジネスの背景」まで理解することを意識してきました。

２　「設計の重要性」を早めに理解する
コードを書く前に考えるクセを
新人時代によくあるのが、まず手を動かしてしまうこと。しかし、設計をおろそかにすると後々の保守性・拡張性に大きな影響が出ます。

私が特に重視しているのは以下の点です：

シンプルかつ拡張可能な設計

命名規則とディレクトリ構成の明確化

責務が分離されたモジュール設計

この習慣は、バックエンドでのアーキテクチャ設計や、フロントエンドでのUI/UXを考慮した構成に直結します。

３　「習うより慣れろ」＋「振り返り」
学びはアウトプットして初めて定着する
学んだことを小さなアウトプットとして積み重ねることは非常に重要です。たとえば、

Qiitaやブログでの技術記事投稿

GitHubに成果物をアップする

実際に何か小さなアプリを作ってみる

私もReactやFastAPI、Dockerなどの学習時には、何かしら手を動かしながら「なぜこの技術を選ぶのか」「どんな課題があったか」を常に記録してきました。結果として、プロジェクト内での技術選定や、パフォーマンスチューニングにも役立つ知見が蓄積されていきます。

４　AIやクラウドも「怖がらずに手を出す」
今後の必須スキルに触れておこう
AIやクラウド（AWS/GCPなど）は、今後さらに多くの現場で求められるスキルです。最初は難しく見えるかもしれませんが、シンプルなものから触れてみることが大切です。

私自身も、以下のようなプロジェクトを通じてスキルを磨いてきました：

TensorFlowやPyTorchを使った画像認識モデルの構築

AWS Lambda＋API Gatewayを活用したサーバーレスAPIの開発

Kubernetesによるサービスのスケーラビリティ向上

一歩ずつ実践しながら理解を深めていけば、AIもクラウドも怖くありません。

５　「コミュニケーション」はスキルです
技術力だけでは、プロジェクトは成功しない
エンジニアは技術者であると同時に、「チームの一員」です。特にスタートアップや小規模プロジェクトでは、技術とビジネスの橋渡しができる人材が重宝されます。

相手の要望を正確に理解する

なぜその設計を選ぶのかを説明できる

ビジネスの意図に沿った提案ができる

このようなスキルは、実はコード以上に重要な場面も少なくありません。

おわりに
最初から完璧を目指さなくていい
エンジニアとしてスタートを切ると、「すべてを理解しなければ」と感じることもあるかもしれません。しかし、大切なのは完璧を目指すより、一歩ずつ前進することです。

私も多くの失敗を経験しながら、試行錯誤を重ねてきました。その積み重ねが、今の自分をつくっています。

もし、Webシステム開発やAI開発に関して相談したいことがあれば、ぜひお気軽にご連絡ください。一緒に価値あるプロダクトをつくりましょう。
【資格】Python 3 基礎とPHP 8 初級の合格体験記

2025年に入り2つの試験を受験し、無事にどちらも合格することが出来た。本記事では、これから受けることを検討している方のためになればと思い、学習方法や試験の所感などについて書いていく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/792c647c-42c5-4656-a32f-d41c3d48d75f.png)


## 試験について
「Python 3 エンジニア認定基礎試験」と「PHP8技術者認定初級試験」、この2つは言語としては別物だが、試験としては比較的共通点が多い。
- ITSSでレベル1に相当し、入門的な位置づけに当たる
- 出題範囲と配点、合格点が公開されている（70%が合格ライン）
- 試験形式はCBT形式で、選択式の全40問、試験時間60分
- Odyssey CBTを通して申し込む
- PRIME STUDYで模擬試験が公開されている

## 受験前の筆者の知識レベル
- Python、PHPはどちらも未経験
- 他の言語でエラーハンドリングやクラスの概念などはある程度理解している
- HTMLはぼんやりわかる
- SQL（DML）はわかる


## Python 3 エンジニア認定基礎試験
### 学習方法
こちらはネット上のコンテンツだけで学習を行った。Python 3 は学習コンテンツが豊富にあり、無料で見られる範囲も多いので、基礎試験であればネットだけでも試験対策としては十分出来るかと思う。
以下は主に参考にしたサイトである。

---
旧版？の公式チュートリアルはネット上から閲覧できる。分量は多いが出題範囲の章立てと対応しており、これだけでもかなり学習を進められる。

https://docs.python.org/ja/dev/tutorial/index.html

---
こちらではチュートリアルのポイントがまとめられている。こちらを先に見た方がよいかも。

https://zenn.dev/masaruxstudy/books/74bbdba78366c3/viewer/cebb4a

---
この他、参考になるサイトは多い。筆者はテキスト派なので使わなかったが、UdemyやYoutubeでも学べそうだ。

https://www.tohoho-web.com/python/index.html

---
模擬試験はPRIME STUDYで三種類公開されており、解説も付いている。

https://study.prime-strategy.co.jp/

---
実際にコードを書いて動きが見たい時はpaizaを利用した。

https://paiza.io/ja/projects/new

---
### 受験本番
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/66e60ca8-cda9-4ad0-912b-58c3ef314228.png)

結果は上記の通り。全40問なので単純に1問25点とすると3問落としたことになる。こちらはざっくり言うと「**思ったよりも簡単**」で、試験時間も十分に余った。
注意点としては、本番試験では紙とペンなどのメモ用紙が用意されない。なので、変数の値を追っていく問題や正規表現等で文字列を分解して考えていく問題では頭の中でしっかりと考える必要がある。もし模擬試験を解く際にメモしながら解いている人がいれば、暗算で解くことに慣れておいたほうがよいかもしれない。


## PHP8技術者認定初級試験

### 学習方法
こちらはネット上で試験範囲を網羅的に学習できるようなサイトを見つけられず、書籍を買って学習することにした。

https://book.impress.co.jp/books/1118101075

PHP8の問題集も出ているが、お金をケチってPHP7の問題集を中古で購入した。PHP8についてはPHP7の問題集で学習した後にPHP7⇒PHP8の変更点をネット上で学習してカバーしたが、試験においては特にそれで問題なかったと思う。ちなみにPHP8初級試験はPHP 8.0.0 準拠のため、8.1以降のバージョンを追う必要はない（はず）。
以下は主に参考にしたサイトである。

#### 主に参考にしたサイト
PHP8.0の変更点は公式マニュアルに記載されている他、わかりやすくまとめてくれているサイトも多々ある。PHP8対応のコンテンツで学習したならば不要だが、筆者のようにPHP7のコンテンツで学んだ場合は8の変更点をしっかり抑えておきたい。

https://qiita.com/pike3/items/06493cbcae90b28c1c4e

https://qiita.com/rana_kualu/items/82cc8295d2102d14b88a

---
PHPもマニュアルはネット上から閲覧できるのだが、試験範囲に対応した章立てにはなっていないのでこちらから学習するのは少々しんどい。

https://www.php.net/manual/ja/index.php

---
模擬試験はPRIME STUDYで公開されている。こちらはPython基礎と異なり一種類のみで解説も無し。

https://study.prime-strategy.co.jp/

---
Python同様、実際にコードを書いて動きが見たい時はpaizaを利用した。

https://paiza.io/ja/projects/new

---
### 試験

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/44424275-8dbf-4743-afc1-77ccf737af5e.png)

結果は上記の通り。こちらも1問25点とすると6問落としている。
PHP初級は受験された方の感想を見ると「**思ったよりも難しい**」とコメントしている方が多く、私も同じように感じた。ただ、１問１問の難易度が高いというよりは、出題範囲が広くて難しいという感じで、試験時間自体はPython 基礎と同様に比較的余裕がある。メモが使えないのもPython 基礎と同じである。

## 終わりに

例によって「資格を取ったから実務もバッチリいけます！」とまでは言えないし、ベンダー資格なので受験料も決して安くないが、リスキリングの足掛かりにはなるんじゃないかとは思う。何より、読める言語が増えればITの世界がきっとより楽しくなるはずだ。
多数テーブルJOIN × ソート × ページングは危険！パフォーマンス改善のベストプラクティス

# 🚀 パフォーマンス改善のためのSQL戦略

業務システムやポータルサイトのバックエンドでは、検索画面で**大量のデータを結合し、条件で絞り込み、並べ替え・ページングする構成**がよくあります。

```sql
SELECT * 
FROM staff
JOIN store ON ...
JOIN area ON ...
LEFT JOIN video ON ...
WHERE 条件
GROUP BY staff.id
ORDER BY staff.updated_at DESC
LIMIT 0, 30;
```

このような「**複数のテーブルをJOINして、ソートして、LIMITする**」SQLは、一見シンプルに見えても、**パフォーマンスがボトルネックになりやすい構成**です。

この記事では、こういったクエリが**なぜ遅くなるのか**、**どう改善すれば良いのか**を、実例をもとに分かりやすく解説します。

---

## 💥 問題となる典型パターン

### 🛑 よくある構造

* 10以上のテーブルをJOIN（INNER / LEFT混在）
* 複雑なWHERE条件（サブクエリ、OR、CASE文）
* GROUP BYとORDER BYが混在
* LIMIT / OFFSET でページング

---

## 🔧 実際の `EXPLAIN` の一部（例）

| table | type  | rows | Extra                                  |
| ----- | ----- | ---- | -------------------------------------- |
| staff | ref   | 1200 | Using index condition                  |
| video | ref   | 5000 | Using where                            |
| area  | const | 1    |                                        |
| store | ref   | 3000 | Using where; Using temporary; filesort |

### ❗ 問題ポイント

* `Using temporary` ＋ `Using filesort`
  → ソートのためのテンポラリテーブルとファイルソートが発生
* **LIMITが適用される前に、全ての行に対してソートが走る**
* LEFT JOIN先の条件が複雑で**インデックスが効きづらい**

---

## ⚠️ なぜ遅くなるのか？

1. JOINで**絞り込み前の行数が爆発的に増える**
2. **全行をORDER BYでソート**
3. **LIMITは最後に適用**されるため、途中の行もすべて評価対象
4. **MySQL/MariaDBはこのパターンに非常に弱い**
   → 特にOFFSETが大きくなるとパフォーマンスが劣化

---

## ✅ ベストプラクティス：**2段階取得戦略**

### 🥇 ステップ1：IDだけ先に取得（軽量）

```sql
SELECT staff.id
FROM staff
JOIN store ON ...
WHERE 条件
ORDER BY staff.updated_at DESC
LIMIT 0, 30;
```

* この段階では、**必要なIDだけを取得**
* **重いJOINやLEFT JOINは後回し！**

---

### 🥈 ステップ2：詳細情報を取得（JOIN）

```sql
SELECT s.*, v.*, a.*
FROM staff s
LEFT JOIN video v ON ...
LEFT JOIN area a ON ...
WHERE s.id IN (1, 2, 3, ..., 30);
```

* 件数が少ないため、**JOINしても高速**
* **ORDER BYは不要**（前段で完了しているため）

---

## 🧪 パフォーマンス比較

| パターン      | 実行時間  |
| --------- | ----- |
| 1段階フルJOIN | 1.4秒  |
| 2段階戦略     | 0.12秒 |

* **約10倍以上の高速化を実現！**
* 特に**大きなOFFSET**になると差は**指数的に拡大**

---

## ✨ 補足：さらに高みを目指すなら

* **WITH句**で一時的なサブクエリ（MariaDB 10.2+）
* **IDソート用インデックス**を作る（例：`(updated_at, id)`）
* **OFFSETを使わず、「カーソル方式（seek）」でページング**

```sql
WHERE (updated_at, id) < (?, ?)
```

---

## 🎯 まとめ

| 問題              | 解決策                    |
| --------------- | ---------------------- |
| JOINが多くソートが重い   | IDだけ先に取得し、詳細は後段で       |
| ソートに時間がかかる      | ソート対象を最小限に絞る           |
| LIMIT OFFSETが遅い | IDベースの**カーソル方式**でページング |

---

## 📘 最後に

JOIN・ソート・ページングはWebシステムの根幹ですが、**正しい戦略で設計しないとスケールしないクエリになります。**

「**まずはIDだけ取る**」「**JOINを遅延する**」
この**2段階戦略**は、データ量が増えたときにも強い構造です。
（開発中）エンドポイントを監視するセキュリティツール

開発が進んでいったら、追記していきます.

# GitHub
https://github.com/mniyk/endpoint-security-and-monitoring-tools

# Motive
就職活動が全く順調ではないため、息抜きに、プロジェクトでも作ってみるかーと思ったので.

# UseCase
社内における情報漏洩を想定しています.

# System Architecture
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498946/581606cf-8e75-4e4d-aadf-1c8688e8f5a7.png)

# Technology Stack
- Endpoint Tools
    - Go Lang
- Data Collector Database
    - AWS
        - Lambda
            - Python
- Database
    - AWS
        - DynamoDB
- Admin Dashboard
    - AWS
        - Amplify
    - React

# Features
## (開発予定) Wireless File Transfer Monitoring
BluetoothおよびWi-Fi Directでのファイル転送の追跡

## Printer Transfer Monitoring
プリンターへの転送の追跡

https://qiita.com/mniyk/items/c53f9450d24eb4d712d7

## USB File Transfer Monitoring
USBデバイスへのファイル転送の追跡

https://qiita.com/mniyk/items/b5930f6ea3085887c9fc

# Note
AWSへ送信する箇所は、現在、ログ出力のみ.
HEIC画像を一括でJPEG/PNG/TIFFへ変換するPythonスクリプト

## 使い方

1. 変換したい `.heic` ファイルが格納されているディレクトリを用意する。  
2. 下記の必要ライブラリをインストールする。
    ```shell
    pip install pillow pillow-heif
    ```
2. コマンドプロンプトでスクリプトを実行する。
    ```shell
    python heicconv.py
    ```
4. プロンプトに従い  
   - ディレクトリパス  
   - 出力拡張子（`jpeg` / `png` / `tiff`）  
   を入力する。  
5. 変換後ファイルは `<入力ディレクトリ>/<拡張子名>/` 配下へ保存される。



## 開発環境
| 項目 | 値 |
|:---|---:|
| OS | Windows 11 |
| 言語 | Python 3.12.3 |
| シェル | コマンドプロンプト |


## スクリプト全文

```heicconv.py
import os
from PIL import Image
import pillow_heif

def convert_heic_images():
    # 入力：対象のディレクトリ
    directory = input("対象のディレクトリパスを入力してください: ").strip()
    if not os.path.isdir(directory):
        print("指定されたパスはディレクトリではありません。処理を終了します。")
        return

    # 入力：変換したい拡張子
    valid_extensions = {"jpeg": "JPEG", "jpg": "JPEG", "png": "PNG", "tiff": "TIFF", "tif": "TIFF"}
    ext_input = input("どの拡張子に変換しますか？（jpeg/png/tiff）: ").strip().lower()

    if ext_input not in valid_extensions:
        print("対応していない拡張子です。jpeg、png、tiff のいずれかを入力してください。")
        return

    output_format = valid_extensions[ext_input]
    output_ext = ext_input if ext_input != "jpg" else "jpeg"
    output_dir = os.path.join(directory, output_ext)
    os.makedirs(output_dir, exist_ok=True)

    converted_count = 0

    for filename in os.listdir(directory):
        if filename.lower().endswith(".heic"):
            heic_path = os.path.join(directory, filename)
            base_name = os.path.splitext(filename)[0]
            output_filename = f"{base_name}.{output_ext}"
            output_path = os.path.join(output_dir, output_filename)

            try:
                heif_file = pillow_heif.read_heif(heic_path)
                image = Image.frombytes(
                    heif_file.mode,
                    heif_file.size,
                    heif_file.data,
                    "raw",
                    heif_file.mode
                )
                image.save(output_path, format=output_format)
                print(f"✅ 変換完了: {filename} → {output_filename}")
                converted_count += 1
            except Exception as e:
                print(f"❌ 変換失敗: {filename}（エラー: {e}）")

    if converted_count == 0:
        print("HEICファイルが見つかりませんでした。")
    else:
        print(f"\n🎉 合計 {converted_count} 件のファイルを {output_format} に変換しました。出力先: {output_dir}")

if __name__ == "__main__":
    convert_heic_images()

```
Docker buildしてからNo route to hostになった際の解決方法

## 起きた事象

- 環境: WSL2 Ubuntu 22.04
- Dockerビルド後にネットワークに繋がらなくなり，No Route to Hostになってしまった。
    ```shell
    curl ipinfo.io
    curl: (7) Failed connect to xxx:xxx.xxx.xxx:yy; No route to host
    ```

---

## 原因

https://qiita.com/take4s5i/items/db018ef6d8e4bbd10639

これと同じ事象が起きていた。
インターネットに出るために通過が必要なプロキシのIPとDockerが作成したネットワークの範囲がかぶってしまっていた。
↓イメージ

- proxyのip: 172.20.77.77
- Docker network: 172.20.0.0/16

---

## 暫定解決策

該当のDocker networkを探して削除する

```shell
docker network ls
docker network inspect xxxxxxx # NETWORK IDを指定
docker network rm xxxxxxx
```

---

## 再発防止策

`/etc/docker/daemon.json`docker networkが作成するipの範囲を指定して172.20.0.0/16が使われないようにしてみた。
しばらくこれを試して問題が発生しないか試す。

```json
{
  "default-address-pools": [
    {
      "base": "172.19.0.0/16",
      "size": 24
    },
    {
      "base": "192.168.0.0/16",
      "size": 24
    }
  ]
}

```

```shell
sudo systemctl restart docker
```
Elasticsearch: reindexが失敗した時の対応手順例


## reindexが失敗すると
reindex が失敗すると、`GET _tasks/<reindex_task_id>` のレスポンスで次のようなfailuresの情報が表示されます。

```
  "failures": [
    {
      "index": "dest_index",
      "id": "6e9cad7292a7133f74449b5f94ac1d",
      "cause": {
        "type": "status_exception",
        "reason": "Input too large. The tokenized input length [543] exceeds the maximum sequence length [512]"
      },
      "status": 400
    }
  ]
```

## 失敗したドキュメントの確認
レスポンスに含まれるfailures内の `id` は Document ID を表します。これを元に失敗したドキュメントを確認します。
＊ なお、Document ID は、reindexソースとターゲットで変更ありません。
```
GET /source_index/_doc/6e9cad7292a7133f74449b5f94ac1d
```
そのドキュメントを見て失敗の原因・対応が思い当たれば、その原因を取り除いてreindexを再実行します。



## 失敗した原因の調査
ドキュメントを見ただけでは失敗の原因・対応がはっきりしない場合は、`_simulate API`を使って、reindexでのパイプライン処理をシミュレーションすることにより詳細な情報を得ることができます。`verbose=true` にすると、各プロセッサの前後でドキュメントがどう変化したかを確認できます。

```text: _simulate API例
POST _ingest/pipeline/my_pipeline/_simulate?verbose=true
{
  "docs": [
    {
        "_index": "source_index",
        "_id": "6e9cad7292a7133f74449b5f94ac1d",
        "_source": { ここに該当ドキュメントの_sourceをコピペします }
   }
  ]
}
```
## ドキュメント単位のreindex
特定のドキュメントだけを対象にreindexを実行することが可能です。失敗した原因を取り除いた後、次のように失敗したドキュメントだけを対象にreindexを実行し成功するかどうかを確認することができます。

```
POST _reindex
{
  "source": {
    "index": "source_index",
    "query": {
      "ids": {
        "values": ["6e9cad7292a7133f74449b5f94ac1d"]
      }
    }
  },
  "dest": {
    "index": "dest_index",
    "pipeline": "my_pipeline"
  }
}
```
チャットGPT 日本語 - ChatGPTはSEOに似ています

はじめに
現代のデジタル社会において、「チャットGPT 日本語」は注目を集めています。特に、ChatGPTの自然言語処理技術は、SEO（検索エンジン最適化）と多くの共通点を持っています。本記事では、「チャットGPT 日本語」とSEOの類似点について詳しく解説し、その関係性を理解することを目指します。
詳細はこちら: https://chatgptjp.org/

チャットGPTとは何か？
チャットGPTはOpenAIが開発した対話型AIモデルであり、自然な日本語を理解し、生成する能力に優れています。ユーザーの質問に対して的確かつ自然な回答を返すことができるため、さまざまな分野で活用されています。

特に日本語対応の精度が向上したことで、「チャットGPT 日本語」の需要は急増しています。これは、ユーザーが自然な日本語でAIとコミュニケーションできることを意味し、ビジネスや教育、クリエイティブな作業の効率化に貢献しています。

SEOとは何か？
SEOとは「Search Engine Optimization」の略で、検索エンジンにおけるウェブサイトのランキングを向上させるための手法です。ユーザーが検索エンジンで特定のキーワードを入力したとき、関連性の高いコンテンツを上位に表示させることを目的としています。

SEOの成功には、キーワードの選定、コンテンツの質、サイトの構造、ユーザー体験の最適化など、多くの要素が関わります。これらの要素がうまく機能することで、検索結果での可視性が高まり、アクセス数や売上向上につながります。

チャットGPTとSEOの共通点
1. ユーザーのニーズに応えること
ChatGPTもSEOも、最終的にはユーザーのニーズに応えることを目的としています。SEOでは、ユーザーが求める情報を検索結果に的確に表示させることが重要です。同様に、チャットGPTもユーザーの質問や要求に対して的確かつわかりやすい回答を提供します。

この共通点は、情報の「関連性」と「質」が鍵であることを示しています。どちらもユーザー体験を向上させるために設計されているのです。

2. キーワードの重要性
SEOでは、適切なキーワードの選定が不可欠です。検索エンジンはキーワードをもとにコンテンツの関連性を判断し、ランキングを決定します。

チャットGPTでも同様に、ユーザーからの質問や指示（キーワード）が適切に理解されることが良い回答の鍵となります。ユーザーが明確なキーワードを使うことで、AIはより正確な返答を生成できます。

3. コンテンツの質
SEOで高評価を得るためには、質の高いコンテンツが求められます。情報が正確で分かりやすく、ユーザーの疑問を解決できる内容であることが重要です。

ChatGPTも、正確かつ明快な回答を提供することにより、ユーザーの満足度を高めます。低品質の回答は信頼を失い、利用されなくなります。したがって、両者に共通するのは「質の追求」です。

4. 継続的な改善と更新
SEOは常に変化する検索エンジンのアルゴリズムに合わせて、コンテンツの更新や改善が必要です。これにより、検索結果の上位を維持できます。

チャットGPTも、ユーザーからのフィードバックや新しいデータでトレーニングされ、性能が向上していきます。つまり、継続的な改善がユーザー満足を左右する点で共通しています。

チャットGPTをSEOに活用する方法
コンテンツ作成の効率化
チャットGPTは質の高い文章を迅速に作成できるため、SEO対策用のコンテンツ作成に役立ちます。ブログ記事や商品説明、FAQなど、多様な文章を自然な日本語で生成できます。

キーワード調査と提案
チャットGPTはキーワードに関する質問にも答えられるため、SEOのキーワード調査や提案のサポートが可能です。ユーザーがどんなキーワードを使うべきか、どのように組み合わせるかをアドバイスできます。

コンテンツの改善と校正
SEOで重要なコンテンツの質を保つために、チャットGPTは既存文章の校正や改善も手助けします。文章の流れや表現を自然に整えることで、ユーザーの読みやすさを向上させます。

まとめ
「チャットGPT 日本語」とSEOは、多くの面で似ています。どちらもユーザーのニーズに応えること、キーワードの重要性、質の高いコンテンツ作成、そして継続的な改善を軸にしているためです。

この共通点を理解すれば、ChatGPTを効果的にSEO対策に活用することが可能になります。今後も日本語対応のチャットGPTの進化は続き、SEO業界における存在感もますます大きくなるでしょう。

これからのデジタルマーケティングにおいて、「チャットGPT 日本語」はSEOのパートナーとして欠かせない存在になることは間違いありません。

接触：
会社: ChatGPT JP - Chatgptjp.org
住所：〒151-0064 東京都渋谷区上原2丁目2-20
都市: 東京
国: 日本
郵便番号：151-0064
電話: +81 38-378-5231
ウェブサイト: https://chatgptjp.org/
メールアドレス: chatgptjp.org@gmail.com
#chatgpt #チャットgpt無料 #チャットgpt #ChatGPT日本語 #チャットGPT日本語
ubuntu 22.04.5 に google-drive-ocamlfuse 0.7.32 を導入したメモ

# この記事の目的
ubuntuにgoogle-drive-ocamlfuseを導入した際、ほんの少し手こずったので備忘録として作成しました。

# やり方
### 1. google-drive-ocamlfuseをインストール
[こちら](https://qiita.com/cabbage_lettuce/items/c4544b3e5cd28caf04bc)を参考に下記コマンドを実行しました。
```bash
sudo add-apt-repository ppa:alessandro-strada/ppa
sudo apt update
sudo apt install google-drive-ocamlfuse
```

### 2. Google CloudからクライアントID・シークレットを取得
[こちら](https://help.qlik.com/talend/ja-JP/components/8.0/google-drive/how-to-access-google-drive-using-client-id-and-secret-a-google)を参考にしました。プロジェクト名を`gdrive-ocamlfuse`、アプリ名を`Google Drive for Ubuntu`としてIDとシークレットを取得しました。

### 3. google-drive-ocamlfuseを設定後、Google Driveをマウント
`home`ディレクトリにフォルダ`gdrive`を作成したのち、下記コマンドを実行しました。
```bash
google-drive-ocamlfuse -id (省略).apps.googleusercontent.com -secret GOCSPX-(省略)
google-drive-ocamlfuse ~/gdrive
```
上記1つ目のコマンドを実行すると、『「Google Drive for Ubuntu」にアクセスを許可しますか？』というようなブラウザ画面が開かれるので、許可します。

以上がgoogle-drive-ocamlfuse(0.7.32)の導入方法です。

### 所見
Ubuntu標準のオンラインアカウントを使ってもGoogle Driveにアクセスは出来ますが、VSCodeで`code-workspace`ファイルを起動できない点が不満でした。その点こちらはオンラインアカウントと違ってマウント扱い？(よく分かっていない)のため`code-workspace`を起動でき便利です。

### 手こずったこと
当初、`google-drive-ocamlfuse`コマンドのみで認証設定ができるとの記事をもとに試したところ、`Error: You should specify a client id (-id) and a client secret (-secret)`というエラーを吐かれてしまいました。
[こちらの記事](https://ubuntults.blog.fc2.com/blog-entry-135.html)によると、バージョンの違いによって挙動が異なるようです。0.7.30では一発認証が出来た一方で、0.7.32では認証設定を自分で行う必要があるようでした。(少なくともUbuntu 22.04.5では)
New Relic アップデート(2025年4月)

2025年4月のNew Relic のアップデートをまとめて紹介です！New Relic Now+で発表された新機能の中でGAになった機能を含めて6件のアップデートがでてます！

## [Pipeline Control] テレメトリーデータを柔軟に処理してデータの価値を最大化
テレメトリーデータをパイプライン処理し、柔軟にフィルタ・変換・加工することが可能になりました。パイプラインの処理はNew RelicのUI側だけでなく送信元で送る前に処理することも可能です。データのカスタマイズ性を向上し、データ利用価値の最大化とデータにかかるコストの最適化を両立することができます。
![update202504-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/1a6e6dc4-c836-46e6-846f-23ea924ae28a.png)

## [Compliance] NRQLでユーザーのログインとログオフイベントを照会
New Relic UIへのログインとログオフの履歴をNRQLで照会できるようになりました。username/passwordとSAMLのどちらの認証方式を利用してログインしたか識別可能です。 
![update202504-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/5e48edc4-0cb4-4d81-8cca-f15d3c0f310d.png)

## [Browser] Session ReplayでクロスオリジンでCSSを取得可能に
Session ReplayでクロスオリジンでCSSを取得できるようになりました。これにより、Session Replay 中にCSSを取得できないことで発生する画面崩れや要素の表示ずれが発生しなくなり、実際に見ている画面と同じように閲覧できるようになります。
![update202504-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/c31822df-30ed-418f-8af9-c8a225efd9cd.png)

## [Alerts] 周期性を考慮したアラート設定が可能に
アラートで周期性パターンを考慮して異常値を検出できるようになりました。周期性パターンは時間、日次、週次単位で設定することができ、例えば平日のトラフィックのピークなど、シグナルの定期的な変動を考慮したアラートの設定ができます。
![update202504-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/7d3ed07d-6ce9-49c8-9f2e-5e835bbc98bd.png)

## [Service Level] Terraformコードでサービスレベルの設定を再利用
Service Levelの定義をTerraformコードとしてエクスポートできるようになりました。サービスレベルの定義の再利用性向上や、Infrastructure as Codeによる設定標準化を推進できます。
![update202505-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/c499a7bb-2124-459e-9048-c1f1abacd0cb.png)

## [Query Builder] 画面の最下部からNRQLのクエリ実行がいつでも可能に
NRQLを使ってクエリ実行をするQuery your dataが画面最下部に常に表示されるようになりました。これにより、どの画面からでもNRQLを使えるようになり、シームレスにデータの確認が可能です。なお、これに伴い、All Capabilitiesとメインメニューからのアクセスは廃止になりました。
![update202505-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/b675d9fe-f570-4513-bc63-0eeb44462687.png)

アップデートの詳細はこちらのブログでご確認ください。
↓↓↓↓↓↓
https://newrelic.com/jp/blog/nerdlog/new-relic-update-202504

- **2025年4月アップデート**
  - Pipeline Control： テレメトリーデータを柔軟に処理してデータの価値を最大化
  - Compliance： NRQLでユーザーのログインとログオフイベントを照会
  - Browser： Session ReplayでクロスオリジンでCSSを取得可能に
  - Alerts： 周期性を考慮したアラート設定が可能に
  - Service Level：Terraformコードでサービスレベルの設定を再利用
  - Query Builder：画面の最下部からNRQLのクエリ実行がいつでも可能に
各AIエージェントRulesファイルまとめ

# はじめに
各ポストを受けてまとめてみました。

https://x.com/aidenybai/status/1923781810820968857

### Cursor
https://docs.cursor.com/context/rules
-   `.cursor/rules`
    公式サポート
    
-   `.cursorrules`
    公式サポートではあるが非推奨かつレガシー
    > The .cursorrules file in the root of your project is still supported, but will be deprecated. We recommend migrating to the Project Rules format for more control, flexibility, and visibility.

- `.architecture.md` `.tasks.md`
    MetaのエンジニアによるXへのポスト   

https://x.com/vasumanmoza/status/1923912878370980115

---
### Windsurf

https://docs.windsurf.com/windsurf/cascade/memories

-   `.windsurf/rules`
    公式サポート

-   `.windsurfrules`
    2024年12月12日のXの投稿において`.windsurfrules`への言及があるが、現在公式ドキュメントには記載されていない。

https://x.com/windsurf_ai/status/1866948850205986926
      
---
### Cline
https://docs.cline.bot/prompting/prompt-engineering-guide
-   `.clinerules/`
    公式サポート
    <br>
-   `clinerules-bank/`
    複数コンテキストやチームを持つプロジェクト向け。
    
    <br>
-   `.clineignore`
    無視すべきファイルやディレクトリを指示するファイル。gitignoreに近い。
---
### Claude Code
https://docs.anthropic.com/en/docs/claude-code/memory#determine-memory-type

-   `CLAUDE.md`
    チームで共有する指示文。プロジェクトアーキテクチャ等を含む
    <br>
-   `~/.claude/CLAUDE.md`
    すべてのプロジェクトにわたる個人用メモリ。スタイルガイドやショートカットなど、ユーザー設定を保存する。
    <br>
-   `CLAUDE.local.md`
    個人用のプロジェクト固有の設定。
    <br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929797/0af0d1fa-7b24-4d71-a63f-a22d0865ccff.png)


---
### Sourcegraph

-   `.sourcegraph/memory.md`
    Quinn Slack（Sourcegraph CEO）によるポスト

https://x.com/sqs/status/1885763782703710392

---
### OpenAI CodeX
https://openai.com/index/introducing-codex/   
-   `AGENTS.md`
    現状の公式サポート
    >Codex can be guided by AGENTS.md files placed within your repository.

---
### Google Jules
[追記予定]
現状は確認できず。




# まとめ
元ポストが皮肉っているように各社混沌としている印象でした。1ユーザとしては規格の統一を期待します。
CookieとlocalStorageの違いについて理解が深まった話

## はじめに
Webアプリケーションを開発する中で、「CookieとlocalStorageって何が違うの？」という疑問が出てきた。どちらもブラウザにデータを保存できる機能だが、今回改めて整理してみて、使い所がはっきりした。

## 自動でサーバーに送られるかどうか

最大の違いは、保存されたデータが自動でサーバーに送られるかどうか。

* Cookie：毎回リクエストと一緒にサーバーに送信される
* localStorage：サーバーに送られない。JavaScriptで明示的に送信する必要がある

## セキュリティ設定ができるかどうか

もう一つ大きな違いは、セキュリティ制御の有無。

* Cookieには `HttpOnly` や `Secure`, `SameSite` などのセキュリティ属性を設定できる
* localStorageにはセキュリティ設定がない


## 保存容量の違い

* Cookie：最大で約4KB
* localStorage：5MB〜10MB程度と大きい

## 本質的な使い分けの理解

今回の気づきで一番しっくりきたのはこの整理だった。

* Cookieは「サーバーとの橋渡し」に向いている
* localStorageは「クライアント内の一時保存やUI制御」に向いている

サーバーとやりとりする必要がある情報はCookieに、ユーザー端末内だけで完結する情報はlocalStorageに保存するのが自然な設計だと理解した。

## おわりに
フロントエンドについてはこれから力をつけていこうと思っていたため、この知識は使えるとイメージできた。
ちょっとした知識が大きな土台になることを改めて感じた。
猿でもわかるAIビジネス活用シリーズ 🐵📊 AIを使ったパーソナライズマーケティングの実践法



## AIを使ったパーソナライズマーケティングの実践法：仕組みから実装、現場ノウハウまで

---

## 1. はじめに：なぜ今「パーソナライズマーケティング」なのか？

デジタル広告やECが当たり前となった今、ユーザーは一斉配信された情報では動かなくなっています。そこで注目されているのが**パーソナライズマーケティング**、つまりユーザー一人ひとりに合わせた最適なコンテンツ・タイミング・チャネルでのアプローチです。

しかし、「実際にどうやって実装するの？」「AIをどう使えばいいの？」と感じるエンジニアも多いのではないでしょうか？

本記事では、AIを活用したパーソナライズマーケティングの仕組みから、Pythonを使った実装例、現場でのTipsまでを丁寧に解説します。

---

## 2. パーソナライズマーケティング × AIの全体像

### 🎯 ゴール

ユーザーの行動履歴・属性・購買データなどを活用して、「誰に」「何を」「いつ」「どのチャネルで」伝えるべきかを自動的に判断・最適化します。

### 🧠 活用されるAI技術

| 技術          | 用途例             |
| ----------- | --------------- |
| クラスタリング     | 顧客セグメントの自動生成    |
| レコメンデーション   | 商品やコンテンツの提案     |
| 時系列予測       | 購買タイミングの予測      |
| 自然言語処理（NLP） | メール文面や広告コピーの最適化 |

### 🛠️ システム構成イメージ

```
[データ収集] → [特徴量生成] → [学習モデル] → [API配信] → [A/Bテスト・改善]
```

---

## 3. 実践編：Pythonで商品レコメンドを実装してみよう

### 🔧 使用ライブラリ

* pandas / numpy
* scikit-learn
* lightfm（ハイブリッドレコメンド用）

### 📁 データ例（簡略化）

```csv
user_id,item_id,rating
1,101,1
1,103,1
2,101,1
2,102,1
3,104,1
```

### 💡 コード実装（LightFM）

```python
from lightfm import LightFM
from lightfm.data import Dataset
import numpy as np

# データセットの定義
dataset = Dataset()
dataset.fit((x[0] for x in interactions), (x[1] for x in interactions))

# マトリクス作成
(interactions_matrix, _) = dataset.build_interactions(interactions)

# モデル定義と学習
model = LightFM(loss='warp')
model.fit(interactions_matrix, epochs=10, num_threads=2)

# 推薦（例: ユーザー1への上位3件）
scores = model.predict(1, np.arange(num_items))
top_items = np.argsort(-scores)[:3]
```

> ✅ 補足：LightFMは協調フィルタリングとコンテンツベースを組み合わせたハイブリッド手法で、実用的です。

---

## 4. 現場Tips＆よくある落とし穴

### ✅ 実務で役立つTips

* **特徴量設計が命**：ユーザーの「興味」「温度感」がわかる特徴量（例：クリック頻度、滞在時間）を作る。
* **A/Bテスト文化を根付かせる**：結果は必ず仮説とセットで検証する。
* **API化して使いやすく**：マーケターやフロントエンドが使いやすい形式で提供する。

### ⚠️ よくある失敗

| ミス内容        | 原因例               |
| ----------- | ----------------- |
| レコメンドの精度が低い | 特徴量が粗すぎる、データ量不足   |
| 維持運用がつらい    | モデル更新やデータ連携が属人化   |
| 使われない       | UXを無視した実装で現場に浸透せず |

---

## 5. 応用例とスケールアップ

### 📈 応用例

* **メール配信のパーソナライズ**（件名、タイミング）
* **Webコンテンツ最適化**（バナー、CTA）
* **リアル店舗連携**（Beaconsと組み合わせてPush通知）

### ☁️ スケールアップに向けた技術選定

| 項目        | おすすめ技術             |
| --------- | ------------------ |
| バッチ処理     | Airflow / Dagster  |
| ストリーミング対応 | Kafka / Flink      |
| モデル配信     | FastAPI + Docker   |
| MLOps     | MLflow / Vertex AI |

---

## 6. まとめ：AIパーソナライズの未来と可能性

### ✅ メリット

* UXの向上、LTVの増加
* マーケティング施策の自動化

### ❗ デメリット

* プライバシー配慮（GDPRなど）
* モデルのブラックボックス性

### 🔮 今後の展望

* マルチモーダル（画像×テキスト）対応
* 生成AI（例：ChatGPT）との連携
* Zero-partyデータの活用（ユーザーからの明示的情報）

---

## 🚀 いますぐ試してみよう！

本記事のコードはGitHubに公開しています（※仮）。実際の案件に組み込む際には、自社のデータやシステム構成に応じてカスタマイズする必要がありますが、スタート地点としては十分に実用的です。

> 「マーケティング＝感覚」から「マーケティング＝AI活用」へ。一歩を踏み出してみましょう。

---

### 📝 参考リンク

* [LightFM公式ドキュメント](https://making.lyst.com/lightfm/)
* [scikit-learnでの前処理Tips](https://scikit-learn.org/)
* [MLOpsのベストプラクティス (Google)](https://cloud.google.com/architecture/mlops)