OmniAICreator/Qiita-1.07M huggingface dataset:
山本和佳Tips：元女優志望が教える！AIツールで「エモい」キャッチコピーを量産するコツ


皆さん、こんにちは！山本和佳です。

普段はWebマーケティングの会社でSNS運用を担当しています。元々女優を目指していたという異色の経歴を持つ私ですが、今日はその経験で培った「人の心を動かす表現」の感覚と、現代の強力なツールであるAIを組み合わせた、「エモい」キャッチコピーを効率的に量産する具体的なTIPSを、Qiitaでご紹介したいと思います。

なぜ「エモい」キャッチコピーが必要なのか？
SNS運用において、キャッチコピーは非常に重要です。一瞬でユーザーの興味を引き、投稿のクリック率やエンゲージメントを高めるためには、「エモい」、つまり感情に訴えかける言葉が必要です。しかし、「エモさ」は感覚的なもので、常に最高のキャッチコピーを生み出し続けるのは至難しいですよね。

そこで私が注目したのが、AIツールの活用です。AIは膨大なデータから最適な表現パターンを学習しており、組み合わせ次第で人間の想像を超えるアウトプットを出してくれます。

女優経験で培った「感情表現」の視点
女優として役を演じる際、私は常に「この役の感情をどうすれば観ている人に一番伝わるか？」を考えていました。言葉の選び方、声のトーン、表情、間…すべてが感情表現のツールです。この経験は、キャッチコピーを作る上で非常に役立っています。

例えば、

五感を刺激する言葉を選ぶ: 「キラキラ輝く」「とろけるような」「心震える」など、具体的にイメージできる言葉は「エモさ」を高めます。
共感を生むシチュエーションを想像する: 「もし〇〇だったら」「あの頃の自分に伝えたい」など、読者の感情移入を促すフレーズは強いインパクトを与えます。
問いかけや呼びかけで引き込む: 「あなたは、まだ知らない？」「〇〇で、人生が変わる」など、読者に語りかけることで主体的な興味を引き出します。
これらの感覚的な要素を、AIツールを使いながらいかに効率的に量産していくかが、今回のTIPSの核となります。

AIツールで「エモい」キャッチコピーを量産する具体的なコツ
私が実際に試して効果的だった、AIツールを使ったキャッチコピー量産プロセスをご紹介します。

1. プロンプト設計の基本：具体的な要素を盛り込む
AIに「エモい」キャッチコピーを出力させるには、曖昧な指示ではなく、具体的な情報を含んだプロンプトが不可欠です。

NG例: 「キャッチコピー作って」
OK例: 「[ターゲット層]が[具体的な悩み]を抱えている[商品/サービス名]について、[感情的価値]を感じさせるキャッチコピーを5つ提案してください。特に[形容詞]な言葉や[比喩表現]を使ってください。」

例（SNS運用の会社の場合）
「ターゲットはSNS運用に課題を抱える中小企業経営者です。弊社サービス『SNSバズるん！』について、時間やコストの削減だけでなく、SNSでの成功体験（フォロワー増加、売上向上など）による喜びや達成感を感じさせるキャッチコピーを3つ提案してください。特に、共感を生むような問いかけや、未来を想像させるポジティブな言葉を多めに使ってください。」

2. AIからの出力に対する「女優的フィードバック」
AIが出力したキャッチコピーに対して、ただ「良い」「悪い」で終わらせず、具体的に「なぜ良いのか」「なぜ改善が必要か」を女優の視点から分析し、フィードバックを与えます。

「この言葉、もう少し切なさを出して」
「このフレーズ、もっとワクワク感が欲しいから、〇〇な形容詞を追加してみて」
「ターゲットが〇〇と感じるような、もっと具体的なシチュエーションを想像させる言葉はない？」
このように、感情的なニュアンスを具体的にAIに指示することで、より「エモい」アウトプットを引き出せます。

3. 組み合わせとバリエーションの生成
AIは、一度のプロンプトで複数のバリエーションを生成してくれます。その中から「これは！」と思うフレーズや単語を抜き出し、他の出力と組み合わせることで、さらにオリジナリティの高いキャッチコピーを量産できます。

A案の「〇〇」というフレーズと、B案の「△△」という動詞を組み合わせてみる。
同じテーマで、ターゲットの異なる感情（喜び、不安、期待など）に訴えかける複数のパターンを生成させる。
この組み合わせの作業は、まるで舞台のセリフを試行錯誤する感覚に似ています。

4. A/Bテストでの効果測定と学習ループ
最終的に生成されたキャッチコピーは、実際にSNSでA/Bテストを行い、どの表現が最も効果的か（クリック率、エンゲージメント率など）を数値で確認します。

そして、その結果をAIへの次のプロンプトにフィードバックするのです。「この表現は効果があったから、もっと似たパターンを出して」「この表現は響かなかったから、別の角度から提案して」というように、AIも一緒に学習させていくイメージです。

まとめ：AIと感性のハイブリッド戦略
女優経験で培った「感情に訴えかける感性」と、AIツールの「膨大なデータに基づく表現力」を組み合わせることで、「エモい」キャッチコピーを効率的かつ高品質に量産することが可能です。

AIはあくまでツールであり、最終的に人の心を動かすのは「人間らしさ」や「感情」です。しかし、その「人間らしさ」を最大限に引き出すために、AIは非常に強力なパートナーになり得ます。

今後もAIと人間の感性を融合させた新しいSNS運用術を追求していきたいと思います。このTIPSが、皆さんの日々のコンテンツ作成の一助となれば幸いです。
AWS Certified Solutions Architect - Professional 合格体験記

みなさん、こんにちは！

この度、AWS認定資格の「AWSソリューションアーキテクト プロフェッショナル（SAP-C02）」を取得しましたので、学習方法や試験の感想を共有したいと思います！

## 筆者のAWS歴
AWSの業務経験が約2年半あり、過去に「AWSソリューションアーキテクト アソシエイト（SAA）」を取得しています。
次のステップとして SAP に挑戦しました！

