OmniAICreator/Qiita-1.07M huggingface dataset:
【公ド読】Copilot コード補完の AI モデルを変更する

【公式ドキュメントを読もうシリーズ】Copilot コード補完の AI モデルを変更する

## シリーズ概要

[https://qiita.com/yasu_programming/items/cec66f9e8d5d571e9ce3](https://qiita.com/yasu_programming/items/cec66f9e8d5d571e9ce3)

## URL

[https://docs.github.com/ja/copilot/using-github-copilot/ai-models/changing-the-ai-model-for-copilot-code-completion](https://docs.github.com/ja/copilot/using-github-copilot/ai-models/changing-the-ai-model-for-copilot-code-completion)

## 説明

コード補完のAIモデルの切り替え方法に関して書かれている。

> Copilot のコード補完に使われるモデルを変更しても、Copilot Chat に使われるモデルには影響しません。

コード補完に使われるモデルと、Copilot Chatで使われるモデル違うんだ。知らなかった。

> Copilot Free サブスクリプションを使っている場合は、使われているモデルに関係なく、すべての補完が補完クォータにカウントされます。

[GitHub Copilot のプラン](https://docs.github.com/ja/copilot/about-github-copilot/plans-for-github-copilot#comparing-copilot-subscriptions)のリンクを見る限り、Copilot Freeプランの人はどんなモデルを使っても、1 か月あたり 2,000 回の補完使えるということなのだろう。

> パブリック コードと一致する提案を有効または無効にする設定は、選んだモデルに関係なく適用されます。

ここに関しては、[GitHub Copilot の候補に一致するパブリック コードの検索](https://docs.github.com/ja/enterprise-cloud@latest/copilot/using-github-copilot/finding-public-code-that-matches-github-copilot-suggestions)ここで調べようと思う。

その他、AIモデルの設定周りが書かれている。

## 所感

コード補完におけるAIモデルの設定に関して、書かれている。
ジオメトリノードで屋根のような曲面に沿わせて配置する

東洋の建築のようなものを作る時に大変なことの一つに
曲面状に反った屋根に瓦を並べるといったことがあります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/a5ede107-78d5-4132-a88c-975cc7fb7029.png)
軒が角に向かって反り上がっているほか　斜面も真直ぐではないのが見てとれるかと思います

こういった複数の曲面でできた面上への配列を
Blenderのジオメトリノードで作成する方法を検討したいと思います
Blender 4.2での作例になります

まずは 水平方向の曲線を表すカーブと斜面を表すカーブを使って
単純に配列をさせた例を作ってみます　「カーブをポイント化」で等間隔のポイントに変換しています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/6d55b873-4ef1-41c4-b3df-09bf8fb1313d.png)
配置しただけの状態なので　瓦の回転が
・斜面の角度に沿っていない
・軒の曲面にも沿っていない
また全体として
・屋根の頭頂部（棟）は直線状なのに　配置した瓦は軒と同じ反りになっている
といったことが見て取れます　これらを調整していきたいと思います

## 曲面状に配置
まず　一本のカーブに合わせて配置する時に回転させるのは単純です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/d3f29d56-01cf-41c5-b0e2-c83ce2f087cb.png)
「カーブのポイント化」の時にカーブの傾きに合わせた回転の要素が出力されているので
「ポイントにインスタンス」の回転要素に利用するだけです
回転の出力についている「回転を回転」は
90度回転されて配置されるのを調整するためのものです

同様に斜面方向もカーブに合わせて配置と回転をかけてみます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/72ff74c9-ddf9-4ed9-a53e-b8f269048a81.png)
どうやら「ポイントにインスタンス」の回転は　インスタンスの回転情報を加算する挙動のようです
「回転を回転」は回転の方向を意図した方向に調整するためのものです
カーブの方向次第では　１８０度足したり引いたりした値になるかもしれません

とりあえず方向のカーブに沿わせることまではできましたので多くの場合にはこれで足りるかもしれません

# 2つの要素をブレンドする
さて、軒先は指定した曲線で　棟部分は直線に並ぶようにしたい場合
座標を計算で求めるしかなさそうです
屋根全体で滑らかな曲面を作るには 直線状に並べた場合と曲線上に並べた場合との間をブレンドする計算がいります

### カーブ位置から係数
カーブでは　「スプラインパラメーター」のノードでカーブ上の点が　スプライン上のどの位置にあるのか
0.0-1.0の間の値で取得できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/972ffe5e-0b74-47e4-ba36-56c09b8eae54.png)
属性キャプチャと　名前付き属性格納を使うことでポイントや　その後に作成したインスタンスに値を伝えることができます

水平方向を直線状に配置したものと　曲線状に配置したもの　両方のデータを作成して　tの値でブレンドするとこうなります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/8035877f-2d70-4e47-a7d7-8e40450567f6.png)
軒側が曲がるようになる場合には　曲がり方を指定するカーブを編集モードで「向きを反転」するか
ミックスノードのABへ説測するものを逆にします


元のカーブを直線状にするのは　「カーブリサンプル」でポイントが始点と終点だけの状態にしてしまうことで作れます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/dbf7f959-9418-4c36-b28a-9b85db6d0b92.png)
直線でなく　別の曲線に遷移させたい場合には２つ目の形状を別のカーブを使って作るのもいいかもしれません



## Blender3.3等で再現するヒント
今回は　4.2で作成て　インスタンストランスフォームのマトリクス情報をミックスノードで合成しましたが
3.3ではミックスノードが存在していません

ミックスノードの2つの値 A, B ブレンドする計算は、ブレンド係数 _**t**_（0から1の範囲）を使用した **線形補間**を使って行われています
 (1 - _**t**_) * **A** + _**t**_ * **B**
 
_**t**_ = 0 のとき、結果は完全に **A**。 _**t**_ = 1のとき、結果は完全に **B** 。
_**t**_ = 0.5 のとき**A** と**B**が等しく混ざった中間値。 となる計算です
「位置」の要素のブレンドを3.3でも利用できる要素で作成するとこういった感じになります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/424d1f0a-dcec-44dc-819d-756a4b22e71e.png)
また、「回転を回転」のノードもないので　4.2では廃止予定となっている「オイラー回転」ノードを利用します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/c3d6b9c9-33f8-4b82-b47e-6abc455f2bae.png)

屋根のような曲面を作成する一例を書いてみました
座標等の計算の方法はこれだけではないので参考にしていただければと思います
【Python初心者】パッケージとモジュールの使い方・インポート方法・パスの違いまとめ


Pythonでモジュールやパッケージを使う際に、インポート方法やパス指定などで混乱することがあったので、自分の学習メモとして整理しました。

## 用語の整理

| 用語 | 説明 |
|------|------|
| **モジュール** | `.py` ファイル1つ。関数やクラスなどを定義する |
| **パッケージ** | モジュールをまとめたフォルダ。`__init__.py` を含む |
| **サブモジュール** | パッケージ内にある `.py` ファイル |
| **`__init__.py`** | パッケージ初期化ファイル。空でも良いがインポート制御にも使える |
| **`__all__`** | `from package import *` のときに読み込むモジュール名リストを定義する |

## インポートの基本

### モジュールから関数を使う

```python
# math_utils.py に定義された関数を使う
from math_utils import add
add(1, 2)
```

### パッケージからモジュールを使う

```python
from my_package import a
a.func_a()
```

### モジュール内の関数を直接使う

```python
from my_package.a import func_a
func_a()
```

## import * の動作と `__all__`

### モジュールの場合（`.py` ファイル）

```python
from math_utils import *
add(1, 2)  # OK
```

### パッケージの場合（フォルダ）

```python
from my_package import *
a.func_a()  # ❌ エラー（__init__.py に __all__ がないと使えない）
```

#### `__init__.py` に以下を記述：

```python
__all__ = ['a', 'b']
```

これで以下のようにアクセスできる：

```python
from my_package import *
a.func_a()  # OK
```

### 関数を直接インポートしたい場合の `__init__.py`

```python
from .a import func_a
__all__ = ['func_a']
```

```python
from my_package import *
func_a()  # OK
```

## `__init__.py` とは？

- パッケージであることを示すファイル
- 空でも構わない（Python 3.3以降はなくてもパッケージとして扱われる）
- モジュールのインポートをまとめたり、初期化処理を書いたりできる
- `__all__` もここに記述する

例：

```python
# __init__.py
from .a import func_a
from .b import func_b
__all__ = ['func_a', 'func_b']
```

## パスの考え方（絶対パスと相対パス）

### 絶対パス（絶対インポート）

プロジェクトのルートディレクトリからのフルパス指定。

```python
from my_package.a import func_a
```

明確で可読性も高く、大規模プロジェクトではこちらが推奨されることが多いです。

### 相対パス（相対インポート）

現在のファイルの位置から相対的に指定する方法です。

```python
from . import a               # 同じパッケージ内の a.py をインポート
from .a import func_a         # a.py 内の関数を直接インポート
from .. import shared_utils   # 1階層上のモジュールをインポート
```

注意点として、相対パスは「スクリプトを直接実行する場合」は動かないことがあります。  
その場合は、以下のように `-m` オプションで**パッケージとして実行**する必要があります。

```bash
python -m my_package.main
```

## 推奨スタイルまとめ

| 書き方 | 説明 | 推奨度 |
|--------|------|--------|
| `from module import *` | モジュールの全てをインポート。衝突の恐れあり | ❌ 非推奨 |
| `from module import name` | 必要なものだけ明示的にインポート | ✅ 推奨 |
| `from package import module` | パッケージ構造を保ちながら使える | ✅ 推奨 |
| 相対インポート | パッケージ内で使いやすいが注意点あり | ◯ 条件付きで有効 |

## まとめ

モジュールやパッケージの違い、インポートの種類、パス指定の違いを整理して理解が深まりました。  
特に `from xxx import *` の動作の違いや `__init__.py` の使い方、相対パスと絶対パスの使い分けは、実際に試してみることで理解しやすくなると感じました。
高校化学に必要な高校数学関数(日記)


##  1. **比例関数 $y = kx$**

### 数式と特徴

* $y$ が $x$ に比例して直線的に増減。
* $y = kx$（比例定数 $k$）

### 代表的化学現象

* **シャルルの法則**：$V \propto T$
* **ビールの法則**：$A = \varepsilon c l$（吸光度と濃度）

### 学習ポイント

* グラフが **原点を通る直線**。
* 比例定数の単位や意味を理解する。

