OmniAICreator/Qiita-1.07M huggingface dataset:
Model Context Protocol (MCP) 

## MCPの基本概念
**Model Context Protocol (MCP)** は、LLMに特定の情報源（YouTube、Webページ、コードなど）を参照させるための標準化されたプロトコルです。
基本構文は `mcp-[ソースタイプ]://[識別子またはURL]` の形式です。

## MCPを使用する利点
- **明確な指示**: AIに対して処理方法を明示的に指定できる
- **曖昧さの排除**: 複数の情報源を区別可能
- **特殊処理の有効化**: 特定のデータ形式に最適化された処理が期待できる
- **パラメータ指定**: 追加情報（時間範囲など）の指定が可能
- **標準化**: 異なるAIシステム間での一貫性を確保

## 主なMCPタイプと使用例

| カテゴリ | MCP構文 | 使用例 | 備考 |
|---------|---------|---------|---------|
| **Web系** |  |  |  |
| ウェブページ | `mcp-web://[URL]` | `mcp-web://https://example.com/article` | 一般的なWebページ参照 |
| YouTube | `mcp-youtube://[URL]` | `mcp-youtube://https://youtube.com/watch?v=abc123` | 動画コンテンツ分析 |
| Twitter/X | `mcp-twitter://[URL]` | `mcp-twitter://https://twitter.com/user/status/123` | ツイート分析 |
| **コード系** |  |  |  |
| GitHub | `mcp-github://[ユーザー]/[リポジトリ]` | `mcp-github://openai/whisper` | リポジトリ分析 |
| コードスニペット | `mcp-code://[言語]` | `mcp-code://python def hello(): print("Hi")` | コード解析 |
| **データ系** |  |  |  |
| CSV | `mcp-csv://[ID]` | `mcp-csv://sales_data 商品,価格,数量...` | 表形式データ分析 |
| JSON | `mcp-json://[ID]` | `mcp-json://user_data {"users":[...]}` | 構造化データ解析 |
| SQL | `mcp-sql://[DB名]` | `mcp-sql://sales SELECT * FROM...` | クエリ結果解析 |
| **文書系** |  |  |  |
| PDF | `mcp-pdf://[URL]` | `mcp-pdf://https://example.com/doc.pdf` | PDF文書解析 |
| ドキュメント | `mcp-doc://[ID]` | `mcp-doc://project_proposal` | 文書参照 |
| **メディア系** |  |  |  |
| 画像 | `mcp-image://[URL]` | `mcp-image://https://example.com/chart.png` | 画像分析 |
| 音声 | `mcp-audio://[URL]` | `mcp-audio://https://example.com/audio.mp3` | 音声分析 |
| **その他** |  |  |  |
| API | `mcp-api://[URL]` | `mcp-api://https://api.example.com/v1/data` | API参照 |
| チャット履歴 | `mcp-chat://[ID]` | `mcp-chat://previous_session` | 会話履歴参照 |

## タグ省略と自動認識
- 多くのAIはURLや形式が明確なデータを**自動認識**できる
- 単純なケース（単一URL、明確なJSON）では明示的なタグなしでも機能
- 複雑なケース（複数の情報源、特殊パラメータ）では明示的なタグ推奨

## 高度な使用テクニック
- **複数MCP**: `mcp-web://site1 と mcp-web://site2 を比較`
- **パラメータ指定**: `mcp-youtube://...?start=120&end=180`
- **範囲指定**: `mcp-web://...#section2` 特定セクションのみ参照

## 実践的なプロンプト例
1. **コードレビュー**:
   ```
   mcp-code://python
   def fibonacci(n):
       if n <= 1: return n
       return fibonacci(n-1) + fibonacci(n-2)
   このコードの効率性問題を指摘し、改善案を提示してください。
   ```

2. **データ分析**:
   ```
   mcp-csv://sales
   日付,商品,金額
   2023-01-01,A,1200
   2023-01-02,B,980
   月間売上レポートを作成してください。
   ```

3. **情報比較**:
   ```
   mcp-web://https://company1.com と mcp-web://https://company2.com の
   製品機能を比較した表を作成してください。
   ```

## 注意点
- すべてのAIプラットフォームがMCPを同様に実装しているわけではない
- 外部情報へのアクセスはモデルの仕様と制限に依存する
- 最新のAIプラットフォームのドキュメントを参照することを推奨

MCPは進化中の標準であり、プラットフォームによってサポート状況や機能が異なる場合があります。
C#でIoTプログラミング on ESP32 #9 -  サーミスタ

今回はサーミスタのサンプルプログラムです。
サーミスタは温度によって抵抗値が変化する半導体です。
使用するのはNTCサーミスタです。周辺温度が高くなると抵抗値が減少します。
サーミスタの抵抗値は次の計算式で求めることができます。
```math
Rt=R*EXP[B*(\frac{1}{T2}-\frac{1}{T1})]
```
Rt・・・ T2温度下でのサーミスタの抵抗値
R ・・・ T1温度（273.15+25℃)下でのサーミスタの抵抗値（10KΩ）
B ・・・ サーミスタの固有値（3950）

回路上ではR(10KΩ)とサーミスタを直列でつないで、その間の電圧を測ることでサーミスタの抵抗値を求めることができます。

最終的にT2の値を求める式は次のようになります。
```math
T2=1/(\frac{1}{T1}+ln(\frac{Rt}{R})/B)
```

## ハードウェア
・Freenove ESP32-S3-WROOM Board or Espressif ESP32-S3-DevKitC
・NTCサーミスタ
・ブレッドボード
・10kΩ レジスタ
・ジャンパーワイヤ

## 配線
![Thermistor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62606/84110b22-2dcd-409c-895c-0aa4b9d8479d.png)

## 導入パッケージ
・nanoFramework.System.Device.Adc
・nanoFramework.System.Math

## プログラミング
```C#:Program.cs
using System;
using System.Device.Adc;
using System.Diagnostics;
using System.Threading;

namespace ESP32S3_Thermistor
{
    public class Program
    {
        public static void Main()
        {
            AdcController controller = new AdcController();
            AdcChannel channel = controller.OpenChannel(0);

            while (true)
            {
                int value = channel.ReadValue();
                double voltage = value / 4095.0 * 3.3;
                double rt = 10 * voltage / (3.3 - voltage);
                double tempk = (1.0 / (1.0 / (273.15 + 25.0) + (Math.Log(rt / 10.0)) / 3950.0));
                double tempc = tempk - 273.15;

                Debug.Write("value = " + value.ToString());
                Debug.Write(", voltage = " + voltage.ToString("F2"));
                Debug.WriteLine(", temp = " + tempc.ToString("F2"));

                Thread.Sleep(1000);
            }
        }
    }
}
```

プログラムを実行するとデバッグウィンドウにアナログ値、電圧、温度が表示されます。
サーミスタに指を当てて温めると電圧とともに温度が上昇するのを観察できます。
FastAPIを使ってみたときのメモ

# FastAPI とは
- PythonのWebフレームワーク
- APIを手軽に作れる
- Python3.6以降で利用できる

# 実行環境
- OS:Ubuntu 24.04.2 LTS（WSLではなくベアメタル環境です）
- Python: 3.12.3

# 環境準備
- ディレクトリを作成
```
mkdir Hello_FastAPI
```

- 作成したディレクトリに移動
```
cd Hello_FastAPI
```
- VENVを使用し仮想環境を作成
```
python3 -m venv env
```
- 仮想環境に入る
```
source ./env/bin/activate
```

もしくは

```
. ./env/bin/activate
```
- FastAPIをインストールする
```
pip install fastapi
```
 - FastAPIの実行にはASGIサーバーが必要になるのでUvicornをインストールする
```
pip install uvicorn 
```

# 実際にコードを書く
- `main.py`を作成し、以下のコードを記述する。
```main.py
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def root():
	return {"message": "Hello World!"}
```

# 実行してみる
- ターミナルにてコマンドを実行してサーバーを起動する。
```
uvicorn main:app --reload
```
このようにターミナルに表示される。
![Screenshot from 2025-03-08 17-09-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727062/f8c406fa-65dc-4bd2-a758-430b9f860167.png)

- ブラウザを起動して`localhost:8000`にアクセスし動作を確認します
![Screenshot from 2025-03-08 17-23-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727062/a1012a71-6d6d-493c-a38f-b20da2dfb5f6.png)
このように表示されれば無事に動いています。

# APIドキュメントの自動生成
FastAPIの特徴の一つにAPIドキュメントの自動生成があります。
ブラウザで`http://localhost:8000/docs`にアクセスします。
![Screenshot from 2025-03-08 17-52-56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727062/b39985af-8c85-49c6-94e1-64f46d60098e.png)

このような形で、APIドキュメントを確認することができます。

# 終わりに
FastAPIを動かすことができました。
これだけでは面白みがないので、次回はDBとの連携をしてみようと思います。

# 参考
FastAPI公式：https://fastapi.tiangolo.com/ja/![Screenshot from 2025-03-08 17-09-12.png]
エピポーラ幾何(Epipolar幾何)と基礎行列(Fundamental Matrix)まとめ

当記事ではSLAM(Simultaneous Localization and Mapping)を行う際などによく出てくるエピポーラ幾何(Epipolar Geometry)や基礎行列(Fundamental Matrix)について取りまとめます。
配列検索! 配列から最小 index を探す方法！

Paizaで「特定の財産額を持つ人を探す」問題に挑戦！でも .length で k を取得しようとしてズッコケ、Number() を忘れて比較エラー…。配列検索の基礎をガッツリ学んだのでシェアするよ！