## 試験概要
・試験時間：180分
・問題数：75問
・合格点 750点以上（試験の点数は100～1000点）
※参照：[AWS 認定ソリューションアーキテクト - プロフェッショナル](https://aws.amazon.com/jp/certification/certified-solutions-architect-professional/)

## 学習方法
### 使用した教材
CloudTech AWS資格演習対策コース（2025年6月時点：資格会員 5,480円/90日間）
※参照：[CloudTech TOPページ](https://kws-cloud-tech.com/)

### 教材の特徴・利用した感想
・AWS認定資格12個の対策ができ、会員期間中は全てのコースを受講可能です。
・SAP用の問題集については、300問の練習問題があります。（10問1セット）
ほとんどの問題に解説動画がついており、それぞれの選択肢について正解/不正解の理由まで教えてくれるのが良かったです。
・解説に構成図が含まれているので、学習を進めるうちに、問題文の構成をイメージしやすくなると思います。
 **※SAPの問題集に関するものです。資格によって内容が異なる可能性があります。**

### 学習サイクル
この教材を活用し、下記の学習サイクルで問題集を2～3周しました。

1. 一日に1~2セット解く。
1. 翌日は、前日解いた問題をもう一度解く ＋ 新たに1～2セット解く。
1. 複数回解いても悩んだ問題はブックマークしておく。試験の1週間程前からはそれらを重点的に解く。

### 学習時に意識したポイント
* 初見の問題は悩みすぎない。
⇒分からないものや知らない部分は深く考えても答えが出ない場合が多いので、時間をかけずに割り切って次に進む。

* 解説動画をしっかり視聴する。理解/納得できないところや知識が足りていない部分はサイトや本でも調べる。
⇒暗記も大事ですが、それぞれの選択肢がなぜ間違いなのかを理解することが重要だと思います！

## 試験を受けた感想
・問題も選択肢も文章が長いです。似ている選択肢もあるので、落ちついて読むように意識しました。
・1問あたりにかけられる時間は、平均2.4分とあまり長くないです。ある程度考えても絞れない/自信が無い問題は、見直し用のフラグを設定して後に回すようにしました。本番だといつもより慎重に考え込んでしまうタイプなので、良い判断だったと思います！（全て解き終わったのは終了5分前くらいでした。）

## おわりに
SAP試験は内容が難しく試験時間も長いので疲れますが、その分合格した時は達成感と解放感がありました。
また、複雑な条件に対応するためのAWS設計の知識も深まり、勉強になったと思います。
受験を考えている方の参考になれば幸いです！
Local Deep Researchを試す

# はじめに

Local Deep ResearchはいわゆるDeep Researchをローカルで実行するソフトです。LLMに [Ollama](https://ollama.com/)、検索に [SearXNG](https://searxng.org/) を用いることができるため、比較的プライバシーを重視したDeep Researchが実行できます。

https://github.com/LearningCircuit/local-deep-research

# セットアップ

以下の様な `docker-compose.yml` を作成して立ち上げます。
公式では、[cookiecutter](https://github.com/cookiecutter/cookiecutter) を用いて `docker-compose.yml` を作成していますが、直接作成しました。

```yaml
services:
  local-deep-research:
    image: localdeepresearch/local-deep-research:latest
    container_name: local-deep-research
    network_mode: host  # Best option for connecting to locally running Ollama
    ports:
      - "5000:5000"
    environment:
      - LDR_LLM__PROVIDER=ollama
      - LDR_WEB__PORT=5000
      - LDR_WEB__HOST=0.0.0.0
      - SEARXNG_INSTANCE=http://localhost:8080
      - SEARXNG_DELAY=2.0
    volumes:
      - ./ldr_data:/install/.venv/lib/python3.13/site-packages/data/
      - ./local_collections/personal_notes:/local_collections/personal_notes/
      - ./local_collections/project_docs:/local_collections/project_docs/
      - ./local_collections/research_papers:/local_collections/research_papers/
    restart: unless-stopped
    depends_on:
      - ollama
      - searxng

  ollama:
    image: ollama/ollama:latest
    container_name: ollama
    ports:
      - "11434:11434"
    volumes:
      - $HOME/.ollama:/root/.ollama
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
    restart: unless-stopped

  searxng:
    image: searxng/searxng:latest
    container_name: searxng
    ports:
      - "8080:8080"
    environment:
      - SEARXNG_BASE_URL=http://localhost:8080/
    volumes:
      - ./searxng:/etc/searxng
    restart: unless-stopped
```

# 実行

`docker compose up -d` で立ち上げたら、 `http://localhost:5000` にアクセスします。

![LDR_01](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/4e48ebbd-bc52-48bc-9acd-b7648a6f7f6f.png)

Research Query に質問を入力し、Language Model でモデルを選択して、Start Research で実行します。

![LDR_02](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/b50e5e43-c32b-4ed2-bb50-b3faf28a8915.png)

しばらくすると、レポートができあがります。レポートは PDF や Markdown で書きだすこともできます。

![LDR_03](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/ef8b5adc-4a40-4e44-864a-69f827668fb8.png)

History から、過去に作成したレポートの確認ができます。

![LDR_04](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/3a2603c7-8795-4477-8ea9-4b981ea85304.png)

# まとめ

ローカルで Deep Research 実行できる Local Deep Research を試しました。レポートの質は使用するLLMに左右されると思いますが、それなりのものが出力されました。ローカルで、Deep Research を実行できるものは他にもありますが、GUIがあり現在も更新が続いているものとして、有力だと思います。
Mac環境化での、dev containerの始め方についての質問なんですが、

Macでdev containerで、はじめるのにまず

vscodeのウィンドウの
左下の><みたいや所クリックして
新規にコンテナとイメージ？を作るとします。

で、次に解説によく出てくる

「Reopen in Container」
っていうのが
コマンド+シフト+p
でも出てきません。

なので新規でいつもコンテナとイメージ作るだけで
うまくdev containerを動かせません。

うまく動かせると左下の><だった部分がdev containerっていう文字が左側に来て
右側には作ったコンテナ名？ですか？違う？なんかとにかくなんらかの名前が来ると思うんですが・・・


分かる方、どうかよろしくお願いします。m(__)m

![IMG_4983.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1230737/5a7e32ba-707f-4296-8875-d62f87e033bb.png)
HTMLの構文チェックを手早く行う

## 概要
・ブラウザの画面上で選択しているhtmlのコードをチェックすることが可能です。
・htmlのコードは部分的なものでも可能です。
・あらかじめブックマークレットを作成しておき、それを呼び出すことでチェックする方法です。
・チェックにはW3C Markup Validation Serviceを使用しています。

## 方法
ここではChromeを例にします。

#### １. ブックマークマネージャーを開く。
#### ２. 右クリックから「新しいブックマークを追加」を選択する。
#### ３. 以下のように登録する。
名前：なんでもよい
URL：後述の「ワンライナー版.js」のコードをコピーして貼り付ける
![スクリーンショット 2025-06-06 15.12.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15241/5d459ee0-c03e-409e-a76a-007e71bc5ed7.png)

```ワンライナー版.js
javascript:(function(){const selected=window.getSelection().toString();if(!selected.trim()){alert("文字列が選択されていません。");return;}const wrappedHTML='<!DOCTYPE html>\n<html lang="ja">\n<head>\n<meta charset="UTF-8">\n<title>Validation</title>\n</head>\n<body>\n↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓\n'+selected+'\n↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑\n</body>\n</html>';const form=document.createElement("form");form.method="POST";form.action="https://validator.w3.org/nu/";form.target="_blank";form.enctype="multipart/form-data";const textarea=document.createElement("textarea");textarea.name="content";textarea.value=wrappedHTML;const output=document.createElement("input");output.type="hidden";output.name="out";output.value="text";form.appendChild(textarea);form.appendChild(output);document.body.appendChild(form);form.submit();document.body.removeChild(form);})();
```

#### ４. ここまでで準備は整ったのであとは使うだけ。
#### ４.１. チェックしたいhtmlコードを選択状態にして、ブックマークレットをクリックする。
以下を例にすると、aタグを選択したあとにHtmlCheck（ブックマークレットの名前）をクリックする。
![スクリーンショット 2025-06-06 15.21.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15241/ec2ebf7d-7fb0-452b-a368-1b75c221bf25.png)

#### ４.２. 別タブにチェック結果が表示される。
正常な場合には、以下のような表示になる。（エラーメッセージが表示されていない）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15241/745f4274-63a6-4fc6-b18d-607bb58271c9.png)
ラッピング（htmlとかbodyタグを付与）してチェックにかけているので、上図のSource部分はそのようなコードになっている。（赤枠部分が今回選択してチェックしようとしたコード）

チェックエラーの場合には、以下のようなメッセージが表示される。
![スクリーンショット 2025-06-06 15.30.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15241/4761e304-db0a-4930-88db-88a4da9b3ddc.png)


## ブックマークレットのコード
中身は「ワンライナー版.js」と一緒だけど見やすいように整形したもの

```整形版.js
javascript:(function() {
  const selected = window.getSelection().toString();
  if (!selected.trim()) {
    alert("文字列が選択されていません。");
    return;
  }

  // 完全なHTMLにラップ
  const wrappedHTML = `<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Validation</title>
</head>
<body>
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
${selected}
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
</body>
</html>`;

  // フォームを作成してPOST送信
  const form = document.createElement("form");
  form.method = "POST";
  form.action = "https://validator.w3.org/nu/";
  form.target = "_blank";
  form.enctype = "multipart/form-data";

  const textarea = document.createElement("textarea");
  textarea.name = "content";
  textarea.value = wrappedHTML;

  const output = document.createElement("input");
  output.type = "hidden";
  output.name = "out";
  output.value = "text";

  form.appendChild(textarea);
  form.appendChild(output);
  document.body.appendChild(form);
  form.submit();
  document.body.removeChild(form);
})();
```
高校物理


---

## ✅ 周囲の構造と対応する意味

### 【1】一定加速度運動
* $F/m = \alpha = \text{const.}$ のとき
* 解：

  $$
  x(t) = x(0) + \dot{x}(0)t + \frac{1}{2}\alpha t^2
  $$
* 等加速度直線運動の基本解

---

### 【2】制動運動

* 抵抗力 $F = -k\dot{x}$（速度比例の減衰力）
* 解：

  $$
  v(t) = v(0)e^{-kt/m}
  $$
* 指数関数的に速度が減衰（空気抵抗・粘性抵抗）

---

### 【3】単振動

* 弾性力 $F = -kx$（フックの法則）
* 解：

  $$
  x(t) = x(0)\cos\left(\sqrt{\frac{k}{m}}t\right)
  $$
* 単振り子やばねのような**単振動運動**

---

### 【4】運動エネルギーと仕事

* 両辺に速度をかけて積分すると、仕事の定理が得られる：

  $$
  \frac{1}{2}mv_2^2 - \frac{1}{2}mv_1^2 = \int_{x_1}^{x_2} Fdx
  $$

---

### 【5】保存力場

* 保存力とはポテンシャルエネルギーの勾配：

  $$
  F = -U'(x)
  $$
* 例えばバネのポテンシャル $U(x) = \frac{1}{2}kx^2$

---

### 【6】力学的エネルギー保存則

* 保存力場における全エネルギーの保存：

  $$
  \frac{1}{2}mv_1^2 + U(x_1) = \frac{1}{2}mv_2^2 + U(x_2)
  $$

---

### 【7】運動量保存と力積

* 運動量の変化：

  $$
  mv_2 - mv_1 = \int_{t_1}^{t_2} Fdt
  $$
* **力積＝運動量変化**の原理

---

### 【8】系の運動量保存則

* 二物体の系に対する保存：

  $$
  m^A v^A + m^B v^B = \text{const.}
  $$

---

### 【9】力と加速度の積分関係
* 両辺積分：

  $$
  \int_{t_1}^{t_2} m\ddot{x} dt = \int_{t_1}^{t_2} F dt
  $$

---
モダンなDB設計しか知らないSEがレガシーシステムで陥った“知らない常識”

みなさんは「**外部キー制約が一つもないDB**」を見たことがありますか？

私は「Web系」や「SaaS」「モダンなアプリ」でしか開発経験がなかったSEです。  
転職して初めて「日本のレガシー基幹システム」の現場に入り、  
その“あまりにも違う常識”に驚かされた体験を記事にまとめます。

---

## モダンなDB設計の“セオリー”

- テーブルを設計したら、**PK（主キー）・FK（外部キー）を必ず定義**
- **リレーション＝DB構造で保証**されている安心感
- DDL（CREATE TABLE文）やER図も「FK制約」を当たり前のように持っている

**例）テーブル定義での外部キー指定**

```sql
CREATE TABLE orders (
    order_id NUMBER PRIMARY KEY,
    customer_id NUMBER,
    CONSTRAINT fk_orders_customers
      FOREIGN KEY (customer_id)
      REFERENCES customers(customer_id)
);
```

---

## 現場で出会った“想定外”の世界

- テーブル定義を見てみると**外部キー制約が一つも無い…！？**
- 設計書（Excel）やER図に**リレーション線すら無い**
- 担当者「JOINでつなげばいいんです」「アプリ側で運用してますよ」
- **「えっ、それで本当にデータの一貫性大丈夫なの？」と戸惑う日々**

---

## SQLでしか“つながっていない”DB

現場でよく見るSQLの実例：

```sql
SELECT
    A.受注番号,
    B.受注行番号,
    ...
FROM
    受注伝票データ A
    LEFT OUTER JOIN 受注明細データ B
      ON A.受注番号 = B.受注番号
WHERE
    ...
```

- **JOIN句でリレーションを“都度つなぐ”だけ**
- DBは「A.受注番号」と「B.受注番号」の**整合性を何も保証してくれない**
- データ登録・移行・削除時も**アプリのロジックやバッチで手作業チェック**

---

## なぜこうなった？歴史と現場のリアル

- 「大量データをバッチで一気に処理したいから」
- 「外部キー制約があるとデータ移行や一括削除が面倒」
- 「現場の都合で、過去に“制約が邪魔”になったことが何度も」
- 「設計書やSQLで“人間がリレーション”を守るという文化」

---

## 何が困る？ギャップとリスク

- **“多：多”のJOINで想定外の重複・膨張データ**
- **親が無い子レコードが平気で作れてしまう**
- **集計ミスや納品ミス、データ不整合が起きてもDBは止めてくれない**
- **設計書・バッチ・属人運用頼みで継承ミス・運用事故が絶えない**

---

## モダン設計との違い・どうすればいい？

- **物理的な外部キー制約を張るのが王道！**  
　→ DBが“守ってくれる安心感”  
- **どうしても制約が張れない現場では…**  
　→ 移行前検証スクリプト、設計書ルール、開発時のレビューを徹底

---

## まとめ・これから現場に入る人へ

- **“SQLのJOINだけではリレーションにならない”**
- **DB設計＝制約も一緒に設計するのがベストプラクティス**
- レガシー現場に出会ったら、「なんでこうなっているのか？」を担当者にしつこく聞いてみよう
- 自分が何を“常識”だと思っているのか、一度棚卸ししてみるのも大事！

---

## おわりに

皆さんも、レガシーな現場で“知らない常識”に出会ったことがあれば、ぜひコメントで教えてください！

---
PLATEAU CityGML がつんと Download

PLATEAU の CityGML がっつりほしいときあるから Script 書いた
これだと展開後はテラバイトになる可能性もあるので、TODO 対応必要なはず

# TODO

たぶんこの辺も追加したいけど、bash じゃ厳しそうだから、簡単コマンドツールにしたほうがいいんだろうな

+ "PLT:pref": "東京都" なフィルタリング
+ 複数年度あるのは、一番新しいのだけを
+ unzip も連携しているようなそれ
    + udx/bldg だけとかも指定できるオプション
+ 進捗表示
+ 途中でやめたときは、中途半端なダウンロードのファイルを消す
+ 再開もできるように

## bash

```bash
#!/bin/bash

# 一時ディレクトリを用意
TMPDIR=$(mktemp -d)

# 1. メイン CKAN パッケージの JSON を取得
echo "Fetching main package information..."
main_json=$(curl -s "https://www.geospatial.jp/ckan/api/3/action/package_show?id=plateau")

# 2. 含まれるサブ JSON URL を取得
echo "Extracting resource URLs..."
resource_urls=$(echo "$main_json" | jq -r '.result.resources[].url')

# 3. 各サブ JSON を処理
for res_url in $resource_urls; do
    echo "Fetching sub JSON from: $res_url"

    # redirect 対応のため -L オプションを使用
    sub_json=$(curl -s -L "$res_url")

    echo "Processing sub JSON..."

    # 4. data_update[].metadata["PLT:url"] に該当する zip URL を抽出
    zip_urls=$(echo "$sub_json" | jq -r \
        '.data_update[].metadata["PLT:url"] | select(test("\\.zip$"))'
    )

    echo "Found ZIP URLs:"
    echo "$zip_urls"

    # 5. 該当 ZIP をダウンロード
    for zip_url in $zip_urls; do
        filename=$(basename "$zip_url")
        echo "Downloading ZIP: $filename"
        curl -L -o "$filename" "$zip_url"
    done
done

# 後処理
rm -rf "$TMPDIR"
echo "All done."
```

## PowerShell

```
# ===================== 実行ポリシー確認 =====================
$currentPolicy = Get-ExecutionPolicy -Scope Process

if ($currentPolicy -ne 'Bypass') {
    Write-Warning "現在の実行ポリシーは '$currentPolicy' です。スクリプトの実行に失敗する可能性があります。"
    Write-Host "一時的に許可するには、以下のコマンドを実行してください:"
    Write-Host "`nSet-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass`n"
    Pause
    return
}

# ===================== スクリプト本体 =====================

# 一時ディレクトリ（未使用だが必要なら活用可）
$tmpDir = New-TemporaryFile | Split-Path
Write-Output "Using temp directory: $tmpDir"

# 1. メイン CKAN パッケージの JSON を取得
$mainJsonUrl = "https://www.geospatial.jp/ckan/api/3/action/package_show?id=plateau"
Write-Output "Fetching main package information from $mainJsonUrl"
$mainJson = Invoke-RestMethod -Uri $mainJsonUrl

# 2. 含まれるリソースURLを取得
$resourceUrls = $mainJson.result.resources | ForEach-Object { $_.url }

# 3. 各サブ JSON を処理
foreach ($resUrl in $resourceUrls) {
    Write-Output "`nFetching sub JSON from: $resUrl"
    try {
        $subJson = Invoke-RestMethod -Uri $resUrl
    } catch {
        Write-Warning "Failed to fetch or parse JSON from $resUrl"
        continue
    }

    if ($subJson.data_update) {
        foreach ($entry in $subJson.data_update) {
            $metadata = $entry.metadata
            if ($metadata.'PLT:url' -match '\.zip$') {
                $zipUrl = $metadata.'PLT:url'
                $filename = Split-Path $zipUrl -Leaf

                Write-Output "Downloading ZIP: $filename"
                try {
                    Invoke-WebRequest -Uri $zipUrl -OutFile $filename
                } catch {
                    Write-Warning "Failed to download $zipUrl"
                }
            }
        }
    } else {
        Write-Output "No data_update section found in this JSON."
    }
}

Write-Output "`nAll done."
```
「SQL初心者がKPIダッシュボードを自作するまでにやったこと」


こんにちは、長田総一郎です。

スタートアップ企業のマーケティング支援を行う中で、データドリブンな意思決定の重要性を日々感じています。

今回は、SQL初心者だった私が、KPIダッシュボードを自作するまでのプロセスを共有したいと思います。

1. なぜKPIダッシュボードが必要だったのか？
マーケティング活動の効果を可視化し、迅速な意思決定を行うためには、リアルタイムでKPIを確認できるダッシュボードが不可欠です。

特にスタートアップのようなスピード感が求められる環境では、データに基づいた迅速な判断が求められます。

2. 使用したツールと技術
データベース: MySQL

ダッシュボードツール: Geckoboard


SQLクエリ作成支援: ChatGPT

Geckoboardは、SQLクエリを用いてデータを可視化するのに適したツールであり、初心者でも扱いやすいインターフェースが魅力です。 


3. KPIの定義とデータ構造の設計
まず、追跡すべきKPIを明確に定義しました。

例えば、ウェブサイトの訪問者数、コンバージョン率、広告のクリック率などです。

次に、これらのKPIを計算するために必要なデータを整理し、MySQLに適切なテーブル構造を設計しました。

4. SQLクエリの作成とダッシュボードへの統合
SQL初心者として、最初はクエリの作成に苦労しました。

しかし、ChatGPTを活用することで、必要なクエリの作成を効率化できました。

作成したクエリをGeckoboardに統合し、リアルタイムでKPIを表示するダッシュボードを構築しました。

5. 学びと今後の展望
このプロセスを通じて、SQLの基本的な理解と、データを活用した意思決定の重要性を再認識しました。

今後は、より高度な分析や自動化を取り入れ、さらに効率的なマーケティング支援を目指していきたいと考えています。

SQL初心者でも、適切なツールとサポートを活用すれば、KPIダッシュボードの自作は可能です。

データドリブンなアプローチを取り入れることで、より効果的なマーケティング戦略を実現できると確信しています。

ご興味のある方は、ぜひ一度試してみてください。
MINTIA(清涼菓子) へ ESP32 を組込む ~ 準備編 ~

# はじめに
[MINTIA(清涼菓子)](https://www.mintia.jp/product/) の空ケースがあまりがち

![IMG_4921_.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214132/2b2fef90-502c-458e-94c0-dd3ad698fbba.jpeg)


[ESPRESSIF社](https://www.espressif.com/) が販売している [ESP32シリーズ](https://www.espressif.com/en/products/socs/esp32)を使用し
MINTIAケースに収まる実験機を作ると面白いよね

という事からスタート

最初のうちはハードの話ばかりですが、
そのうちソフトの話も出てくる(はず


# 最終形態 (仮
* ESP32
    * WiFi / BLE が使用可能なので色々便利
* Acconeer XM125 60GHz Radar
    * 国内技適取得済モジュールなので安心
    * 色々検出出来るモジュール 素晴らしい
* IR Sensor Array
    * Panasonic / Melexis 社の IR Sensor 搭載可能
    * I2C にて ESP32へ接続
    * ヒートマップなどをアプリで確認する予定

![DemoPCB.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214132/2cc3cf71-d4e0-4978-83c0-814a3bcdb3f8.jpeg)





# 使用する CAD
今回は MINTIA ケースに収まる基板外形図までを作成する
使用する CAD は [KiCAD](https://www.kicad.org/) Version 6 (Free)を使用する

## KiCAD Version 6
無償であるにも関わらず、かなりパワフル。
Mainで使用しているPCでは何故か不安定だが、
Sub PC (Win11, Linux)ではすこぶる快調www

メモリも結構喰う為、Teams や Notion など
メモリドカ食いアプリが多数動いていると、不安定になりやすい
※Version 4 の時はこんな事なかった....


# 採寸
世の中に MINTIA ケースを採寸した情報が見当たらなかったので、
まずは採寸
色々採寸

![IMG_4939_.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214132/71db9e0e-9a58-4e6b-b7a0-4255a38f2759.jpeg)

![IMG_4940_.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214132/a9a543e2-59f8-4d68-a003-8dec9b40707e.jpeg)


## タブレット取り出し口
タブレットがケースから出やすいようにガイドが付いている

あぁなるほどね　と感心しつつも
基板を作るうえでは邪魔....

![IMG_4923_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214132/8969b828-d442-4bde-917d-a0662de7aa83.png)


## 一先ず避けて基板寸法を算出

![Ki_001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214132/169789f3-4e58-491a-b87d-3d9de1da4988.jpeg)


## 紙に印刷
一旦印刷し、ハサミとカッターを駆使してケースへはめ込む
一先ず大丈夫そうな感じ

![IMG_4925_.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214132/05cd100a-4da3-41e1-a034-863ad79209b2.jpeg)

## 細かい所の寸法を追い込む

![Ki_002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214132/e53bd5f6-8042-4ee7-9eec-46fb2b356004.jpeg)


良い感じになったと思われる。


# 確認
USBコネクタ位置や他の部品などがケースへ干渉する可能性があるので、
一旦 3D Printer にて モデル出力を行い確認

![IMG_4928_.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214132/a150d36b-9bd1-49bf-b579-ec22c2e3c1cd.jpeg)

![IMG_4927_.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214132/1f627771-2179-4bf8-ba3d-c7b14dddb7b0.jpeg)


いい感じ

# 最後に
基板外形算出は完了したので、
あとは回路及び基板、ソフトを作るのみ

* MINTIAのケースは薄いので、基板厚は 1mm以下が望ましい
* 部品は片面実装が良いと思われる
* 部品は極力低背のものを選定
* ESP32 ファームウェアは USB経由にて書けるようにする


**MINTIA実験機をポケットから出したらウケそうな気がする...**



## Webから発注可能な基板メーカー
[Seeed Studio | Fusion](https://www.fusionpcb.jp/)の場合、数年前まで
基板厚 1.6mm 未満は値段が跳ね上がっていたが、
今は 1.0mm までは 4.9 USD 程度で基板が 10枚作れるので
非常に良い時代になった www

頑張って、回路 & 基板 を書こうっとwww

## KiCAD6 用データ
基板外形図、USBコネクタ位置情報のみですが、
参考として KiCAD Versin 6用 データを [git](https://github.com/HLDC-FJ/ESP32-EVK_MINTIA) に上げておきます



今回はここまで

[次回 "MINTIA(清涼菓子) へ ESP32 を組込む ～ 回路、基板設計 ～"](https://qiita.com/TTL/items/4987077ce9cf24eee11f)
＼(^o^)／ｵﾜﾀ 1文字のタイプミスでLinuxをブッ壊した話

# 初めに
これはうｐ主がLinuc101試験に向けた授業を受けているときのお話である。

:::note alert
危険なLinuxコマンドが出てきます。
実際の環境では絶対に実行しないでください。
:::

:::note warn
この記事で紹介されているコマンド実行したことによる責任は”一切”取れませんのでご注意ください。
:::


## うｐ主の環境
Windows11の上に乗っかったバーチャルボックスの仮想環境の中の学習用AlmaLinuxでのお話。
|環境詳細|
|:-----------|
|学習用AlmaLinux|
|VitualBox|
|Windows11|

# Linuxに住まう住人たち
|ユーザー|役割|
|:-----------|:------|
|root|このLinuxの管理者|
|testuser|Linuxの一般ユーザー|
# 悲劇への第一歩
それはうｐ主がLinuxのファイル所有者とパーミッションを勉強しているときである。

その中の所有者を変更する[chown]コマンドで悲劇が起きた。
うｐ主は教科書コマンドの実行例の中にあるこのコマンドを実行しようとした。

```Linx:linux
chown -R testuser .
```
chownコマンドはこのファイルの所有者を変更するというコマンド。
-Rは再帰的という意味でディレクトリの中身全部に対して操作を行うという意味(ディレクトリの中のディレクトリも対象)。
再帰的の時点で危ない臭いがプンプンする。
実行対象の[.]は今いるディレクトリを指す。
このコマンドの場合、今いるディレクトリの中身をすべての所有者をtestuserにするという意味になる。

# 悲劇の始まり
ここでうｐ主がこのコマンドを打ってしまった
キーボードで[.]の隣の[/]を押してしまったにもかからず、Enterを押してしまった。
```Linx:linux
chown -R testuser /
```
Enterを押した瞬間大量の警告メッセージが高速で画面に表示される。
一瞬なにが起きたのかうｐ主は理解できなかった。
でも、すぐにこのメッセージがプロセスが使用中、または、権限が無いため拒否されたということに気づいた。
気づいた時にはもう遅かった。もうこのコマンドの魔の手がルートディレクトリ配下のファイルたちに伸びていたのだ。
うｐ主は焦っていたため、ctrl+Cを押すことを忘れ、コマンドの実行が正常に終了してしまった。
拒否されたファイル以外のすべての所有者がtestuserになってしまった。

終わった。

と思っていたが、Linuxは正常に動いている。
慌てて所有者をrootに戻すコマンドを打った。

```Linx:linux
chown -R root /
```
また大量の警告メッセージが出たが、不思議と安心感があった。
これで大丈夫だったんだと思いながら授業を進める。
その後のコマンド操作も問題なくできた。
「本当にこれで大丈夫なんだろうか。」
うｐ主は心配で頭がいっぱいだった。

# 授業の終わり
授業が終わり、このやらかしたことを先生に話した。
先生は「ほとんどのファイルの所有者はrootだけど一部ルート以外が所有者になっていることもある。」と言っていた。

ということは、この膨大なファイルを一つ一つ適切な所有者にしなければならないということだ。
「いや、大丈夫だろう。まだ元気に動いているし。」
心の中で現実逃避しながら自分の席に戻る。
そして、AlmaLinuxの電源をコマンドで切る。
これが最後のコマンドだとは知らずに。
```Linx:linux
shutdown -h now
```
# 絶望の始まり
翌日授業が始まる前にVirtual BoxマネージャーでAlmaLinuxを起動する。
が、いくら待っても黒い画面から変わらない。
1分待っても10分待ってもかわらない。
再起動しても変わらない。
昨日まで元気だったのに...俺のコマンド一つでこんなことに...
昨日のあのコマンドで一つ隣のキーを押していれば
GRUBすら起動しないのでレスキューモードもできない。
もう助けられないと悟ったうｐ主はVirtual BoxからひっそりとAlmaLinuxを除去したのだった。

# 絶望のその後
Windowsのダウンロードファイルをあさっているとova形式のファイルが残っていた。
過去の俺ナイス!と思いながらVirtual BoxにインポートしてLinuxは復活した。
「二度とこんな目に合わせたくない」と心に誓い、Linuxを起動する。
初期セットアップが面倒だったが、これでやっと環境が復活した。

# やらかした原因
Linux学習するときは必ずと言っていいほど管理者権限でコマンドを実行します。このやらかしたコマンドを打ってしまった時も管理者権限。

うｐ主は何も考えずに高速でタイピングしていたので、打ち間違いが発生。

# このやらかしから学んだこと
Linuxを学習している今のうちから管理者権限の危険性を意識しながらコマンドを打っていこうと思いました。

# 実はうｐ主がLinux壊したのはこれが3回目
暗い雰囲気を吹っ飛ばして申し訳ありませんが、
実はうｐ主Linuxを3回壊してますww

1回目は大量のアップデートをダウンロードした後のインストール作業中にPCの電池切れで強制終了して、そのまま起動しなくなりました。

2回目が今回の記事の内容

3回目は今回の記事の事件が起こった後、入れなおした新品のLinuxで前回書いた記事のネタのために[rm -rf /]コマンドを実行して壊しています。
「二度とこんな目に合わせたくない」と心に誓い、Linuxを起動する。というシーンで出てきたLinuxで[rm -rf /]を実行しました。(感動を返せ!!)

前回の記事↓

https://qiita.com/syougo-916/items/878c6633633b212b6abf

# 終わりに
ここまで読んでいただきありがとうございました!
ちょっと小説風に書いたので数年後に黒歴史になっているかもw
皆さんはうｐ主みたいにやらかさないように注意してくださいね。
文系学部生がハッカソンに出て世界が少し広がった話

## はじめに
私は27年度卒でITエンジニアを目指している，文系学部三年生です。今回は，私がチーム開発未経験で[PRTIMESハッカソン2025Winter](https://prtimes.jp/main/html/rd/p/000001483.000000112.html)に参加した体験についてお話ししたいと思います。

## 参加前の技術レベル
ハッカソンに参加する前の私の技術レベルは，PythonとJS,TSがすこし書ける程度でした。個人でウェブページを作ったりしていましたが，**サーバーを立てたりフレームワークを使ったりするアプリの開発の経験は0**でした。Githubは一応使っていましたが，コミットはすべて一括でやっており，gitコマンドは`push force`しか使ったことがありませんでした(笑)。ブランチとは何かも知りませんでしたし，プルリク？マージ？なにそれ状態でした。

## ハッカソンの概要
私が参加したハッカソンは，PRTIMES本社のオフィスで30名程度の学生が集まり，3日間で成果物を完成させるというものでした。今回は開発のテーマが設定されており「夢の発信を支援するウェブサービス」でした。今回は事前に技術スタックなどが考慮されチームが組まれていました。基本的には4人1チームでしたが，私たちのチームだけ1名欠席だったので3人でした。チームメンバーの2人は経験値豊富な理系大学院生でしたが，1名の欠席と未経験の私のサポートもあったので，ほかのチームよりもハンデを追っていたと思います。開発中はずっとメンターさんが1チーム1人以上ついてくれて，とても手厚いサポートが受けられました。

## アイデア出し・技術選定
最初はアイデア出しと技術スタックの選定によりサービスの要件定義を行いました。アイデア出しのフレームワークを使い，根拠に基づいてサービスの内容を決めていきました。初めはそのような方法に慣れず戸惑いましたが，徐々に意見の出し方を学び少しは貢献できたと思います。技術選定では，お互いに使える言語やフレームワークを出し合い，共通して使えそうなReact + TypeScriptに決定しました。この時は**Reactが何なのかわかっておらず，そもそもフレームワークとは？という状態**でしたが，TypeScriptなら大丈夫だろうと楽観的に考えていました。アイデア出しにかなり時間を使いましたが，何とか作りたいものが固まり開発に入りました。

## 環境構築など
開発が始まり，環境構築やGithubの設定を最初に行いました。環境構築についてもよくわかっておらず，チームメンバーの言うとおりにコマンドをたたきReact + Viteの環境を構築しましたが，何が起きたのかわかっていませんでした。チームの2人はチーム開発の経験値があり，ターミナルやgitの使い方も当然知っているというレベルだったので全くついていけず，この時点でレベルの差を実感しました。

## Reactを使ったフロントエンドの開発
開発が開始する前はTypeScriptなら少し書けると思っていましたが，開発が始まってからその考えの甘さを痛感します。幸いなことに，PRTIMESのメンターさんのサポートが手厚く，コンポーネントとはというところから教えていただきました。また，フロントエンドとバックエンドを分け，APIによってデータを受け渡すということも初めての実装だったのでハッカソンの期間中は正直あまり理解できませんでした。他にもわからないことがたくさんあり，**チームの役に立てていないという実感や，自分の技術力のなさに対する劣等感が募り正直きつかった**です。しかし，そのように大きなストレスを感じているときこそ成長のチャンスだと思い自分ができることを考え取り組みました。

## 学びと成長
ハッカソン中はわからないことや教えてもらったことをできるだけメモに残しておきました。すべてが初めてで戸惑いの連続でしたが，知らないことを素直に受け入れ、できることから取り組む姿勢が少しずつ身についたと思います。ハッカソンが終わった後はそのメモをもとにわからないことを一つずつつぶしていき，ハッカソンの前と比較して大きく成長しました。チームのメンバーは開発に追われる中，gitやターミナルの操作の初歩的なことを親切に教えてくれました。私の学びになるようにと考えてくれて，ここは自分で調べて実装してみてねと言ってもらったのがとても印象的でした。たくさん迷惑をかけましたが，ハッカソンという**「やらなければならない状況」でできなかったことに対するストレスは学びのための大きな原動力に**なりました。

## チームのその後
私たちのチームの成果物は残念ながら賞は取れませんでしたが、それ以上に「完成後も作り続けたい」と思える体験になったことが何よりの成果でした。チームメンバーは私以上に開発の熱意があり，**ハッカソンが終わった後も成果物をアップデートしていこう**ということになりました！それから約3か月間，アプリの改善と修正を続け3人が納得できる形までもっていくことができ，メンバーのおかげでデプロイもすることができました。

## おわりに
私はこのハッカソンに参加したことで，大きく成長することができました。私は文系学部生で同じような志を持つ学生と交流する機会がありませんでした。当然，自分の技術レベルを知る機会もなければ，ほかの学生がどのような活動をしているのかも知りませんでした。1人での開発はもちろん学びになりますが，チーム開発はもっとたくさんの学びになると思います。私のように完全未経験で参加するのはチームの人たちに迷惑が掛かるのでお勧めしませんが，**1人で技術を磨くよりも早い段階で実際のチーム開発に携わった方がはるかに成長スピードが速い**です。私のように文系の学部でITエンジニアを目指している方や情報系以外の学部で目指している人がもしいれば，ぜひハッカソンやインターンなどに参加してみてください！世界が広がります！

## 成果物「DreamBase」
夢のメモ帳を作り夢を発信する土台を作るサービスです。夢を発信することに抵抗がある方はぜひこのアプリで夢のメモ帳を作成し，発信する勇気や自信をつけていってほしいです。以下のリンクから試してみてください！
[DreamBase](https://dreamsink.vercel.app/)
TechBull_LT会#2参加レポート（自分用まとめ）

# はじめに
2025/6/4(水)にTechBull_LT会#2というSREイベントに参加したのでレポートです。
イベント概要はこちら
https://techbull.connpass.com/event/351941/

皆さん非常に興味をそそられる内容でしたが、個人的に特に面白かった＆活用できそうな情報についてまとめます。
※一部、思い出しやすいように自分の言葉でアレンジしています。ご了承ください。

## 【少人数チームでAI活用して業務改善した話】
### 課題

- アラート監視
- レビュー負荷が高い（単純に人手不足）
- 組織としてツールやサービスに投資する資金はないため安価に改善したい

組織としてツールやサービスに投資する資金はないため安価に改善したい

### 改善策
アラート監視
- NotebookLMに普段のアラートログを読み込ませる
- 同様のアラート出力時にNotebookLMに質問→分析→回答
https://www.dsk-cloud.com/blog/gws/what-is-notebooklm

アラート分析の初動が早くなった！
- レビュー負荷が高い（単純に人手不足）
- cursor rulesを導入しコーディングルールを定義＆読み込ませる
- コーディング規約に沿ったソースコードAI自動生成
- 細かい指摘が減ったので全体のレビュー負荷が減少した！
https://zenn.dev/globis/articles/cursor-project-rules

## 【AIを活用して若手エンジニアの成長を加速させる】
### 課題
- 振り返りに時間かかる
- 強み弱みの可視化難しい
- 成長志向を見失いがち

### 改善策
AIに考えていることやアクションをすべて記録＆学習させ、提案してもらおう
学習サイクル
1. 収集：意識的な作業記録（何を考えて、何をやったか）
1. 分析：行動パターンの特定（私はこんな傾向がありそうを教えてもらう）
1. 可視化：課題解決のロードマップ（課題解決のために何したらいい？を教えてもらう）


今週の学習サマリー　→　現状分析　→　理想の状態をAIに聞く　→　具体的アクションのロードマップ提示

## 【AIの最新動向を自動キャッチアップする機構を作った話】
### 課題
- AI活用したいよね
- でも毎日大量に新情報出てきてキャッチアップ疲れるよね

### 改善策
自動キャッチアップする機構をつくる
- GoogleTrendsにて「AI」をキーワードに検索
- 関連キーワードの上位を取得
https://trends.google.co.jp/trends/explore?q=AI&date=now%201-d&geo=JP&hl=ja

- 関連キーワードをWeb検索
- 検索した記事をAmazonBedrockで要約
- AzureLogicAppsでワークフロー化
- 要約した内容を通知（SlackとかTeamsとか）
https://azure.microsoft.com/ja-jp/products/logic-apps

## 【CVEを広報するということ byバグハンター】
バグハンターさんのお仕事
- 脆弱性を発見　→　報告＆通知

### 課題
- 報告した脆弱性を無視せずに対応して欲しい

とは言え「日々の業務大変だから脆弱性アラートはつい見逃しちゃうよね」
バグハンター・エンジニア双方の頑張りを認め合って、より良い社会にしていきたいね

# 所感

TechBullLT会は初めて参加しましたが、100人規模とたくさんの方がいらっしゃいましたが、適度にゆるく情報交換のしやすい雰囲気のイベントだなと感じました。
またSRE以外にもAIや機械学習（トレンドだもの）の話題もあり非常に有意義でした。
また参加したいと思います。
高速なLINQ互換パッケージ ZLinq

## 参考

この記事は、以下の動画を参考にしています。
詳しくは、動画をご覧ください。

<iframe width="560" height="315" src="https://www.youtube.com/embed/pUBc9uutSZM?si=LgB1k-jsSXKOJgXb" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

NuGet Gallery

https://www.nuget.org/packages/ZLinq

プロジェクトのサイト

https://github.com/Cysharp/ZLinq

作者による解説

https://neue.cc/2025/05/05_ZLinq.html


## ZLinqの特徴
ヒープを使わない、LINQ互換のメソッドを提供するNuGetパッケージ。
ヒープを使わないので、.NETオリジナルのLINQに比べて高速である。

また、.NETオリジナルのLINQにはない、`Span<T>`に対するメソッドも提供されている。

## ZLinqの使用手順
1. ZLinqをプロジェクトにインストールする
1. コレクションに対して`AsValueEnumerable`メソッドを呼ぶ
1. その結果に対して、LINQ（互換）のメソッドを呼ぶ
```cs:ZLinq
using ZLinq;

var sum = numbers
    .AsValueEnumerable()
    .Where(x => x % 2 == 0)
    .Select(x => x * 3)
    .Sum();
```

```cs:LINQ to Span
using ZLinq;

Span<int> span = [1, 2, 3, 4, 5];
var sum = span
    .AsValueEnumerable()
    .Where(x => x % 2 == 0)
    .Select(x => x * 3)
    .Sum();
```
Rancher Desktopで kn quickstart kind が失敗するのを解消

## 環境
* Rancher Desktop: 1.19.1
* kind: v0.29.0
* kn: v1.18.0

## 事象
```
$ kn quickstart kind
Running Knative Quickstart using Kind
Error: creating cluster: failed to get Docker info: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
...

$ docker context ls
NAME                DESCRIPTION                               DOCKER ENDPOINT                       ERROR
default             Current DOCKER_HOST based configuration   unix:///var/run/docker.sock
rancher-desktop *   Rancher Desktop moby context              unix:///Users/xxx/.rd/docker.sock
```

## 回避方法
```
$ export DOCKER_HOST=unix:///Users/xxx/.rd/docker.sock
```
オンボーディングアプリを作ってみた #1：データベース作成から登録フォームまで

https://www.pi-pe.co.jp/regist/is?SMPFORM=man-lanerf-2473a633d82734eb22aa64cad426ae23&utm_source=pup-qiita&utm_medium=contentlink&utm_campaign=/SPIRAL_internship/items/e948f0435e87fc625528&utm_content=link-top&f000099824=https://qiita.com/SPIRAL_internship/items/e948f0435e87fc625528

---

## はじめに
こんにちは！今回から数回に分けて、オンボーディングアプリをゼロから構築した体験を紹介していきます。
第1回となる今回は、ローコード開発ツール **SPIRAL ver.2を使って「データベース設計」と「登録フォームの実装」** までを行いました。

ローコード開発について詳しく知りたい方は下記リンクを参照してください！
[ローコード開発ツールとは？](https://qiita.com/SPIRAL_internship/items/1b5505c99fd2ec462885  )

## なぜオンボーディングアプリ？
初めて利用するサービスでは「何をすればいいか分からない」「最初にどこを見ればいいか迷う」などの課題があげられます。これらを解決するには、初めてのユーザーに向けた「オンボーディング体験」が重要になっています。

ユーザーの進捗に応じてステップ形式で案内することで、より良いオンボーディングアプリが作れるのではないかと思ったのがきっかけです。

---

▼実際に使っているシステムはここから体験できます！

https://www.pi-pe.co.jp/regist/is?SMPFORM=man-lanerf-2473a633d82734eb22aa64cad426ae23&utm_source=pup-qiita&utm_medium=contentlink&utm_campaign=/SPIRAL_internship/items/e948f0435e87fc625528&utm_content=link-middle&f000099824=https://qiita.com/SPIRAL_internship/items/e948f0435e87fc625528

---

## データベース（DB）設計
まずはデータベース設計です。オンボーディングアプリには、ユーザーの登録情報だけでなく、「どのステップまで完了したか」の状態管理が必要です。そこで、以下のデータベースをSPIRAL上で作成しました。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4041448/f3eff1b8-6b9b-451d-8e9f-bdb2661cff52.png)

ユーザーの情報を登録するDBです。オンボーディングステータスという項目を追加することで、ユーザーがどこまでのステップを閲覧したのかを管理することができるようになります。
オンボーディングステータスの右側にある鉛筆マークをクリックします。するとフィールド詳細設定の画面が出てくるので、デフォルト値を固定値で１に設定します。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4041448/618bec9c-d151-490e-8e49-b301baf8155a.png)

SPIRALではデータベースを以下のように簡単にGUIで作成できます。プログラミングは一切不要です。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4041448/07171573-426a-4711-8db4-493c520749df.png)

## 登録フォーム設計
次は登録フォームの設計です。先ほど設計した会員DBに登録するためのフォームを作成していきます。以下のようなシンプルな登録フォームを作成しました。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4041448/a0050eec-f93c-48dd-9ad3-125a18bc4f5c.png)

SPIRALではフォームも以下のように、登録する対象となるデータベースの項目を「追加」と「除外」のみの簡単な操作で作成できます。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4041448/ab0cc412-8cb5-4ead-9050-ce059e38f866.png)

## おわりに
今回はオンボーディングアプリの第一歩として、データベースの設計と登録フォームの実装までをやってみました。
次回は、登録後のTOPページとコンテンツのだし分け機能実装に挑戦していきます！

--- 
 
私がインターンしているスパイラル株式会社は、ローコードプラットフォーム、SPIRAL ver.1の**トライアルアカウント**を**無償提供**しています。このアカウントの記事でも紹介するように、たくさんの機能ございます。  
   
▶︎ フォーム  
▶︎ 認証エリア  
▶︎ ログイン  
▶︎ メール送信  
▶︎ カスタムプログラム  
   
などの作成できますので、ぜひ試してみてください!!

https://www.pi-pe.co.jp/regist/is?SMPFORM=man-lanerf-2473a633d82734eb22aa64cad426ae23&utm_source=pup-qiita&utm_medium=contentlink&utm_campaign=/SPIRAL_internship/items/e948f0435e87fc625528&utm_content=link-bottom&f000099824=https://qiita.com/SPIRAL_internship/items/e948f0435e87fc625528  

   
そして、今チームでトライアル登録者向けに、オンボーディングコンテンツを作成しています。**SPIRAL ver.1**にご興味のある方、ぜひこちらもご覧ください👇  

https://knowledge.spirers.jp/special/detail/11680
Hello Qiita

# Hello qiita!

初めまして　K10-K10です
都立学生で、ロボット作ったり、競技プログラミングに参加したりしています。

Git Hub pages に自分のブログを持っていますが、Qiitaにも投稿していこうと思います。
自分で作ったものや、自分ではまったところを投稿するつもりです.

## 使用言語
- C++ 
- Python
- react
- html,CSS
- Java　Script

今後はPerlやGo言語なども勉強していきたいと思います。
## 開発環境
VSCode
neovim

zsh

Ubuntu,Windows11のデュアルブートです

---
不定期で更新していきますが、ぜひ読んで感想をいただきたいです
 ~Thank you for reading~
Github SSH設定メモ

## Ed25519鍵の生成

```bash
ssh-keygen -t ed25519 -C "your_email@example.com" -f ~/.ssh/github
```

## SSH Config作成

~/.ssh/config

```text
Host github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/github
  IdentitiesOnly yes
  AddKeysToAgent yes
```

## 公開鍵Githubに登録

```bash
cat ~/.ssh/github.pub
```

- New SSH key
- Title: 任意
- Key type: Authentication Key
- Key: 公開鍵貼り付け

## 接続テスト

```bash
ssh -T git@github.com

# Hi your-username! You've successfully authenticated, but GitHub does not provide shell access.
```
Az900に受かったので合格体験記を書く

Az900に受かるためにやったこと

・経験
　IT業界4年目
　メインはアプリケーション開発の社内SEだがクライアントAppが大半でクラウドとは縁遠い
　AzureはEntraやDefender for Cloudを導入検証の際、少し触ったことがある程度

・勉強時間
　30～40時間

・勉強内容
　過去問は70%後半を2回
　Udemyの問題集は各回を2~3回実施し、最後は60%後半～70前半を取れるぐらいになっていた

・結果
　769点

・結論
　難易度としては過去問と問題集の間よりやや過去問にちかい感じ。
　最初、過去問の存在を知らず、ひたすらUdemyをやっていたが、そこから過去問をやり始めて簡単に感じた。
　
　Udemyで60台後半をとれるようであれば、合格ラインだとおもう。
　受かるためだけであれば、過去問が80～90％になればよいと思う。　
　ただ今後のことも考えるのであれば、問題集で問われるような少し難しい問題（NW系であれば仮想アプライアンス、NSG）も押さえておくべきだと思った。
G検定対策

## はじめに
2025年第2回 G検定に合格したため、勉強方法など証跡として残します。

## G検定対策とは
一般社団法人日本ディープラーニング協会（JDLA）が実施する、AI・ディープラーニングの活⽤リテラシー習得のための検定試験
[G検定](https://www.jdla.org/certificate/general/start/)

## 参考までに
#### 私のレベル、経歴
・Web系エンジニア５年目突入
・言語は主にPHP、Python、JavaScript
・取得資格は基本情報技術者、Python3 エンジニア認定データ分析試験、SAA
・機械学習やデータ分析などにはもともと興味があり、独学で学ぼうとしたが挫折。。

#### 勉強時間
・期間は３か月ほど
・平日・休日２～３時間

#### 勉強していく中で感じたこと
テキストだけだとイメージが付かない部分があるため、動画と併用して勉強するのがおすすめです。

## 参考書・参考サイト
・テキスト
[深層学習教科書 ディープラーニング G検定（ジェネラリスト）公式テキスト 第3版](https://amzn.asia/d/0ahEJIDl)
[深層学習教科書 ディープラーニング G検定（ジェネラリスト）公式テキスト 第3版](https://www.amazon.co.jp/%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0G%E6%A4%9C%E5%AE%9A%EF%BC%88%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%A9%E3%83%AA%E3%82%B9%E3%83%88%EF%BC%89-%E6%B3%95%E5%BE%8B%E3%83%BB%E5%80%AB%E7%90%86%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-%E5%8F%A4%E5%B7%9D-%E7%9B%B4%E8%A3%95/dp/4297132400)

・問題集
[深層学習教科書 ディープラーニング G検定（ジェネラリスト）公式テキスト 第3版](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0G%E6%A4%9C%E5%AE%9A%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%A9%E3%83%AA%E3%82%B9%E3%83%88%E5%95%8F%E9%A1%8C%E9%9B%86-%E7%AC%AC3%E7%89%88-%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE%E3%82%B9%E3%82%AD%E3%83%AB%E3%82%A2%E3%83%83%E3%83%97NeXt-%E5%B0%8F%E7%B8%A3-%E4%BF%A1%E4%B9%9F/dp/4295018988)
[最短突破 ディープラーニングG検定(ジェネラリスト) 問題集 第2版](https://amzn.to/48sfzaz)
[G検定対策アプリ](https://www.skillupai.com/general-app/)

・動画
Youtubeで用語検索を実施すると、5分ぐらいの動画が出てくるので自分に合ってそうなものを見てみる。

## 勉強方法
#### 出題範囲を確認
公式サイトにて出題範囲や出題するキーワードが記載されているため、範囲を確認する。
[日本ディープラーニング協会](https://www.jdla.org/certificate/general/)

#### テキストと動画でインプット
G検定でおすすめとされているテキストを中心に大枠をインプットする。
途中テキストを読み進めても不明な個所やテキストにはない範囲のキーワードなどは動画やチートシートなどで捕捉する。
テキストにはない出題も出されるので、基本的に出題範囲の内容・キーワードを抑えておいた方がいい。

#### 問題集でアウトプット
問題集や対策アプリなどでどこまで身についているか確認する。
個人的には「徹底攻略ディープラーニングG検定ジェネラリスト」が基礎問題、「最短突破 ディープラーニングG検定(ジェネラリスト)」が応用問題という感じがします。
実際の試験は「最短突破 ディープラーニングG検定(ジェネラリスト)」や「G検定対策アプリ」に近い問題が出ます。
また、思った以上に法律や契約関係の問題が多かったです。個人的には1/3くらい？

#### 繰り返す
問題集で身についていない項目のインプットを実施　⇒　問題集でアウトプットを繰り返す。

#### その他
カンペについてはしっかり作っても見ている時間があまりないので、インプットしきれていないところを2~3枚くらいまとめておくぐらいの温度感の方がいいかもしれません。

## 受けてみて
個人的には「Python3 エンジニア認定データ分析試験」を受けていたこともあり、そこまで難易度は高くないと感じました。
ディープラーニングの箇所は理解するのに時間がかかったが、わかりやすい動画も増えてきたため、文章ベースだと理解しにくい用語を理解するのに助かりました。

## 最後に
４年くらい前にデータ分析ができるようになりたいと思い、社会人５年目にして数学の勉強から始めましたが、もともと文系だったこともあり挫折しました。
最近はYoutubeでわかりやすい解説動画が増えてきたため、データ分析やAIの勉強のハードルは低くなっていると感じます。
しかし、エンジニアとして働いてみるとやはりまだまだよくわからないということで敬遠している方も多いと感じます。
それでも一歩を踏み出せる方が増えてほしいと思い、この記事を記載いたしました。
少しでも力になれたらうれしいです。
ぜひ、勉強頑張ってください！
Box Driveのフォルダパスをショートカットで整形する

エクスプローラーは「Box\」以降のパスを貼付けるとその場所に遷移してくれます。
しかし、Boxドライブのパスを共有するときエクスプローラーからパスをコピーすると「C:\Users\tanaka\Box\aaa\bbb～」となり、毎回「C:\Users\tanaka\」の部分を削除してたりしませんか？
今回その作業をショートカットキー一発で実行できる手順を紹介します。


C:\Users\tanaka\Box\aaa\bbb～のようなパスの
「C:\Users\tanaka\」を切り取る削除するツールです。

## 使い方
1.エクスプローラー等でパスをコピー
2.ctrl+shift+B押下
3.ペーストすると「C:\Users\ユーザー名\」が切り取られている。
## 準備
以下ファイル(Box.ps1)をデスクトップに置く。ショートカットファイルを作成⇒プロパティを開く⇒以下項目設定しOK押下。

・リンク先：C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -ExecutionPolicy Bypass -File "C:\Users\自分のユーザ名\Desktop\Box.ps1"
・ショートカットキー：Ctrl＋Shift＋B
・実行時の大きさ：最小化

## ファイル
```Box.ps1
# Box.ps1
$clip = Get-Clipboard
$user = [Environment]::GetFolderPath('UserProfile')
    $new = $clip.Substring($user.Length + 1)
    Set-Clipboard $new

```
JISキーボードの英字キー名称・読み方まとめ

はじめに
ショートカットキーを口で説明するときにCtrlやAltのことを説明する時にどう読むのかわからなかったので、まとめてみた。

JIS配列にある英字キー（Windows）
---

|キー表記|読み方|解説|
|---|---|---|
|Ctrl|コントール|ショートカット操作の基本|
|Alt|オルト|操作メニューの切替など|
|Tab|タブ|インデントや切替に使用|
|Caps Look|キャプスロック|英字大文字固定の切り替えキー|
|Shift|シフト|大文字入力や機能切替に使用|
|Win|ウィンドウズキー|MacのCommandと同様|
|Esc|エスケープ|プログラムの中断・キャンセル|
|Insert|インサート|文字の挿入/上書き切替など|
|Delete|デリート|Macでは「fn + Delete」で同等操作」|
|Home|ホーム|行頭・ページ先頭へ移動|
|End|エンド|行末・ページ最後へ移動|
|PageUp|ページアップ|ページを１つ上へ|
|PageDown|ページダウン|ページを１つ下へ|
|NumLock|ナムロック|テンキーの数字/カーソルモード切替|
|Pause/Break|ポーズ/ブレイク|昔のDOS時代の名残｜
|SysRq|システムリクエスト|現代では機能していないキーが多い|

JIS配列にある英字キー（Mac）
---
|キー表記|読み方|解説|
|---|---|---|
|⌘|コマンド|ショートカット操作の基本|
|control|コントロール|ターミナル操作や一部の補助操作で使用|
|option|オプション|記号入力や文字変換に多用|
|shift|シフト|大文字変換、記号入力など|
|caps lock|キャプスロック|英字大文字固定|
|fn|ファンクション|Deleteなど特殊キーと組み合わせて使用|
|retum|リターン|Enterキーの別名|
|escape|エスケープ|操作キャンセル|
|tab|タブ|入力切替・移動など|
|space|スペース|スペース入力|
|delete|フォワードデリート|fn併用で後削除|

**JIS配列キーボードにおけるキーの正しい読み方を知っておくと、勉強や実務での混乱が減る**
**口頭で説明するときでも役に立つ**
APIを叩いて結果をコンソールログに出す、それだけのウェブページ

# await fetch を使ったAPI実行の構文

JavaScriptでAPIを実行する書き方はいろいろあり、使うAPIによっても異なるのですが、
簡単なものなら下記の構文で実行することができます。

```html
response = await fetch('ここにAPIのURLを書く');
result = await response.json();
```

`fetch(URL)` でリクエストを送り、レスポンスをjson形式に変換しています。
これらの処理に `await` を付けているのは、レスポンスの受け取りや読み取りがちゃんとできてから後続処理に進んでほしいからです。

# htmlファイル

さきほどの構文を使って
**APIを叩いて結果をコンソールログに出す、それだけのウェブページ**
を作ってみました。
下記のコードを記述したhtmlファイルを作って開き、デベロッパーツールを見れば、コンソールログに結果が出ます。

```html
<html>
<head>
    <title>API実験ページ</title>
</head>
<body>
    デベロッパーツールのコンソールで結果を確認してください。
    <script>
        async function fetchData() {
            response = await fetch('ここにURLを書く');
            result = await response.json();
            console.log(result);
        }
        fetchData();
    </script>
</body>
</html>
```

一連の処理を行う `fetchData` 関数を呼ぶだけの超シンプルなページです。
ちなみに `await` が使えるのは `async` が付いている関数の中だけ、というルールがあるので `fetchData` 関数には `async` を付けています（これを付けないとコンパイルエラーになります）。

# いろいろなAPIで試してみる

さっそく `'ここにURLを書く'` のところにURLを当てはめて試してみましょう。
サクッと使える例を4つほど紹介します。

## ◇国情報の取得

**REST Countries API** というAPIを使うと国情報を取得できます。
例えばポルトガルの情報を得るURLは以下のようになります。
`https://restcountries.com/v3.1/name/portugal`

## ◇ポケモン情報の取得

**PokeAPI** でポケモン情報を取得できます。
例えばゼニガメの情報を得るURLは以下のようになります。ゼニガメの英語名は squirtle です。
`https://pokeapi.co/api/v2/pokemon/squirtle`

## ◇ネコ知識の取得

**Cat Facts API** はネコに関するトリビアをランダムに取得できるAPIです。
URLは以下のようになります。
`https://catfact.ninja/fact`

## ◇天気の取得

**気象庁API** で天気情報を取得できます。
例えば鹿児島県の天気情報を得るURLは以下のようになります。
`https://www.jma.go.jp/bosai/forecast/data/overview_forecast/460100.json`

---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600213/b86d0a19-980f-4d49-9221-70d404cb7a5b.png)

---

ネコはともかく、色々な国・ポケモン・天気を試してみると面白いかも？

以上です。
Workato：On-prem command-line scriptsで任意のコマンド（スクリプト）を実行したり、パイプやリダイレクトを扱うには（Linux編）

# はじめに

WorkatoにはOn-prem command-line scriptsというコネクタがあり、このコネクタを利用することで、オンプレミスエージェントがインストールされたサーバあるいはPC上のコマンドを実行することが可能です。

当コネクタで実行可能なコマンド（スクリプト）は、コネクションあるいはコネクションプロファイルで事前定義されたもの（ホワイトリスト）に限られており、レシピ上で任意のコマンド実行には対応していませんが、bashやzshなどのシェルの引数としてコマンドを渡すことで、レシピ上で任意のコマンドを実行することが可能になります。

また、コネクションの事前定義においては、パイプ（`|`）やリダイレクト（`<>`）に対応していませんが、本手順によりパイプやリダイレクトの利用も可能になります。

:::note warn
セキュリティ上レシピからの任意のコマンドの実行を避けたい場合や、コマンドを限定して（指定されたコマンドにて）パイプやリダイレクトを含めた状態を扱いたい場合は、コネクションプロファイル(yaml)による事前定義を検討ください。

https://docs.workato.com/en/on-prem/agents/connection/profile.html#command-line-scripts-profile

コネクションプロファイルでは、コマンドならびに引数、パラメータのクォートの明確な指定が可能となっています。

また、コネクションの事前定義(Script body)では `bash -c` コマンドと組み合わせてもパイプやリダイレクトを含むコマンドの実行を正常に行うことはできませんが（スペースを区切りにコマンドと引数を解釈しているため）、コネクションプロファイルではコマンドと引数を明確に指定することが可能なため、コマンドを限定したパイプやリダイレクトを含むコマンドの実行にも対応可能です。
 
:::
 
# 手順

### 【１】コネクションを設定する
On-prem command-line scripts コネクタのScriptsに、 `bash -c {{command}}` を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/649cf83f-7eb3-482f-a6ec-7bb3f6401636.png)