---

##  2. **反比例関数 $y = \frac{k}{x}$**

### 数式と特徴

* $y$ が $x$ の逆数に比例して減少。
* $y = \frac{k}{x}$

### 代表的化学現象

* **ボイルの法則**：$P \propto \frac{1}{V}$（圧力と体積）

### 学習ポイント

* グラフは **双曲線**。
* 定積条件など「一定値に依存する法則」と結びつける。

---

##  3. **指数関数 $y = ae^{bx}$**

### 数式と特徴

* 急激な増減を表す非線形曲線。
* $y = ae^{bx}$

### 代表的化学現象

* **アレニウス式**：$k = A e^{-Ea/RT}$
* **放射性崩壊**：$N = N_0 e^{-\lambda t}$

### 学習ポイント

* 反応速度や崩壊など **時間依存的変化**のモデル化。

---

##  4. **対数関数 $y = \log_b x$**

### 数式と特徴

* 急激な増加後、緩やかに増加する曲線。
* $y = \log_b x$

### 代表的化学現象

* **pH計算**：$\text{pH} = -\log [H^+]$
* **pKa、pKb**

### 学習ポイント

* **桁違いの変化を直感的に捉える**。
* 負の対数（pH）を習得。

---

##  5. **二次関数 $y = ax^2 + bx + c$**

### 数式と特徴

* 放物線形状の曲線。
* エネルギーの極小・極大を表現。

### 代表的化学現象

* **ポテンシャルエネルギー曲線**
* **分子結合エネルギー曲線**

### 学習ポイント

* **安定点**（極小値）や遷移状態の可視化。

---

##  6. **三角関数 $y = \sin x, \cos x$**

### 数式と特徴

* 波形（周期関数）。

### 代表的化学現象

* **ブラッグの法則**：$n\lambda = 2d \sin \theta$

  * 結晶構造解析（X線回折）

### 学習ポイント

* **周期性・回折・干渉現象**との結びつけ。

---

##  7. **ステップ関数（跳躍的変化）**

### 数式と特徴

* 急激に0から1に変化（理想モデル）。

### 代表的化学現象

* **滴定曲線**（中和点付近の急変）
* **相転移モデル**

### 学習ポイント

* グラフの「変化点（エッジ）」に着目。

---

## **まとめ表**

| 関数モデル  | 数式                    | 代表的化学法則・現象     | グラフ形状        |
| ------ | --------------------- | -------------- | ------------ |
| 比例関数   | $y = kx$              | シャルルの法則、ビールの法則 | 原点を通る直線      |
| 反比例関数  | $y = \frac{k}{x}$     | ボイルの法則         | 双曲線          |
| 指数関数   | $y = ae^{bx}$         | 反応速度、放射性崩壊     | 急増・急減カーブ     |
| 対数関数   | $y = \log_b x$        | pH、pKa、pKb     | 急増から緩やかなカーブ  |
| 二次関数   | $y = ax^2 + bx + c$   | 結合エネルギー曲線      | 放物線（極小・極大あり） |
| 三角関数   | $y = \sin x$          | X線回折（ブラッグの法則）  | 波形（周期性）      |
| ステップ関数 | $y = 0 \text{ or } 1$ | 滴定曲線、中和点、相転移   | 急激な段差        |

---
Rails7　Renderへのデプロイ備忘録

目次
①アプリ作成&リモートリポジトリ作成
②renderでDB作成
③Railsアプリのデプロイ関連ファイルの編集(Rails側)
- config/database.yamlの編集 gem “pg”の追加(本番環境用のDB設定)
- bin/render-build.shの編集(ビルド用スクリプトの作成)
- config/puma.rbの編集(サーバー起動用スクリプトの編集)
- credentials.yaml/master.key/gitignoreの確認＆編集
④Render側での設定
- サービス作成から環境変数設定画面へ
- 環境変数の設定
- ビルド＆デプロイを開始
⑤デプロイの成功を確認



# 詳細
①アプリ作成&リモートリポジトリ作成

②renderでDB作成
create new service >> postgrespl
![スクリーンショット 2025-05-12 011209.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875244/6874fa3b-8e3a-44cc-a4c9-44d6b2a39b87.png)




③Railsアプリのデプロイ関連ファイルの編集(Rails側)(すべて完了したら忘れずにリモートリポジトリにpushする)

- config/database.yamlの編集&gem “pg”の追加(本番環境用のDB設定)

```ruby
#config/database.yaml
#productionセクションを以下のように変更
production:
  <<: *default
  adapter: postgresql
  encoding: unicode
  pool: 5
  url: <%= ENV['DATABASE_URL'] %>

```

```ruby
#gemfile
#productionセクションにpgを追加
group :production do
  gem "pg", "~> 1.4"
end

#ターミナル
bundle install --without production
```

```ruby
#謎のおまじない(まだよく調べてないがとりあえず必須のよう)
bundle lock --add-platform x86_64-linux
```

- bin/render-build.shの編集(ビルド用スクリプトの作成)

```ruby
#!/usr/bin/env bash
set -o errexit  # 1つでも失敗したら中断

bundle install
yarn install --check-files
bundle exec rake assets:precompile
bundle exec rake db:migrate
```

```ruby
#上のファイルの実行権限の変更
chmod a+x bin/render-build.sh
```

- config/puma.rbの編集(サーバー起動用スクリプトの編集)

```ruby
#config/puma.rbの確認。編集なしで問題なかった。
```

- credentials.yaml/master.key/gitignoreの確認＆編集

credentials.yml・・・APIキーなどの機密情報を扱うファイル

master.key・・・credential.ymlの復号用の鍵。gitignoreに入れておく

上2つはrails newしたときに自動生成されるがない場合、もしくは扱う機密情報を編集したい場合は以下のコマンドでcredentials.ymlを編集するためのエディタを立ち上げる。

```ruby
EDITOR=code rails credentials:edit
```

④Render側での設定

- サービス作成から環境変数設定画面へ
- 環境変数の設定

```ruby
#サーバー起動、ビルドスクリプトの実行コマンド＆環境変数の設定
Start Command = bundle exec puma -C config/puma.rb
Build Command =./bin/render-build.sh
DATABASE_URL = レンダーでDBを作成した場合:Internal Database URLの内容をコピペ
RAILS_MASTER_KEY = config/master.keyの内容をコピペ
```

- ビルド＆デプロイを開始



⑤デプロイの成功を確認
```ruby
 Your service is live 🎉
 のログが出た後、ログの左上にあるURLをクリックしてアプリが正常に動作するかを確かめる
```
マッチングアプリ統計学・機械学習


##  総合ゴール

* **「選ばれるプロフィール」と「成功する会話パターン」を数値的に解明**
* **「マッチ成功予測」や「最適な相手推薦」のアルゴリズム構築**
* **「科学的改善サイクル」をビジネスや研究に適用するスキル習得**

---

##  **第1部：統計学編 - ユーザー理解と要因分析**

### 1. **データリテラシー・可視化**

* データ構造理解（プロフィール、行動、メッセージ）
* ユーザー属性分布（年齢・趣味・地域）
* 成功率・行動量の可視化（ヒストグラム・箱ひげ図・散布図）

#### 使用技術

* pandas, matplotlib, seaborn

---

### 2. **マッチ成功率の統計的検定**

* 男女差、年代別、居住地域別のマッチ成功率の有意差検定
* 95%信頼区間による「運か実力か」の評価

#### 使用技術

* カイ二乗検定、比率の信頼区間、二項検定、t検定、ANOVA（分散分析）
* scipy.stats

---

### 3. **行動データ分析**

* いいね数・メッセージ数とマッチ率の相関分析
* 相関係数、偏相関係数、回帰分析による行動影響評価

#### 使用技術

* 相関分析、単回帰・重回帰分析
* statsmodels, sklearn.linear\_model

---

### 4. **特徴量設計・次元削減**

* 自己紹介文の長さ、趣味数、キーワード数などの特徴抽出
* 主成分分析（PCA）による次元削減と可視化

#### 使用技術

* TF-IDF、PCA
* sklearn.decomposition

---

##  **第2部：機械学習編 - 予測・分類・推薦**

### 5. **マッチ成功予測モデル**

* プロフィール・行動特徴から「マッチ成立確率」を予測
* ロジスティック回帰・決定木・ランダムフォレスト・XGBoostの比較

#### 評価指標

* 精度（Accuracy）、適合率（Precision）、再現率（Recall）、F1スコア、ROC AUC

#### 使用技術

* sklearn.linear\_model, sklearn.tree, xgboost

---

### 6. **最適相手推薦モデル**

* 協調フィルタリングによる「似た好み・行動の相手」を推薦
* 行列分解・近傍探索によるレコメンド

#### 使用技術

* k近傍法（KNN）、ユーザーベース・アイテムベース協調フィルタリング
* surprise, sklearn.neighbors

---

### 7. **会話テキスト感情・内容分析**

* メッセージから好印象や盛り上がりパターンを分類
* BERTなどNLPモデルによる感情分類・話題抽出（LDA）

#### 使用技術

* transformers（BERT）、janome、LDA（Latent Dirichlet Allocation）

---

### 8. **ユーザー行動クラスタリング**

* 積極型・慎重型・メッセージ重視型などのタイプ分類
* k-means、階層クラスタリング、SOM

#### 使用技術

* sklearn.cluster

---

### 9. **最適プロフィール・行動最適化**

* 成功しやすいプロフィールパターン生成
* ABテスト、強化学習、ベイズ最適化で効果検証

#### 使用技術

* BayesianOptimization、Optuna、Reinforcement Learning（RL）

---

##  **実践フェーズ**

| 課題  | 目標             | 技術例           |
| --- | -------------- | ------------- |
| 実践1 | マッチ率の改善要因発見    | 記述統計・検定・相関分析  |
| 実践2 | 成功確率のAI予測モデル開発 | ロジスティック回帰・決定木 |
| 実践3 | 相性最適推薦アルゴリズム構築 | KNN・協調フィルタリング |
| 実践4 | メッセージ感情分析と提案生成 | BERT・NLP      |
| 実践5 | 行動データによるユーザー分類 | クラスタリング・PCA   |
| 実践6 | 最適プロフィール自動改善   | 強化学習・ベイズ最適化   |

---
量子の不確実性と干渉波のリアルタイム視覚化