<br>**問題概要**
1から n まで番号がついた人々の財産リスト a_1, ..., a_n がある。財産が k 円の人の番号を出力する。ただし、同じ k を持つ人が複数いた場合は 最も小さい番号を出力する。
```
n
a_1
...
a_n
k
```

<br>入力例
```
5　//n
3
7
5
7
2
7　// k
```
出力例
```
2
```


<br>**NG例**（今回やらかしたコード）
```js
const N = lines[0]; // ❌ Number()を忘れた
const k = Number(lines.length); // ❌ .length は配列の要素数！
for (count = 1; count <= N; count++) { // ❌ let なし
    if (lines[count] === k) { // ❌ 数値変換忘れ
        console.log(count);
        break;
    }
}
```

<br><br>**OK例**（修正コード）
```js
const N = Number(lines[0]);  // ✅ しっかり数値変換！
const k = Number(lines[N + 1]);  // ✅ k の正しい取得方法！
for (let count = 1; count <= N; count++) {
    if (Number(lines[count]) === k) {
        console.log(count);
        break;
    }
}
```

ミスしないためのポイント
✅ Number() を忘れると文字列比較になってバグる！
✅ for ループの let を忘れるとグローバル変数になってエラー！
✅ break; を使えば最初に見つけた k でループを抜けられて効率的！
✅ .length は配列の要素数であり、k の取得には関係ない！
   →配列の最後の要素を取りたいなら `lines[lines.length - 1]`を使うべき？

<br>**まとめ**
配列検索で「最初に見つけた位置」を出力するならインデックス記録が最適解！

🔹 フラグ vs インデックス記録：found フラグで判定する方法もあるけど、
　　この問題ではインデックス記録の方がシンプル！
  
🔹 forEach は break できない → for ループを使おう！


👉 [僕の失敗談と解決話！](https://paizabeginner.wordpress.com/2025/03/08/paiza%e3%81%a7%e5%9f%ba%e6%9c%ac%e3%83%9e%e3%82%b9%e3%82%bf%e3%83%bc-index%e5%8f%96%e5%be%97%e3%81%a8%e3%81%af%ef%bc%9fjs%e3%81%a7%e9%85%8d%e5%88%97%e6%a4%9c%e7%b4%a2%e3%81%ae%e5%9f%ba%e6%9c%ac/)
第18回 NATの技術① スタティックNAT

お久しぶりです。
以前投稿した時から4年ほどの月日が経過しました。
この数年間で多くのネットワーク技術に触れ、去年CCIEにも合格することができました。
自分の経験をアウトプットとして残し、誰かの役に立てればと思ったので、またこのブログを再開します。
気が向いたときに更新していくので、もしよければ時々覗きに来てくださいませ。

復活最初の内容としてNATに関して記事を書こうと思います。

## NATとは

現場でよく見かける技術であるNAT(Network Address Translation)
これはIPアドレスを変換するために使用されている技術です。
たいていの現場では、**プライベートアドレスをグローバルアドレスに変換**するために使用されていますが、これが使用される背景としてお互いの送信元、宛先アドレスを変換することで誰から通信が来ていたのか、また誰に向けて通信をしているのか知られることを防ぐ**セキュリティとしての機能**を持っています。

このNATもいろいろな種類があり、主に使用されているのは**以下2つ**です。
①NAT
②ダイナミックNAT、PAT

いろんな現場でよく見かけるNATですが、これがどうやって機能しているのか参考書だけではなかなかイメージが難しいという方もいるかもしれません。
僕は検証環境を作り、パケットキャプチャをして何度も作り直してやっと理解できました。

よく見かけるけど、きちんとイメージできて仕組みを理解するのは以外にも難しいNATに関して検証環境の構成図も使用して説明していきます。

## NAT
NATを説明する前に、通信というものがそもそもどうやって行われているのかですが
通信は、ルーターやパソコンからパケットといわれる荷物のような物を送りたい相手に届け、受け取った相手は貰いましたよ！という返事をすることで成り立っています。
**メージ図　(荷物)パケットの中身**
![記事用2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559536/7476198c-60cd-4ad8-a11c-c8c706b93e7c.png)


分かりやすい例だと、自宅からアマゾンでポチって**アマゾン倉庫から自宅に向かって商品が届く**際。
商品の**送信元アドレスはアマゾン倉庫**。商品の**宛先アドレスは自宅**とイメージしてもらえればいいです。
**イメージ図**
![記事用1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559536/05bb442f-6fa4-4ad4-91be-feb3ee1d6ea3.png)

倉庫を出発した荷物は、ルーターを経由して自宅に届きますが、その際倉庫のIPアドレスが知られてしまうと今後、セキュリティ攻撃などの対象になってしまうリスクがあるとします。
それを防ぐため、ルーターを経由したときにアドレスを変えてしまう技術。これがNATです。
イメージ図にある**inside,outside**ですが。
insideは**アマゾン倉庫の縄張り**、outsideは**自宅の縄張り**と考えてください。

画像では、アマゾン倉庫の送信元(192.168.1.1)から自宅(172.16.1.1)に向けて送られた通信は、ルーターを経由した後**55.16.1.199**に変換されています。
このように**パケットのアドレスを変える技術**がNATになります。

*イメージ図
![記事用3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559536/f1b3ca14-d13b-423d-ab04-7cdb5c8c4df0.png)

```ruby:##ルーター設定(inside NAT)
interface GigabitEthernet0/0
 ip address 192.168.1.2 255.255.255.0
 ip nat inside
no shut

interface GigabitEthernet0/1
 ip address 172.16.1.2 255.255.255.0
 ip nat outside
no shut

ip nat inside source static 192.168.1.1 55.16.1.199
```



## Outside NAT
先ほどはinside側(アマゾン倉庫)からoutside(自宅)に抜ける際にアドレスが変換されていますが、これとは逆に
自宅からアマゾン倉庫に向けて注文をする際、自宅のアドレスを知られることもセキュリティリスクを含むことがあります。**それに備え、outsideからinsideに向けた通信のアドレス(荷物の住所)を変換**することも可能です。
![記事用4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559536/0f5ab9ae-9abd-4af1-87b4-c29f3d6cd9d4.png)

注意することとしてoutsideからinsideに向けてNATをする際、Ciscoの機器を使う場合は通信の処理順序が異なることも考慮して設定をする必要があります。検証環境ではルーターがスイッチを経由してPCにつながっていますが**現場は複数のルーターが絡んでくるNATが大半**なので注意してください。

```ruby:##ルーター設定(outside NAT)
interface GigabitEthernet0/0
 ip address 192.168.1.10 255.255.255.0
 ip nat inside
no shut

interface GigabitEthernet0/1
 ip address 192.0.2.10 255.255.255.0
 ip nat outside
no shut

ip nat outside source static 192.0.2.1 192.168.1.2
```

## 参考 Cisco機器におけるNATの処理順序
![記事用5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559536/4ee5bd0f-ba85-4f12-8cc0-9aa38d412392.png)



## 次回予告
複数のIPアドレスを使用してNATを行う**ダイナミックNATとPAT**に関して作成予定
apschedulerでスケジューラーにJobを追加するJobをスケジュールする

## 概略
pythonにおいてAPSスケジューラーを使い、指定時間にスケジューラーへ新しいJobを追加するJobを実行するコードの備忘録。

- JobAはJobBを指定時間に追加するJob
- JobAの実行は指定時間にスケジュールされる

実行の流れは
1. JobAを指定時間に実行するようにスケジュールする
1. 指定時間にJobAが実行され、JobBがスケジューラーに追加される
1. JobBの実行指定時間になるとJobBが実行される

ポイントはスケジューラーをサブスレッドにして開始して、メインスレッドでJobをスケジューラーに追加する。

## 今回使用した環境
OS : Win11 (Raspberry pi5 でも動作確認済)
python Version: 3.12.9
APScheduler Version: 3.11.0

## コード
``` python
"""スケジューラーにJobを追加するJobをスケジュールする"""
from apscheduler.schedulers.blocking import BlockingScheduler
from datetime import datetime,timedelta
import threading

def JobA(scheduler:BlockingScheduler,job_runtime:datetime):    
    """JobA(JoBをスケジューラーに追加する。)

    Args:
        scheduler (BlockingScheduler): スケジューラー
        job_runtime (datetime): JobB実行時間
    """
    print(f"JobA実行:{datetime.now()}")
    scheduler.add_job(JobB,"date",run_date=job_runtime)
    print(f"JobB {job_runtime}の実行をスケジューラーに追加:{datetime.now()}")
    
def JobB():
    """JobB(JobAによりスケジューラーに追加される)
    """
    print(f"JobB実行:{datetime.now()}")
    
def StartSceduler(scheduler:BlockingScheduler):
    """スケジューラー開始（スレッド用）"""    
    print(f"スケジューラー開始:{datetime.now()}")
    scheduler.start()
    
if __name__ == "__main__":
    global_scheduler = BlockingScheduler()
    #スケジューラーのインスタンス
    jobA_runtime = datetime(2025,3,8,17,21)
    #JobAを実行する時間
    arg_tuple = (global_scheduler, jobA_runtime+timedelta(seconds=30))
    #JobBをスケジューラーの追加する引数、tuple(スケジューラーインスタンス、JobB開始時間＝JobA開始30秒後)
    global_scheduler.add_job(JobA,"date",run_date=jobA_runtime,args=arg_tuple)
    #JobAをスケジューラーに追加する。
    thread = threading.Thread(target=StartSceduler,args=[global_scheduler])
    #スレッドのインスタンス、サブスレッドでスケジューラーを開始する。
    thread.start()
    #スレッド開始する。
    thread.join()
    #スレッドを実行するためにロック
```

## 実行結果
```shell
スケジューラー開始:2025-03-08 18:31:17.073882
JobA実行:2025-03-08 18:32:00.000911
JobB 2025-03-08 18:32:30の実行をスケジューラーに追加:2025-03-08 18:32:00.001461
JobB実行:2025-03-08 18:32:30.000939
```

## 今回の方法を必要とした背景

### やりたいことと問題
- 指定日と指定時間にJobを実行したい
- しかし具体的指定時間は当日にならないと確定しない

### 解決策（今回の方法）
- 指定日の朝に具体的な時間を調べて、具体的な時間を確定させる
- その具体的な時間を指定してJobをスケジューラーに追加する
「Qiskit Developer試験」の実行環境を簡単に用意するリポジトリを作ってみました

# 結論

「IBM Certified Associate Developer - Quantum Computation using Qiskit v0.2X」（以降、Qiskit Developer試験）で登場するQiskit v0.2xの実行環境をサクッと作成するリポジトリを公開したので、記事にしてみました。

ぜひ試験勉強される方は使ってみてください。
https://github.com/lxizaxi/ibm-qiskit-v0.2x-cert

# 経緯

「Qiskit Developer」試験の勉強をしていて、普通に `pip install qiskit` をすると、最新ver（記事執筆時、ver1.4.1）がインストールされてしまい、「Qiskit Developer」試験で登場するコードがそのまま動作せず困っていました。

v0.2x代をインストールしようとすると依存関係のトラブルで意外とすんなりいかなかったので、簡単に実行環境を作成できる断面でリポジトリとして公開することにしました。（ほぼ自分用ですが…）

あと、最近 `jupyter`よりも `marimo` が良さそう的な[面白そうな記事](https://qiita.com/__Kat__/items/0970eb96d62f1ba9dc12)を見て使ってみたかったので、`marimo` も入れています。

# 使い方

[こちらのリポジトリ](https://github.com/lxizaxi/ibm-qiskit-v0.2x-cert)をcloneしてきたら、READMEに記載した通り、下記のコマンドを実行して仮想環境のセットアップをしてください。

※uvは[公式のInstallation](https://docs.astral.sh/uv/getting-started/installation/)を読んで、予め入れてください

```sh
$ uv sync
$ . .venv/bin/activate
```

仮想環境に入ったら、下記のコマンドを実行してTerminalに表示されたリンクを踏んで、`marimo` にブラウザアクセスしてください。（`jupyter` とほとんど同じ操作感 ）

```sh
$ uv run marimo edit main.py
```
後は`jupyter`と同じようにセル内でコードを書けばOK。`marimo`は結構UIが綺麗で良いですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880257/43ea8372-cd6d-4c55-beb8-6f7583387bcd.png)

# 最後に

ver依存直すのが結構大変だったため、結構時間を溶かしました…
結構治し方適当だったため、まだver依存治しきれていないところあるかもです。
（気づいたら修正しようと思います。）
SwiftでコードのみでUIを実装する方法【Storyboardなし】

# はじめに
Storyboard や XIB を使わずに View を作成し、Auto Layout をコードで設定する方法。

# 1. プロジェクトの準備
まず、新しい iOS アプリプロジェクトを作成し、Main.storyboard を削除する。
そして SceneDelegate.swift でエントリーポイントを設定。

```Swift:SceneDelegate.swift
import UIKit

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    var window: UIWindow?

    func scene(
        _ scene: UIScene, 
        willConnectTo session: UISceneSession, 
        options connectionOptions: UIScene.ConnectionOptions
    ) {
        guard let windowScene = (scene as? UIWindowScene) else { return }
        
        window = UIWindow(windowScene: windowScene)
        //最初に表示するViewControllerを設定
        window?.rootViewController = ViewController() 
        window?.makeKeyAndVisible()
    }
}
```

# 2. シンプルな View の作成
次に、ViewController.swift を編集して、コードで UI を実装する。
```Swift:ViewController.swift
import UIKit

class ViewController: UIViewController {
    // ラベルを作成
    private let label: UILabel = {
        let label = UILabel()
        label.text = "Hello, Swift UI!"
        label.textAlignment = .center
        label.font = UIFont.systemFont(ofSize: 24, weight: .bold)
         // Auto Layout を使用するために false にする（※）
        label.translatesAutoresizingMaskIntoConstraints = false
        return label
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        setupUI()
    }

    private func setupUI() {
        // ラベルを画面のビューに追加
        view.addSubview(label)

        // Auto Layout の制約を設定（画面の中央に配置）
        NSLayoutConstraint.activate([
            label.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            label.centerYAnchor.constraint(equalTo: view.centerYAnchor)
        ])
    }
}
```
※AutoLayoutを自分で設定（コードでUIを実装）する場合、translatesAutoresizingMaskIntoConstraintsをfalseにしないとレイアウトが競合する。

### 実行結果
![スクリーンショット 2025-03-08 17.39.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1066888/13584f31-4a71-4c73-bedd-938e31022bd2.png)


# 終わり
・Storyboard を使わずに UIWindow をセットアップ
・コードで UILabel を作成
・NSLayoutConstraint で Auto Layout を設定

コードだけで UI を作成すると、管理しやすく、Git での差分管理もしやすくなる。
Surface Proで仮想マシンが作れない話（ARMだから。）

# 先に結論

SurfaceのCPUはARM！
AMDではない。
なので、仮想マシンのインストールに使うisoも、arm64版じゃないといけない。

。。。でも、やっぱりインストールはできませんでした。。
当面WSLでしのぎます。

# 経緯

出先用のノートPCも古くなってきましたので、せっかくなので使ったことのなかったSurfaceを買ってみました。

仮想化は最近はHyper-Vをメインで使うようにしようとしているところだったので、この環境でも、、と思ったのですが、購入時にWinodos Pro版がない。
若干違和感はありつつも、まぁ購入後にアップグレードすればいいかーと楽観視して購入。

で、さっそくHyper-Vで仮想マシンを一個インストールしようとしたのですが、、できない。

そこからいろいろ調べものしたので、備忘録です。

## Hyper-Vに仮想マシンがインストールできない

結論に書いたのですが、CPUのアーキテクチャが違うのでインストールISO自体を変えないといけなかったのですが、、最初は全く気が付かず、いつものノリでAMD64版で落としてきてインストールしようとしてました。

経緯はこんな感じでした。

ます、Hyper-Vでインストールを進めてみると、、第1世代が選べない。
もともと極力第２世代を塚用にしているので別にいいっちゃいいんですが、第１世代が「選べすらしない」というのは初めての経験で、なんか違和感を感じつつ。。
進めます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587269/12971b61-bf4f-4c2c-936b-e0eeb7254319.png)

で、起動しますが、、こんな。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587269/271aee31-90a7-482d-b4bc-7dbdceda8187.png)

セキュアブート周りの設定を間違えてるのかな、、？といろいろ設定を試してみますが、状況が変わらず。。

コマンドラインで起動すればエラーが表示されるかなーと思い立ち、実施してみると、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587269/2a5a3006-2073-4092-95a8-4de18d8716a1.png)

