OmniAICreator/Qiita-1.07M huggingface dataset:
vimのバッファ管理プラグインを書いた

# 僕はタブが好きだ
皆さん、タブブラウザ使ってますか？使ってますよね!タブブラウザじゃないブラウザなんてほとんどないです。
現代的タブブラウザにはタブグループやセッションがありますよね!

vimにそういうのを導入したい。は？そんなの要らない？
俺がそう思うんだからそうなんだよ。俺ん中ではな。

# vimのバッファ管理
vimは複数のファイルを編集する事ができます。そのいれものをバッファと呼びます。バッファ管理プラグインは色々あるそうです。
だけど、どう検索すればいいかわかりません。

「vim buffer management」これでググってもなかなか辿りつけないのです。「vimでバッファを管理するには:bを打てばいいんだよ」とか、そんなのばかり…。そこで、自作しました。

https://github.com/uesseu/ninbufgroup.vim

# ninbufgroup
ninbufgroupというプラグインです。vimのバッファはブラウザのタブみたいなものですので、ブラウザのタブみたいに使いたかったです。
バッファをグループ化できればタブグループみたいに使えますよね。

そして、そうするとvimのタブが泣くので、こちらはブラウザのセッションのようにしようとしました。こんな感じ。

|**vim/nvim**|**Browser**|
|--|--|
|buffer|tab|
|buffer list|tab group|
|tab| session|

そんなのをどうやって実現するかというと…

# vim scriptの変数
vimにはいくつか変数があります。

```
let g:hoge = 'fuga'
```

vim scriptの変数は上記のように頭文字にgとかvとかsとかがついています。これはスコープをあらわします。
gはグローバル変数、sはスクリプト内変数、aは関数の引数、vはvimの定数、tはタブの中の変数です。
つまり、これでタブ内変数とか使えるわけですね。これによってタブの中でバッファグループを管理できるようになるわけです。

# どんな感じなのか

![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139153/154731b4-e2d9-45a7-9d38-a960edeb73c7.png)


ほら、このように、一つのタブの中に色々表示できるわけです。ここで、1番目のタブの中のtestという大きさ6のタブグループの中のtest2.pyというバッファを開いていますね。
タブ毎にバッファグループを管理できます。正規表現でフィルタを使って絞りこめます。絞りこんだものを元に新たなバッファグループを作ることもできます。いいですね!

# これを入れると自動でそうなるのか？
んなことはない。自由が必要ですよね。なので設定例を書いておきます。

```vim
au VimEnter * call bufgroup#toggle()

noremap gN :call bufgroup#next()<CR>
noremap gP :call bufgroup#prev()<CR>
noremap gn :bn<CR>
noremap gp :bp<CR>
noremap gd :call bufgroup#remove_group()<CR>
command! -nargs=1 BufGroupNew :call bufgroup#new(<f-args>)
command! -nargs=1 -complete=customlist,_BufComp
      \ BufGroupAdd :call bufgroup#add(<f-args>)
command! -nargs=1 -complete=customlist,_BufComp
      \ BufGroupAddAll :call bufgroup#add_all('<args>')
command! -nargs=1 -complete=customlist,_BufComp
      \ BufgroupOpen :call bufgroup#open_group('<args>')
command! -nargs=1 BufGroupFilter :call bufgroup#filter(<f-args>)
command! -nargs=1 BufGroupNewFilter :call bufgroup#new_filter(<f-args>)
```

うん。説明面倒くさいのでpluginのdocでも見て下さい。

https://github.com/uesseu/ninbufgroup.vim/blob/main/doc/ninbufgroup.txt

# 感想
いや…これ、本当は誰かが書いたものを使うのが一番なんでしょうけれど、このくらいのは自分で書く方が楽じゃないですか？みんな自分で書けばいいと思います!
みんな、vim scriptを書きましょう!
vimはいいぞ!

現場からは以上です。
ローカルLLMのVRAM使用量

下記のハードウェア構成、ソフトウェア構成で構築したローカルLLMで
各オープンモデルLM実行時のVRAM使用状況を調べてみました。

-|-|スペック|製品名
-|-|-|-
1|CPU|20コア|Intel Core i7 14700
2|MEM|64GB |Crucial Pro 64GB Kit (32GBx2) DDR4-3200 UDIMM
3|GPU|VRAM<BR>16GB|ZOTAC GAMING GeForce RTX 5060 Ti 16GB Twin Edge OC

-|ソフト|バージョン|
-|-|-
1|OS|Ubuntu 22.04 LTS
2|GPUドライバー|575.51.02 BETA
3|CUDA Toolkit|12.8 Update 1
4|cuDNN|9.8.0 
5|docker|28.1.1
6|Ollama|0.6.6
7|Open WebUi|0.6.5

入力プロンプト：
ある満月の夜、空を見上げると、月のすぐそばに火星が見えた。
その時、地球と火星の距離は遠いのか近いのか？

❌：VRAM不足のため正常に処理できていないと思われる。
Q4：4ビットで重み（パラメータ）を表現する量子化
K：k-meansクラスタリングを用いた量子化手法
M：Medium（ミディアム）サイズ最適化。精度と圧縮率のバランスが良い設定
タイプ0（Type-0）方式：各ブロック（通常32個の重み）に対して「スケール値（float16）」のみを使い、オフセット（最小値）は使用しない

-|モデル名|量子化タイプ|パラメータ数|VRAM使用量|ファイルサイズ
:---:|-|-|---:|---:|---:
1|ZELYZA(llama3) ||8.03B | 11.7GB|4.9GB
2|DeepSeek-r1|Q4_K_M |7.6B| 5.4GB|4.7GB
3|llama3.3 |Q4_K_M|70.6B |❌14.8GB|42GB
4|llama3 |Q4_0|8.0B |6.1GB|3.7GB
5|phi4 |Q4_K_M|14.7B| 11.0GB|9.1GB
6|gemma3 |Q4_K_M|4.3B| 9.7GB|3.3GB
7|mistral |Q4_0|7.2B |❌15.0GB|4.1GB
8|qwq(Qwen2.5) |Q4_K_M|32.8B| ❌15.0GB|19GB
9|mistral-small3.1|Q4_K_M| 24.0B|  5.2GB|15GB
10|lmma4 |Q4_K_M| 108.6B|  12.1GB|67GB
11|phi4-reasoning|Q4_K_M| 14.7B|  13GB|11GB
12|phi4-mini-reasoning|Q4_K_M| 3.8B|  4.8GB|3.2GB
Kaggle×Colab×FastAPIで実現！糖尿病リスク予測ツールの作り方【初心者向け】

## はじめに
データサイエンスを始めたばかりの方にとって、「実践的なプロジェクト」をいかに小さく始め、かつ公開して人に使ってもらうかは非常に大きな壁です。

今回私は、糖尿病リスクを予測するAIツールを開発し、それをWordPressブログ上で一般の方が実際に使える形に公開しました。

本記事では、以下のような観点で取り組みの概要をご紹介します。

・Kaggleのデータセットを活用したモデル構築

・Google Colabによる開発・可視化・学習

・FastAPI × Render によるAPI化

・WordPressとの連携で診断フォームを実装

・実際に使える“公開型ツール”としての整備

データサイエンス初学者の方、FastAPIを使ったAPI化に興味のある方、あるいはWordPress上でAI診断ツールを公開してみたい方にとって、具体的なヒントになるはずです。

## プロジェクト概要
「生活習慣病の代表格である糖尿病を、生活習慣データから予測できたら便利なのでは？」という着想からスタート。

予測だけでなく、ユーザーにとって分かりやすく、かつ行動につながるアドバイスを表示できるように意識しました。

また、Mini-MVP方式（最小機能で素早く構築 → 必要なら拡張）で開発したため、初学者でも十分に再現可能です。

## 使用したデータと開発環境
データセット：Kaggleで公開されている糖尿病関連のライフスタイルデータ

開発環境：Google Colab

使用技術：

LightGBMによる学習モデルの作成

SHAPによる特徴量の重要度分析

pickle形式でのモデル保存

FastAPI + RenderでのAPIサーバー構築

WordPressで診断フォームを埋め込み

## 工夫したポイント
特徴量選定：GenHlth（自覚的健康状態）、HighBP（高血圧）、Age（年齢）、BMI（体格指数）、HighChol（高コレステロール）を中心に構成。

SHAPによる可視化：どの特徴がリスクに影響しているかを視覚的に確認。

CORS対応：WordPressとRender APIの連携時に発生するCORSエラーの対処。

投稿サイズ制限の回避：長文＋HTMLで保存できない事態に対して、Classic EditorやPHP設定変更で対応。

## 診断ツールの使い方（イメージ）
ユーザーは、以下のような項目を選択・入力します：

・高血圧・高コレステロールの有無

・コレステロール検査履歴

・BMI、年齢区分、性別

・自覚的な健康状態（5段階）

入力後、「診断する」ボタンを押すと、推定された糖尿病リスクと、行動につながるアドバイスが表示されます。

## 実際にツールを使ってみるには？
WordPressブログ上で実際に動作する診断フォームを公開しています。

