OmniAICreator/Qiita-1.07M huggingface dataset:
【Lighthouse】どの指標を優先的にパフォーマンス改善するか

## 0. はじめに

サイトパフォーマンスのチューニングを行う際、まずは[Lighthouse](https://developer.chrome.com/docs/lighthouse/overview?hl=ja)や[PageSpeed Insights](https://pagespeed.web.dev/)で計測して現状を把握することが多いと思います。

ただ、計測結果を確認すると「どの指標もスコアが悪くて、どれから改善すればいいか分からない」や「どの指標を改善するとスコアへの効果が大きいんだろう」といったようにどの指標を改善すればいいか分からずに、とりあえず色んな記事で書かれているベストプラクティス的な施策を実装してみたり、脳死で「FCPとかLCPが重要そうだし、そこから改善策を考えよっと」で対応を進めている人も少なくないのではないでしょうか？

そういったパフォーマンスチューニングやりたいけど、計測後どこから手をつければいいか分からない人たちへの参考になれば良いなと思います。

## 1. パフォーマンススコアの「重み付け」

https://developer.chrome.com/docs/lighthouse/performance/performance-scoring?hl=ja#weightings

実は、Lighthouse のパフォーマンススコアは、単純な合計点ではなく、各指標に「重み付け」をかけた加重平均で算出されています。**指標の重み付けが大きいほど、パフォーマンススコア全体に対する影響も大きく**なります。この重み付けを知ることで、より効率的な改善アプローチが見えてきます。

## 2. Lighthouse 10 の指標と重み付け

Lighthouse 10 における主要なパフォーマンス指標とその重み付けは以下の通りです:


指標 | 重み
| --- | --- |
| FCP (First Contentful Paint) | 10% |
| SI (Speed Index) | 10% |
| LCP (Largest Contentful Paint) | 25% |
| TBT (Total Blocking Time) | 30% |
| CLS (Cumulative Layout Shift) | 25%

:::note info
重み付けの重量は、パフォーマンスに対するユーザーの認識に最も大きな影響を与えるものを把握するために、Lighthouse チームが定期的な調査とフィードバック収集を行いながら選択しており、**時間とともに変化する**可能性があります。
:::

## 3. 効率的なパフォーマンスチューニングのためにどの指標を優先すべきか？

パフォーマンスチューニングを行う際に、「どの指標から改善すべきか」を判断するために、この重み付けの情報が非常に役立ちます。

効率的にスコアを改善するためには、**「重み付けの重量が重い」** かつ **「現状のスコアが悪い指標」** を選択すると良いでしょう。

例えば、Lighthouse 10 では **TBT (30%)、LCP (25%)、CLS (25%)** の重み付けが高くなっています。もしこれらの指標のスコアが低い場合、改善による全体スコアへの影響が大きくなる可能性が高いです。

逆に、FCP の重み付けは 10% と比較的低いです。もし FCP のスコアが悪かったとしても、これに多くの工数をかけて改善しても、重み付けが低いため全体スコアへの影響は限定的になる可能性があります。もちろん、最終的には全ての指標を改善するのが理想ですが、実際の開発現場では工数や時間が限られていることが多いため、この重み付けを考慮した優先順位付けが効果的です。

## 4. パフォーマンススコア計算ツール

[Lighthouse スコア計算ツール](https://googlechrome.github.io/lighthouse/scorecalc/)を使用すると、チューニングをする前にそれぞれの指標がどのくらい改善すれば目標のパフォーマンススコアに達するかをシミュレーションすることができます。

例えば、以下のようなパフォーマンスのサイトがあったとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1097781/af643177-f5f6-4d9d-844f-85318bbe5cad.png)

仮にFCPが合格ライン(1,000ms）に達してもパフォーマンススコアは「46」までしか伸びないことがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1097781/fb2db177-af4d-4154-b260-7776500c4f80.png)

LCPをFCPと同じ時間（3,200ms）にするとスコアが「56」まで伸びます。
この場合は、**「重み付けの重量が重い」** かつ **「現状のスコアが悪い指標」** の「LCP」か「TBT」を改善する指標にすると良いと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1097781/a03dc9dd-d72c-4673-9fa0-460e7333d4bf.png)

## 5. まとめ

Lighthouse のパフォーマンススコアは、各指標の重み付けによって大きく影響されます。
この重み付けを理解し、特に「重み付けが高く」「現状のスコアが低い」指標から優先的に改善に取り組むことで、限られたリソースの中で効率的にウェブサイトのパフォーマンスを向上させ、より良いユーザー体験を提供することに繋がるでしょう。

パフォーマンスチューニングの判断材料として、ぜひ Lighthouse の重み付け情報を活用してみてください。
rails g migrationでテーブルにカラム追加時に失敗したときの対処法

スクール受講開始から2週目に突入しました。
Ruby on Railsの基礎的なところを学んでいる段階です。

ターミナルから以下のコマンドで、データベースのテーブルにカラムを追加する方法を学び、自分のテスト環境で試した際に、タイプミスがありエラーが発生してしまいました。


```ruby
# 既存のDBテーブルにカラム追加
$ rails g migration Addカラム名To追加先テーブル名 追加するカラム名:型
```

```ruby
# 実際に実行したコマンド(誤り）
$ rails g migration AddNicknametoUsers nickname:string
```
```ruby
# 正しくはこちら
$ rails g migration AddNicknameToUsers nickname:string
```

テーブルのカラムを確認すると、当然追加されていませんが、エラーも特に出ていなかったので、最初は原因がわからず生成されたmigrationファイルを確認し、Toがtoになってしまっていることが判明。
rails db:rollbackでロールバックさせ、ファイルの中身を修正し、再度rails db:migrateしてみましたが、今度は以下のエラーが発生してしまう。
```
bin/rails aborted!
NameError: uninitialized constant AddNicknametoUsers (NameError)

      Object.const_get(camel_cased_word)
            ^^^^^^^^^^
Did you mean?  AddNicknameToUsers


Caused by:
NameError: uninitialized constant AddNicknametoUsers (NameError)

      Object.const_get(camel_cased_word)
            ^^^^^^^^^^
Did you mean?  AddNicknameToUsers

Tasks: TOP => db:migrate
(See full trace by running task with --trace)

```

修正したはずが・・・と思い、再度眺めていたところ、ファイル名が'20250514090656_add_nicknameto_users.rb'となっているのに気が付き、こちらも修正してみました。
残念ながらエラーは解消されませんでした。

次に試したのはロールバックして、該当のmigrationファイル削除して、やり直せばいいのでは？と思い立ち、やってみました。

```
$ rails db:migrate:status

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20250513091538  Create tweets
   up     20250514080656  Devise create users
  down    20250514090656  Add nickname to users

$ rm db/migrate/20250514090656_add_nickname_to_users.rb 
$ rails db:migrate:status

database: pictweet_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20250513091538  Create tweets
   up     20250514080656  Devise create users
```
無事に消えました！

そして再度今度はタイプミスしないように気をつけて実行
```
$ rails g migration AddNicknameToUsers nickname:string
```

サーバーを立ち上げ、テーブルの中身にnicknameが無事追加されていることが確認できました！

参考にした記事：
[【Rails】特定のマイグレーションファイルをロールバックして削除する方法　](https://qiita.com/ksmj/items/a7b372212be77d47ae93)
【サクラエディタ】よく使う機能

## はじめに
業務でサクラエディタを使用しているのですが、業務仲間とのアイスブレイクでサクラエディタのショートカットの話になり、いくつか出て来たので一覧にまとめておきます。

## ショートカット
### 矩形選択
`Alt + 範囲選択`

### 移動
`Alt + P`
前の移動履歴へ移動

`Alt + N`
次の移動履歴へ移動

`Ctrl + A`
全選択

`Ctrl + J`
行番号を指定して移動

`Ctrl + F`
検索ウィンドウを開く

`Ctrl + R`
置換ウィンドウを開く

`Ctrl + G`
Grepウィンドウを開く

### トリミング
`Alt + L`
選択範囲の左側(L)の空白を削除

`Alt + R`
選択範囲の右側(R)の空白を削除

### ソート
`Alt + A`
選択範囲を昇順に整列

### マージ
`Alt + M`
選択範囲の重複行を削除

## マクロ
### ハイライト

```highlight.mac
S_SelectWord(0);
S_SearchClearMark(0);
```
- 参考
    - サクラエディタで選択した文字を自動でマークを付ける方法 #マクロ - Qiita https://qiita.com/yasushi-jp/items/931e833cf84c1142092e
Copilotの再利用可能なプロンプト機能を試した雑記録

## はじめに

mainブランチでブランチを切らずに作業していた時にブランチ作成→コミットまでをAIで良い感じに出来そうだなと思って試した雑記事です🙇‍♂️

VSCodeのバージョン1.100で変わった再利用可能なプロンプト機能（機能名間違っているかも）を使いました

- https://code.visualstudio.com/docs/copilot/copilot-customization#_prompt-file-structure

## 再利用可能なプロンプト機能とは

少し前からVSCodeのGitHub Copilotで追加されていた機能です

元々はワークスペースの `.github/prompts` ディレクトリに `*.prompt.md` ファイルを置くと、Copilot Chatのコンテキストとして選択できるみたいな機能でした

（プロンプトファイルを置く場所は chat.promptFilesLocations で指定可能）

それがVSCodeのバージョン1.100から大幅に変わりました

実行可能なツールやモードを指定できたり、添付画像のような実行ボタンが追加されたりなど

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697143/58bb7adb-a20d-40c8-8c47-09eab9ed2ab2.png)


## 実際に試した例

以下のように使用するモードや実行可能なツール、やらせたいタスクを記述します

ちなみに⇧⌘P → Chat: New Prompt File を実行するとファイルを作るのが楽になります

- Git MCPを使っています
    - https://github.com/modelcontextprotocol/servers/tree/main/src/git
    - 今回のケースでは使わないであろうツール（git_reset、git_init）は省いています
