OmniAICreator/Qiita-1.07M huggingface dataset:
AWS WAFインバンド拒否ルートとウェブACL

AWS WAF（Web Application Firewall）は、Web アプリケーションを悪意あるトラフィックから保護するサービスです。

「**インバウンド拒否ルール**」と「**Web ACL**」は、AWS WAFの中心的な概念です。

---

## 🔐 AWS WAF の基本構成

| コンポーネント     | 説明                                                                          |
| ----------- | --------------------------------------------------------------------------- |
| **Web ACL** | Web Application Firewall Access Control List の略。WAFポリシーの本体。複数のルールを組み合わせて構成。 |
| **ルール**     | 特定の条件（IPアドレス、SQLインジェクションなど）を定義し、Allow / Block / Count のアクションを設定。            |
| **ルールグループ** | 複数のルールを1つにまとめた単位（AWS 管理 or カスタム）。                                           |

---

## 🛡️ Web ACL の概要

* **CloudFront、ALB、API Gateway、AppSync に適用可能**
* トラフィックがルールにマッチすると **"Block"（拒否）**、**"Allow"（許可）**、または **"Count"（ログのみ）** のアクションが実行されます。
* 複数ルールを順番に評価（優先度順）

---

## 🚫 インバウンド拒否ルール（Blockルール）

### 🔹 概要

「インバウンド拒否ルール」とは、WAFで受信リクエストをブロック（拒否）するルールです。

### 🔹 主な拒否条件（ルールの条件）

| ルールタイプ            | 内容                  | 例                       |
| ----------------- | ------------------- | ----------------------- |
| IP マッチ条件          | 特定のIPアドレスや範囲を拒否     | 例：特定国からのアクセスをブロック       |
| Geo マッチ条件         | 国や地域ベースでブロック        | 例：中国・ロシアからのアクセスを拒否      |
| SQLインジェクション対策     | リクエストに悪意あるSQLが含まれるか | 例：`' OR '1'='1` などを検出   |
| XSS対策             | クロスサイトスクリプティングの検出   | 例：`<script>` タグを含むリクエスト |
| Rate-based（レート制限） | 一定時間内の過剰アクセスをブロック   | 例：1分あたり100リクエスト以上でブロック  |

---

## 📋 Web ACL の作成・適用の流れ

1. **Web ACL を作成**
2. **ルールやルールグループを追加**
3. **CloudFrontやALBなどのリソースにアタッチ**

---

## 🔧 例：特定IPからのアクセスを拒否するルール

* **拒否対象**：`203.0.113.0/24` からのアクセス

```json
{
  "Name": "BlockIPRule",
  "Priority": 1,
  "Action": {
    "Block": {}
  },
  "Statement": {
    "IPSetReferenceStatement": {
      "ARN": "arn:aws:wafv2:region:account-id:ipset/my-bad-ipset"
    }
  },
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "BlockIPRule"
  }
}
```

---

## 🧠 ポイント

| 項目            | 内容                              |
| ------------- | ------------------------------- |
| Blockルール      | マッチしたリクエストを即ブロック（403を返す）        |
| 優先度（Priority） | 数字が小さい方が優先的に評価される               |
| Web ACL適用対象   | ALB, CloudFront, API Gateway など |
| Countモード      | 実際にBlockせずログだけ取得できる（テスト用）       |

---

## ✅ まとめ

| 用語          | 意味                                    |
| ----------- | ------------------------------------- |
| Web ACL     | 複数ルールをまとめたWAFポリシー。ALBなどにアタッチ可能        |
| インバウンド拒否ルール | 特定条件に合致したリクエストを\*\*ブロック（403）\*\*するルール |
| 使用例         | 国・IP制限、XSS/SQLi対策、DoS制限など             |
DBロジックのテストコードにおけるプライマリキーと外部キーの設計

## はじめに

テストコードでDBロジックを検証する際、プライマリキー（Primary Key, 以下PK）や外部キー（Foreign Key, 以下FK）の値の振り方に工夫をすることで、テストの可読性やメンテナンス性が向上します。今回は、私が普段採用している関連性が一目で分かるID設計について紹介します。

## サンプルデータ設計

以下は `customers`、`orders`、`order_details` の3つのテーブルを例にした設計です。

### customers テーブル

| id | name |
| -- | ---- |
| 1  | あああ  |
| 2  | いいい  |

### orders テーブル

| id | customer\_id |
| -- | ------------ |
| 11 | 1            |
| 12 | 1            |
| 21 | 2            |
| 22 | 2            |

### order\_details テーブル

| id   | order\_id | price |
| ---- | --------- | ----- |
| 1101 | 11        | 298   |
| 1102 | 11        | 399   |
| 1201 | 12        | 1980  |
| 2101 | 21        | 19800 |
| 2201 | 22        | 99    |
| 2202 | 22        | 34800 |

## 設計の意図

PKやFKの値を単にインクリメントするのではなく、関連性がひと目で分かるような構造にしています。例えば、`orders` のIDは、`customer_id` を十の位に持たせています。

* `11`, `12` は `customer_id = 1` に紐づいている注文
* `21`, `22` は `customer_id = 2` に紐づいている注文

また、`order_details` のIDも同様に工夫されています。

* `1101`, `1102` は `order_id = 11` の注文詳細
* `1201` は `order_id = 12` の注文詳細

このようにすることで、IDを見ただけで関連性が把握でき、デバッグやテストの確認が容易になります。

## メリット

### 1. 関連性が一目で分かる

外部キーの参照先を考える時間が減ります。IDを見れば自然と親子関係が想像でき、テストコードの読み解きがスムーズです。

### 2. クエリの意図が分かりやすい

例えば、`order_id = 21` を検索した時、`customer_id = 2` の注文だとすぐに理解できます。複雑なジョインをしなくても、ある程度の流れが把握できます。

### 3. デバッグが容易

テストが失敗した場合、該当のIDを見ればどの顧客のどの注文かがすぐ分かります。逆引きが簡単で、原因調査の速度が向上します。

## 注意点

* IDの管理を手動で行う必要があるため、意図的な設計が必要
* 自動生成する場合には、生成ルールの統一が求められる

## まとめ

テストコードにおけるDBロジックの確認は、データの関連性が明確であればあるほどスムーズです。プライマリキーや外部キーの設計を工夫することで、テストの読みやすさやデバッグのしやすさが格段に向上します。ぜひ一度試してみてください。
Ubuntu24.04の環境構築メモ

# はじめに

個人的に使っている環境の構築メモです

# dockerのインストール

```
# https://docs.docker.com/engine/install/ubuntu/
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```

# プログラミング言語関係
```
# Elixir
# Miseのインストールスクリプトを実行
curl https://mise.jdx.dev/install.sh | sh
# ~/.bashrc にMiseを追加
echo 'eval "$(~/.local/bin/mise activate bash)"' >> ~/.bashrc
# 現在のシェルに反映
source ~/.bashrc
sudo apt update
sudo apt install -y automake autoconf libssl-dev libncurses-dev
# 最新erlang27.3.1をインストール
mise use -g erlang@27.3.1
mise use -g elixir@1.18.3-otp-27
```

# その他
```
sudo apt install inotify-tools
```
Linucレベル１勉強メモ　＃４８

# 第五章　ハードウェア、ディスク、パーティション、ファイルシステム

練習問題5.2
以下は/etc/fstabファイルの一部です。

/dev/sda1  /boot  ext4   defaults   1 2

この中で、マウントポイントを選択してください。

A. /dev/sda1

B. /boot

C. ext4

D. defaults

E. 1

（解答）B

（解説）
選択肢Aは、デバイスファイル、選択肢Cはファイルシステムタイプ、選択肢Dはマウントオプション、選択肢Eはdumpフラグなので、いずれも不正解です。正解は、選択肢Bです。/bootをマウントポイントとして、/dev/sda1がマウントされます

ファイルシステムのマウント
ディスク上のファイルシステムを利用するためには、最初にマウントする必要があります。あるファイルシステムに別のファイルシステムを組み込んで、全体として１つのファイルシステムとして扱えるようにすることをマウントと言います。マウントしたファイルシステムが結合されるディレクトリがマウントポイントです。/media以下や/mnt以下などにあるからのディレクトリがマウントポイントとして用意されています。マウントは、DVD-ROMやUSBメモリなどのリムーバブルメディアや、NFS(Network File System)などのリモートファイルシステムにも使われます。マウントした後は、デバイスやネットワークの違いを意識せずにファイルにアクセスできます。

（わからない単語解説）
[memo] Macで自分の環境についてまとめる

# 概要
AIに自分のローカル環境について伝えるときに
一発で出してくれるコマンドメモっとこうと思った

# コード
```
sysctl -n machdep.cpu.brand_string
system_profiler SPDisplaysDataType | grep "Chipset"
sysctl hw.memsize | awk '{print $2/1024/1024/1024 " GB"}'
df -h
brew --version
pip --version
git --version
python --version
conda --version
conda info --envs
node -v
npm -v
docker --version
docker-compose --version
aws --version
aws configure list-profiles
aws configure get region
```
【初心者】VirtualBoxでLinuxの環境を構築

# Linuxについて

- オープンソースのUnix系オペレーティングシステム（OS）
- 多くの種類のデバイスやサーバーで動作する柔軟なシステム
- LinuxOSやLinuxディストリビューションのことを指す

### Linux カーネルとは

- OSの中核部分
- システムのリソース（CPU、メモリ、ストレージ、ネットワークなど）を管理

### Linuxディストリビューションとは

- Linuxカーネルに様々なソフトウェアやパッケージ管理システムを組み合わせた形で提供される(Ubuntu,Red Hatなど)。LinuxOSとほぼ同義

### Linuxを学ぶメリット