➡ [ブログで実際の診断ツールを使ってみる](https://raku-study.com/it/datascience-kaggle-api/)

スマートフォンでもサクッと使える設計ですので、ぜひ体験してみてください！

## まとめ
このように、Kaggleのデータセット → Colabでのモデル構築 → API化 → WordPressでの一般公開という流れを踏めば、データサイエンス初心者でも実践的なアウトプットが可能になります。

ポイントは、「完璧に作るよりもまず動かす」こと。そして、できる範囲で人に使ってもらう経験を積むこと。

今後はさらにモデルを改良し、より説明性や精度の高いツールに仕上げていきたいと考えています。
JavaScriptだけで無料翻訳APIを呼ぶ最小サンプル（MyMemory＋fetch＋async/await）

## 1. MyMemory API とは？
* 無料で試せる公開翻訳 API  
* GET リクエストで **英文 → 和文** などを返す  
* 公式ドキュメント：<https://mymemory.translated.net/doc/spec.php>

---

## 2. 最小構成サンプル

```html
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <title>翻訳ミニサンプル</title>
</head>
<body>
  <textarea id="src" rows="3" cols="40">Hello, world!</textarea><br>
  <button id="btn">翻訳する</button>
  <p id="dst"></p>

  <!-- たった1本の ES Module で完結 -->
  <script type="module">
    // 1) ボタンクリックを監視
    document.getElementById('btn').onclick = async () => {
      // 2) 入力取得
      const text = document.getElementById('src').value.trim();
      // 3) 翻訳中表示
      document.getElementById('dst').textContent = '…翻訳中…';

      // 4) MyMemory API URL を組み立て
      const url = `https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&langpair=en|ja`;
      // 5) fetch で HTTP GET（await で完了を待つ）
      const res = await fetch(url);
      // 6) レスポンスを JSON に変換
      const data = await res.json();
      // 7) 結果を取り出し
      const jp = data.responseData.translatedText || '（翻訳失敗）';
      // 8) 画面に表示
      document.getElementById('dst').textContent = jp;
    };
  </script>
</body>
</html>
```


## 補足. `async` / `await` って？
* `async` を付けた関数は **Promise** を返す  
* `await` を付けると、Promise が解決するまで **同期的に待って結果を受け取れる**  
* コールバック地獄 (`then().then()…`) を回避できる

## 補足.補足：translatedText プロパティは公式レスポンスに含まれる
MyMemory の REST API に q（翻訳したい文）と langpair=en|ja を付けて GET すると、
JSON 形式 で下記のようなデータが返ります。

```json

{
  "responseData": {
    "translatedText": "こんにちは 世界"
  },
  "responseStatus": 200,
  ...
}
```

responseData オブジェクトの中に translatedText が入っているのがポイントです。

公式仕様書にも「/responseData/translatedText が返る」と記載があります。
インフラエンジニア（キッティング）が4か月で基本情報に合格した話

# はじめに
はじめまして、kunseiと申します。自分は開発未経験で無事に基本情報技術者試験に4か月で一発合格することができました。

ちなみに自己紹介すると下記のとおりです。

・インフラエンジニア（ルーターのキッティング経験のみ）
・最終学歴は工業高校卒
・CCNAを取得しているためネットワークはそこまで苦労しなかった。
・ITパスポートを取得できたから受けようと思った

特に、自分のように高卒でエンジニア未経験の方に、参考になると幸いです。
# 勉強期間と試験結果
勉強期間：4か月（2024.10~2025.1）

ちなみに点数は以下の通りでした。

![スクリーンショット 2025-05-03 195757.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954903/23d4e93b-5746-4420-8b90-ff348cb299dd.png)

結構ギリギリでした。。。

# 学習に使用した参考書やサイト
### 令和06年 イメージ＆クレバー方式でよくわかる 栢木先生の基本情報技術者教室

https://gihyo.jp/book/2023/978-4-297-13827-1

### 基本情報技術者【科目B】アルゴリズム×擬似言語 トレーニングブック

https://gihyo.jp/book/2023/978-4-297-13519-5

### 過去問道場

https://www.fe-siken.com/fekakomon.php

### YouTube

#### 文系でもわかる! IT勉強会（科目B）

https://www.youtube.com/channel/UCZyA0j0zb8S6pCu-qOKQlpA

特に科目Bは1か月で仕上げたかったので、サンプル問題の不明点はブンアイさんの動画を
何回も見て理解しました。科目Bは問題を多く解いて慣れるのが大事だと思います！！

# やってよかったこと/やらなくてよかったこと

### やってよかったこと
#### YouTubeでの科目Bの対策
問題集を進めていく中で多くの箇所で躓いたので、YouTubeで問題をわかりやすくかみ砕いて説明してくれる動画にはすごく助けられました。。。

### やらなくてよかったこと
#### 参考書を何周も読む
何周もするよりかは、なるべく早く過去問に取り掛かるのが重要だと思いました！！

# おわりに
自分はこれから開発に行きたいと思いこの資格を取ろうと思いましたが、ITの基礎知識としてIT系の仕事に従事する方は取得しておいて損はないと思います！これから取得する方々、応援しています！！
【Docker】「存在しない」コンテナ名が衝突する場合の解決方法

# 概要
　この記事は以下の状態に陥っている方に向けたものです。

* ```docker run --name (コンテナ名) ...```で実行したときに以下のエラーが出た
```:コンテナの名前が衝突している
Error response from daemon: Conflict. The container name (コンテナ名) is already in use by container (コンテナID) ...
```

* その上で```docker ps -a```を実行し、停止中を含めたすべてのコンテナ名の一覧を確認したが、先ほどのコンテナ名は存在しなかった
* ```docker ps -a```では表示されなかったが、実際には存在しているのではと考え、```docker stop (コンテナ名 or コンテナID)```や```docker rm (コンテナ名 or コンテナID)```を実行したが、以下のエラーが出た
```:そのような名前のコンテナはない
Error response from daemon: No such container: (コンテナ名 or コンテナID)
```

　コンテナ名が衝突しているのに、その名前を持つコンテナが見当たらないという状況です。
 　レアケースなため、英語含め、どのサイトにもあまり解決方法が書かれていません。(1件だけ見つけましたが見失いました。かろうじてその解決方法は覚えていたので後で示します。)
　そんな状況の解決方法を見ていきましょう。

# 解決方法
　以下のコマンドを実行し、停止中のコンテナをすべて消します。

```:terminal
docker container prune
```

　これを行うと、衝突のエラー時に表示されたコンテナIDが一緒に消された旨の表示が出ます。
　その後に```docker run --name (コンテナ名) ...```を行うと、私の場合は衝突せずに実行できました。

　停止中のコンテナで消してはいけないものがあった場合にはstartで実行状態に戻したり必要なログだけ取ったりしたうえで消しましょう。

# 解決方法2
　こちらは私が見失った英語のサイトに書かれていた唯一の方法です。他のコンテナを止める必要があるので上で無理だった場合に試すのがおすすめです。
　以下のコマンドでDockerを再起動します。

```:terminal
sudo systemctl restart docker
```

　これでキャッシュとか色々なものがきれいになって動くかもしれません。
　これでダメだった場合はOS自体の再起動で治るかもしれません。

# 環境
　参考までに覚えている範囲で書いておきます。
* OS: Ubuntu 24.04
* Docker: 忘れた(気が向いたら追記します)

# おわりに
　Dockerで容量が足りないとか言われた場合にも、今回紹介したprune系のコマンド(containerだけでなく、imageやnetworkにも存在する)が効いたりします。
 　便利なコマンドなのでいざというときに思い出してあげてください。
【エラー対応】Uncaught Error: XXX is not a XXX component. All component children of XXX must be a XXX or XXX

React Routerに関するエラー対応に関して記載。
![スクリーンショット 2025-05-05 21.10.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835526/9f62d957-dbe5-48f1-89c2-b1fdd4274603.png)


# エラー
ReactでRouteを使用して開発を進めていたところ次のエラーが発生した。
他の人が10分でも時間消費せずに済むように解決方法を記述する。

:::note alert
Uncaught Error:
XXX is not a XXX component. All component children of XXX must be a XXX or XXX
:::

> XXXはそれぞれ任意の値

<br>

実際にエラーが発生したソースはこれ。
```
      <Routes>
        <Route path="/page1" />
          <Page1 />
      </Routes>
```

# 解決方法

エラー解消ソースはこれ。
```
      <Routes>
        <Route path="/page1" element={<Page1 />} />
      </Routes>
```

Routeのelement属性の中に書くようにした。

# 原因
どうやら、\<Routes> の中には \<Route> または \<React.Fragment> しか書いてはいけないようだ。
React Router v6からこのようなルールになったそうだ。
ちなみに、elementではなくrender属性で書くのもダメ。elementのみ。


# 参考
https://reactrouter.com/start/declarative/routing

https://api.reactrouter.com/v7/functions/react_router.Routes.html

https://qiita.com/mitu1935/items/9509228895af96a58640

https://qiita.com/seal_qiita/items/63fc7358d90de825ccc8
ラズパイでサムターンの状態遷移を検出し、discordに通知する。

### 目的:	ドアを鍵で閉めた後のドアガチャの回数を減らす	
### 手段:	リードスイッチでサムターンの状態を検知	
---------
### アーキテクチャ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/953d1bca-4e0e-4965-8688-d13e64cc1f2a.png)

リードスイッチはこれ買いました。

https://www.amazon.co.jp/dp/B0833LKLF8?ref=cm_sw_r_cso_li_apan_dp_G6AGZ080TDDGN7CXM2F6&ref_=cm_sw_r_cso_li_apan_dp_G6AGZ080TDDGN7CXM2F6&social_share=cm_sw_r_cso_li_apan_dp_G6AGZ080TDDGN7CXM2F6&openExternalBrowser=1&previewDoh=1



#### ※今回はAPI作成の学習も兼ねているので、検出部分と処理部分をわけています。

## リードスイッチの制御

参考

https://qiita.com/bohemian916/items/55526d80447ba0e8d4e5


リードスイッチ接続
※上のqiitaから引用
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/4c1fcb0c-d157-4810-9810-f97a46aee084.png)