- （プロンプトは雰囲気）

```markdown
---
mode: 'agent'
tools: ['git_status', 'git_diff_unstaged', 'git_diff_staged', 'git_diff', 'git_commit', 'git_add', 'git_log', 'git_create_branch', 'git_checkout', 'git_show']
description: 'ブランチを作成し、チェックアウトし、差分をコミットします。'
---

あなたはGitの扱いに長けたエンジニアです。以下のタスクを実行してください。指示を仰がずに、すべてのステップを自動的に実行してください。

## タスク
1. 現在の差分に基づいてブランチ名を提案し、そのブランチを作成します。
2. 作成したブランチにチェックアウトします。
3. 現在の差分を `git add` します。
4. 現在の差分に基づいて、日本語のコミットメッセージを提案し、`git commit` します。
```

▶️ボタンをクリックしたらCopilotが動いてチャットに反映されていきます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697143/9119604a-42df-44cb-8e74-2b2771de3781.png)


## 感想

簡単な例ですが思い通りに行って嬉しかったのと、しっかり作ればかなり便利に使えそうだなと思いました！

PATをあまり発行したくなくて、GitHub MCPは使わなかったですが、一緒に使えば PR作成までできて便利だろうなと思います

少しでも参考になれば幸いです！
過去のコードレビューから自分用のレビュアーを作る

## はじめに

まず、VSCodeのGitHub Copilotではレビューをしてもらえる機能があります

- https://code.visualstudio.com/docs/copilot/copilot-smart-actions#_review-code

こういうやつ↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697143/41ee8fad-1ff3-4692-b3ce-fc8fcfa79110.png)


今回は、過去のコードレビューからカスタム指示（custom instructions）用のファイルを作成し、自分用のレビュアーを作ってみました

- https://code.visualstudio.com/docs/copilot/copilot-customization#_specify-custom-instructions-in-settings

## レビューコメントの収集

以下のようなシェルスクリプトを作成して、結果をファイルに出力します

例）`hoge.sh > hoge.txt`

- レビューコメントを詳細に取得する `gh` のコマンドが見つからなかったので、`gh api` を使用（もしかしたら現在はあるかも）
- org、repo、user、limitは個人に合わせて指定（一応、limitは1000とかでも行けました）
- 自分のコメントはノイズだったので除外するようにしてます

```bash
#!/bin/bash

org='<組織名>'
repo='<リポジトリ名>'
user='<ユーザー名>'
limit=<取得件数>

pr_numbers=$(gh pr list \
    --repo $org/$repo \
    --author $user \
    --state 'all' \
    --json number \
    --jq '.[].number' \
    --limit $limit)

for number in $pr_numbers; do
    gh api \
        -H 'Accept: application/vnd.github+json' \
        -H 'X-GitHub-Api-Version: 2022-11-28' \
        /repos/$org/$repo/pulls/$number/comments \
        --jq "
            .[]
            | select(.user.login != \"${user}\")
            | \"### [\(.id)]\n\n\`\`\`\n\(.diff_hunk)\n\`\`\`\n\n\(.body)\n\n\"
        "
    done
```

## ChatGPTに投げる

作成したファイルを添付して、CopilotやChatGPTやGeminiなどに雑に投げます

- プロンプトは雰囲気でそれっぽいのを書いてます

```markdown
あなたは優秀なバックエンドエンジニアです。参考情報を元にタスクに取り組んでください

### 参考情報
- 添付したファイルは過去のコードレビューのコメント
- 以下はGitHub Copilotのカスタム指示についてのページ
  - https://docs.github.com/ja/copilot/customizing-copilot/adding-repository-custom-instructions-for-github-copilot

### タスク
1. 添付ファイルを元にレビューの意図を理解する
2. レビュー内容を汎用化して整理する
3. レビュー項目としてまとめる

### フォーマット
- markdown形式にすること
- LLMが理解しやすい形式にすること
  - GitHub Copilotのカスタム指示（レビュー用）で利用する
```

ChatGPTに投げた例です。

ファイル添付しても Deep Research が使えることをこの時初めて知りました🧐

添付したファイルだけをひたすら読みまくっていて新鮮、1つの資料をしっかりと見てくれるのは色々と使い道ありそう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697143/692b1e4e-5e59-40d1-8a1d-fa4238a7d788.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697143/c88f4436-79a8-44c9-8047-6993ecb5c07a.png)


## カスタム指示の設定

- 返ってきた内容を整理して `.github/.copilot-review-instructions.md` に追加
- VSCode の `settings.json` に `github.copilot.chat.reviewSelection.instructions` の部分を追加で完了

```json
{
	...
  "github.copilot.chat.reviewSelection.instructions": [
    {
      "file": ".copilot-review-instructions.md"
    }
  ]
}
```

## おわりに

どこまでちゃんとレビューしてくれるかはこれからのところです！

コンテキスト莫大になったり、フィルタリング結構必要になりますが、リポジトリ全体で作ってみるのも良さそうです

以上雑記事でした🙇‍♂️
少しでも参考になれば幸いです！
SQLチューニングの基本：Nested Loops結合とインデックス活用のポイント

# SQLチューニングの基本：Nested Loops結合とインデックス活用のポイント

## はじめに

SQLの結合処理において代表的なアルゴリズムの一つが*Nested Loops です。特に結合キーにインデックスがある場合、Nested Loopsは非常に効率的な手法となり得ます。

本記事では、Nested Loopsの動作原理と、パフォーマンスを最適化するためのインデックスの使い方について解説します。

---

## Nested Loopsの基本動作

Nested Loopsは、結合対象の片方（外部テーブル）を1行ずつ処理し、対応するもう一方のテーブル（内部テーブル）に対してループでアクセスする手法です。

このとき、この内部テーブルの該当行にアクセスする方法として、インデックスが存在するかどうかが非常に重要なポイントになります。

---

## インデックスの有無による違い

以下に、インデックスの有無による実行計画の違いをOracle/PostgreSQLの例で示します。

### 内部表にインデックスがある場合（Oracle）

```
NESTED LOOPS
  TABLE ACCESS FULL (Table A)
  INDEX RANGE SCAN (Table B)
```

この場合、インデックスを使ってTable Bに効率的にアクセスしています。

### 内部表にインデックスがない場合（PostgreSQL）

```
NESTED LOOPS
  SEQ SCAN (Table B)
```

内部表にインデックスがないため、Table B全体をシーケンシャルスキャンする必要があり、パフォーマンスに悪影響が出ます。

---

## 内部表をスキップできるかが鍵

内部表にインデックスがあると、ループ内でのアクセス行数をスキップできる可能性があります。以下の図を見てください：

- インデックスが効いていて1行にアクセス → スキップが効く
- インデックスがあっても複数行にヒット
- → ある程度スキャンが必要
- インデックスがない → 全件スキャン

つまり、「内部表を小さくしよう」よりも「インデックスでスキップできるようにしよう」という発想の方が現実的です。

---

## SQLチューニングの鉄則：組み合わせの設計

チューニングの基本は：

「外部表が小さい」×「内部表の結合キーにインデックスがある」

この組み合わせは、Nested Loopsのパフォーマンスを最大化する「黄金パターン」です。
よく使われる定番でありながら、非常に強力です。

---

## まとめ

- Nested Loopsはインデックスの有無でパフォーマンスが大きく変わる
- 内部表が大きくても、インデックスによってスキップ可能なら効果あり
- テーブル設計時から「どのテーブルを外部表／内部表にするか」「どこにインデックスを張るか」を意識することが重要

SQLのパフォーマンスに悩んだら、「結合順序」と「インデックスの有無」をまず確認してみましょう。

---