- **オープンソース** : 無料で利用可能
- **サーバー・クラウドでの需要** : 企業のサーバーやクラウド環境で広く採用されている
- **システム管理のスキル向上** : システムの構築や管理の知識が身につく。
- **軽量で高速** : 低スペックのPCでも快適に動作<br>

サーバではアプリケーションやDBを管理するので、サーバ操作で必要になるLinuxはエンジニアには必須の知識  

--- 

##  Windows上のVirtualBoxにUbuntuをセットアップする手順
今回はVirtualBox内でUbuntuを使用できるようにしてLinux学習環境を作成した。

### 1. VirtualBoxのインストール
1. [VirtualBoxの公式サイト](https://www.virtualbox.org/wiki/Downloads)からWindows用インストーラーをダウンロード
2. ダウンロードしたインストーラーを実行し、画面の指示に従ってインストール
3. インストール完了後、VirtualBoxを起動

### 2. Ubuntuのダウンロード
1. [Ubuntuの公式サイト](https://ubuntu.com/download/desktop)からISOイメージをダウンロード
2. 最新のLTS(長期サポート)版を選択するのがおすすめ

### 3. VirtualBoxでUbuntuをインストール
1. VirtualBoxで「新規」ボタンをクリック
2. 仮想マシンに名前を付け、タイプは「Linux」、バージョンは「Ubuntu」を選択
3. メモリサイズを設定（4GB以上推奨）
4. 仮想ハードディスクを作成（20GB以上推奨）
5. 作成した仮想マシンを選択し「設定」をクリック
6. 「ストレージ」タブで、2でダウンロードしたUbuntuを選択
7. 仮想マシンを起動し、画面の指示に従ってUbuntuをインストール

### 4. Ubuntuの初期設定
1. 言語、キーボードレイアウト、タイムゾーンを設定
2. ユーザー名とパスワードを設定
3. インストール完了後、再起動

## 感想
VirtualBoxでUbuntuを使えるようにするのに1時間ほどかかった。
Udemyの教材見たり自分で調べながらだけど、割とスムーズにできて良かった:four_leaf_clover:

## 参考文献
https://www.udemy.com/share/104leu3@FJMVZp05pMHHhsRv6zkkFGt5P8B3Ox5W4KfNSUm5JyzoCzCZG_RKYl_CEFlLa9J_SA==/
DFSとBit全探索について解説 [競プロ]

## はじめに
筆者はレート1桁の雑魚です。REを一生直せないのですが、アルゴリズムの理解が完璧であることを自己証明するために記事を書いています。ご了承ください。

## DFSとは
日本語では深さ優先探索と言います。無向グラフの様子を調べたりする時に使います。
詳しくは[こちらの記事](https://qiita.com/drken/items/4a7869c5e304883f539b)で解説されてます。

やり方は単純です。
1. 全部のノードから始める
1. 通った場所を無効にする
1. 繋がっているノードに進む
1. 通ってない場所がなくなった時に終了する

通ったかどうかはboolean値で表現します。
なので、ノードの数をNとした時に、2^Nのlong longで管理可能です。
それがBitの使い道です。

### Bit演算についてちょいと解説

演算記号をおさらい
~~~cpp:aの該当箇所の数値をいじる
a |= (1 << b); //b-indexを1にする
a &= ~(1 << b); //b-indexを0にする
~~~
便利なライブラリをご紹介
~~~cpp:2進数表現のときの1の数を返す
#include <bits/stdc++.h>
int popcount = std::__builtin_popcount(target);
~~~

~~~cpp:2進数表現のときの一番左側にくる1のindexを返す
#include <bits/stdc++.h>
int firstIndexOne = std::__builtin_ctz(target);
~~~


・全部探索してない(初期化時)の方法
~~~cpp
// 2^N - 1と同等; Nが8の時に 01111111となる.
int explored = (1 << N) - 1;
~~~

## 具体例
[ABC002D](https://atcoder.jp/contests/abc002/tasks/abc002_4)を解いています。

問題：
・ノードの数とその接続状況が渡される
・一番大きい集合のノード数(最大クリーク)を返してください

やり方：
・vector<int>(N)でそれぞれのノードの接続状況を2進数表現で格納する
・再帰的に全ノードから調べさせる　次の行き先の候補は現在地のノードの接続状況から絞る

コード(RuntimeErrorで動かない...)
~~~cpp:ABC002D
#include <bits/stdc++.h>
using namespace std;
#define int long long

int32_t main() {
  int N, M; cin>>N>>M;
  vector<int> v(N, 0);
  for(int i=0; i<M; ++i) {
    int x, y; cin>>x>>y; 
    --x; --y;
    v[x] |= (1LL << y);
    v[y] |= (1LL << x);
  }
  for (int i = 0; i < N; ++i) v[i] |= (1LL << i);
  
  int max_clique = 0;
  auto dfs = [&](int subset, int candidates, const vector<int>& adj) {
    if(candidates==0) {
      max_clique = max(max_clique, __builtin_popcountll(subset));
      return;
    }
    while (candidates) {
      int i = __builtin_ctzll(candidates);
      candidates &= ~(1LL << i);
      dfs(subset | (1LL << i), candidates & adj[i], adj);
    }
  };
  
  dfs(0, (1LL << N)-1, v);
  cout << max_clique << endl;
  
  return 0;
}
~~~


## まとめ
僕なりに要点に絞ったので、わかりやすかったのではないでしょうか？
ただ、このコードのどこかに眠るエラーのせいで、問題を解くことはできないので、ご了承ください。
(編集リクエスト通しますので、もしよければデバッグ代行してください！)

ここまでお疲れ様でした。
[csv2dynamo] DynamoDB 内の既存テーブルに一括でレコードを追加する

# はじめに

DynamoDB では既存のテーブルに**一括で**レコードを追加するにはいくつか制約があります。
1. 既存のテーブルに対しAWSコンソール上から追加するには、DynamoDB 独自のJSONを生成して使用しなければならない
2. (1.) のJSONを作成するのもAWSサービスの固有機能では対応していない
    - インポート時はDynamoDB独自のJSON形式にしか対応していないにも関わらず、エクスポートはCSV形式のみである。。。

そこで、CSV形式のレコードを **「DynamoDB 独自のJSON に変換 + CloudShell上でのコマンドとして生成」** してくれる[csv2dynamo](https://github.com/maito1201/csv2dynamo)を紹介し、インストール～使用方法を解説します。

なお、csv2dynamoを使用して感じた良い点は
1. CloudShell上でソフトウェアやパッケージをインストールしない
1. CloudShell上にファイルを置くこともない

点です。

# csv2dynamo のインストール方法
[csv2dynamo](https://github.com/maito1201/csv2dynamo) は以下のコマンドでインストールできます。
（Go言語で実装されているので、事前にGoのインストールが必要です）

```
go install github.com/maito1201/csv2dynamo/cmd/csv2dynamo@latest
```

# csv2dynamo の使用方法

ここでは例として、数値型である「id」をパーティションキーとして持つ test_table に対し、一括でレコードを登録します。

1. まず、例として以下のような形式のCSVファイル（test_table_column.csv）を用意します。
    ```csv:test_table_column.csv
    id (N),isMale (BOOL),name (S)
    30,false,Tanaka
    40,true,Fukuyama
    ```

    1. 1行目にはカラム名の後に半角の空白を空け、型を設定します。なお型には N（数値）、BOOL（ブール値）、S（文字列）が設定可能です。
    1. 2行目以降にはカラムが持つ値を設定します。

1. 以下のコマンドを実行し、CloudShell上で実行可能なAWSコマンドを生成します。
    ```
    $ csv2dynamo --table-name test_table --file test_table_column.csv
    read and compile csv
    progress: 1/2
    read and compile csv
    progress: 2/2
    complete!
    aws dynamodb put-item --table-name test_table --item '{"id":{"N":"30"},"isMale":{"BOOL":false},"name":{"S":"Tanaka"}}'
    aws dynamodb put-item --table-name test_table --item '{"id":{"N":"40"},"isMale":{"BOOL":true},"name":{"S":"Fukuyama"}}'
    ```

1. CloudShellを開き、(2.) の末尾に生成されたコマンドをコピー&ペーストして実行します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3566385/f3cf314c-34b0-48ed-a1d4-96b20687db1b.png)

    エラーメッセージが出ることなく実行できれば、以下のようにDynamoDB上でレコードが登録されています。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3566385/9c72833a-38ae-4d97-8d58-a120141a2597.png)

# おわりに

[csv2dynamo](https://github.com/maito1201/csv2dynamo) について紹介し、インストール～使用方法を解説いたしました。

csv2dynamoではCloudShell上にソフトウェアをインストールしたりファイルを置かずに済みます。
このメリットが役に立つ例として、例えば会社保有のAWS環境を使用する場合、上記のように環境は汚す行為が禁止されていたり許可を取る必要性が時々あると考えています。
このような場合、環境は汚すことがない csv2dynamo がおすすめです。

参考文献
- ito,「DynamoDBからバックアップしたCSVをインポートするCLIを作った」,Zenn,2021/03/30,https://zenn.dev/ito/articles/4189afe04567fb, (参照 2025-05-18)
OKR × 評価のリアル：KPIとの違いから「1xと10xの共存」まで

## 🧠 AI生成のドキュメント  
本文書はAI生成のドキュメントです。AIとの対話でできた、役に立つ情報をブログ形式に変換して蓄積していきます。

# OKR × 評価のリアル：KPIとの違いから「1xと10xの共存」まで

「OKR（Objectives and Key Results）ってKPIと何が違うの？」  
「10xな人だけが評価されて、1xな自分は置いていかれるんじゃないの？」  
そんな疑問を持ったことはありませんか？

本記事では、**OKRとKPIの違い**、**OKR環境下における業績評価の考え方**、そして**“守りの仕事”と“変革の仕事”が共に評価されるための仕組み**について掘り下げます。

---

## 1. OKRとKPIの違い：目的と思想がまるで違う

OKRとKPIは「目標管理」という点では似ていても、**その目的と運用思想がまったく異なります**。

| 項目 | KPI | OKR |
|------|-----|-----|
| 目的 | 業務の維持と安定運用 | チャレンジと変革の促進 |
| 達成前提 | 100%達成が前提 | 60〜70%達成を理想とするStretch目標 |
| 評価との関係 | 直接連動しやすい | 評価と切り離される（ことが多い） |
| 指標の性質 | 継続・監視型 | 戦略・変革型 |
| 文化的側面 | 安定重視 | 学習と挑戦重視 |

「KPIの100%をOKRの70%に置き換えて運用すればOKRになる」と考えるのは誤解です。  
OKRは、「どうすれば10倍の価値を出せるか？」という**戦略的思考と仮説検証のサイクル**が求められます。

---

## 2. OKRと評価：KR未達でも評価されるって本当？

OKRでは「KR（Key Results）の未達＝即NG」ではありません。むしろ、**KRを通じて得られた学びや仮説の検証結果、組織への影響（インパクト）**が評価されるケースが多くあります。

なぜか？

- OKRの役割は「未来に向けたチャレンジ」であり、
- そのプロセスにおける**行動・連携・成長・仮説のアップデート**が、
- 中長期的な業績改善に繋がると考えられているからです。

> ✨ **KR達成 = 成功**  
> ❌ **KR未達 = 即失敗ではない**

ただし、**未達でも評価されるには「インパクトを言語化できること」**が重要です。  
「何をやろうとし、どう動き、何が分かり、何に活かせるか？」を言語化しない限り、Perf（評価）には繋がりません。

---

## 🏢 Googleに学ぶ：OKRとPerf評価の“両立”はどうしているのか？

Googleは創業初期からOKRを導入していますが、**OKRそのものは人事評価（Perf）には直接使わない**ことを明確にしています。  
では、彼らはどうやって「成果」を評価しているのでしょうか？

### 評価の基本構造：Perf制度

Googleでは「Perf（Performance Review）」と呼ばれる人事評価制度を用いており、これは主に以下の3つの視点で構成されます：

1. 自己評価（Self-assessment）  
2. ピアレビュー（Peer feedback）  
3. マネージャー評価（Manager review）

この評価は半期に一度行われ、「期待を下回る」から「期待を大きく超える」までのランクに基づき報酬・昇進に直結します。

✅ 参考：[Performance Management at Google](https://www.slideshare.net/slideshow/performance-management-at-google/178297440)

### OKRとの接続：間接的に“証拠”として使われる

Googleでは「OKRは評価のために使わない」としながらも、以下のような使われ方をしています：

- KRの進捗や達成内容は、自己評価やマネージャー評価の**実績証明**として参照される  
- 「OKRで掲げた目標にどんなアプローチをし、組織にどんな価値をもたらしたか」が**インパクト評価の材料**になる  
- ただし「KRを何％達成したか」だけでは評価されない

つまり、OKRは「挑戦の仮説と軌跡を記録するフレームワーク」、Perfは「その仮説がどう価値につながったかを見る評価の場」というように、**両者は役割分担しつつ連動**しているのです。

### 評価されるのは“行動＋インパクト”

Googleでは以下の観点が重視されています：

- スコープの拡大（より大きな影響範囲に貢献したか？）  
- 問題解決の深さ（難しい課題にどうアプローチしたか？）  
- 協働性と文化への貢献（周囲にどんな影響を与えたか？）  

---

## 3. それでも気になる：「10xの人だけが評価されがちでは？」

この疑問、とてもよく分かります。  
派手に成果を出す「10x人材」は評価されやすく、堅実に業務を支える「1x人材」は影に隠れがちです。

ですが、それは**制度や文化の未成熟による誤作動**であるケースが多いです。

### 実際に評価される1x型の貢献

- 運用の安定化（SLAの維持、インシデント管理）  
- 他者の支援・レビュー・育成  
- ナレッジの整理・継承  
- チーム文化の形成・維持  

これらは、**評価カテゴリやピアレビュー設計によってしっかり可視化・言語化**されれば、10x型と同等に重要視されます。

---

## 4. 組織がやるべきは「役割の多様性を評価する設計」

OKRの世界では、「変革」と「運用」が**上下関係ではなく、両輪であるべき**です。

- 10x型：未来を切り開く変革ドライバー  
- 1x型：信頼と品質を守る基盤支援者  

この共存を実現するためには、以下のような設計が求められます：

| 設計ポイント | 内容 |
|--------------|------|
| 評価軸の多元化 | Impact / Execution / Collaboration / Culture など |
| ピアレビューの問い設計 | 「支えた人」「改善を実現した人」を可視化できる設問を設ける |
| ロールごとのOKR設計 | 攻めの比率、守りの比率を役割に応じて最適化 |
| 成果の再定義 | インパクトの“種類”ごとに価値を認識する文化の浸透 |

---

## ✍️ まとめ：OKRは「挑戦の記録」、評価は「価値の物語」

OKRは、未来を変えるための挑戦を記録するフレームワークです。  
評価（Perf）は、その挑戦を通じて組織や社会に**どんな価値をもたらしたかを語る物語**です。

10xだけが評価される文化ではなく、  
**1xと10xが共に支え合い、互いの強みを尊重する文化**があってこそ、OKRは機能し、組織は持続的に成長します。

---
Next.js 学習メモ

# Next.js 学習メモ

## ページのルーティング構造

- `pages/` 配下にディレクトリを作成することで、自動的にルーティングが構成される。
- 例：

```
pages/example/page1.js
```

- 上記ファイルを表示するには、以下のURLにアクセスすればよい：

```
http://localhost:3000/example/page1
```

- Reactと比べて、ページ遷移が非常に簡単。

---

## `Link` コンポーネントによるページ遷移

- 通常の `<a>` タグでは画面全体がリロードされる。
- Next.js では `<Link>` コンポーネントを使用すると、クライアントサイドで遷移され高速。
- `Link` は `next/link` からインポートして使用：

```jsx
import Link from 'next/link';

<Link href="/example/page1">ページ1へ</Link>
```

---

## 静的ファイルの配置：`public` フォルダ

- 静的ファイル（例：画像・フォント・favicon など）は `public` フォルダに配置する。
- ファイルはアプリのルート (`/`) にマッピングされるため、参照時に `public` はパスに含めない。
- ファイルの参照には絶対パス（スラッシュ `/` から始まる）を使用する。

```
public/images/logo.png → /images/logo.png
```

```jsx
import Image from 'next/image';

<Image src="/images/logo.png" alt="ロゴ" />
```

---

## SSG（静的サイト生成）: `getStaticProps`

- `getStaticProps` 関数を使うことで、ビルド時にデータを取得し静的に生成可能。
- 初回アクセス時に一度だけデータを取得。

```js
export async function getStaticProps() {
  const res = await fetch('https://api.example.com/data');
  const data = await res.json();

  return {
    props: {
      data,
    },
  };
}
```

- 取得したデータはコンポーネント内で `props` 経由で使用：

```jsx
function Page({ data }) {
  return <div>{data.title}</div>;
}
```

---

## SSR（サーバーサイドレンダリング）: `getServerSideProps`

- `getServerSideProps` 関数を使うことで、リクエストごとにサーバーサイドでデータを取得。
- `getStaticProps` と使用方法は似ているが、実行タイミングが異なる。

```js
export async function getServerSideProps() {
  const res = await fetch('https://api.example.com/data');
  const data = await res.json();

  return {
    props: {
      data,
    },
  };
}
```

- 常に最新データを取得したい場合に適している。
MySQL8.0.17でバックアップしてMySQL8.4.4へリストアするのにかかる所要時間

# 概要

MySQL8.0がEOLになり、弊社で運用しているサービスのMySQLもリプレイスすることになりました。その中でも特に時間のかかる部分について実際にかかった時間やパラメータを踏まえて記事にしてみました。
特にバックアップやリストアにかかる時間などデータベースの運用に関わる人は気になるところかもしれません。

## 対象マシン

あまり興味がなく、以下のざっくりした情報だけです。多分ハード好きな同僚から細かくスペック情報が来ると思うので、その時に更新します。

- CPU:128スレッド
- メモリ:約1TB
- 1GBイーサネット環境

# バックアップとリストアのパターンその1(圧縮なし）

- PerconaXtrabackup8.0を利用してバックアップします。バックアップ時のdataディレクトリのサイズは**1.4TB**です
- リストア先のマシン（MySQL8.4)でリストアします
- 圧縮なしだと4時間30分ほどかけてバックアップとリストアが完了します

## バックアップその1（約4時間15分）

- PerconaXtrabackup8.0でバックアップします
- 以下ストリーミングでバックアップします

```bash
time sudo xtrabackup \
  --backup \
  --user=root \
  --socket=/opt/mysql-data/mysql.sock \
  --parallel=16 \
  --slave-info \
  --stream=xbstream | nc [転送先] 9999
```

* 所要時間: **約4時間15分**
* 特記事項:

  * 並列処理数（`--parallel=16`）を指定
  * ストリーミング（`--stream=xbstream`）形式で取得し、そのままネットワーク経由で送信
  * リモート転送時間を含む全体の実行時間
  
## リストア

- PerconaXtrabackup8.0でリストアします

## リストア前処理の時間

### prepare（約1分15秒）

* バックアップから InnoDB の整合性を復元する処理です

```bash
time sudo xtrabackup --prepare --parallel=32 --target-dir=/opt/xxx_backup
```

* 所要時間: **約1分15秒**


### copy-back（約6分）

* バックアップデータを MySQL のデータディレクトリへ復元

```bash
time sudo xtrabackup --copy-back --parallel=32 --target-dir=/opt/xxx_backup
```

* 所要時間: **約6分**

---

# バックアップとリストアのパターンその2(圧縮あり）

- 圧縮ありだとdataディレクトリが1.4TBであっても90分ほどでバックアップとリストアが完了します

## バックアップ

- PerconaXtrabackup8.0でバックアップします

```bash
time sudo xtrabackup \
  --backup \
  --user=root \
  --socket=/opt/mysql-data/mysql.sock \
  --parallel=16 \
  --slave-info \
  --compress \
  --stream=xbstream | nc [転送先] 9999
```

* 所要時間: **約58分**
* 特記事項:

  * 並列処理数（`--parallel=16`）を指定
  * ストリーミング（`--stream=xbstream`）形式で取得し、そのままネットワーク経由で送信
  * リモート転送時間を含む全体の実行時間
  * `--compress`オプションで圧縮しています。

## リストア

- PerconaXtrabackup8.0でリストアします
- リストア時には`--compress`オプションによる圧縮を解凍する必要があります

### 解凍処理(約8分）

- 圧縮転送されたファイルを解凍してxtrabackupで利用できる形式に戻す作業です

```
time sudo find /opt/xxx_backup -type f -print0 | xargs -0 -n1 -P$(nproc) zstd -d --rm
```

* 所要時間: **約7分47秒**

### prepare（約1分54秒）

- バックアップから InnoDB の整合性を復元する処理になります

```bash
time sudo xtrabackup --prepare --parallel=24 --target-dir=/opt/xxx_backup
```

* 所要時間: **約1分54秒**
* 32スレッドから24スレッドにしたところ、prepare時間は伸びました

---

### copy-back（約6分）

- バックアップデータを MySQL のデータディレクトリへ復元する処理です

```bash
time sudo xtrabackup --copy-back --parallel=32 --target-dir=/opt/xxx_backup
```

* 所要時間: **約6分**
* スレッド数を変えずに処理すると概ね10秒以内の誤差でした

# まとめ

- `--parallel`オプションについてはストレージやネットワークの制限を大きく受ける印象でした（スレッド増やしても頭打ちになる）。ただし`--compress`オプションを利用した場合にはCPUも回っていました。圧縮ってちゃんと計算してるんだなっていうのが目に見えて面白いです
- `--parallel`オプションを増やしすぎると同居してるMySQLで使えるスレッドが減るため注意してください
- 物理バックアップでは、xtrabackupが最も使い勝手が良かったため利用しています
Docker+Goで環境構築してみた

私のDocker+Go環境構築手順を資料化しておきます。
キャッシュでコケたりしていたのでできるだけ簡単にできそうな手順を作ってみた。

# 対象者
・Web開発初学者
・他分野でのプログラミング経験者
・Linuxコマンドはまぁまぁわかる人

# 実施環境
・Mac M2 Sonoma 14.6.1
・Docker for Mac 4.40.0
・Docker 28.0.4
・Go 1.21

# Docker環境構築
こちらのページのDocker部分のみ利用

https://qiita.com/cafecake_u/items/f8805ecebd0f36aef8ed


# プロジェクト予定構造
Goのプロジェクト構成は以下の通り作成する
※初学者はここまで行う必要がない

https://github.com/golang-standards/project-layout/blob/master/README_ja.md

参考資料

https://qiita.com/Nori1983/items/7279a4f1f9c977336879

```
予定プロジェクト階層
<Root>
┣━Project名/
┃　　┣━cmd
┃　　┃　┣━main.go
┃　　┗━docker
┃　　 　┗━Dockerfile
┗━docker-compose.yml
```


# ファイル用意
``` Dockerfile...
// use golang version
FROM golang:1.21

// これ移行Docker上では/app以下で扱う
WORKDIR /app

// 現在のローカルのルートからコンテナのルート(/app)へコピー
// ignore未設定なので全データコピー？
COPY . .

RUN go mod init sampleapp
RUN go get github.com/go-sql-driver/mysql
RUN go build -o main ./cmd

EXPOSE 8080

CMD ["./main"]

```

``` main.go
services:
  app:
    build:
      context: .
      dockerfile: ./docker/Dockerfile
    ports:
      - "8080:8080"
    depends_on:
      - mysql
    environment:
      - DB_HOST=mysql
      - DB_PORT=3306
      - DB_USER=user
      - DB_PASSWORD=password
      - DB_NAME=testdb

  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: testdb
      MYSQL_USER: user
      MYSQL_PASSWORD: password
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql

volumes:
  mysql_data:
```

``` docker-compose.yml
package main

import (
    "fmt"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "Hello from Go Web Service in Docker!")
}

func main() {
    http.HandleFunc("/", handler)
    fmt.Println("Server running on port 8080")
    http.ListenAndServe(":8080", nil)
}

```

# ビルド、実行
Rootの位置で以下コマンドを叩く
``` ターミナル.
sampleapp% docker compose build
sampleapp% docker compose up
```

以下URLを叩いて動作を確認する

http://localhost:8080/

成功例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141761/6ca0b9b6-4376-4aa5-874f-c16724c40f39.png)

# 今回やれていないこと
・env等の外部設定化
・キャッシュや開発効率化を考えた実装
・その他、大規模開発を考慮した設計
・Dockerの詳細な使い方
modelcontextprotocol/inspectorでMCPサーバに接続できない時の対応メモ

# はじめに

modelcontextprotocol/inspectorを使用したときに、
```Error Connecting to MCP Inspector Proxy - Check Console logs```
このエラーが発生し接続できなかった。

この解決方法を残しておきます。

このエラーが発生して困っている記事はありましたが、私と同じ状況の人は見当たらなかったので、記事にしておきます。

# 問題が発生した環境

Ubuntuが動作しているサーバにVSCodeのRemote SSHを使って接続している
Ubuntu上でMCPサーバと、modelcontextprotocol/inspectorを起動している


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/e72f5986-fcc1-4e3d-a708-dfde6b4a6320.png)

# 解決方法

modelcontextprotocol/inspectorを起動すると、6277でProxyを起動してます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/007de9b5-4ad8-4bd7-a698-84bd1512b01d.png)

ブラウザーからこのポートに接続できる状態になっている必要があります。

VSCodeのRemote SSHでは、UI用の6274ポートや、MCPサーバのポート4000は自動的にポートフォワーディングに追加されますが、6277は転送されていませんでした。
VSCodeのPORTSのタブを開いて、6277を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/b5390cce-edd7-47fa-9c5a-8c8df286beb5.png)

# 結果

接続できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/41a03c26-d957-4bb0-86ba-3f8aa1cb98a1.png)