## リードスイッチ判定プログラム
git	

https://github.com/arisaEN/door_judge

開いて実行すればOK
足りないライブラリはインストールしてください。

## サーバ側のプログラム
git

https://github.com/arisaEN/door.UI


project配下にこんなかんじで展開
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/c63e50ad-ee16-42f9-98df-f80bcb9d2cb3.png)

### プログラム少し説明

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/6efbdefa-1496-4532-a4ff-aa26bd6eef4d.png)

①Domain ・・・ データモデル、インターフェース、出力用のDTO

②Infra ・・・ 外部に接続するようなものを入れている。discord, sqlite
③Tests ・・・ テストコード （使い方わからず あんまり使ってない） 
④UI ・・・ Webの履歴画面、API

↓ここにAPI用意してあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/123a014e-1e71-4884-a374-4116618a7f55.png)

http://<IPアドレス>/door/insert
というURLにJSONでリクエストbodyにパラメータ入れればsqliteにサムターンの状態を記録できる。




docker起動コマンド
cd /home/pcmainte/project/door.UI
docker build --no-cache -t door_ui . -f door.UI/Dockerfile
docker run -v "/home/pcmainte/project/door.UI/door.UI/door.db:/app/door.db" -d -p 7275:7275 --name door_ui_container door_ui

ローカルのDBを参照するように設定してあります。

## ラズパイとリードスイッチ固定方法

![1000017777.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/8da8b722-40a0-41df-9542-4d6bc42f4cfb.jpeg)


![1000017779.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/5bb0a234-fd3b-4e5e-9110-521ffd8f9d9b.jpeg)

※リードスイッチは扉に当たらないようにテープで固定
※ラズパイは現状おいているだけ。危ない。

![1000017778.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/7a033000-43c8-470e-99dc-98485eb5ba83.jpeg)

※リードスイッチをONにするための磁石は、サムターンにテープで固定。リードスイッチと磁石のリーチが足りない分は、ダンボールをサムターンに固定して、ダンボールの先に磁石をつけました。


## 感想
精度よし。
次の発展として参考にしたqiitaにもあるような「数時間扉が開かれていない場合」などの警告通知などを実装できたら面白そうだと思う。
プロンプトエンジニアリングは死んだ(in 2025)

以前、下記の記事紹介を行いました。

https://qiita.com/hokutoh/items/9079d900e5f65ae76ce2

in 2025として以下の記事が出ていたので紹介したいと思います。

https://www.salesforceben.com/prompt-engineering-jobs-are-obsolete-in-2025-heres-why/

https://www.itechcloudsolution.com/blogs/prompt-engineering-is-dead-in-2025/

なお、本記事はプロンプトエンジニアリングを活用して作成しています。

## 概要
  * 最新AIモデルは文脈理解が向上し、曖昧な指示でも適切に対応可能。プロンプトエンジニアリングの必要性が急速に減少。
  * AIの民主化により、特別な知識がなくても誰もが容易にAIを利用可能になった。
  * AIトレーナーやデータスペシャリスト、AIセキュリティなど新たな職種が台頭。
  * 企業はより幅広いAIスキルを持つ人材を求めるようになり、プロンプトエンジニアは特定スキルの一部として統合される傾向にある。

2023年の「Prompt Engineering is Dead」のトピックベースに、統計的データや技術面だけではなく職種面などの実情などが追加されている形です。

## 記事要約

## 1. そもそも Prompt Engineering ブームとは何だったのか

* **2020‑2024 年**：GPT‑3/4 や Claude が「入力文の１文字で出力品質が激変」するフェーズだった。
* **結果**：

  * *“AI Whisperer”* として高年収求人が乱立。
  * 企業は「AI を試す＝専任プロンプト職を雇う」という短絡的採用を実施。
  * 有料講座・資格ビジネスが急増。
* **課題**：タスク汎用性に乏しく、属人的でスケールしない。 

## 2. 2025 年に何が変わったのか

### 2‑1. モデルの自律化と文脈理解の飛躍

* GPT‑5 / Gemini Ultra などは **曖昧入力 → 追加質問 → 自己リファクタリング** を内蔵。
* LLM は「ユーザがほしい出力」を推論し、**“質問力”より“目的共有”** が重要に。 

### 2‑2. AI の民主化と社内リスキリング

* OpenAI Academy など **無料学習リソース** の整備で “高給取りの外部専門職” がコスパ不利に。
* 米 Nationwide の全社員 AI 研修例のように、**「全員がライト級 Prompt Engineer」化** が進行。 

### 2‑3. マルチモーダル・音声時代の到来

* 音声／ジェスチャ／画像入力主体 → **文字列プロンプトの比重自体が低下**。
* UI が自然会話化し “プロンプト” という言葉すら見かけなくなる。 

## 3. 台頭する３＋αの新職種

| 新職種                        | 主なミッション                  | 求められるコア知識                 |
| -------------------------- | ------------------------ | ------------------------- |
| **AI Trainer**             | 生成結果の評価・フィードバックループ設計     | UX ライティング／評価指標設計          |
| **AI Data Specialist**     | データ収集⇒前処理⇒ガバナンス          | ETL／スキーマ設計／データ品質          |
| **AI Security Specialist** | Prompt Injection・モデル悪用対策 | セキュリティ設計 / Adversarial ML |
| **＋ Ethical AI Officer**   | バイアス検証・透明性確保             | 倫理・法規制・リスク管理              |

## 5. まとめ ― Prompt Engineering は“死”ではなく“吸収合併”

* **Prompt Engineer = 職種** は消滅傾向。
* **Prompt Engineering = スキル** は **“AI と協働する全職種の共通知識”** へ統合。
* 今後は「AI を**使う**力」より「AI に**任せて監督する**力」がキャリアの差別化要因となる。

## 感想

前回の記事の締めにも書きましたが、「●●式」のようなoneプロンプトの技であったり、キーワードを駆使する等の技の部分を指す意味での「プロンプトエンジニアリング」は今後不要になっていくと思います。

ただ、生成AIと対話するアプローチに関しては、(エージェントによるサポートの進化はあれど)依然必要かと思います。
以下なども対話アプローチに関するTipsが多いです。
https://qiita.com/hokutoh/items/4a5447833721fe8390d9

結局のところ人間と人間の対話において、めっちゃものわかりのいい人が相手でもこちらが必要情報を与えなければその人もうまく動けないのと一緒ですね。


## 余談

ちなみに本記事をAIに要約させるにあたって、キャッチフレーズをくれなんて指示していないのに以下を記載してきました。
> **キーワードは “Delegate, Integrate, Regulate.”**
> プロンプトを磨くだけの時代は終わり、AI と共創する次のステージが始まっています。
macOSのSafariでSSLサーバー証明書を閲覧したい（2025年版) 

## 記事の背景

macOS の safari のアドレスバーから、SSLサーバー証明書を閲覧できなくなってます。いつからかは分かりませんが2025年5月現在(Sequoia 15.4.1)ではアドレスバーの左端にあった鍵（南京錠）アイコンがなくなってます。

## この記事を読んで喜びそうな人

- safariブラウザを普段使っていて、SSLサーバー証明書を確認できないと嘆いている人

## 解決方法

safariの環境設定にも見当たらず、Google先生に聞いたところsafariとは別の「キーチェーンアクセス」というアプリを使わないと閲覧できないことが判明しました。方法を以下に記載します。

### キーチェーンアクセスアプリ起動方法

マウスパッドを4本指でピンチインしたアプリ一覧からも検索できないです。スポットライトを使って「キーチェーンアクセス」を検索してアプリを検索して見つけてください。

### キーチェーンアクセスでの操作方法

キーチェーンアクセスを起動したら、

1. メニューバー「キーチェーンアクセス」ー「証明書アシスタント」ー「開く」をクリック
1. 表示されるダイアログ「はじめに」の右下「続ける」をクリック
1. 次のダイアログ「オプション」で「証明書を表示して評価」を選んで右下「続ける」をクリック
1. 次のダイアログ「証明書を表示して評価中」で「SSL」を選び、「ホストに証明書を要求」のチェックボックスをON（ONできない場合は先に「ホスト名」を入力）し、SSLサーバー証明書を確認したいサーバーのトップページURLを入力し右下「続ける」をクリック

これで、SSLサーバー証明書を閲覧できます。
Power Automate の「開始して承認を待機」アクションの「連続した承認」で、承認の結果の順番が入れ替わることがある。

Power Automate の「開始して承認を待機」アクションの「連続した承認」において、トリガーとトリガーの間隔が短い場合（おそらく2分以内）、承認の結果の順番が入れ替わることがある。

※ 追記：トリガー同士の間隔ではなく、承認同士の間隔かもしれないがよく分からない。とりあえず、複数人が一気に承認依頼を出すとこの事象が発生する。

![スクリーンショット 2025-05-05 201225.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629955/12faaf8e-d900-4415-8a40-e48c5c33629b.png)

「開始して承認を待機」アクションの未加工出力に配列「responses」がある。本来であれば、承認を行った順（＝responseDate が古い順）にデータが並ぶのが正しい。しかしこの事象が発生すると、最後の承認（responseDate が新しい）が一番上に来てしまう。