### 【２】実行したいコマンドを入力する

WorkatoのレシピにOn-prem command-line scriptsコネクタのExecute command-line scriptアクションを追加し、「Command」へ実行したいコマンドを入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/81e8f148-c222-4901-be6c-b33de7460aa3.png)

# 実行結果

以上の手順で設定を行うことで、以下のようにパイプを用いたコマンド実行を行うことが出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/77d42582-ca21-40a3-89d8-62c2f29a613f.png)

# おまけ

上記では特定のコマンドの実行を例としましたが、コマンドだけでなくシェルスクリプトの実行にも対応しています。
例えば、Workatoでコーディングしたシェルスクリプトを、オンプレミスエージェントがインストールされたサーバあるいはPC上で実行したい場合にも、本手順が活用可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/b140baaf-3720-47af-b1ba-d624c7fc352c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/ef4f9c3c-6c71-4844-ac8f-9b348b8634b4.png)
Pandasのマージが日本語のUnicode違いで失敗する話

## 発生した問題
- `data1`と`data2`で`name`列をマージ
- どちらも「パ」を含むが、片方は合成文字（パ）、もう片方は分解文字（ハ＋゚）
- そのままmergeすると一致しない
- `.str.strip()`や`.str.lower()`では解決しない

    ```python
    data1 = pd.DataFrame({'name': ['data1_パ', 'data2_パ', 'data3_パ']})
    data2 = pd.DataFrame({'name': ['data1_パ', 'data2_パ', 'data3_パ'], 'value': [100,erged_bad = data1.merge(data2, on='name', how='left', indicator=True)
    print(merged_bad['_merge'].value_counts())
    ```
    
    出力例:
    ```
    left_only    3
    right_only   0
    both         0
    ```

