OmniAICreator/Qiita-1.07M huggingface dataset:
生成AIと上手なプロンプト文で教科書やワークから暗記シートを作るアイデア

## 1．概要と目的  

  楽しく勉強したい！
  中学生が楽しく学べ、受験対策にも活用できるレスポンシブ教材を、プロンプト一発で生成できる仕組みを共有します。このプロンプトで日本中の勉強する方皆さまが幸せになることを祈っています。

  あと、予習にも使えそうですねコレ
  　

- **背景**  
  教材制作には時間とコストが掛かりますが、生成AIとシンプルなプロンプトを組み合わせれば、**「完全な HTML コードのみを返す」** 形で即座に教材を量産できます。  

### 環境パターン  

きれいな表示と長文対応の両方を兼ね備えたClaude3.7であれば1回でうまくいきます。それ以外の場合はChatGPT 4oでスキャンをして、Gemini2.5でHTMLを作るときれいに作れます。

| パターン | 文字起こし | HTML 生成 | 特徴 |
|---------|-----------|-----------|------|
| 1 | Claude 3.7 | Claude 3.7 | ワンストップで高精度・高速 |
| 2 | ChatGPT 4o | Gemini 2.5 | OCR と生成を分離して最適化 |

---

## 2．成果物イメージ  

https://x.com/00oichan/status/1913952465277313079

https://x.com/00oichan/status/1914284979569451458

#### プロンプトで作る教材の構成

解説を先に書くと答えが分かっちゃうので、問題を先に書いて解説を後にしてます。必要に応じて組み替えてください。

| # | シーン | 内容 |
|---|--------|------|
| ① | トップページ | 目次・章扉・ポイントカード |
| ② | 問題セクション | 穴埋め問題／タップで解答表示 |
| ③ | 概要とポイント | 攻略法＋図表＋強調カード |
| ④ | 事例セクション | 砕けた口調のワクワク実例 |
| ⑤ | 参考文献ページ | 外部リンク・脚注・ページ番号 |

---

## 3．プロンプト文  
プロンプト文に教科書やワークをスキャンしたものを一緒に貼り付けて下さい。うちの子が中3なだけで、小学生でも高校生でも社会人でも使えます。冒頭文は自由に書き替えてご使用ください。



```
目的
　・中学３年生が楽しく学べ、受験対策にも使える読みやすい教材を作成する。

出力物
　・完全な HTML コードのみを返す（前後の説明文やコメントは不要）。
　・スマホ／タブレット／PC 対応のレスポンシブデザイン。
　・問題の回答欄は穴埋め式。タップで解答を表示／非表示切替。

文書構成
　1. 目次（章・節・項リンク付き）
　2. 本文  
　　　2.1 問題 ‥ 重要語句の穴埋め・計算問題（高校受験レベル）  
　　　2.2 概要とポイント ‥ 単元の要約＋攻略法・考え方・解説  
　　　2.3 事例 ‥ 男子中学生がワクワクする実例やトピック（この章のみ砕けた口調可）
　※章・節・項には「1. / 1.1 / 1.1.1」形式の階層番号を付与。

記述ガイドライン
　・WordPress マガジン系ブログを意識した自然で引き込まれる文章。  
　・インプット文量の 70％ 以上を維持。  
　・JTF 日本語標準スタイルガイド準拠。  
　・一文：1-2 行、段落：3-4 行が目安。  
　・主語と述語を対応させる。  
　・箇条書きは番号または記号を使用（中黒のみは禁止）。  
　・インプット内の既存穴埋め箇所はすべて問題に転用。

デザイン・レイアウト
　・背景：白系、アクセント：青／紺。タイトル下にデザイン線。  
　・フォント：「Yu?Gothic?UI」、階層に応じ 3 段階サイズ。  
　・強調：太字・下線・マーカー。色分け（確認＝緑／アクション＝青／問題＝赤）。  
　・表：左端列に番号、列見出しは紺背景＋白文字。  
　・ポイントや注意はカード風に強調。  
　・章ごとにページを分割し枠線＋ページ番号を付与。  
　・表や図・フロー・インフォグラフィックを HTML だけで描画して視覚化。

コード要件
　・CSS と共通クラスを style セクションへ集約し再利用。  
	・JavaScript は最小限（回答欄の表示切替のみ）。  
　・インライン CSS は極力避け、コードを簡潔に保つ。  
	・情報誤りを検知した場合は修正し、脚注で明示。  
	・参考文献・外部リンクを巻末に追加。

出力形式
　・ウインドウ幅に応じて自動調整するレスポンシブレイアウト。  
　・穴埋め回答は overflow しないよう幅を自動制御。  
　・HTML ファイル全体を出力し、他システムに貼り付ければそのまま動作。  
　・コードの集約・再利用を徹底し、記述量を最小化しつつ内容を充実させる。  
	・冒頭と末尾に余計なテキストを付けない（コードのみ）。

　
インプット：
　（次のチャットで指示をしますので、何も出力せずに待機しててください）

```


---

## 4．まとめ  

 **総評**  
本プロンプトは **「レスポンシブな HTML 教材をワンショットで生成する」** ことに特化しています。JTF 日本語標準スタイルガイドを順守しつつ、再利用性を高めた CSS 設計により、**コピペだけで運用可能** な完成度を実現します。  
　 
 
**ユースケース**
  - 定期テスト・高校入試対策プリントの量産  
  - 塾や学校 LMS への即時コンテンツ投入  
  - 教員が差分編集して再配布するワークフロー  

　
**応用方法**  
  - 学年や教科を切り替えて汎用テンプレート化  
  - GitHub Actions と連携して自動デプロイ  
  - JavaScript を拡張してヒント表示やスコアリング機能を追加  


このプロンプトを活用し、学習者のモチベーションを高めながら、教材制作工数を大幅に削減していただければ幸いです。

気に言って頂けましたら、ブックマークや **「いいね」** を押して頂けると嬉しいです。

#### ▼ プロンプト集を用意しています。ぜひご覧ください▼

https://qiita.com/tags/nori%e5%bc%8f%e3%83%97%e3%83%ad%e3%83%b3%e3%83%97%e3%83%88%e9%9b%86
Ruby脳でPHPを書くとハマる：nullと比較できてしまう件

# ✅ サクッと結論
Ruby(3.4.1)では nil < '2025-04' はエラー（比較できない）
PHP(8.4.3)では null < '2025-04' はtrue（比較できる）
PHPはnullでも比較演算子の対象になるので、Ruby感覚で書くと意図しない動作をすることがある

# 💡 実例：Rubyならこうなる
```ruby
irb(main):001> nil < '2025-04'
(irb):1:in `<main>': undefined method `<' for nil (NoMethodError)

nil < '2025-04'
    ^