![スクリーンショット 2025-05-05 200504.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629955/73a4485d-5633-42db-85ff-884848d65722.png)

この状態だと後続のアクションで承認者のコメントなどを使う際に支障がでるので、正しい順番に直したい。

「For each」アクションで承認者のコメントなどをループ処理しているのであれば、sort 関数で responseDate でソートしてからループ処理するのが良さそう。

![スクリーンショット 2025-05-05 200600.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629955/8d074cbc-bfb0-4557-8027-c3a61694f8bf.png)

``` PowerFX:PowerFX
sort(outputs('開始して承認を待機')?['body/responses'], 'responseDate')
```

https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-sort
PHP備忘録：Laravelで「Base table or view not found」エラーが出たので原因を確認してみた

## はじめに

Laravel を使ったアプリ開発中に発生した "SQLSTATE\[42S02]: Base table or view not found: 1146 Table 'laravel.sessions' doesn't exist" エラーについて、解決方法を記録しておきます。

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

個人的に PHP のキャッチアップをしたくて Laravel に取り組んでいます。

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

今回はセッション周りでハマったエラーが発生したため、初学者による備忘録として記録しておきます。

## 内容

### エラーの内容

```
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'laravel.sessions' doesn't exist
```

これは Laravel のセッションドライバに `database` を使っている場合に、`sessions` テーブルが存在しないと発生するエラーです。

### 解決手順

#### 1. `.env`ファイルの確認

```env
SESSION_DRIVER=database
```

この設定により、Laravelは `sessions` テーブルを利用してセッションを管理しようとします。

#### 2. セッションテーブル用マイグレーション作成

すでにマイグレーションが存在する場合はスキップしてOKです。

```bash
docker compose exec php-app php artisan session:table
```

#### 3. マイグレーションを実行

```bash
docker compose exec php-app php artisan migrate
```

これにより `sessions` テーブルが DB に作成されます。

#### 4. Laravel のキャッシュをクリア（念のため）

```bash
docker compose exec php-app php artisan config:clear
docker compose exec php-app php artisan route:clear
docker compose exec php-app php artisan view:clear
```

## まとめ

Laravelのセッションを`database`で管理する際は、事前に`sessions`テーブルをマイグレーションで作成しておく必要があります。

:::note warn
**今回のような500エラーも、ログとマイグレーションの状態を確認することで解決できました。**
:::

今後もトラブル対応を学びに変えていきたいと思います...！
W_H_functionの自己紹介

こんにちは、私はアルファベット列で作曲するアプリの開発を行っています。


　私が小学生の頃から作曲をしていましたが、作曲にはどうしても音楽理論が必要です。私は誰もが音楽理論なしで簡単に作曲を楽しめる世の中にしたいと考え、このアプリの開発を行っています。


　言語はHTML,JavaScript,CSSで、プログラムは合計5000行程度書いています。現在もアプリの更新を進めています。


　私はこのアプリをSTEAM教育の一環として使ってもらうことも検討しています。STEAM教育とは、科学、技術、工学、芸術、数学の5つの分野を複合的に学ぶ教育のことです。今回のアプリは、技術・芸術の分野を複合的に学ぶことが出来ます。


　実際にSTEAM教育の一環として使ってもらうためにはアプリの知名度を上げることが必要です。


　今までの実績としては、サイエンスキャッスルポスター優秀賞・ドコモ未来ラボ中学生の部最優秀賞 の2つです。また、大学生、高校生、中学生、大学教授、研究者、ベンチャー企業の社長など、多様な人にアプリを使ってもらい、好意的な評価を得ています。今後もたくさんの研究発表会に出て、アプリの知名度を上げたいと考えています。

 

　しかし、そのような研究発表会は大阪や東京などで開催されているので、交通費が必要になります。できるだけ親に負担をかけたくない、そのような思いから、クラウドファンディングに挑戦することにしました。

　リターンは集まったお金の利用の明細書及び、今回作成したアプリのリンクや研究発表会で使用した資料となっています。つまり、実際にアプリを使うことができる、ということです。

https://camp-fire.jp/projects/846838/view

 

　ご協力お願いします。


 各種SNS等リンク
Twitter

117_227

クラファン情報や「アルファベット列で作曲してみた」投稿を毎日更新中。フォロー・いいね・リポストお願いします！

 

 

Instagram

Login • InstagramWelcome back to Instagram. Sign in to check out what your friwww.instagram.com

投稿頻度は控えめですが、最新バージョンのアプリの使用風景などを紹介しています。こちらもぜひフォローお願いします！
Linucレベル１勉強メモ　＃２２

＃ 第二章　ファイル・ディレクトリの操作と管理

練習問題2.7
以下のコマンドを実行しました。
$ ls -l
-rw-r--r-- 1 linucuser linucuser 670293 Feb 19 00:50 services
$ umask
0022
$ ln services services.new
$ ln services.new services.hard
$ ln -s services services/sym
chmod u+w,g+r services.hard
この時のservices.newファイルのパーミッキョンを３桁の数値で表してください。

（解答）644

（解説）
lnコマンドの実行結果から、servicesファイル、services.hardファイルはハードリンクです。したがって、どのファイルのパーミッションを変更しても、すべてのファイルのパーミッションは同じになります。services.hardファイルを作成した時点でのパーミッションは、servicesファイルと同じなので「644」です。これに「u+w, g+r」としても、所有者にw、グループにrのアクセス権はすでに設定されているので、パーミッションは変わりません、umaskは、リンクファイルの作成には関係ありません。
WorldSpaceUIDocument について

## UnityでUIを板ポリで出したかった。
これはメモです。

UI Documentというものがある。UnityのUIをhtmlっぽい感じで書けるのだが、このUIを全画面表示ではなく、RenderTextureなどに出力して3DオブジェクトのQuadに貼り付けて使いたい。Canvasで例えるなら、worldSpaceにしたい。

# 失敗した方法
```C#
uiDocument.panelSettings.SetScreenToPanelSpaceFunction
```
でScreenからpanelへの変換部分のアルゴリズムを変えることができるが、自分で実装したが力が及ばず、変な挙動をした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308674/bb7718ec-858f-4964-a5f1-2f68fa33a9b2.png)
# 成功した方法
Quadを作成し、以下スクリプトをアタッチ。足りないコンポーネントを作成して終了
https://gist.github.com/Anthelmed/5fcc49a402ad5c81136c73ce96ba004f

![Unity_BCzQV9stm3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308674/b950a988-e938-4702-b153-f318abc2ea08.gif)

以上、メモ
【React初心者メモ】gapとspaceの違い

単純な横並びのアイテム（ボタン群など）には、space-*
折り返しを含むレスポンシブレイアウトやgrid構造では、gap-*
### space-*
Flexbox専用で、子要素間のマージンを制御する
指定方法は、
space-x-\<n\>：横方向のスペース制御
space-y-\<n\>：縦方向のスペース制御
```
<div class="flex space-x-4">
  <div>Item 1</div>
  <div>Item 2</div>
  <div>Item 3</div>
</div>
```

### gap-*
FlexboxとGrid両対応で、コンテナ内の要素の隙間を均等に制御します
指定方法は、
gap-\<n\>：行間と列間の両方を同時に設定
gap-x-\<n\>：列間のみを設定
gap-y-\<n\> ：行間のみを設定
```
<div class="grid grid-cols-3 gap-4">
  <div>Item 1</div>
  <div>Item 2</div>
  <div>Item 3</div>
</div>
```
4月投稿一覧



|dae|title|views|goods|stocks|
|--:|:--|--:|--:|--:|
|2025年04月19日|いい日旅立ち　から　プログラマが学ぶこと|音楽 希望 歌 DoCAP||||
|2025年04月16日|Day 1. Embedded Programmer Training|embedded programer DoCAP||||
|2025年04月13日|作業診断と改善の展開 |ISO 改善 HAZOP 作業診断 DoCAP||||
|2025年04月13日|要求という言葉を文書から削ったら一気にわかりやすくなった件|設計 仕様 要求||||
|2025年04月13日|OSEK/VDX OS改訂提案を作る|OS OSEK DoCAP||||
|2025年04月13日|LinuxとOSEKの統合|Linux OSEK||||
|2025年04月13日|C言語規格とC++規格を統合する利点と課題| C C++ DoCAP||||
|2025年04月13日|プログラミングの３つの方法|プログラム 職業訓練 DoCAP||||
|2025年04月13日|3さんじのパワポのつかいかた　How to use PowerPoint for children aged 3.slide |PowerPoint outline DoCAP||||
|2025年04月13日|教育・訓練事前アンケート|教育 アンケート 訓練 DoCAP 事前||||
|2025年04月12日|模型設計(Model Design)|設計 文章 図 算譜 模型||||
|2025年04月12日|かんたんUML入門　改訂２版| uml DoCAP||||
|2025年04月08日|MISRA C, visual C errors |error VisualC MISRA||||
|2025年04月06日|Manifest for Agile and Principles behind the Agile Manifesto|agile Principle DoCAP manifesto||||
|2025年04月06日|Spirit of engineers, Principles or Testament of an engineer.|統計 Principle エンジニア Spirit 安全分析||||
|2025年04月05日|NIST POSIX TEST SUITE, install and go|テスト POSIX NIST DoCAP
|2025年04月05日|NIST POSIX TEST Suite on macOS|テスト macOS POSIX NIST DoCAP||||
|2025年04月04日|LLM Calendar 2024|||||
Unity6 ECS  最小構成