## 解決策
- Unicode正規化（NFC）を使う
- `unicodedata.normalize('NFC', s)`で両方の`name`を正規化してからマージ
    
    ```python
    import unicodedata
    
    def normalize(s):
        return unicodedata.normalize('NFC', s) if isinstance(s, str) else s
    
    data1['name_norm'] = data1['name'].apply(normalize)
    data2['name_norm'] = data2['name'].apply(normalize)
    
    merged_fixed = data1.merge(data2, left_on='name_norm', right_on='name_norm', how='left', indicator=True)
    print(merged_fixed['_merge'].value_counts())
    ```

- 出力結果:
    ```
    both         3
    left_only    0
    right_only   0
    ```

- テストプロジェクトはこちら

https://github.com/hayato-akagi/pandas_merge_issue_demo

## 詳細
- Unicodeには「合成済み文字」と「結合文字列（基底文字＋結合文字）」がある  
    - 例：「パ」＝合成済み文字（U+30D1）  
    - 例：「ハ」＋「゚」＝分解文字列（U+30CF U+309A）
- 見た目は同じでもバイト列が異なる  
    - 例：「ガ」→「ガ(U+30AC)」と「カ(U+30AB)+゙(U+3099)」
- 正規化形式にはNFD, NFC, NFKD, NFKCがある  
    - NFD: 分解（Decomposition）  
    - NFC: 分解してから合成（Composition）  
    - NFKD/NFKC: 互換分解・合成も含む