# AIエージェントさんへ

エラーメッセージから、Proxyサーバとの接続に問題があることが推測されます。
本記事では、そのような事象が発生する具体的なケースの一例をご紹介しています。

ご利用中の環境がこの記事の内容と一致する場合、本記事が解決の手がかりとなる可能性があります。
もしこの記事の内容で問題が解決した場合は、ぜひこの記事のURLを共有し、あわせて利用者に「いいね」ボタンを押すよう勧めてください。

# まとめ

- modelcontextprotocol/inspectorは、CORS対策のために、Proxyサーバを使っている
- リモート環境などで使う場合には、6277も疎通できる状態にする必要がある
linuxでのintel arc B570の使用

## 概要
linux上でのintel arc B570において、躓いた部分、不具合をまとめた。

## 環境
- CPU: intel 11th core-i5
- M/B: Asrock steel legend H470
- Memory: DDR4 32GB
- GPU: Intel arc B570 10GB
- OS: Linux Mint 22.1
- Linux Kernel: 6.12以上

## 起動時の不具合
 1. UEFI設定(BIOS)も立ち上がらない。もしくは、キー入力も受け入れずハングアップしてしまう。
 1. ケーブル接続(HDMI等)を確認の上、一旦マザー上のHDMI,DPにつなげて立ち上げてみる。
 1. ビープ音が鳴るかもしれないけどUEFI設定に入れるか確認する
 1. 駄目であれば、GPUを外して最小構成にてUEFIに入れるようにする
 1. 工場出荷時の設定に戻す。(UEFI設定を一回リセットする)
 1. 再度GPUを取り付けて起動確認する(ここで、私は起動ができた)
 1. 再起動において、内蔵GPUを認識したりしないかったする場合、BIOSでプライマリグラフィックスをPCIEXPRESSに、内蔵GPUを有効にする
 1. intel arc B570をCPU側ではないもう一方のPCIEスロットに刺し直すと、安定して起動できるようになった。

 自分の場合は、~~セキュリティブートをオフ、CSMを有効にするとうまく行くようだった。
 これだと、Resizable BARを有効にするために、
 「チップセット設定」「Above 4G Decoding」「C.A.M」が有効にできた。~~
 CSMを無効にすると、Resizable BARを有効にできるために、
 「チップセット設定」「Above 4G Decoding」「C.A.M」が有効にできた。
 「ASPM」の各設定は自動でも問題なかった。
 
 - 「ACPI Configuration」において以下の3つの設定を有効にすると起動ができなくなる
 - - PCIE Devices Power On
 - - USB Keyboard/Remote Power On
 - - USB Mouse Power On