本記事は、Unity6 ECSで使用できるEntitiesにて、GPU インスタンシングを行うための最小コードを残しておくためのページです。

# 実コード
プロパティ、定義、実関数の３つのファイルに分けて管理している

```ruby:BG.shader
Shader "Custom/BG"
{
    Properties
    {
        _BaseMap ("Albedo", 2D) = "white" {}
        _BaseColor ("Color", Color) = (1,1,1,1)
    }
    
    SubShader
    {
        Tags {
            "RenderType" = "Opaque"
            "RenderPipeline" = "UniversalPipeline"
            "UniversalMaterialType" = "Lit"
            "IgnoreProjector" = "True"
        }
        LOD 100

        Pass
        {
            Name "ForwardLit"
            Tags { "LightMode"="UniversalForward" }

            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag
			#pragma target 4.5

            #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DOTS.hlsl"

			#include "BG_Input.hlsl"
			#include "BG_Function.hlsl"
            ENDHLSL
        }
    }
}
```

```ruby:BG_Input.hlsl
#ifndef BG_INPUT
#define BG_INPUT

#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

TEXTURE2D(_BaseMap);
SAMPLER(sampler_BaseMap);

CBUFFER_START(UnityPerMaterial)
float4 _BaseMap_ST;

float4 _BaseColor;
CBUFFER_END

#ifdef UNITY_DOTS_INSTANCING_ENABLED
UNITY_DOTS_INSTANCING_START(MaterialPropertyMetadata)
	UNITY_DOTS_INSTANCED_PROP(float4, _BaseColor)
UNITY_DOTS_INSTANCING_END(MaterialPropertyMetadata)

static float4 unity_DOTS_Sampled_BaseColor;

void SetupDOTSLitMaterialPropertyCaches()
{
	unity_DOTS_Sampled_BaseColor = UNITY_ACCESS_DOTS_INSTANCED_PROP_WITH_DEFAULT(float4, _BaseColor);
}
#undef UNITY_SETUP_DOTS_MATERIAL_PROPERTY_CACHES
#define UNITY_SETUP_DOTS_MATERIAL_PROPERTY_CACHES() SetupDOTSLitMaterialPropertyCaches()
#define _BaseColor unity_DOTS_Sampled_BaseColor
#endif
#endif // BG_INPUT
```

```ruby:BG_Function.hlsl
#ifndef BG_FUNCTION
#define BG_FUNCTION

struct v_in
{
    float4 vertex : POSITION;
    float2 uv : TEXCOORD0;    
    UNITY_VERTEX_INPUT_INSTANCE_ID
};

struct v_out
{
    float2 uv : TEXCOORD0;
    float4 vertex : SV_POSITION;
    UNITY_VERTEX_INPUT_INSTANCE_ID
    UNITY_VERTEX_OUTPUT_STEREO
};
v_out vert(v_in v)
{    
    v_out o = (v_out)0;
    
    UNITY_SETUP_INSTANCE_ID(v);
    UNITY_TRANSFER_INSTANCE_ID(v, o);
    UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);

    o.vertex = TransformObjectToHClip(v.vertex.xyz);
    o.uv = TRANSFORM_TEX(v.uv, _BaseMap);
    return o;
}
float4 frag(v_out input) : SV_Target
{
    UNITY_SETUP_INSTANCE_ID(input);
    UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
            
    float2 uv = input.uv;
    float4 out_color = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, uv);
    out_color.rgb *= _BaseColor.rgb;
    return out_color;
}
#endif // BG_FUNCTION
```

## おまけ
BG_Input.hlslで記述している、Defineを行うことで処理速度が早くなるらしい
「FEniCS と sympy の違いを教えて下さい。」をAI先生に聞きました。

・(2025-05-05) FEniCSをインストールしていません。

# (本日の)ChatGPT先生へ
#### 質問リスト
```
# 質問リスト
1. FEniCS と sympy の違いを教えて下さい。
2. 同じ問題を FEniCS と SymPy でどう扱うかの比較例も作成できますか？
3. 私の質問をMarkdown形式でリスト化して出力して。Markdown形式でリストからアスタリスクは削除して。1行目に、# 質問リスト の文字を出力して。最後の質問も追加して下さい。追番を追加して下さい。Markdown形式で。
```


#### (回答抜粋)
>...
>では、簡単な偏微分方程式を題材に、SymPy と FEniCS でどのように扱い方が異なるかを比較してみましょう。

#### 題材: ポアソン方程式
１． SymPy による厳密解の計算
``` python
from sympy import symbols, Eq, sin, pi, dsolve, Function, diff

x = symbols('x')
u = Function('u')
f = pi**2 * sin(pi * x)

# -u''(x) = f(x) という微分方程式
ode = Eq(-diff(u(x), x, x), f)

# 境界条件を含めて解く
sol = dsolve(ode, u(x), ics={u(0): 0, u(1): 0})
print(sol)
```
２． FEniCS による数値解
``` python
from fenics import *
import numpy as np
import matplotlib.pyplot as plt

# メッシュ生成
mesh = UnitIntervalMesh(32)

# 関数空間の定義
V = FunctionSpace(mesh, 'P', 1)

# 境界条件 u=0
u_D = Constant(0)
def boundary(x, on_boundary):
    return on_boundary
bc = DirichletBC(V, u_D, boundary)

# 試験関数と未知関数
u = TrialFunction(V)
v = TestFunction(V)

# 右辺と弱形式
f = Expression('pow(pi,2)*sin(pi*x[0])', degree=4)
a = dot(grad(u), grad(v)) * dx
L = f * v * dx

# 解を求める
u_sol = Function(V)
solve(a == L, u_sol, bc)

# 結果を可視化
plot(u_sol)
plt.show()
```
>どちらも「ポアソン方程式を解く」という点では同じですが、目的と解の形式がまったく違うことが分かります。
他の方程式や2次元の例なども見てみたいですか？

難しくなってきたので、中断します。

# Gemini先生へ

# copilot先生へ

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

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

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

#### Qiita内


### wikipedia

https://en.wikipedia.org/wiki/FEniCS_Project
LeetCode #1007. Minimum Domino Rotations For Equal Row

# 【LeetCode #1007】Minimum Domino Rotations For Equal Row
## はじめに
こんにちは．最近，TypeScript を勉強中で，LeetCode の問題も時々 TypeScript で解いてみたりしています<3<3
さて，今日は #1007 の問題です．

## 問題概要
与えられた配列 **tops** と **bottoms** に対して，いくつかの裏表をひっくり返して，tops または bottoms どちらかを全て同じ値にする．
その時のひっくり返す最小回数を答える．もし不可能な場合は -1 を返す．

## カテゴリ

* 問題難易度：Medium
* タグ：Array, Greedy

## 解法
この問題は，「どちらかの列をすべて同じ値に揃えるために，値 x を揃えるターゲットとしたときどれだけ裏返す必要があるか」を考えるのがポイントです．

1. tops・bottoms の1つ目の要素 **top[0]**・**bottom[0]** を取得する
1. tops[0]・bottoms[0] それぞれに対して，tops・bottoms 全要素との比較を行う
1. tops[0] と一致する tops・bottoms 内の要素数をそれぞれカウント
1. bottoms[0] と一致する tops・bottoms 内の要素数をそれぞれカウント
1. 最小値を返す（ひっくり返す必要のある最小の数）

```python
class Solution:
    def minDominoRotations(self, tops: List[int], bottoms: List[int]) -> int:
        def check(x, tops, bottoms):
            bc = 0
            tc = 0
            for i in range(len(tops)):
                if tops[i] != x and bottoms[i] != x:
                    return float('inf')
                if tops[i] == bottoms[i]:
                    continue
                tc += tops[i] == x
                bc += bottoms[i] == x
            return min(tc, bc)
        ans = min(check(tops[0], tops, bottoms), check(bottoms[0], tops, bottoms))
        return ans if ans != float('inf') else -1
```

## もう少し高速にする
もし，tops の1つ目の要素 top と bottoms の1つ目の要素 bottom が同じであれば1度の走査で完了する
```python
class Solution:
    def minDominoRotations(self, tops: List[int], bottoms: List[int]) -> int:
        def check(x, tops, bottoms):
            bc = 0
            tc = 0
            for i in range(len(tops)):
                if tops[i] != x and bottoms[i] != x:
                    return float('inf')
                if tops[i] == bottoms[i]:
                    continue
                tc += tops[i] == x
                bc += bottoms[i] == x
            return min(tc, bc)
        res = min(check(tops[0], tops, bottoms), check(bottoms[0], tops, bottoms) if tops[0] != bottoms[0] else float('inf'))
        return res if res != float('inf') else -1
```

## まとめ
今回は #1007 の問題と解法を紹介しました！
この問題は一見比較が多そうに見えますが，実際は tops[0] と bottoms[0] のどちらかが全体を同じ値にするための候補になり得るため，その2つとその他の値との比較で済む問題でした．
パッと見，難しそうでも紐解いてみると意外と簡単な問題が medium には多いですね！
次回もまた daily など解説しようと思います:)