この時は、セキュアブートを疑い、試しに第１世代で仮想マシンを作れないか見てたのですが。
。。。。。ん？　「ARM64 Hyper-V ホストは」。
ARM！？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587269/8f64bd63-f857-4379-a347-f368c1dc3696.png)

はい、ARMですね。。
キーボードと独立しているPCという認識だったのですが、タブレットとしてみるべきものだったってことでしょうか。。
言われてみればなるほど！という感じですが、全く想定してませんでした。。

## ARM用のISOを使ってもインストールできない

ということで、isoを落としなおし。
リトライ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587269/9f3ff8dd-a4f6-4563-88fd-631504c8f2b4.png)

行けそう！
。。。じゃないですね。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587269/162ac1e6-1576-4542-9b82-0283e4e7580f.png)

上記はセキュアブート設定を外している状態ですが、そこらへん弄ってもエラーが若干変わりはするのですが、結局この先に進めませんでした。

netinstall版、ubuntuも試してみましたが、状況は同じ。
エラー内容でググると、ブートイメージをコンパイルしなおせ、、みたいなものが見つかりますが、、そこまでやる根性はなく。

## Virtualbox

そもそもインストールできず！！
ただし、これは現時点での最新版の7.1.6のトラブルな感じ。
（ググると、同様の申告が多々）

7.0系なら違うかもですが、、駄目ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587269/66a10d55-d67d-4f4c-93ae-5506f17a2b58.png)

## WSL

こちらは問題なく動作しました。

## VM Ware Workstation

調べてません。。
ダウンロードが物々しくてめんどくさいですし、ここまでの時点で、WSL以外の選択肢を頑張る意義をあまり感じなくなってたので。

# まとめ

最初に書いた通りです。
もうちょっと頑張るとやりようはあるかもですが、、
WSLで別にいいっちゃいいので、そちらで対応しようと思います。

ISOからのインストール必須の検証はデスクトップで。
PowerVC のストレージ登録を ssh 鍵認証で実施する手順確認

### はじめに


PowerVC にストレージ・リソースを追加する際に、パスワード認証とssh 鍵認証が可能です。
この記事では ssh 鍵認証での登録方法を確認しました。