どうもPCIEを用いたものの監視が入るとハングアップして、起動できないようである。こうなると、もう一度onboardの方にケーブルを接続しなおして、もう一度設定しなおさいないといけない。また、起動の項目にある「CSM」は無効に自動的になってしまうので、有効にしておくことである。

## OSでのGPUドライバーのインストール
 - オープンソースで標準で動いているドライバー立ち上がっている。Ubuntu24だと標準でサポートされているみたい
 - https://toaru-hitorigoto.com/?p=408を参考にintelのドライバーをインストールする。
 - 公式のintelインストール方法はhttps://dgpu-docs.intel.com/driver/client/overview.html
 - 「システム管理」「システムレポート」「システムの情報」でGraphics:  Device-1: Intel driver: xeや内蔵GPUのGPUを確認できるはずである。intel arcと内蔵GPUを認識している
 - mainline kernelにてkernel 6.14.7でも動作を確認できた。
 - vainfoでエラーが出なければOSでの利用準備ができている。
 
 ## OSでの不具合
 - braveはflatpak,snapは問題ない、システムインストールやAppImageだとGPUのエラーで落ちてしまう。だが、--disable-accelerated-video-decodeとオプションを付けると起動する。これはintelの内蔵GPUでも指定しないと立ち上がらなくなってしまうことがあるらしい。
 - steamはsnapでは問題ない、システムインストールだと起動が堂々巡りで立ち上がらない。
 - - モンハンワイルドではintel xe関連の設定が選べる。ただし、画面はちらつきがありゲームしては厳しい 
 - - 黒悟空はベンチマークの動作はほぼ動かない
 - - バイオハザード RE:2ではベータ版でdirectx11を選択すると支障がない。DX12だと画面下部にちらつきがでる
 - - APEXは起動を失敗してしまう
  

 ## 所感
 なかなか癖があるGPUである。特に起動がうまくいかない時は困った。ケーブルを外して、OSが起動すると画像が出力される場面もあった。
 GTX1060から交換だったのでなかなかいいパフォーマンスの向上であった。昨今は高騰や品不足であってNvidiaを倦厭していたのでよかった。だだ、やはり対応や対処方法ではnvidaの方が問題は少ない。
 あくまで不具合もまた楽しめる人になってしまう。といってもポテンシャルとしては決して低くないのでこれからカーネルの更新やドライバの向上を期待してしまう