```
→ Rubyでは、< などの比較演算子は Comparable モジュールを通じて <=> に依存しますが、nil 自体には  <=>も < も定義されていないため、比較しようとすると NoMethodError になります。
`nil` に比較演算子がない → メソッド未定義 → 例外（NoMethodError） です。
> 参考: [Ruby 3.4 リファレンスマニュアル  ライブラリ一覧  組み込みライブラリ  Comparableモジュール](https://docs.ruby-lang.org/ja/latest/class/Comparable.html) → nilが比較されることを想定していない
# 💡 実例：PHPならこうなる
```php
php > var_dump(null < '2025-04');
bool(true)
```
→ 'date' がnullでも、比較は成立して通ってしまう。

# 🤯 なぜこうなる？
PHPでは null は比較時に自動的に 空文字列 '' に変換され、比較できるようになる。
→ "'' < '2025-04'" の評価になるため、結果は true
> 参考: [PHP マニュアル 言語リファレンス 演算子](https://www.php.net/manual/ja/language.operators.comparison.php)

# ✅ まとめ
| 比較             | Ruby                              | PHP                                 |
|------------------|-----------------------------------|--------------------------------------|
| `null < "文字列"` | `NoMethodError`（比較不可）        | `true`（空文字として比較される）       |

## ✍️ 最後に

Rubyの案件を中心にやってきたのですが、初めてPHPの案件にアサインしていただいただき、  
「nullが比較できるの！？」「エラーにならないの！？」と素直に驚きました。

同じようにRuby脳でPHPに挑戦している方の参考になればと思い、今回まとめてみました。  

ここまで読んでいただき、ありがとうございました！

# 🚀 番外：RubyエンジニアがPHPでやらかしそうな罠集
- empty() が 0 も null も "" もまとめて false にする
- "0" == false が true になる
- false == null も true
【AtCoder】ABC085C - Otoshidama の解説 in Python

## はじめに

[AtCoder Beginners Selection](https://atcoder.jp/contests/abs) の Otoshidama という問題を解きました。
一重ループでいい感じに解けたので解説してみようと思います。👀

### 提出結果

| 実行時間 | メモリ | コード長 |
|:---:|:---:|:---:|
|10ms|8724 KB|292 Byte|

Otoshidama の問題文は以下をご参照ください。

https://atcoder.jp/contests/abs/tasks/abc085_c

## 🚀 方針

$10,000$円札、$5,000$円札、$1,000$円札の枚数をそれぞれ、$x$、$y$、$z$ 枚として三元一次方程式を解きます。入力として、合計金額 $Y$ 円（`yen`）とお札の合計枚数 $N$ 枚（`nbills`）が与えられるため、つぎの2本の方程式が立ちます。

```math
\begin{cases}
10000x + 5000y + 1000z = Y \\
x + y + z = N
\end{cases}
```

あと1本の方程式は $x$ の値を仮定することで対応します。
本問は、解の組み合わせを1つ見つける、または解がないことを示せば良いので、この方針でいきます。

## 🧠 回答

```py: python
nbills, yen = map(int, input().split())
xyz = '-1 -1 -1'
for x in range(yen//10000+1):  # xは正の整数である
    yf = (yen/1000-nbills-9*x)/4  # yについての方程式
    if yf >= 0 and yf.is_integer():  # 正の整数であることを保証する
        y = int(yf)
        z = nbills -x -y  # zが定まる
        if z >= 0:  # 正である（整数であることは保証済み）
            xyz = f'{x} {y} {z}'
            break
print(xyz)
```

ポイントは、「yについての方程式」です。forループによって $x$ が決まると、$y$ の値は `(yen/1000-nbills-9*x)/4` に定まります。この方程式はつぎのようにして導かれます。

> $y$ を $x$ で表します。
> 
> ```math
> \begin{cases}
> 10000x + 5000y + 1000z = Y \\
> x + y + z = N
> \end{cases}
> ```
> 
> 上式の両辺を1000で割る。
> 
> ```math
> \begin{cases}
> 10x + 5y + z = Y/1000 \\
> x + y + z = N
> \end{cases}
> ```
> 
> 上式と下式の差をとって $z$ を削除する。
> 
> ```math
> 9x + 4y = Y/1000 - N
> ```
> 
> $y$ について解く。
> 
> ```math
> y = \frac{Y/1000 - N - 9x}{4}
> ```
> 
> これで $y$ の値が決まります。

$x$ と $y$ が決まったので、$z$ は $z = N - x - y$ に定まります。


ただし、$x$、$y$、$z$ はお札の枚数なので、正の整数（0を含む）である必要があります。

ここで、`x` は、`range(<整数>)` をイテレートした値であるため、正の整数であることが保証されます。

`y` は、 `/` を用いた演算により `float` 型になるので、if文を用いて正の整数であることを保証します（ちなみに、`y` が少数となる可能性を示唆するため、 `y` に値する変数名を `yf` としています）。

`z` は整数同士の減算なので、整数であることが保証されます。あとは、if文の制御で、`z` が正であることを保証します。

## さいごに

お読みいただきありがとうございました！
質問等ございましたらお気軽にコメントください 😄
個人的備忘録：RDSでPostgreSQLのパラメーターをCSVで確認＆カスタマイズする方法

## はじめに

AWS RDS（Relational Database Service）では、PostgreSQLなどのデータベースエンジンごとに"パラメーターグループ"を使用して、インスタンスの設定を細かく制御できます。

:::note info
**個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**
:::

この記事では、PostgreSQL用のデフォルトパラメーターグループ（例：`default.postgres14`）の内容を確認し、カスタムパラメーターグループを作成して反映するまでの手順を解説します。

## 書こうと思ったきっかけ

RDSのPostgreSQL環境で詳細なパフォーマンス調整を行う際、デフォルトのパラメーター設定を確認して一部の値を変更したい場面が増えてきました。

特に本番環境でのログ出力制御やタイムアウト調整など、環境に応じて細かく設定したかったため、手順を整理することにしました。

## カスタムパラメーターグループの作成

使用しているPostgreSQLのバージョンに応じたパラメーターグループファミリーを指定して、カスタムパラメーターグループを作成します。

```bash
aws rds create-db-parameter-group \
  --db-parameter-group-name my-custom-postgres14 \
  --db-parameter-group-family postgres14 \
  --description "My custom parameter group for PostgreSQL 14"
```

※ `postgres14` の部分は、実際に使用しているPostgreSQLのバージョンに合わせて変更してください。

## デフォルトパラメーターグループの内容をCSVで取得

以下のコマンドで、`default.postgres14` の内容をCSV形式で保存できます。

```bash
aws rds describe-db-parameters \
  --db-parameter-group-name default.postgres14 \
  --region ap-northeast-1 \
  --output text | sed 's/\t/,/g' > default_postgres14_parameters.csv
```

## カスタムパラメーターグループに設定を反映する

1. `default.postgres14` のパラメーター一覧を取得します。
2. 変更したいパラメーターのみをピックアップします。
3. `aws rds modify-db-parameter-group` を使って、必要なパラメーターを設定します。

### 例：ログ出力の最小実行時間を1000ミリ秒に変更

```bash
aws rds modify-db-parameter-group \
  --db-parameter-group-name my-custom-postgres14 \
  --parameters "ParameterName=log_min_duration_statement,ParameterValue=1000,ApplyMethod=immediate"
```

## 補足

- 一部のパラメーターはインスタンスの再起動が必要です。変更の反映タイミングに注意してください。

## まとめ

- `default.postgresXX` の設定を確認し、CSVで保存可能。
- 使用バージョンに応じて、カスタムパラメーターグループを作成。
- `modify-db-parameter-group` を使って、必要な設定のみカスタマイズ可能。

PostgreSQLをより柔軟に運用したい場合は、ぜひこの手順を活用してみてください！
Jekyll × Commonmarker で iframe タグがレンダリングされない問題の解決法

# 前菜
[`jekyll-commonmark-ghpages` の README](https://github.com/github/jekyll-commonmark-ghpages/tree/c71cd81ab75ce4606551f6788a7b1c032f4b42d0?tab=readme-ov-file#jekyll-commonmark-ghpages) を見ると以下のような設定を `_config.yml` に追加する方法が紹介されています。

```yaml
commonmark:
  options: ["UNSAFE", "SMART", "FOOTNOTES"]
  extensions: ["strikethrough", "autolink", "table", "tagfilter"]
```

しかしこれだと `iframe` が正しく表示されなくなるという問題が発生しました。

![](https://noraworld.github.io/box-ivysaur/2025/04/21/0ab24b7fa8743b8ee599bcdd667cb244.png)

タグがそのまま表示されてしまいます。



# メインディッシュ
これの解決策はシンプルで、`tagfilter` を削除します。

```yaml
commonmark:
  options: ["UNSAFE", "SMART", "FOOTNOTES"]
  extensions: ["strikethrough", "autolink", "table"]
```

これで `iframe` が表示されるようになりました。

![](https://noraworld.github.io/box-ivysaur/2025/04/21/ca0289b9983909641b074dcab93e1955.png)

## `iframe` を表示させる方法
そもそもセキュリティ上の観点から、デフォルトでは Jekyll でビルドした記事の中の `iframe` はサニタイズされ表示されません。

それを表示するためのオプションが、[Commonmarker](https://github.com/gjtorikian/commonmarker) では `UNSAFE` です。これをつけることで `iframe` が表示されるようになります。

```yaml
commonmark:
  options: ["UNSAFE"]
```

[Render options](https://github.com/gjtorikian/commonmarker/tree/7029b5cfa486239f77d67e19664a02a444af43df?tab=readme-ov-file#render-options)

## HTML タグをそのまま表示させる方法
一方で、HTML タグをそのまま表示させる拡張も用意されています。これが冒頭で登場した `tagfilter` です。

```yaml
commonmark:
  extensions: ["tagfilter"]
```

[Extension options](https://github.com/gjtorikian/commonmarker/tree/7029b5cfa486239f77d67e19664a02a444af43df?tab=readme-ov-file#extension-options)

これを追加すると、`<` が `&lt;` に、`>` が `&gt;` にそれぞれエスケープされるため、たとえば `<iframe>` と書いてあると `&lt;iframe&gt;` と変換され、ページ上では `<iframe>` のようにそのまま文字として表示されることになります。

[Disallowed Raw HTML (extension) | GitHub Flavored Markdown Spec](https://github.github.com/gfm/#disallowed-raw-html-extension-)

つまり、`UNSAFE` と `tagfilter` を同時に指定すると、せっかく `UNSAFE` で `iframe` が表示されるようになったのに、それをただのタグとしてそのまま表示してしまうので冒頭であげたような問題が発生してしまう、というわけです。

だから

```yaml
commonmark:
  options: ["UNSAFE", "SMART", "FOOTNOTES"]
  extensions: ["strikethrough", "autolink", "table", "tagfilter"]
```

のように `UNSAFE` と `tagfilter` が両方指定されているのはどういう意味があるのか謎なんですよね。まあもちろん `UNSAFE` がないとそもそも `iframe` タグすら表示されないので挙動の違いはあるのですが、`iframe` をページに反映させると同時に HTML タグとしてそのまま表示させる、そんな需要あるのか？という疑問が浮かびました。



# デザート
まあ単にぼくがあまり理解せずにそのままコピペしていたのが問題なんですが、意外に調べてもこのことを解説しているサイトは見つからなかったので備忘録として書くことにしました[^chatgpt]。

[^chatgpt]: ChatGPT に聞いても意外とドンピシャな答えは返してくれませんでした。結果的には ChatGPT が提示した最小構成のサンプルを試したときに動いたのでその差分で原因にたどり着くことができたので壁打ちにはなりましたが。[Jekyll ページネーション問題](https://chatgpt.com/share/67e7fed0-02d0-8004-b25c-832f8160b413)

今回この問題をややこしくした（解決までに時間がかかった）のは、`github-pages` だとこの問題が発生しないからです。

```ruby
gem 'github-pages'
```

ただこれ、考えてみれば当たり前で、`github-pages` は [Dependency versions](https://pages.github.com/versions/) に示されたライブラリやプラグインをもとに動作するように設計されていて、この中に [Commonmarker](https://github.com/gjtorikian/commonmarker) は含まれていないんですよね。

つまり、`github-pages` を使った場合はこの設定は単に無視されて、代わりに [kramdown](https://github.com/gettalong/kramdown) が使われていたので冒頭のような問題が発生しなかった、ということになります。Jekyll は GitHub Pages のエコシステムと密につながっていて、このへんがちょっとわかりづらいと感じるのはぼくだけですかね 🤔

以上となります。わかっている人にとってはすごく当たり前のことを書きましたが、意外にハマってしまったので記録として残しておくことにしました。参考になれば幸いです。
PDF/A 準拠はどれを選べばよいか

## PDF/Aの規格　
* PDF/AのAはアーカイブの略。長期保存を目的
* 規格のパートは１～４まで、違いはベースとなるPDFのバージョンと機能
* レベルa：accessibleの略。論理構造を示すタグ付きPDF
* レベルb：basicの略。標準的機能のみ
* レベルu：unicodeの略。Unicode変換できないテキストは禁止、削除される
* ほかにもレベルe、レベルfがある

| PDF規格 | 概要 |
|:--|:--|
| A-1(a/b) | PDF1.4ベース |
| A-2(a/b/u) | PDF1.7ベース。A-1に対し、ISO32000-1で追加された機能を許容。JPEG2000(より綺麗で高圧縮）、PDF/A準拠のファイル添付、レイヤーなど |
| A-3(a/b/u)| A-2を拡張、様々なファイル（エクセル、ワード等）埋め込みを許可 |
| A-4(e/f)| PDF2.0ベース。a/b/u→fに代わる。eはPDF/Eに代わる  |

## 互換性  
* 後続バージョンは前バージョンの機能をほぼ含む
* 一部廃止・変更される機能がある
* PDF1.7まで：廃止機能は稀
* PDF2.0：古い暗号方式など大きな廃止あり。ISO規格用に刷新

※基本的にPDF1.7が無難。あえてPDF2.0にする必要は無いと思います。

## 主な機能の比較  
|  | A-1a | A-1b | A-2a | A-2b | A-2u | A-3a | A-3b | A-3u |
|:--|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| PDFバージョン | 1.4  | 1.4  | 1.7 | 1.7 | 1.7 | 1.7 | 1.7 | 1.7 |
| フォントは埋め込まなければならない | 〇 | 〇 | 〇 | 〇 | 〇 | 〇 | 〇 | 〇 |
| ICCプロファイルは埋め込まなければならない  | 〇 | 〇 | 〇 | 〇 | 〇 | 〇 | 〇 | 〇 |
| XMP準拠のメタデータを含まなければならない  | 〇 | 〇 | 〇 | 〇 | 〇 | 〇 | 〇 | 〇 |
| タグ付けされていなければならない  | 〇 | × | 〇 | × | × | 〇 | × | × |
| すべてのテキストはUnicodeに変換できなければならない  | 〇  | × | 〇 | × | 〇 | 〇 | × | 〇 |
| 暗号化してよい | × | × | × | × | × | × | × | × |
| LZW圧縮してよい | × | × | × | × | × | × | × | × |
| 外部コンテンツを参照してよい | × | × | × | × | × | × | × | × |
| 透明な画像を含めてよい  | × | × | 〇 | 〇 | 〇 | 〇 | 〇 | 〇 |
| PDF/Aを添付できる  | × | × | 〇 | 〇 | 〇 | 〇 | 〇 | 〇 |
| PDF/A以外のファイルも添付できる  | × | × | × | × | × | 〇 | 〇 | 〇 |  

※A-2とA-3の違いは添付ファイルの種類くらいなので基本的にA-2で十分かと思います。

## 結局  
* 客先の指定があればそれに従う
* 無ければ使っているソフトウェア出力に準拠
* 電子帳簿法にバージョンまで指定はないと思います
* ただし、古いバージョンを使って不具合（読み込みが遅い等）が発生し、PDF/Aのバージョンを後から上げても不具合が解消されることはないです。基本PDFを作り直すことになる
* プリフライトエラーとバージョンの関係は不明
個人的備忘録：aws rds describe-db-parameters でパラメーターをCSVに変換する方法について

## はじめに

AWS RDS（Relational Database Service）は、MySQLやPostgreSQL、SQL Serverなどのリレーショナルデータベースを簡単にクラウド上で運用できるマネージドサービスです。

:::note info
***RDSにはパラメーターグループと呼ばれる設定の集合があり、データベースインスタンスの挙動を制御するために利用されます。***
:::

本記事では、MySQL 8.0 に対応したデフォルトのパラメーターグループ（`default.mysql8.0`）の設定を AWS CLI を使って取得し、CSV 形式で保存する方法について解説します。

## 書こうと思ったきっかけ

RDSの設定を確認・管理する中で、「現在のデフォルトパラメーターの一覧を表形式で確認したい」というニーズがありました。

:::note warn
**個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**
:::

AWSマネジメントコンソールでは見づらく、またエクスポート機能も制限があるため、CLIで取得してCSVファイルとして保存・共有できる手段が欲しいと感じたのがきっかけです。

## コマンドの内容

以下のコマンドを実行することで、`default.mysql8.0` パラメーターグループに含まれる全パラメーター情報をCSV形式で出力できます。

```bash
aws rds describe-db-parameters \
  --db-parameter-group-name default.mysql8.0 \
  --output text \
  --region ap-northeast-1 \
  | sed 's/\t/,/g' > default_mysql8_0_parameters.csv
```

### 解説：
- `aws rds describe-db-parameters`：指定したパラメーターグループの設定内容を取得
- `--db-parameter-group-name default.mysql8.0`：対象のパラメーターグループ名
- `--output text`：テキスト形式で出力（TSV形式）
- `--region ap-northeast-1`：東京リージョン指定
- `sed 's/\t/,/g'`：タブ区切りをカンマに変換し、CSV形式に整形
- `> default_mysql8_0_parameters.csv`：結果をファイルに保存

## まとめ

RDSのパラメーターグループの内容をCSVで取得することで、設定の確認・レビュー・共有が容易になります。今回の方法を用いることで、設定値を一覧で見やすく管理できるようになり、トラブルシューティングや監査対応にも役立ちます。

今後は、カスタムパラメーターグループにも応用し、自動取得スクリプトなどに展開してみてください！
特定の複数コミットをcherry-pickでマージ

```sh
git checkout develop
git checkout -b develop-12345-merge-request

# 次に作業ブランチ（ここではdevelop-12345とします。）に移動してコミットログを確認します。
git checkout develop-12345
git log

# 必要なコミットのidを確認して、新しいブランチでcherry-pickします。
# 「-n」オプション指定の場合は、コミットしない
git checkout develop-12345-merge-request
git cherry-pick -n Aのコミットid Bのコミットid Eのコミットid

# リモートリポジトリに反映
git push origin develop-12345-merge-request

# develop-12345-merge-requestの内容をmasterにマージ
git checkout master
git merge develop-12345-merge-request
```
## 以下のような書き方もできる

```sh
# Aを含まないEまでのコミットを取り入れる
git cherry-pick AコミットID..EコミットID

# Aを含みEまでのコミットを取り入れる
git cherry-pick AコミットID^..EコミットID
```
(途中)空間図形「(その2/5)2025愛知公立高校入試図形 最後の問題3(3)」様を参考にsympyの三角柱で。

・(その5/5)作成中。積分は未です。

:::note info
[(その1/5) sympyとFreeCADで](https://qiita.com/mrrclb48z/items/f03cfc6a7b9375fc4b63)
(その2/5) 本ページ
[(その3/5) ３つの球の交点計算で](https://qiita.com/mrrclb48z/items/4a292fbbba5a4deab23c)
[(その4/5) 空間の座標変換の計算で](https://qiita.com/mrrclb48z/items/f414a4c36fef18c33a9f)
[(その5/5) 作成中]()
:::

　作図はありません。
＞頂点を共有する三角錐の体積は3つの辺の比の積になる...
　**Youtubeの みふゆもあ 様のコメントがワタシ的にベスト。**

＞基本に戻って...(Youtube先生より)
　水平切断もたいした事がないような気がしてきました。
　**正四角錐の体積(水平切断面の上側)+(下側)**
　**三角柱を寝かして、両端に同じ三角錐を追加するだけ。**
　∵三角柱の上面と下面が合同で、三角柱を横にしました。

・次は(その1/5)を見て下さい。
　オリジナル
　sympyのweb上での実行方法
　
# sympyで
#### ver0.1 
・Youtube先生の言われた**平均法で?真値と比較しました。**
　平均法で実用上?問題がないように思います。
　コンクリート量を扱う親方、ドボ女のおねえさん?に確認してもらえると助かります。
　積分で数量計算して、コンクリート量を誰がチェックできるんだ。と言われるかも。
　共通テストAの単元?だと、「数学と人間の活動」だと思いました。
```python
from sympy import *
var('OA,AB,m,n')
# OA,AB,n,m=12,6,Rational(1,2),Rational(2,3)
h_OA=sqrt(OA**2-((AB*sqrt(2)*Rational(1,2))**2))
# 
a_n =AB*n ;h_n=h_OA*n
a_m =AB*m ;h_m=h_OA*m
tri =Rational(1,2)*a_n*(h_m-h_n)
V1  =Rational(1,3)*a_n**2*h_n \
      +tri*a_n \
      +Rational(1,3)*tri*(a_m-a_n)
V1  =V1.simplify()
#   
a,b,a1,h,hn=a_n,a_n,a_m,(h_m-h_n),h_n        
V2  = Rational(1,3)*a**2*hn \
     +Rational(1,6)*b*h*(2*a+a1)    # くさび形の公式そのもの(普通a1<a,今回a1>a)
V2  =V2.simplify()
# 
rep={OA:12,AB:6,n:Rational(1,2),m:Rational(2,3)}
print("#",V1)
print("#",V2)
print("#",V1.subs(rep))
print("#",V2.subs(rep))
print()
rep_nn={OA:12,AB:6,n: Rational(1,2),m:Rational(1,2)}
rep_mm={OA:12,AB:6,n: Rational(2,3),m:Rational(2,3)}
rep_nm={OA:12,AB:6,n:(Rational(1,2)+Rational(2,3))*Rational(1,2), \
                   m:(Rational(1,2)+Rational(2,3))*Rational(1,2)}
rep_11={OA:12,AB:6,n: Rational(1,1),m:Rational(1,1)}
print("#",float( (V1.subs(rep_nn)+V1.subs(rep_mm))*Rational(1,2))              ,float((V1.subs(rep_11))))
print("#",float(((V1.subs(rep_nn)+V1.subs(rep_mm))*Rational(1,2))-V1.subs(rep))/float((V1.subs(rep_11))))

print("#",float( V1.subs(rep_nm)),float(V1.subs(rep)),float((V1.subs(rep_11))))
print("#",float((V1.subs(rep_nm)-V1.subs(rep))/(V1.subs(rep_11))))
# AB**2*m*n*sqrt(-2*AB**2 + 4*OA**2)*(m + n)/12
# AB**2*m*n*sqrt(-2*AB**2 + 4*OA**2)*(m + n)/12
# 7*sqrt(14)
# 7*sqrt(14)

# 28.374235183035722 134.6996659238619
# 0.016203703703703703 # 体積の平均、真値より1.6%多めにでました。
# 26.737260076322123 26.19160170741759 134.6996659238619
# 0.004050925925925926 # 平均高さでの体積は、真値より0.4%多めにでました。
```

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

# いつもと違うおすすめです。
#### Qiita 内

くさび形 体積　< google検索


https://qiita.com/mrrclb48z/items/3705e2bd4bf7cb2431bc#%E3%81%84%E3%81%A4%E3%82%82%E3%81%A8%E9%81%95%E3%81%86%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%81%A7%E3%81%99
Xcode16 突然のプレビューエラーFailedToLaunchAppError: Failed to launch

以下の自動的Preview更新を止めると治りました。![スクリーンショット 2025-04-21 20.19.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117011/cd70619f-88ec-4a81-85d6-a21ae40da250.png)

エラーログは
```
== PREVIEW UPDATE ERROR:

    FailedToLaunchAppError: Failed to launch segawa.xxx.xxx
    
    ==================================
    
    |  [Remote] JITError..........
```

おそらくある程度SwiftUI画面の構造が複雑化すると発動するみたいです。viewを切り分けたり、メソッドを見直したりしましたが治らず。上記の設定変更で一発で治りました。
ただし自動更新しなくなるので、都度、option + command + P で更新する必要があります。
動画生成AI　Veo2について

# Googleの最新動画生成AI「Veo」とは？ 特徴とAI Studioとの関連まとめ

Googleが発表した最新の動画生成AIモデル「`Veo`」について、その特徴や「`Google AI Studio`」との関連性をまとめました。
（※現時点（2025年4月）で「`Veo 2`」という名称のモデルは公式発表されていないため、最新モデル「`Veo`」について解説します。）

## `Veo`とは？

`Veo`は、Googleが開発した最先端の動画生成AIモデルです。テキストプロンプト（指示文）を入力するだけで、高品質な動画を生成することができます。Googleの持つ長年の動画生成モデル研究の集大成とされています。

## `Veo`の主な特徴・機能

`Veo`は以下のような優れた機能を持っています。

* **高画質・長尺動画の生成:**
    * **解像度:** 1080pの高画質動画を生成できます。
    * **長さ:** 1分を超える長さの動画を一貫性を保ったまま作成可能です。
* **高度なプロンプト理解能力:**
    * 入力されたテキストプロンプトの細かなニュアンスや文脈を深く理解します。
    * 「タイムラプス（timelapse）」や「空撮ショット（aerial shots of a landscape）」といった映像表現に関する専門用語も解釈し、意図した通りの映像スタイルやトーンを生成します。
* **一貫性とリアリティ:**
    * 生成される動画全体を通して、登場する人物、動物、物体などが矛盾なく、自然な動きで一貫して描写されます。
    * 非常にリアルで写実的な映像から、クリエイティブで想像力豊かな映像まで、幅広いスタイルに対応可能です。
* **編集機能（将来的な展望含む）:**
    * 単に動画を生成するだけでなく、プロンプトによる動画の追加編集や、マスク指定による部分的な修正など、高度な編集機能の開発も進められています。これにより、生成後の微調整も可能になります。
* **多様な映像スタイル:**
    * プロンプトに応じて、写実的、アニメ調、シュールレアリズムなど、様々な視覚的トーンやスタイルを再現できます。

## `Google AI Studio`との関連性

* `Google AI Studio`は、開発者が`Gemini`をはじめとするGoogleのAIモデルをブラウザ上で手軽に試したり、APIキーを取得してアプリケーションに組み込んだりするためのウェブベースのプラットフォームです。
* `Veo`は、発表当初（2024年5月頃）は「`VideoFX`」という実験的なツールを通じて、一部のクリエイター向けに限定的に提供が開始されました。
* 将来的には、`Veo`の機能がYouTube Shortsや、Google Cloudのエンタープライズ向けAIプラットフォームである`Vertex AI`といった、より広範なプラットフォームや開発者向けサービスに統合されていく計画が示されています。
* 現時点（2025年4月）で`Google AI Studio`で直接`Veo`が利用可能になっているか、具体的な提供時期については公式な発表を確認する必要がありますが、`Vertex AI`への統合が計画されていることから、開発者向けの提供は進むと考えられます。

## まとめ

Google `Veo`は、テキスト指示から高解像度・長尺・高品質な動画を生成できる、非常にパワフルなAIモデルです。プロンプトの深い理解力と映像の一貫性が大きな特徴で、多様なスタイルに対応し、編集機能も備えつつあります。

現在は限定的な提供ですが、今後`Vertex AI`などを通じて、より多くの開発者やクリエイターがその能力を活用できるようになることが期待されます。

最新の情報や具体的な利用方法については、Google AIの公式ブログやGoogle Cloudのドキュメントなどを定期的に確認することをおすすめします。
z-score

z-score：データの平均からの偏差を標準偏差で割ったものです。具体的には、以下のように計算されます：

```python

data = np.array([10, 20, 30, 40, 50])

def zscore(x):
    xmean = x.mean()
    xstd  = np.std(x)
    zscore = (x - xmean) / xstd
    return zscore

zscore(data)
```

```python

xmean = data.mean()
# xmean = (10 + 20 + 30 + 40 + 50) / 5 = 30

xstd = np.std(data)
# xstd = sqrt(((10-30)^2 + (20-30)^2 + (30-30)^2 + (40-30)^2 + (50-30)^2) / 5)
# xstd = sqrt((400 + 100 + 0 + 100 + 400) / 5)
# xstd = sqrt(2000 / 5)
# xstd = sqrt(400)
# xstd = 20

zscore = (data - xmean) / xstd
# zscore = ([10, 20, 30, 40, 50] - 30) / 20
# zscore = [-20, -10, 0, 10, 20] / 20
# zscore = [-1, -0.5, 0, 0.5, 1]

```


この関数は、データ `x` の平均 `xmean` と標準偏差 `xstd` を計算し、各データポイントの平均からの偏差を標準偏差で割ることで標準スコアを求めています。標準スコアは、データが平均からどれだけ離れているかを示す指標です。
VSCode Remote-SSH＋Dev Container：workspaceファイルを使うメリットと接続の違い

## 概要

VS CodeのRemote-SSHとDev Containers拡張機能を併用して開発環境を構築していると、以下のような違いに気づくことがあります：

- `.code-workspace`ファイルを使うと、**パスフレーズの入力が1回で済み、即座に開発コンテナへ接続できる**
- 通常の手順（SSH接続→フォルダを開く→コンテナで再度開く）では、**パスフレーズの入力が3回**必要になる

この挙動の違いを整理し、`.code-workspace`を用いる利便性や注意点を解説します.


## `.code-workspace`とは

`.code-workspace`は、VS Codeのワークスペース設定ファイルです.以下の情報などを含めることができます：

- ワークスペースに含めるフォルダの一覧（`folders`）
- Remote接続情報（`remoteAuthority`）
- ワークスペース固有のエディタ設定（`settings`）

```json
{
  "folders": [
    {
      "uri": "vscode-remote://ssh-remote+myserver/home/ubuntu/project"
    }
  ],
  "remoteAuthority": "ssh-remote+myserver"
}
```

このように記述された `.code-workspace` を開くと、VS Code は `remoteAuthority` に従って自動的にSSH接続を行い、リモートの対象フォルダを開きます.

さらに、開いたフォルダに開発コンテナで作成した `.code-workspace` を開くと開発コンテナへ接続することができます。

## `.code-workspace`の作り方

vscodeで作成したworkspaceを開きます。(開発コンテナに1度で接続するためには、開発コンテナへ接続した状態にします。)

`ファイル` -> `名前をつけてワークスペースを保存` 


![スクリーンショット 2025-04-21 19.55.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308715/ea1fa63c-5a87-428c-8a41-f5fd2af5ed8e.png)

`ローカルを表示します。`をクリックし、ローカルに`.code-workspace`を保存することができます。

![スクリーンショット 2025-04-21 20.05.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308715/fa9a4de9-d6a5-4b42-8b16-9edbc57fa232.png)

作成後に再読み込みを必要とする場合があります。

## 通常の接続手順との違い

### 通常手順：
1. 「Remote-SSH: Connect to Host...」でSSH接続 → パスフレーズ入力①
2. 「フォルダーを開く」でプロジェクトを開く → パスフレーズ入力②
3. 「Reopen in Container」でDev Containerに再接続 → パスフレーズ入力③

### workspaceファイルを使用した接続：
1. `.code-workspace`ファイルを開く → パスフレーズ入力①（初回のみ）

つまり、workspaceファイルを使えば**一度の操作でSSH接続＋開発コンテナ接続まで完了**し、**パスフレーズの入力も1回で済み**ます.

この動作の背景には、`.code-workspace`に含まれる`remoteAuthority`情報がVS Codeにとっての完全なリモート接続情報として機能し、初期化手順を省略できることがあります.


## 注意点

`.code-workspace`ファイルをローカルに用意しておくことで、以下のような利便性が得られます：

- リモート接続と開発コンテナ接続の手順が一括で実行できる
- 毎回の接続操作が簡略化される（特にVS Codeを再起動した場合）

### 注意点
- `.code-workspace`ファイルは**チームで共有しない前提**で作成すること（パスやホスト名が個人依存のため）
- **再構築が必要な場合（Dev Containerの構成変更時）は、自分で「Rebuild Container」を明示的に行う必要がある**


## Rebuildの必要性と自動化されない理由

`.code-workspace`ファイルを使用していても、以下のような変更は**自動的に反映されません**.

- `Dockerfile`の編集
- `devcontainer.json`の変更（`postCreateCommand`, `extensions`, `containerEnv` など）

そのため、開発コンテナの設定を変更した際は、再度 `.code-workspace`を作成しなおしてください.

これを行わないと、**古いコンテナがそのまま動作し続けてしまう**ため、変更が反映されず不具合や意図しない挙動の原因になります.


## まとめ

- `.code-workspace`を利用することで、リモート＋コンテナ開発を**ワンクリックで完了**できるようになります
- 再構築は手動で必要なので、Dev Containerの設定を更新した際は**忘れずRebuild**するようにしましょう
Intel CPUとThrottleStopで格闘してみた。

## はじめに
手元のSurface Laptop 3（Intel 10世代）/ 4（Intel 11世代）で、ちょっと負荷をかけると、CPUのClockがぐっと落ちて、なかなか復帰してこない症状（0.4GHz病とかいうらしい）に悩まされていました。
いろいろ探してみると、「ThrottleStop」なる、Intel CPUのtweakに使えるものをみつけたので、試してみたの記録、です。
## 「ThrottleStop」とは？
Windows用のソフトで、IntelとかのCPUの設定をtweakして、自分の使いやすいようにしてくれるソフト、という感じです。
## どこからダウンロード？
ここらへん、
https://pc.watch.impress.co.jp/docs/topic/review/1316085.html
を一読して、公式と思われる下記、
https://www.techpowerup.com/download/techpowerup-throttlestop/
から、ソフトをダウンロードしました。
## いざ、tweak！
最初は、サーマル制限の項目の「TPL」内の「PROCHOT Offset」とかを弄ってみたのですが、どうも芳しく無くでした。
PL1、PL2なる設定を弄って、サーマル制限に当たらないようにはできたのですが、今ひとつ、動作がもっさりするような、です。
色々調べて試して見ると、どうも、
- メイン画面の「Speed Shift EPP」
- 「TPL」ボタン内：
  -  「Speed Shift (Min/Max) 」
  - 「Power Balance」
  - 「Turbo Time Limit」

が、自分のPCでは効果があることに気づきました。
### 各設定について
- 「Power Balance」：
    0-15が設定可能範囲、0がmax performance、15がmax powersaving、7がbalance、とのこと。[cf1]
    この7に設定してtweakをスタートしたらいい感じの結果にたどり着けました。
    今回のPCではこれが肝でした。
    自分は0（SurfaceLaptop3）、4（SurfaceLaptop4）で様子見中です
- 「Speed Shift (Min/Max) 」：
    Minの方は数字が小さいほうが、低いclockまで落とし、Maxの方は数字が大きいほうが高いclockまで上げる感じでした。
    可変可能な幅がPCによって違うみたいです。（表示される）
    自分は、最小値は4、最大値は、25（SurfaceLaptop3、37が上限）、30（SurfaceLaptop4、42が上限）
- 「Speed Shift EPP」：
    0-255の範囲で設定可能。既定値は128。
    数字が大きほど、clockの上げ下げの動作がもっさりしました。
    自分は80にしました。
## tweakの結果・・・
結果、Surface Laptop 3で74℃、Surface Laptop 4で67℃くらいに抑えつつ、自分の欲しいパフォーマンスを得ることができました。
条件が出てきたら、細かいtweakとして、PL1、PL2の設定を再度弄ってみると、という感じでした。
### 余談
自分のSurfaceLaptop3/4では、undervoltingの項目はグレーアウトしていて弄れる箇所がほとんどありませんでした。（結果、さらなる沼にハマらずに済んだ？）
## わかったこと
- 今回のSurface Laptop 3/4では、どうも、「Speed Shift」（昔のIntel系CPUの「SpeedStep」というクロックとかを可変する仕掛けの、Skylake世代以降の仕掛け？）の設定がいけてないため、「PROCHOT」なるサーマル制限に突入しやすくなっていた様子であることがわかりました。
- 「ThrottleStop」の「Limit」表示機能、何の種類の制限（「Limit」）に引っかかったのかを表示する機能、が地味に便利でした。
- 並行して、これらの「Limit」が何なのかをネットで調べたところ、IntelのCPUの格闘向け資料 [cf1] とか、Linuxのそういった資料 [cf2][cf3] にたどりつくことができました。
- [cf3]から、linuxでも同様の症状が起きた場合に、解決の目処が立ちそうな感触を得ました。

[cf1] https://www.techpowerup.com/forums/threads/intel-power-balance.280291/
→ Intel公式）https://software.intel.com/content/www/us/en/develop/download/intel-64-and-ia-32-architectures-sdm-volume-3b-system-programming-guide-part-2.html
[cf2] https://docs.kernel.org/admin-guide/pm/intel_epb.html
[cf3] https://askubuntu.com/questions/337147/throttlestop-for-ubuntu
## おわりに
この記録が、同様なことで悩んでおられる方の参考になれば幸いです。

## 履歴
20250421、1.0版
20250422、1.1版、数値を追記。
GraphRAGのワークフロー

# GraphRAGの概要
### GraphRAGとは
Neo4j等のGraphDBを使ったRAG(検索拡張生成)のこと。

### 従来型RAG(vectorRAG)の問題点
従来のRAG(vectorRAG)では、ドキュメントの局所的な内容に対する回答には対応できるものの、全体を俯瞰した参照が必要な質問への回答ができなかった。

### GraphRAGでできること
ドキュメント全体を横断的に参照する必要がある質問、例えばドキュメントの概要説明に回答できたり、ドキュメント内の用語ごとの関連性など、全体的な文脈を踏まえた読解が必要となる内容への質問に回答することができる。

### なぜそんなことができるか
ドキュメントに記載されている文章そのものに加え、ドキュメント内の部分同士の関連性を表現できるため、従来型のRAGに比べてドキュメントから抽出する情報の損失を大幅に減らすことに成功している。

# GraphRAGのワークフロー
### vectorRAGのワークフロー
vectorRAGでは、対象ドキュメントをチャンキング(切り分け)したのちベクトル化(Embedding)、それをvectorDBとして組み込む。そして、ユーザー入力(問い合わせ、query)とのベクトル類似度が高いチャンクを検索結果とし、LLMのpromptに組み込む。そのため、ドキュメント内でLLMが参照できる情報は、チャンクに含まれるごく一部のテキストに限られる。

```mermaid
graph TB
    A[Source Documents]--Text Extraction 
    and chunking-->B[Text Chunks]
    B--Embedding-->C[vector DB]
    C--Generate Answer-->D[Answer]
```

### GraphRAGのワークフロー
GraphRAGは、特にチャンキング後の処理がvectorRAGと大きく異なる。
1. Entities & Relationships
各チャンクをドメイン(ドキュメントの専門領域や組織内での特殊な文脈など)を踏まえて要約する(Entities)。更に、各ドメイン同士の関係、関連を結び付ける(Relationships)。
1. Knowledge Graph
全てのドメイン同士の要約、関係をGraphとして結びつける。
1. Graph Communities
作成したKnowledge Graphから、コミュニティーを検出する。検出アルゴリズムは論文上、Leiden community detection(Traag et al., 2019)を採用。
1. Community Summaries
検出したCommunity単位での要約を実施。
1. Community Answers
ユーザークエリ(問い合わせ)の内容に対して、各Communityごとに要約回答を生成。
1. Global Answer
Community Answersを総括し、ドキュメント全体でのユーザークエリに対する回答を生成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2877760/9cfaa6e8-1436-455d-8d46-cbcf7b70aca0.png)



## reference
From Local to Global: A GraphRAG Approach to Query-Focused Summarization
https://arxiv.org/pdf/2404.16130
学習記録(Bランク：文字列３)

## 今回の問題
https://paiza.jp/works/mondai/b_rank_new_level_up_problems/b_rank_new_level_up_problems__leet_paiza

入力文字列から、指定文字列の完全一致かleet一致(a→@のような揺らぎ)の部分を見つける問題。
当初はsubstringで一文字ずつ切り出して判定するロジックを考えましたが、めちゃめちゃな入れ子になりそうだったため断念。
leetの組み合わせは54通りと少ないので、あらかじめ洗い出してから探し出すロジックにしました。

## 私のコード

```java 
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.next();
        //leet候補をすべて洗い出す
        List<String>leets = new ArrayList<String>();
        String[]a = {"a","4","@"};
        String[]i = {"i","1","!"};
        String[]z = {"z","2"};
            for(int j = 0;j < a.length;j++){
                for(int x = 0; x < i.length;x++){
                    for(int y = 0; y < z.length; y++){
                        for(int zz = 0;zz < a.length;zz++){
                            leets.add("p" + a[j] + i[x] + z[y] + a[zz]);
                        }
                    }
                }
            }

        if(str.contains("paiza")){
        //文字列に[paiza]が含まれる場合
            System.out.println("paiza");
            return;
        }else{
            for(int ii = 0; ii < leets.size();ii++){
            //文字列にleetが含まれる場合
                if(str.contains(leets.get(ii))){
                    System.out.println("leet");
                    return;
                }
            }
        }
        //上記に該当しなかった場合
        System.out.println("nothing");
    }
}
```

## おわりに
このコードでも問題なくクリアしましたが、正答例を見たところもっと凝ったソースになっていました、、
私的には、ある程度冗長でもひとつひとつの処理がわかりやすいコードのほうが好みなんですが、実際どちらが良いんでしょう?
GitHubの新しい課金設定でLFSのエラーを解消する

# はじめに
GitでLFSを使用したPushをGitHubにした際、以下のエラーが出ました。
~~~
Uploading LFS objects:   0% (0/100), 0 B | 0 B/s, done.
batch response: This repository exceeded its LFS budget. The account responsible for the budget should increase it to restore access.
~~~

# 解決法
GitHubで`Settings -> Billing & Licensing -> Budgets and alerts` で予算を設定する。今回は`Git LFS`を設定した。


# 原因
GitHubのLFSを無料枠以上使用するのに以前はサブスクの購入が必要でしたが、新しくなって従量制課金になりました。今までサブスクしてたのですが、引き続き使用するには、予算を設定する必要があるようです。
ASP .NET Core Tips - 配列データのformをpostする際の注意点

# 概要
ASP .NET CoreでWebアプリの開発していた際に起こったエラーの解決方法の備忘録。

# 環境
Visual Studio 2022
ASP .NET Core

# 発生したエラー
配列データを表形式で表示して、ユーザーにデータを入力してもらうWebアプリを開発。
列数が設定によって増減するんですが、列数が多くなると、Submitした際になぜかBad Request（400）が返ってくる現象が発生。
検索してみると、キャッシュやサイズの問題ではという情報もありましたが、今回は4～5桁の数字なのでデータサイズの問題ではなさそう。キャッシュをクリアしてもエラーが発生する状況。

# 理由と対処方法
ASP .NET Coreでは、formに対して様々な制限が設定されているとのこと。

[RequestFormLimitsAttribute クラス](https://learn.microsoft.com/ja-jp/dotnet/api/microsoft.aspnetcore.mvc.requestformlimitsattribute?view=aspnetcore-9.0&wt.mc_id=AZ-MVP-4028478)

今回引っかかった制限は、データサイズではなく、inputタグの数。
postされたデータ数がValueCountLimitプロパティによる上限を超えたことにより、エラーとなっていました。
ControllerのPOSTメソッドに上限を変更するアトリビュートを追記することで、エラーを回避できました。

``` C#
[HttpPost]
[RequestFormLimits(ValueCountLimit = 2048)]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(XXXXViewModel xxxxDatas)
{
    ・・・
}
```

デフォルトが1024だそうです。
inputタグの数なので、表示されていない項目（type=hiddenとなっているinputタグ）も対象となっています。
配列データを扱うときは、inputタグの数がリミットを超えないかを確認しなきゃですね・・・。
システムの質が上がってきたから運用コストにも目を配ってみる

# はじめに
開発している生成AIを用いたソリューションの精度がかなり向上してきたので、コストを気にするようになりました。
一概にコストをかければいいシステムというわけではなく、以下のような要素が常に絡む為、三すくみのような

## LLMをどれにするか
RAG技術を用いたシステムを作る場合、LLMをAPI連携で利用することはほぼ必要不可欠だと思います。（オンプレでLLMを導入した場合を除く）

それに伴って、入口はCohereやOpenAIを活用していましたが、どうしてもOpenAIではコスト面が圧迫してきたのでいろいろと検討した結果、GeminiをメインLLMにしました。

まずは理由の一旦となる2025年現在のLLMの100万トークン辺りの金額を以下にまとめてみました。
<dl>
<dt>　　LLM名　　　　入力金額　　出力金額<dt>
<dd>ChatGpt4o 　　　 5ドル　　　15ドル<dd>
<dd>Claude3.7-Sonnet　3ドル　　 15ドル<dd>
<dd>Gemini2.5-pro　　1.25ドル　 10ドル<dd>
<dd>Gemini2.0-flash　　0.1ドル　 0.4ドル<dd>

並べてみるとわかりやすいのですが、Geminiが群を抜いてやすいです。
ChatGPTと比較すると、入力出力で約3分の1ほどになります。

それに加えて、Gemini2.5-proは推論にもたけているからなのか、根拠資料を提示することもなんなく応えてくれます。

弊社システムのことを質問した際の例として以下のような回答をくれました。

---------------------------------------
3.  宛名照会画面のDVタブでの確認

    個人の宛名照会画面には「DV」タブがあります。
    このタブをクリックすると、「個人宛名照会DVタブ画面」に移動し、DV支援措置の申請に関する情報（支援措置区分、支援対象者申出者、併せて支援を求める者など）や、独自支援措置対象者情報、特別事情情報、処理注意者情報などが表示されます。
    複数の履歴がある場合は、履歴プルダウンで切り替えて確認することも可能です。
    （根拠情報[DV支援情報を管理する.txt], [宛名情報を検索・照会する.txt]）
---------------------------------------

ここに更に根拠資料を表示していると、RAGシステムとして信頼できるシステムとなります。

## トークン数について
RAGを用いた技術において、もっとも金額が発生するのは入力トークンです。
ここを少なくすることでコストを軽減することが出来ます。

しかし、一方で入力トークンを制限をするのは与える情報量を減らすということにつながります。それは、RAGシステムにおける回答生成の質を下げることに他ならない為、ここを調整するには減らすタイミングを見誤らないようにする必要があります.

そこで今回わたしが対応したこととしては、プロンプトから判断し質問の内容が幅広いか参照範囲を細かくする必要があるか、などのいくつかの指標を用いて取得するテキストの数を変動させるというものです。

その為、プロンプトからLLMを用いて、取得テキストの数を判断させております。
実際に使用した前提条件は以下です。

~~~
あなたはプロンプト解析の専門家です。
以下に与えられた「質問内容（プロンプト）」を分析し、次の3点を判定してください：
1. この質問は、何個の質問が含まれていますか？（1〜3の範囲で数字で出力してください）
2. 質問のタイプを分類してください（以下のいずれかで答えてください）：
- 定義（意味を聞いている）
- 要約（長文の要約を求めている）
- 比較（複数の項目を比較している）
- 列挙（いくつかの要素を挙げている）
- 判断（「どれが良いか」などを問う）
- その他（分類できない場合は自由記述）
3. この質問は、どれくらいの広さの情報を必要としますか？
- 狭い（単一の情報で済む）
- 中（2〜3文書くらい）
- 広い（複数の視点からの情報が必要）
最後に、上記の結果に基づいて、`top_n` の値として何件が適切かを整数（例: 5, 10, 15）で答えてください。
top_nの最低は5とします。
~~~

微調整中ではありますが、この処理を挟むことで不要に多くのテキストを抽出しないようになりました。

# トークン数から金額を計算する
API連携ではトークン数を出力することが可能です。
これは、各API連携においてすべて準備されている機能です。

先述したように100万トークン辺りの金額ですべて金額が設定されており、計算することが可能です。これを画面で表示することが可能となっており、社内のシステム管理者のみこれを参照することが可能としており、利用団体様がどの程度利用しているか、一目で把握できるようになっております。

金額を正確に把握し、適正な金額をサービスとして設定することで運用コストが高すぎるのか、安いのかを把握可能です。

是非、システム導入時にはこのような配慮にも気を配ってください。

# まとめ
生成AIを用いたシステムは、API連携が必須といっても過言ではありません。
その中でシステムにおいてトークン数による利用コストは、切っても切り離せないものです。それを正確に把握し、運用コストとシステムの質を天秤にかけながら、システムをより使いやすいものにしていきましょう
ローコードツールWebPerformerについて特徴を解説

## はじめに
最近WebPerformerというローコードツールを業務で使用しており、ノウハウも蓄積してきたので、その技術共有として記事を書こうと思います。

## WebPerformerとは
キャノンITソリューション株式会社が販売しているローコードツールです。
その名の通り、Webアプリケーション開発を円滑に行うためのツールであり、それらに適した機能を持ち合わせています。

## 特徴
### 1.Eclipseのプラグインとして導入する。
年間ライセンス費を払うことでWebPerformerアプリケーションのビルドが可能に。

:::note info
参考:[公式の価格帯](https://www.canon-its.co.jp/corporate/newsrelease/2024/pr-0117)

:::

### 2.MVCモデルによる設計
データ先行という考え方で設計します。DBにあまり馴染みが少ない方には接しづらい反面、ローコードツールだから初心者でもMVCモデルの考え方を覚えるのに適している、という捉え方もできます。

:::note info
Q:データ先行という考え方とは？
A:WebPerformerではまずデータ自体がどうあるべきか？という考え方で製造を進めていきます。MVCモデルの流れで例えるならば、M→C→Vという順序になります。それがデータ先行という考え方ですね、
:::

### 3.ドラッグ&ドロップでの画面デザイン
テキストフィールドやボタンの配置など、HTMLを直接記述せずともデザインができます。フリーフォーマットで配置するわけではないので、誰が作成してもレイアウトにある程度のまとまりが出来ます。
### 4.外部データベースとの接続
AWS上に構築したPostgreDBとの接続やオンプレミスでのDB接続など、開発環境と本番環境で参照するDBを変える、という事も可能です。
### 5.JavaおよびJavaScript、JSPを用いたカスタマイズ性
恐らく最大の特徴と言えるでしょう。バックエンドの処理(例えば外部API連携)をJavaで記載したり、フロントエンドの処理(例えばボタン押下時の制御)をJavaScriptで記載したり、WebPerformerというローコードツールの上ではありますが、非常に高いカスタマイズ性を誇れる要素の一つでしょう。

:::note info
またWebPerformer側でもJavaの拡張インターフェースが用意されています。
:::

### 6.Tomcat環境下での開発およびデプロイ
Webアプリケーション開発といえばTomcatですね。勿論ローカル環境での動作確認もTomcatを使います。

## 長所
### 1.ドラッグ&ドロップでの画面デザインが主となるため、Webデザイン知識が浅くとも画面製造ができる。
プレビュー機能も備えているため、作成した画面がどうなるか？というのを即座に確認できるの大きな利点でしょう。
### 2.Javaをベースとしてアプリケーションを生成するため、Javaの機能をそのままWebPerformer上に実装することができる。またJavaScript、jspの実装も可能
特徴で述べた通り、カスタマイズ性は非常に高いのは長所と言えるでしょう。
### 3.Eclipseが土台となるため、操作性が馴染みやすい。
最も大事なことだと思います。自身の使いやすいパースペクティブに変更するのが一番でしょう。
なおWebPerformer用のパースペクティブはインストール時に定義されています。

## 短所
### 1.実装した動作の確認に時間を要する
画面のプレビュー機能はあるが、実動作を確認するには都度コンパイルする必要があるため、規模の大きいプロジェクトになるほど微修正の確認に時間がかかります。
### 2.WebPerformer独特の挙動を覚える必要がある
画面の入力項目を保持するためには、KEEPといった処理や、WORKAREAといった独特のメモリ管理を駆使する必要があり、そしてそれはメモリ領域を食らいつくしてしまいます。

:::note warn
KEEPとは次画面遷移の際に値を保持する処理です。メモリを食います。

WORKAREAは値を保持し続けるための、WebPerformer独自のセッション領域のことです。自動開放されないので解放しないとメモリを食べ続けます。

ある程度メモリを意識しないと、WebPerformerで作成したアプリケーションは重いものになってしまいます。

:::

### 3.デザインしやすいが制約が多い
例えばテキストをそのまま画面に表示する機能はありません。
また色彩面やレイアウトは、CSSで微調整するのが大半になります。

:::note warn
自動生成されたHTML(classのid)に対してCSSで微調整するという使い方になるため、1要素に対して1スタイルを記述することになります。
スタイルの使い回しがしづらいところもネックの一つでもあります。

:::

### 4.無償ライセンス期間が一か月
そのため個人学習に適しづらく、業務内で覚えざるを得ないです(公式ハンズオンがあるとはいえ)
私としては一番何とかして欲しい部分だと考えております。窓口が狭い…
それ故にこういうQiitaの記事で、実際に画像をキャプチャーしてつまりこういうことですよ！って紹介が出来ないのも難点です。

## おわりに
ローコードツールは過去にServiceNowを携わっていたのですが、ServiceNowの都合上顧客要望に応えることはできない事が多々ありました。
その点WebPerformerでは、癖こそはあれどカスタマイズ性に関しては高いローコードツールではないかと思います。
「ヤコビアンと こしあんとつぶあんの違いを教えて下さい。」をAI先生に聞きました。

・ChatGPT先生の返しのギャグ?回答に、人間の私がついていけませんでした。
最近のChatGPT先生は、話し上手?話し好きの気がします。

# (本日の)ChatGPT先生へ(1回目)
#### 質問リスト
・質問リストの追番は無視して下さい。１個ずつです。途中の回答表示は省略しています。
```
# 質問リスト  
1. こしあんとつぶあんとヤコビアンの違いを教えて下さい。  
2. 世界線?  
3. タイムリープ　アニメ　は何ですか。  
4. 私の質問をMarkdown形式でリスト化して出力して。Markdown形式でリストからアスタリスクは削除して。1行目に、# 質問リスト　の文字を出力して。追番と本質問を追加して。  
```
>ChatGPT:
面白い組み合わせですね！それぞれ全くジャンルが違うものですが、わかりやすく説明してみます。
...
まとめると：
こしあんとつぶあんは甘味界のライバル。
ヤコビアンは数式界の黒幕みたいな存在。
言うなれば、「どら焼きを食べながらヤコビアンを計算していたら、つぶあん派かこしあん派かで議論が始まった」みたいな世界線ですね。
もっと詳しく知りたいのがあればどれでも掘り下げますよ！

あなた:
世界線?
>ChatGPT:
お、そこに引っかかってくれたのうれしいです！
...

# (本日の)ChatGPT先生へ(2回目)
#### 質問リスト
```
# 質問リスト
1. ヤコビアンとこしあんとつぶあんの違いを教えて下さい。
2. 私の質問をMarkdown形式でリスト化して出力して。Markdown形式でリストからアスタリスクは削除して。1行目に、# 質問リスト の文字を出力して。追番と本質問を追加して。
```
>...
ちなみに、数学者がまちがえて「ヤコビあんぱん」とか言ったらシュールですね（笑）
他にも混ざりそうな言葉があったら、いつでも聞いてください。
...
# Gemini先生へ

# copilot先生へ

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

https://qiita.com/mrrclb48z/items/b6351b48e47bcf6265c0

# いつもと違うおすすめです。
### wikipedia

https://en.wikipedia.org/wiki/Jacobian_matrix_and_determinant

https://ja.wikipedia.org/wiki/ヤコビ行列

### きっかけ
＞キャッチーなタイトル...
＞1つは、トレンドに乗ることの...
???

https://qiita.com/zukki2/items/232ecb5382fe3fb16575
Gemini 2.5 Flash をお試し

## Gemini 2.5 Flash が出ました
Google Cloud Next 25 が開催されてから間もないですが、Gemini 2.5 Flash が Google AI Studio および Vertex AI 経由でプレビュー版として利用できるようになりました！

このモデルは 2.0 Flash の速度を基盤としながらも、推論機能が向上し、コスト効率にも重点を置いているとのことです。

主な特徴は以下です。

• <B>ハイブリッド推論</B>：Gemini 2.5 Flashは、ハイブリッド推論モデルであり、開発者は思考 (thinking) のオン/オフを切り替えることができます。

・<B>複雑な推論に優れる</B>：複雑で複数ステップのタスクでは、思考 (thinking) によって回答の精度が向上します。

・<B>調整可能な思考予算 (thinking budget)</B> ：思考予算 (thinking budget) を設定することで、品質、コスト、レイテンシの適切なトレードオフを見つけることができます。必要な場合にのみ推論機能の料金を支払うことができます。

詳細はこちらからどうぞ。

https://developers.googleblog.com/en/start-building-with-gemini-25-flash/

## 試してみる
それでは実際に触ってみたいと思います。今回は Google AI Studio から確認します。Chat を開き、モデルの選択をすると、Gemini 2.5 Flash（04-17バージョン） が出てきました！

![google_ai_studio_gemini_2.5_flash_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1602803/26964f19-8be7-4063-bf0b-76edd9698554.png)

Thinking と Non-thinking で Output の価格が異なるみたいです。

Thinkingと Non-thinking の設定、Thinking budget の設定は画面右側のトグルスイッチで切り替えることができました。

![google_ai_studio_gemini_2.5_flash_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1602803/b1751ce1-d4ff-4782-9db5-4f0503b5dfe4.png)

それではお試しで動かしてみます。Thinking mode をオン、Thinking budgetをオンとして、プロンプトに ”nの2乗が偶数であるとき、nも偶数であることを証明してください。"とプロンプトに入力し、実行しました。

するとGemini 2.5 Flash からは以下のような回答が返ってきました。(長かったため途中省略していますが）背理法と対偶による証明を回答してくれました。思考時間は5.0秒、回答までの時間は10.6秒でした。

![google_ai_studio_gemini_2.5_flash_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1602803/261156e3-5294-4b4e-8d22-6b74f7fbe6df.png)

![google_ai_studio_gemini_2.5_flash_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1602803/b4f1b897-6cd9-47e7-853c-7df321804f2e.png)

ちなみに同じ質問をGemini 2.5 Pro Previewで実行してみたところ、思考時間は11.0秒、回答までの時間は14.6秒となり、Gemini 2.5 Flash の方が回答までの時間が早かったです。



## まとめ
Gemini 2.5 Flash は、レスポンスが速く品質の良いものを低価格でお届けする、というバランスの取れたモデルとなってるのかなと感じました。
現在プレビュー版とのことですので、興味のある方はお試しください。
単価が発注日適用です。

发注日（伝票日付：EKKO-BEDAT）决定单价。
「購買情報マスタ」可以定义价格的有效期间，发注日（伝票日付：EKKO-BEDAT）在有效期间内，则连过来价格。
具体确认：新规一个PO，输入品目号后会自动出来购买情报号，双击一下进入购买情报画面。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/63a740ba-8c45-41b6-82d5-483cd1a630c4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/903c1584-c798-4f32-8f1f-987c38e0518f.png)

点购买情报-变更，改成变更模式
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/f9d89b0d-ce22-49c4-9bef-47c4a9517f04.png)

条件を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/a9b9834a-55b2-4364-a44f-f564e4c6b279.png)

进入条件变更画面，可以修改开始终了日期
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/b7ced43e-1214-4e73-a254-121d7d89c07b.png)
入力4/23的时候可以把价格带出来，4/21不可以带出来
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/88b2b276-06a3-4444-8c5a-7559e4693e05.png)
ZigBeeとは

## ZigBee
ZgiBeeとは、Bluetoothと同じ2.4GHz帯を用いる近距離無線通信で、消費電力が少なく、伝送が比較的低速であるという特徴があり、センサネットワークへの応用が進められている。


**※Bluetooth**
携帯電話などのモバイル端末とヘッドセットなどの周辺機器とを接続するための近距離の無線通信として使われる。
クアント投資のためのPythonトレーニング！

こんにちは、韓国在住のsanaです！
週末はどのように過ごしましたか？
今日はPythonプログラミングで、「独自のデータ分析ツール」を作れる講座を紹介します！
Pythonを学習したはいいもののどのように活用していけばいいかわからないと悩んでいる方！
Pythonの技術で金融データ分析してみませんか？　Pythonってできないことないんですね…（笑）
知れば知るほど幅広くてびっくりしています！
この講座８日間限定で無料視聴できるので、プログラミング以外でPythonの技術応用してみたい方はぜひ見てみてください！（同期間中は全講座３０％off！！）

https://u.inf.run/4in6i7Z

https://www.inflearn.com/ja

また私の人気記事もチェックしてくださるとうれしいです！！

https://qiita.com/sana89/items/9398c4873676d1a5a9a6

https://qiita.com/sana89/items/3fbb96b592f709e3e087

今週も頑張りましょう！　ファイティン～！
重複を削除する手法 【比較、Set()】

今日はPaizaの「重複削除して出力」問題に挑戦してみた。


## <br>🧩 問題概要

- `N` 個の要素からなる昇順の数列 `A` が与えられます。
- 重複を削除して昇順に出力してください。

<br>入力例:
```
6
1 2 3 3 4 5
```
出力例:
```
1 2 3 4 5
```
<br>

https://paiza.jp/works/mondai/data_structure/data_structure__set_step2

## <br>🔸 方法①：前の数値と比べて違うときだけ出力
```js
const rl = require('readline').createInterface({ input: process.stdin });
const lines = [];

