OmniAICreator/Qiita-1.07M huggingface dataset:
#Render × Supabase で `sqlalche.me/e/20/e3q8` エラー！解決策は Session Pooler！



## **🚀 Render で Flask アプリをデプロイ → Supabase に接続 → エラー発生！**
Render で Flask アプリをデプロイし、Supabase の PostgreSQL に接続しようとしたら、以下のエラーにハマった。

```
(Background on this error at: https://sqlalche.me/e/20/e3q8)
```

何度も何度も環境変数を確認したが、エラーは消えない。  
そんな中、Render のログを細かく見ていたら、**「Network is unreachable」** というメッセージを発見！

```
sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) connection to server at "db.gszvzrujgenrgtyllcuj.supabase.co" (2406:da18:243:7408:915f:f242:b28b:aad0), port 5432 failed: Network is unreachable
```

## **💡 原因：Supabase はデフォルトで「IPv6 のみ」！**
調べてみると、**Supabase のデフォルト DB は IPv6 のみ** で動作している。  
一方、**Render のサーバーは IPv4 しか使えない！**  
そのため、Render から直接 Supabase に接続しようとすると **「ネットワークに到達できない」エラー** が出る。

### **✅ 解決策：Session Pooler を使う！**
Supabase では **「Session Pooler」** を使うことで、IPv4 からでも接続できるようになる。

**やることは簡単！**
1. Supabase の「Session Pooler」の接続 URL を取得
2. Render の `DATABASE_URL` を変更
3. 再デプロイするだけ！

---

## **🚀 具体的な解決方法**

### **1. Supabase の「Session Pooler」URL を取得**
Supabase のダッシュボードで **「Database」→「Settings」→「Session Pooler」** を開き、  
そこに記載されている **「IPv4 互換の URL」** をコピー。

### **2. Render の `DATABASE_URL` を変更**
Render の「Environment Variables」で `DATABASE_URL` を、  
Supabase の「Session Pooler」の URL に変更。

```
postgresql://postgres:【設定したパスワード】@session-pooler.gszvzrujgenrgtyllcuj.supabase.co:5432/postgres
```

### **3. 再デプロイ**
- Render で「Manual Deploy」→「Deploy latest commit」
- Flask アプリが正しく Supabase に接続できるか確認！

---

## **🔍 その他にやったこと（念のため）**

### **✅ 1. SSL 接続の設定**
念のため、`DATABASE_URL` に `?sslmode=require` を追加。
```python
if "sslmode" not in DATABASE_URL:
    DATABASE_URL += "?sslmode=require"
```

### **✅ 2. `postgres://` → `postgresql://` の変換**
Supabase の `DATABASE_URL` は `postgres://` になっていることがあるので、  
SQLAlchemy で使えるように `postgresql://` に変換。
```python
if DATABASE_URL.startswith("postgres://"):
    DATABASE_URL = DATABASE_URL.replace("postgres://", "postgresql://", 1)
```

---

## **🎉 結果**
✨ **無事に Supabase の PostgreSQL に Render から接続成功！** 🎉

同じ問題にハマった人は、ぜひ **Session Pooler** を試してみてください！ 🚀
AI先生へ「積分のmathjaxを表示して下さい。」2025 京都大学 前期理系数学【１】問２(1)

# オリジナル

2025 京都大学 前期MathJax 【１】問２(1) ＜ 大学入試数学問題集成 様
https://mathexamtest.web.fc2.com/2025/202510541/2025105410100mj.html#top-0102

# ChatGPT先生へ
・質問リストの追番は無視して下さい。１個ずつです。途中の回答表示は省略しています。
```
以下のmathjaxを表示して下さい。
<p class="s2level">(1)　<math>
<mrow><mstyle displaystyle="true"><msubsup><mo>&int;</mo>
<mn>0</mn><msqrt><mn>3</mn></msqrt></msubsup></mstyle>
<mstyle displaystyle="true"><mfrac><mrow><mi>x</mi><mo>&it;</mo><msqrt>
<msup><mi>x</mi><mn>2</mn></msup><mo>+</mo><mn>1</mn></msqrt>
<mo>+</mo><mn>2</mn><mo>&it;</mo><msup><mi>x</mi><mn>3</mn></msup>
<mo>+</mo><mn>1</mn></mrow><mrow><msup><mi>x</mi><mn>2</mn></msup>
<mo>+</mo><mn>1</mn></mrow></mfrac></mstyle><mo>&it;</mo>
<mi mathvariant="italic">dx</mi></mrow><mspace width="2em"></mspace>
```
>(回答抜粋)
**MathJaxを直接表示することはできませんが**、以下のようにMathJax対応の環境（例えば、Markdown＋MathJax対応のエディタやHTMLページ）で表示できます。
(出力コード表示省略)
```math
\[
\int_{0}^{\sqrt{3}} \frac{x \cdot \sqrt{x^2 + 1} + 2x^3 + 1}{x^2 + 1} \,dx
\]
```
(私)　\| と | が表示されます。

>(回答抜粋)
MathJaxで適切に表示するためには、LaTeX記法を使うのが一般的です。あなたのコードにある \| や | は、通常の絶対値やノルムの記号として認識される可能性がありますが、適切にエスケープされていないか、環境によっては意図しない表示がされることがあります。

・私はわからないので、削除しました。
```math
\int_{0}^{\sqrt{3}} \frac{x \cdot \sqrt{x^2 + 1} + 2x^3 + 1}{x^2 + 1} \,dx
```

# Gemini先生へ
(未)
# copilot先生へ
(未)

# いつもと違うおすすめです。
＞今は(2025年)、スクショ(スクリーンショット)で、ChatGPT先生にお願いするから、
　使う機会が少ないかもです。

https://qiita.com/mrrclb48z/items/40ceadf74a7562aaeafa

#### Qiita内
＞MathMLの勉強を開始

https://qiita.com/mrrclb48z/items/40ceadf74a7562aaeafa#MathMLの勉強を開始
systemctlでStart request repeated too quickly.

## サービスの自動起動失敗
`systemctl`で自動起動設定しているあるサービスが、ある条件下で `Start request repeated too quickly.`というエラーメッセージを吐いて起動失敗するという現象が起こりました。で、このエラーでWebを検索すると、サービスのユニットファイルのディレクティブ`Restart`を`always`にしているのが悪い。これを`no`とすれば解決、という記事が結構見つかり「えー」と思ったので解決策を記事にしました。

## 解決策
ユニットファイルの以下のディレクティブを適切に設定する。

```
[Unit]
StartLimitIntervalSec=<この間に>
StartLimitBurst=<この回数失敗すると起動を諦める>

[Service]
RestartSec=<次に再起動を掛けるまでの秒数>
```
例えば、

```
[Unit]
StartLimitIntervalSec=600
StartLimitBurst=9

[Service]
RestartSec=30
```

など。こうすると10分間で30秒毎に起動を繰り返し、10回失敗したら`Start request repeated too quickly.`で起動を諦めるということになる。

## 補足
`StartLimitIntervalSec`は`StartLimitBurst * RestartSec`よりも十分に大きな値を設定しておくほうが良いようです。例えば上の例だと30秒毎で10回までなので`StartLimitIntervalSec`を300秒（5分）にすれば良さそう？ですが、実際には再起動までに30〜45秒かかったりするので（起動するサービスによると思いますが）、`StartLimitIntervalSec=300`とするとその間には7、8回しか再起動ｓず、リミットに達しないため延々と再起動を繰り返すことになりました。なので、`StartLimitBurst`回繰り返すのに絶対そこまでの時間はかからないという時間を`StartLimitIntervalSec`に設定した方が良いようです。

## 参考文献
https://man7.org/linux/man-pages/man5/systemd.service.5.html
https://man7.org/linux/man-pages/man5/systemd.unit.5.html
[備忘録]Shopify CLI コマンド（ローカルでの開発環境のセットアップ）

## Shopify CLI の最新版から色々とコマンドが変わったよ
という事で、自分のデザインプロジェクトを進めながら、作ったものを売るオンラインショップを立ち上げてこましたろと思い、Shopifyでショップを開店準備中なのですが、ざっとUdemyでShopify Developmentのコースをやりつつ、ChatGPTにコードを吐き出させながらやってたのですが、開発環境の構築の時にエラーが出まくりである。
なぜかと思ったら、Shopify CLIとTailwind CLIのバージョンアップに伴い、色々とコアのコマンドが変わっており、AIの情報が追いついていない。AIの申す通りにやっていて、半日無駄にしてしまったよ。
で、忘れないようにここにメモ。

まず、ローカルにプロジェクト用（themeをpullする）フォルダを作り、npm init
```terminal
npm init
```
その後に、shopify CLIをインストール
```terminal
npm install -g @shopify/cli@latest
```
で、Shopifyで開発中のThemeをローカルにPull
```terminal
shopify theme pull --shop=shopname.myshopify.com
```
これでThemeデータがローカルにPullされるので、ブラウザでプレビュー
```terminal
shopify theme dev
```
開発中の画面がブラウザでプレビューされる
![Products-–-Atmosphere-02-28-2025_02_36_PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1204968/cf90b650-3fe5-455e-aaa6-595cf183dda7.png)

次に、Tailwind CLIをインストール
```
npm install tailwindcss @tailwindcss/cli
```
**ここからが、ポイントである。** ドキュメントに沿ってTailwindをセットアップしてしまうと、Tailwindのグローバルリセットの設定が適応され、ThemeのBase.cssが上書きされ、元々のレイアウトが崩れる。
assetsディレクトリの下に、tailwind.cssを作り(assets/tailwind.css)、以下のコードを書く。
```css
@import "tailwindcss"; /* Loads only Tailwind utilities */
```
ルートレベルにconfigファイルを制作
```terminal
touch tailwind.config.js
```
で、以下のコードを書く
```javascript
module.exports = {
  content: [
    "./layout/**/*.liquid",
    "./templates/**/*.liquid",
    "./sections/**/*.liquid",
    "./snippets/**/*.liquid",
    "./assets/**/*.js"
  ],
  theme: {
    extend: {},
  },
  corePlugins: {
    preflight: false, // ⚠️ This prevents Tailwind from resetting Shopify styles
  },
  plugins: [],
};
```