# 参考
[SQL実践入門──高速でわかりやすいクエリの書き方 (WEB+DB PRESS plus)](https://www.amazon.co.jp/SQL%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80%E2%94%80%E2%94%80%E9%AB%98%E9%80%9F%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8A%E3%82%84%E3%81%99%E3%81%84%E3%82%AF%E3%82%A8%E3%83%AA%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9-WEB-DB-
#0134（2025/05/14）Python 組み込み関数 `chr()` と `ord()` 

## Python 組み込み関数 `chr()` と `ord()` 

### 🔡 `chr()`：整数（Unicodeコード）→ 文字

* **構文**：`chr(i)`
* **引数**：整数（Unicodeコードポイント）
* **戻り値**：そのコードに対応する文字（`str`型）
* **範囲**：0〜1,114,111（0x10FFFF）
* **例**：

  ```python
  chr(97)   # 'a'
  chr(65)   # 'A'
  chr(124)  # '|'
  ```

### 🔢 `ord()`：文字 → 整数（Unicodeコード）

* **構文**：`ord(c)`
* **引数**：1文字の文字列（`str`型）
* **戻り値**：その文字のUnicodeコードポイント（`int`型）
* **例**：

  ```python
  ord('a')  # 97
  ord('A')  # 65
  ord('|')  # 124
  ord('あ') # 12354（U+3042）
  ```

### 🧠 ASCII との関係

* ASCII は Unicode の最初の 128 文字（0〜127）を含む。
* 例えば：

  * `ord('a')` は ASCII コード 97
  * `chr(97)` は 'a'

### 🔄 他のエンコーディング（UTF-8やShift\_JISなど）について

* `chr()` や `ord()` は **Unicode専用** であり、UTF-8やShift\_JISなどの**バイトエンコーディングとは直接関係ありません**。
* 他のエンコーディングを扱いたい場合は、次のように `encode()` / `decode()` を使用します：

#### 🔸 文字列 → バイト列

```python
'あ'.encode('utf-8')       # b'\xe3\x81\x82'
'あ'.encode('shift_jis')   # b'\x82\xa0'
```

#### 🔸 バイト列 → 文字列

```python
b'\xe3\x81\x82'.decode('utf-8')      # 'あ'
b'\x82\xa0'.decode('shift_jis')      # 'あ'
```

#### デフォルトエンコーディングの確認

```python
import sys
print(sys.getdefaultencoding())  # 通常は 'utf-8'
```

* Python 3 では `str` 型は常に Unicode を前提としています。

### 🎯 よくある用途

#### 1. アルファベット列を生成

```python
for i in range(26):
    print(chr(ord('a') + i), end=' ')  # a b c ... z
```

#### 2. シーザー暗号（Caesar Cipher）などの暗号処理

* アルファベット → 数値 → シフト → 文字に戻す、という処理で使う

#### 3. 英字ラベルの自動生成

```python
label = chr(ord('A') + 3)  # 'D'
```

### ✅ まとめ表

| 関数      | 説明                | 例               |
| ------- | ----------------- | --------------- |
| `ord()` | 文字 → Unicode（int） | `ord('a')` → 97 |
| `chr()` | Unicode（int） → 文字 | `chr(97)` → 'a' |

Pythonで文字と数値を相互に変換する際には、`chr()`と`ord()`の活用が非常に便利です。バイト列や他の文字コードを扱いたい場合は `encode()` / `decode()` を使い分けましょう。
🚀 DockerでRuby on Rails開発環境を構築する（PostgreSQL対応

# 📁 構成ファイルの作成

Railsアプリケーションの開発環境をDockerで簡単に構築する方法を紹介します。
今回は Rails 7.2 + PostgreSQL + Docker Compose を使った環境を構築します。

まず、以下のコマンドでファイルを作成する。
```
touch Dockerfile docker-compose.yml Gemfile Gemfile.lock entrypoint.sh
```
ファイルの中身を以下のようにする。
```:dockerfile
FROM ruby:3.3

RUN apt-get update -qq && \
    apt-get install -y --no-install-recommends \
    build-essential \
    libpq-dev \
    libyaml-dev \
    nodejs \
    yarn \
    git && \
    rm -rf /var/lib/apt/lists/*

WORKDIR /myapp

COPY Gemfile Gemfile.lock ./
RUN gem install bundler
RUN bundle install && \
    rm -rf ~/.bundle/ /usr/local/bundle/cache /usr/local/bundle/ruby/*/bundler/gems/*/.git

COPY . .

# entrypoint.shの追加
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]

EXPOSE 3000

CMD ["rails", "server", "-b", "0.0.0.0"]
```

```:docker-compose.yml
version: '3.9'

services:
  db:
    image: postgres:15
    volumes:
      - postgres-data:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: password
      POSTGRES_USER: postgres
    ports:
      - "5432:5432"

  web:
    build: .
    command: rails server -b 0.0.0.0
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    environment:
      RAILS_ENV: development
      DATABASE_HOST: db
      DATABASE_USERNAME: postgres
      DATABASE_PASSWORD: password
    depends_on:
      - db

volumes:
  postgres-data:
```

```:entrypoint.sh
#!/bin/bash
set -e

rm -f tmp/pids/server.pid

exec "$@"
```

```:Gemfile
source 'https://rubygems.org'
gem 'rails', '~> 7.2'
```
これらのファイルを作成して以下のコマンドを入力する。
```
docker compose run --rm web rails new . --database=postgresql
```
```
docker compose run --rm web bundle install
```
そして、DB設計をする。
```:database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5
  host: db
  username: postgres
  password: password
  port: 5432

development:
  <<: *default
  database: myapp_development

test:
  <<: *default
  database: myapp_test
```
そして、以下のコマンドでビルドして実行する。
```
docker-compose build
docker-compose up
```
そして、以下のコマンドでデータベースを作成する。
```
docker compose exec web rails db:create
docker compose exec web rails db:migrate
```
そして、以下のurlでアクセスする。
```
localhost:3000
```
Linucレベル１勉強メモ　＃３５

＃ 第三章　GNUとUnixのコマンド

練習問題3.10
bash上で以下のコマンドを順に実行しました。

＄ PATH=/opt/bin:＄PATH
＄ echo ＄PATH
/opt/bin:/usr/local/bin:/usr/bin:/bin

直後に、これまでに実行した、「＄PATH」という文字列を含んだコマンド履歴を全て表示しようと、次のコマンドを実行しました。

＄ history | grep ＄PATH

少なくとも直前の２行が表示されることを期待しましたが、結果は何も表示されませんでした。このことに関する説明として適切と考えられるものを選択してください。

A. bashはログアウト時に履歴が記録されるので、直前のコマンドはhistoryコマンドで出力されない

B. デフォルトでは.bash_historyファイルが用意されていないので、あらかじめ作成しておく必要がある

C.historyコマンドは引数に出力行数を指定する必要がある 

D. grepコマンドではなくfgrepコマンドを使う必要がある

E. シェルによって展開されないよう'＄PATH'のように引用符で囲む必要がある

（解答）E


（解説）
シェル上では、＄記号に続けて文字列があれば、変数として展開されます。つまり変数の内容に置き換えられてからコマンドが実行されます。そのため、設問の最後のコマンドでは、次のように引数を指定したのと同じことになります。

＄ history | grep/opt/bin:/usr/local/bin:/usr/bin:/bin

「＄PATH」という文字列をコマンド履歴から検索したい場合は、シェルによって変数が展開されないよう、引用符で囲むか、「\」でエスケープする必要があります。次のいずれのコマンドでも構いません。

＄ history | grep '＄PATH'
＄ history | grep \＄PATH

したがって、正解は選択肢Eです。historyコマンドは直前に実行したコマンド履歴も表示できますので、選択しAは不正解です。履歴ファイル.bash_historyがなくてもコマンド履歴機能は利用できますので、選択肢Bは不正解です。historyコマンドは引数に出力行数を指定する必要はありませんので、選択肢Cは不正解です。fgrepコマンドを使っても引数の変数は展開されますので、選択肢Dは不正解です。

fgrepコマンド
grepコマンドの一種で、検索パターンに正規表現を使わない場合に使用する例えば「.*」みたいに正規表現でない文字列を使用する場合に用います。
NeRFstudioのinstallに関する備忘録

# installに関する注意点

環境
win11 cuda11.8 pytorch2.1.2

### tiny-cuda-nnに関する注意事項
cuda11.8のコンパイラが対応しているアーキテクチャに設定
デフォルトだと89
```shell:cmd
set TCNN_CUDA_ARCHITECTURES = 86
```

x64 Native Tool Command Prompt for VS 2019を使う
for 2022だとバージョン関係のエラーが出る

### pip install -e .に関する注意事項
RUSTをinstallしておく
gsplatはバージョンを下げておく　0.1.1くらい
実行途中のプロセスがどれがどれだかわからない時

※メモです

現在実行中のプロセスの一覧を表示した際に、同一ファイル名だけど中身を変えてしまった時どう見分けるかというと
```
$ ps x | grep python
1225995 pts/12   S+     0:00 grep --color=auto python
3262535 pts/27   Rl   28426:13 python gemma3/pks_benchmark_rev2.py
3272838 ?        Rl   27801:18 python gemma3/pks_benchmark_rev2.py
```

下記のコマンドを行うと
```
$ ls -l /proc/3262535(プロセス番号)/fd
```

下記のようにファイルがどこに何を書き込んだのかとかのログが出てくるので、もし出力をoutput.logとかに格納していたら、そこに書き込んでる履歴があるかなどを見れば識別可能！
```
l-wx------. 1 user users 64 May 14 03:52 25 -> /home/yi10/.vscode-server/data/logs/20250512T201416/remoteagent.log
lrwx------. 1 user users 64 May 14 03:52 26 -> /dev/nvidia2
lrwx------. 1 user users 64 May 14 03:52 27 -> /dev/nvidia3
lrwx------. 1 user users 64 May 14 00:04 28 -> /dev/nvidia3
lrwx------. 1 user users 64 May 14 00:04 29 -> /dev/nvidia4
```
行列積（数学）の計算、行列の積（画像処理）の計算

# はじめに
目新しい知見はありません。

数学における行列積がある一方で、
画像を行列として扱う環境（OpenCV）が存在する。

後者の積は、ピクセルごとの単純な積となっている。
無意識的に別々のものとして理解していたけど、翌々かんがえると、行列を2通りに使うことが、変な気がしたので、行列積を可視化しました。

# 行列
CGでは４ｘ４行列がよく使われます。
AIの分野では、かなり大きな行列が使われます。（pythonのnumpy）
（モノクロ）画像はそのまま行列としても扱うことができます。（OpenCVのcv::Mat）


| 環境 | 演算(子) | 演算内容 |
|:-:|:-:|:-:|
|Python OpenCV| *  |要素ごとの積|
|Python OpenCV|m.dot(n)|行列積|
|C++ OpenCV Mat|m.mul(n)|要素ごとの積|
|C++ OpenCV Mat|*|行列積|
|Processing OpenCV|m.mul(n)|要素ごとの積|
|Processing OpenCV|m.matMul(n)|行列積|
|Processing PMatrix|m.apply(n)|行列積|

OpenCVにおいて、行列同士の積は各ピクセルの値同士の掛け算になります。
Java(Processing)は演算子のオーバーライドができません。

利用価値がないので、画像（2次元配列）を画像と行列の双方としてみなす環境はないみたいです。

# 行列積の計算例と可視化
```java:Processing
PMatrix3D mat1 = new PMatrix3D();
PMatrix3D mat2 = new PMatrix3D();
mat1.set( 1,-1,-1, 1,
         -1, 1, 1,-1,
         -1, 1, 1,-1,
          1,-1,-1, 1);
mat2.set( 1, 1, 1, 1,
          0, 0, 1, 0,
          0, 1, 0, 0,
          1, 1, 1, 1);
mat1.apply(mat2);
mat1.print();
```
```:小数点以下削除
 2  1  1  2
-2 -1 -1 -2
-2 -1 -1 -2
 2  1  1  2
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/48066d3b-4f1c-4583-806b-00b568e3c8bd.png)



# 90度回転行列と可視化
```java:Processing
PMatrix3D mat1 = new PMatrix3D();
PMatrix3D mat2 = new PMatrix3D();
mat1.set( 1,-1,-1, 1,
         -1, 1, 1,-1,
         -1, 1, 1,-1,
          1,-1,-1, 1);
mat2.set( 0,-1, 0, 0,
          1, 0, 0, 0,
          0, 0, 1, 0,
          0, 0, 0, 1);
mat1.apply(mat2);
mat1.print();
```

```
-1.0000 -1.0000 -1.0000  1.0000
 1.0000  1.0000  1.0000 -1.0000
 1.0000  1.0000  1.0000 -1.0000
-1.0000 -1.0000 -1.0000  1.0000
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/cc86c097-e8bb-4980-bf7b-639af1fa00a5.png)