量子コンピュータの世界では、不確実性と重ね合わせは重要な概念です。
今回は、この不確実な量子状態の揺らぎと干渉波の様子をThree.jsとWebSocketを用いてリアルタイムに視覚化しました。

⸻

プロジェクト概要

このプロジェクトは、以下の技術スタックで構築されています。
	•	Three.js：3D空間での波動の視覚化
	•	WebSocket：Pythonサーバーからリアルタイムデータを送信
	•	Python：干渉波の計算処理

システム構成

[ Python (WebSocketサーバー) ] ---> [ WebSocket ] ---> [ JavaScript (Three.js) ]

1.	Pythonが干渉波の計算を行い、リアルタイムデータをWebSocket経由で送信
	2.	JavaScript (Three.js) が受け取り、3D空間に波動を描画
	3.	UIで周波数や位相を変更し、干渉パターンの切り替えも可能

⸻

実装詳細

WebSocketサーバー (Python)

Python側で2つの異なる波動を生成し、それらを干渉波としてWebSocketで送信しています。

import asyncio
import websockets
import numpy as np
import json

# 波動関数の定義
def wave_function(x, t, k=1, omega=1):
    return np.sin(k * x - omega * t)

# 干渉波の定義
def interference_wave(x, t, k1=1, omega1=1, k2=1.5, omega2=1.2):
    wave1 = wave_function(x, t, k1, omega1)
    wave2 = wave_function(x, t, k2, omega2)
    return wave1 + wave2

# WebSocketの処理
async def wave_data(websocket, path):
    while True:
        t_values = np.linspace(0, 10, 100)
        x_values = np.linspace(-5, 5, 100)
        data = []

        for t in t_values:
            wave_points = [{"x": float(x), "y": float(interference_wave(x, t))} for x in x_values]
            data.append({"time": float(t), "points": wave_points})

        # JSONデータを送信
        await websocket.send(json.dumps(data))
        await asyncio.sleep(0.1)  # 100msごとに送信

# サーバーの起動
start_server = websockets.serve(wave_data, "localhost", 8765)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

批判や反論への対応

このプロジェクトに関して、いくつかの批判や反論が考えられます。それぞれに対する対応策も示します。

⸻

1.「これは単なるクラシカルなシミュレーションに過ぎないのでは？」
	•	反論:
これは正しい指摘です。このプロジェクトは量子シミュレーションをクラシカルな手法で可視化しています。しかし、重要なのは量子の不確実性や干渉の概念を直感的に理解することです。
実際の量子計算では複雑な位相干渉が生じ、それを視覚化することでアルゴリズムの動作が見える化されます。今回はその概念モデルを目に見える形にしたものです。

⸻

2.「実際の量子状態はもっと複雑ではないか？」
	•	反論:
確かに、量子ビットの重ね合わせや多体干渉はさらに複雑です。しかし、このプロジェクトは単一の振幅と干渉を単純化して示しています。
次のステップとして、多体量子ビットの干渉やショアのアルゴリズムの視覚化を計画しており、段階的に拡張していく方針です。

⸻

3.「WebSocketのレイテンシーが視覚化に影響するのでは？」
	•	反論:
WebSocketのレイテンシーは10ms〜20ms程度で、リアルタイム表示に大きな影響はありません。
さらに、データ送信の最適化を行い、バッファリングと非同期処理で滑らかな動きを実現しています。
将来的には、WebRTCの導入も視野に入れ、さらなる高速化を目指します。

⸻

今後の展望
	•	記録と再生機能の追加
	•	データのエクスポートと再現
	•	多体量子の干渉シミュレーション
	•	YouTube向けのデモ動画の公開

⸻

GitHubリポジトリ

このプロジェクトはオープンソースとして公開しています。
Quantum-Visualizer on GitHub

⸻

最後に

量子の不確実性を視覚化することで、複雑な量子挙動が直感的に理解できるようになりました。
次は、これを分散処理や多重干渉のシミュレーションに拡張する予定です。
ぜひ、次回の進展もご期待ください
PDF.js API - Advanced JavaScript PDF Viewer

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>PDF.js APIについて</title>
</head>
<body>

  <h1>PDF.js APIについて</h1>

  <p><strong>PDF.js</strong>は、<strong>Mozilla</strong>が開発したオープンソースのJavaScriptライブラリで、Webブラウザ上でPDF（Portable Document Format）ドキュメントを表示・操作するための強力なツールです。HTML5の<code>&lt;canvas&gt;</code>要素を使ってPDFをレンダリングし、追加のプラグインなしでPDFを表示できます。</p>

  <h2>主な機能</h2>
  <ul>
    <li><strong>PDFのレンダリング</strong>：ブラウザ内でPDFを表示・読み取り可能</li>
    <li><strong>印刷・保存</strong>：PDFをそのまま印刷または保存できる</li>
    <li><strong>プレゼンテーションモード</strong>：全画面表示によるスライド風のページ送り</li>
    <li><strong>ナビゲーション</strong>：ページ移動やページ番号指定でのジャンプが可能</li>
    <li><strong>注釈</strong>：テキストや画像、描画の追加ができる</li>
    <li><strong>ページの回転</strong>：PDFページの回転表示</li>
    <li><strong>スクロール制御</strong>：水平・垂直のスクロールモードを選択可能</li>
    <li><strong>ドキュメント情報の表示</strong>：PDFのプロパティ表示に対応</li>
  </ul>

  <h2>導入方法</h2>
  <ol>
    <li><strong>ソースからビルド</strong>：GitHubリポジトリからクローンし、Node.jsやGulpでビルド</li>
    <li><strong>事前ビルド版の利用</strong>：GitHubのリリースからPDF.jsをダウンロード</li>
    <li><strong>CDNの利用</strong>：cdnjsやjsDelivrなどのCDN経由でライブラリを読み込み</li>
  </ol>

  <h2>使用例</h2>
  <p>PDF.jsでPDFを表示するには、以下のような手順でHTMLとJavaScriptを記述します：</p>
  <ul>
    <li>ライブラリを<code>&lt;script&gt;</code>タグで読み込む</li>
    <li>表示用の<code>&lt;canvas&gt;</code>要素を用意</li>
    <li><code>pdfjsLib.getDocument()</code>と<code>.render()</code>を使って描画</li>
  </ul>

  <h2>デモの紹介</h2>
  <p>PDF.jsの機能を体験できるオンラインデモが用意されています。完全な機能を試すことができるため、実装前に使用感を確認できます。</p>

  <h2>結論</h2>
  <p><a href="https://products.documentprocessing.com/viewer/javascript/pdf.js/">PDF.js</a>は、WebベースでPDFを閲覧・操作したい場合に非常に有用なツールです。オープンソースでありながら豊富な機能を備え、クロスブラウザ対応も万全。デフォルトのビューアも提供されており、迅速な導入が可能です。</p>

  <p>PDF.jsは以下のようなシーンで特に役立ちます：</p>
  <ul>
    <li>Webアプリ内でPDFを直接表示したいとき</li>
    <li>独自UIを構築してPDF操作をカスタマイズしたいとき</li>
    <li>追加プラグインなしで軽量にPDFを閲覧したいとき</li>
  </ul>

</body>
</html>
楽譜上の時刻を表現する手法

# TL; DR
機械に読ませやすくするか、人間が編集しやすいままにするか

# 楽譜上の時刻？
皆さん、音ゲーはお好きですか？アーケードからスマートフォンまで様々な筐体で遊べるリズムゲームですが、譜面はどのように記述されているか、気になったことはありませんか？
この記事では、ノーツの判定時刻を4種類の方法で表し、それらの長短を比べようと思います。

# 時刻の表し方
## 演奏開始からの秒数
まずは最もシンプルなところから。
音源の再生が始まってから何秒後にアクションすればよいかを表すものです。BPM=120で刻むなら
```
0.0
0.5
1.0
1.5
2.0
...
```
といったところでしょうか。

もちろん、単位は秒に限りません。1ミリ秒を1として
```
0
500
1000
1500
2000
...
```
などとしてもよいですし、60FPSで動く＆判定する仕様に合わせて
```
0
15
30
45
60
...
```
などと表すのもよいでしょう。

この記法の長所は、「機械にとって処理しやすい」点が挙げられます。
BPMや小節の拍数など他の要素を気にせず、とにかくアクション時の音源の再生位置と譜面の時刻を比較すればよいだけなので、高速に処理できます。

一方、この記法は譜面師さんが読み書きするには面倒です。というのも、BPM=120の楽曲ならまだいいんですが、BPM=121のような中途半端な数字になると
```
0
0.496
0.992
1.488
1.983
...
```
のように、読みづらく作成する際にも毎回計算が必要になってしまいます。

## MBTを用いた方法
MBTは「Measure:Beat:Tick」という表記の略称で、"小節番号"と"拍番号"と"拍内のズレ"の3要素を用いて表す方式です。"拍内のズレ"は、1拍を"分解能"と呼ばれる数字（譜面で1つ定義）で分割した際の何番目かを表します。

例えば、3小節目から8分音符で5回叩くことは次のように表せます。分解能は960としています。小節番号や拍数は0-indexedである点に注意して下さい。
```
2:0:0
2:0:480
2:1:0
2:1:480
2:2:0
```


この方法の長所は、「譜面師さんが読みやすく、他者と会話をする際に分かりやすい」点にあります。
「oo小節目のxx拍目のノーツはhogehogeがいいな」のように小節数と拍数が会話内であったときにすぐにノーツを特定できます。

この方法の短所は、「機械が読みにくい」点があります。
この記法の場合、あるMBT表記が与えられたときに、そのノーツの音源上の時刻を計算するのに「BPM」「1小節内の拍数」「分解能」「音源オフセット[^1]」を意識する必要があります。特に「BPM」と「1小節内の拍数」は楽曲によっては演奏途中で変化することがあり、特定のMBT表記から時刻を算出するのに過去のBPM・拍数変化を全て加味する必要があります。

## Tickを用いる方法
MBTでは「1小節内の拍数」を考慮しなければなりませんでした。そこで、「演奏開始からの経過Tick数だけで全て表現できないか」ということでTickのみを用いる方法があります。
例えば、4/4拍子の楽曲で3小節目から8分音符で5回叩くことは次のように表せます。分解能は960としています。
```
7680
7920
8160
8400
8640
...
```
この方法は数字1つで位置を表すことができ、MIDIファイルの内部構造でも利用されています。