[PowerVC へのリソースの追加](https://www.ibm.com/docs/ja/powervc-cloud/2.2.0?topic=powervc-adding-resources)


---

### 環境


・IBM PowerVC 2.2.0

・ストレージ：FS5015(SAN Volume Controller, SVC) : 8.4


---

### SVC でユーザー作成

まずは SVC(FS5015) 側でユーザーを作成し、ssh 鍵を登録します。

FS5015, SVC のGUIにログインします。

![スクリーンショット 2025-03-08 17.31.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/f2ae65a9-e000-4428-a3b3-2f12d4718faf.png)


“アクセス権限” – “グループ別のユーザー”に移動し、”ユーザーの作成”を押します。



![スクリーンショット 2025-03-05 8.45.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/52bcaa35-7002-45c9-8022-2ab3d520c33a.png)

sshuser というユーザーを作成します。
ユーザー・グループは superuser 相当の SecurityAdmin を設定します。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/54b70b5f-8654-4b5d-8e6a-6fc0ae486312.png)


↑パスワード、ssh 公開鍵を設定し、作成を押します。

![スクリーンショット 2025-03-05 10.23.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/705d227b-ffe8-4ab4-bd97-069c9a844e49.png)

<br>

ユーザー作成後、秘密鍵を使用して SVC に CLI でログイン確認します。


```
# ssh -i id_rsa_pvc23 sshuser@<SVC IP address>
IBM_FlashSystem:FS5015-01:sshuser>
```

パスワードなしでログインできることを確認しました。


---

### PowerVC でストレージ・リソースを ssh 鍵認証で追加


PowerVC GUI にログインします。

![スクリーンショット 2025-03-08 17.31.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/7696d028-0bb8-4c7e-ac96-da732ab410f9.png)


認証タイプ "ssh鍵" でSVCの sshuser に登録した対となる秘密鍵を入力します。
秘密鍵を cat で出力した中身全てを入力しています。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/8ae8677e-a060-406a-b8d1-3ab09e9500f5.png)


対象のストレージプールが表示されたことを確認し、ストレージの追加を実施します。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/511bfe1c-b309-40e4-b584-2650737f4f0e.png)
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/26311034-1466-4a65-9ef5-2e5dcad5a06d.png)

ssh 鍵認証によるストレージ登録が完了しました。


ユーザーは sshuser で登録されていることが確認できます。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/40def2e5-4514-48dc-b667-fcc331dc465e.png)



---


### 稼働確認

PowerVC からボリューム作成ができるかどうかを確認します。

![スクリーンショット 2025-03-08 17.20.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/e6d20278-e166-4a7a-8711-81f42e25ea40.png)

1GB の test0308u というボリューム作成が成功しました。

![スクリーンショット 2025-03-08 17.21.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/6f508232-edfa-4630-9552-276c6341f24f.png)

<br>

SVC 上の監査ログで対象ボリュームの作成は sshuser で実施されていることが確認できます。

(以下はFS5015, SVC上の画面です)

![スクリーンショット 2025-03-08 17.23.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/4a2d0c7b-cf4f-4c1a-a1c1-751f21b8e85d.png)


ボリューム削除処理も問題なくできました。(ログ省略)


---


### おわりに

PowerVC のストレージ登録を ssh 鍵で認証する方法を確認しました。
ストレージ(SVC)側には ssh の公開鍵を、PowerVC 側には秘密鍵を登録しています。


### 参考

パスワード認証による登録は以下で確認しています。

https://qiita.com/c_u/items/7fcd4e33918156f948fa



以上です。
LinuxOSの日本語入力をWindows並みの使用感にした話（半角/全角キー切り替え）

いいね、ストック、badボタン、低評価が励みになります！


最近はエンジニア？の方も女性とひつじが増えてきたそうです
彼らはハイヒールを履いてオフィスを練り歩き、周囲を肥沃にすると言われています。たまに狼さんに襲われて子供を産まされるそうです。気をつけよう。


戯言は横に置いといて本題。



普通に`fcitx`を入れてmozcを設定するとWindowsのような使い勝手にはならず、日本語入力の切り替えには`Ctrl+Space`等を用いる必要があり**そんなんやってられるか**と思った人向けです。

具体的には**半角/全角キー**で切り替えができるようにします。
→自分が手癖やり易いから

結論から言うと``Fcitx5``をインストールすればよいです。

本稿では2025/3月時点　で　
Kali Linux 
desktop環境は`kde plasma`を使用する前提で話を進めさせていただきます
日本語入力はmozc


※本稿では```Kali linux```。デスクトップ環境は```KDE Plasma```として話を進めます
気が向いたらほかのディストリビューションでもためｓ

# 参考Link

https://zenn.dev/phanect/articles/b71be371a061ff

ただし、そのままやっても切り替えは出来ないので正しい手順を以下に示します。

# 補足事項
　設定再現のために、Kali linux内にSudo権限を付与したユーザー作成を行いました。これにより初期設定の状態で日本語入力設定を行うこととします。

※1 仮想環境でもよかったけど面倒に感じたので
※2 ユーザーを作成してもアプリパッケージはそのまま入っていたのでわざわざ削除。それも面倒でした(笑)

 
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/b778d31c-ae33-4368-9e6c-27b9b8ea94c2.png)


# fcitx5-mozcをインストール

```slim
sudo apt install fcitx5-mozc
```

# 仮想キーボード設定を`fcitx5`にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/a60d40c4-46d1-43bd-8392-a014f4dcd29c.png)

# キーボードレイアウトに日本語を追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/60555b52-9eec-4f17-bdc5-442874180690.png)

# インプットメソッドを設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/68ef1562-5ac1-4a8a-9112-08a3468afb86.png)

キー入力を``全角/半角``に割り当てます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/e2c40e86-dd71-4f33-ad21-c9dfaf92d997.png)


# ログアウト・再ログインする

再起動でも可です。

これで``半角/全角キー``による日本語入力切替が可能になりました。

※あまりいい画が用意できなかったので見難い


![2025-03-08 17-21-28_Harua_Harua_Harua.mp4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/4bff1c0c-798c-4874-8286-af4f611c9d2f.gif)


# あとがき
可能な限り余計なものは省いてます。
切り替えが面倒で地味にストレス貯まるんで、変更出来てよかったです。
今は殆どWindows同様の使い心地で大変快適です。
mozc再ビルドする方法なんてのが古い記事にあったようですが

参考記事内の他のコマンド・設定はクリーンな環境であれば全て蛇足だと思われますが未確認です。なにか補足事項があればコメントお願いします。


良いと思ったら高評価・悪いと思ったらBadボタン、ストックとチャンネル登録が励みになります。
kubernetesのyml色々

<h2>kubernetesのymlのkindにｔ</h2>


https://www.rworks.jp/cloud/kubernetes-op-support/kubernetes-column/kubernetes-entry/29144/


<h2>pvとpvcの違い</h2>

すごくわかりやすい記事。

https://www.ios-net.co.jp/blog/20230628-1190/

<h2>serviceの考え方</h2>

これまたわかりやすい。

https://www.ios-net.co.jp/blog/20230621-1179/
Googleフォームの送信内容をSalesforceに簡単に連携するツールを作りました

# Google Form to Salesforce Code Generator

Googleフォームで送信したらSalesforceに内容を送信する、という技術者にとっては簡単でも、
ビジネス部門では厳しいという要求を簡単に実現できるツールを作りました。

https://kgsmec.my.site.com/mystore/googleformtosalesforcecase

## 背景と課題

Googleフォームは本来、IT部門ではないビジネスユーザーが簡単に使えるツールです。しかし、Salesforceと連携しようとすると、通常はGoogle Apps Script（GAS）の開発が必要になります。

これまでは、

- **GoogleフォームのデータをSalesforceに取り込みたい**
- **しかし、毎回GASの開発を依頼するのはコストがかかる**
- **そもそもGoogleフォームはノーコードツールなのに、連携のたびに開発が必要では本末転倒**

という課題がありました。

そこで、今回 **「Google Form to Salesforce Code Generator」** を開発しました。このジェネレーターを使えば、

- Googleフォームの項目をSalesforceの項目にマッピングするだけで
- 必要なGASのコードが自動生成され
- すぐにSalesforce連携が可能

になります。

## GoogleフォームとSalesforce連携の基本フロー

GoogleフォームからSalesforceへデータを送る基本的な流れは以下のとおりです。

1. **Googleフォームに回答が送信される**
2. **回答データがスプレッドシートに記録される**
3. **スプレッドシートのデータをSalesforceに送信する**

この流れを実現するには、通常、GASの開発が必要です。しかし、この開発のハードルが高いため、多くのビジネス部門では実施できませんでした。

## Google Form to Salesforce Code Generatorの仕組み

本ジェネレーターを使うことで、

1. **Googleフォームを作成**
2. **Googleフォームの回答項目とSalesforceの項目をマッピング**
3. **Salesforceの送信先（オブジェクトやエンドポイント）を設定**

するだけで、自動的にGASのコードが生成されます。

これにより、

✅ **ビジネスユーザーでもGoogleフォームのSalesforce連携を簡単に設定可能**  
✅ **都度開発者に依頼する必要なし**  
✅ **Salesforceのケース作成やレコード作成がスムーズに**  

というメリットがあります。

## 使い方