# OpenCVで行列の積
以下の結果から、
グレー(127)×白(255) = 32385 -> 飽和して255
白(255)×グレー(127) = 32385 -> 飽和して255
となって、グレーにはならない。

| 元画像 | 積算する画像 |結果画像|
|:-:|:-:|:-:|
|![triangle.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/1ae159fa-7830-431b-83ef-1ba9792efa7f.png)|![check.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/24531752-0f6e-478e-bcb7-613e916bbecb.png)|![result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/14ed9dd2-b838-4953-a2bc-16b37c9e0ea6.png)|


```java:Processing OpenCV
import gab.opencv.*;
import org.opencv.core.Mat;
//import org.opencv.core.Core;

size(400, 400);

PImage tri, chk;
OpenCV ocvT, ocvC;

tri = loadImage("triangle.png");
chk = loadImage("check.png");
ocvT = new OpenCV(this, tri);
ocvC = new OpenCV(this, chk);
ocvT.gray();
ocvC.gray();

Mat matT = ocvT.getGray();
Mat matC = ocvC.getGray();
matT = matT.mul(matC);
//matT = matT.matMul(matC);
//Core.gemm(matT, matC, 1, new Mat(), 0, matT);

PImage disp = createImage(400, 400, RGB);
ocvT.toPImage( matT, disp);
image(disp, 0, 0);
```

matMul命令やgemmで、行列式として無理矢理計算しようとしても、フォーマットの指定があるみたいで、いろいろやってもうまくいかなかったので、諦めた。


# 参考サイト

https://schima.hatenablog.com/entry/2015/09/18/233500
jdk21環境でgoogle-java-formatを実行しようとしたらIllegalAccessError: class com.google.googlejavaformat.java.JavaInput...が出た話

## はじめに
JDK 21の環境でgoogle-java-formatをCLIから利用した際に遭遇したエラーと、その対応方法を紹介します。

## 発生したエラー

JDK 21環境でgoogle-java-format v1.14.0を使い、以下のようなコマンドを実行したところ、エラーが発生しました。

```shell
java -jar google-java-format-1.14.0-all-deps.jar --aosp --replace Sample.java
```

### 実際のエラーメッセージ

```
error: class com.google.googlejavaformat.java.JavaInput (in unnamed module @0x6c40afbf) cannot access class com.sun.tools.javac.parser.Tokens$TokenKind (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.parser to unnamed module @0x6c40afbf
java.lang.IllegalAccessError: class com.google.googlejavaformat.java.JavaInput...
```

これはJDKのモジュールシステム（JEP 396による内部APIの非公開化）によって、google-java-formatがJDK内部のAPIにアクセスできなくなったために起こっていたようでした。

## 解決方法

google-java-format のリリースノートを確認したところ、v1.19.1 で JDK 21 に正式対応したことが明記されていました。今回のように、使用しているJDKのバージョンに合うgoogle-java-formatのバージョンを知りたい場合は、リリースノートにしっかり記載されているので、内容を追っていくことで確認できます。