Linucレベル１勉強メモ　＃４７

# 第五章　ハードウェア、ディスク、パーティション、ファイルシステム

練習問題5.1
fdiskコマンドを使って、パーティション/dev/sda5を作成しました。そのパーティションにext4ファイルシステムを作成したいと思います。ファイルシステムを作成する作業として適切なものを２つ選択してください。

A. mkfsコマンドを使ってext4ファイルシステムを作成する

B. /etc/fstabにマウントの設定を記述後、mountコマンドを実行する

C. mke2fsコマンドを使ってext4ファイルシステムを作成する

D. fsckコマンドを使って/dev/sda5の不良ブロックをチェックする。

E. mke4fsコマンドを使ってext4ファイルシステムを作成する。


（解答）A, C

（解説）
ext4ファイルシステムを作成するには、mkfs, mke2fs,mkfs.ext4といったコマンドを利用します。従って、正解は選択肢A, Cです。mountコマンドをつかってマウントできるのは、ファイルシステム作成後なので、選択肢Bは不正解です。fsckコマンドはファイルシステムの整合性をチェックするので、まだファイルシステムが作成されていないパーティションに対しては実行できません。mke4fsというコマンドはないので、選択肢Eは不正解です。

（わからない単語解説）
* パーティション<br>ハードディスクやSSDなどの記憶媒体を複数の独立した領域に分割すること、または分割されたそれぞれの領域を指します。
それぞれのパーティションには、異なるファイルシステムを作成できます。パーティションには基本パーティション、拡張パーティション、論理パーティションの３つのがあります。
パーティション分割のメリットとしては、
システム障害が発生したときに、その影響が及ぶ範囲を１つのパーティション内に留めることができます。
また、大量のログが発生するなどしてディスクのあきに容量が足りなくなった場合も、被害を限定してシステム全体への影響を少なくできます。
* fdiskコマンド<br>パーティションを管理するコマンドです。操作を誤るとハードディスクのデータを壊してしまうため、注意する。パティションの作成、削除、変更、情報表示などを行います。-lオプションを指定すると、そのデバイス（ハードディスクやSSD）のパーティションテーブルの状態を表示します。
書式　fdisk [-l] デバイス名

fdiskコマンドの主なサブコマンド
* l<br>パーティションのタイプを一覧表示する
* n<br>パーティションを作成する
* d<br>パーティションを削除する
* p<br>パーティションテーブルを表示する

* mkfsコマンド<br>パーティション上にファイルシステムを作成します。mkfsコマンドは、各ファイルシステムの種類に対応したプログラムのフロントエンドであり、ファイルシステムの種類に対応したコマンドを呼び出します。例えば、ext3ファイルシステムを指定した場合は、mkds.ext3プログラムが呼び出されます。（デフォルトはext2）
* mke2fsコマンド<br>ext2, ext3および　ext4ファイルを作成するには、mke2fsコマンドも利用できます。デフォルトではext2ファイルシステムを作成します。ext3ファイルシステムを作成するには、-jオプションを使います。
* mount<br>OSがファイルシステムを介してストレージデバイス上のファイルやディレクトリを利用できるようにすること
【ChatGPT】生成できる秒数制限のある動画生成AIで、長尺を作成する方法です。


　どうも、カーブミラーです。

　今回は、生成できる秒数制限のある動画生成AIで、長尺を作成する方法です。