この方法の長所は、「譜面師さんがそこそこ読みやすい形式に簡単に変換でき、機械にも多少読みやすい」点です。
分解能の何倍の値かを見ることで小節番号を推測したり、値を分解能で割った余りを見ることで小節内のどこにあるのかを簡単に知ったりできます。機械にとっても、ノーツの時刻を割り出すのに必要な要素が「BPM」「分解能」「音源オフセット[^1]」だけになるため、考えることが1つ減ります。

一方、短所は「一般に数字が大きくなりやすい」点です。様々な拍パターン（3連符・5連符なども含む）に対応するため、一般的なMIDIファイルの分解能は480や960と大きめな数字になっています。4/4拍子で100小節進むと192,000という大きな値を扱うことになります。これは機械ならまだしも人間が読む数字としては大きすぎます。

## 分解能をノーツ毎に指定する方法
先述の2方式では分解能が譜面に1つでしたが、譜面によっては「一部だけ変拍子を使っているが、多くの部分はそうでもない」ということがあります。そのため、必要なところだけ分解能を上げるという方法を取ることがあります。

例えば、4/4拍子の楽曲で3小節目から8分音符で5回叩くことは次のように表せます。分解能は960としています。
本記事においては、表記を`(開始からの拍番号),(拍内のオフセット)/(分解能)`とします。
```
8,0/1
8,1/2
9,0/1
9,1/2
10,0/1
...
```
この方法はBMSの考え方に近く、1拍をn等分したm番目という表現をします。

この方法の利点は「小さな数字で多くの表現ができる」点にあります。
例えば、MBTやTickを分解能480や960で出力すると7分音符が正確に再現できません。これは、480や960が7で割り切れないことに起因します。
この記法の場合、7連符を
```
0,1/7
```
のように分母に7を置くことで表現することができます。
また、小節番号をデータに入れないことで、Tickを用いる場合と同様の情報で時刻の計算が可能となります。

一方、この方法では一般にノーツ毎に分解能が異なるため、パッと見ただけではどれが最初に来るのか分からなくなりがちであるという問題があります。これは、通分できたとしても1拍内では同じ分解能を使い続けるよう制約をかけることで回避することができます。

# 組み合わせ
機械にとっては、演奏開始からの秒数が最も楽に取り扱えるため、編集中はMBTなど人間が読みやすい形式を用い、利用前に各ノーツの時刻を計算しておきメモリ内部に秒数で保持しておくという方法を取ることがあります。

# 参考記事
MBT
https://qiita.com/toyoshim/items/69dce2c58f72418b3d19

BMSの記法
https://w.atwiki.jp/laser_bm/pages/93.html


[^1]: 譜面の開始と音源の開始時刻がズレるとき（最初に無音区間が挿入されている、譜面外の音の立ち上がりが収録されている等）に指定する時間。秒単位などで指定する。
#29.個人学習のドメイン名はお名前.comからの取得がいいかも

# はじめに
nayaaaaです。ここ2〜3か月ほど前からAWS を触っており、現在は無料期間中です。

学習の中で、LBに証明書を設定してHTTPS通信させるには独自ドメインの取得が必要であると知りました。何とか無料か安価に済ませることができないかなぁと調べていたところ、お名前.comを使っている方が多かったので、今回はその流れを記事にしました。

# なぜお名前.comを使うの?
本来であれば、AWSのサービスであるRoute53からドメインを取得できます。
ただし、以下の公式PDFを見ても分かる通り、すべて有料です。

https://d32ze2gidvkk54.cloudfront.net/Amazon_Route_53_Domain_Registration_Pricing_20140731.pdf

個人学習で使うなら、できるだけコストは抑えたいという気持ちになりますよね。
いろいろ調べた結果、お名前.comでドメインを取得し、DNSはAWSのRoute53を使うというのが安価であることがわかりました。(ドメインによっては初年度のみ無料）

私も実際に試してみたので、その手順を紹介します。

# お名前.comでドメインを取得する手順
まずは以下のリンクからお名前.comのサイトにアクセスして、アカウント登録を行います。

https://www.onamae.com/?utm_source=Google&utm_medium=paidsearch&banner_id=102_kwt_domain_domainbrand-onamae_rsa_006&waad=Ev0lmQOs

登録が完了すると、ログイン情報が発行されます。

発行後、以下でログイン
お名前ID：
パスワード：

ログイン後、以下の赤枠部分にお好きな文字を入力して検索します。

![image - 2025-05-11T223551.930.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904736/490f00bf-37b6-41e5-9554-166e6f30b46b.png)

使用可能なドメイン一覧と料金が表示されるので、希望のものを選択してください。

![image - 2025-05-11T223602.435.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904736/39b72471-6d8d-4585-9b1b-f9e71ffc86d4.png)

最後に、一番下の「すでにサーバーをお持ちの方はこちら」を選択します。

![image - 2025-05-11T223605.948.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904736/bdc88353-b380-471c-ab6a-663bbbcafc5c.png)

他の選択肢を選んでしまうと、お名前.com のレンタルサーバー契約に進んでしまうので注意です。
※ちなみに、レンタルサーバー契約は初月無料とのことですが、今回はAWSのRoute53を使う想定なので不要です。

- ドメイン取得後の流れ
ドメインの取得が完了したら、次はAWS（Route53）でホストゾーンを作成し、そこで払い出されるネームサーバー（NS）レコードをお名前.com側に登録します。

これで、お名前.comで取得したドメインでも、DNSはAWSRoute53で管理できるようになります。

# まとめ
実際のところ、Route53のネームサーバー（ホストゾーン）は無料期間中でも使用すると課金対象になります。
しかし、お名前.comのレンタルサーバー契約に比べると、個人学習のDNSとして最低限の機能を安価に試すにはちょうどいいのかなと思います。

こうした細かい部分のコストって意外と見落としがちで、後から「え～そんなにかかってたの⁉」ってなるんですよね。
Atcoder解いてみた ABC 073 C - Write and Erase

# ABC 073 C - Write and Erase 解いてみた
問題は[こちら](https://atcoder.jp/contests/abc073/tasks/abc073_c)

## 回答
```C++
# include <iostream>
# include <map>
using namespace std;

int main()
{
    int n;
    int a[100000];
    
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }

    std::map<int, int> paper{};

    for (int i = 0; i < n; i++) {
        // 紙に数字が書かれていない
        if (paper.find(a[i]) == paper.end()) {
            paper[a[i]]; // 紙に数字を追加
        }
        else {
            paper.erase(a[i]);
        }
    }

    cout << paper.size() << endl;

    return 0;
}
```
英語短母音の四種類の「ア」の発音区別（単語例）

こんにちは。
英語話者は短母音の「ア」の発音を四種類区別するので、対応する単語例を調べました。
* 日本人には、これらの発音・聞き取りが苦手で取り違えることもあり要注意です。

#### 単語例
四種類の発音をIPA発音記号を用いて区別します。

１. [ə] （弱勢曖昧母音）
 - about confer

２. [ʌ ɜ]
 - but cut gut hut gulf tug runt rubber rubble funnel adult truncate
 - come comfort company compass
 - money month monkey among 
 - other brother mother front love none onion oven some son ton sponge tongue stomach
 - touch tough rough enough young country couple double southern trouble roughage

３. [ɔ ɑ ɒ][^1]
 - bot cot got hot dock knot socket lock dollar option conference contemplate Hollywood wobble 
 - wash wander watch what swan squash quality Watt Washington

４. [æ][^2]
 - bat cat hat gas gather rat flag tank land sand captain campus

[^1]: 日本人には「オ」に近く聞こえる場合の方が多いです。
[^2]: 日本人には、独特な「ア」として（「エ」にも近く）聞こえます。
MacでGitHubとSSH連携を設定する手順

## 目次
1.  SSH鍵の作成
1.  GitHubに公開鍵を登録する方法
1.   ~/.ssh/config への設定
1.   ~/.ssh/config を使った接続確認
1.   ~/.ssh/configの設定あり・なしでのコマンド比較
1.   Gitのユーザー名とメールをグローバル設定する方法
1.  SSH接続の接続確認


### 環境
- Mac
- GitHub

## SSH鍵の作成
Macで「SSH鍵のペア（公開鍵と秘密鍵）」を作成します。

```
ssh-keygen -t ed25519 -C "your-email@example.com" -f ~/.ssh/id_ed25519_github_[アカウント名]
```

| オプション           | 説明                      |
| --------------- | ----------------------- |
| `-t ed25519`    | 軽量でセキュアな鍵方式   |
| `-C`            | コメント |
| `-f ~/.ssh/...` | 鍵ファイルの保存先と名前            |



| 生成されるファイル          | 説明                      |
| --------------- | ----------------------- |
| `~/.ssh/id_ed25519_github_[アカウント名]` | 秘密鍵            |
| `~/.ssh/id_ed25519_github_[アカウント名].pub` | 公開鍵、GitHubに登録する鍵           |



## GitHubに公開鍵を登録
作成した公開鍵をGitHubに登録します。
### 1. 公開鍵の内容をコピーします。
```
cat ~/.ssh/id_ed25519_github_[アカウント名].pub
```
### 2. GitHubの設定画面へ
1. GitHubにログイン
1. 右上のアイコン → Settings
1. 左メニューから SSH and GPG keys
1. New SSH key をクリック
1. 以下を入力：
    - Title：例）"MacBook SSH Key"
    - Key：先ほどコピーした公開鍵を貼り付け
6. Add SSH key をクリック

これで登録完了です！


## ~/.ssh/config への設定
SSH接続時に毎回秘密鍵ファイルを指定するのは手間です。
~/.ssh/config に設定を記述することで、簡略なホスト名（エイリアス）で接続できるようになります。
これにより、複数のSSH鍵を使い分けたり、接続コマンドを短くすることができます。

configファイル開きます。
```
nano ~/.ssh/config
```
configに記述します。
```
Host github-[アカウント名]
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_ed25519_github_[アカウント名]
```

| 項目             | 説明                                |
| -------------- | --------------------------------- |
| `Host`         | ニックネーム（自由に付けられる）                  |
| `HostName`     | 実際に接続するホスト名（GitHubは `github.com`） |
| `User`         | GitHubのSSH接続時は `git` 固定           |
| `IdentityFile` | 使用する秘密鍵ファイルのパス                    |


## Gitのユーザー名とメールをグローバル設定

```
git config --global user.name "Your Name"
git config --global user.email "your@email.com"
```

| オプション          | 設定される場所               | 影響する範囲             |
| -------------- | --------------------- | ------------------ |
| `--global`     | `~/.gitconfig`        | あなたのユーザー全体（全リポジトリ） |
| `--local`（省略時） | `.git/config`（各リポジトリ） | 今いるリポジトリだけ         |


## ~/.ssh/config を使用した接続確認

```
ssh -T git@github-[アカウント名]
```

## ~/.ssh/configの設定の有無でのコマンド比較

| 状態         | 接続コマンド例                                               |
| ---------- | ----------------------------------------------------- |
| `config`なし | `ssh -i ~/.ssh/id_ed25519_github_meat git@github.com` |
| `config`あり | `ssh git@github-meat`                                 |
TouchGFXを使おう11～プロジェクト切替編～

TouchGFXを使おう10～Servo編～の続きです。

https://qiita.com/usashirou/items/d7475f88fb5f82996eb5

今回は、STM32CubeIDEにTouchGFXで生成したプロジェクトを開く、切り替える方法です。
TouchGFXで生成したプロジェクトはSTM32H735G-DK(in STM32CubeIDE)というプロジェクトになっており
TouchGFXのプロジェクト名とリンクしておらず、TouchGFXプロジェクトを何個も作ってもそのままでは切替できない仕組みになっています。
# プロジェクトの開き方
STM32CubeIDEを起動した状態で __.cproject__ または __.project__ を __ダブルクリック__ します。
標準の場合のフォルダ例：TouchGFXProjects⇒プロジェクト名⇒STM32CubeIDE
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/e92ffe1b-0292-44d2-8378-d246fc85fbba.png)
インポートされると画像のようなダイアログボックスが表示されますので、__OK__ を __クリック__ します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/45cc3ad2-858d-47bc-8b54-c0597c5bb9a5.png)
# プロジェクトを削除する
今度は表示しているプロジェクトを消してみます。
プロジェクトを __右クリック⇒削除__ を __クリック__ します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/5de3fb46-59f3-465e-9366-15941d7cfe06.png)
__OK__ を __クリック__ します。