1. [ジェネレーターページ](#https://kgsmec.my.site.com/mystore/googleformtosalesforcecase) にアクセス
2. Googleフォームのスプレッドシートを指定
3. Salesforceの項目とマッピング
4. 送信先設定を入力
5. **自動生成されたGASコードをコピーし、スプレッドシートのスクリプトエディタに貼り付け**
6. **設定を保存して実行**

これだけで、Googleフォームの回答がSalesforceに自動的に送信されます。

### 補足：送信先のSalesforceオブジェクト

現在、このジェネレーターではSalesforceの以下のオブジェクトにデータを送信できます。

- **ケース（Case）**


## 応用編（後日紹介）

本ジェネレーターを使えば、Salesforceのフローを活用し、

- 既存のレコード（例えば取引先責任者）に紐づける
- 特定の条件に応じた処理を自動化する
- ケースを起点にして別のオブジェクトのレコードを作成する

といった応用も可能です。これについては、別の記事で詳しく解説します。

## まとめ

「Google Form to Salesforce Code Generator」を使えば、

- **GoogleフォームのデータをSalesforceに簡単に連携**
- **開発者の負担を減らし、ビジネス部門が自由に設定できる**
- **よりスムーズな業務フローを実現できる**

Salesforceとの連携に悩んでいる方は、ぜひ活用してみてください！
「AI Translation Bot」：オープンソースで共同開発できるChrome翻訳拡張

はじめまして。最近、個人的に「AI Translation Bot」というChrome拡張を作成し、[GitHub](https://github.com/raymondmars/chatgpt-chrome-translate-plugin)でオープンソースとして公開いたしました。  
本記事では、主に以下の点について簡単にご紹介いたします。

- どのような翻訳機能を提供しているか  
- なぜオープンソース化したのか  
- 今後の展望とコラボレーションのお願い  

もしご興味をお持ちいただけましたら、ぜひ気軽にリポジトリやChromeウェブストアのページをご覧いただけると幸いです。

## 1. 「AI Translation Bot」とは

「AI Translation Bot」は、大規模言語モデル（ChatGPTなど）のAPIを活用し、Webページ上のテキストを自動翻訳するChrome拡張です。英語・日本語・中国語など、複数の言語間で相互に翻訳を行うことができます。

### 主な特徴

- **選択範囲の翻訳**  
  ページ上で翻訳したいテキストを選択し、あらかじめ設定したショートカットキーを押すだけで翻訳を実行できます。シンプルなUIで操作しやすいよう心がけました。

- **AIモデルを活用した自然な訳出**  
  既存の直訳ベースの翻訳だけではなく、文脈を考慮した自然な文章になるよう工夫しています。

- **複数言語への対応**  
  英語⇔日本語はもちろん、他言語もサポートしています。多言語の学習や海外サイトの閲覧にお役立ていただけるのではないかと思います。

なお、各翻訳の品質や速度はAPIの状況に左右される場合があります。安定性向上のための改善を今後も続けていきたいと考えております。

## 2. なぜオープンソースにしたのか

この拡張は、[GitHubのリポジトリ](https://github.com/raymondmars/chatgpt-chrome-translate-plugin)でソースコードをすべて公開しています。以下のような理由から、オープンソース化を選択いたしました。

- **透明性と安心感**  
  実装内容やAPIの利用方法を公開することで、どのようにデータが扱われているかをより明確にし、安心してご利用いただけるようにしています。

- **コミュニティベースの機能改善**  
  翻訳タスクは言語ごとに異なる難しさや工夫の余地があります。多くの方々の知識や経験を取り入れることで、より柔軟な機能追加やバグ修正が可能になると考えました。

- **新しいアイデアの発掘**  
  さまざまな分野の方から頂いた要望やIssue、Pull Request（PR）を通じて、当初は想定していなかった新しい機能やユースケースが見つかるかもしれません。

もし機能改善や新機能のアイデアがございましたら、IssueやPRとしてお気軽にご提案いただけると大変助かります。

## 3. 導入方法

「AI Translation Bot」は、現在Chromeウェブストアから直接インストールしていただけます。インストール後は指定したショートカットキーを使って簡単に翻訳をお試しいただけます。

- [Chromeウェブストア](https://chromewebstore.google.com/detail/ai-translation-bot/fglemdfemikhijpgojdobdgplbcfomdf)

なお、拡張機能を導入する場合は、Chromeブラウザのバージョンが最新になっているかご確認ください。また、各地域の規定やネットワーク環境によっては、一部機能が動作しにくい場合がございますのでご了承ください。

## 4. 今後の展望

現時点では、部分的なテキスト翻訳を中心としていますが、以下のようなアップデートを検討しております。

- **全文翻訳機能**  
  クリックひとつでWebページ全体を翻訳する機能（実装の検討段階です）。

- **翻訳履歴・学習モード**  
  翻訳結果を履歴で管理し、学習用の参考にする機能や対訳モードの追加など。

- **トークン管理の改善**  
  OpenAIのAPIキーをユーザー自身が管理しやすいように、設定周りをよりシンプルにすることを考えています。

もし「こういった機能があると助かる」「別の翻訳APIにも対応してほしい」などのご要望があれば、ぜひご意見をお寄せください。

## 5. 皆さまへのお願い

1人で開発を進めるには限界があり、翻訳品質の向上や細かなUI/UXの調整など、課題がまだまだたくさんあります。  
もし興味を持っていただけましたら、ぜひ[GitHubリポジトリ](https://github.com/raymondmars/chatgpt-chrome-translate-plugin)をのぞいてみてください。

- バグ報告：Issueでご報告いただけると助かります。  
- 新機能提案：アイデアベースでも大歓迎です。  
- ソースコードへのコントリビューション：PRをいつでもお待ちしています。  

ご意見を共有していただくことで、より多くの方にとって使いやすい拡張に成長させたいと思っています。

## まとめ

本記事では、オープンソースで開発している「AI Translation Bot」の概要や主な機能、今後の展望についてご紹介しました。翻訳が必要なシーンは思いのほか多いかもしれません。本拡張が少しでも学習や業務のお役に立てば幸いです。

最後までお読みいただき、ありがとうございました。何か質問や要望などがございましたら、コメント欄やGitHubを通じてお気軽にお知らせください。

### 参考リンク

- [GitHubリポジトリ](https://github.com/raymondmars/chatgpt-chrome-translate-plugin)  
- [Chromeウェブストア](https://chromewebstore.google.com/detail/ai-translation-bot/fglemdfemikhijpgojdobdgplbcfomdf)

今後とも、どうぞよろしくお願いいたします。
Claude 3.7 Sonnetの旧モデルとの比較

こんにちは！今回は2025年2月に登場したAnthropicの最新AI「Claude 3.7 Sonnet」について、前モデルとの違いをわかりやすく解説します。

## 基本性能：より多くを、より速く

スマートフォンが毎年進化するように、Claude 3.7 Sonnetも前のモデルに比べて大きく進化しました。具体的には・・

- **記憶力と表現力**: 一度に128,000単語を覚えて（前モデルは200,000）、最大64,000単語の返答ができるようになりました（前モデルはわずか4,000）。これは、本をたくさん記憶できるのに短い感想しか書けなかった状態から、長い詳しいレポートも書けるようになったイメージです。

- **最新情報**: 2024年7月までの情報を持っています（前モデルは4月まで）。

- **処理速度**: 文章を生成する速度が約8%向上し、特に長い文章を作る際に体感できる差になります。

## 2つの思考モード：急ぎの質問と深い思考

Claude 3.7 Sonnetの最大の特徴は内部でモード切替する仕組み。例えるなら、普段は直感的に判断するモードと、重要な決断のときに論理的に考え抜くモードを切り替えられるようになったということです。

- **標準モード**: 日常的な質問や簡単なタスクに素早く答えるモード。例えば「今日の天気は？」といった質問に即答します。

- **拡張思考モード**: 難しい問題に取り組むときに使う特別なモード。人間が複雑な数学の問題を解くとき、紙に途中経過を書きながらじっくり考えるように、AIも段階的に考えます。この結果、数学問題の正解率が84.8%にまで向上しました。



## プログラミング能力：アシスタントから共同開発者へ

プログラミングの能力も大幅に向上しました。

- **正確さ**: コード作成の精度が21.3%も向上し、70.3%の精度に。簡単な計算機能を作れる程度から、本格的なアプリ開発をサポートできるレベルになりました。

- **実用性**: GitHubとの連携やテスト実行ができるようになり、実際の開発現場で使えるツールに進化。大きなプログラムを扱うときのエラーも45%減少しました。

## 理解力と安全性：より賢く、より適切に

- **指示理解**: 複雑な依頼を45%より正確に理解できるようになりました。例えると、何度も説明が必要だった相手が、一度の説明でしっかり理解してくれるようになった感じです。

- **数学能力**: 難しい数学コンテストの問題も80%解けるようになり、高校生から大学数学者レベルの飛躍を遂げました。

- **判断力**: 不必要な拒否が45%減少し、本当に問題のある依頼と、センシティブだけど正当な依頼をより適切に判断できます。

## 使い道の広がり：日常から専門分野まで

- **日常使用**: チャットや基本的な文書作成は従来通りの速さで。
- **専門分野**: 研究論文の分析やプログラミングコンテストでも活躍。
- **業務自動化**: 航空会社のタスク処理の正確さが10%向上。
- **画像処理**: 新たに画像を理解する能力も追加されました。

## 料金：必要に応じて選べる

基本料金は変わらず（入力300万字あたり約3ドル、出力300万字あたり約15ドル）ですが、拡張思考モードを使うと追加料金がかかります。これは「必要なときだけ特別な能力を使う」という考え方で、シンプルなタスクではコストを抑えつつ、複雑な問題にも対応できます。

## 実生活での影響

クラウドサービス（AWS BedrokやGoogle Vertex AI）を通じて誰でも使えるようになり、AIは「便利だけど限定的なツール」から「状況に応じて考え方を変えられる頼れるパートナー」へと進化しつつあります。

スマートフォンのアプリが日々の生活をサポートするように、Claude 3.7 Sonnetも私たちの仕事や勉強、創作活動をより効率的に、そして質の高いものにしてくれるでしょう。
systemdスクリプトをWebLogicサービス化

つくってみた。
スクリプトを修正したら
```systemctl daemon-reload```を実行しないと変更が反映されない。

```bash:/etc/systemd/system/nodemanager.service
## create new file /etc/systemd/system/nodemanager.service for nodemanager, 
## then systemctl daemon-reload
[Unit]
Description=Controls Weblogic NodeManager Service
After=network.target sshd.service

[Service]
#ExceStartがフォアグラウンドで動作するコマンドの場合にsimple指定
Type=simple
ExecStart=<domain_home>/bin/startNodeManager.sh
ExecStop =<domain_home>/bin/stopNodeManager.sh
#oracle:oinstallユーザとして実行
User=oracle
Group=oinstall
#異常終了しても再起動しない
Restart=no
#ExceStartが300秒待っても実行できなかったらタイムアウトと判定
#(ExecStartコマンドはフォアグラウンド動作なのでここには影響しない)
TimeoutStartSec=300
#ExceStopが300秒待っても終了しない場合はタイムアウト判定->SIGTERM
TimeoutStopSec=300
KillMode=process
#StandardOutput=append:/var/log/nm.out
#StandardError=inherit

[Install]
WantedBy=default.target
```

```bash:/etc/systemd/system/weblogic.service
## create new file /etc/systemd/system/adminserver.service for adminserver, 
## then systemctl daemon-reload
[Unit]
Description=Controls Weblogic AdminServer Service
After=network.target sshd.service nodemanager.service
Requires=nodemanager.service

[Service]
#ExceStartがフォアグラウンドで動作するコマンドの場合にsimple指定
Type=simple
ExecStart=<domain_home>/bin/startWebLogic.sh
ExecStop =<domain_home>/bin/stopWebLogic.sh
#oracle:oinstallユーザとして実行
User=oracle
Group=oinstall
#異常終了しても再起動しない
Restart=no
#ExceStartが1200秒待っても実行できなかったらタイムアウトと判定
TimeoutStartSec=1200
#ExceStopが1200秒待っても終了しない場合はタイムアウト判定->SIGTERM
TimeoutStopSec=1200
KillMode=process
#StandardOutput=append:/var/log/webloigc-admin.out
#StandardError=inherit

[Install]
WantedBy=multi-user.target
```
【実体験】SES案件で限界を感じたら？途中退場の方法と注意点

参画の案件で精神的に限界を感じ、途中退場するべきか悩んでいませんか？途中退場は最終手段ではありますが、あなたの心身の健康を守るために必要な選択となる場合があります。

なぜなら**無理をして体調を崩してしまうと、その後のキャリアにも悪影響を及ぼす**可能性があるからです。一方で途中退場は、周囲に負担をかけることも事実です。

私は客先常駐エンジニアとして10年ほどの経験があり、以前にストレス性胃痛で食事も取れず、夜も眠れないほど追い込まれた末に途中退場を経験しました。その経験から得た知識と教訓を共有します。

この記事では実体験に基づく、途中退場の注意点や具体的な手順について解説します。この記事を読むともしもの時にどうすればいいか、事前に備えることができます。

[>> エンジニアがメンタル不調を感じる原因とその対処法](https://taishi-official.com/2024/01/21/1500/)

<iframe width="560" height="315" src="https://www.youtube.com/embed/Eq9ipDIv49U?si=Vl3RgAtzm5iWdK90" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

## SES案件の途中退場とは
途中退場とは、**契約期間の満了前にSES案件から離脱すること**を指します。通常SES案件は3ヶ月などの契約期間が設定されており、その期間が終了するまで継続することが基本です。

しかし、様々な理由により契約期間の途中でエンジニアが案件から外れることがあります。これが「途中退場」と呼ばれる状況です。基本的には契約違反となる可能性があるため、正当な理由と適切な手続きが必要となります。

[>> 途中退場の主な原因](https://taishi-official.com/2025/03/06/3215/#toc2)

[>> 途中退場がもたらす影響](https://taishi-official.com/2025/03/06/3215/#toc3)



## 私の途中退場体験談
著者自身も参画した案件がどうしても合わなくて、契約期間の途中ではありましたが退場した経験があります。その時の様子について説明します。



### 案件の概要と退場に至った経緯
私が経験したSESの案件は、現行のデータ処理システムをAzureを使ったクラウド環境に移行するというものでした。主にSQLを使用する案件でしたが、当時の私はSQLの経験がほとんどなく、そのことは面談時にも伝えていました。

しかし実際に現場に入ってみると、求められるスキルは想像以上に高く、日々自分のスキル不足を痛感するばかりでした。周りのエンジニアは年配の方が多く、スーツを着て黙々と作業をするような環境で、私にとっては非常にストレスフルでした。直属の上長もマネジメントが得意なタイプではなく、ほとんど放置状態で相談もあまりできませんでした。

プロジェクト中、メンバーが突然いなくなることも多々ありました。おそらく私と同じように、途中退場していたのだと思います。その穴を埋めるために、私の所属するSES企業から、新たに増員がありました、彼らは私よりもさらに経験が浅い方々でした。

公式なリーダーではありませんでしたが、必然的に私が彼らの面倒を見たり、取りまとめ役を担うことになりました。自分自身が精一杯の状況で、他のメンバーもサポートしなければならないプレッシャーは、さらなるストレスとなりました。

日に日に出社するのが辛くなり、不眠や吐き気に悩まされるようになりました。最終的には出社困難となり、やむを得ず途中退場という決断に至りました。

[>> 途中退場の具体的な手順](https://taishi-official.com/2025/03/06/3215/#toc6)

[>> 実際に途中退場を経て得た教訓](https://taishi-official.com/2025/03/06/3215/#toc9)



## まとめ
今回はSES案件の途中退場について、私の経験談を交えて紹介しました。途中退場は関係各所に多大な迷惑をかけてしまうので、できるだけ避けるべきではあります。

ただIT業界では途中で案件から抜けるのは、**割と頻繁に起こること**ではあります。SES企業や参画先も、このようなことの対処に慣れています。本当につらいのであれば、意外と周りも気にしていないので途中退場の選択肢も持つべきです。

<b>自分の身を守れるのは、自分だけです。</b>我慢をしすぎて体調まで崩してしまう恐れがあるので、不調を感じ始めたらできるだけ早く、所属SESに相談やメンタルクリニック受診などの対応を取るようにしましょう。

### おまけ

https://qiita.com/taishi_will_be/items/70a8ce8938944286b487

https://taishi-official.com/it-freelance/

<strong>＼Follow me／</strong>

- X（旧Twitter）：https://x.com/taishi_it_blog
- Instagram：https://www.instagram.com/taishi_will_be/
- YouTube：https://www.youtube.com/@Engineer_ILLBE
- TikTok：https://www.tiktok.com/@taishi_will_be
- note：https://note.com/taishi_wii_be/

<br>

最後にいいねお願いします:thumbsup:
3年間Web開発をWSL2でやってきた経験をまとめる

## WSL2で2年間Web開発してわかったこと

## はじめに

WSL2（Windows Subsystem for Linux 2）を使ってWeb開発をしてきて、結論から言うと「問題なく使える」。
むしろ、メモリを増やし放題で快適に動作する点など、Macより優れている部分もある。

この記事では、WSL2を使ってWeb開発をするメリットや注意点、Docker運用のコツなどを紹介する。

## WSL2のメリット

### メモリ増やし放題で快適

Macの場合、メモリ増設が高価でハードウェアの制限もあるが、Windowsなら比較的安価にメモリを増設できる。
私は16GBのゲーミングノートを32GBに増設し、そのうち22GBをWSL2に割り当てている。

WEB開発でDynamoDBローカル、NestJSバックエンド、vite/Reactのフロントエンドを同時起動する機会があったが、
**16GBのmac book pro M3では毎回起動に数分かかっており、ホットリロードがままならない状態だった。**

メモリだけの影響ではないと思うが、経験上WSL2はリソース効率の面で有利だと思う。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1977360/4e75d8f0-8c18-4a88-94b4-cb7a4ae45b39.png)


### Windows / Chromeでの動作確認が楽

Web開発では、Windows環境やChromeでの動作確認が必須になることが多い。
ユーザーのターゲットがWindowsになりがちなので、デザインの崩れなどを確認しながら開発ができる。
例えば、MacとWindwsではスクロールバーの表示有無が同じChromeでも異なることがあるようだ。

### inode枯渇につよい
一時期Ubuntu Desktopをデュアルブートしていた時期があったが、node_modulesでinodeが枯渇した系エラーの対処に手を焼くことがあった。
WSL2にしてからは一度もお目にかかっていない。

### NvidiaのGPUが使える
機械学習モデルの運用が可能。
Pythonは特にパッケージバージョン管理地獄が発生するので、Dockerポン置きで動くの非常に良い。

## ここがつらいかも

### Docker運用

Docker for Windowsを使わず、Ubuntu内に直接入れるべき。確信した。**Docker for Windowsは罠。**
Docker Desktopのライセンス問題を回避しつつ、ネットワーク周りをWSL2内に押し込むことができる。
デフォルトでWSL2はポートをホストにフォワーディングするので、特に問題なく使える。

### バックアップの重要性
たまに突然linux userが吹っ飛ぶ（！？）。
定期的にバックアップをしつつ、圧縮もしよう。

### 太ったストレージが戻らない
バックアップのついでにdiskpartで圧縮しよう。
WSL2が確保したストレージはホストに返却されない。

https://chizuwota.net/wsl/wsl2-vdisk-compression/

間違って機械学習モデルを落とそうものなら以下のようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1977360/0b64e106-fca9-478e-9460-0b15bd77bb6f.png)


追記：圧縮しました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1977360/5d40442f-6f09-4e0f-9cbf-69e4ae715ef4.png)

### USB周りの問題とデュアルブート

WSL2はUSBデバイスの扱いが難しく、特にシリアル通信や外付けデバイスとの連携は制限が多い。
例えば、Arduinoなどのマイコン開発では、WSL2ではなくネイティブなLinux環境が適している。

## まとめ

- Web開発ならWSL2で問題なし！

- DockerはWSL2のUbuntu内に直接インストールすると快適

- 定期的なバックアップは必須

- USBデバイスを使うならデュアルブートも検討

WSL2を使えば、Windowsのメリットを活かしつつLinux環境で開発できる。
一方で、用途によってはデュアルブートが必要になることもあるので、自分の開発スタイルに合った構成を選ぼう！
Backlog記法完全チートシート

## 基本テキスト書式

| 書式 | 記法 | 表示例 |
|------|------|--------|
| 太字 | `**太字**` | **太字** |
| 斜体 | `*斜体*` | *斜体* |
| 打ち消し線 | `~~打ち消し線~~` | ~~打ち消し線~~ |
| 下線 | `%%下線%%` | 下線付きテキスト |

## 見出し

```
# 見出し1
## 見出し2
### 見出し3
#### 見出し4
##### 見出し5
###### 見出し6
```

## リスト

### 箇条書きリスト
```
- 項目1
- 項目2
  - ネストした項目2.1
  - ネストした項目2.2
- 項目3
```

表示例:
- 項目1
- 項目2
  - ネストした項目2.1
  - ネストした項目2.2
- 項目3

### 番号付きリスト
```
1. 項目1
2. 項目2
   1. ネストした項目2.1
   2. ネストした項目2.2
3. 項目3
```

表示例:
1. 項目1
2. 項目2
   1. ネストした項目2.1
   2. ネストした項目2.2
3. 項目3

### チェックボックスリスト
```
- [ ] 未完了タスク
- [x] 完了タスク
```

表示例:
- [ ] 未完了タスク
- [x] 完了タスク

## コード

### インラインコード
```
`インラインコード`
```

表示例: `インラインコード`

### コードブロック
````
```
コードブロック
複数行のコード
```
````

または

```
    コードブロック（行頭に4つのスペース）
    複数行のコード
```

### シンタックスハイライト付きコードブロック
````
```java
public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello, Backlog!");
    }
}
```
````

## リンク

### 通常のリンク
```
[リンクテキスト](https://example.com)
```

表示例: [リンクテキスト](https://example.com)

### Backlog内の課題へのリンク
```
[課題のタイトル]($課題キー)
例: [バグ修正](BLG-1234)
```

### Backlog内のWikiページへのリンク
```
[[Wikiページ名]]
```

## 画像

```
![代替テキスト](画像のURL)
```

### Backlogにアップロードした画像
```
![代替テキスト](添付ファイル名)
```

## テーブル

```
| 列1 | 列2 | 列3 |
|-----|-----|-----|
| A1 | B1 | C1 |
| A2 | B2 | C2 |
| A3 | B3 | C3 |
```

表示例:
| 列1 | 列2 | 列3 |
|-----|-----|-----|
| A1 | B1 | C1 |
| A2 | B2 | C2 |
| A3 | B3 | C3 |

### 列の配置を指定したテーブル

```
| 左揃え | 中央揃え | 右揃え |
|:-------|:-------:|-------:|
| 左 | 中央 | 右 |
```

表示例:
| 左揃え | 中央揃え | 右揃え |
|:-------|:-------:|-------:|
| 左 | 中央 | 右 |

## 引用

```
> これは引用文です
> 引用の中に**書式**を使うこともできます
>
> > ネストした引用もできます
```

表示例:
> これは引用文です
> 引用の中に**書式**を使うこともできます
>
> > ネストした引用もできます

## 水平線

```
---
```

または

```
***
```

表示例:
---

## Backlog特有の記法

### 注釈

```
これは注釈付きのテキスト[^1]です。

[^1]: 注釈の内容
```

### 絵文字

```
:smile: :warning: :information_source:
```

表示例: 😄 ⚠️ ℹ️

### カラーコード

```
#ff0000
```

表示例: 赤色のブロックが表示される

### ユーザーメンション

```
@ユーザー名
```

### グループメンション

```
##グループ名
```

### 課題の情報表示

```
[$課題キー]
例: [BLG-1234]
```

### 課題の詳細表示

```
[$課題キー]詳細
例: [BLG-1234]詳細
```

## その他のヒント

### コメントで返信する場合

```
> [元のコメント文]
> [元のコメント文の続き]

返信内容をここに書きます
```

### 見出し付きの引用

```
>|見出しテキスト|
> 引用内容がここに表示されます
```

### ファイルへのリンク

```
[ファイル名](ファイルのパス)
```

これらの記法を組み合わせることで、Backlog上で読みやすく整理された文書を作成できます。
SpringBootでLong型のバリデーションをやろうとした話

以前、SpringBootで開発している際にLong型のバリデーションをやろうとした際に全角文字の入力を防ぐためにパターンマッチングをやろうとしたらsubmit時にエラーとなった。

フィールドがLong型だったのだが、String型しか@Patternが使えないらしい。
出たのは下記のエラーで、submit時にcontrollerにも入らず例外が発生した。

~~~
javax.validation.UnexpectedTypeException: No validator could be found for type Long
~~~

対策としては、InitBinderをcontrollerに実装した。
カスタムバリデーションというものだ。
詳細なコードは書かないがchatGPTに頼むか、
Google先生に聞くと詳細なコードを作ってくれるだろう。
<br>
確かにクライアント側（html）で

~~~
<input type="number">
~~~

を指定しておけば半角数字以外入力できないが、開発ツールを使えば

~~~
<input type="text">
~~~

として様々な文字を入力して、submitできてしまう。
（maxlengthなどがあっても削除してしまえばいい）

サーバー側（Java）の入力対策は重要なんだなあ。
CLIコマンドの挙動を理解するプロンプト

CLIツールを使っていると「とりあえずコマンドを実行したけれど、何が起こってるの？」と思うことが多々あります。この記事では調査のためのプロンプトを紹介します。

---

## CLIコマンドを調べるプロンプト
**supabase init**のところを変更して使います。

プロンプト:
```
supabase init

与えられたキーワードに関する仕組みを理解するために、
以下のフォーマットで教えてください。

教える際に、マトリックスを差し込んで見やすく整理するのもよい方法です。

### 1. 操作の概要と目的
- その操作の役割は何か？
- 実行によって達成されることや、どんな目的で使われるのか？

### 2. 実行前の前提条件と依存関係
- 必要な環境設定や事前準備はあるか？
- 他のシステムやプロセスとの関連性や依存関係はあるか？

### 3. 操作の対象（対象ファイルや設定情報）
- 操作対象となるファイル、設定ファイル、環境変数は何か？
- どの情報やパラメータが読み込まれたり、変更されるのか？

### 4. 操作の詳細（引数とオプション）
- 利用可能な引数やオプションにはどのようなものがあるか？
- それぞれの意味、デフォルト値、効果は何か？

### 5. 実行結果とシステムへの影響範囲
- 実行によってどんな結果が得られるのか？
- システムや関連するコンポーネントに具体的にどんな影響があるか？

### 6. 操作の内部的な仕組み（メカニズム）
- 操作によって内部で具体的に何が行われているのか？
- なぜその結果が導き出されるのか？（理由・ロジック）

### 7. 異常・エラー時の挙動と復旧方法
- 操作が失敗した際の挙動やエラーの種類は何か？
- エラーからの復旧手順や、元の状態に戻す方法は何か？

### 8. 性能・負荷への影響
- 操作の実行がシステムの性能や負荷に与える影響はどの程度か？
- 性能を最適化するための注意点はあるか？

### 9. 操作記録・ログ情報の所在
- 操作の履歴やログはどこに記録されるか？
- 問題発生時にログを確認するポイントは何か？

### 10. セキュリティ上の留意点
- 操作によるセキュリティリスクや懸念事項はあるか？
- 操作を安全に行うための注意点は何か？

### 11. 代替手段・他の選択肢との比較
- 他に同じ目的を達成する方法はあるか？
- 各方法の利点・欠点、推奨する状況は何か？
```

Enjoy!!
ネストされたルータからルートパラメータにアクセスする方法

# 2025.03.12追記
:::note warn
mergeParamsというオプションを使って直接アクセスできるみたいです。
```javascript
import { Router } from "express";

const router=Router({mergeParams:true});
```

https://expressjs.com/en/5x/api.html#express.router

:::
# はじめに
Expressでは、
```javascript:app.js
import express from 'express';

const app=express();

app.use('/users/:id',(req,res,next)=>{ 
    //...処理
})
```
のようにして**ルートパラメータ**を設定することができ、`req.params.id`として取得できます。
そして、ルートパラメータは複数設定することもできます。
```javascript:app.js
app.use('/users/:id/todos/:todoid',(req,res,next)=>{
    //...処理
})
```
ルーティングがそこまで複雑でなければ同じルータに書いてしまえばよいですが、複雑になってくると下位のルータを使うなどしてファイルを分割したくなります。
しかし、`app.use('/users/:id',router)`だと`router`で呼ばれるミドルウェアはidにアクセスできません。
```javascript:app.js
import express,{ Router } from 'express';

const app=express();
const router=Router();

const testHandler=(req,res)=>{
    const {id}=req.params;
    if(!id){
        res.send("idにアクセスできません");
        return;
    }
    res.send("id:"+id);
}

router.use('/',testHandler);

//ここのtestHandlerはreq.params.idにアクセスできる
app.use('/test/:id',testHandler);
//routerで呼ばれるtestHandlerはreq.params.idにアクセスできない
app.use('/test2/:id',router);

app.listen(8000,()=>{
    console.log("App is Running at http://localhost:8000.");
})
```
# app.param(name,callback)
そこで、`app.param`や`router.param`を使うことで下位のルータからもアクセスできるようにすることが可能です。
`app.param(name,callback)`は名前が`name`に一致するルートパラメータに対してコールバック関数を設定するメソッドです。
下の例では、名前がidであるルートパラメータをもつパスに対してリクエストがあったときに`req.id=id;`が実行される、ということになります。

```javascript:app.js
...
router.param("id",(req,res,next,id)=>{
    //reqオブジェクトにルートパラメータを格納
    req.id=id;
    next();
})
...
```

<details><summary>TypeScriptの場合</summary>
TypeScriptだと、

```
プロパティ 'id' は型 'Request<ParamsDictionary, any, any, ParsedQs, Record<string, any>>' に存在しません。
```

のようなエラーが出ると思います。
この場合は、`index.d.ts`ファイルに
```typescript:index.d.ts
declare module "express-serve-static-core" {
  interface Request {
    id:string;
  }
}
```
を追加するとエラーが出なくなります。（ファイル名は拡張子が`d.ts`であればなんでもいいです）

</details>

## 続き 
testHandlerを下のように書き換えると、`app.use('/test2/:id',router)`のミドルウェアからもidにアクセスできます。（`/users/:id/hoge`など同じパラメータ名をもつパスがあるとややこしくなりそうですが...）

```diff_javascript:app.js
const testHandler=(req,res)=>{
    const {id}=req.params;
    if(!id){
        - res.send("idにアクセスできません");
        
        + //route.paramで格納したidを取り出す
        + _id=req.id;
        + res.send("id:"+_id);
        return;
    }
    res.send("id:"+id);
}
```
# 終わりに
Google検索してもGitHub Copilotに聞いても出てこなかったので苦労しました。
公式ドキュメントはやはり偉大。
あと英語読めると便利。
# 参考

https://expressjs.com/en/5x/api.html#app.param
【ChatGPT】くだらない質問をしてくる人への対処法を考えてみました。


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

　今回は、くだらない質問をしてくる人への対処法を考えてみました。ChatGPTにも聞きましたが、最終的には、私の考えになります。

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

　今回は、
　　くだらない質問をしてくる人への
　　　対処法を考えてみました。

　ChatGPTなどが
　　Web検索してくれる
　　　ようになった現代、
　　　　“それ、ググれ”は
　　　　　もう古い言葉になりました。

　それなのに
　　いまだに、くだらない質問を
　　　してくる方々がいます。

　飲んでる席ならば
　　会話の一環として
　　　話題にもできますよね。

　でも
　　こっちが忙しくしているときに
　　　そんな質問されたら
　　　　さすがに相手はできません。

　“ググれカス！”と
　　言いたくなりますよね。

　さすがに
　　言えませんが😅
***
　そこで、ChatGPTさんに
　　尋ねてみました。

　モデルをあれこれ
　　変更して、総合的に
　　　対処法として出たのが、こちら。

***（ChatGPT　o3-mini-high）***
（ここではまとめだけ）

- **報酬系の刺激:** 自ら答えを見つけたときの快感を促す。  
- **エネルギー節約:** 自分で調べる方が手間がかからないと認識させる。  
- **即時性:** スマホなどで瞬時に情報を得られることを強調する。  
- **ミラーリング:** 自分の行動を見せることで相手も同じ行動を促す。  
- **好奇心:** 挑戦心をくすぐる表現で、調べる意欲を引き出す。  
***

　確かに、そのとおり。

　ですが、
　　とても手間が掛かりますね。
***
　そこで
　　「お金が発生しますけど？」
　　　と言うのはどうでしょう？

　ChatGPTによると、
　　“損失回避”の心理を
　　　利用する言葉だそうです。

　質問者に対して
　　実際に損をする可能性を
　　　意識させる、ということですね。

　それでも食い下がるなら
　　「仕事終わりに調べて答えます」と
　　　答えれば、
　　　　いくらなんでも
　　　　　質問者も食い下がれないはず｡

　もちろん、
　　きちんと答えて、
　　　報酬をいただきます。

　　検索内容を印刷して
　　　渡すだけです。

　くだらない質問に対する反応が、
　　そんなものしか受け取れないと
　　　わかれば、
　　　　今後はきちんと考えるでしょう｡

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

　今回は、ここまで。
Laravelで画像データのアップロード容量を増やす方法

# 目的
画像データの容量を増やすために、php.iniの設定を変更を行う

# ①変更する値
```
upload_max_filesize = 50M  ; 1ファイルあたりの最大サイズ (50MB)
post_max_size = 60M        ; POSTリクエスト全体の最大サイズ (60MB)
memory_limit = 128M        ; PHPのメモリ制限 (128MB)
```


# ②変更する値の確認
## ✅ 1. upload_max_filesize の確認
📌 コマンド
```
php -i | grep "upload_max_filesize"
```
📌 出力例
```
upload_max_filesize => 2M => 2M
```


## ✅ 2. post_max_size の確認
📌 コマンド
```
php -i | grep "post_max_size"
```
📌 出力例
```
post_max_size => 8M => 8M
```


## ✅ 3. memory_limit の確認
📌 コマンド
```
php -i | grep "memory_limit"
```
📌 出力例
```
memory_limit => 128M => 128M
```


# ③PHPの設定ファイル (php.ini) を開く
```
php -i | grep php.ini
```
→ Loaded Configuration File に設定ファイルの場所が表示される。


# ④php.ini を編集
```
# 例: PHP 8.2 の場合
sudo nano /etc/php/8.2/fpm/php.ini
```


# ⑤以下の設定を修正(見つからなければ追記)
「ctr + w」で検索
```
# 数値は任意で決める
upload_max_filesize = 100M
post_max_size = 1100M
memory_limit = 512M
```
→完了したら、変更を保存して終了「ctr + x」→「Y」→「Enter」


# ⑥PHPを再起動
```
# 8.2の場合
brew services restart php@8.2  
```

### Apache / Nginxの場合
```
sudo systemctl restart apache2  # Apache
sudo systemctl restart nginx    # Nginx
```


# ⑦変更が適用されたか確認
```
php -i | grep "upload_max_filesize"
php -i | grep "post_max_size"
php -i | grep "memory_limit"
```
→ 出力例
```
upload_max_filesize => 100M => 100M
post_max_size => 110M => 110M
memory_limit => 512M => 512M
```


# ⑧キャッシュ削除
```
php artisan optimize:clear
```
datalistの落とし穴

# datalistの落とし穴

テキストを入力できるセレクトボックスとして画面にdatalistを採用したことがあった。
実装後、テストしていると
<b>選択できるはずの無い内容が選択できるようになっていた</b>。
<br>
なんじゃこりゃ。
<br>
実は入力履歴を保持できるという特性があるため、
~~~
<input type="text">
~~~
を使用したタグ内に、

~~~
<input type="text" autocomplete="off">
~~~
と、入力履歴を無効化してやらないといけないらしい。
バグフィックスの分だけ工数増えちまった。
EV3RTのコンパイラをarm64で動かした件

:::note alert
2025/3/25追記：この方法では、生成したバイナリを実行することができません。
:::


## やったこと
- OS: ubuntu 24.04 on Docker
- aptからrubyとbuild-essentialをinstall
- <https://developer.arm.com/downloads/-/gnu-rm>からgcc-arm-none-eabi-9-2019-q4-major-aarch64-linux.tar.bz2をダウンロード

## コマンドをどうぞ
```bash
# enter superuser mode
sudo su

# install dependencies
apt update
apt install build-essential ruby wget -y
wget -o arm-none-eabi-gcc.tar.bz2 https://developer.arm.com/-/media/Files/downloads/gnu-rm/9-2019q4/gcc-arm-none-eabi-9-2019-q4-major-aarch64-linux.tar.bz2?revision=4583ce78-e7e7-459a-ad9f-bff8e94839f1&rev=4583ce78e7e7459aad9fbff8e94839f1&hash=7554C5810C5A4B90EBF8CC4EAEAEC86B
tar -xvf arm-none-eabi-gcc.tar.bz2

# add to path; this command can be replaced with others
export PATH=$PATH:<extracted folder>/bin

# download workspace
# (省略)
```

あとはいつもの`make app=helloev3`で動きます。

## おわりに
何かあればコメントでどうぞ～
Snowflake：ストアドプロシージャの権限管理

# ストアドプロシージャを実行する際は、２種類の実行権限方法がある

## 呼び出し元権限とオーナ権限

Shareされたストアドプロシージャがあったとします。
その際に、CALLで呼び出しで実行する際に呼び出したユーザーの権限で実行するのか
そのストアドプロシージャを作成した作成者の権限で実行させるかを設定ることができます。

以下の場合は、オーナーの権限で実行されますので、呼び出しだユーザーが権限を持っていなくても実行することができます。
```sql
CREATE OR REPLACE PROCEDURE my_proc()
RETURNS STRING
LANGUAGE SQL
EXECUTE AS OWNER  -- このプロシージャはオーナーの権限で実行される
AS
$$
    INSERT INTO my_table VALUES ('data');
$$;

```