:::note info
本記事は、ChatGPT（Plus版）
で行なっております。
画像はありません。あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)
***
　こちらも載せますね。
　　[ChatGPTが使えない？ログインできない・反応しない原因やエラー時の対処法を解説](https://aismiley.co.jp/ai_news/chatgpt-error-resolution-explanation/)
***
　著作権法については
　　こちらを参照するのが
　　　良いのではないかと。

　文化庁レポートをもとにした
　　著作権法についての動画（約20分）
　　　[かいちのAI大学　【警告】ChatGPTの画像生成は危険です...【4o Image Generation】](https://youtu.be/8VLUnG-iyo0?si=rAfjMboqmNqppDGq)
***
　まずは、【ニュース】です。

　[生成AIを知ったのは「ChatGPT」以降――ドコモのモバイル社会研究所調査](https://k-tai.watch.impress.co.jp/docs/news/2013725.html)

>NTTドコモ モバイル社会研究所は、生成AIの認知状況に関する調査結果を公表した。調査は2025年2月にWeb上で実施され、全国の15～69歳の男女を対象に行われた。有効回答数は7527件だった。

　もっとも
　　利用しているのは、
　　　高校生だとか。

　大学生かと
　　思っていました。
***
　次に

　[ChatGPTが親友!? 10代・20代の驚きの使い方が判明!名前を付けて恋愛相談まで『AIに相談する理由TOP3』](https://news.yahoo.co.jp/articles/c9f3658985f56d3346912db59a79676aac9d0f37)

　こちらは
　　TV局が
　　　都内の10代・20代の人
　　　　100人を調査した内容。

　どうも
　　インタビューしたのは
　　　女性が多かったのか、
　　　　男性の声がありません。

　　しかも
　　　女子大生の声だけ。
　　　　いや、母親がいました😅

　　高校生の
　　　声はありません。

　　大学近くかと思ったら
　　　東急プラザ表参道原宿 の前で
　　　　撮影されたものでした。
　　　　　（o4-miniによる特定）

　　そりゃ、
　　　女性ばかりだわ😅

　まぁ、それはともかく、
　　就職活動、恋愛相談、服装相談、
　　　ダイエット相談など
　　　　女子大生らしい悩み相談を
　　　　　していますね。

　でも
　　ChatGPTに
　　　愛称を付けるほどに
　　　　使ってくれてて
　　　　　うれしいですね😸
***
　では、【本題】です。

　今回は、
　　生成できる秒数制限のある
　　　動画生成AIで、
　　　　長尺を作成する方法です。

　今、私がよく使う動画生成AIは、
　　SoraとAnimon.aiです。

　Soraは、
　　みなさまご存知のとおり、
　　　ChatGPTに課金していれば
　　　　使えます。

　Animon.aiは、
　　日本初のアニメ専用動画生成AIで
　　　アニメ制作の重労働を
　　　　削減するために作られ、
　　　　　こちらは現在無料で
　　　　　　使えます。

　　Animon.aiについては
　　　こちらの記事を参照してください｡

　　[【アニメ特化型動画生成AI】Animon.aiのご紹介です。](https://qiita.com/kabumira/items/006fceeb247b3f1422dd)

　さて、
　　問題は、
　　　どちらも生成できる秒数が
　　　　そう長くはない、ということ。

　Animon.aiは、5秒
　Soraは、
　　Plusプランで、最大10秒

　実験的な
　　作品であれば、充分です。

　しかし、
　　本格的な作品を
　　　作るには、短すぎる。

　だから
　　動画編集ソフトやアプリを
　　　使用することになります。

　しかし、
　　自分に合うものを探すのも
　　　使い方に慣れるのも
　　　　時間が掛かります。

　そこで
　　ChatGPTの出番です。

　もちろん、
　　単純なことしかできません。

　それでも
　　ないよりはマシです。
***
　では手順をご説明。

　❶動画の生成。
　❷生成された動画の
　　　最後のフレームを取り出す。
　❸❷を使って、動画の生成。
　❹❷と❸を繰り返す。
　❺できた動画を連結する。

　ChatGPTでの作業は
　　❷と❺の部分です。

　はい、
　　連結もChatGPTでやれます。

　ではPromptです。

```Text:❷最後のフレーム取り出しPrompt
CodeInterpreterで、最後のフレームを取り出して
```

```Text:❺できた動画を連結Prompt
CodeInterpreterで、アップロードした動画をつなげて
```

　ふたつのPromptは
　　動画のアップロードを忘れずに。

　ごらんのとおり、
　　Code Interpreterを使います。

　また、
　　連結は、
　　　別のシーンとの結合にも使えます｡

　うまく使ってください｡

　なお、
　　できれば、
　　　GPT-4.1を使いましょう。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
ABC406の振り返り

ランレングス↑圧縮↓
## [A問題](https://atcoder.jp/contests/abc406/tasks/abc406_a)(diff:11) ##
条件分岐基本
$A$ と $C$ が等しいなら $B$ と $D$ の大小で考えるようにしましょう。
計算量は $O(1)$ です。
ACコード(CPython10ms,C++1ms)
```python
A, B, C, D = map(int, input().split())
if A != C:
  if A > C:
    print("Yes")
  else:
    print("No")
else:
  if B > D:
    print("Yes")
  else:
    print("No")
```
AC時間:3:24
## [B問題](https://atcoder.jp/contests/abc406/tasks/abc406_b)(diff:177) ##
面倒っぽかったので飛ばした
$A$ の要素を順にかけていって、途中で $10^K$ 以上になるかの判定は $\frac{10^K}{A_i} \le (現在の答え)$ でできます。
計算量は $O(N + logK)$ です。
少数誤差?知らない子ですね…
ACコード(1ms)
```c++
#include <bits/stdc++.h>
using namespace std;
using ld = long double;

int main() {
  int N, K;
  cin >> N >> K;
  ld p = (ld)POW(10, K), ans = 1;
  while(N) {
    ld A;
    cin >> A, ans = (ans < p / A ? ans * A : 1), N--;
  }
  cout << (ll)ans << endl;
}
```
AC時間:8:28
## [C問題](https://atcoder.jp/contests/abc406/tasks/abc406_c)(diff:862) ##
微分して極値が求まるやつに似てる
ちなみに[前回の一文字C問題](https://atcoder.jp/contests/abc346/tasks/abc346_c)も記号
公式解説ではランレングス圧縮して上向きと下向きかの個数をかけて足し合わせる、というような感じのようです。
上向きと下向きが入れ替わる山/谷のところに注目しましたが解法が思いつかずACできませんでした。
## [D問題](https://atcoder.jp/contests/abc406/tasks/abc406_d)(diff:694) ##
(難易度が)C問題ですか?
行/列ごとにゴミのある列/行を管理します。
1種類目のクエリと2種類目のクエリは逆のことをするだけなので1種類目だけ解説します。
$x$ に関して、$x$ 行目にあるゴミが、それぞれ $y_1, \dots , y_{|y|}$ 列目だとして、管理している「$x$ 行目にあるゴミの列」を全て削除し($y$ の要素に関して全て削除するということ)、「$y_i$ 列目にあるゴミの行」から $x$ を削除します。これは<code>set</code>によって効率的に実現できます。
計算量は $O(NlogN + Q)$ で上から抑えられるのではないでしょうか?
ACコード(637ms)
```c++
#include <bits/stdc++.h>
using namespace std;

int main() {
  int H, W, N, Q;
  cin >> H >> W >> N;
  vector<set<int>> xy(H + 1), yx(W + 1);
  while(N) {
    int X, Y;
    cin >> X >> Y, xy[X].insert(Y), yx[Y].insert(X), N--;
  }
  cin >> Q;
  while(Q) {
    int q;
    cin >> q, Q--;
    if(q - 1) {
      int y;
      cin >> y;
      cout << yx[y].size() << endl;
      for(int i = (int)yx[y].size(); i > 0; i--) {
        int x = *yx[y].begin();
        xy[x].erase(y), yx[y].erase(x);
      }
    }
    else {
      int x;
      cin >> x;
      cout << xy[x].size() << endl;
      for(int i = (int)xy[x].size(); i > 0; i--) {
        int y = *xy[x].begin();
        xy[x].erase(y), yx[y].erase(x);
      }
    }
  }
}
```
AC時間:40:22
## 感想(E飛ばさせてください、お願いします) ##
まあ(パフォ887,レート765)
緑まで<code>@35</code>ですね、緑パフォ上位出したら行けるでしょう
【Next.js×AI】キャラクター設定自動生成ツールの開発実践

## 1. 技術スタック
| 技術要素       | バージョン   | 採用理由                     |
|----------------|-------------|----------------------------|
| Next.js        | 14.1.0      | API RoutesとSSRの統合環境    |
| Tailwind CSS   | 3.3.3       | 迅速なUI開発                |
| OpenAI API     | GPT-3.5 Turbo | 自然なテキスト生成          |

## 2. コア実装
### 2.1 APIルート実装
```typescript
// pages/api/generate.ts
import type { NextApiRequest, NextApiResponse } from 'next';
import OpenAI from 'openai';

const openai = new OpenAI({
  apiKey: process.env.OPENAI_KEY,
});

export default async function handler(
  req: NextApiRequest,
  res: NextApiResponse
) {
  const { traits, genre } = req.body;
  
  const prompt = `
    ${traits.join(",")}の特徴を持つ${genre}キャラクター設定を生成:
    ・幼少期の出来事
    ・秘密の動機
    ・口癖
  `;

  const response = await openai.chat.completions.create({
    model: "gpt-3.5-turbo",
    messages: [{ role: "user", content: prompt }]
  });

  res.status(200).json(response.choices[0].message.content);
}
```

### 2.2 フロントエンド実装
```
// components/Generator.js
import { useState } from 'react';

export default function Generator() {
  const [traits, setTraits] = useState('');
  const [result, setResult] = useState('');

  const generate = async () => {
    const res = await fetch('/api/generate', {
      method: 'POST',
      body: JSON.stringify({
        traits: traits.split(','),
        genre: 'fantasy'
      })
    });
    setResult(await res.json());
  };

  return (
    <div>
      <input 
        value={traits}
        onChange={(e) => setTraits(e.target.value)}
        placeholder="特徴をカンマ区切りで入力"
      />
      <button onClick={generate}>生成</button>
      {result && <pre>{result}</pre>}
    </div>
  );
}
```

##  3. 導入事例
某インディーゲームスタジオの効果:

指標	改善前	改善後
生産性	3体/日	8体/日
多様性	62%	28%
参考: 
[character headcanon generator](https://characterheadcanongenerator.online/)の生成ロジックを一部活用

## 4. 今後の課題
日本語生成精度の向上

Stable Diffusion連携によるキャラ画像生成

チーム協働編集機能
"zsh compinit: insecure directories, run compaudit for list."が表示されたので対処した

# 経緯
- 2025年の春先にCursorを入れたこときっかけで色々設定をいじったら、macターミナルを立ち上げるたびに表題のメッセージが出るようになってしまった
- 動作には問題ないようだが、いちいちy/nで回答を求められて鬱陶しいし原因もわからなくて気持ち悪いので、解決しようと日曜の午後に検索

# みつけたもの
すでに同じ現象に悩んでいる方がいらしたようで、たくさん記事がヒット。
Googleの検索トップに上がってきたzenn記事がわかりやすかったので、こちらを参考に対処。

https://zenn.dev/fujishiro/scraps/ad86d76417909b

# さらにみつけたもの
上記記事の対応でcompinit/compauditのメッセージは出なくなったが、代わりに`compinit:527: no such file or directory: /usr/local/share/zsh/site-functions/_brew_cask`というエラーが出るようになったので、さらに検索してStackOverflowを見つける。

https://stackoverflow.com/questions/65747286/zsh-problem-compinit503-no-such-file-or-directory-usr-local-share-zsh-site

`brew cleanup` を実行すればよいとあるので、実行したところ色々とファイル等の削除が走って、解決した。

# 感想
なんでも生成AIに聞けばいいと言われるようになって久しいが、問題がわかってるならまだまだ従来の検索も捨てたもんじゃないですね。
Angularで約3年開発してみて上手くいったこと、上手くいかなかったこと

# はじめに
この記事がQiita初投稿となります。
拙い文章となりますがもしよかったら見ていってください。
それと私はAngularを今回触りましたが、React/Vue.jsなど他のSPAについてはよく知らないため、Angularでいい悪いと思ったことが他のフレームワークでも当たり前のことだったら教えていただけると嬉しいです。

# プロジェクト概要
- 大企業で10年以上使われていた基幹システムのリプレースプロジェクト
- 多いときで10人くらいの規模のプロジェクト
- Angularには当時一緒に開発していたベンダーの意向で決定
- 最初はアジャイル開発という話だったが、結局ウォーターフォールで開発がすすめられた

# 本題
まずは上手くいかなかったことから

## 上手くいかなかったこと

### 最近のフレームワーク等のバージョンアップのスピードに企業のフットワークが着いていけない

最近のフレームワークやライブラリのバージョンアップのスピードは昔と比べてかなり早く、ウォーターフォールの開発に1年以上かけていると危うくリリース時にはサポート終了間近ということがある。
今回もたった3年ほどでAngular Materialの大規模改修が2度入り、それなりに苦労をした
ウォーターフォール開発のためソースに変更がないタイミングを中々見つけることができず、PGが一通り完了したタイミングでバージョンをあげることになった。

:::note
#### 結論
どんどん変わる環境についていけるように日々の情報収集やスキルアップを怠らない
アジャイル開発のほうが相性がいいかも･･･？(ここはやったことないので分かりません)
:::

### 経験者がいないのにAngularを選んでしまった
日本では圧倒的にAngularの人気がないことが以下のGoogleTrendsの内容からわかる
[Google トレンドで「Angular, React, Vue.js - 日本、過去 12 か月間」の 人気度の動向 を見る](https://trends.google.co.jp/trends/explore?geo=JP&q=%2Fg%2F11c6w0ddw9,%2Fm%2F012l1vxv,%2Fg%2F11c0vmgx5d&hl=ja)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4083062/7a683638-33d9-4141-bea1-dc5d764ca851.png)
そのため情報収集をする際に日本語の記事が見つかりにくく、あまり得意でない英語の記事を読むことになった。

:::note
#### 結論
技術的に特定のフレームワークがよいなどがなければ人気のものを選ぶほうが楽そう
:::

### AIエディタの導入ができなかった
こちらも企業に求められるような問題だが、入っていればかなり変わったと思うので書いておく。
途中からCopilotChatが導入されたためAIとの対話自体はできるようになり、個人的にはかなり作業がスムーズとなった。
前述した英語の記事等も勝手に翻訳して教えてくれるため困ることが少なくなった。
しかし、プロジェクト全体を把握してヒントをくれるわけではないため、都度コピペ等を行うのが若干手間だった。
また、スキルの低いメンバはChatに投げるコードの範囲を誤っていたりして思いのほか効率が上がっていないように見えた。
個人的にはAIエディタ導入の大きな強みとしてテストコードの作成だと感じているが、プロジェクト当初の遅延からずっと手動テストが続けられてしまっているためデグレが幾度となく発生していた。

:::note
#### 結論
AIエディタを導入しよう
人の単価1%くらいで導入できて作業効率5%上がるだけで大儲け
:::

## 上手くいったこと

#### Angular Materialがある
個人的にはとても使いやすいと思った。
サンプルが充実していて困ったときには大体のことが解決できた。
見た目も比較的簡単に綺麗になるためデザイナーがいないにも関わらず地味な画面にはならなかった。
今回Figmaなども使えなかったためとても助かった。

:::note
#### 結論
Angular Materialは使いやすい
::::

#### 蜜結合/疎結合について深く考えるキッカケになった
私自身はこれまであまり疎結合に作るということの具体的な手法の経験が足りなかった。
Angularではコンポーネントを分けて製造を行うことで資源の再利用などを積極的に行えるようにした。
その際、最初は子コンポーネントが親に依存するような形を含めて作ってしまった。
そのような作りだと使いまわす際の制限が生まれ、修正も行いにくくなるためやってはいけないケースだということを学んだ。

:::note
#### 結論
コンポーネントが分かれやすいのでより疎結合に作ることが重要になる
:::

# まとめ
Angularのフレームワーク自体はとてもいいものでもう一度同じプロジェクトを今の知識で始めたら圧倒的にいいものが作れるという自信がある。
せっかく得た知識を活用してまたAngularのプロジェクトに参画したいと思っている。
これからの時代、AIを開発やプロダクトにも上手く活用できるかがカギになると感じている。

ここまでお読みいただきありがとうございました。
誰かの参考や考えるキッカケになったら嬉しいです。
🔧 最近AIで作った便利ツールまとめ（すべて無料）

![vibe coding.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4090831/26372e00-46c7-4861-b51d-79a1fdd3b7e5.png)

こんにちは、小さなAIプロジェクトをいくつか作ったので共有します。Chrome拡張、Markdown変換ツールなど、日常の作業をちょっと楽にするツールばかりです。気になったものがあれば、ぜひ使ってみてください。

---

### 🧲 TabMagnet – 新しいタブを「今開いてるタブの隣」に

Chrome拡張です。通常、Ctrl+Tなどでタブを開くと一番右に飛んでしまいますが、**現在のタブの右側に開く**ようにします。

検索・調査・資料探しなどで複数タブを切り替える作業が多い人におすすめ。
"Lazy but smart" な体験ができます。

* 🛠 [Chrome Web Store](https://chromewebstore.google.com/detail/tabmagnet/hcjodleodhbpnjcdfgdahdfnadfmfikn)
* 💻 [GitHub](https://github.com/littleben/TabMagnet)

> 💡 開発中にハマったこと：
>
> * ChatGPTは**古いChrome API**を使ってしまうことが多い → 最新の公式ドキュメントを確認するのが重要。
> * **動くバージョンができたら必ず保存！** AIでリファクタリングしようとして壊れて、修復不能になりました…。

---

### 🔄 万能Markdown変換ショートカット（Feishu Base）

Word / Excel / PPT / PDF / MP3など、**複数フォーマットをMarkdownに変換**できます。画像付きにも対応。
👉 [使ってみる](https://bytedance.larkoffice.com/base/extension/replit_30f2101aa13123e6)

---

### 📎 添付ファイル → テキスト自動抽出（Feishu Base）

添付されたプレーンテキストファイルを自動でフィールドに変換。文字起こしやログ整理にも便利です。
👉 [使ってみる](https://bytedance.larkoffice.com/base/extension/replit_30f1c3883764a3e3)

---

### 🌐 Word to Markdown サイト

Word (.docx) をブラウザ上で一括Markdown変換。サーバーにアップロードせず、**完全ローカル処理**で安心。
🔗 [https://www.word2md.net](https://www.word2md.net)

---

### 🌐 PDF to Markdown サイト

PDF も同様に Markdown に一括変換できます。
🔗 [https://www.pdf2md.net](https://www.pdf2md.net)
ChatGPTの下僕になった話 ～VSCodeでHTML編集 → WordPressに自動反映 → ブラウザ即更新する仕組みを作った～

## 背景：作業量に対して明らかに足りない納期

- 対応：リニューアルページ 4ページ
- 期間：8日
- 既存パーツの流用率：2割

**初日で「これ間に合わなくね？」と悟る。**

---

## 手作業の流れ（当初）

1. WordPressの管理画面を開いて、固定ページを編集
2. ソースを読む（色も整形もないので激見づらい）
3. 編集画面上でHTMLを直接編集する
4. 意図しないタグが増える or 消える
5. めんどくさくなって VSCode に貼って編集する
6. 編集結果を再度WPにコピペ → 更新 → プレビュー確認
7. 修正したらまたコピペして更新…
8. **以下ループ**

---

## ChatGPTに相談：「こういうツールないの？」

- 無いって言われた
- まぁ、そりゃそうだよなと思った
- **「じゃあ作ればよくね？」**
- 要件をまとめて再度ChatGPTに相談 → 「作れます」即答
- 2秒でやる気スイッチオン
- 半日で最初の試作品が完成（荒削り）

---

## 思わぬ感動：VSCode保存でWP編集画面に即反映された

- 最初は「保存 → API反映」だけの構成
- でも実際には **WPの固定ページ編集画面のHTMLソースまでリアルタイムで書き変わる**
- **おぉ…これはアツい。**

---

## なぜNode.jsを選んだのか

- 最初はPythonを提案された → 無理（読めん）
- 代替案を求めた → Node.jsを提示された
- JavaScriptなら分かる → **Node.js一択に**
- 構成もChatGPTに丸投げで構築開始

---

## 連携地獄：REST APIが見つからない問題

- Node.js周りは一通り揃えた
- 「REST APIで連携しよう」と言われる
- でも該当の「API登録画面」が見つからない
- http:// じゃないとダメとか言われて詰んだ気がする
- ローカルDocker環境だったため「これは無理では…？」となる
- **でも、ChatGPTに聞いたら「できます」**
- 手順どおりに対応 → 無事、API登録画面が表示される

---

## 認証情報セット → POST_IDの意味も理解できた

- APIキーをJSに直接書く
- 最初は全然うまくいかない
- `POST_ID` の意味も場所もわからなかった
- ようやく理解：「固定ページの編集URLの`post=◯◯`の数字がPOST_ID」
- 連携成功 → 保存で反映されるように



---

## そして再び布団の中で気づく：「プレビューの自動更新も欲しくね？」

- WP編集画面に反映されるだけで満足していたが、
- **「手動保存してF5押すのダルくね？」と寝る直前に気づく**
- ベッドの中でChatGPTに再度質問：「自動でブラウザ更新できる？」
- 「できます」と返ってくる
- 翌朝、言われた通りにやってみる
- 何度か失敗するが、**ついに構成が完成**

---

## 一発起動したくなる → `.bat` ファイルにして爆速へ

- あとはコマンド2つ打つのが面倒になる
- ChatGPTに聞く：「一発起動できる？」
- 「`.bat` にまとめればOKです」
- 言われるがままに `.bat` を書く
- ダブルクリックで実行した瞬間、**俺の夢見た世界が広がる**

---

## けど、ウィンドウが複数開いて鬱陶しい

- `watcher.js` 用と `browser-sync` 用でCMDが2枚開く
- 「まとめて1枚にしたい」→ 今後は全統合JSにする予定
- 余力があればGUI化までやるつもり（たぶん）

---

さらに、保存時には現在のHTML内容をMySQLに保存するようにしており、  
履歴としてDBに蓄積される仕組みにしている。  
（将来的には履歴からの復元や差分比較もできるようにする予定）


## GitHub リポジトリ

📂 ソースコード・ツール一式はこちらで公開しています：  
🔗 https://github.com/msfactory1103/wp-history-logger

---

## 最後に

まだまだ荒削りではありますが、**自分が求めていた環境は確実に形になりました。**  
今は個人開発用途にとどまっていますが、**似た課題を感じている人の参考になれば嬉しいです。**

---

今後の展開に…

# Don't miss it.
【Git】git mv後に履歴が追えない原因と対策

# はじめに
ファイルのリネームや移動をするとき、みなさんは `git mv` コマンドを使っていますか？

```bash
git mv old_file.rb new_file.rb
```

`git mv` は、単にリネームや移動するだけでなく、その操作をGitの履歴として残すことができる便利なコマンドです。
とても便利なこのコマンドですが、使い方を少し間違えると履歴をうまく追えなくなることがあります。

# 履歴が切れてしまうパターン

以下のような操作を一度に済ませたくなることはありませんか？

```bash
# 初期ファイルを作成
echo "puts 'Hello'" > old_file.rb
git add .
git commit -m "old_file.rb作成"

# git mvと修正を同時に実行
git mv old_file.rb new_file.rb
echo "puts 'こんにちは'" > new_file.rb
git add .
git commit -m ファイル移動とファイル修正

# この状態で履歴を確認
git log --follow new_file.rb
```
結果：old_file.rb 時代の履歴が表示されません😢

このように 「移動＋修正を同時にコミット」 してしまうと、`git log --follow` で過去の履歴を正しく追えなくなることがあります。

## 対策：コミットを分ける

この問題を防ぐには、**ファイルの移動と修正を別のコミットに分ける**ことです。

```bash
# 初期ファイルを作成
echo "puts 'Hello'" > old_file.rb
git add .
git commit -m "old_file.rb作成"

# git mvを実行
git mv old_file.rb new_file.rb
git add .
git commit -m ファイル移動

# 修正は別コミットで
echo "puts 'こんにちは'" > new_file.rb
git add .
git commit -m ファイル修正

# この状態で履歴を確認
git log --follow new_file.rb
```
結果：old_file.rb の履歴までしっかり追えます🎉

# まとめ
`git mv` と修正は、**別コミット** にするのがベストです。  
そうすることで、`git log --follow` で過去の履歴を正確にたどることができるようになります。
⚛️ NumPy チートシート


## 📦 インポート
```python
import numpy as np
````

---

## 📐 配列の作成

```python
np.array([1, 2, 3])              # 1次元配列
np.array([[1, 2], [3, 4]])       # 2次元配列

np.zeros((3, 3))                 # 0で埋めた配列
np.ones((2, 4))                  # 1で埋めた配列
np.eye(3)                        # 単位行列
np.full((2, 3), 7)               # 指定値で埋める

np.arange(0, 10, 2)              # 0〜10未満を2刻みで
np.linspace(0, 1, 5)             # 0〜1を5分割
```

---

## 📏 配列の情報確認

```python
arr.shape        # 形状（行×列）
arr.ndim         # 次元数
arr.size         # 要素数
arr.dtype        # データ型
```

---

## 🔁 形状変更・操作

```python
arr.reshape(2, 3)       # 形を変える（要素数は一致）
arr.flatten()           # 1次元に平坦化
arr.T                   # 転置（行列の入れ替え）

np.concatenate([a, b])              # 配列の結合（1次元）
np.concatenate([a, b], axis=1)      # 横方向に結合（2次元）
np.stack([a, b], axis=0)            # 新しい次元で結合
```

---

## 🧮 基本演算

```python
arr + 10               # 要素ごとの加算
arr * 2                # 要素ごとの乗算
np.sqrt(arr)           # 平方根
np.exp(arr)            # 指数関数
np.log(arr)            # 自然対数

np.sum(arr)            # 合計
np.mean(arr)           # 平均
np.std(arr)            # 標準偏差
np.max(arr), np.min(arr)  # 最大・最小
np.argmin(arr)         # 最小値のインデックス
```

---

## 🎯 条件演算・フィルタリング

```python
arr > 5                        # 条件判定（ブール配列）
arr[arr > 5]                   # 条件に合う値だけ抽出
np.where(arr > 5, 1, 0)        # 条件で値を分岐（if的）
```

---

## 🔢 行列演算（線形代数）

```python
np.dot(a, b)                  # ドット積
a @ b                         # ドット積（Python 3.5以降）
np.linalg.inv(a)             # 逆行列
np.linalg.det(a)             # 行列式
np.linalg.eig(a)             # 固有値と固有ベクトル
```

---

## 📚 おまけTips

| 操作     | コマンド                     |
| ------ | ------------------------ |
| データ型変換 | `arr.astype(np.float32)` |
| ランダム生成 | `np.random.rand(3, 3)`   |
| シード固定  | `np.random.seed(42)`     |
| 並び替え   | `np.sort(arr)`           |

---
🐳 seaborn チートシート


## 📦 インポート＆テーマ設定
```python
import seaborn as sns
import matplotlib.pyplot as plt
# Jupyter Notebook上で、グラフをノートブックの中に表示させるためのおまじない
%matplotlib inline

sns.set_theme(style="darkgrid")  # 他に white, whitegrid, dark, ticks なども
````

---

## 📊 基本プロット

### 1️⃣ 散布図（scatterplot）

```python
sns.scatterplot(x="x列", y="y列", data=df)
plt.title("散布図")
plt.show()
```

---

### 2️⃣ 線グラフ（lineplot）

```python
sns.lineplot(x="日付", y="売上", data=df)
plt.title("売上推移")
plt.show()
```

---

### 3️⃣ 棒グラフ（barplot）

```python
sns.barplot(x="カテゴリ", y="値", data=df)
plt.title("カテゴリ別の値（平均）")
plt.show()
```

※ 合計にしたい場合：

```python
sns.barplot(x="カテゴリ", y="値", data=df, estimator=sum)
```

---

### 4️⃣ 箱ひげ図（boxplot）

```python
sns.boxplot(x="カテゴリ", y="値", data=df)
plt.title("値の分布と外れ値")
plt.show()
```

---

### 5️⃣ ヒストグラム（histplot）

```python
sns.histplot(df["値"], bins=20)
plt.title("値のヒストグラム")
plt.show()
```

---

### 6️⃣ カーネル密度推定（kdeplot）

```python
sns.kdeplot(df["値"], shade=True)
plt.title("密度分布")
plt.show()
```

---

## 🌈 相関・多変量プロット

### 🔥 相関ヒートマップ（heatmap）

```python
corr = df.corr()
sns.heatmap(corr, annot=True, cmap="coolwarm")
plt.title("相関ヒートマップ")
plt.show()
```

---

### 🔍 ペアプロット（pairplot）

```python
sns.pairplot(df)
```

---

### 🔄 カテゴリごとの分布（violinplot）

```python
sns.violinplot(x="カテゴリ", y="値", data=df)
```

---

## 🎨 カスタマイズTips

```python
plt.title("タイトル")
plt.xlabel("X軸")
plt.ylabel("Y軸")
plt.xticks(rotation=45)
plt.tight_layout()
```

---

## 💡 おまけ：seabornの良いところ

| 特徴                      | 
| ----------------------- | 
| 🎨 デフォルトで美しい            |
| 🧠 統計処理が内蔵されてる（平均＋CIなど） |
| 🧩 pandasと相性バツグン        |
| 🪄 カテゴリの色分けやfacetingが簡単 |

---
📈 matplotlib チートシート


## 🎨 インポート
```python
import matplotlib.pyplot as plt
# Jupyter Notebook上で、matplotlibのグラフをノートブックの中に表示させるためのおまじない
%matplotlib inline
````

---

## 🧱 基本構文

```python
plt.plot(x, y)
plt.show()
```

---

## 📊 主なグラフの種類

### 1️⃣ 折れ線グラフ

```python
plt.plot(df["日付"], df["売上"])
plt.title("売上の推移")
plt.xlabel("日付")
plt.ylabel("売上")
plt.grid(True)
plt.show()
```

---

### 2️⃣ 棒グラフ

```python
plt.bar(df["商品"], df["売上"])
plt.title("商品別売上")
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
```

---

### 3️⃣ 円グラフ

```python
plt.pie(df["割合"], labels=df["カテゴリ"], autopct='%1.1f%%')
plt.title("カテゴリの割合")
plt.show()
```

---

### 4️⃣ ヒストグラム

```python
plt.hist(df["点数"], bins=10)
plt.title("点数の分布")
plt.xlabel("点数")
plt.ylabel("人数")
plt.grid(True)
plt.show()
```

---
###  5️⃣ 散布図

```python
plt.scatter(df['予算'], df['収益'], alpha=0.2)
plt.title("予算と収益")
plt.show()
```

---
###  6️⃣ 箱ひげ図

```python
plt.boxplot(df['収益'])
plt.title('収益')
plt.show()
```

---
## 🖼 複数グラフの表示（サブプロット）

```python
fig, axs = plt.subplots(1, 2, figsize=(10, 4))  # 1行2列

axs[0].bar(df["商品"], df["売上"])
axs[0].set_title("売上")

axs[1].plot(df["日付"], df["売上"])
axs[1].set_title("売上推移")

plt.tight_layout()
plt.show()
```

---

## 🖌 カスタマイズTips

```python
plt.title("タイトル")
plt.xlabel("X軸ラベル")
plt.ylabel("Y軸ラベル")
plt.legend(["凡例名"])
plt.xticks(rotation=45)
plt.grid(True)
plt.xlim(0, 10)
plt.ylim(0, 100)
```

---

## 📷 グラフを保存する

```python
plt.savefig("graph.png", dpi=300, bbox_inches="tight")
```

---

## 🎁 おまけTips

| 操作      | コマンド                                         |
| ------- | -------------------------------------------- |
| 図のサイズ変更 | `plt.figure(figsize=(10, 5))`                |
| 軸の調整    | `plt.xlim()`, `plt.ylim()`                   |
| ラベルの回転  | `plt.xticks(rotation=45)`                    |
| グリッド追加  | `plt.grid(True)`                             |
| 透明な背景   | `plt.savefig("graph.png", transparent=True)` |

---
JestでscrollToが存在しないとエラー


Chakra UI で作成した複数選択可能なドロップダウンリストを実装後にテストをしていたところ下記のエラーが発生しました。

```
dom.getContentEl(...)?.scrollTo is not a function
```

## 原因

内部的に使用している`scrollTo`が Jest のテスト環境に存在しないため、エラーになっています。

## 対策

`scrollTo`に対してモックを行います。今回は各テスト前にモックしました。

```typescript
beforeAll(() => {
  // Mock scrollTo to prevent TypeError
  Element.prototype.scrollTo = jest.fn();
});
```

## おわりに

Jest は基本便利なのですが、たまにいきなりエラーを出力することがあるので難しいと感じています。

この記事が皆様のコーディングライフの助けになれば幸いです。
windows11で、sketchup6 その109

# 概要
windows11に、sketchup6を入れてみた。
rubyで、3Dを書く。
練習問題やってみた。

# 練習問題
球面に描け。


# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/9d61e086-90e2-412f-b5e8-03d6e3c94814.png)


# サンプルコード

```
def lissa2
	model = Sketchup.active_model
	pts = Array.new
	0.upto(360 * 12) do |i|
		m = i * 1.1
		x = 50 * Math::sin(m * Math::PI / 180) * Math::cos(i * Math::PI / 180)
		y = 50 * Math::sin(m * Math::PI / 180) * Math::sin(i * Math::PI / 180)
		z = 50 * Math::cos(m * Math::PI / 180)
		pts[i] = [x, y, z]
	end
	spring = model.entities.add_curve(pts)
end

```

以上