- [v1.19.1 リリースノート](https://github.com/google/google-java-format/releases/tag/v1.19.1)
  - 「Java 21対応」を公式に明記

**v1.25.2**でも問題なく動作することを確認済みです。

- [v1.25.2 リリースノート](https://github.com/google/google-java-format/releases/tag/v1.25.2)

## 正しいCLIコマンド例（macOSの場合）

最新バージョンのjarファイルを使用すると問題が解消します。

```shell
java -jar google-java-format-1.25.2-all-deps.jar --aosp --replace Sample.java
```

### Homebrewでインストールする場合

Homebrew経由でJDKとgoogle-java-formatをインストールすることもできます。

```shell
brew install openjdk google-java-format
```

この場合、以下のようにコマンドを実行します。

```shell
google-java-format --aosp --replace Sample.java
```

## まとめ

- JDK 21環境でgoogle-java-formatを使う場合、 **v1.19.1以上が必須** 
- CLIでの利用には追加の設定は不要

## 参考資料

https://github.com/google/google-java-format

https://formulae.brew.sh/formula/google-java-format
ローカル環境からEC2インスタンスへの接続

## 環境
- AWS CLIインストール済み
- ローカルPC：Ubuntu 24.04（WSL2環境）
- 接続先：EC2
  - OS: Amazon Linux 2023
  - セキュリティグループにSSH（ポート22、アクセス元：自分のIP）許可済み

## ローカル環境でキーペアの権限変更
1. 作成したキーペア`sample-ec2`をUbuntuのホームディレクトリにある`.ssh`ディレクトリに移動させます
2. `.ssh`ディレクトリに移動し、作成したキーペアの`sample-ec2`の権限を400に変更します
    ```bash
    cd .ssh
    chmod 400 sample-ec2.pem
    ```
3. 権限を変更できたか確認します
    ```bash
    ls -la
    ```
    `-r--------`と表示されましたら、成功です

## ローカルからEC2インスタンスへ接続
1. EC2のインスタンスの中から`sample-ec2`をクリック
2. 右上の`接続`ボタンをクリックすると、SSHクライアントが表示されます
3. 一番下のコマンドをコピー(例：`ssh -i "sample-ec2.pem" ec2-user@〇.〇.〇.〇`)
4. WSL2で以下を入力
```bash
# ホームディレクトリの.sshに移動
cd .ssh
# EC2インスタンスへSSHで接続
ssh -i "sample-ec2.pem" ec2-user@〇.〇.〇.〇

# yesと返答
Are you sure you want to continue connecting (yes/no/[fingerprint])?  yes
```

## dnfを最新の状態へアップデート
```bash
$ sudo dnf update -y
Last metadata expiration check: 9:57:17 ago on Sun May  4 00:30:59 2025.
Dependencies resolved.
Nothing to do.
Complete!
```

## まとめ
ローカルPCのWSL2上でキーペアの権限を適切に設定し、EC2インスタンスへSSH接続を成功させました。接続後は、EC2上のパッケージ管理ツールdnfを最新状態にアップデート済みです。
「ドメイン駆動設計入門」を呼んで、手を動かして理解する。

# はじめに :fist_tone2:
こんにちは！
最近割と勉強欲が高めで維持できているのが嬉しい一方で、少しこの状態が不思議な@Matsui_engineerです！

今回はタイトルにもある通り、ドメイン駆動設計についてです。
成瀬 允宣さんが書かれた[「ドメイン駆動設計入門」](https://www.amazon.co.jp/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88%E5%85%A5%E9%96%80-%E3%83%9C%E3%83%88%E3%83%A0%E3%82%A2%E3%83%83%E3%83%97%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8B-%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88%E3%81%AE%E5%9F%BA%E6%9C%AC-%E6%88%90%E7%80%AC-%E5%85%81%E5%AE%A3/dp/479815072X/ref=sr_1_1?adgrpid=85923442780&dib=eyJ2IjoiMSJ9.dQZNgmi1PxWGA58xomliOWUshcr92ahAGLi5cWSt6evCCz91MmKGtp_opZj1dc69-jfVoOxcrJVzEWDlCt1Rut_ZiA9nApUwQpJRHOhVDwesNmITQ12DdESWPEzw_dA_bDrHBu221_SUt8j-oNFXbwhx6ay1LTFpGvBsP6XsPhHXa8hMwS4Bqwycqj9ZImIFXlWMPulbcqpyzbAhN0dOZ2gG1Wc9PJsW7_t3BbFL0aiYqpvj4yEsZIFOcdEyOCWZzb8LmmBaHCZ1_ggcxveBXTJM8DNMX5cDRJ8P0Z3io-Q.mCX01wAB3N2pZlvWsAuzYcziuWmmSKNqAcMqMPtkVSw&dib_tag=se&hvadid=678998177968&hvdev=c&hvlocphy=1009543&hvnetw=g&hvqmt=e&hvrand=17592505876412880339&hvtargid=kwd-879790297571&hydadcr=1790_13657015&jp-ad-ap=0&keywords=%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88+%E5%85%A5%E9%96%80&mcid=2dece892027a3c9fbb571dab6b7faabe&qid=1747217914&sr=8-1)を読みました。
読んだだけでもなるほどと思うことがたくさんあったのですが、読んだだけではもったいない！と考え、アウトプットして、理解を深めようと思った次第です。

ただ、本で読んだ内容をそのまま記事にするだけでは面白くないし、オリジナリティがないと考えたので、手を動かし、ソースを交えながら理解を深めたいと思います。

更新が遅いかもしれませんが、優しく見守っていただけるとありがたいです🙏

# Myルール :writing_hand_tone1:
今回、本のChapterに沿って学習を進めていきたいと思います。そこで、いくつかルールを決めました。

- JavaのSpring Bootを利用して、手を動かしてみます。(本書は基本的にC#でのコードが提示してあります。)
- 作成したソースはGitHubにて公開する。
  - [Gitリポジトリはこちら](https://github.com/oji-123/DomainDrivenDesignTraning)
  - Chapter毎に行った修正はブランチ毎に分けようと考えています。 
  - 最新版はmainブランチとします。
- Chapter毎に理解したことを自分なりの言葉で要約してみる。そのあと、実際にコードをかいてみる。

また、実装するケースは本書のChapter11「アプリケーションを1から組み立てる」で提示されていたケースで行います。
(このあたりのケースは後ほど変えるかもしれません。)

# 題材とする機能 - サークル機能 :speaking_head:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2575943/62f300e7-1e06-4f4e-97db-258697ede1b4.png)

ユーザ同士の交流を促進する「サークル機能」が題材です。
各チャプターにて、学んだことを手を動かす際に、以下のケースを例に作成してみます。

ユースケースは以下とします。

- サークルの作成
- サークルの参加

また、サークルのルールは以下です。
- サークル名は3文字以上、20文字以下
- サークル名はすべてのサークルで重複しない
- サークルを作成したユーザはそのサークルのオーナーとなる
- サークルに所属するユーザの最大数はサークルのオーナーになるユーザを含めて、30人

※必要に応じて、上記の情報は各記事に提示しておくつもりです。

# Chapter毎の学習

### Chapter1 「ドメイン駆動設計とは」
https://qiita.com/Matsui_engineer/items/ddaf380fa6357aae21d7

### Chapter2 「システム固有の値を表現する値オブジェクト」
https://qiita.com/Matsui_engineer/items/256d8671bf128991582e

### Comming Soon...
「ドメイン駆動設計入門」を呼んで、手を動かして理解する。Chapter1


:::note warn
初回のチャプターは「ドメイン駆動設計とは」、「ドメインとは」といった概念を説明する内容です。
そのためこのチャプターでは、コードを書いて手を動かすということはしませんので、ご了承ください。
:::

# Chapter1 ドメイン駆動設計とは

## ドメイン駆動設計とは
突然ですが、ソフトウェア開発はどのような目的で行っているでしょうか。
顧客業務上での課題や問題を解決するために、開発者は日々の開発業務を行っていると言えるでしょう。
もちろん、ただ開発しただけで全く利用されないソフトウェアは**価値**を創出しません。

では、**価値**のあるソフトウェアを作るにはどうすればよいでしょうか。

ソフトウェアを開発する際、顧客が従事している新しい分野の内容を学ぶ必要があります。
金融、物流、自動車、医療、建設、etc・・・
質の良いソフトウェアを作りたいと思うのであれば、(ほとんどの)開発者にとって馴染みのない業務特有の知識が必要になることでしょう。さらには、その会社独自のルールなども含まれていることが考えられます。

上記のような業務独自の特性を実装やコードに落とし込むことによって、**よりユーザのニーズを満たす開発**を行うことを目指すのがドメイン駆動設計です。

## ドメインの知識に焦点をあてた設計手法
タイトルの「ドメイン」と「知識に焦点をあてる」という言葉を紐解きます。

### ドメイン
「ドメイン」という言葉はシステムエンジニアとして働いている人であればどこかで聞いた事があるのではないでしょうか。ここでは、ドメイン駆動設計における「ドメイン」の意味を理解します。

「ドメイン」は領域の意味を持った言葉です。**顧客が従事している業務における領域**と言えるでしょう。
例えば、金融では、預金、融資、投資といった業務分野があります。
預金では、お通帳や印鑑、本人確認書類といった手続きに必要なモノが出てきます。これらが金融システムにおけるドメインになります。
その**業務分野における、必要な概念**のことを指しています。
もちろん、業界や会社が変われば、ドメインは大きく変化すると本書では記載があります。

### 知識に焦点をあてる
冒頭の内容と少し被りますが、ソフトウェアには利用者がおり、ソフトウェアは利用者の**ドメインにおける課題解決を行うための手段**です。
課題解決するにはドメインの課題はもちろん、それを渦巻く環境や状況を正確に把握し、正しくソフトウェアに落とし込む必要があります。
上記を行うための「知識に焦点を当てる」です。

### つまり「ドメインの知識に焦点をあてた設計手法」って？
**顧客が置かれている領域(ドメイン)と真摯に向き合い、課題解決をするための設計手法**と言えるでしょう。

### ドメインモデル
まずは、モデルとは何でしょうか。
ここでのモデルは**現実の事象、あるいは概念を抽象化した概念**を指します。


  <img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpF6k93Yq1uEGEDy1QzKxPlqdQ4k3c2zK-wgfQ59XJjFosCF2lHssYHYEi4Cz9m4dIdgAp24D2ubdPjsPRxBIwJY3Ui61WDl-FKv0iA6ogXX3t3A8gtLsblHmzbjNcfWyO3QH5vbKoNXI/s1600/chokin_tsuchou.png" alt="通帳の画像">

金融業界のお通帳で考えてみます。
金融業務を考慮する上で、お通帳は「入出金の履歴情報を持つ」という特性は持っているでしょう。誰のデータなのかを紐づけるために「特定個人と結びついていること」も必要でしょう。

「お通帳が紙でできている」という特性はどうでしょうか？
業務を進める上では必要なさそうな気がします。
システムで通帳のデータを考慮する場合、お通帳が紙なのか、再生紙なのか、プラスチック(?)なのかは関係ないですよね。「紙でできているから〇〇の処理が必要」なんてことを考慮した実装はしないと思います。

| 特性 | 開発において考慮が必要か |
|:-:|:-:|
| 入出金の履歴情報を持つ | 必要 |
| 特定個人と結びついていること | 必要 |
| お通帳が紙でできている | 不要 |

上記のようにシステムを構築する上で考慮が必要なものだけを抽出する作業を**モデリング**と言います。
さらに、モデリングされたことによって、出来上がった概念を**ドメインモデル**といいます。

ドメインモデルは最初からこれだ！と決まったものがあるわけではありません。
各ドメイン、環境、会社によって、ドメインモデルに必要な情報は変化します。

ドメインの住人(つまりはユーザ)の知識はそのドメインにおいて、右に出る者はいないでしょう。しかしながら、システム開発における知識は持っていません。
逆に、開発者はシステム開発のプロです。開発での重要なポイントや要点は分かっても、ドメインのすべてを理解するのは難しいです。

ドメインモデルのモデリングはドメインの住人と、開発者が密に情報連携、意識共有することによって見えてきます。
これは、システム開発において当たり前のことです。
要件定義で顧客の必要としているものを明確にしようとすることは、基本的にどこの現場でも行われているはずです。
ドメイン駆動設計は**この当たり前を行うためのプラクティス**とも言い換えることができます。

### ドメインオブジェクト
先ほど出てきたドメインモデルは抽象化されたドメインの概念でした。
この**ドメインモデルをコード化したものがドメインオブジェクト**です。

モデリングでも少し出てきましたが、なんでもかんでもドメインオブジェクトとして定義して良い訳ではありません。
開発者は本当に役に立つドメインモデルのみを、ドメインオブジェクトとして扱い、ソースに落とし込む必要があります。
利用されないドメインオブジェクトは利用者の問題を解決しないのであれば、ただの徒労になってしまいます。

### ドメインモデルをソースに落とし込んで何が良いか
ドメインの状況が変化することはよくあることです。
- 業務の方法が変わった
- この業務なくなった
- ルールが変わった

忠実にドメインの特性を落とし込んだドメインオブジェクトは、ダイレクトにその影響を受けるでしょう。
忠実に再現しているからこそ、そのような**変化をドメインオブジェクトに伝えるのは簡単**になります。

**ドメインモデルとドメインオブジェクトの両者を比較すれば、修正箇所は明確になります。**
また、ドメインの変更により、ドメインから、ドメインモデルへ、さらにはドメインオブジェクトへとお互い影響し合う状態となります。

## 本書のゴール(つまりは、私のゴール)
本書はタイトルにもある通り、「ボトムアップでわかる」としており、実践しやすいパターンから学習を進めます。
少しずつ理解できる領域を広げていき、ドメイン駆動設計の本質に立ち向かう準備を完了することをゴールとします。
(私は、手を動かしながら、本書に書かれていることを実践することで、理解を深めます。)

### 記事一覧
https://qiita.com/Matsui_engineer/items/37bf677593016a39fa82
電波法を説明します⑤[特定小電力]➃

前回、2.4GHzの半値角の説明をしました。引き続き2.4GHzについて説明します。
2.4GHz帯では、送信出力規定がmW/MHzと謎の「/MHz」が入る、という説明を書ました。字の通りで、「1MHzの帯域幅の出力」で、3または5または10mWと規定されています。例えば、ARIB STD-T66には以下の様に書かれています。

3mW/MHzでは、「周波数ホッピング方式（以下「FH 方式」という。）又は直接拡散方式（以下「DS 方式」という。）及び FH 方式の複合方式若しくは FH 方式と DS 方式の複合方式を使用するスペクトル拡散方式であって、2,427MHz 以上、2,470.75MHz 以下の周波数帯を使用する送信装置の空中線電力は、変調信号の送信速度と同じ送信速度の標準符号化試験信号により変調した場合において、1MHz の帯域幅における平均電力が 3mW 以下であること。」と書かれており、これが法律文章からわかりやすくした文面です。なんかわかりずらいですね。ここではもう一つの占有帯域幅の規定があり、以下の様に書かれています。

「FH 方式又は DS 方式と FH 方式の複合方式若しくは FH 方式と OFDM 方式の複合方式を使用する送信装置は 83.5MHz 以下、OFDM 方式を使用する送信装置は38MHz 以下、それら以外の方式を使用する送信装置は26MHz 以下の必要周波数帯幅であること。」

ここでの注目は「FH 方式又は DS 方式と FH 方式の複合方式若しくは FH 方式と OFDM 方式の複合方式を使用する送信装置は 83.5MHz 以下」で、最大83.5MHzの帯域が利用できるため、以下の計算が成り立ちます。

   送信出力(MAX)=3mW/MHz×83.5MHz=250.5mW

つまり、トータル250.5mWの出力まで許容されます。これに公差の上限が+20%なので、300mWまで出せることになります。つまり、1MHzあたりの平均電力が3mW＋20%＝3.6mWになるように制御すれば、実質300mWの無線が使えるということです。それなら初めから300mWの製品でいいかと言えばそうではありません。FH方式は疑似ランダム符号で使う周波数が均等になるという前提のため、300mWがピークで通信が可能です。一方、DS方式は出力が使用周波数全体を均等にするため、ピークは3.6mWですが83.5MHz全体を使っていいのです。前者の例がBluetooth、後者がWi-Fiです。但し、流石に83.5MHzを一気に使うと同一エリアでは1つの無線しか使えないため、Wi-Fiでは20または40MHzまでに制限しています。ここで疑問が多数出ると思いますが、紙面では書ききれないため質問いただければ回答いたします。

また、2.4GHzでは、「スペクトル拡散以外の方式」は10mWと規定されており、ここには「/MHz」が付きません。つまり、スペクトル拡散以外は総電力が10mW以下しか出せないという意味です。通常、私が開発している製品はこの条件で製品化することがほとんどです。なんでこんな低い条件を選択しているのか疑問が湧いてくると思いますが、説明すると長くなるので一言だけ説明すると「低消費かつ多チャンネルを実現するため」です。そのような製品は世の中に少なく、結構重宝がられています。

その他、2,471-2,497MHzを使用するRCR STD-33という規格もありますが、話が長くなりすぎるので割愛します。

特小はこの辺で一旦終了し、次回から免許局を説明します。
ElementorにTurnstileを統合する

ElementorではreCAPCHAがネイティブ統合されているが、この度の10,000件/月制限にともない、CloudFlare Turnstileを統合したロードマップ

ElementorではCloudFlare Turnstileはネイティブ統合されていないため、まずはお手軽にプラグインがないか探っていく。

検索するとTurnstile統合のWPプラグインはいくつかあり、要件的にElementorに統合可能とのことだが、いずれも何かしらエラーレポートがあり、不安定な様子。

### Simple Cloudflare Turnstileプラグイン
[Simple Cloudflare Turnstile – CAPTCHA Alternative](https://wordpress.org/plugins/simple-cloudflare-turnstile/)

検索したら候補として上位に引っかかるのが`Simple Cloudflare Turnstile`プラグイン

Elementor Proフォームに統合可能っぽいが、

> 現時点では（2024年12月4日）、Simple Cloudflare TurnstileはElementorを使用しているウェブサイトでJavaScriptエラー「Can't find variables: turnstile」をスローします。そのため、プラグインを必要とせずにCloudflare Turnstileと統合できれば、より信頼性の高いソリューションになります。Elementorにとってもメリットがあります。
[Add Cloudflare Turnstile integration · elementor · Discussion \#25671](https://github.com/orgs/elementor/discussions/25671)

しっかりとElementorフォーラムでエラーレポートあり。

で、そのフォーラムにfunction.phpに組み込み可能なElementorのネイティブ統合をスクラッチ開発した勇者が現れた。結果的にこれが超優秀であったため採用。
[Cloudflare Turnstile Integration for Elementor Forms](https://gist.github.com/DavePodosyan/b4e6f0a261ce5c7ed3b30b0734d56291)

## ロードマップ

### turnstileを導入する

CloudFlareでTunestileウィジェットを管理対象(推奨)モードで払い出す。

### ElementorフォームにTurnstileを統合する

私のWPの環境

- AWS Lightsail WP
- CMS - Elementor
- テーマ - Hello Elementor

1.[統合実装](https://gist.github.com/DavePodosyan/b4e6f0a261ce5c7ed3b30b0734d56291)をファイルにしてテーマに組み込む

```sh
# コマンド割愛
scp elementor-form-turnstile-handler.php ~/stack/wordpress/wp-content/themes/hello-elementor
```

Turnstileチャレンジのバリデーションエラーメッセージは適宜、日本語にローカライズした

```php
// $ajax_handler->add_error($field['id'], esc_html__('The Captcha field cannot be blank. Please enter a value.', 'elementor-pro'));
$ajax_handler->add_error($field['id'], esc_html__('俺の名前を言ってみろ', 'elementor-pro'));
```

2.functions.phpで読み込む

これだけで統合完了というお手軽さ。

```php
require_once get_template_directory() . '/elementor-form-turnstile-handler.php';
```

3.サイトキーとシークレットキーを登録する

WordPressコンソールから
Elementor > 設定 > 連携 > Cloudflare Turnstile

サイトキーとシークレットキーを登録する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417736/228f19b2-36ee-4962-a4ad-e4738b2a313d.png)


4.Elementorフォームで`Cloudflare Turnstile`を追加する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417736/122f7804-637b-4f8d-9eb2-030c4e35c52a.png)

フォームにTurnstileが追加された

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417736/19f7b442-60b6-45c9-859e-fd08786196c9.png)

### 直接POSTされている可能性と対策について

フォームにTurnstileを統合しても、フォーム送信先に直接リクエストを送りつけられたられては意味がないので、サブミットイベントをフックしてTurnstileレスポンスを検証しようと思ったが、`elementor-form-turnstile-handler.php`がトークン検証の問い合わせまでワンストップ対応してくれていた。素晴らしい。
【備忘】mysqlのレプリケーション設定手順

## はじめに
MySQLレプリケーションの設定手順を、自分の備忘として書き留めておきます

## 環境/構成
利用基盤：AWS
OS：RHEL9.5(EC2) ×2台
DB：MySQL 8.0.41
構成：Master/Slave 1台ずつ

![イメージ図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56869/82410302-c387-4c2c-86ff-9d0149033193.png)


## 手順
AWSでEC2インスタンスを作成後ssh接続し
<br>


### 両ノードで実施
rootユーザへ切り替え
```
sudo su -
```
<br>

mysql-serverパッケージをインストール
```
dnf install -y mysql-server
```

<br>

mysqlサーバの自動起動有効化と起動
```
systemctl enable --now mysqld
systemctl status mysqld
```

<br>

mysqlサーバのrootユーザパスワード設定
```
mysql -u root


mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'パスワード';
mysql> quit
```
<br>

### Master側で実施

DB設定ファイル修正
```
vi /etc/my.cnf

以下を追記
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-format=ROW
```

<br>

サービス再起動
```
systemctl restart mysqld
```

<br>

レプリケーション用のユーザを作成
以下ではrepuserを作成
```
mysql -u root -p

mysql> CREATE USER 'repuser'@'SlaveのIPアドレス' IDENTIFIED BY 'repuser用のパスワード';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repuser'@'SlaveのIPアドレス';
mysql> FLUSH PRIVILEGES;
```

<br>

DBのロックと
Masterのbinlogを確認
```
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;
```

### Slave側で実施

DB設定ファイル修正
```
vi /etc/my.cnf

以下を追記
[mysqld]
server-id=2
relay-log=relay-log
read-only=1
```

<br>

サービス再起動
```
systemctl restart mysqld
```

<br>

レプリケーション接続設定
```
mysql -u root -p

mysql> CHANGE REPLICATION SOURCE TO
mysql>   SOURCE_HOST='MasterのIPアドレス',
mysql>   SOURCE_USER='repuser',
mysql>   SOURCE_PASSWORD='repuserのパスワード',
mysql>   SOURCE_LOG_FILE='上記で控えたbinlogファイル名',
mysql>   SOURCE_LOG_POS=上記で控えたポジション;
```

レプリケーション開始とステータス確認
```
mysql> START REPLICA;
mysql> SHOW REPLICA STATUS\G

ステータスは
Replica_IO_Running: Yes
Replica_SQL_Running: Yes
を確認
```


### Master側で実施

DBのロックを解除しておく
```
mysql> UNLOCK TABLES;
```

実際にレプリケーションされるか確認してみる
```
mysql> CREATE DATABASE test;
mysql> USE test;
mysql> CREATE TABLE t1 (id INT, msg VARCHAR(50));
mysql> INSERT INTO t1 VALUES (1, 'test');
mysql> SELECT * FROM t1;

以下のようにテーブルに値が入っていることを確認
+----+-------------------+
| id | msg               |
+----+-------------------+
|  1 | test              |
+----+-------------------+
1 row in set (0.00 sec)
```

### Slave側で実施

レプリケーションされてテーブルが作成され値が入ってることを確認

```
mysql> USE test;
mysql> SELECT * FROM t1;

以下のようにテーブルに値が入っていることを確認
+----+-------------------+
| id | msg               |
+----+-------------------+
|  1 | test              |
+----+-------------------+
1 row in set (0.00 sec)
```
【AWS初学者】EC2インスタンスの購入方式・操作・SSH接続（Tera Term）

# EC2インスタンスの購入方式・操作・SSH接続（Tera Term）
前回からさらにインスタンスに学習し、実際にEC2インスタンスを作成・Tera Termを使用してSSH接続をしてみました。その内容をまとめたいと思います。

## ✅ EC2インスタンスの購入方式
### 1️⃣ オンデマンドインスタンス（On-Demand Instances）
必要な時に作成し、利用時間に応じて課金

長期契約不要で柔軟に利用可能

テスト環境・一時的な用途向き

### 2️⃣ リザーブドインスタンス（Reserved Instances）
1〜3年契約で割引を受けられる

継続的な利用に最適

支払い方法は「全額前払い／部分前払い／従量課金」から選択可

### 3️⃣ スポットインスタンス（Spot Instances）
AWSの余剰リソースを格安で利用（最大90%割引）

AWSの都合で突然終了する可能性あり

中断耐性のある処理向け（バッチ処理・ビッグデータ分析など）

## 🖥 ベアメタルインスタンス（Bare Metal Instances）
仮想化レイヤーなし → OSが物理ハードウェアで直接動作

高性能・特殊なワークロードに対応（HPC、ライセンス制約アプリ等）

### 🔸 特徴
ハードウェアへのネイティブアクセス

高クロックCPUや高速I/Oが必要な場面に最適

### 🔸 主な種類
| インスタンス名     | 特徴                 |
| ----------- | ------------------ |
| `m5.metal`  | 汎用                 |
| `c5.metal`  | CPU最適化             |
| `r5.metal`  | メモリ最適化             |
| `i3.metal`  | NVMe SSD搭載、高速ストレージ |
| `z1d.metal` | 高クロックCPU対応         |

## 🧩 Dedicated Instance vs Dedicated Host 比較
| 項目         | Dedicated Instance | Dedicated Host       |
| ---------- | ------------------ | -------------------- |
| 物理サーバーの専有  | 一部専有               | 全体を専有                |
| インスタンス配置制御 | 不可（AWS任せ）          | 可能（手動管理）             |
| ライセンス管理    | 通常通り               | ライセンス制約対応可           |
| コスト管理      | 通常のEC2と同様          | ホスト単位で最適化            |
| 用途         | セキュリティ強化・分離目的      | ライセンス制約対応・物理管理が必要な場合 |

💡 選び方：柔軟運用→Dedicated Instance／ライセンス制御→Dedicated Host

## 🔧 EC2インスタンスの基本操作
✅ インスタンス起動（マネジメントコンソール）
1.EC2サービスを開く → 「インスタンス起動」

2.AMIとインスタンスタイプを選択（例：t3.micro）

3.ストレージ・セキュリティグループを設定

4.キーペア作成 → インスタンス起動

## 🔐 【Tera TermでSSH接続する方法】
### 🛠 手順
1.Tera Termをインストール・起動

2.EC2のパブリックIPv4をコピーして「ホスト」に貼る

3.「SSH」を選択し接続

4.認証方式をRSA/DSA/ECDSA/ED25519 鍵を使うに設定

5..pemファイルを指定（作成時にDLした秘密鍵）

6.ユーザー名：ec2-userとする

7.接続完了！

###💡 補足
秘密鍵の権限は chmod 400 your-key.pem を忘れずに！

接続に失敗する場合、セキュリティグループの設定を再確認！

## 📌 まとめ
・EC2のインスタンス種類・購入方式の理解はコスト最適化に直結

・Tera Termを使えば簡単にSSH接続可能

・CLIからの操作やスナップショット、Auto Scalingも覚えておくと便利！
コンビネータ論理：Exercise 2.34(a)ペア生成コンビネータ

コンビネータ理論の問題。

[Lambda-Calculus and Combinators: An Introduction](https://amzn.to/4iYmQU3)
Hindley & Seldin より

## Exercise 2.34(a)
ペア生成コンビネータ$D$と次の条件を満たす二つの射影$D_1, D_2$を作成せよ。
$$D_1(Dxy)\ \triangleright_\omega\ x$$

$$D_2(Dxy)\ \triangleright_\omega\ y$$

## 回答
$D\equiv [x,y,z].zxy$として、$D_i\equiv [u].u([x_1,x_2].x_i)$とすると成り立つ。
実際にそうなるかを検証する。

### Dについて
$D\equiv[x,y,z].zxy\equiv[x].([y].([z].zxy)))$なので

$z$での抽象化
$[z].zxy\equiv S([z].zx)([z].y)$
$\equiv S(S([z].z)([z].x))(Ky)$
$\equiv S(SI(Kx))(Ky)\equiv[z].zxy$

上式の検証：
$S(SI(Kx))(Ky) z\equiv (SI(Kx))z((Ky)z)$
$Iz((Kx)z)y\equiv z(x)y\equiv zxy$ Q.E.D$...(1)$

更に$y$での抽象化
$[y].([z].zxy)\equiv [y].S(SI(Kx))(Ky)$
$\equiv S([y].S(SI(Kx)))([y].Ky)$
$\equiv S(K(S(SI(Kx)))K$

上式を検証：
$S(K(S(SI(Kx)))Ky$
$\equiv K(S(SI(Kx)))y(Ky)$
$\equiv S(SI(Kx))(Ky)$ Q.E.D...(2)

更に$x$での抽象化
$[x].([y].([z].zxy)))$
$\equiv[x].S(K(S(SI(Kx)))K$
$\equiv S([x].S(K(S(SI(Kx)))))([x].]K)$
$\equiv S(S([x].S)([x].K(S(SI(Kx))))) (KK)$
$\equiv S(S(KS)(S([x].K)([x].S(SI(Kx))))) (KK)$
$\equiv S(S(KS)(S(KK)(S([x].S)([x].SI(Kx))))) (KK)$
$\equiv S(S(KS)(S(KK)(S(KS)(S([x].SI)([x].Kx))))) (KK)$
$\equiv S(S(KS)(S(KK)(S(KS)(S(K(SI))K)))) (KK)$
従って、
$$D\equiv
[x].([y].([z].zxy)))$$

$$\equiv S(S(KS)(S(KK)(S(KS)(S(K(SI))K)))) (KK)$$

上式を検証：
$S(S(KS)(S(KK)(S(KS)(S(K(SI))K)))) (KK) x$
$\equiv S(KS)(S(KK)(S(KS)(S(K(SI))K))))x ((KK)x)$
$\equiv (KS)x (S(KK)(S(KS)(S(K(SI))K))x) K$
$\equiv S ((KK)x (S(KS)(S(K(SI))K)x)) K$
$\equiv S (K ((KS)x (S(K(SI))Kx))) K$
$\equiv S (K (S     ((K(SI))x (Kx)))) K$
$\equiv S (K (S     (SI (Kx)))) K$ Q.E.D....(3)

## Dxyについて
$Dxy\equiv S(S(KS)(S(KK)(S(KS)(S(K(SI))K)))) (KK) xy$
$\equiv S (K (S (SI(Kx)))) Ky$ by (3)
$\equiv S(SI(Kx))(Ky)$ by (2)

## Diについて
$D_i\equiv [u].u([x_1,x_2].x_i)$とすると
$D_1\equiv [u].u([x_1,x_2].x_1)$
$D_2\equiv [u].u([x_1,x_2].x_2)$
なので、
$D_1\equiv [u].u([x_1].([x_2].x_1))
\equiv [u].u([x_1].Kx_1)\equiv[u].u(K)$
$\equiv S([u].u)([u].K)\equiv SI(KK)$
よって$$D_1\equiv SI(KK)$$

$D_1(Dxy)\equiv SI(KK)(S(SI(Kx))(Ky))$
$\equiv I(S(SI(Kx))(Ky)) ((KK)(S(SI(Kx))(Ky)))$
$\equiv \\{S(SI(Kx))(Ky)\\} K$
$\equiv SI(Kx)K ((Ky)K)$
$\equiv IK ((Kx)K) y$
$\equiv K x y\equiv x$
よって$$D_1(Dxy)\ \triangleright_\omega\ x$$

一方、$D_2$は、
$D_2\equiv [u].u([x_1].([x_2].x_2))
\equiv [u].u([x_1].KI)\equiv[u].u(KI)$
$\equiv S([u].u)([u].KI)\equiv SI(K(KI))$
よって$$D_2\equiv SI(K(KI))$$

$D_2(Dxy)\equiv SI(K(KI))(S(SI(Kx))(Ky))$
$\equiv I(S(SI(Kx))(Ky)) ((K(KI))(S(SI(Kx))(Ky)))$
$\equiv (S(SI(Kx))(Ky)) (KI)$
$\equiv (SI(Kx))(KI)) ((Ky)(KI))$
$\equiv SI(Kx)(KI) y$
$\equiv I(KI) ((Kx)(KI)) y$
$\equiv (KI) (x) y\equiv I y\equiv y$
よって$$D_2(Dxy)\ \triangleright_\omega\ y$$

よって条件を満たすことが分かった。他の組み合わせでもうまくいく場合があるので、後程掲載する。
VirtualBoxでWindowsと共有フォルダの設定をする方法

備忘録です。

### １．ホストOS側で共有フォルダを設定する

- フォルダーのパス：マウントしたいホストOS側のフォルダを選択
- フォルダー名：ゲストOS側のマウントするフォルダパス（フォルダーのパスを入力したときに自動で入力されるものでよい）
- マウントポイント：「G:」にする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355274/4d6a7026-1959-451e-bc7e-151f39688468.png)

### ２．ゲストOSウィンドウのメニューバー＞デバイス＞「Guest Additions CD イメージの挿入」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355274/a04b735b-9080-4228-ab03-b5ab1c518500.png)

### ３．ゲストOSのエクスプローラー＞PC＞「CDドライブ(D:) VirtualBox Guest Additions」＞VBoxWindowsAdditions.exe を実行する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355274/ed2c50a7-c671-4d5d-89eb-f40820376b8b.png)
vibe coding開発フロー備忘録

## 要約

- AI議事録 → タスク分解 → 実装 → レビューまで、**AI が主語**
- プロジェクト管理ツール内のタスクの **情報をリッチ化** して AI がタスクの背景・文脈を読みやすい状態に
- 定型フローは .cursorrules などのルールファイルに記述し自動化する
- **設計フェーズに最も時間をかけ、後工程をスムーズに進める**
- 実装は AI に丸投げ。動作を確認してからコード理解と修正を始める手法**

> **この記事は何？**  
> 日々の開発で私が実践している「生成 AI をフル活用した開発ワークフロー」のメモ兼公開ノートです。未来の自分が振り返ったときに “あの頃はこう回していたな” と確認できるように、そして同じように AI と開発しているエンジニアの参考になれば幸いです。


## Ⅰ. 実装前フェーズ

1. **確認＆質問リスト** を事前に用意  
   - モレなく論点を洗い出す  
2. レビュワーと MTG  
   - 仕様の共通認識合わせ  
3. 議事録テキストをAIで **タスク分解**  
4. 分解したタスクをプロジェクト管理ツールへ MCP で投稿  


## Ⅱ. 実装準備フェーズ

1. プロジェクト管理ツール API で **関連タスクとコメントを一括取得 (MCP or スクリプト)** — AI に最新のタスク状況と背景を把握させるため  
2. **エージェントが自動でブランチを切る**  
3. チームへタスク着手を自動通知する（Slackなど）（自動フロー）
4. AIに不足情報があれば追加質問させる
5. 質問に回答して**チェックリスト (設計)** をエージェントに書かせる — *ここに最も時間をかけるべき*　**→“ダメ出しタイム”** を経て確定  

> 📌 *チェックリストは「細かく・具体的」が正義。後工程でズレたとき、設計の粒度不足が原因なことが多い*


## Ⅲ. 実装フェーズ

- **Vibe Coding**：AI にコードを書かせ、私はレビューと追加プロンプトに専念  
- 挙動が**大きくズレた場合は、設計 (=チェックリスト) が誤っているサイン**。まずチェックリストを修正し、その後 AI に再実装を依頼する  


## Ⅳ. 実装後フェーズ

1. **AI コードレビュー**（※レビュー用に *新しいスレッド* を必ず作成する。過去の会話のノイズを排除し、レビュー品質を保つため）  
2. ルールファイル `.cursorrules` で「PR 作成時に出力すべき情報」をテンプレ化 
3. スクリーンショット・検証結果を自動添付して PR 発行  
4. レビュワーが迷わないよう **“見せ方”** まで AI にチェックさせる  


## Ⅴ. PR レビュー対応フェーズ

- 指摘が「設計ミス」なら **チェックリストをアップデート** → AI に改修させる  
- 再度 AI コードレビュー



## まとめ

**議事録を使って情報リッチ化 → AIで設計 → AIに実装丸投げ → 検証＆修正** の流れです！
Cursorユーザーは今すぐチェック！最新のアップデートを誰よりも早く使う！

## 一言で

**Cursorに新機能への早期アクセスを有効化する設定がある！みんな急いで設定しよう！**

## Early Access の有効化手順

```text
Cursor Setting >> Beta >> Update Frequency
```
設定をEarly Accessに変更してください。


![スクリーンショット 2025-05-14 18.19.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116193/b4e15e37-fcf7-42d7-8d8b-0af5ac7c53c8.png)


:::note 
これを有効化して、cursorのメニューバーから
cursor >> Check for Updates
を確認することで、新しいバージョンに更新できるようになりました！！！
:::

## まとめ
「Early Access」を有効化して新機能をガンガン試していきましょう！
GitLabで100MBを超えるファイルがpushできない

# 事象  
100MB以上のファイルをGitLabにpushしようとすると、`GitLab You are attempting to check in one or more blobs which exceed the 100.0MiB limit` というエラーが発生し、pushが行えないという事象がありました。  
この事象はGitLab 17.10.0以上、17.10.3未満へアップグレードした場合に発生するようです。  

# 解決策  
GitLabサーバに接続し、以下を順に実行します。  
```bash
gitlab-rails console
```  

前者のコマンドを実行すると以下のようなコンソール出力がされます。 
※出力されるまで、少し時間がかかります。  
```
--------------------------------------------------------------------------------
 Ruby:         ruby 3.2.5 (2024-07-26 revision 31d0f1a2e7) [x86_64-linux]
 GitLab:       17.10.1-ee (6313c41c880) EE
 GitLab Shell: 14.41.0
 PostgreSQL:   14.17
------------------------------------------------------------[ booted in 57.42s ]
WARNING: Active Record does not support composite primary key.

security_findings has composite primary key. Composite primary key is ignored.
Loading production environment (Rails 7.0.8.7)
irb(main):001:0>
```
これが表示されたら、以下を実行します。  
※2048は仮の値です。必要に応じて変更してください。  
```
Plan.default.actual_limits.update!(file_size_limit_mb: 2048)
```  

これでpushができるようになりました。  

# 参考リンク  
以下を参考にしました。  
https://forum.gitlab.com/t/limit-on-pushed-file-size-after-upgrading-to-17-10-0/123201/22
Linucレベル１勉強メモ　＃３４

＃ 第三章　GNUとUnixのコマンド

練習問題3.9
自分用にコマンドをいくつか作成し、＄HOME/binディレクトリ以下に格納しました。
絶対パスで指定して実行するのは手間がかかるので、コマンド名のみの入力で実行されるようにしたいと思います。そこで、つぎのコマンドを実行しました。

＄ echo ＄PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
＄ PATH=＄HOME/bin

この結果として予想される事態を２つ選択してください。

A. ~/binディレクトリ以下のコマンドはコマンド名のみで実行可能となる

B. PATH変数の設定時に「$」をつけ忘れているのでエラーメッセージが表示される

C. PATH変数の設定時に「＄」をつけ忘れているのでPATH変数の内容は変更されないが、エラーメッセージは表示されない

D. 「PATH="＄HOME/bin"」のように引用符で囲って指定しなければエラーになる

E. 多くのコマンドが「command not found」となって実行できなくなる

（解答）A, E

（解説）
PATH関数にパスを追加するには「PATH＝＄PATH:追加ディレクトリ」の書式で指定します。設問にあるように、単に「PATH＝追加ディレクトリ」とすると、新しく指定したディレクトリのみがPATH変数に設定されます。その結果、指定したディレクトリのコマンドとシェルの内部コマンド以外のコマンドは「command not found」となり、実行できなくなってしまいます。したがって、選択肢Eは適切です。設問では、パスが通っているのは＄HOME/binディレクトリだけになりますので、少なくとも$HOME/bin以下のコマンドはコマンド名のみで実行可能となります。従って選択肢Aは適切です。変数を設定するときは、変数名に「＄」記号をつけません。従って選択肢B及び選択肢Cは不正解です。また、変数に指定する文字列は引用符で囲って指定しなくてもエラーになりません。従って、選択肢Dは不正解です。
初めてのLT会　「Toranomon Tech Hub 第三回 技術異種格闘技戦〜好きな技術LT大会〜」

先日、[「Toranomon Tech Hub 第三回 技術異種格闘技戦〜好きな技術LT大会〜」](https://toranomon-tech-hub.connpass.com/event/344781/)に参加してきました！

初めてのLT会でドキドキでしたが、
勉強していることが、どのように現場で使用されているかイメージでき、
モチベーションがすごく上がりました！

# 参加目的・経緯
大きく分けて、二つの目標を持って参加しました。

・LT会に参加して、実際に活躍しているエンジニアの方々の生の声を聞いてみたい！
・今後、LTをする時のために、どんな感じなのか学んでおきたい！

現在、サーバーサイドエンジニアとして転職活動をしていて、メンターの方に「未経験なら、他の候補者よりも目立つ必要がある」とアドバイスをいただきました。
それで、LT会とかハッカソンへの参加を勧めてもらい、Compassでこのイベントを見つけて参加しました。



# LT会に参加しての感想
「技術異種格闘技戦」という名前の通り、色々な分野の発表を聞くことができて、すごく面白かったです！
特に、今AWS SAAの勉強をしているので、実際に業務でAWSを使っている方の発表は、より具体的なイメージを持つことができて、本当に参考になりました。

# 特に印象に残ったLT(発表者順)

## 「オンプレからの転向組が語るクラウドの魅力」 なぎささん
オンプレミスとクラウドの両方を経験された視点から、クラウドの嬉しみを聴くことができました！
特に、オンプレミス時代の苦労話（遠いデータセンターまで行ったり、業務外の申請が色々あったり…）は、生で聞く機会がなかったので、本当に参考になりました！
すごく便利な時代になってるなと感じました笑
![スクリーンショット 2025-05-14 17.49.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4081358/b788ace9-260d-41cd-ae08-be8094450c7e.png)
AWSの魅力がさらに分かって、もっと勉強頑張ろう！って気持ちが湧いてきました。

https://x.com/nagisa_53/status/1914265839400055015?s=46

## 「Lambda(Python)のリファクタリングが好きなんです」こまきちさん
リファクタリングの具体的な例を挙げながら、初心者にも分かりやすかったです。
「見た時よりも綺麗にして終わる」っていう言葉が印象に残りました！
より簡潔なコードが大切なんだなと改めて感じました。
特に「あまり使わないimportは関数の中で使う」という部分。恥ずかしながら、importって最初にまとめて書くものと思ってたので、新しい発見でした。そのことで、読み込み時間を短縮できとは驚きでした！
![スクリーンショット 2025-05-12 12.05.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4081358/0bc2cd8e-c817-4630-8072-214e8bc8cf6a.png)


今までポートフォリオ作成では、「とりあえず動けばOK」って感じで、書きっぱなしでしたが、
これからは、その日の終わりに分かりやすくなるよう、リファクタリングします！

https://x.com/komakichidev/status/1914261854488318382?s=46

## 「生成AIで知るお願いの仕方の難しさ」 うーたんさん
人に修正を依頼するのと同じで、AIにより細い条件を指定することの重要性を学びました。
行数、ファイル名の指定は行っていましたが、
使うライブラリのURLの指定までは行っていなかったので、プロンプトの重要性を再認識しました！
![スクリーンショット 2025-05-12 12.18.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4081358/d7cbe836-1754-4607-a883-0f2b2e141283.png)

また、気になっていた「Cursor」についても、どんな使い方ができるかとても参考になりました。
最近の悩みである「一つの機能の追加依頼をすると、他の機能が削除され、削除された機能をもう一度追加する」が今回学んだことで解消されそうです！

https://x.com/uutan1108/status/1914259213137985868?s=46

# まとめ
今学んでいるAWSや、コーディング、AIの活用は今後どのように役に立つちイメージを掴めた会でした。
また、懇親会では、業務の苦労、達成感などお聞きできとてもモチベーションが上がりました！
今後もいろんな会に参加し、次回は自身がLT側に回れるよう頑張ります。

##今後の実践
・その日の最後にリファクタリング
・ポートフォリオ作成でCursorの使用