## おまけ
TypeScript だとこんな感じです．
```typescript
function check(x: number, tops: number[], bottoms: number[]): number{
    let tc: number = 0;
    let bc: number = 0;
    for (let i: number = 0; i < tops.length; i++){
        if ((tops[i] !== x) && (bottoms[i] !== x)){
            return Infinity;
        }else if (tops[i] === bottoms[i]){
            continue;
        }
        tc += Number(tops[i] == x);
        bc += Number(bottoms[i] == x);
    }
    return Math.min(tc, bc);
};
function minDominoRotations(tops: number[], bottoms: number[]): number {
    let ans: number = Infinity;
    if (tops[0] == bottoms[0]){
        ans = check(tops[0], tops, bottoms);
    }else {
        ans = Math.min(check(tops[0], tops, bottoms), check(bottoms[0], tops, bottoms));
    }
    if (ans === Infinity){
        return -1;
    }
    return ans;
};
```
データベースの「コミット」とは何か？ログバッファと揮発性の問題をわかりやすく整理してみた

# データベースの「コミット」とは何か？ログバッファと揮発性の問題をわかりやすく整理してみた

## はじめに

「コミットってなに？SQLの`COMMIT`と内部処理のコミットって違うの？」
「ログバッファって消えたらヤバいやつ？」
「更新情報がメモリにしかない状態で電源が落ちたらどうなる？」

読書中にこんな疑問が出てきました。

この記事では、**DBMSのログバッファ、ログファイル、コミット、そしてそれにまつわるトレードオフ**について、記事として残します。

---

## データベースにおける「コミット」とは？

まずSQLでの`COMMIT`文の使い方を思い出してみましょう。

```sql
BEGIN;
UPDATE users SET name = 'Taro' WHERE id = 1;
COMMIT;
```

この`COMMIT`文は、「ここまでの変更を確定してね」という意味です。  
でもDBMS内部ではこのとき、**ある重要な処理**が走っています。

---

## コミットの裏で何が起きているのか？

SQLの`COMMIT`を受け取ったDBMSは、次のようなステップを踏みます：

1. ユーザーの更新操作を<b>ログバッファ（メモリ）</b>に記録  
2. `COMMIT`時にそのログを</b>ログファイル（ディスク）<b>に書き込む  
3. 書き込みが完了したら「コミット成功」とみなしてOKを返す

ポイントは<b>「ログがディスクに書かれるまでは、更新は“未確定”」</b> ということです。

---

## ログバッファ vs ログファイル：何が違うの？

| 名前         | 保存場所 | 性質        | 消える？       |
|--------------|-----------|-------------|----------------|
| ログバッファ | メモリ    | 一時的       | 障害で消える   |
| ログファイル | ディスク  | 永続的       | 基本消えない   |

---

## 揮発性の問題：ログバッファだけに情報があると？

ここが今回の本題。

たとえばこんな状況を想像してみてください：

- ユーザーがデータを更新 → ログバッファに記録される  
- まだ`COMMIT`していない  
- そのタイミングで電源断（DBMSダウン）

このとき、ログバッファはメモリなので全部消えます。  
つまり、更新情報も消えます。  
結果、DBMSが復旧しても<b>「更新はなかった」ことになってしまう</b>んです。

---

## なぜ「コミット時にログをディスクに書く」のか？

この揮発性の問題を防ぐため、DBMSは次のようにルールを設けています：

- `COMMIT`時に、ログバッファの内容を必ずログファイルに書き込む
- 書き込み完了を確認してから、ようやく「コミット完了」

この処理があるからこそ、障害が起きても更新履歴が残っていて復旧できるのです。

---

## トレードオフ：安全性 vs パフォーマンス

ここで出てくるのが**ディスク書き込みのタイミング**によるトレードオフです。

| 優先するもの | 方法                                     | メリット        | デメリット              |
|--------------|------------------------------------------|------------------|--------------------------|
| 安全性        | `COMMIT`時にログを即ディスクへ（同期）   | データ損失なし   | 書き込みが遅くなる       |
| パフォーマンス | ログは後でまとめて書く（非同期）         | 書き込みが速い   | 障害時にログが失われる可能性 |

---

## まとめ

- `COMMIT`は、SQL文だけでなくDBMS内部の“永続化処理”の確定でもある
- ログバッファは揮発性（メモリ）なので、障害時に消える可能性がある
- だからこそ`COMMIT`時にディスクに書き込む設計が重要
- 安全性とパフォーマンスにはトレードオフが

---

## 最後に

DBMSの内部動作を知ると、何気なく使っているSQLにも深みが出てきますよね。  
おしまい。

## 参考にした書籍