その後に、以下のコマンドでTailwindをコンプラし、cssファイル（tailwind-built.css）を生成
```terminal
npx @tailwindcss/cli -i ./assets/tailwind.css -o ./assets/tailwind-built.css --watch
```
theme.liquidのbase.css読み込み直後に以下の読み込みコードを追加
```html
{{ 'base.css' | asset_url | stylesheet_tag }}
{{ 'tailwind-built.css' | asset_url | stylesheet_tag }}  <!-- ✅ Tailwind added here -->
<link rel="stylesheet" href="{{ 'component-cart-items.css' | asset_url }}" media="print" onload="this.media='all'">
```

でガチャガチャとローカルでの作業が終われば、Shopify CLIのpushコマンドを使って、Shopifyにアップロード
```terminal
shopify theme push
```
```
shopify theme push --unpublished --json
```

以上で、ShopifyからthemeファイルをローカルにPullして、Tailwindを大元のcssファイルを上書きしない様に設定し、開発環境を整える手順の２０２５年版の備忘録

## ShopifyはReactに近づく
数年前にShopifyでのショップ制作を手伝ったことがあるのですが、SHOP2.0からは、かなりReactに寄った思想になっており、以前のほとんどのページをliquidというPHPみたいなフレームワークで組んでいく作り方と比べて、リアクターからすればとても分かりやすい感じに進化しておりました。
HTML/CSS/JavaScriptをパッケージしたSectionはReactのコンポーネントに非常に近く、それをjsonテンプレートで順番を設定して積んでいく感じも非常にReactっぽい。
そもそも、HydrogenというShopifyをバックエンド、Reactをフロントに使う仕様も備わっているので、相性が良いのかも知れないなと、久々に触ってみて感じたよ。
📕 Flutter初学者による勉強メモ 🖊️

今までの業務ではJavaScriptを用いてバック〜フロントまでやっていたのですが、今回の案件から初めてFlutterでアプリ開発を行うことになったので備忘録も兼ねて


### Flutterの Widget とは？
Flutterにおける Widget とは、UIを構成する基本的な要素です。画面上のすべての要素は Widget でできている と考えてください。

例えば、ボタン・テキスト・画像・レイアウト など、FlutterアプリのUI要素はすべて Widget で表現されます。

フロントで言うComponentという概念と同じかなと考えております

### Widgetの種類
① StatelessWidget（ステートレスウィジェット）
　状態（State）を持たない Widget
　表示が 一度決まると変化しない
　build メソッド内で UI を返すだけ

② StatefulWidget（ステートフルウィジェット）
　状態（State）を持つ Widget
　状態の変化に応じて 再描画される
　State クラスと組み合わせて使う

 大きく分けてこの2つがある様子

 ### Widgetの階層構造
 ここが僕の中では聞きなれないのですが、FlutterのUIは ツリー構造（Widgetツリー） になっているとのこと
 イメージとしては関数の中に子要素を書いていく・・・
 そんな感じ
 ```dart
 MaterialApp(
  home: Scaffold(
    appBar: AppBar(title: Text('Widget Tree')),
    body: Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Text('Hello, World!'),
          ElevatedButton(onPressed: () {}, child: Text('Click Me'))
        ],
      ),
    ),
  ),
)
 ```

今日はひとまずここまで
 Flutterのお作法を守って書く必要があり、まだまだ慣れないです。
プレイヤーとしてできるマネジメント＜リーダーになる前に身につけるべきこと＞

## はじめに：マネジメントはマネージャーだけのもの？

これまで「マネジメント＝マネージャーやリーダーの仕事」という印象を持っていた。  
しかし最近、プレイヤーとして働く中でも、マネジメント視点の有無が成果やチーム運営に大きく影響することを実感するようになった。

特に「チーム全体で成果を出すために何ができるか」という視点は、今後のキャリアにおいても非常に重要だと感じている。  
本記事では、プレイヤーの立場から学び始めたマネジメントについて、自分なりの気づきを整理しておきたい。

---

## 🎯 プレイヤーが意識すべき3つのマネジメント的行動

### ① タスク管理による生産性の向上

マネジメントの基本は、  
**「仕事が円滑に進む仕組みを整えること」**。

まずは自分自身のタスクをしっかり管理することが、チームの生産性向上につながると考えている。

| 項目 | 内容 |
|--|--|
| ✅ 優先順位の整理 | 緊急度×重要度マトリクスの活用<br>・緊急かつ重要：最優先で対応<br>・重要だが緊急でない：計画的に進める<br>・緊急だが重要でない：可能であれば他者に依頼<br>・どちらでもない：対応の優先度を下げる |
| 📅 期限の設定とスケジューリング | タスクに締切を設け、逆算して取り組む |
| 🤝 チーム全体の進捗への配慮 | 自分のタスクが完了しても、チーム全体が進んでいなければ意味がない |

> 「自分のタスクだけでなく、チーム全体がどう進んでいるか」  
この視点を持つことが、プレイヤーとしてのマネジメント力を養う第一歩だと感じている。

---

### ② コミュニケーションの質を高める

成果を出すチームには、共通して**良質なコミュニケーション**がある。  
これはマネージャーに限らず、プレイヤーにも求められる力だと実感している。

| シーン | 意識したいポイント |
|--|--|
| 📢 報告・連絡・相談の徹底 | 特に問題が起きそうなときには、早めの相談が重要 |
| 💬 日常的なやり取りの積み重ね | 雑談や軽い会話も、チーム内の信頼関係構築に役立つ |
| 👂 相手に伝わる伝え方 | 「伝えたつもり」にならず、相手の受け取り方を意識する |

伝え方一つで誤解が生まれたり、連携がうまくいかなくなることもあるため、  
日々のやり取りにこそ丁寧さが求められると感じている。

---

### ③ 主体的に動く姿勢

プレイヤーとして「与えられた仕事をこなす」だけでなく、  
**自ら課題を見つけて動くこと**がマネジメントに近づく第一歩だと考えている。

| 行動 | 意識したいこと |
|--|--|
| 🔍 課題の発見と提案 | 気づいた課題は、指示を待つのではなく自ら提案・行動する |
| 🤝 周囲を巻き込む | 自分ひとりで解決しようとせず、チームメンバーと協力する |
| 🗣 フィードバックを共有する | 気づきや改善点を上下関係にとらわれず共有する |

中でも「周囲を巻き込む力」は、将来マネジメントを担う立場になったときに特に必要なスキルになると感じている。  
今のうちから意識して実践していきたい。

---

## ✍ 今後、自分が意識して取り組みたいこと

学んだ内容の中で、特に重要だと感じたのは以下の2点。

- 🗂 **タスク管理を徹底し、チーム全体の生産性向上に貢献する**
- 💡 **主体的に課題を発見し、必要なアクションを自ら起こす**

これらは、すぐにでも実践できるマネジメントの入口だと考えている。  
今後、より大きな役割を担う準備として継続的に取り組んでいきたい。

---

## まとめ：マネジメント視点はプレイヤーにとっても必要な素養

マネジメントは、特定の役職に就いた人だけの仕事ではなく、  
**「チーム全体で成果を出すために何ができるかを考え、行動すること」** だと理解した。

プレイヤーである今だからこそ、以下の点を意識したい：

- ✅ タスク管理とチームの進捗への配慮  
- 🗣 円滑なコミュニケーション  
- 💪 主体的な行動と課題提案

これらを実践することで、将来的にリーダーとなったときにもスムーズにマネジメントへ移行できると考えている。
Flutter初学者がアプリ開発時に便利だと感じたショートカット

# はじめに
アプリ開発を始めてから便利だと感じたショートカットに絞って書いてみました

# 1.サイドバー表示/非表示(Command + B)
普段あまり使っていなかったショートカット
アプリ開発で端末を横に表示しながら作業が多く、画面が圧迫しがちなので割と便利

# 2.WidgetのWrap(Command + .)
WrapしたいWidgetにカーソルを合わせ`Command + .`を押すと使用できる
`Remove this widget`で削除も簡単にできるのでかなり便利

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3997736/d4129d20-9451-4f30-b280-91aea96f9433.png)


# おまけ
シミュレーターの`Window > Physical Size`で実物大の動作確認できるの地味に便利
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3997736/c932738c-4a62-4584-8139-b9c9cc2688d4.png)
5つの観点から見るリーダーシップの全体像

日々手を動かし、プレイヤーとして動いている一方で、「チームで成果を出すには、どんな視点が必要なのか」と考える場面も増えてきた。

そんな中で関心を持ち始めたのが **“リーダーシップ”や“マネジメント”** の役割。  
これまでの自分は「マネジメント＝管理職の仕事」と捉えていて、正直、距離を置いていたが、チームで成果をあげる以上リーダーシップやマネジメントは必要不可欠なスキルになると考え、まずは身近なリーダーシップについて学んでいきたいと思った。

本記事では、「リーダーシップ」というキーワードを入り口に、以下の5つの観点でまとめてみた。

---

## 1. リーダーシップの特徴：ポジションよりも影響力

リーダーシップを定義づけるうえで最も印象に残ったのは、「リーダーシップは肩書きではなく、人に影響を与える行為そのものだ」という点。

P.F.ドラッカーが述べた「リーダーとは、フォロワーを持つ者である」という言葉の通り、リーダーシップは関係性の中で発生する動的な力である。つまり、自らが先頭に立って人を導く場合もあれば、ある時は背中で語り、信頼をもって任せるという形でも機能する。

この視点は、自分がリーダーとして思い描いていたものと少し異なり、印象を受けた内容であった。

## 2. リーダーシップに必要なスキルとは？

リーダーに求められるスキルがよく紹介されますが、学びのなかで特に腑に落ちたのは、“何を伝えるか”よりも“どう在るか”が問われるという点です。

以下は、自分なりに重要だと感じたリーダーのスキルです：

- **自己認識と自己管理**  
  自分の感情・行動のクセを理解し、感情に流されずに意思決定をする力。ダニエル・ゴールマンの「EQ（感情知能）」が鍵になります。