:::note alert
__ディスク上からプロジェクト・コンテンツを削除__ に __チェック__ は __入れない__
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/26c1d0dd-6b8f-4769-a9a2-273e4b5c29b6.png)
削除されると下記のようになります。
![スクリーンショット 2025-05-04 235610.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/cf63804a-d0b5-4f7e-83a1-4f812237e945.png)
Gmail全件を持ち出し（Takeout）てローカル保存

Gmail。ついに使用している容量が14GB程度となった。　そこで、データをダウンロードしてメール削除する。　Google Takeout でメールを指定して一晩待ちダウンロード。　メールソフトで閲覧できるかを確認しておく必要はありそう。
Thunderbird でmboxファイルを読めるという情報が以下にある。
https://kitaney-google.blogspot.com/2014/09/googlegmail.html

一日いろいろやってみたのだが、やはりエラーレポートはよく読んで見るものだ。できた。

![スクリーンショット 2025-05-11 224927.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138461/f2e8836c-b5da-4d18-940f-b8cd5d8a449e.png)

なお、この方法に至るまでに、何度も挫折していたのは、
メニュー　＞　ツール　＞　データとプロファイルのインポート　というやつ。
これは検索すると出てくる手順なのだがそのままやるとうまくいかない。

上記のように、　ローカルフォルダ　で　右クリックメニュー　の中から始めるようにするべし。
Windows用のPythonインストーラの作成方法

# 何の記事？
古めのPythonにはWindows用のインストーラのバイナリが付属されなくなるため、ソースコードからインストーラを作成しよう…という記事です。

この記事ではPython 3.10.17のインストーラを作ります。

Readmeには【For testing】と【For an official release】の2種類のインストーラの作成方法が載っていますが、本記事では【For testing】の作り方を載せています。

本記事はほぼ私用の超簡易版な作成方法なので、詳しくはReadmeを参照をば～


# 必要なもの
- Python 3.10.17  (ファイル名：Python-3.10.17.tgz)
- Visual Studio Community 2022


# 手順
1. Visual Studio Community 2022をインストール
2. スタートメニューより、【Visual Studio 2022】⇒【x64 Native Tools Command Prompt for VS 2022】を起動
3. Python-3.10.17.tgzを解凍
4. 解凍したフォルダの中にある【Tools\msi】フォルダに移動
    ~~~
    cd <Python-3.10.17の解凍フォルダ>\Tools\msi
    ~~~
5. ビルド実行
    ~~~
    .\build.bat -x64 --pack
    ~~~
6. ビルドが成功すると下記の場所にインストーラがあります
    ~~~
    <Python-3.10.17の解凍フォルダ>\PCbuild\amd64\en-us\python-3.10.17.8896-amd64.exe
    ~~~
以上、お疲れさまでした。
【Mac】コマンドでWi-Fiのオン・オフを切り替える方法


## Wi-Fiをオンにする

以下のコマンドを実行するとWi-Fiがオンになります。

```terminal
networksetup -setairportpower Wi-Fi on
```

![screen-shot-293.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/0e415049-e5fb-4092-aa23-dae8c912a982.png)

## Wi-Fiをオフにする

以下のコマンドを実行するとWi-Fiをオフにできます。

```terminal
networksetup -setairportpower Wi-Fi off
```

![screen-shot-294.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/4fd4ebb2-04c1-4ca9-9776-8033ec5f19a4.png)
JSONataでオブジェクトをフラット化する方法

## はじめに