[SQL実践入門──高速でわかりやすいクエリの書き方 (WEB+DB PRESS plus)](https://www.amazon.co.jp/SQL%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80%E2%94%80%E2%94%80%E9%AB%98%E9%80%9F%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8A%E3%82%84%E3%81%99%E3%81%84%E3%82%AF%E3%82%A8%E3%83%AA%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9-WEB-DB-PRESS-plus/dp/4774173010)
PHP備忘録：PHPとLaravelの学習環境をDockerで整えるまで

## はじめに

Docker 環境で Laravel を動かしながら、PHP をキャッチアップするための学習を進めています。個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。

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

個人的に PHP のキャッチアップをしたくて、勉強している初学者による備忘録となります。

## 内容

Laravel + Docker プロジェクトのディレクトリ構成は以下のようになっています：

### プロジェクトルート（php-docker/）

これは Laravel プロジェクトを Docker で開発・実行するための構成です。

```
php-docker/
├── docker-compose.yml       # Docker構成ファイル（複数サービス定義）
├── Dockerfile               # PHP + Apache のイメージ定義（Laravel実行環境）
├── Makefile                 # よく使うDocker/Laravelコマンドの自動化
└── src/                     # Laravelアプリ本体のソースコード
```

### src/ ディレクトリの中身（= Laravel アプリ本体）

```
src/
├── app/                     # アプリケーションのコアロジック（MVC）
│   ├── Http/Controllers/    # コントローラー（例: HelloController.php）
│   ├── Models/              # Eloquent モデル
│   └── Providers/           # サービスプロバイダなど
│
├── bootstrap/               # アプリ起動準備（autoloadなど）
├── config/                  # アプリの設定ファイル（app.phpなど）
├── database/
│   ├── factories/           # テスト用のデータ生成ロジック
│   ├── migrations/          # テーブル作成・変更履歴
│   └── seeders/             # 初期データ投入スクリプト
├── public/                  # ブラウザからアクセスされるWebルート（index.phpなど）
├── resources/
│   ├── views/               # Bladeテンプレート（HTML）
│   └── js/, css/            # 静的アセット（開発用）
├── routes/                  # ルーティング定義（web.phpなど）
├── storage/                 # キャッシュ、ログ、アップロードファイルなど
├── tests/                   # PHPUnitテスト
├── .env                     # 環境変数（DB接続情報など）
├── artisan                  # LaravelのCLIコマンド
├── composer.json            # PHP依存管理
└── その他ビルド・設定ファイル
```

### 要点まとめ

* src/ 以下はほぼ標準的な Laravel プロジェクト構成
* .env は src/ に置かれていて、php artisan 実行時は src を WORKDIR にすることで環境変数が読まれる
* Makefile や docker-compose.yml があることで、開発が高速＆再現性のあるものになっている

## まとめ

Docker と Laravel を使って開発環境を整えることで、PHP 学習の効率が大きく向上しました。この構成をベースにして、次はフォームを作って messages テーブルにデータ登録できるようにしていきたいです...！
Rubyでクラスの内部からインスタンス変数を呼び出す時は@をつけて呼び出した方が良いかも

rubyではattr_readerをつけないでインスタンス変数にクラス内部からアクセスするとエラーになります

```rb
class User
  def initialize(name)
    @name = name
  end

  def get_name
    name
  end
end

u = User.new('John')
puts u.get_name # undefined local variable or method `name' for an instance of User (NameError)
```

エラー文を見ると、インスタンス変数として解釈されてないようです

## attr_readerをつける

attr_readerをつけると、インスタンス変数として解釈されて、値が返ってきます

```rb
class User
  attr_reader :name
  def initialize(name)
    @name = name
  end

  def get_name
    name
  end
end

u = User.new('John')
puts u.get_name # John
puts u.name # John # attr_reader宣言でゲッターが定義されているので、これでもインスタンス変数にアクセスできる
```

## インスタンス変数をクラス内部から@で呼び出せば、attr_readerはなくて良い
インスタンス変数をクラス内部から@で呼び出せば、attr_readerはなくて値は返ってきます。
```rb
class User
  def initialize(name)
    @name = name
  end

  def get_name
    @name
  end
end

u = User.new('John')
puts u.get_name # John
```
クラスの外から直接ゲッターメソッドで呼び出しもできないので、なるべくはこちらの方法で定義する方が、カプセル化ができ良いかもしれません
VSCode で WSL2 プロジェクトを開くと Copilot 拡張機能が応答しない

## 症状

- VSCode で WSL2 内のプロジェクトを開いている時に Copilot Chat を使うと、応答が返ってこない
	- "Getting Copilot ready." → しばらく待つと "Copilot took too long to get ready. Please try again." エラーが出る

## 原因

- WSL2 内から Copilot への認証でエラーが発生するせい[^1]
    - Windows 上の VScode は、WSL2 上の VSCode に対してリモート同期をして動いている[^2]

## 対策

- VSCode の `setting.json` に以下の行を追加して、VSCode を再起動する
	- この設定により Copilot 拡張機能は WSL 内ではなく Windows 側で呼ばれるようになる[^3]
    	- ちなみにリモート環境 (WSL2) で動作させる時は `ui` ではなく `workspace`[^4]

```json:setting.json
    "remote.extensionKind": {
        "GitHub.copilot": ["ui"],
        "GitHub.copilot-chat": ["ui"]
    }
```


## 参考

- [Copilot took too long to get ready\. Please try again\. · Issue \#7861 · microsoft/vscode\-copilot\-release](https://github.com/microsoft/vscode-copilot-release/issues/7861)
- [Github Copilot Chat VSCode extension issue using WSL 2 – ROBERT SCHOUTEN](https://robertschouten.com/2025/03/06/github-copilot-chat-vscode-extension-issue-using-wsl-2/)
- [github \- Copilot is not working is WSL remote connection? \- Stack Overflow](https://stackoverflow.com/questions/78719710/copilot-is-not-working-is-wsl-remote-connection)

[^1]: [github \- Copilot is not working is WSL remote connection? \- Stack Overflow](https://stackoverflow.com/questions/78719710/copilot-is-not-working-is-wsl-remote-connection)
[^2]: [Supporting Remote Development and GitHub Codespaces \| Visual Studio Code Extension API](https://code.visualstudio.com/api/advanced-topics/remote-extensions#architecture-and-extension-kinds)
[^3]: https://code.visualstudio.com/api/advanced-topics/remote-extensions#incorrect-execution-location
[^4]: https://code.visualstudio.com/api/advanced-topics/extension-host#preferred-extension-location
名刺アプリの作成を終えて

## はじめに
今回、`React` `TypeScript` `Supabase` を使った名刺アプリを作成しました。
このアプリは、ユーザーが自分の名刺情報を登録し、他の人の名刺を閲覧できる機能を持っています。

この記事では、アプリ開発を通じて得た学びや苦労した点を共有したいと思います。

![card-app-home.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3851095/b5a828ff-ac18-4aaa-905e-005dc89dca5a.png)

https://github.com/matsunagaDev/ts-card-app

## 使用技術

| カテゴリ | 技術 |
|---------|------|
| **フロントエンド** | React |
| | TypeScript |
| | Chakra UI |
| | React Router |
| | React Hook Form |
| **バックエンド** | Supabase |
| **テスト** | Jest |
| | Testing Library |
| **CI/CD** | GitHub Actions |
| **その他** | DOMPurify |

## 機能一覧
以下の機能を実装しました。

- ユーザー情報の登録・表示・編集（フォーム入力と表示）
- ユーザーに紐付くスキル情報の管理（複数スキルの登録）
- SNSアカウント連携（GitHub、Qiita、X）と動的アイコン表示
- CI/CDによる自動テスト実行
- バッチ処理による前日データの自動削除
- レスポンシブデザイン対応

## 以前と比べて成長したポイント
以前は単純なCRUD機能を作るだけで精一杯でしたが、今回は以下の点で大きく成長できました。

1. 型安全な設計
`TypeScript`と`Zod`を使って、フォーム入力から状態管理まで、型安全なコードを書けるようになりました。また、バリデーションロジックも統一できてメンテナンス性が向上しました。

2. モックを使用したテスト
外部APIやデータベースとの連携部分はモック化することで、ロジックのテストを安定して実行できるようになりました。

3. 中間テーブルの活用
`Supabase`で中間テーブルの設計や操作方法を習得し、多対多の関係を適切に扱えるようになりました。SQLの理解も深まり、複雑なクエリも実装できるようになりました。

4. `CI/CD`と自動化
`GitHub Actions`を使った自動テストや、定期実行のバッチ処理を構築できたことで、運用面の理解も深まりました。

## 開発で苦労したこと・工夫したこと

### ① `Firebase`へのデプロイ
こちらは以前から行っていますが、`CI/CD`で新しいライブラリを使用して、デプロイに挑戦してみたのですが、苦戦してしまい前回と同様の方法で行いました。
次回改めて挑戦してみたいと思います。
</br>

### ② `Supabase`で中間テーブルの設計
ユーザー情報とスキル情報の多対多の関係を解決するべく、ユーザースキルという中間テーブルを作成しました。
この中間テーブルを操作する時は、 `Supabase` で外部キーの設定をする必要があり、特有のSQL文を使用することで情報の取得が行えました。
</br>

### ③ `Chakra UI`によるレスポンシブデザイン
デザインは`Chakra UI`の`v2`で行いました。
その中でも初めて使用してみたコンポーネントの`useToast`は、UXの向上に繋がるデザインとなり、実装のモチベーションも向上しました。
</br>

### ④ `React Router`の活用
`useParams()`でパスパラメータから動的に画面を切り替える仕組みを実装しました。
これにより、URLの一部をコンポーネントの状態として利用でき、ルーティングの理解が深まりました。
</br>

### ⑤ バッチ処理とタイムゾーン問題
`GitHub Actions`で定期実行するバッチ処理の実装では、タイムゾーンの問題が生じました。
特に `Supabase` のデータベースがUTC基準で動いているのに対して、表示は日本時間（JST）でする必要があったため、時間の変換が必要でした。
最終的には、日本時間の「前日」のデータを正確に特定して削除できる仕組みを作成することができました。
</br>

### ⑥ テストコードのモックの導入
ページ遷移を行う `useNavigate`や、`Supabase`にアクセスする処理をモック化することができ、安定したテストコードを作成することができました。
</br>

### ⑦ `README.md`の充実
`README`には、今まであまり関心を向けて来なかった部分でした。
しかし、今回はシールドバッジを追加したり、操作方法などを追記して見た目にもこだわることで、成果物の印象が大きく向上し、プロジェクトの品質が増したように感じました。

## 試したけどできなかったこと
`Supabase`に作成したデータベースのバックアップを取得するため、`Supabase CLI`で`dump`ファイルを取得しようとしましたが、エラーに阻まれました。
`PostgreSQL`の知識不足も痛感したので、データベース管理についてはより深い学習が必要だと感じています。今後も調査を続けたいと思います。
 

## おわりに
今回の開発を通じて、単なる`React`のアプリを作るだけではなく、プロジェクト全体を設計する力が必要であることを実感しました。
苦労した点も多かったですが、一つずつ問題を解決していき、理解が進むことで、問題に対する向き合い方も良い方向に変わった気がします。
一方で、技術的にも弱い部分が露呈されたので、これからも **<font color='red'>「ただ使うだけでなく、理解しながら使う」</font>** を意識して、学習を続けていきたいと思います。

# JISOUのメンバー募集中！
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？
興味のある方は、ぜひホームページをのぞいてみてくださ！
▼▼▼

https://projisou.jp
Goでループ内で逐次カーソル動かすやつを書くときのエラー処理

Goを使ってイテレータっぽい処理を書くとき、構造体に諸々の情報を詰めて、 `Next()` で次のデータを読み込むみたいな処理を書くことが多いと思います。その際のエラー報告をどうするのが良いんだろうという内容です。

# こうすると良さそう

`Next()`が返すのは次のレコードがあるかどうかを判別するための`bool`のみとし、エラーの報告は別途それ用のフィールドと関数を生やすのが良さそうです。

```go
type Hoge struct {
  ...
  err error
}

...

func (h *Hoge) Next() bool {
  // 次のレコードとかに移動する処理
  // エラーがあったらh.errに入れる
}

func (h *Hoge) Err() error {
  return h.err
}
```

# なぜこれが良さそうか

Goのif文では、`;`を区切りとすることで条件部分に複数の文を書くことができます：

```go
if data, ok := Something(); ok {
...
}
```

しかし、for文ではこの書き方はできません：

```go
// うまく認識されない
for data, ok := Something(); ok {
...
}
```

ということはつまり、データを持ってきたうえでエラーチェックをしてループを回すといった処理ができないということになります。
こういう書き方ができないというわけです：

```go
for hasNext, err := something.Next(); hasNext && err != nil {
...
}
```

いい感じにfor文の条件式の中で条件を組み立てることができないため、`Next()`の戻り値にerrを含めると色々面倒な感じになります。
素直に`Next()`はboolのみを返すことにして、エラーチェックは別で行うことにすればシュッと書けます。

# Goのライブラリの実装を見てみる

実際、Goの標準ライブラリでも同じような書き方をされることが多いようです。

## bufio.Scanner

それぞれこんな感じのシグネチャになっています。

```go
func (s *Scanner) Scan() bool
func (s *Scanner) Err() error
```

参考：https://pkg.go.dev/bufio#Scanner

## database/sql

sqlでレコードを取り出すやつですね。同じような書き方です。

```go
func (rs *Rows) Next() bool
func (rs *Rows) Err() error
```

参考：https://pkg.go.dev/database/sql#Rows

# ややつらそうな点

ここで書いたものと同じ形でエラー報告するように強制するのが難しそうだなと感じました。
`Err()`が何を意図して作られているのかは、インタフェース定義にコメントなんかで残すしかありませんし、このあたりの気持ちを察してもらうのは認知コストが大きそうに思えます。
インタフェースのシグネチャだけでいい感じに気持ちが伝わる書き方できないかなぁ…
それとも私がこれまで知らなかっただけで、Gopherの皆様の中ではこの書き方は割と常識なんですかね…
MIT App Inventorでの，ChatBot（AI）を用いた組み合わせの序列付けの方法（出会い系アプリのマッチングみたいなやつ～）

## 初めに
マッチングアプリのおすすめで出てくる順番ってどうやって決められているか気になりますよね！！
これをMIT App Inventorで考えてみました～～
マッチングアプリって，うまくマッチしちゃうとユーザーが減ってしまうような...アプリをリピートしてくれるような組み合わせにしてるのかな？？

## アプリの概要
ChatBot (gemini)にユーザーと複数のプロフィールを送信し，その中からユーザーと相性がよさそうな人を１~５人選んでもらう．出力は名前，相性がよさそうな理由，序列（１～５）とする．
ここでは，ChatBotの解答を制御するために**json schema**を使用している．

:::note info　
詳しくはGoogle公式ページへ！
https://ai.google.dev/gemini-api/docs/structured-output?hl=ja&lang=python
:::

## デザイナー画面
![スクリーンショット 2025-05-05 174050.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/353134a9-9f7d-4d47-8278-0efaea48812c.png)

|機能|内容|
|:-:|:-:|
|Button_ai|ボタンを押したらgeminiへ質問|
|Button_reset|Label_infoを空白に|
|Label_info|Geminiの解答を表示|
|Web1|Geminiへのアクセス|

## blocks画面
### 変数
**url**
Geminiへのアクセスリンク
```
https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-latest:generateContent?key=
```
![blocks.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/e7a5cd04-bfc5-49c0-8026-e1a242283f56.png)

**APIKey**
ご自身のAPIKeyを入れて下さい．
![blocks (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/1d5e1192-b896-48d6-9f41-8220c41763ed.png)

**プロフィール本人**
![blocks (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/e3da2a8b-ef82-42b6-8209-b701e440c63a.png)

**プロフィール**
![blocks (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/97a6e4e2-e26f-409d-9184-4f703b43b3c0.png)

### when Button_ai. Click
ボタンを押したらgeminiにプロフィールを送信する．ここでは，json schemaを用いてAIの解答をチューニングしている．

:::note info　
詳しくはGoogle公式ページへ！
https://ai.google.dev/gemini-api/docs/structured-output?hl=ja&lang=python
:::

![blocks (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/ba400fac-0ee4-4211-8889-04b7a61c3092.png)

### when Web1. GotText
Geminiからのレスポンスを処理する
![blocks (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/93e15ba6-34c3-4138-a413-40490cb21fae.png)

### when Button_reset. Click
ボタンを押したらラベルを空白にする．
![blocks (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/3e48b9c7-50e4-41ec-a7c6-7b3dc2a86fdc.png)

## 実行結果
出力できてます！　序列も数値で出ました！これは他にも使い道がありそう！！
<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/6084381b-e777-4f9c-ba8f-c85a56941c87.png" width = "45%">

## 終わりに
Geminiってすごい，Json Schemaを使いこなせると，いろいろな用途にAiを活用できそうです．
MIT App InventorにてAIによる検索およびURLの取得とアクセスの実装

## はじめに
MIT App InventorではAIを利用できます！！便利ですよね～～！
AIで調べものもできるので，URLほしいですよね...実装してみます！

## アプリの概要
AIに調べ事をしてもらい，調べた内容が記載されているURLも教えてもらうアプリです．ボタンをおすと，AIに教えてもらったURLへジャンプします．
Screen1：観光情報の表示
Screen2：Screen1で取得したURLのページを表示

## ブロック画面
### Screen1
![スクリーンショット 2025-03-03 023935.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/84d99d5c-98b3-4906-b9e0-f303cf8e7645.png)

|機能|内容|
|:-:|:-:|
|Button_観光案内|クリックしたら東京都の観光地の一つを教えてもらう|
|Button_url|クリックしたらScreen2へ移動|
|Label_URL|AIがら取得したURLを表示する|
|Label_text|観光情報の表示|

### Screen2
![スクリーンショット 2025-03-03 024606.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/cf2e1dfc-b463-46de-864c-0b7fd2c14b72.png)

|機能|内容|
|:-:|:-:|
|Button_Screen1|クリックしたらScreen1へ移動|
|WebViewer1|URLへのアクセス|

## ブロック画面
### Screeen1
#### 変数
**apiKey**
ご自身のAPIKeyを入れて下さい．
![blocks.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/98e7f0ef-94b5-4ba9-bf00-aa795d39d25e.png)

**Geminiへのアクセスリンク**
![blocks (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/f4cdd420-85d5-4230-ae30-a6a59bd7f208.png)

:::note info
Geminiのモデル
https://ai.google.dev/gemini-api/docs/models?hl=ja
:::

#### when Button_観光案内. Click
**紫色のpost text内のテキストを変えることでAIへの質問内容を変えることができます．**
![blocks (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/d5eb17f7-0ab8-4579-8f10-1f7144d5536b.png)

#### when Web1. GotText
Geminiからのレスポンスを処理．レスポンスからURLを抽出し，Label_URLにURLを表示する．
![blocks (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/b3ca6a67-3a2b-4ba2-8c3d-25b65f4fb8e3.png)

#### when Button_url. Click
ボタンが押されたら，Screen2へ移動し，URLのサイトを表示する．
![blocks (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/458231a3-6c0e-4fbf-8c01-adb4d2825a87.png)

### Screeen2
#### when Screen2. Inutialize
Screen2が開いたら，URLのページを表示する．
![blocks (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/62bff35e-d869-40d8-a6b2-6a99025e22c4.png)

#### when Button_screen1. Click
ボタンを押したら，Screen1へ移動する．
![blocks (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/90213bdd-7cfa-4ad2-bcc1-cce1d05923b9.png)

## 実行画面
<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/a2eb58fd-50ee-417c-9588-f0c7f8a22db3.png" width="45%">

<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/30d748b4-ad49-4923-aa01-6d3c0bced52c.png" width = "45%">


##おわりに
AIからURLのみを抽出することができました．この方法ではURLの出力形式を指定していないので抽出できないことがあるかもです．
json chemaを使用したら，不具合が減りそうですね．
【React初心者メモ】mとpの指定方法

TailwindCSSのマージンとパディングの指定方法がややこしいので、まとめておきます。
## パディング（p系ユーティリティ）
### 全方向指定
p-\<n\>: 全辺に同じスペースを適用
（\<n\>はデフォルトでp-0からp-96間で提供されており、1→4px, 2→8px, 3→12px, 4→16px…のように設定されており、tailwind.config.jsで指定されている）
```
<div class="p-4">/* 上下左右16px */</div>
```
### 軸別指定
px-\<n\>: 左右 (padding-left, padding-right)
py-\<n\>: 上下 (padding-top, padding-bottom)
```
<div class="px-8 py-2">
  /* 左右32px、上下8px */
</div>
```
### 辺別指定
pt-\<n\>: 上
pr-\<n\>: 右
pb-\<n\>: 下
pl-\<n\>: 左
```
<div class="pt-6 pl-3">/* 上24px、左12px */</div>
```
### カスタム値指定
p-[<value>], px-[<value>] のように [] で囲むと任意の値を直接指定可
```
<div class="p-[5px]">/* 上下左右5px */</div>
<div class="px-[2.5rem]">/* 左右2.5rem */</div>
```

## マージン（m系ユーティリティ）
### 全方向指定
m-\<n\>: 全辺に同じスペースを適用
（\<n\>はデフォルトでm-0からm-96間で提供されており、1→4px, 2→8px, 3→12px, 4→16px…のように設定されており、tailwind.config.jsで指定されている）
```
<div class="m-8">/* 上下左右32px */</div>
```
### 軸別指定
mx-\<n\>: 左右 (padding-left, padding-right)
my-\<n\>: 上下 (padding-top, padding-bottom)
```
<div class="mx-4 my-2">
  /* 左右16px、上下8px */
</div>
```
### 辺別指定
mt-\<n\>: 上
mr-\<n\>: 右
mb-\<n\>: 下
ml-\<n\>: 左
```
<div class="mt-6 mb-1">/* 上24px、下4px */</div>
```
### カスタム値指定
m-[<value>], mx-[<value>] のように [] で囲むと任意の値を直接指定可
```
<div class="m-[10vh]">/* 全方向10vh */</div>
```
条件アクションやスイッチアクションを使用しないで更新先のリストを動的に変更する

## 概要	
	
AutomateでSharePoint listの更新先を条件によって変更した場合、通常は条件アクションやスイッチアクションを使用して実装することになりますが、この方法だと更新先のリスト数が多い場合、実装が手間になります。
	
そこでそれらのアクションを使用しないで更新する方法を紹介します
	
	
## 実装手順	
#### 変数の初期化
サイトURLとリスト名を変数として格納します
![スクリーンショット 2025-05-02 194934.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713277/df2d3cfa-26bb-461d-8395-f57700cc454f.png)


#### 項目の更新
	
サイトのアドレス/リスト名を変数などで入力すると、更新プロパティがIDと項目のみの表示となります
そのため通常の方法では更新することができません

![スクリーンショット 2025-05-05 174959.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713277/dad008a9-6646-4e4a-9245-b040603d9048.png)


今回はプロパティ「項目」に列名と更新内容を含めたjsonを入力して実行します

```
//項目に入力するjson例
{
  "contents": "test",
  "contentsType": {"Value" : "testA"}
}

```

上の例では、1行テキスト列「contents」に「Test」、選択肢列「contentsType」に「testA」
を入力する内容になります
	
	
	
	
### 実行結果
![スクリーンショット 2025-05-05 175229.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713277/0e893559-59f3-4ba7-ad59-008e9137a7e3.png)

レコードの更新に成功しました

### まとめ
動的にSharePoint listの更新先を変更したい場合は、「項目」に更新したいjsonを入力しましょう
更新列に選択肢列が含まれる場合は1行テキストと違う形でのjsonを送る必要があるので、作成アクションなどでjsonを整えてから入力すると効率的かもしれません