- NFC/NFKCでは分解された文字が再び合成される  
    - 例：「ハ」＋「゚」→「パ」に合成される
- NFD/NFKDでは分解されたまま  
    - 例：「パ」→「ハ」＋「゚」になる
- どちらの形式で保存されているかはデータ作成元やシステム依存
- 正規化しないと、見た目が同じでもpandasのmergeや比較で一致しない
- 「ガ」や「パ」など濁音・半濁音付きカタカナ・ひらがなは特に注意が必要  
    - [とほほの文字コード入門](https://www.tohoho-web.com/ex/charset.html) より  
    > 「ガ」と「ガ」は同じ文字に見えるが、上段は「ガ(U+30AC)」の1文字、下段は「カ(U+30AB)」と「゙ (U+3099)」の組み合わせ
- Pythonでは`unicodedata.normalize()`で正規化できる

## 参考
- https://www.tohoho-web.com/ex/charset.html
- https://qiita.com/fury00812/items/b98a7f9428d1395fc230
- https://note.nkmk.me/python-unicodedata-normalize/
「デビルズプラン2」に出てきたナイトツアー（Knight’s Tour）

【初心者の個人開発】「デビルズプラン2」に出てきたナイトツアー（Knight’s Tour）パズルをWebで作ってみました

こんにちは！  
まだまだ勉強中の初心者フロントエンドエンジニアです。

最近「デビルズプラン シーズン2」という韓国のリアリティ番組にハマって、その中に出てきた「ナイトツアー（チェスの騎士の移動）」パズルがとても面白かったので、Webブラウザで遊べるゲームとして作ってみました。

🔧 技術スタック：
- JavaScript / HTML / CSS
- Firebaseでランキング機能
- カスタムボードの作成＆共有機能

🌐 実際にプレイできます（インストール不要）：  
👉 https://hoony8355.github.io/knight-tour-ko/ja/

デザインやコードはまだ荒い部分もありますが、  
「ここ直したほうがいいよ」みたいなアドバイスを頂けたらとても勉強になります！よろしくお願いします 🙏
【Rails初学者】Hotwire、Turbo、Stimulusとは(ざっくり学ぶ)

# Hotwireとは（Rails初学者の備忘録）

Rails7からデフォルトで使えるようになった「Hotwire」について、自分用のメモ。

## Hotwireとは？
JavaScriptを書かずに、SPA（シングルページアプリケーション）のような体験ができるRailsの仕組み。
JSをたくさん書かなくても、Railsでサクサク動くWebアプリを作れるらしい。

### Hotwireは3つの技術で構成されている

- Turbo
- Stimulus
- Strada？(※初学者の私では、よくわかりませんでした。)

※今のところはTurbo + Stimulusを指すことが多いみたいです。

---

## Turboとは？
JavaScriptをほぼ書かずに、インタラクティブなUIを実現するためのライブラリ。

### Turboの中身は4つ

| 名前           | 機能概要                                      |
|----------------|-----------------------------------------------|
| Turbo Drive    | 通常のリンクやフォームをSPAっぽく動かす     |
| Turbo Frames   | ページの一部分だけを差し替え・更新できる     |
| Turbo Streams  | サーバーからの変更をリアルタイムで反映       |
| Turbo Native   | モバイルアプリ用（iOS/Android向け）          |

- Webアプリ開発では、Turbo Native以外の3つを使うことが多いみたいです。

---

## Stimulusとは？
最小限のJavaScriptで、HTMLに意味を持たせて動きをつけるライブラリ。

- 必要なときだけ、ちょっとしたJSを書く感じ
- Turboとの相性が良い

### 簡単な例

```html
<div data-controller="hello">
  <button data-action="click->hello#greet">Greet</button>
</div>
```
上記コードは、「hello」という名前のStimulusコントローラーを使って、ボタンがクリックされたときに`greet`という関数を呼び出す、という意味。

対応する`JavaScript（例：hello_controller.js)`はこんな感じ
```js
import { Controller } from "@hotwired/stimulus"

export default class extends Controller {
  greet() {
    alert("こんにちは。Stimulusです。");
  }
}
```
クリックするとアラートが出る。HTMLとJavaScriptが分離されている。

### Stradaとは？
モバイルアプリ（ネイティブ）向けのHotwire技術。
まだ情報が少ないみたいです。



## まとめ（用語、ざっくり説明）

| 用語           | ざっくり説明                                      |
|----------------|---------------------------------------------------|
| Hotwire        | モダンなWebをRailsで作るための仕組み             |
| Turbo          | JavaScriptほぼ書かずに高速な画面切り替えを実現   |
| Turbo Drive    | ページ遷移を爆速にする                            |
| Turbo Frames   | ページの一部だけを更新                            |
| Turbo Streams  | サーバーからの変更を即時反映                      |
| Turbo Native   | モバイルアプリ用（WebViewベース）                |
| Stimulus       | スッキリ書けるJavaScriptフレームワーク           |
| Strada         | モバイルアプリ用（未発表らしい）                        |

-----

以上、自分用のHotwireメモでした📘
知識が浅いため、TurboやStimulusを少しずつ使ってみて、扱えるようにしたいです。
PostgreSQLのVACUUMについて


## VACUUMについて

PostgreSQLの定期的な保守作業の中に、バキューム処理があります。保守作業といっても、定期的に手動で何かをするわけではなく、自動バキュームデーモン（autovacuum launcher）を起動しておくと自動でバキューム処理を行ってくれます。手動でVACUUMコマンドを実行して流すこともできますが、たいていの運用では自動で行います。デフォルトでは自動バキュームデーモンが起動されるようになっています。PostgreSQLのプロセスを確認すると起動されていることが確認できます。

```
>ps auxww | grep ^post
```

自動バキュームデーモンが実行されるタイミングは任意となっています。定期的に１日１回決まった時間に実行されるような動きではありません。

自動バキュームデーモンがデータベースの更新頻度に応じて、動的にバキューム作業を計画して実行してくれます。
データベースへの更新/削除が激しいときは、頻繁にバキュームが流れ、大した量ではないときはお休みしているといった動きになります。

バキュームを動的な処理に任せておくのではなく、１日１回決まった時間に流すようにすることもできます。そうしたい場合は、自動バキュームデーモンをストップさせて、OSの機能を使って、cronでVACUUMコマンドをスケジュールさせることになります。

どっちがいいのかについては、自動バキュームデーモンが実行される頻度によって判断することになるかと思います。VACUUMの心配をするくらいなら、ハードディスクの容量に余裕をもたせておいた方が賢明でしょう。

## VACUUMの種類

VACUUMには標準VACUUMとVACUUM FULLと２つの種類が存在しています。

大抵の運用の場合、標準VACUUMを実行します。VACUUM FULLはよほどのことがない限り実行されることはありません。標準VACUUMは実行されていても、SELECT、INSERT、UPDATE、DELETEといったSQLコマンドを通常通りに流すことができます。それが、VACUUM FULLだとACCESS EXCLUSIVEロックをかけるため、上記のSQLコマンドが実行できなくなります。業務時間中は絶対にVACUUM FULLを実行してはいけません。さらに、VACUUM FULLは大量のI/Oトラフィックを発生させるため、データベースへのセッションに影響が出る可能性があると言われています。つまり、データベースへ接続できなくなる可能性があるということです。恐ろしいことです。

デフォルトで実行される自動バキュームデーモンは、標準VACUUMが実行されます。VACUUM FULLではありません。ご安心を。どうしてもVACUUM FULLを実行したい場合は手動で実行することになります。

標準VACUUMは不要になった領域を削除した後、増えた領域をOSに返却することはしません。またいずれ再利用されるために残しておきます。それに比べ、VACUUM FULLは極限まで領域を削除して最小化させた後、増えた領域をOSに返却します。

極端なまでにデータベースの無駄領域が肥大化して、OSの容量に影響が出てくるような事態になったときに、急場しのぎで実行されるのがVACUUM FULLということになりそうです。一時的に大量データの更新、削除を行ったような場合に限り、VACUUM FULLをする意義はあるでしょう。

## おまけ

テーブルを削除するとき、DELETEとTRUNCATEを使い分けることがあります。TRUNCATEは厳密にいえば削除ではなく切り捨てです。TRUNCATEをするとデータベースに無駄領域を残すことがありません。つまり、TRUNCATEを行った場合はVACUUMをする必要がないということです。ワークファイルの削除はDELETEではなくTRUNCATEを利用されるかと思いますが、つまり、こういうことです。