rl.on('line', input => lines.push(input));
rl.on('close', () => {
    const N = Number(lines[0]);
    const A = lines[1].split(' ').map(Number);


    // 結果を格納するための配列（重複なし）
    const result = [];

    // 直前に見た値を保持する変数（最初は null にしておく）
    let prev = null;

    // 配列 A の各要素を順にチェック
    A.forEach(num => {
    
    // 直前の値と違う場合のみ、結果に追加
    if (num !== prev) {
        result.push(num); // 重複していない値を追加
        prev = num;       // 現在の値を次のループの比較用に保存
    
    }

    console.log(result.join(' '));
    
});
```
✅ ソートされてる前提を利用して、隣り合う要素だけ見ればOK。

✅ メモリ効率も良く、`Map`や`Set`を使わずにすむ。

## <br>🔸 方法②：Set を使う
```js
const rl = require('readline').createInterface({ input: process.stdin });
const lines = [];

rl.on('line', input => lines.push(input));

rl.on('close', () => {
    const A = lines[1].split(' ').map(Number);
    const unique = [...new Set(A)]; // Setで重複削除

    console.log(unique.join(' '));
});
```
✅ `Set` は自動的に重複を排除してくれる。

⚠ ソートは保証されないけど、元の配列が昇順だからそのまま出力してOK！


### <br>✨ 超ざっくり一行で書くと？
```js
console.log([...new Set(lines[1].split(' '))].join(' '));
```

## <br>🎓 まとめ
「重複を削除」って一見シンプルだけど、方法によって全然コードの印象が変わる！

<br><br>[僕の失敗談と解決話！](https://paizabeginner.wordpress.com/2025/04/21/paiza%e3%81%a7%e5%9f%ba%e6%9c%ac%e3%83%9e%e3%82%b9%e3%82%bf%e3%83%bc-%e9%87%8d%e8%a4%87%e3%82%92%e5%89%8a%e9%99%a4%e3%81%99%e3%82%8b3%e6%89%8b%e6%b3%95%e3%80%90set%e3%80%81%e6%af%94%e8%bc%83/)

## <br><br>おまけ解説
`[...new Set(A)]` は、重複のない配列を簡単に作れる魔法のような一文✨

一つずつ分解！

✅ `Set(A)` の意味
```js
new Set(A)
```
<br>

`Set` は 重複のない値だけを保持するコレクション型。

たとえば：
```js
const A = [1, 2, 2, 3];
const s = new Set(A); // Set(3) {1, 2, 3}
```
<br>

✅ ポイント
- `Set` に同じ値を2回入れても1個にまとめられる！
- 順序は 最初に出てきた順 を保ってくれる。

<br>✅ `[...Set]` の意味
```js
[...new Set(A)]
```
これは「`Set` を配列に戻す」って意味。
`...`（スプレッド構文）は、中身を取り出して展開してくれる。

たとえば：
```js
const s = new Set([1, 2, 3]);
const arr = [...s]; // [1, 2, 3]
```
<br>

✅ 全体まとめると
```js
[...new Set(A)]
```
これは、
- 配列 `A` を `Set` にして重複を除き
- 再び配列に戻す

つまり「`A` から重複を除いた配列を作る」ってこと！
メインアプリが落ちたら自動的に再起動する

質問：「組込みLinuxでメインアプリが落ちた場合、自動的に再起動するように設計するのが普通ですか？」
以下はChatGPTの回答。

---

はい、**組込みLinuxの世界では「メインアプリが落ちたら自動的に再起動する設計」が“普通”です。**  
むしろ「それが前提」と言ってもいいくらいです。

理由とよく使われる方法、両方見ていきましょう👇

---

## ✅ なぜ再起動が必要なのか？

組込み機器では：

- **無人環境で動作することが多い**
- **エラーがあっても止まると困る**
- **信頼性・連続稼働時間が重要**

という特徴があります。

➡ 一度アプリが落ちても「誰かが手で再起動する」なんてことは想定しません。  
**自動で復旧して、できるだけ早く通常動作に戻す必要がある**んです。

---

## 🔧 よく使われる自動再起動の方法

### ① systemdの`Restart`オプションを使う（標準的）

組込みLinuxでも今や多くが`systemd`ベースになっています。  
`.service`ファイルにこう書くだけで再起動できます：

```ini
[Service]
ExecStart=/usr/bin/my_app
Restart=always
RestartSec=2
```

- `Restart=always`：常に再起動
- `RestartSec=2`：2秒待って再起動

➡ **最も一般的かつ安全な方法です。**

---

### ② `watchdog`プロセスやスクリプトで監視して再起動

もし systemd を使わない軽量構成（BusyBox + initなど）なら、  
以下のような**簡易監視スクリプト**を書くのもアリです：

```bash
#!/bin/sh
while true; do
  if ! pgrep my_app > /dev/null; then
    echo "App is down. Restarting..."
    /usr/bin/my_app &
  fi
  sleep 5
done
```

➡ スタートアップスクリプトから起動すればOK。

---

### ③ `supervisord`などのプロセス監視ツールを使う方法も

軽量の監視デーモン `supervisord` なども使われます（Python系に多い）。

---

## 🚨 再起動するだけで本当に安全？

それは場合によります。  
落ちた原因が**一時的なメモリ不足やI/Oエラー**なら再起動で回復しますが、

- **繰り返し落ちるバグ（例：初期化失敗）**
- **ハードウェア異常**
- **設定ミス**

のような場合は、**再起動してもまたすぐ落ちる**ことがあります。

→ そのため：

- **ログ記録は必須**
- **再起動回数に上限を設けて“永久ループ”を防ぐ**
- **watchdogタイマと連携してシステム全体を再起動する構成**

などが採用されます。

---

## ✅ 組込みLinuxでのまとめ

| 項目 | 説明 |
|------|------|
| 再起動設計は必要？ | **Yes（標準的）** |
| 一番簡単な方法 | `systemd`の`Restart=always` |
| その他の方法 | `watchdog`, スクリプト, `supervisord` |
| 注意点 | ログと再起動ループ防止、原因調査が大事 |

---

もし `systemd` サービスファイルのサンプルが欲しかったら、  
具体的なアプリ名にあわせてテンプレ作ることもできますよ👍

組込み用の監視と自動復旧って、かなり奥が深い分野です✨
Linuxのパーミッションを理解する - rwxの意味とchmodコマンドの使い方

# パーミッションとは？

パーミッションとはファイル、ディレクトリに設定された
**「読む・書込み・実行」の３つの権限**のことをいいます。

そして、この権限は

- 所有者
- 所有グループに属するユーザー
- その他のユーザー

に対してそれぞれ設定されます。

- ログインしているユーザーの表示は`whoami`コマンド
- ユーザーのリストは`cat /etc/passwd`コマンドで確認ができます。

## 所有者・所有グループとは？？

ファイル・ディレクトリを作成したユーザーが所有者となります。
そして所有者のプライマリグループが所有グループとなります。

```bash
$ ls -l
-rwxrw-r--  1 root   root   970775 Feb  7 00:47 hoge.php
```
最初の root が所有者、2番目の root が所有グループとなります。

所有者を変更する場合は `chown` (change owner) コマンド
所有グループを変更する場合は `chgrp` (change group) コマンド

を実行します。

:::note info
プライマリグループとは
各ユーザーは必ず1つのプライマリグループ（主グループ）に所属しています。
これは、ユーザーが作成されたときに自動的に割り当てられるグループです。
:::

## ファイルのアクセス権

ファイルのアクセス権は

- 所有者
- 所有グループに属するユーザー
- その他のユーザー

に対して3つの権限を設定します。

- 読み取り = r(Read)
    - テキストファイルを開いて内容を読む権利（cat、less、more コマンドでファイルの内容を表示ができる）
- 書き込み = w(Write)
    - テキストファイルを編集して保存する権限
- 実行 = x(eXecute)
    - シェル、プログラムの実行権


先ほどのコマンドを例に見てみましょう！

```bash
$ ls -l
-rwxrw-r--  1 root   root   970775 Feb  7 00:47 hoge.php
```

最初の10文字`-rwxrw-r--`がパーミッションを示しています。

1. 一文字目の`-`はファイルの種類になります。

- `-` 通常のファイル
- `d` ディレクトリ
- `l` シンボリックリンク（ショートカットのようなもの）

2. 続いて`rwxrw-r--`の9文字は3つに分けて権限を表しています。

- `rwx` 所有者の権限
    - 読み取り・書き込み・実行が可能
- `rw-` 所有グループの権限
    - 読み取りと書き込みが可能（実行不可）
- `r--` その他ユーザーの権限
    - 読み取りのみ可能

## アクセス権は数字で表示されることもある

先ほどの`rwxrw-r--`は`764`とも表記されます。

- 読み取りは 4
- 書込みは 2
- 実行は 1

となるので`rwx`は合計すると7になるということです！

例：
rwx = 4 + 2 + 1 = 7
rw- = 4 + 2 + 0 = 6
r-- = 4 + 0 + 0 = 4


## ディレクトリのアクセス権

ディレクトリのアクセス権は基本的にファイルと同様ですが、
一部ややこしい箇所があります！

```bash
ls -ld lang
drwxr-xr-x 15 root root 4096 Jan  8 05:13 lang
```

- ディレクトリ読み取り権（r）
    - lsコマンドでフォルダの中身を参照できます。
- ディレクトリ書き込み権（w）
    - 設定されたフォルダ内で新しいファイル・フォルダの作成、変更、削除ができます。
    - ただし、実行権限（x）がないとこれらの操作は実行できません。
- ディレクトリ実行権（x）
    - ディレクトリにcdで移動ができます。

ややこしいのですが、WとXはお互い依存していて
書込み権限があっても、実行権がないと作成・編集・削除が実行できないのです！

例えば `r-x` の権限では
ディレクトリの中身を見たり移動したりできますが、
ディレクトリ内のフォルダ・ファイルを編集することはできません。

## パーミッションの変更

パーミッションを変更するには `chmod` コマンドを実行します。
そしてchmodコマンドの使い方は2種類あります。

:::note alert
chmodを実行できるのは所有者もしくはrootユーザーのみになります。
:::

### 1. 数値で指定

```bash
# 所有者に全権限、グループとその他に読み取りと実行のみ
chmod 755 script.sh

# 所有者に全権限、グループに読み書き、その他に読み取りのみ
chmod 764 data.txt
```

### 2.文字で指定

- 対象
    - u = 所有者（user）
    - g = グループ（group）
    - o = その他（others）
    - a = 全て（all）

- 操作
    - `+` = 権限を追加
    - `-` = 権限を削除
    - `=` = 権限を設定

- 権限：
    - r = 読み取り
    - w = 書き込み
    - x = 実行

```bash
# 所有者に実行権限を追加
chmod u+x script.sh

# グループから書き込み権限を削除
chmod g-w file.txt
```
【初心者向け】Macターミナルとzshの基本まとめ



こんにちは！この記事では、Macのターミナルを使い始めた初心者さん向けに、

- ターミナルの使い方
- シェルとは何か？
- zshとbashの違い
- VS Codeのターミナルとの関係

について、わかりやすくまとめてみました！

---

### ✅ ターミナルを開く方法（Mac）

1. Finderの【アプリケーション】>【ユーティリティ】>【ターミナル】を開く  
2. または「⌘ + スペース」でSpotlight検索 →「ターミナル」と入力してEnter
### ✅ 基本的なコマンド
**ls**　フォルダの中身を表示
**cd**  フォルダへ移動
**cd ..** 一つ上の階層へ移動
**pwd** 現在の場所（パス）を表示
**mkdir** 新フォルダ名  # フォルダを作成
**touch** 新ファイル名  # 空のファイルを作成

### ✅ スペースを含むフォルダ名に移動するには？
Macにはこんなフォルダ名がよくあります：
```
Macintosh HD
```
スペースを含む場合は、以下のいずれかでOKです：
```
cd Macintosh\ HD
cd "Macintosh HD"
```
### ✅ %と$の違いってなに？

**$** ・bashなどのシェル
**%** ・zshのシェル（macOS標準）
macOS Catalina（10.15）以降では、デフォルトのシェルは zsh になっています。

### ✅ シェルとは？
シェルとは、ターミナルに入力したコマンドをOSに伝えてくれる“通訳”のような存在です。
```
cd Desktop
```
このようなコマンドを受け取って、「デスクトップに移動せよ」とOSに伝えるのがシェルの役割です。

zshは使Macで標準なので
・設定不要
・補完機能が強力（Tabで補完）
・カスタマイズしやすい
・プラグインやテーマが豊富
と初心者でも使いやすいです。
```
echo $SHELL
```
↑このコマンドで、現在使っているシェルを確認できます。
例： /bin/zsh や /opt/homebrew/bin/zsh なら zsh です。

### ✅ VS Codeのターミナルも同じ？
VS Codeの「統合ターミナル」も、Macで使っているシェル（例：zsh）をそのまま使っています！
```
`Ctrl + ``（バッククオート）
```
または
```
メニュー > ターミナル > 新しいターミナル
```
で立ち上げます。
中身は同じなので、Macのターミナルと同じ感覚で使えます！
### 🔚 まとめ
・ターミナルでは cd, ls, mkdir など基本操作から始めよう

・シェルはコマンドの通訳役。Macでは zsh が標準

・スペースを含む名前は "フォルダ名" か \ で対処

・VS Codeのターミナルでも zsh はそのまま使える！

少しずつ慣れていけば、きっとコマンドラインが楽しくなります！