- **傾聴と共感**  
  相手の話を遮らずに聴き、言葉の裏にある感情や価値観に耳を傾ける。単なる“聞く”ではなく“受け取る”姿勢が問われます。

- **対話とフィードバック**  
  一方通行の指示ではなく、対話によって認識のズレを埋め、適切なタイミングでフィードバックする力。これは現場でも実践しやすいスキルだと感じました。

- **目的を翻訳する力**  
  上位のビジョンを、チームや個人にとって意味のある言葉に落とし込む力。プレイヤー視点では「なぜこの業務をやるのか」を結びつける力でもあります。

## 3. リーダーシップのタイプを学ぶ意味

リーダーシップの種類を分類する理論には様々ありますが、私が特に参考になったのは以下の3つです：

- **三隅二不二の「PM理論」**  
  **P機能（課題達成）とM機能（集団維持）**の2軸でリーダー行動を分類する考え方。  
  → 実務の中で「成果にこだわりすぎて関係性が弱くなる」「和を保ちすぎて決断が遅れる」といったバランスの課題を振り返るのに役立ちました。

- **ゴールマンの6つのリーダーシップスタイル**  
  状況に応じてスタイルを使い分ける必要性を提唱（例：ビジョン型・コーチ型・強制型など）。  
  → 特に印象的だったのは「すべてのスタイルに長所があり、“強制型”ですら必要な時がある」という視点。人を大切にする＝優しいだけではないと学びました。

- **サーバントリーダーシップ**  
  自分が上に立つのではなく、「メンバーの成長や成功を支えること」に主眼を置いた考え方。  
  → プレイヤー出身の自分にとって、“支えるリーダーシップ”は最も現実感があり、目指しやすい姿だと感じました。

## 4. リーダーシップがもたらす効果

リーダーシップがうまく機能すると、目に見える成果だけでなく、チーム全体の空気感や心理的安全性にも好影響を与えることがわかりました。

具体的な効果として学んだのは以下のような点です：

- **チームが主体的に動けるようになる**  
  → 「指示を待つ」のではなく、自ら課題を見つけて動けるメンバーが増える。

- **学習とフィードバックのサイクルが回る**  
  → 上下ではなく対話ベースの関係性があることで、建設的な振り返りが可能になる。

- **コンフリクト（衝突）が生産的になる**  
  → 関係性ができていれば、意見の違いは摩擦ではなく前進の材料になる。

個人的にも、周囲に安心して意見を出せる雰囲気があるだけで、日々の業務効率やストレスの感じ方が大きく変わると感じています。

## 5. リーダーシップはどう育てるか？

最後に、実際に自分がリーダーシップを伸ばしていくにはどうすればよいか？を考えました。
理論と合わせて、自分の中で意識していきたい点を整理します。

- **完璧なリーダーを目指さない**  
  → すべてのタイプやスキルを持ち合わせる必要はなく、「自分らしいリーダーシップ」を見つけることが大切。

- **フィードバックを素直に受け取る**  
  → 特にネガティブな意見から逃げず、真摯に受け止めて改善のヒントにする。

- **実践と内省のセットで学ぶ**  
  → やってみて、振り返って、改善して…という地道なサイクルこそが育成の鍵。

- **仲間と語る・学ぶ**  
  → 1人で悩むより、他者とリーダーシップについて対話することで視野が広がる。

## おわりに

「リーダーシップを学ぶ」という行為は、単なる理論の理解ではなく、「自分がどう在りたいか」「周囲にどう関わっていきたいか」という問いに向き合うことでもあります。

まだまだ実践と学びの途上ですが、今回の整理を通じて、自分が大切にしたいリーダーシップの姿が少し見えてきました。
プレイヤーからリーダーへ＜マネジメントの基本とは？＞

## リーダーを目指して学んだ「本物のリーダーシップ」とは何か

リーダーを目指すことを考える中で、私はひとつの疑問に行きつきました。  
「役職や肩書きがあるだけで、本当に“リーダー”といえるのだろうか？」

企業や組織の中には“上に立つ人”が多く存在しますが、果たしてそのすべての人が、「この人についていきたい」と思われているでしょうか。  
この疑問から、私は「本物のリーダー」とは何かを深く考えるようになりました。

では、どうすればそんなリーダーになれるのか？  
そのヒントを得るために、私はマネジメントの父・ピーター・ドラッカーのリーダーシップ論に触れ、リーダーに求められる本質を学びました。

---

### リーダーシップとは「率いる力」ではなく「導く力」

一般的にリーダーシップは「指導力」や「統率力」と訳されますが、実際にはもっと深い意味を持っています。  
それは「チームや組織を目標に向かって導く力」です。  
命令するのではなく、人を動かし、信頼を得て一緒に歩んでいく力だということを学びました。

---

### ドラッカーのリーダーシップ論から学んだ3つの要素

#### 1️⃣ 仕事（成果を出すための行動）

ドラッカーはリーダーシップとは「仕事」であり、天性のものではないと述べています。  
方向性を示し、優先順位を決め、基準を設ける。これらはすべて“仕事として”行うべきものです。

**学びポイント：**  
リーダーシップは「行動」から始まる。才能よりも、やるべきことをやる姿勢が大切。

#### 2️⃣ 責任（全体に対する覚悟）

リーダーの役割は、結果が良くても悪くても責任を持つこと。  
特に失敗した時、誰かを責めるのではなく、自らが責任を負う姿勢が必要です。

**学びポイント：**  
「責任はリーダーが背負うもの」。だからこそ、部下は安心して挑戦できる。

#### 3️⃣ 信頼（自然に人がついてくる状態）

「信頼」は、「仕事」と「責任」を果たすことで自然に生まれるもの。  
信頼を得たとき、初めて周囲の人々が自分をリーダーとして認めてくれます。

**学びポイント：**  
信頼は求めるものではなく、積み重ねた行動から“結果として”得られるもの。

---

### リーダーシップが組織にもたらす効果とは？

それではなぜ、組織にはリーダーシップが必要なのだろうか。  
ドラッカーの言葉を参考にしながら、あらためてリーダーシップの意義について考えてみました。

#### ① スタッフの自主性が育まれる

組織の使命（ミッション）を行動・言動で示し、部下に影響を与える。  
リーダーはまさに「トランペット」のようなものだとドラッカーはいいます。  
ミッションはスタッフの視座を高め、「顧客に貢献するためにはどうすればいいのか」という自主性を自然と育てます。

#### ② スタッフの貢献意識が高まる

貢献意識はスタッフの可能性を押し広げ、豊かなアイデアや提案を生み出します。  
しかしそれは「カネ」で生まれるものではありません。  
ミッションに共感し、自らの仕事が組織にどう貢献できるかを意識することで、初めて本当の価値が生まれます。

#### ③ 妥協する場面でも一貫性のある意思決定ができる

現実は理想通りにいかないことも多く、リーダーは日々意思決定を迫られます。  
そんな時にこそ、ミッションに照らして一貫性のある判断ができるかが問われます。  
これもまた、リーダーシップの重要な要素だと感じました。

---

### リーダーとマネージャーの違い

リーダーとマネージャーはよく混同されますが、役割や考え方は明確に異なるとありました。  
以下のように整理できます。

| 項目 | リーダー | マネージャー |
|------|----------|--------------|
| 役割 | ビジョンを示して先導 | 業務を管理・調整 |
| 権限 | 自主性を引き出す | 指示・管理で統制 |
| 視点 | 長期的・未来志向 | 短期的・現実志向 |

**学びポイント：**  
どちらが上かではなく、両者が補完しあってこそ、組織は強くなる。どちらか一つでは成長は難しい。

---

### 「ついてくる人がいる」ことがリーダーの証

ドラッカーは「リーダーの唯一の定義は、つき従う者がいることである」と述べています。  
無理に従わせるのではなく、「この人についていきたい」と思わせること。  
その状態をつくるのが、本物のリーダーなのだと感じました。

---

### 真のリーダーとはどんな人か？面白かった「本物」と「似非」の対比

ドラッカーの言葉を通じて、真のリーダーとそうでない存在の違いも印象的でした。  
一部を抜粋して紹介します。

- 真のリーダーは、言動に一貫性がある  
- 真のリーダーは、組織の使命に矛盾がないように意思決定をする  
- 真のリーダーは、責任は常に自分にあると理解している  
- 真のリーダーは、部下を恐れない  
- 真のリーダーは、優秀な部下を自らの誇りとする  
- 真のリーダーは、自分が去った後に組織が崩壊することを恥とする  

一方で、似非リーダーの特徴も鋭く指摘されています。

- 似非リーダーは、自らのカリスマ性で破滅する  
- 似非リーダーは、柔軟性がなく、変化を恐れる  
- 似非リーダーは、地位や特権を守るために部下を恐れる  
- 似非リーダーは、自分が組織の支配者であると錯覚する  

この対比は非常に面白く、自分がどちらの方向に進んでいるのかを常に問い直す姿勢が、リーダーには欠かせないのだと感じさせられました。

---

### まとめ：リーダーは「選ばれる」存在

リーダーとは「自分がなりたい」と思うだけではなく、周囲から「この人についていきたい」と“選ばれる”存在。  
そのためには、常に自分を律し、仕事に真摯に向き合い、責任を果たし、信頼される行動を積み重ねていくことが不可欠だと感じました。  
今回学んだことは、プレイヤーである自分自身にとっても、今後の行動指針になると強く感じています。
GraphAIで使えるDeepSeek Agent

## はじめに
GraphAIで使える、DeepSeekのLLM agentを作成しました。DeepSeekはAPIコストが他のLLMと比較して低いため、コストを抑えながら開発を進めることができます。


| モデル名               | 入力トークン | 出力トークン | 備考 |
|------------------------|------------|--------------|------|
| **DeepSeek-chat**      | $0.07      | $1.10        | UTC 16:30-00:30 の割引時間帯では最大75%の割引適用 |
| **GPT-4o**            | $2.50      | $10.00       | OpenAIの高度なモデル |
| **GPT-4o mini**       | $0.15      | $0.60        | OpenAIの軽量モデル |
| **o3-mini**           | $1.10      | $4.40        | OpenAIの推論モデル |
| **DeepSeek-reasoner** | $0.14      | $2.19        | UTC 16:30-00:30 の割引時間帯では最大75%の割引適用 |