[JSONata](https://docs.jsonata.org/simple) を使って JSON の階層化されたオブジェクトをフラット化する方法についていろいろ模索してみたためその結果をまとめる。

きっかけは、AWS Step Functions でステート間のデータ変換で JSONata が使えるようになり [^1]、早速使ってみたところJSONをフラット化したい場面が出てきて本記事のトピックについて考えることになったことだ。同じ問題に直面した人の参考になれば幸いである。

[^1]: <https://aws.amazon.com/jp/blogs/news/simplifying-developer-experience-with-variables-and-jsonata-in-aws-step-functions/>

## 環境

以下のバージョンで動作確認済み。

- JSONata 2.0.6

動作確認は [JSONata Exerciser](https://try.jsonata.org) を利用。

## クエリ対象のJSON

今回扱うJSONのサンプル。

```json
{
  "target": {
    "a": 0,
    "b": {
      "b1": 1,
      "b2": 2,
      "b3": 3
    },
    "c": {
      "c1": 4,
      "c2": 5
    },
    "d": 6,
    "e": 7
  }
}
```

## クエリ結果として求めるもの

上記のJSONを以下のように変換したいものとする。

```json
{
  "a": 0,
  "b1": 1,
  "b2": 2,
  "b3": 3,
  "c1": 4,
  "c2": 5,
  "d": 6,
  "e": 7
}
```

## クエリ

### その1: 泥臭いやり方

`.` 演算子を使って欲しい項目を取って所望にキーに割り当てるだけ。
項目が少ないならいいが、多かったり動的に項目数が変わったりする場合は厳しい。

```js
{
  "a": target.a,
  "b1": target.b.b1,
  "b2": target.b.b2,
  "b3": target.b.b3,
  "c1": target.c.c1,
  "c2": target.c.c2,
  "d": target.d,
  "e": target.e
}
```

### その2: 組込関数を使って少し楽をするやり方

組込関数 `$merge(array<object>)` を利用して、 `target.b`, `target.c` の中身を一々書かなくて済む。
元々フラットな階層にあった `target.a` などはオブジェクトとして用意してあげる必要があるのが難点。
親階層の項目が少なく、フラット化したい子階層の項目が多い場合にはこれでも十分と思われる。

```js
$merge([
  {"a": target.a},
  target.b,
  target.c,
  {"d": target.d, "e": target.e}
])
```

### その3: よりシンプルに組込関数を活用するやり方

その2で `$merge([...])` の中に入れた各要素を `$map` で動的に作るやり方。
親階層にも項目が多い場合にも耐えられる。

```js
$merge([
  $map($keys(target), function($k) {
    $k in ["b", "c"] ? $lookup(target, $k) : {$k: $lookup(target, $k)}
  })
])
```

#### クエリ分解・解説

##### 1. `$keys(target)`

- `target` オブジェクトのキー（`["a", "b", "c", "d", "e"]`）を配列として取得

##### 2. `$map(array, function)`

- `$map` は配列の各要素に `function` [^2] を適用し、その結果の配列を返すもの
- ここでは `$keys(target)` で得た各キー `$k` に対して処理を行う

[^2]: <https://docs.jsonata.org/higher-order-functions#map>

##### 3. `function($k) { ... }`

- 中身は三項演算子 (`条件式 ? 真の場合の値 : 偽の場合の値`) を使っている
- `$k` が "b" または "c" の場合は、`target.b` や `target.c` の中身（オブジェクト）をそのまま返す
- それ以外のキーは、`{$k: $lookup(target, $k)}` で「キー: 値」の形のオブジェクトにして返す

##### 4. `$merge([...])`

- `$map` で作った配列を `$merge` で1つのオブジェクトにまとめる

ここで登場した `$merge`, `$keys`, `$lookup` について詳しくは公式ドキュメント [^3] を参照されたい。

[^3]: <https://docs.jsonata.org/object-functions>
自作キーボードへの挑戦(Keyball44編)

# 【自作キーボード奮闘記】Keyball44製作途中で学んだ「はんだ付け」超基本と落とし穴

※この記事を書いている現在、私のKeyball44はまだ完成していません。  
LEDの点灯に苦戦している真っ最中ですが、せっかくなので今までの学びを記録としてまとめておきます。

---

## トランジスタのはんだ付けで絶対にやってほしいこと

Keyball44などの自作キーボードでは、SMD部品（表面実装部品）のはんだ付けが避けて通れません。中でも**トランジスタの小ささはミクロン級**。一度落とすと、床のどこかに消えて永遠に見つからなくなります。

### 🔧 対策：マスキングテープは必須！

トランジスタをフィルムから取り出すときは、**マスキングテープを貼り付けながら剥がす**のが断然おすすめです。  
私はこれを怠っていくつかのトランジスタを床に落とし、地獄のような探索時間を過ごしました……。

---

## はんだ付けに必要なツールとその理由

初心者にとって、はんだ付けの品質は使う道具で決まります。

### 🔥 温調機能付きのはんだごてはマスト！

私は以前、goot社の1,000円ほどの安いはんだごてを使っていましたが、思い切って**温度調整機能付きモデルに買い替え**ました。結果、大正解。

- 温度が高すぎると **基板を焼いてしまう危険性**
- 低すぎると **はんだがうまく乗らない**

このようなトラブルを回避するためにも、**温調機能付きはんだごては投資する価値があります**。

### 💨 はんだ吸い取り線は3個買っておこう

はんだ吸い取り線（吸い取り紙）は失敗のリカバリーに必須。消耗が激しいので、**3個くらい常備**しておくと安心です。

---

## はんだ付けの基本テクニックとコツ

- **まず基板側をしっかり温める**
- その後に **はんだを流し込む**

これを意識するだけで、はんだの乗りが全く違います。

### 🧪 フラックスも忘れずに！

最初に**フラックスを基板に塗っておく**のも重要。これがないと、はんだがうまく広がらず、つい熱を当てすぎて基板を焦がしてしまう恐れがあります。

---

## LEDのはんだ付けは地獄！？注意点まとめ

Keyball44にはLEDのオプションもあります。光らせたい人（私含む）にとっては挑戦しがいのある作業ですが、注意点も多いです。

### 💡 LEDは熱と湿気に弱い！

- 開封したら **すぐに実装** が推奨
- **はんだごての温度は270℃が適正**（公式ビルドガイドより）

### ⚠️ はんだブリッジに要注意！

「はんだブリッジ」とは、隣接するランド同士のはんだがつながってしまう状態。これを放置すると**回路がショートして部品が破損する可能性があります**。

> 「とりあえずくっついてればいいや」では、後に泣きを見ます……。

はんだが **富士山型に盛り上がれば良い** という話もありますが、基本は「**必要最小限で確実に接続**」です。

---

## これから自作する人のための推奨アイテムリスト

以下は、私が「最初から持っていればよかった！」と思った道具一覧です。

| アイテム名 | 用途 | 必須度 |
|------------|------|--------|
| 温調はんだごて | 安定した温度ではんだ付け | ★★★★☆（必須） |
| マスキングテープ | 小型部品の飛散防止 | ★★★★☆（必須） |
| フラックス | はんだの乗りを良くする | ★★★★☆（必須） |
| はんだ吸い取り線 | 修正時の必需品 | ★★★★☆（必須） |
| ピンセット | 精密な部品配置に | ★★★☆☆（あると便利） |
| 拡大鏡 or ヘッドルーペ | 小型部品の確認に | ★★★☆☆（あると便利） |
| 部品トレー or ケース | 紛失防止 | ★★★☆☆（あると便利） |

---

## 最後に

自作キーボードの世界は奥深く、挑戦の連続です。私のように**LEDで詰んでる途中**の人も、これから始める人も、はんだ付けの失敗を恐れずに楽しんでみてください！

そして「この記事が誰かのミスを一つでも減らすことができたら嬉しい」です。
Pythonで学ぶ統計入門3

復習用に確率分布の一部を記載

## ▶️ 確率分布ってなに？

確率分布は、「値がどんな分布で出現するか」を描くものです！
たとえば、実験や現実のデータが、正規分布(ガウス分布)になることも多いです。

---

## ▶️ Pythonで実践する確率分布

### 1. 正規分布 (Normal Distribution)

#### 式

$$
P(x) = \frac{1}{\sqrt{2\pi\sigma^2}} e^{-\frac{(x-\mu)^2}{2\sigma^2}}
$$

* \$\mu\$：平均（分布の中心）
* \$\sigma\$：標準偏差（広がり具合）
* \$P(x)\$：xにおける確率密度

#### 数値の意味

* \$\mu\$ が大きい → 分布の中心が右に移動！
* \$\sigma\$ が大きい → データが広くばらつく！

#### Pythonコード

```python
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm

# パラメータ
mu, sigma = 0, 1

# x範囲
x = np.linspace(-5, 5, 100)

# PDF計算
pdf = norm.pdf(x, mu, sigma)

# プロット
plt.plot(x, pdf)
plt.title('Normal Distribution')
plt.xlabel('x')
plt.ylabel('Probability Density')
plt.grid(True)
plt.show()
```

✅ **実践ポイント**: 平均周辺に値が集中する！

---

### 2. ベルヌーイ分布 (Bernoulli Distribution)

#### 式

$$
P(x) = p^x (1-p)^{1-x}, \quad x \in \{0,1\}
$$

* \$p\$：1になる確率（成功確率）
* \$x\$：結果 (0または1)

#### 数値の意味

* \$p\$ が大きい → 1が出やすい！
* \$p\$ が小さい → 0が出やすい！

#### Pythonコード

```python
from scipy.stats import bernoulli

# p = 0.3のベルヌーイ分布
p = 0.3
x = [0, 1]
y = bernoulli.pmf(x, p)

plt.bar(x, y)
plt.title('Bernoulli Distribution')
plt.xlabel('x')
plt.ylabel('Probability')
plt.show()
```

✅ **実践ポイント**: 事象が起こるか起こらないかをモデリング！

---

### 3. ポアソン分布 (Poisson Distribution)

#### 式

$$
P(x;\lambda) = \frac{\lambda^x e^{-\lambda}}{x!}
$$

* \$\lambda\$：単位時間に発生する事象の平均回数
* \$x\$：発生回数

#### 数値の意味

* \$\lambda\$ が大きい → たくさん発生する！
* \$\lambda\$ が小さい → ほとんど発生しない！

#### Pythonコード

```python
from scipy.stats import poisson

# パラメータ
lambda_ = 3
x = np.arange(0, 10)
y = poisson.pmf(x, lambda_)

plt.bar(x, y)
plt.title('Poisson Distribution')
plt.xlabel('Number of Events')
plt.ylabel('Probability')
plt.show()
```

✅ **実践ポイント**: 一定期間のイベント回数を数えるときに使う！
コンテナ(Rails)からホスト(MySQL)への通信

DockerコンテナでRailsアプリを稼働させている。
ホスト(RHEL8)にMySQLをインストールしているので、通信できるようにしたい。
以下設定で疎通可能になる。

* database.ymlのhost
```
host: host.docker.internal
```
* コンテナ起動時に--add-host=host.docker.internal:host-gateway のオプションを指定
```
docker run --add-host=host.docker.internal:host-gateway
```
【Git】パッチファイルの作成と適用方法まとめ【複数ファイル対応・チーム共有にも便利】

Git を使っていると、特定の差分だけを他人に渡したり、別のブランチやプロジェクトに適用したくなる場面があります。
そのときに便利なのが `git diff` + `git apply` **を使ったパッチファイルの活用**です。

---
### 🔧 パッチファイルとは？
Git で生成した **差分ファイル（diff）** を `.patch` や `.diff` として保存したものです。
このファイルを別の環境で適用することで、**変更をそっくりそのまま再現**できます。

## ✅ パッチファイルの作成方法
**1. ステージされていない差分を出力する**
```bash
git diff > feature.patch
```
※ `git add` されていないワークツリー上の変更が含まれます。

**2. ステージ済みの変更を出力する**
```bash
git diff --cached > feature.patch
```
**3. 特定のコミットをパッチにする（1つだけ）**
```bash
git format-patch -1 <コミットハッシュ>
```
## ✅ パッチファイルの適用方法
### 1. `git apply` でパッチを適用する
```bash
git apply feature.patch
```
デフォルトでは **作業ツリーに変更を加えるだけ**で、コミットはされません。

### 2. パッチ適用前にテスト（dry-run）
```bash
git apply --check feature.patch
```
### 3. patch コマンドでも適用可能
```bash
patch -p1 < feature.patch
```
## 🎯 よく使うオプション
| コマンド                   | 説明                     |
| ---------------------- | ---------------------- |
| `git diff --name-only` | 差分ファイル名だけ一覧            |
| `git diff HEAD`        | HEADとの差分               |
| `git apply --reject`   | 適用できなかった部分を `.rej` に保存 |
| `git apply --3way`     | コンフリクト時に3-wayマージを試みる   |

## 💡 チームでの使い方例
- レビュー中の差分だけを送る（本体に影響させたくないとき）
- 本番環境に一部だけ適用したい
- ネットワークが不安定な環境で差分だけ手渡す
- 大規模リポジトリでcloneせず差分だけ受け取る

### ⚠️ 注意点
- `.patch` を適用する先に **同じファイル・行が存在しないとエラー**になります。
- パッチ作成元と適用先でディレクトリ構造が大きく違うと適用に失敗します。

## 📝 まとめ
| 操作          | コマンド                            |
| ----------- | ------------------------------- |
| 差分出力（未ステージ） | `git diff > xxx.patch`          |
| 差分出力（ステージ済） | `git diff --cached > xxx.patch` |
| 適用          | `git apply xxx.patch`           |
| テスト適用       | `git apply --check xxx.patch`   |

パッチは **手軽かつ強力な共有手段**です。チーム開発で柔軟に使いこなしましょう！
sshサーバがインストールできない

## 問題
AlmaLinux 9 で OpenSSH をインストールしようとしたが、インストールが完了しなかった。ネットワーク接続に問題があり、ping google.com が通らなかった。
## 解決策
#### 1. **ネットワーク設定確認**
- `ping 8.8.8.8` は通ったが、`ping google.com` が通らなかった。
-  `/etc/resolv.conf` が `nameserver 192.168.0.1` と設定されていたため、ローカルDNSサーバーが正しく動作していない可能性があった。

#### 2. **DNS設定の修正**
- 一時的に `/etc/resolv.conf` を修正し、Google DNS (`8.8.8.8` と `1.1.1.1`) を設定。
- `nslookup google.com` で正常にIPアドレスが取得でき、DNSの問題が解決。

#### 3. **最終的な確認**
- DNS設定を修正した後、`ping google.com` が正常に動作するようになり、OpenSSHのインストールも問題なく完了

## 結果
無事にOpenSSHをインストールでき、ネットワークの問題も解決しました！


## 今回の学び
#### DNSとは？
DNS（Domain Name System） は、ドメイン名（例：google.com）をIPアドレス（例：142.250.207.14）に変換する仕組み。

名前解決ができないと、インターネット上のサービスにアクセスできない。

#### DNSサーバーの種類
- ローカルDNS：通常はルーターや企業内サーバーが提供。resolv.conf で設定される。
→ 今回は nameserver 192.168.0.1 だったが、正常に動作していなかった。

- パブリックDNS：誰でも利用可能な外部DNS。
    - Google DNS：8.8.8.8, 8.8.4.4
    - Cloudflare DNS：1.1.1.1

#### ネットワークアダプタの違い

- **ブリッジアダプタ**: ゲストOSは物理ネットワーク上に直接存在しているように振る舞う。
ルーターから直接IPアドレスやDNS情報を取得する。
ゲストOSは他のPCと同じネットワークにいるため、他のPCから直接アクセス可能。

→ 通常、ブリッジ接続では、ゲストOSがネットワーク機器（ルーターなど）から直接IPアドレスを取得し、その際にDNS情報も渡されるはずです。しかし、場合によってはゲストOSのDNS設定が正しく取得できないこともあります。

- **NAT**: ゲストOSはホストOSを経由してインターネットにアクセスするため、外部からゲストOSに直接アクセスすることはできません

### xxx. 仮想環境では自動取得のDNS設定がうまくいかないことがある
/etc/resolv.conf は再起動や NetworkManager によって上書きされる可能性がある
恒久的な設定は別途必要
Quantum Visualizer 〜量子状態をリアルタイムで視覚化するWebデモ〜

はじめに

量子コンピュータの動作は従来のコンピュータとは大きく異なり、複数の状態が同時に存在する「重ね合わせ」や「干渉」によって計算を行います。
このプロジェクト Quantum Visualizer は、これらの量子状態を RGBカラー と Bloch球 を用いてリアルタイムで視覚化するWebデモです。

⸻

システム構成

本システムは以下の構造で動作しています：
	•	フロントエンド：Three.js（Vercelでホスティング）
	•	バックエンド：Flask + Qiskit（Herokuでホスティング）
	•	通信：REST APIでリアルタイムに状態取得

⸻

デモサイトへのアクセス

Quantum Visualizer Webデモ

ブラウザ上で実際に量子状態の変化をリアルタイムで観察できます。
	•	初期化 → ショアのアルゴリズム → 測定結果
	•	RGBでの偏りの可視化
	•	Bloch球でのベクトルの回転

技術詳細

1. Qiskitによる量子状態生成

from qiskit import QuantumCircuit, Aer, transpile
qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
sim = Aer.get_backend('statevector_simulator')
result = sim.run(transpile(qc, sim)).result()
print(result.get_statevector())

2. Flaskを使ったREST API

from flask import Flask, jsonify
app = Flask(__name__)

@app.route('/quantum/state', methods=['GET'])
def quantum_state():
    # Qiskitで生成した状態を返却
    state = {"qubit0": [0.707, 0.707], "qubit1": [1.0, 0.0]}
    return jsonify(state)

GitHubリポジトリ

Quantum-Visualizer (GitHub)
ソースコードや構造についてはリポジトリで公開しています。

⸻

今後の展開
	•	Groverのアルゴリズムの可視化
	•	VQEのリアルタイム視覚化
	•	分散量子処理のデモ

⸻

反論と対策

1. 量子状態の可視化に対する疑問

疑問：
「量子状態は観測により崩壊するので、可視化そのものが現実を反映していないのでは？」

対策：
本プロジェクトの可視化は「理論シミュレーション」の結果を視覚化したものであり、実際の観測行為とは異なります。
Qiskitを使ったシミュレーションの内部状態を抽出し、Three.jsで描画しています。
実際の量子ビットの観測は破壊的ですが、シミュレーションでは非破壊的に可視化できます。

用途：
	•	教育用途として量子状態の「重ね合わせ」や「干渉」を視覚的に理解できる
	•	実機を持たない開発者もアルゴリズムの理解が可能

⸻

2. ショアのアルゴリズムの視覚化の限界

疑問：
「ショアのアルゴリズムは大規模な量子ビットが必要なのに、可視化が抽象的では？」

対策：
今回の視覚化の目的は、「量子フーリエ変換（QFT）」や「エンタングルメント」の動きを直感的に掴むことです。
計算の詳細は抽象化していますが、位相推定や干渉の概念は正確に可視化しています。
また、今後の拡張計画としてGroverのアルゴリズムやVQEも視覚化する予定です。

用途：
	•	量子ゲートの動きを理解する教材として有効
	•	アルゴリズムのデバッグやステップごとの理解に役立つ

⸻

3. Webデモの実行環境に関する批判

疑問：
「ブラウザで実行するThree.jsの描画は、実機の量子コンピュータの動作と異なるのでは？」

対策：
Webデモは「理論計算結果の可視化」を目的としており、実機の動作とは独立しています。
Three.jsの表示はQiskitで得られたシミュレーション結果を基にしています。
IBM QのAPIを用いれば、将来的には実機との同期も技術的には可能です。

用途：
	•	教育機関での量子計算の講義デモ
	•	研究者がアルゴリズムの理解を深めるためのサポート

⸻

4. オープンソース公開の安全性

疑問：
「オープンソースで量子計算のシミュレーションを公開することにセキュリティリスクはないのか？」

対策：
公開しているのは「シミュレーションのロジック」と「描画処理」のみであり、実機へのアクセスや秘密鍵は含まれていません。
また、Flask APIは読み取り専用であり、外部からの変更はできない設計です。

用途：
	•	開発者が自由に試せるオープンなプラットフォーム
	•	新しいアイデアやアルゴリズムの可視化が促進される

⸻

5. 実用性への疑問

疑問：
「実際の計算結果を得られないのに、視覚化に意味があるのか？」

対策：
量子ゲートの動きや干渉の仕組みを直感的に理解する手段として非常に有効です。
教育用途だけでなく、量子プログラムのデバッグにも利用できます。
可視化することで、複雑な位相の変化を理解しやすくなります。

用途：
	•	量子プログラムの動作確認
	•	教材として学生が理解しやすい学習体験

⸻

まとめ

このプロジェクトの目的は「理論学習の加速」と「直感的理解の促進」です。
複雑な量子計算を視覚化することで、多くの人が量子の世界に触れる機会を増やすことを目指しています。


おわりに

量子コンピュータの内部状態を視覚的に理解することで、アルゴリズムの本質に迫ることができます。
本プロジェクトがその一助になれば幸いです。

⸻

発案者：Shunji Kagami
作成者：ChatGPT
AIエージェントって何者？ゼロから学ぶ初心者のためのやさしい入門ガイド

## 🎯 この記事の目的

- 「AIエージェントって何？」という初心者の疑問に答えます。
- 難しい数式や専門用語はナシで、身近な例と図解でわかりやすく解説します。
- Pythonを使って、簡単なAIエージェントも一緒に作ってみましょう！

---

## 1. 🧠 AIエージェントとは？

> 人間のように「考えて行動する」プログラム、それがAIエージェントです！

### 🧾 かんたん定義
- **AI** = Artificial Intelligence（人工知能）
- **エージェント** = 「代理人」や「代わりに動いてくれる存在」

### 💬 イメージ図

```
あなた → 質問 🗣️ → 【AIエージェント 🤖】→ 回答 ✨ → あなた
```

---

## 2. 📦 AIエージェントのしくみ

AIエージェントは、3つの機能で動いています：

| 機能 | 役割 |
|------|------|
| 👀 **知覚（Perception）** | 外の世界を「見る」・情報を受け取る |
| 🧠 **判断（Decision）** | 受け取った情報から「どうするか」考える |
| 🦿 **行動（Action）** | 実際に動く・話す・操作する |

### 🧩 図解
```mermaid
flowchart LR
  A[👁️ 入力（例：音声や文章）] --> B[🔍 認識]
  B --> C[🧠 判断]
  C --> D[🦿 行動（返答・操作）]
```

---

## 3. 🏠 どこで使われてるの？

- 📱 **スマホの音声アシスタント（Siri, Google Assistant）**
- 💬 **チャットボット（LINE・企業サイト）**
- 🧹 **ロボット掃除機（障害物を避けて動く）**
- 🎮 **ゲームのNPC（敵キャラや味方の行動）**

---

## 4. 🧪 PythonでAIエージェントを作ってみよう！

初心者向けに「ルールベース」の簡単なチャットエージェントを作ってみましょう。

```python
def ai_agent(user_input):
    if "天気" in user_input:
        return "今日は晴れです！"
    elif "名前" in user_input:
        return "私はAIエージェントです！"
    else:
        return "すみません、よくわかりません。"

while True:
    user = input("あなた: ")
    if user == "終了":
        break
    print("AI:", ai_agent(user))
```

🛠 ポイント：
- 入力にキーワードが含まれていたら、それに応じて返事をする
- 「判断 → 行動」のシンプルなロジックが体験できます

---

## 5. 📝 まとめ

- AIエージェントとは、自律的に「判断して動く」AIのこと
- 音声アシスタントやチャットボットなど、私たちの生活にも広がっている
- Pythonで簡単に体験もできるので、ぜひ触ってみましょう！
Rails学習メモ（初学者向け）①

# Rails学習メモ（初学者向け）

どうも、nus4です。

ProgateのRuby講座の実施が完了しましたので、
今回からRails講座の学習メモを作成していきたいと思います。

これも抑えたほうがいいよ！とかがあれば是非教えて下さい。

## 学習方法

- Progate Ruby on Rails5コース
　（Ruby学習に引き続き、愛用させてもらってます！）

## 📝 目次
- [アプリケーションの作成](#アプリケーションの作成)  
- [サーバーの起動](#サーバーの起動)  
- [コントローラの作成](#コントローラの作成)  
- [コントローラの書き方](#コントローラの書き方)  
- [ルーティングの書き方](#ルーティングの書き方)  
- [CSSの追加](#cssの追加)  
- [画像の追加](#画像の追加)  
- [リンク](#リンク)


## アプリケーションの作成
```ruby
# ターミナルコマンド
rails new アプリ名
```
アプリ名と同名のフォルダが作成され、
その中に必要なフォルダやファイルがあらかた用意されます。

## サーバーの起動
```ruby
# ターミナルコマンド
rails server
```
開発中のアプリをブラウザで表示するためには、
毎度サーバーを起動する必要があります。

サーバー起動後は、ブラウザで「localhost:3000」というURLにアクセスすると表示されるようになります。

## コントローラの作成
```ruby
# ターミナルコマンド
rails generate controller コントローラ名 ビュー名

# 作成されるファイル
# app/
# ├── controllers/
# │   └── コントローラ名_controller.rb      # コントローラファイル
# ├── views/
# │   └── articles/
# │       └── ビュー名.html.erb             # ビューファイル
# ├── helpers/
# │   └── コントローラ名_helper.rb           # ヘルパーモジュール
# test/
# ├── controllers/
# │   └── コントローラ名_controller_test.rb  # コントローラのテスト
# config/
# └── routes.rb                           # ルーティングに追記（自動で追記される）
             
```
コントローラとは、URLリクエストが送られてきた際のアクション（処理やURLの遷移）をまとめたファイルです。

上記コマンドにより、コントローラファイルと属するビューファイル（1ファイル）などを作成することができます。

## コントローラの書き方
```ruby
def アクション名
    処理
end
```
アクション名は基本、ビュー名と同名になります。
アクション内にはデータの受け渡しなどの処理を記載することができます。

## ルーティングの書き方
```ruby
get "URL(localhost:3000以降)" => "コントローラ名#アクション名"
```
ルーティングに定義を行うことで、URLリクエストを受けたときにどのアクションで処理されるかを指示することができます。

リクエスト→ルーティング→コントローラ→アクション先 という流れです。

## CSSの追加
```ruby
# .scssファイルの作成場所
#  app/
#   └── assets/
#    　    └── images/                # 画像フォルダ
#  　      └── javascripts/           # JavaScriptフォルダ
#　        └── stylesheets/           # CSSフォルダ
#               └── コントローラ名.scss 

```
CSSファイルにレイアウト情報を記述してあげることで、対象コントローラに紐づくすべてのビューファイルにレイアウトが適用されるので、便利です。

Progateではコントローラ作成コマンドを打つと、対応する.scssファイルも自動で作成されますが、ローカルで再現するには設定を変更する必要があるようです。

（設定の仕方は下記記事を参考）
[Rails 7で.scssを利用できるようにした](https://qiita.com/naga091/items/715cd48d8d268b307c9b)

もちろん設定をいじらず、手動で追加してもOK

## 画像の追加
```ruby
# 画像ファイルの追加場所
# public/
#  └── ~.jpg, ~png

# publicにある画像ファイルをHTML内で使用する
<img src="/~.png">

# publicにある画像ファイルをCSS内で使用する
background-image:url("/~.jpg")
```
publicフォルダ内に画像を追加しておくと、他のどのビューでも画像名を指定するだけで使用できるため便利です。

## リンク
```html
<!-- HTML内で他アクションへのリンクを追加する -->
 <a href="/アクションのURL">表示したいリンク文字列</a>
```

railsに入ると複数ファイル間の整合性を意識するような内容が増えてきましたね…
大変ですが、引き続き頑張ります！
MarkItDown-MCPをuvでセットアップする

## 3行で
1. MarkItDown-MCPを使おうとしたけど公式手順（Docker）だと上手くいかなかったからuvを使った
2. 参考にした記事　[Model Context Protocol (MCP) サーバを使ってみた・作ってみた](https://zenn.dev/karaage0703/articles/42f7b0655a6af8#markitdown-mcp)
3. ノーマウントでローカルファイルにアクセスできて便利になった！

## MarkItDownとは？
さまざまなファイルをマークダウン形式に変換できるPythonベースのツールです。
対応ファイル形式は以下の通り。
- PDF
- PowerPoint
- Word
- Excel
- Images (EXIF metadata and OCR)
- Audio (EXIF metadata and speech transcription)
- HTML
- Text-based formats (CSV, JSON, XML)
- ZIP files (iterates over contents)
- Youtube URLs
- EPubs

[microsoft/markitdown: Python tool for converting files and office documents to Markdown.](https://github.com/microsoft/markitdown/tree/main)

### MarkItDown-MCPとは？
MarkItDownのMCPサーバーです。

[markitdown/packages/markitdown-mcp at main · microsoft/markitdown](https://github.com/microsoft/markitdown/tree/main/packages/markitdown-mcp)

### 公式手順でつまずいたポイント
Docker imageをビルドすることが推奨されていて、その通り進めたんだけど、claudeでMCPサーバーに接続しようとすると毎回タイムアウトしてしまった。
タイムアウトまでの時間を長くすれば問題なくできたのかも？

## MarkItDown-MCPのインストール方法
これからMarkItDown-MCPを使う方のために、インストール方法を説明します。

1. MarkItDown-MCP 本体をインストール
2. uv をインストール　←ここから公式手順と異なる
3. uv で初回セットアップを実行　
4. Claude Desktop の設定ファイルを編集
### 1. MarkItDown-MCP 本体をインストール
~~~
py -m pip install markitdown-mcp
~~~


### 2. uv をインストール
uv は、一時的な仮想環境を自動で構築し、ツールを実行するための便利なユーティリティです。
~~~
choco install uv -y
~~~
Chocolatey とは？ Windows 用のパッケージマネージャーで、コマンド一つで簡単にアプリケーションをインストールできます。
-y オプション: インストール中に表示される確認メッセージに対して、すべて「Yes」で自動的に進めるためのオプションです。

### 3. uv で初回セットアップを実行
このコマンドを実行すると、uv が内部に小規模な仮想環境を作成し、markitdown-mcp の実行に必要なコンポーネントをダウンロード・準備します。
~~~
uv tool run markitdown-mcp --help
~~~

初回実行時: ネットワーク環境にもよりますが、30秒〜60秒程度かかることがあります。これは、必要なファイル（依存関係）をダウンロードし、キャッシュを生成するためです。
2回目以降: キャッシュが利用されるため、数秒で起動します。

### 4. Claude Desktop の設定ファイルを編集
Claude Desktop の設定ファイルに markitdown-mcp を呼び出すための設定を追記します。

Claude Desktop のメニューから "Open Config File" を選択します。
開かれた claude_desktop_config.json ファイルに、以下の内容を追記します。タイムアウトの延長はしなくてもOK。
~~~
  "mcpServers": {
    "markitdown": {
      "command": "uv",
      "args": ["tool", "run", "markitdown-mcp"]
    }
  },
  "env": {                       
    "MCP_TIMEOUT": "120000"     
  }

  // ... 他の設定が既にある場合は、それらを残してください ...
}
~~~

## 使用方法
Claude Desktop を再起動したら、チャット欄に以下のようなコマンドを入力してみましょう。
~~~
convert_to_markdown("https://example.com")
~~~
ローカルのPDFファイルを指定する場合は以下のように指示してあげればOKです。 (ファイルパスはご自身の環境に合わせて変更してください)
~~~
convert_to_markdown("file:///C:/Users/ユーザー名/Documents/test.pdf")
~~~
数秒待って、Markdown形式のテキストが返ってくれば成功です！
Claudeのキャンバスからマークダウン形式でダウンロードできるので、Claudeが生成したmdファイルをObsidianのVaultに直接保存することもできます。


## 参考記事
[【MCP】Claude×MarkItDownでpptxファイルをマークダウン形式に要約する。 #AI - Qiita](https://qiita.com/setowatson/items/e80b60348a3077b06ca5)
[【Claude Desktop/Docker】Microsoft MarkItDown-MCPサーバーを触ってみる](https://zenn.dev/tanakashinichi/articles/b181c03dc33dcb)
[Model Context Protocol (MCP) サーバを使ってみた・作ってみた](https://zenn.dev/karaage0703/articles/42f7b0655a6af8#markitdown-mcp)
テックブログ、書けない俺はおかしいのか？

今、俺は**仕事でテックブログを書くことを業務目標にされているエンジニア**だ。  
評価項目にもなっているし、記事を書かないと「成長してない」と見なされる。

でも正直に言う。  
**書きたくない。やりたくない。やる意味が分からない。**

## 書くモチベーションはほぼゼロ

- 技術を深掘りすることに興味がない  
- 誰に向けて書いてるか分からない  
- 採用やブランディングに効いてる実感もない  
- 業務で手一杯なのに、さらに「文章力」まで求められる理不尽さ

それでも、  
「文化だから」「みんなやってるから」「目標達成のため」  
そんな理由で、**“当然のように”書かされる。**

## 書いてない＝評価が下がる？それって本質からズレてないか

業務評価に組み込まれている以上、無視するわけにはいかない。  
だから、渋々記事を書く。内容のクオリティより、「出したこと」の方が大事になる。

**つまり「魂のこもったアウトプット」ではなく、「消化試合の義務作業」になってしまってる。**

## 周りは楽しそうにやってる。それがまたキツい

SNSを見れば、「記事書きました！」の報告が日々流れてくる。  
社内の仲間も、当たり前のように記事を出す。

**自分だけが書けない。自分だけがモチベが湧かない。**  
そんなふうに思ってしまう。

だけど…**本当にみんな、心から書いてるのか？**

## この空気が、AIによる“薄い記事の量産”を生んでいるんじゃないか？

最近よく見るようになった、**誰の役に立ってるのか分からないAI生成記事**。  
似たようなタイトル、似たような構成、内容は浅く、結論もふわっとしてる。

あれって、  
**「義務だから」「評価されるから」「記事を書かないと怒られるから」**  
そんな圧力の中で、「やる気ゼロだけど体裁だけ整えた」結果なんじゃないか？

書きたくない人が、本音を言えずにAIでノルマをこなす。  
それって、**健全な文化とは言えないと思う。**

## 声を上げづらい空気が、不健全さを加速させている

「書けない」「書きたくない」  
そう言った瞬間に「やる気がない」「成長意欲がない」とレッテルを貼られる。  
だから黙る。  
そしてまた、“中身のない記事”が量産されていく。

もう、誰かが言わなきゃいけないと思った。

## 俺は書けない。でも、それで評価を落とすのは違う

- 文章を書くのが苦手なエンジニアもいる  
- 技術への熱量のベクトルが違うだけの人もいる  
- 実装・設計・コミュニケーションで力を発揮するタイプもいる  

**アウトプットの手段をひとつに決めつけて、評価の軸にするべきじゃない。**

## 結論：書かないことも、選択肢のひとつであってほしい

- 書ける人は素晴らしい。  
- でも、書けない人もいる。  
- そして、そのことを**「甘え」や「怠慢」と決めつける風潮はおかしい。**

---

**ちなみにこの記事も、AIと一緒に書きました。**

「書けない」気持ちをなんとか言語化するために、AIの力を借りました。  
これは俺なりの、ギリギリのアウトプットです。

この文章が、  
**「書けないけど言えなかった」誰かの代弁になれたら、嬉しい。**