(注)価格は **100万トークンあたりの米ドル（$）** で表記しています。

コストを抑えたい & 無料で使えるgemini agent以外のLLM agentを使いたい、という方向けです。
deepseekのapiはopenAIのapiと互換性があるため、openAIエージェントとコードはほぼ同じで、apiのurlや環境変数名がdeepseekのものに置き換えられています。ですので、openAI agentやgemini agentといった、公式で用意されているLLM agentと同じように使うことができます。

## そもそもGraphAIとは
https://zenn.dev/singularity/articles/graphai-about#sample

GraphAI開発者のIsamuさんによって公開されている上記のZennの記事が参考になります。
一言でいうと、LLM、WebAPI、DBといったAgentをグラフのようにつなぎ合わせていくことで、非同期処理が可能なマルチエージェントシステムを簡単に構築できるフレームワークです。

## サンプル
ターミナル上でDeepSeekと1往復だけやりとりする、シンプルなサンプルコードです。

https://github.com/sugamass/graphai-deepseek-agent

### サンプルの動かし方
1. deepseek platform(https://platform.deepseek.com )にログインし、api keyを取得する。また、クレジットを購入する。（最低$2から購入可能）
2. ターミナルでプロジェクトのルートディレクトリに移動し、`npm install`を実行する
3. プロジェクトのルートディレクトリに .env ファイルを作成し、環境変数を定義する
4. `npm run serve`を実行する

## 感想
自分は学生で常に金欠なので、開発にかかるコストをすこしでも節約できるのはありがたいです。DeepSeekは政治的な話題に関しては中国寄りの思想をもって出力する傾向にあるので、使い所に気をつける必要がありそうです。
Expo Router で前の画面へ戻りながら値を渡す方法

こんにちは、モウです。React の開発経験は三年以上ですが、React Native は初心者です。React Native と Expo での開発にあたり、調査した内容を共有させていただきます。

今回の記事では、グローバルステートを使用せずに前の画面へ戻りながら値を渡す方法を紹介します。

<details><summary>グローバルステートを使用しない理由</summary>

Context や Redux などのグローバルステートを使って値を渡すこともできますが、シンプルなデータを少量渡す場合には少し大げさに感じることがあります。そのため、より簡単な方法があれば便利だと思いました。
</details>


## 前の画面へ戻りながら値を渡す方法


グローバルステートを使わない場合、基本的にはローカルのサーチパラメータを使用して値を渡す方法しかありません。

前の画面へローカルサーチパラメータで値を渡す方法としては、調べた結果、以下の二つ方法がありました。

- Router の `dismissTo` を使って渡す
- Router の `back` を実行した後に `setParams` を使って渡す


### dimissTo

:::note warn
Stack ナビゲーション以外の Tab や Drawer などのナビゲーションでは、この方法は使用できません。
:::

```JSX
import { useState } from 'react';
import { View, Button, Text, TextInput } from 'react-native';
import { useRouter } from 'expo-router';

export default function TabTwoScreen() {
  const [value, setValue] = useState('');
  const router = useRouter();

  return (
    <View style={{ padding: 8, gap: 8 }}>
      <Text>値を入力してください</Text>
      <TextInput
        onChangeText={setValue}
        value={value}
        placeholder="値"
        style={{ borderWidth: 1, borderRadius: 12 }}
      />
      <Button
        title="戻る"
        onPress={() => {
          router.dismissTo({ pathname: '/', params: { value } });
        }}
      />
    </View>
  );
}
```

### setParams

:::note warn
Stack ナビゲーション以外にも使用できます。たたし、この方法が Expo Router の設計として正しいのか分かりません。
:::


```JSX
import { useState } from 'react';
import { View, Button, Text, TextInput } from 'react-native';
import { useRouter } from 'expo-router';

export default function TabTwoScreen() {
  const [value, setValue] = useState('');
  const router = useRouter();

  return (
    <View style={{ padding: 8, gap: 8 }}>
      <Text>値を入力してください</Text>
      <TextInput
        onChangeText={setValue}
        value={value}
        placeholder="値"
        style={{ borderWidth: 1, borderRadius: 12 }}
      />
      <Button
        title="戻る"
        onPress={() => {
          router.back();
          router.setParams({ value });
        }}
      />
    </View>
  );
}
```

下記は共通の index 画面です。

```JSX
import { View, Text } from 'react-native';

import { Link, useLocalSearchParams } from 'expo-router';

export default function HomeScreen() {
  const { value } = useLocalSearchParams<{ value: string }>();

  return (
    <View style={{ paddingHorizontal: 8 }}>
      <Text style={{ fontSize: 24, paddingVertical: 12 }}>
        前のページに値を渡すについて
      </Text>
      <View style={{ flexDirection: 'row', gap: 8, alignItems: 'center' }}>
        <Link
          style={{ borderWidth: 1, borderRadius: 12, padding: 4 }}
          href="/DismissTo"
        >
          DismissTo
        </Link>
        <Link
          style={{ borderWidth: 1, borderRadius: 12, padding: 4 }}
          href="/SetParams"
        >
          SetParams
        </Link>
      </View>
      <Text>渡された値：{value}</Text>
    </View>
  );
}
```


## 終わりに

以上が、グローバルステートを使わずに前の画面へ戻りながら値を渡す方法です。もし他に良い方法があれば、ぜひ共有してください。

上記のサンプルコードは [GitHub](https://github.com/oldmoh/PassDataToPreviousPage) にプッシュしたので、ぜひ試してください。
Db2 LUW 12.1.1 GAとDb2 V12移行ガイド情報


# Db2 12.1.1がGA
Db2 LUW (Db2 for Linux, UNIX and Windows) の新しいバージョンである「Db2 12.1」は、2024年11月よりGAになっています。

この2025年2月には、Db2 V12の最初のModificationであるDb2 12.1.1(Db2 Version 12.1 Mod 1 Fix Pack 0 ）がGAになりました。
Db2 12.1.1には新機能と修正が含まれています。

Db2 Fixpackダウンロード・サイトより「Db2 Version 12.1 Mod 1 Fix Pack 0」をダウンロードして導入できます


- Db2 Fixpackダウンロードサイト
    - [Download Db2 fix packs by version for Db2 for Linux, UNIX and Windows
](https://www.ibm.com/support/pages/download-db2-fix-packs-version-db2-linux-unix-and-windows)

        Db2 12.1 Mod 1 Fix Pack 0を選択

### Db2 12.1.1新機能の例
#### pureScaleの拡張 :pureScale on Azure with RDMA
Db2 12.1.1では、パブリック・クラウド上のセルフ・マネージドのDb2 pureScaleの環境として、Db2 11.5からサポートされていたAWS環境に加えて、Azure環境が加わりました。（現時点でのAzureサポート・リージョンは、France Central, North Europe, West Europe,We st US 2) 

Db2 12.1.1のpureScale on Azureでは、pureScaleのmemberとCF間のノード間通信として、TCP/IPに加えて、高速なリモートダイレクトメモリアクセス（RDMA）プロトコルもサポートされました。

#### pureScaleの拡張：オンラインIndex再編成
pueScale 12.1.1では、シングルDb2では昔からサポートされていた「オンラインIndex再編成」もサポートされました。

#### その他の新機能や機能拡張についてはこちらをご覧ください
- Db2 LUW のテクニカル・フラッシュ
[Db2 LUW 12.1 Mod 1 (Db2 12.1.1) 公開のお知らせ](https://www.ibm.com/support/pages/node/7183222)




# Db2 12.1への移行ガイドと技術文書
- [Db2 for LUW 12.1 移行手順ガイド](https://www.ibm.com/support/pages/node/7181905)

    Db2 for LUW 12.1への移行(アップグレード）作業手順と、移行に関する考慮点などの参考情報をまとめたものです。
    <br>
    


- [Db2 for LUW 移行ガイド(考慮点一覧) - Db2 V9.7/V10.1/V10.5/V11.1/V11.5からV12.1への移行対応版](https://www.ibm.com/support/pages/node/7181462)

    旧バージョンからDb2 V12.1にアップグレードする際の推奨事項/考慮事項の調査、バージョン間差分確認にご活用ください。
    <br>

- [Db2 for LUW データベース物理設計ガイド](https://www.ibm.com/support/pages/node/7180307)

    Db2 LUW 12.1を前提として物理設計ガイドが更新されています。
この1冊を開けば設計において必要なトピックが探せる、百科事典のように活用できるガイドになっています。

    また、巻末の「Appendix.物理設計に関するHints&Tips」だけでなく、各所必要に応じて、Hints＆Tipsとして、Db2スペシャリストのノウハウも追記されています。
著）ISE(日本アイ・ビー・エム システムズ・エンジニアリング株式会社)



#  Db2 12.1 マニュアルのトップページ
- 日本語
    - https://www.ibm.com/docs/ja/db2/12.1
- 英語
    - https://www.ibm.com/docs/en/db2/12.1
    - 最新情報は英語で更新されていますので英語で確認するのがお薦めです

# Db2 12.1 システム要件
稼働環境の前提要件等の確認はこちらです（英語）
- [System requirements for IBM Db2 for Linux, UNIX, and Windows](
https://www.ibm.com/support/pages/system-requirements-ibm-db2-linux-unix-and-windows)
[iOS] Apple Storeのリジェクト、Guideline 1.1 - Safety - Objectionable Contentへの対応

# リジェクト内容

```
Guideline 1.1 - Safety - Objectionable Content

We found that your app or metadata includes content that some users may find upsetting, offensive, or otherwise objectionable.


Specifically, your app objectifies female with only single-gender photos (female) featured in screenshots and app icon.

Next Steps

To resolve this issue, please remove all potentially objectionable content from your app and metadata and submit your revised binary for review.

```
>We found that your app or metadata includes content that some users may find upsetting, offensive, or otherwise objectionable.
>
>Specifically, your app objectifies female with only single-gender photos (female) featured in screenshots and app icon.
>
>訳：あなたのアプリまたはメタデータには、一部のユーザーが不快、攻撃的、または不快に感じる可能性のあるコンテンツが含まれていることが判明しました。
>
>具体的には、アプリはスクリーンショットとアプリのアイコンに単一の性別の写真 (女性) のみを使用して女性を対象としています。

作成したアプリのターゲットが男性と言うわけではないのですが、なんとなくスクリーンショットには女性が映っているものだけ使用してきました。

ただそれでも今までは一度も指摘を受けたことがなく、今回初めて上記のような内容のリジェクトがきたので少し驚いてしまった。

# 対応内容
男性が映っているスクリーンショットも加えることですんなりと解決

# ひとこと
AppleやGoogleも多様性への配慮など色々と厳しくなってきているのは時代の流れなのかもしれませんね。
対応自体は簡単なのでそこまで問題にはならないかもしれませんが、時間の関係などでなるべくリジェクトを食らいたくない状況などではその辺りを意識しておくと良いかもしれません。
【docker】docker system pruneをしても容量が空かないときの対処

version 24.0辺りのdockerを使用してる人向けの話です。
結論を簡潔に言うと
docker最新版にするか、クリーンインストールが結論です。
環境はAmazonLinuxです
# 経緯
dockerのお掃除する場合
```
docker system prune -a
```
…なんですが
実行してもディスク容量が全然減らない状況に直面しました。

# そもそもどこが容量を圧迫するのか
dockerでビルドを繰り返しているとそのうち容量不足でビルドに失敗することがあります。
これはビルドごとに`/var/lib/overlay2`内に生成されるキャッシュが積もり積もって容量を圧迫しているケースがあります。
キャッシュなんで別に消していいでしょってことで`/var/lib/overlay2`の中身を削除すれば容量は空くのですが
中には使用中のものも混在しており、手動で何もかも消すとビルドできなくなる現象が発生します。

使用していないものをいい感じに削除してくれるコマンドとして前述の
```
docker system prune -a
```
が用意されていますが
docker v24.0以前のバージョンではprune時に/var/lib/overlay2の中身が正しく削除されないケースがあるそうです。

# 解決策
この現象はv25.0以降修正されているので
v24.0系統より前のバージョンで同じ現象に直面した場合はバージョンアップしてからpruneを打つとよいでしょう。

# 最終奥義
バージョンアップしても圧迫し続けている場合、もしくはバージョンアップできない場合は
docker関連のファイルをすべて消し去り作り直せば何とかなります。
下記コマンドはvolumeの中身含めて全て削除するものですので自己責任で実行してください。
```
systemctl stop docker.socket
systemctl stop docker
rm -rf /var/lib/docker
systemctl start docker
systemctl start docker.socket
```
volumeを残したい場合はvar/lib/docker/volumesのバックアップをとっておき、
/var/lib/docker削除してdocker再起動をし/var/lib/dockerを再生成した後、
バックアップを戻せば復旧できはずです。
Vercelで環境変数を設定する方法 - Production / Preview / Development ＋ブランチ別設定

Vercelでは、Production（本番） / Preview（プレビュー） / Development（開発） の3つに分けて環境変数を設定できます。
たとえば、Supabaseのブランチング機能で複数のDBを用意している場合、ブランチごとに接続先を切り替えたいことがありますが、VercelのPreview環境ならブランチ単位で環境変数を設定できるため、こうした運用にとても便利です。

## 手順：Environment Variables 設定画面

1. Vercelのダッシュボードでプロジェクトを開く  
2. **Settings** → **Environment Variables** をクリック  
3. **Environments** から `Production`, `Preview`, `Development` のいずれかを選択 
4. `Key` と `Value` を入力   
5. **Save** を押して登録  

![スクリーンショット 2025-02-28 142655.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944846/cb358e45-6067-4c4b-a11d-706f0bf5cbb1.png)
![スクリーンショット 2025-02-28 142734.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944846/1ea452d0-a1f3-4680-b919-691e15a5abbb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944846/6c327d96-9080-447d-beda-7c3b73db4c32.png)

## Preview環境のブランチ別設定

「Environments」で **Preview** を選んだあとに、ブランチ名（例：`feature/hoge` など）を追加指定することで、**特定のブランチだけ**別の値を上書きできます。

例えば「Preview環境のデフォルト値」と、「feature/payment ブランチでのみ使う値」を分けることが可能です。複数のブランチに対して、それぞれ独自の値をセットすることもできます。
![スクリーンショット 2025-02-28 142903.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944846/59d3586b-e30e-4d46-ac3b-0b073c81569c.png)

## まとめ

- **Production / Preview / Development** の3つの環境に分けて環境変数を管理可能  
- Preview環境ではブランチ名を指定して、**ブランチごと**に異なる値を設定できる  
- 手順は **Settings → Environment Variables** 画面で `Name` / `Value` を入力し、使用する環境を選択するだけ  

本番用のキー、テスト用のキー、開発用のキーを分けたり、特定のブランチだけ特別な値を使いたい場合などに便利です。ぜひ活用してみてください。

## 参考リンク
https://vercel.com/docs/projects/environment-variables
AmplifyのDesignToCodeからの脱却

## はじめに

Figmaで作成したデザインをReactのコードに変換するニーズは高まっています。特に、デザイナーとエンジニアの間の手作業を減らし、スムーズに開発へ移行できるツールが求められています。

AWS AmplifyのDesign to Code機能（Gen1, Gen2）は、Figmaのデザインをコードに変換する便利な機能ですが、Gen2に移行する際にいくつかの制約があり、使いづらいという課題がありました。

そこで、独自のFigmaプラグインを作成し、AWS BedrockのClaude 3.5 Sonnetを活用してデザインからReactコードを生成する仕組みを試してみました。

## どんなプラグインを作っているか

このプラグインの主な機能は以下のとおりです。

- **デザインからReactのコードに変換**
  - 選択されたコンポーネントのFigmaのデザインデータを取得しAWS Bedrockのclaude3.5 Sonnetを使いコード化

- **画像とコードをZIPでダウンロード可能**
  - Figmaデザインで使用されている画像と生成したコードをまとめてZIP形式でダウンロードできる

![スクリーンショット 2025-02-28 15.02.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3971030/fb07be39-7196-48c7-a9d1-ffd0ee651473.png)


## 作ろうとした背景・課題

### AWS AmplifyのDesign to Codeを使っていたが制約が多い

AWS AmplifyのDesign to Code機能（Gen1, Gen2）を利用していたが、以下のような課題がありました。

- **Gen1, Gen2共通の課題**
  - **全てのコンポーネントが一括でコード化される**
    - 一部のコンポーネントだけを変換したい場合でも、全体をコード化しなければならない

  - **生成したコードがデザイン変更のたびに更新され、直接編集できない**
    - 実質的にコードを直接編集することが難しく、ラップしてオーバーライドする必要がある
    - その結果、コードの量が膨大になり、管理が大変になる
  
  - **一部のCSSが反映されない問題がある**
    - 生成されたコードの中で、特定のスタイルが適用されないケースが発生する
    - その都度、デザインとコードを確認しながら修正する必要がある

    ![スクリーンショット 2025-02-28 14.17.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3971030/268b5bec-8e79-476b-b733-5d7b3ccf2a68.png)

    ![cssimage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3971030/35dd34ec-8486-4fe9-a694-5c78a4220e86.png)

- **Gen2特有の課題**
  - **デザイン上のユーザー入力欄の仮テキストがオーバーライドできない**
    - Figmaで仮のテキストを入力しても、そのままコードに反映され、変更が難しい

※Amplifyでは下記記事のように実装していました。

https://www.insurtechlab.net/amplify-studio-extend-via-code/

## 解決されるであろう課題の仮説

このプラグインを使うことで、次のような課題を解決できると考えています。

1. **必要なコンポーネントだけを選んでコード化できる**
    - 一括変換ではなく、個別のコンポーネントを選択してコード化できるようにする
    - これにより、デザインの一部を試験的にコード化し、順次組み込むワークフローが可能になる

2. **デザイン上の仮テキストを自由に調整できる**
    - Figma上での仮テキストがコード上に直接反映されないようになるため、Figma上でのデザインの自由度が上がる

3. **コードの更新管理を最適化する**
    - 一括でコード出力し、UI部分のコード全体を置き換えるわけではなくなるため、出力されたコードを直接編集できるようになる

4. **CSSの適用ミスを防ぐ**
    - 全体を出力するのではなくひとつひとつ出力し確認になるので、確認や変更が容易になる

## おわりに

このプラグインは、0からの開発を迅速に行えるようにという観点で作りました。デザイナーさんから受け取ったデザインを素早く形にし、ユーザーに触ってもらえる状態にすることで、開発からリリースしFBを受けるまでの時間を短縮できると考えています。また、Figma上での制約も少なくなることで、デザイナーさんや開発者の負担を軽減し開発者体験の向上にもつながるものだと思います。

このプラグインをチーム内で活用することで、デザインからコードへの移行がより効率的に行えるようになり、開発プロセス全体のスピードとクオリティが向上することを期待しています。
【初心者向け】PrismaのTransactionを使うときの注意

Prismaのトランザクションを使うと、データの一貫性を保つことができるので便利です。

しかし、注意点として `prisma.$transaction()` を使用する際にタイムアウトが発生する可能性があります。

## タイムアウトの原因
- 処理を多過ぎる
- クエリが複雑すぎる
- データ量が多い
- ネットワークやDBの負荷が高い

これらの要因で処理時間が長くなると、**Prismaのデフォルトタイムアウト5秒（`5000ms`）に引っかかることがあります。

## 回避策
- **トランザクション内の処理を最適化**  
  ・不要な処理が要因となって処理に時間がかかっていないか

- **タイムアウト時間を延長する（timeout オプションを指定）**
  ・`await prisma.$transaction(transactions, { timeout: 10000 }); // 10秒に延長`
- **トランザクション内の処理を見直す**
  ・トランザクションを使用し、一貫性を保証する必要が本当にあるかを見直す

## まとめ
最初は問題なく動作していても、データが増えるにつれて処理が重くなり、予期しないタイムアウトが発生する可能性があります。
開発環境で問題なくても、本番環境等で問題が起きてしまった際に取り返しのつかないケースが出てくるかと思われます。
そのため、将来的なデータ量の増加やパフォーマンスの劣化を考慮しながら開発を進めていくことをおすすめします！！
Zabbix5.0とZabbix7.0のAPI仕様が異なっていたためハマった話

## ZabbixのAPI使ってますか？
ZabbixのAPI使ってますか？
トラフィックデータを取ってきたり、ホストを登録したりいろいろできます
https://www.zabbix.com/documentation/7.0/en/manual/api

## API仕様でハマった
Zabbix5.0と7.0でAPIの仕様が微妙に異なっています

以下は認証時に投げるAPIのデータ部分です。
何と、paramsの中のuserがusernameになっている...
これに気付かず、無駄に2週間格闘してしまいました

zabbix5.0のAPI
https://www.zabbix.com/documentation/5.0/en/manual/api
``` Zabbix5.0のAPI
{
    "jsonrpc": "2.0",
    "method": "user.login",
    "params": {
        "user": "Admin",
        "password": "zabbix"
    },
    "id": 1,
    "auth": null
}
```

zabbix7.0のAPI
https://www.zabbix.com/documentation/7.0/en/manual/api
``` Zabbix7.0のAPI
{
  "jsonrpc": "2.0",
  "method": "user.login",
  "params": {
        "username": "Admin",
        "password": "zabbix"
  },
  "id": 1
}
```

# まとめ
バージョンアップしたらAPIの仕様もきちんと確認しよう

user→usernameは気付かないよ...
LaravelのログをCloudwatchに飛ばす

## 前提

- Ubuntu24.04


## インストール
```bash
wget https://s3.ap-northeast-1.amazonaws.com/amazoncloudwatch-agent-ap-northeast-1/ubuntu/amd64/latest/amazon-cloudwatch-agent.deb
```


※EC2のアーキテクチャを確認
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-commandline-fleet.html

## 
```bash
sudo dpkg -i -E ./amazon-cloudwatch-agent.deb
```

```bash
vim /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/laravel.json
```

## ステータス
```bash
systemctl status amazon-cloudwatch-agent.service
```

## 起動
```bash
systemctl start amazon-cloudwatch-agent.service
```


## 自動起動
```bash
sudo systemctl enable amazon-cloudwatch-agent
```

file_path部分はLaravelが配置されているパスに変更してください


```json
{
    "agent": {
        "run_as_user": "root"
    },
    "logs": {
        "logs_collected": {
            "files": {
                "collect_list": [
                    {
                        "file_path": "/var/www/html/storage/logs/laravel*log",
                        "log_group_name": "/ec2/laravel-log",
                        "log_stream_name": "laravel-log-%Y-%m-%d"
                    }
                ]
            }
        }
    }
}

````
ElastiCache Redisとは？

Amazon ElastiCache for Redisは、**AWSが提供するフルマネージドなRedisサービス**です。Redisのインメモリキャッシュ機能を活用しながら、**スケーラビリティ、可用性、パフォーマンスを向上させたクラウドサービス**として利用できます。

---

### **ElastiCache Redis の特徴**
1. **フルマネージドサービス**
   - AWSがインフラ管理を代行し、**サーバーのセットアップ、パッチ適用、バックアップ、自動フェイルオーバー**を実施。
   - ユーザーはアプリケーション開発に集中できる。

2. **高可用性とスケーラビリティ**
   - **レプリカセット**（プライマリと複数のリードレプリカ）を活用し、フェイルオーバー時のダウンタイムを削減。
   - **Auto Scaling**機能でワークロードに応じたスケールアウト・スケールインが可能。

3. **低レイテンシ・高スループット**
   - メモリ内でデータを処理するため、ミリ秒以下の高速レスポンスを提供。
   - **ゲーム、金融取引、リアルタイム分析**などの用途で活用される。

4. **セキュリティとアクセス制御**
   - **VPC内での通信をサポート**し、外部からのアクセスを制限可能。
   - **IAMベースのアクセス制御**、暗号化（TLS 1.2）、Redis AUTHをサポート。

5. **永続化（バックアップ & Snapshot）**
   - **自動バックアップ**機能により、データのスナップショットを保存可能。
   - データ損失を防ぐためのAOF（Append-Only File）オプションあり。

---

### **ElastiCache Redis のユースケース**
1. **Webアプリケーションのキャッシュ**  
   - **データベースのクエリ結果をキャッシュ**し、レスポンスタイムを大幅に向上（例：セッション管理、APIレスポンスキャッシュ）。
  
2. **リアルタイム分析 & ダッシュボード**  
   - **IoTデータ**や**株価データ**をリアルタイムにキャッシュ＆分析し、ダッシュボード表示を高速化。

3. **ランキングシステム**  
   - **Sorted Setを活用したスコアランキング**（例：ゲームのリーダーボード、人気商品のランキング）。

4. **メッセージング & Pub/Sub**  
   - **リアルタイムチャットアプリのメッセージ中継**や**通知システム**（RedisのPub/Sub機能を活用）。

5. **機械学習の特徴量ストア**  
   - **推論時の特徴量キャッシュ**（例：ユーザーの過去の行動履歴を即時参照）。

---

### **ElastiCache Redis の制限・落とし穴**
| 項目 | 説明 |
|------|------|
| **コスト** | 高速なパフォーマンスの代償として、使用量が増えるとコストが高くなる。 |
| **最大キーサイズ** | Redisのキーサイズは512MBまでだが、大量のデータを保持するとメモリ不足に。 |
| **フェイルオーバー時のデータ損失** | マルチAZレプリカなしでプライマリがダウンすると、データが失われる可能性。 |
| **スロットリング** | 高頻度のリクエストが発生すると、スロットリング（制限）にかかる可能性。 |
| **レプリカはリード専用** | レプリカノードは書き込み不可、スケールアウト時に注意が必要。 |

---

### **ElastiCache Redis の導入方法（Python）**
AWS SDK（boto3）を使ってElastiCache Redisに接続する簡単なコード例：
```python
import redis

# ElastiCache Redisのエンドポイントを指定
redis_host = "your-redis-endpoint.cache.amazonaws.com"
redis_port = 6379

# Redisクライアントを作成
client = redis.StrictRedis(host=redis_host, port=redis_port, decode_responses=True)

# データのセット
client.set("user:1001", "Alice")

# データの取得
print(client.get("user:1001"))
```
このコードを動かす前に、AWS ElastiCache Redisのエンドポイントを適切に設定する必要があります。

---

### **まとめ**
- **ElastiCache RedisはAWSが提供するフルマネージドなRedisサービスで、スケーラブルな高速キャッシュを提供**。
- **Webアプリのキャッシュ、リアルタイムデータ処理、ランキングシステムなどに適用**。
- **コストやデータ永続性、フェイルオーバー時の挙動に注意しながら設計が必要**。

AWS環境でRedisを使いたい場合、**ElastiCacheを活用すると運用負担が減り、スケーラビリティと可用性を確保しやすくなります**。
個人的備忘録：Cognito のログイン API を利用して JWT を取得する方法を体系的に整理してみた

## はじめに

JWT（JSON Web Token）は、認証の際にAPIリクエストを安全に行うための仕組みです。

:::note info
***最近、認証付きAPIを利用する機会が増えたため、JWTの取得方法について整理することにしました。***
:::

本記事では、さまざまな方法で JWT を取得する手順を紹介します。

## JWT (JSON Web Token) の取得方法

### YOUR_JWT_TOKEN_HERE とは？

API へのリクエストで認証を行うには、**JWT（JSON Web Token）** が必要です。JWT は、通常以下の方法で取得できます。

## **1. ログイン API を使って取得**

多くのアプリケーションでは、ログイン時に JWT を発行する API が用意されています。

例えば、以下のようなリクエストでログインし、JWT を取得できます。

```sh
curl -X POST "http://localhost:1323/api/login" \
     -H "Content-Type: application/json" \
     -d '{"username": "your_username", "password": "your_password"}'
```

レスポンスの例：

```json
{
  "token": "eyJhbGciOiJIUzI1NiIsInR..."
}
```

この `token` の値が `YOUR_JWT_TOKEN_HERE` に該当します。

## **2. 開発環境で `.env` や設定ファイルに記載されている場合**

開発用の JWT トークンが `.env` や `config.json` などに保存されている場合があります。
例えば、`.env` ファイルに以下のように記載されていることがあります。

```ini
JWT_SECRET=your_secret_key
JWT_TOKEN=eyJhbGciOiJIUzI1NiIsInR...
```

その場合、`JWT_TOKEN` の値を `YOUR_JWT_TOKEN_HERE` に入れてください。

## **3. サーバー側のコードを確認**

サーバー（バックエンド）のコードで、JWT をどのように発行しているかを確認できます。
例えば、Echo（Go言語のフレームワーク）を使っている場合、JWT の発行コードは以下のようになっているかもしれません。

```go
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
    "user_id": 123,
    "exp":     time.Now().Add(time.Hour * 24).Unix(),
})

tokenString, err := token.SignedString([]byte("your_secret_key"))
if err != nil {
    return err
}
```

この `tokenString` が JWT なので、これを取得して使います。

## **4. ブラウザの開発者ツールやネットワークログで確認**

もし JWT がブラウザで発行・使用されている場合、**開発者ツール（DevTools）** の「ネットワーク」タブでリクエストを確認すると、`Authorization: Bearer ...` のヘッダーに JWT が含まれている場合があります。

## **5. すでにログイン済みなら Cookie や LocalStorage に保存されている可能性**

一部のアプリでは、JWT をブラウザの **LocalStorage** や **Cookie** に保存していることがあります。

### **LocalStorage の場合**
1. 開発者ツールを開く（Chrome: `F12` または `Ctrl + Shift + I`）
2. `Application` タブ → `LocalStorage` → `http://localhost:1323`
3. `jwt` や `token` などのキーを探す

### **Cookie の場合**
1. `Application` タブ → `Cookies` → `http://localhost:1323`
2. `jwt_token` などのキーを探す

## **6. ダミーの JWT を生成する**

もし JWT を手元でテストするだけなら、[jwt.io](https://jwt.io/) で適当なトークンを作成することもできます。

## **まとめ**

| 方法 | 説明 |
|------|------|
| **ログイン API を使って取得** | 一般的な方法。認証サーバーにログインしてトークンを取得する |
| **.env や設定ファイルを確認** | 開発環境の設定ファイルにトークンがあるか確認 |
| **サーバーの JWT 発行コードをチェック** | バックエンドのコードを見て、JWT の発行方法を確認 |
| **ブラウザの開発者ツールで確認** | `Network` タブで API リクエストを確認し、JWT を探す |
| **LocalStorage や Cookie で確認** | ブラウザに保存された JWT を探す |
| **テスト用に `jwt.io` で生成** | 簡単なテスト用にダミーの JWT を作成 |

まずは、**ログイン API を試すのが一番確実な方法** です！
PMBOKにある「誠実さ」

# はじめに
* ここではPMBOK第7版にある「誠実さ」について記載する。

# 概要
* 「誠実さ」とは何か、について考えさせられる事例2つを記載。
* 弊社では持ち回りでスピーチがありその時の話題にしようとしたが、諸般の事情で発表の機会を失ってしまったのでこちらに記載。
* 内容は薄いが記載

# 詳細
* PMBOK 第7版のプロジェクト・チームの文化に、「誠実さ」というものがある。

## ケーキ屋さんの事例

* 誕生日ケーキを予約していて、13:00頃取りに行く予定だった。
* 出発の直前そのケーキ屋さんから電話あり。
* 作ったホールケーキを落としてしまったので、作り直すから夕方に取りに来てくれないか
* その内容でよいと返答し夕方受け取りに行った。


* これだけ聞くと単なるミスだが、ケーキを落とした事実をそのまま伝えたのはある意味で「誠実さ」に当てはまる。
* もし何らかの理由を後からつけて、作るのが遅れるという返答であったら、今回は受け取るが、次回からそのケーキ屋さんに頼まないかもしれない。



* プロジェクトでよくあるのが、工程遅延したときに、お客さんにはそれらしい理由付けで遅れている旨を回答し、さらに対応策を返答する。
* しかし事実と異なるため、対応策も事実とは離れている場合が多く、後で余計に苦労する、というようなこと。
* 正直に話しておけば、なぜ遅れているのか、どうやって挽回するのか、について整合性が取れており作業に集中できる。


### 過去の話
* 大昔1人で客先常駐で開発していた時、開発者は1人だったが、コード管理しようとしてVSSというツールを使っていた。(2000年初頭くらいまでは使えていたが今はなさそう。([参考](https://atmarkit.itmedia.co.jp/fdotnet/teamdev/teamdev03/teamdev03_03.html))
* この時操作を誤って2日分の開発を元に戻してしまった。(2日前にcommitした状態から全くcommitしておらず、VSSで管理されたファイルをローカルのファイルに上書きした)
* お客さんに正直に伝えたら、さすがに怒られたが、そのあと2時間程度で元の状態に戻せたので何とか事なきを得た。
* 2時間でリカバリできたので、誤魔化せたかもしれない。ただ2時間何やってるか不審な状態にはなるかもしれない。
* 2時間で戻せたことで、それはそれでよいと評価を受けたので、トラブル対応でお客さんの心象を逆に良くする、という例にも見えるが、個人的にはそういうのは本質ではない。
    * トラブル対応で心象をよくするのではなく、その後の対応における、(PMBOK)にある「誠実さ」や「透明性」があってこそ心象が良くなるのではないか。
【PowerShell】現在のマウスカーソルの座標を調べる方法

# 概要
PowerShellを使用して、現在のマウスカーソルの座標を調べる方法を記載しました。

# コマンド
以下のコマンドを入力してください。

### 入力
```powershell
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
Start-Sleep -s 5
$X = [System.Windows.Forms.Cursor]::Position.X
$Y = [System.Windows.Forms.Cursor]::Position.Y
Write-Output "X座標：$X | Y座標：$Y"
```

コマンドを実行して、`Write-Output "X座標：$X | Y座標：$Y"`の後に`Enter`キーを押すと、座標が表示されます。

### 解説
```powershell
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
```
- Windows Formsの機能をPowerShellで使用できるようにしています
- `System.Windows.Forms`にマウスカーソルの位置を取得する機能が含まれています
- `[void]`は戻り値を無視するための指定です

```powershell
Start-Sleep -s 5
```
- `-s`パラメータは秒単位での指定を意味します
- 5秒間の待機します
- この時間を使用して、測定したい位置にマウスカーソルを移動できます

```powershell
$X = [System.Windows.Forms.Cursor]::Position.X
$Y = [System.Windows.Forms.Cursor]::Position.Y
```
- 変数名の先頭に`$`を付けることで、変数であることを示すことができます
- `[System.Windows.Forms.Cursor]::Position`で現在のマウスカーソルの位置を取得できます
- X座標は画面左端からの水平距離を表します
- Y座標は画面上端からの垂直距離を表します
:::note
座標は画面左上を原点(0,0)としているイメージです。
:::

```powershell
Write-Output "X座標：$X | Y座標：$Y"
```
- `Write-Output`は出力コマンドのひとつです。ここでは取得した座標を出力しています

# 終わりに
マウスポインタの座標は画面の解像度によって変化するのでそこは要注意です。

# 参考
- [PowerShellでマウス操作「任意の場所をクリック」](https://tarenagashi.hatenablog.jp/entry/2020/12/07/213259)
柔道整復師のオンライン申請（療養費オンライン請求）の施策の経緯



## 概要
- 過去20年以上、柔道整復師の療養費請求の電子化は進んでいない。
- 各施術管理者（整骨院など）が各保険者に個別に請求する必要がある。
- 請求ルートは多数かつ複雑な状態だ。

## 問題点
- 多くの施術所が請求事務を専門の請求代行業者に委託している。
- 請求代行業者は受領委任契約の当事者ではなく、行政の指導・監査が及びにくい。
- 不正事例も発生している（例：令和3年1月「ホープ接骨師会」の私的流用事件）。

## 政府の動きと議論の強化
- 令和3年（2021年）の政府方針で議論が強化された。
- 令和3年12月の規制改革推進会議で「公的な関与の下での請求・審査・支払い」とオンライン請求の導入が検討された。
- 厚労省は柔整療養費のDX推進に本格的に取り組むことになった。

## 専門委員会の活動
- 令和3年8月以降、社会保障審議会 医療保険部会 内の柔道整復療養費検討専門委員会で議論が始まった。
- 令和4年（2022年）にオンライン請求の基本的方向性が整理された。
- 第23回専門委員会では今後の進め方が提案された。
- オンライン請求導入の目的は以下の通り。
  - 療養費を施術者に確実に支払う
  - 請求代行業者による不正行為を防止する
  - 施術所や保険者の事務を効率化する
  - 審査の質を向上させる
  - データ分析で施術の質を高める

## ワーキング・グループの設置
- 令和4年末に「柔道整復療養費のオンライン請求導入等に関するワーキング・グループ」が設置された。
- 制度設計やシステム整備の具体的な検討が始まった。

# 現行のオンライン申請（請求）制度と課題

## 現状
- 2020年代半ば時点では、オンラインによる療養費申請は本格導入されていない。
- 療養費請求は各施術所から各保険者へ紙で行われる。
- 多くの施術所が団体や民間会社の請求代行サービスを利用している。

## 課題
- 請求代行業者による請求は行政の監督が不十分で不透明な面がある。
- 複雑な請求ルートのため、統一的な電子請求システムの構築が難しい。
- 各保険者ごとに審査・支払事務が行われ、審査基準や支払いの平準化が困難。
- 現在は各団体・地域でばらばらに運用される請求書様式や記載項目の標準化が必要。
  - 施術内容や負傷部位のコード化
  - 施術管理者や施術所の識別コードの整理
  - 患者署名の電子化
  - 添付書類の扱い
  - チェック項目の設定
- 現行の「施術管理者番号」に代え、免許登録番号の活用が検討されている。
- 小規模施術所でも利用できる簡素で低コストな仕組みが求められる。
- 各保険者の自主性（裁量）にも配慮が必要だ。

# オンライン申請（請求）の今後の方針とロードマップ

## 今後の計画
- 令和8年度（2026年度）からの本格導入を目標とする。
- 社会保障審議会のロードマップ案では、令和8年4月頃のオンライン請求開始が検討されている。
- 政府全体のデジタル化推進方針と歩調を合わせる。
- 業務フローの見直し、施術所・保険者・審査支払機関の準備、費用負担の検討が進められる。

## ワーキング・グループの取り組み
- 2023年度以降、施術所や保険者団体、支払基金・国保連合会など関係者が詳細設計を議論する。
- 2024年度にはシステム開発・テストの準備に移行する見通し。

## システムの基本構想
- 既存の診療報酬オンライン請求のネットワーク基盤を活用する。
- 請求先は各保険者から審査支払機関に一本化される。
- 支払基金等が内容審査を行い、各保険者の支給決定を経て施術所へ支払いを代行する。
- 経過措置期間を設け、段階的に完全移行する方策も検討される。
- 進捗に遅れが生じた場合はスケジュールの見直しも検討する。

# 関連する制度改正と厚生労働省の見解

## 制度改正の動向
- 令和4年の療養費改定で、明細情報の提供義務が強化された。
- 従来は有償で明細書を発行していたが、原則として無償交付する義務が課される。
- これにより、施術内容や請求額の透明性が向上し、不正請求の抑止につながる。

## オンライン資格確認の導入
- 厚労省はオンライン請求と連動して、マイナンバーカードを利用したオンライン資格確認の導入も進めている。
- 令和5年以降、柔道整復師などの施術所に対してオンライン資格確認機器の導入補助が行われ、説明会や周知が進められている。
- 将来的にオンライン請求とデータ連携することも視野に入れている。

## 厚労省の基本方針
- 現行法令との整合性を保ちながら制度構築を進める。
- 健康保険法に基づき、最終的な支給決定権は各保険者にある前提で設計する。
- 審査支払機関による審査・支払代行を行う際は、法的根拠を明確にし、保険者の権限や過誤調整の手続を損なわないよう配慮する。
- 保険者の任意性を尊重しつつ、インセンティブを与える制度設計が議論されている。
- 関係者の合意形成の下、2026年度のオンライン請求開始を目指す。必要に応じて制度の見直しや法改正も検討される。

## 全体の意義
- 不正防止と給付の適正化を図る。
- 国民にとって便利で安心な医療保険利用環境の整備につながる。
- 厚労省は今後も公式サイトなどで最新の方針や進捗を公表する予定だ。
【ServiceNow】エラーメッセージを作成してみよう。

前回の記事
----
https://qiita.com/masa3150/items/9ccef61841f6e4e8b4e8

作成手順
---


①フィルターナビゲータより「メッセージ」と入力し、「システムUI」＞「メッセージ」を選択する

![スクリーンショット 2025-02-28 12.01.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3154654/0e6a6d64-7fc3-4f79-adb7-1dfa43d5f639.png)

②新規ボタンを押下し、メッセージのレコードを作成し「送信」ボタンを押下する。
![スクリーンショット 2025-02-28 13.13.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3154654/64078e25-86b8-4ea5-a482-6dcb36f16095.png)

![スクリーンショット 2025-02-28 13.25.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3154654/4b544b37-181d-43fa-bf0e-038a52c3deec.png)


:point_up:オブジェクト{0}などを使用することで、このメッセージを呼ぶ際に、指定されたメッセージ内の変数を置き換えることができます。

③レコードが作成されていることを確認する。
![スクリーンショット 2025-02-28 13.27.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3154654/04903627-72b5-45e3-b98d-651a524e2d52.png)

エラーメッセージの確認
---

①UIアクションを使用して、スクリプトに先程作成したエラーメッセージを呼ぶコードを記載する。
※確認方法はUIアクション以外にもあるが、今回の記事ではUIアクションを使用します。

![スクリーンショット 2025-02-28 13.43.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3154654/89ad8f3a-14ce-473b-a46b-72478f831e2d.png)

:point_up:{0}のところを「開始日時」の文字列を渡すようにしています。

②UIアクションを実行する。
![スクリーンショット 2025-02-28 13.45.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3154654/cf0d136a-1f43-4a3e-800b-31c8a8cb3580.png)

③想定したエラーメッセージが表示されたことを確認する。
![スクリーンショット 2025-02-28 13.48.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3154654/d31de0b5-c3c7-496e-b2dc-8645b10c5bdf.png)


終わりに
---
エラーメッセージについては、どの現場でも使用しています。同じレコードを使用し、状況に応じてある特定の場所の文言を変更したい場合などは、今回のようなオブジェクトを使用するといいと思います。


参考
---
https://developer.servicenow.com/dev.do#!/reference/api/vancouver/server_legacy/c_GlideSystemAPI#r_GS-getMessage_S_O?navFilter=getM
PicoRubyをESP32マイコン上で動かすR2P2-ESP32のはじめかた

[R2P2](https://github.com/picoruby/R2P2) はRaspberry Pi Pico上で動作する [PicoRuby](https://github.com/picoruby/picoruby) で書かれたシェルシステムです。

私はこのR2P2をESP32という別のマイコンで動作させる取り組みをしています。先日、 [R2P2-ESP32](https://github.com/picoruby/R2P2-ESP32) という名前でGitHubリポジトリも公開しました。

https://github.com/picoruby/R2P2-ESP32

本記事では「ESP32でも動くならちょっと試してみようかな」と思った方向けに、R2P2-ESP32のはじめかたをまとめようと思います。

## 準備物

R2P2-ESP32をはじめるにあたり次のものを準備してください

- PC
    - MacOSおよびUbuntuでビルド・書き込みができることを確認しています
- ESP32マイコンボード
    - 現時点(2025-02-28)では、次の2種類のマイコンボードで動作確認をしています
        - ESP32-DevKitC
            - https://akizukidenshi.com/catalog/g/g115673/
        - M5Stamp C3 Mate
            - https://www.switch-science.com/products/7474
    - 他のESP32マイコンボードでも理論上は動作するはずなので、「動作確認できたよ！」という方は教えていただけると大変助かります🙇‍♂️

## 開発環境の構築

R2P2-ESP32はESP-IDFと呼ばれるESP32向けの公式開発環境を用いて開発しています。現時点ではビルド済みのイメージは公開していないですし、ビルドなしで任意の `.rb` `.mrb` といったファイルを実機上に配置する手段も用意できていないため、ESP-IDFを用いた開発環境を構築いただく必要があります。

こちらのドキュメントを参考に、環境を構築してください。ESP-IDFのバージョンはv5.4で動作確認ができています。

https://docs.espressif.com/projects/esp-idf/en/release-v5.4/esp32/get-started/linux-macos-setup.html

上記に加えて、PCにRubyをインストールしておいてください。

## コードの取得とセットアップ

開発環境を構築できたらソースコードを入手してセットアップをしてください。次のコマンドをPCで実行します。

```sh
$ git clone --recursive https://github.com/picoruby/R2P2-ESP32.git
$ cd R2P2-ESP32
$ rake setup_esp32   # ESP32-DevKitCをお使いの場合
$ rake setup_esp32c3 # M5Stamp C3 Mateをお使いの場合
```

`rake setup_esp32` コマンドではR2P2-ESP32が内包しているPicoRubyのビルドを行っています。

もしここでエラーが出る場合、ESP-IDFの環境変数が設定できていない可能性が高いです。[こちらの手順](https://docs.espressif.com/projects/esp-idf/en/release-v5.4/esp32/get-started/linux-macos-setup.html#step-4-set-up-the-environment-variables) を参考に、以下のコマンドを実行した上で再度実行するようにしてください。

```sh
$ . $(ESP-IDFのインストール先)/export.sh
```

## ビルド・書き込み・シリアル接続

ESP32マイコンボードをPCに接続した状態で `rake` を実行すれば、ビルド・書き込み・シリアル接続まで全自動で実行できます。

個別に実行したい場合のコマンドも併記しますので適宜活用ください。

```sh
rake       # ビルド->書き込み->シリアル接続

rake build   # ビルドのみ
rake flash   # 書き込みのみ
rake monitor # シリアル接続
```

## 起動確認

ここまでの手順を正常に実施できていれば、次のような見慣れたロゴが出力されるはずです。

![idf_py_monitor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/98c2f1e5-8d13-42bc-91d5-26ae45c04d7f.png)

## 使い方

### irbを起動する

R2P2と同様、irbが使えます。シリアル接続したときに表示されたプロンプトに対して `irb` と入力してみてください。

![rake.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/6c9423e6-e98d-423c-986b-d1102e08541c.png)

### .rb .mrbを書き込む

前述の通り、現時点ではビルドを経由しないとESP32マイコンボードにスクリプトを書き込むことができません。プロジェクト直下の `storage/home` 配下にファイルを格納して、ビルド・書き込みを実行することで書き込みができます。

```sh
$ cat storage/home/sample.rb
message1 = 'Hello'
message2 = 'World!'
puts [message1, message2].join(' ')

$ rake build flash
```

書き込んだファイルは `ls` コマンドで確認でき、 `./(ファイル名)` にて実行ができます。

![idf_py_monitor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/c860cec5-8643-4e8c-958a-5c24bc358e90.png)

ちなみに、 `app.rb` または `app.mrb` という名前のファイルを `/home` 直下に格納すると、起動時に自動的に実行されるようにしています。(両方のファイルが同時に存在する場合 `.mrb` のみを実行)

## まとめ

このように必要最低限の動作はするようになりましたが、ペリフェラルは現時点でGPIOのみ実装した状況ですし、まだまだポーティングすべき機能は山ほどあります。

興味を持っていただけた方はぜひお試しいただき、もしよければフィードバックやコントリビュートを頂けると大変嬉しいです...！
Qiita投稿の目的

# はじめに
これからQiita投稿を始めるにあたり、なぜ情報発信をするのかあとで目的を見失わないように整理しておこうと思います。
今後下記以外にも情報発信のメリットを知ったり、目的が増えたら適宜修正します。Qiita投稿を始めようか迷っている方は一つの例として見ていただけたらなと思います。

# 情報発信をする目的
- 学習した内容の定着
  - 情報発信を意識すると、人に説明できるくらいの理解力が前提になるから結果的に学習にプラスに働く。
  - 上のと似てるけどアウトプット前提になるから学習時の意識にプラスに働くのと、シンプルにアウトプットの機会を得られる。
    - この辺の話は「[世界一流エンジニアの思考法](https://www.amazon.co.jp/dp/B0CKSZV5DQ?ref_=cm_sw_r_cp_ud_dp_B44TTZY3HRAP0SGVMNK2 "")」で言及されているようなので今後読んでみたい。
  - あとで見返したときに過去の自分が何を考えていたのか思い出しやすくなり復習の質が上がる。
- インプットの習慣が身につく。
  - 情報発信の習慣が身につけばインプットが必要に迫られるので必然的に一定のインプット量を維持できる。

# 今後投稿していきたい内容（今のところ）
- 日々の学習記録
- 気づいたこと
- やってみた系

# おわりに
よろしくお願いします

# 参考
[成長の為にアウトプットがなぜ必要なのか。mattn氏が語る持続的なアウトプットのススメ](https://levtech.jp/media/article/column/detail_433/#ttl_3 "") 

[エンジニアが絶対に技術発信をするべき理由。Qiita,X,YouTube等](https://youtu.be/ByX5DjLC0w4?si=bL327MVGsDhYFoOk "Qiita Home")
 
[私がアウトプットできるようになった理由](https://qiita.com/mkt_hanada/items/923bbf9a9e51d6aa16b3#%E3%82%A2%E3%82%A6%E3%83%88%E3%83%97%E3%83%83%E3%83%88%E3%81%97%E3%81%9F%E3%81%84%E3%81%A8%E6%80%9D%E3%81%A3%E3%81%9F%E7%90%86%E7%94%B1 "")