OmniAICreator/Qiita-1.07M huggingface dataset:
最先端AIが挑むサイバー虐待の検出：LLMsの可能性と課題

# A Survey of Textual Cyber Abuse Detection Using Cutting-edge Language Models and Large Language Models

本記事では、最新の研究成果である「A Survey of Textual Cyber Abuse Detection Using Cutting-edge Language Models and Large Language Models」という論文を徹底的に解説します。この研究は、サイバー虐待検出分野における最前線の取り組みを網羅し、特に最先端のAI技術である大規模言語モデル（LLMs）の応用に焦点を当てています。

---

## 論文情報

- **タイトル**: A Survey of Textual Cyber Abuse Detection Using Cutting-edge Language Models and Large Language Models  
- **リンク**: [arXiv:2501.05443](https://arxiv.org/abs/2501.05443)  
- **発表日**: 2025年1月9日  
- **著者**: J. Angel Diaz-Garcia, Joao Paulo Carvalho  
- **DOI**: 未公開  

---

## 背景と目的

### サイバー虐待の現状

サイバー虐待は、オンライン空間で発生する悪意ある行為を指し、以下のような形態があります：

1. **ヘイトスピーチ**: 特定の属性（例：人種、宗教、性別）に基づく攻撃的な発言。  
2. **サイバーブリング**: 繰り返し行われる精神的嫌がらせ。  
3. **ドクシング**: 個人情報の無断公開。  
4. **トローリング**: 挑発的な発言を意図的に行い、議論を混乱させる行為。  
5. **なりすまし**: 偽アカウントを使った詐欺行為。  

これらは個人の精神的健康や社会の安定に悪影響を及ぼし、各国で規制の強化が進んでいます。たとえば、**2021年のStatista調査**では、全世界のSNSユーザーの約40%が何らかのサイバー虐待を経験したと報告されています。

---

### 従来の手法の課題

従来の検出手法は以下の点で限界がありました：

- **精度の低さ**: ルールベースや単純な機械学習アルゴリズムでは、微妙な文脈や皮肉を正確に検出できない。  
- **多言語対応の不足**: 英語以外の言語への適用が困難。  
- **リアルタイム処理の欠如**: 大量のデータに対応する能力が不足。  

---

### 本研究の目的

本研究では、これらの課題を克服するために、以下のアプローチを提案しています：

1. **LLMsの活用**: コンテキスト理解能力に優れたモデルを用いることで、検出精度を向上。  
2. **データセットの多様性確保**: さまざまな言語や虐待形態をカバーするデータセットを使用。  
3. **課題の体系的整理**: 現状の技術的および倫理的課題を明確化し、今後の方向性を示唆。  

---

## 研究のアプローチ

### データセットと選定基準

本研究は、以下のデータセットを中心に分析を行いました：

- **HateBase**: ヘイトスピーチ検出のための大規模データセット。  
- **TRAC**: サイバーブリングを対象としたデータセット。  
- **OLID**: 多言語対応を含む、オンライン虐待データセット。  

データの選定基準は以下の通りです：

- **多様性**: 英語以外の言語を含む。  
- **リアリズム**: 実際のオンライン投稿から収集されたもの。  
- **スケーラビリティ**: モデル訓練に適した規模のデータ量を確保。  

---

### モデルの構造と使用方法

以下のモデルが用いられました：

1. **BERT**: 文脈理解を重視し、微調整で高精度を実現。  
2. **RoBERTa**: トレーニングデータ量を増やし、BERTを改良。  
3. **GPT-3**: 文生成と分類タスクの両方に対応可能。  

#### トレーニング手法

各モデルに対して以下のステップが実施されました：

1. **データ前処理**: ストップワード除去、トークナイズ。  
2. **微調整**: タスクに特化したデータを用いたトレーニング。  
3. **ハイパーパラメータ調整**: 学習率、エポック数、バッチサイズを最適化。  

---

## 実験結果と考察

### パフォーマンス比較

以下に主要モデルの性能を示します：

| モデル         | ヘイトスピーチ (F1) | サイバーブリング (F1) | ドクシング (F1) |
|----------------|---------------------|------------------------|-----------------|
| BERT           | 92%                | 90%                   | 78%             |
| RoBERTa        | 94%                | 91%                   | 81%             |
| GPT-3          | 88%                | 87%                   | 80%             |

#### 考察

- RoBERTaが最も高い精度を示した理由は、大規模な事前学習データに依存する点。  
- GPT-3は多言語対応で優位性があるが、計算コストが課題。  

---

## 倫理的課題と未来の方向性

### 倫理的課題

1. **偏見**: 訓練データに依存するバイアスが、誤った結論を導くリスク。  
2. **プライバシー**: データ収集の際、ユーザーのプライバシーを侵害する可能性。  

---

### 未来の方向性

1. **多言語対応の強化**  
   英語以外のリソースが乏しい言語への適用。  
   
2. **透明性の向上**  
   モデルのブラックボックス問題を解消するため、SHAPやLIMEなどの手法を活用。  

3. **新たなモデル開発**  
   大規模モデルにルールベースの特徴を組み合わせたハイブリッド手法の提案。  

---

この記事が皆様の研究や実務に役立つことを願っています。質問やコメントはぜひお寄せください！
「Unknown Kotlin JVM target: 21」エラーを解決する方法

# エラー内容
flutterでアプリ開発中に、`android studio`で`Generate Signed App Bundle/APK`を行った時に以下のエラーが出ました。
```
Unknown Kotlin JVM target: 21
```
実際には、プロジェクトの `Gradle` ビルド設定では `JVM` ターゲットとして "17" が設定されているにも関わらず、`Android Studio` や `Gradle` の実行環境で誤って `JDK 21` が使用されていました。

# 解決方法
(1). Android Studio の設定を開く
 - Windows/Linux の場合
メニューから `File > Settings...` を選択します。
 - macOS の場合
メニューから `Android Studio > Preferences` を選択します。

(2). `Gradle` の `JDK` 設定を変更
左側のメニューから `Build, Execution, Deployment > Build Tools > Gradle` を選択します。

右側に表示される「Gradle JDK」のドロップダウンリストから、設定したい `JDK 17` を選択します。

※ここで、デフォルトで `JDK 21` が選択された状態になっていて、これが原因でエラーになっていました。

(3). プロジェクトを再同期＆ビルド
設定変更後、`File > Sync Project with Gradle Files` を実行し、プロジェクト設定を再同期します。
REFOCUS: 視覚的編集で構造化画像理解を革新する最新フレームワーク

# REFOCUS: 視覚的編集を通じた構造化画像理解の新たなパラダイム

今回は、最新の研究成果である「REFOCUS: Visual Editing as a Chain of Thought for Structured Image Understanding」という論文をご紹介します。この研究は、構造化画像の理解を革新するためのフレームワーク「REFOCUS」を提案し、マルチモーダル大規模言語モデル（LLM）の性能を大幅に向上させています。

---

## 論文情報
- **タイトル**: REFOCUS: Visual Editing as a Chain of Thought for Structured Image Understanding
- **リンク**: [公式ページ](https://zeyofu.github.io/ReFocus/)
- **発表日**: 2025年1月9日
- **著者**: Xingyu Fu, Minqian Liu, Zhengyuan Yang, John Corring, Yijuan Lu, Jianwei Yang, Dan Roth, Dinei Florencio, Cha Zhang
- **DOI**: 未公開

---

## 背景と目的

### 背景: 構造化画像理解の重要性と課題
構造化画像（表、グラフ、チャートなど）は、情報を効率的かつ正確に伝えるための重要な手段です。たとえば、財務報告書における表や科学論文のグラフは、専門家が情報を解釈する際の不可欠な要素です。しかし、これらの構造化画像を正確に理解することは、技術的に以下の課題を伴います：

1. **選択的注意の欠如**  
   モデルが全体画像を処理する際、不要な情報がノイズとなり、重要な要素に十分な注意を払えない。
2. **視覚的推論の限界**  
   既存モデルは視覚的中間推論を欠いており、情報を段階的に処理する能力が弱い。
3. **OCR依存の問題**  
   現在の多くの手法はOCRを基盤とし、構造化画像内の視覚的コンテキストを適切に利用できていない。

### 本研究の目的
「REFOCUS」は、視覚的編集（Visual Editing）を通じてこれらの課題を解決し、マルチモーダルLLMの理解能力を高める新しいアプローチを提案します。本研究の主な目標は以下の通りです：

- 視覚的中間推論を組み込むことで、モデルの理解力を強化する。
- 必要に応じて視覚的編集を動的に適用し、不要な情報を削除。
- マルチモーダルLLMの性能を数値的に向上させる。

---

## REFOCUSフレームワークの詳細

「REFOCUS」は、以下の3つの主要なコンポーネントで構成されています：

### 1. 視覚的編集ツール
本研究では、視覚的編集を通じて構造化画像の理解を改善します。主な編集方法は以下の通りです：

- **マスキング**: 不要な行や列を白で塗りつぶすことで、視覚的ノイズを削減。
- **ボックス描画**: 赤枠を使用して重要領域を明示。
- **強調表示**: 背景色を変更し、関連情報を目立たせる。

#### コード例: 列の強調表示
以下のPythonコードは、特定の列を強調表示する方法を示しています。

```python
from PIL import Image, ImageDraw

def highlight_columns(image, columns_to_focus, bounding_boxes):
    edited_image = image.copy()
    draw = ImageDraw.Draw(edited_image)
    for column in columns_to_focus:
        box = bounding_boxes[column]
        draw.rectangle(box, outline="red", width=3)
    return edited_image
```

### 2. チェーンオブソートプロセス
視覚的編集と推論のプロセスは以下の通りです：

1. モデルが入力画像を解析し、初期的な注目領域を特定。
2. 必要な視覚的編集（マスキング、ボックス描画など）を適用。
3. 編集後の画像を再度モデルに入力し、改良された回答を生成。

### 3. データセットの拡張
「REFOCUS」では、視覚編集を使用して新たに14,344件のデータを生成。このデータセットは、モデルの微調整に使用され、精度向上に貢献しました。

---

## 実験の概要と結果

### 使用データセット
本研究で使用された主なデータセットは以下の通りです：

1. **VWTQ**: Wikipediaから抽出された表に基づく質問応答タスク。
2. **ChartQA**: 棒グラフや折れ線グラフに基づく視覚推論タスク。
3. **CharXiv**: 複雑な科学グラフに基づくデータ解釈タスク。

### 評価指標と結果
実験では以下の評価指標を使用しました：

- 精度（Accuracy）
- 真偽判定の正確性
- 多段階推論能力

主な結果は以下の通りです：

- **表タスク**: GPT-4oと比較して最大11.0%の精度向上。
- **グラフタスク**: 平均6.8%の精度向上。

---

## 結果の分析

### なぜ「REFOCUS」は効果的なのか？
1. **選択的注意の強化**  
   不要な情報を削除し、関連性の高い領域に焦点を当てることで、モデルが効率的に推論可能。
2. **視覚的中間推論**  
   編集された画像を再入力するプロセスにより、段階的な視覚的理解を実現。

### 改善点と限界
- 高度な編集が可能になることで精度が向上しましたが、計算コストが課題。
- 一部の複雑なグラフでは、編集手法が期待した効果を発揮できないケースも。

---

## 応用例と未来の展望

「REFOCUS」は以下の分野での応用が期待されます：

1. **教育**: 学生向けの視覚教材の改善。
2. **産業**: データドリブンな意思決定プロセスの支援。
3. **研究**: 科学論文のデータ解析を効率化。

今後の課題として、以下が挙げられます：

- 編集プロセスの効率化。
- ビデオや音声データへの拡張。

---

この記事が、研究や実務に役立つことを願っています。ご意見やご質問は、ぜひコメント欄でお寄せください。
I3C搭載マイコン調査

I3Cを搭載した組み込み向けマイコンの調査（11 Jan 2025）
パッケージは手はんだ付けしやすいものを選択


[RX26T](https://www.renesas.com/ja/products/microcontrollers-microprocessors/rx-32-bit-performance-efficiency-mcus/rx26t-32-bit-microcontroller-optimized-dual-motor-and-pfc-control#documents) ルネサスエレクトロニクス


[PIC18-Q20](https://www.microchip.com/en-us/products/microcontrollers-and-microprocessors/8-bit-mcus/pic-mcus/pic18-q20)　マイクロチップ

[STM32H5](https://www.st.com/ja/microcontrollers-microprocessors/stm32h5-series.html0)　STマイクロエレクトロニクス

[LPC865](https://www.nxp.jp/products/LPC86X) NXP

[MCX A13-A14-A15](https://www.nxp.jp/products/MCX-A13X-A14X-A15X) NXP


| デバイス | 価格(DigiKey) | コア | 周波数 | RAM | ROM | 電圧 | パッケージ | I/O | ADC |  
|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|[STM32H503CBT6](https://www.digikey.jp/ja/products/detail/stmicroelectronics/STM32H503CBT6/21348928)| 574 | Cortex-M33 | 250MHz | 32KB | 128KB | 1.71V～3.6V | 48-LQFP | 35 | 12bit |
| [R5F526T9BDFL#30](https://www.digikey.jp/ja/products/detail/renesas-electronics-corporation/R5F526T9BDFL-30/21408956) | 939 | RXv3 | 120MHz | 64KB | 128KB | 2.7V～5.5V | 48-LQFP | 37 | 12bit |
| [PIC18F16Q20-E/SS](https://www.digikey.jp/ja/products/detail/microchip-technology/PIC18F16Q20-E-SS/25616847) | 188 | PIC 8 | 64MHz | 4KB | 64KB | 1.8V～5.5V | 20-SSOP | 16 | 10bit | 
| [LPC865M201JBD64/0K](https://www.digikey.jp/ja/products/detail/nxp-usa-inc/LPC865M201JBD64-0K/21186813) | 457 |  Cortex-M0+ | 60MHz | 8KB | 64KB | 1.8V～3.6V | 64-LQFP | 54 | 12bit |
| [MCXA142VLH](https://www.digikey.jp/ja/products/detail/nxp-usa-inc/MCXA142VLH/22036094) | 561 | Cortex-M33 | 48MHz | 16KB | 64KB | 1.71V～3.6V | 64-LQFP | 52 | 12/16bit |
| MCXA132VLF(25 Q2リリース) | 296 | Cortex-M33 | 96MHz | 16KB | 64KB | 1.71V～3.6V | 48-LQFP | 41 | 12/16bit |
入緑報告

ABC388で入緑しました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3847324/4584d8c1-d73e-c0be-25d5-4b064aa78bd8.png)

# サマリ
実務未経験
初参加から7か月半、入茶からは5か月半かかって入緑
言語はpython
rateは長らく停滞していたがABC381以外は皆勤賞
(これは金曜日開催であることに気づかなかった)

# やったこと

### 環境を整えた
[競技プログラミングの環境構築 [VSCode+WSL+AtCoder Library]【ゆっくり解説】](https://www.youtube.com/watch?v=uhnASau7fB4)

言ってる意味は何も分かりませんでしたが、言われるがままに構築しました。

以前はpaiza.loで書いていたのですが、verが古く使えないライブラリもあったので
VSCodeで書いた方が捗りました。
github copilotも導入しましたが、無料分のコード補完は即使い切るのであまり意味がありませんでした。
(atcorderの生成AIガイドラインに従うとチャット機能は使えないと考えてよい)


ちなみにこの過程でpythonが複数インストールされていることになったらしく

https://qiita.com/Shirotsume/items/706742162db68c481c3c

これを読んでpipしようとしたところ、全然うまくいかず苦労しました。
これは、仮想化してpip→bashrcに仮想化したパスを参照先として追加みたいな感じで解決しました。

### 鉄則本のA問題を大体解いた

会社の上司からKindle Paperwhiteをいただいたので、kindleで鉄則本を購入しました。
DPやグラフ関係のアルゴリズムをわかりやすく学べて
特にダイクストラ法のおかげでABC384では5完できました。

### シリコンバレーへ行った
paizaのキャンペーンに当選してシリコンバレーへ行きました。
競プロ精進していると海外旅行へ行けるって、知っていましたか？

[【Vlog】アメリカ・シリコンバレー企業視察ツアーに行ってきた【前編】](https://www.youtube.com/watch?v=8dB3Wg9FYuw)
(こちらは同行した方によるレポート動画)

# やらなかったこと
### 競プロ以外のアウトプット
何もしていません。
Microsoft 365 Businessではexcel内でpythonが使えるらしいですが
業務上で[鏡餅を作ったり](https://atcoder.jp/contests/abc388/tasks/abc388_e)、[石を配ったり](https://atcoder.jp/contests/abc388/tasks/abc388_d)はしないので、実生活と結びつけるのは少し難しいですね。

### 高度情報に受かる
これは普通に落ちました。
# これからやること
### C問題とD問題を埋める。
これやらないと即茶色に落ちそうなので
まずは茶パフォを取らないように4完を義務付けたいと思います。
水色は、まだちょっと視界には入らなさそうです。
### 電卓を作る
競プロやっている話を会社でしたら、同僚から
「じゃあ電卓くらい作れますよね、プログラミング入門の課題によくあるみたいですよ」
と言われたのでとりあえず電卓を作りたいです。
### 高度情報に受かる
とりあえず受験は続けたいけど何を受けるかは考え中…
【exFAT】RaspberryPiに接続したHDDの権限を変更できない場合の対処法

# 結論
exFATでフォーマットしたHDDをRaspberryPiに接続した場合、`chmod`で権限を変更できない。  
その場合、マウント時に所有者をユーザに設定すれば、権限が付与できる。  

# 背景
RaspberryPiとHDDを使って自宅ファイルサーバを立てたが、ファイルが書き込めなかった。  
ファイルサーバとして運用を始める前に、最初のデータをWindowsPCやmacPCからHDDに移動しておきたかったため、フォーマットをexFATにしていた。  
```bash
# chmodでパーミッションを変更しようとしても何も変わらない(エラーは出力されない)
$ sudo chmod g+w /mnt/hdd

# chownで所有者を変更しようとすると、何かエラーが出てくる
$ sudo chown -R pi:pi /mnt/hdd
chown: changing ownership of '/mnt/hdd/System Volume Information/WPSettings.dat': Operation not permitted
chown: changing ownership of '/mnt/hdd/System Volume Information/IndexerVolumeGuid': Operation not permitted
chown: changing ownership of '/mnt/hdd/System Volume Information': Operation not permitted
chown: changing ownership of '/mnt/hdd': Operation not permittedsudo chown -R pi:pi /mnt/hdd
chown: changing ownership of '/mnt/hdd/System Volume Information/WPSettings.dat': Operation not permitted
chown: changing ownership of '/mnt/hdd/System Volume Information/IndexerVolumeGuid': Operation not permitted
chown: changing ownership of '/mnt/hdd/System Volume Information': Operation not permitted
chown: changing ownership of '/mnt/hdd': Operation not permitted
```

# 環境
RasberryPi：3B  
OS：Raspberry Pi OS(64bit)
HDD：WESTERN DIGITAL WD80EAAZ-AJP 8TB

# 原因
RaspberryPiにexFAT形式のHDDを接続した際、デフォルトではrootユーザーのみがアクセス可能で、一般ユーザがアクセスできない。
理由として、exFATが`chmod`などのUNIX系システムのパーミッション変更方法に対応していないかららしい。  

# 解決方法
マウント時にHDDのディレクトリの所有者をユーザに設定すれば解決する。  
一回はマウントできているが、パーミッションだけ変更できなかったという前提で進めていきます。  

## HDDのフォーマット確認
とりあえず本当にexFATか確認する。  
以下の`TYPE`が`TYPE="exfat"`であることを確認する。  
```bash
$ sudo blkid
/dev/sda2: LABEL="MyHDD" UUID="XXXX-XXXX" TYPE="exfat" PARTUUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
```

## exFAT用のライブラリをインストール
```bash
$ sudo apt update
$ sudo apt install exfat-fuse -y
```

## 一度HDDをアンマウント
所有者を変更するには、マウントしなおす必要がある。  
```bash
# mnt/hddにマウントしている場合。各自変えてください。
$ sudo umount /mnt/hdd
```

## HDDに所有者の設定
`pi`ユーザがアクセスできるように設定する。  
```bash
$ sudo mount -t exfat /dev/sda2 /mnt/hdd -o uid=pi,gid=pi,umask=0022
```
`uid=pi`：所有者を `pi` ユーザーに設定。
`gid=pi`：グループを `pi` グループに設定。
`umask=0022`：パーミッションを設定(所有者に読み書き、他は読み取り)。

# まとめ
以上の手順で、exFAT形式のHDDをRaspberryPiの`pi`ユーザがアクセスできるようになる。  
sambaもネットワークも詳しくなくて、けっこう詰まったから備忘録として投稿します。
Kubernetesのインストールではまった

Kubernetesを構築する際にkubeadmのインストールではまったのでメモ

日本語ドキュメントが更新されてないっぽい(2025/1/12時点です)
https://kubernetes.io/ja/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

---

## 日本語ドキュメント
これだと「baseurlにアクセスできない」みたいなエラーになる
```
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

# SELinuxをpermissiveモードに設定する(効果的に無効化する)
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

systemctl enable --now kubelet
```

## 英語ドキュメントだと
baseurl、gpgkeyが違う
こっちだとインストールできる

```
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.32/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.32/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
```
---
ネット調べてもあんまり情報なかったので。
【Dify】質問分類器を試してみる

# はじめに

AIマルチエージェントシステムの構築練習として、今回はDifyの質問分類器を試してみたいと思います。


## 環境
- 使用PC
ノートPC(Surface Go3 Laptop)
Windows11


- 使用ツール
Docker
Ollama
phi-3 mini(ローカル)
Dify(ローカル)


## システムの構築
システムとしては、質問が本に関する質問か映画に関する質問かを分類する質問分類器を使って分岐を設けました。分岐先はオススメの本を紹介するLLMとオススメの映画を紹介するLLMになっています。
最終的な回答としてはオススメの本もしくは映画を紹介してくれるというシステムです。
なお、今回はphi3miniを使う都合上、プロンプトに英語を使用します。

![BookMovie.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3838427/bccef186-8bc4-be2d-7fce-37e88b134683.jpeg)




### 質問分類器

以下のように質問分類器を設定しました。

クラス1： about book title question
クラス2： about movie title question
クラス3： other



### オススメ本紹介AI
システムプロンプト
~~~
You have to recomend the book title based on input.

インプット：開始/text
~~~
### オススメ映画紹介AI
システムプロンプト
~~~
You have to recomend the movie title based on input.

インプット：開始/text
~~~



## 結果
構築したシステムを使ってみましょう。

### 入力
~~~
A novel featuring a very clever detective
(訳：頭脳明晰な探偵が登場する小説。)
~~~

### 質問分類器
~~~
about book title question(クラス2に分類)
~~~

### 出力
~~~
"The Adventures of Sherlock Holmes," written by Sir Arthur Conan Doyle,
is an excellent recommendation for a novel that features a highly 
intelligent and cunning detective who uses his extraordinary observational
skills to solve complex mysteries. In this classic series of stories, 
the character of Sherlock Holmes has captivated readers around the world 
with his sharp wit, deductive reasoning abilities, and unparalleled 
attention to detail. Through a variety of intriguing cases involving murder, 
thefts, frauds, and other crimes, Doyle brings this brilliant detective' 
extrordinary character to life in an engagingly readable style that has 
ensured his enduring popularity amongst readers over more than 
125 years since it was first published. The stories are filled with 
suspenseful plot twists, clever clues and astounding deductions which 
all contribute towards making Holmes the most famous detective of literature 
a perfect novel recommendation for someone looking to enjoy
an exciting tale featuring a very clever investigator!
(訳：アーサー・コナン・ドイル卿が書いた「シャーロック・ホームズの冒険」は、
並外れた観察力で複雑な謎を解く、非常に聡明で抜け目のない探偵を描いた小説として、
お勧めです。この古典的な物語シリーズでは、シャーロック・ホームズのキャラクターが、
鋭い機知、推理力、そして比類のない細部へのこだわりで世界中の読者を魅了してきました。
殺人、窃盗、詐欺、その他の犯罪を含むさまざまな興味深い事件を通して、
ドイルはこの優れた探偵の並外れたキャラクターを、魅力的で読みやすいスタイルで
生き生きと描き出しています。このスタイルは、初版以来 125 年以上にわたって読者の間で
不朽の人気を保っています。物語には、ホームズを文学史上最も有名な探偵にするのに寄与する、
サスペンスに満ちたどんでん返し、巧妙な手がかり、そして驚くべき推理が満載です。
これは、非常に賢い探偵を描いたエキサイティングな物語を楽しみたい方に最適な小説です。)
~~~


## まとめ
　とりあえず質問分類器で質問が分類できることを確認できました。
安全とはなにか

# はじめに
 "安全とは何か"と聞かれたらどのように答えますか？ 明確に答えをお持ちの方もいらっしゃるかもしれませんが、大抵の人はフワッとしていると思います。 一方で、「安全第一」という言葉は誰もが知っている言葉です。安全は何よりも優先すべき事項であると言えます。ニュースなどで事故が報道される度にしばしば安全について議論になりますが、「安全」という言葉が曖昧にもかかわらず、安全第一という言葉が先行して議論が明後日の方向へ行くことも多いと思います。 ここでは機械の安全がどのような考えで安全に作られているのかということをベースに、安全とは何かについて分かりやすく説明したいと思います。
このテキストは初めて製品安全の設計に携わるエンジニアの方や、非エンジニアの方を対象に具体例を交えながら安全とはどういう状態なのかを分かりやすく説明してゆきたいと思います。

# 安全の定義
早速、安全な定義について説明します。 安全とはISO/IEC Guide 51:2014(日本ではJIS Z 8051:2015)の3.14を参照しますと「許容不可能なリスクがないこと。」と定義されています。 これは逆に言えば、許容可能なリスクがあると言うことになります。リスクが全くない状態を安全というわけではないということです。この辺りが、世間一般と感覚のずれる一つの要因なのだろうと思います。ISO/IEC Guide 51の適用範囲を確認しますと、工業製品に関わらず、人や環境なんかにも適用しても良いと書いてあります。世の中の大半の人はこの規格の存在自体を知らないと思いますが、基本的な安全な考え方として業界問わず共通の認識といえます。

# 許容可能なリスク
許容可能なリスクは3.15を参照します。"現在の社会の価値観に基づいて、与えられた状況下で、受け入れられるリスクのレベル"と書いてあります。 この価値観は変化するものでもあります。例えば、原発です。福島の原発事故以前は、原発事故のリスクについては許容されていたと言えます。事故発生以降、世間の価値観は変化して原発事故のリスクが許容不可となったと言えます。事故の前後でリスクが変化したわけではありませんが、許容可能なレベルではなくなったと言えます。

# リスクとは何か
じゃあ一体リスクとは何か？という話になってきます。リスクは3.9を参照しますと、「危害の発生確率とその危害の度合いの組み合わせ。」とあります。 つまり、危害が大きくくても確率が低ければ許容できる。確率が高くても危害が低ければ許容できる。ということです。 例えば、飛行機に乗るということ。墜落すればまあ間違いなく死ぬでしょう。これは危害が大きいといえます。しかし、墜落する可能性自体はかなり低い。すなわち、飛行機に乗るといことはこのリスクを許容したということです。 冬に寒くてセーターを着ると、静電気怖いですよね。もう扉を開ける度にビクビクしちゃいますよね。でも、家の扉を全部自動ドアにはしませんしセーターは着ますよね(着ない人はしらん) これは、静電気がただちょっと痛いだけで死ぬほどのことではないから頻繁に起きてもいいということです。 つまり、飛行機やセーターは定義に従えば安全だということになります。しかし、リスクがゼロなわけではありません。

# 危害の発生確率
危害の発生確率についてはさらに、 ①ハザードへの暴露 ②危険事象の発生 ③危害の回避又は制限の可能性 の3つに分解されます。
先ほどの飛行機の例に例えると ①飛行機に乗る回数 ②飛行機が墜落する確率 ③飛行機が墜落した時に助かる可能性 というふうに分解することができます。 これが、危害の発生確率ということになります。

# 安全を確保するということ
安全の定義やリスクについてはここまででご理解いただけたのではないでしょうか。 次は、どうやって安全を確保してゆくのかという話になります。 これまでの説明を要約すると、安全な状態というのは、リスクを許容できるレベルまで下げた状態ということになります。ここためには、どんなリスクがあるのかをはっきりさせる必要があります。 このリスクを検討する方法として「リスクアセスメント」というものがあります。 リスクアセスメントはISO12100(JIS B 9700)を参照します。ここからは基本的に機械類の話になってゆきますので、世間一般にどこまで適用可能かはわかりません(知ってたらコメントで教えてください) リスクアセスメントについてはそれだけで記事になりますので、割愛したいと思います。 飛行機の例に例えると、飛行機が墜落すること。それがどのくらいの被害でどのくらいの確率で起こるのかというのをここで決めることになります。また、飛行機を作る時のリスクや、乗り降りする時リスク等についても考えておかないといけません。乗り降りした時に階段をふみはずすとか、離陸時に歩いたらこけるとかそんなこともいちいち全部考えます。想像よりも、大変な作業です。考えるべきリスクについても、規格にまとめられています。 また、機会があればリスクアセスメントについてまとめたいと思います。
リスクアセスメントをした後は、リスク低減の方法を考えます。こちらもリスクアセスメントと同じく詳細は割愛してまたの機会にしたいのですが、リスクアセスメントの結果許容できないリスクがあれば対策をしてゆきます。 飛行機が墜落しても死なないように緊急脱出装置をつけるとか、そもそも墜落しないように陸を走るとか、なんかそんなことを考えたりします。対策は一つではないですが、対策には優先度がありますので注意が必要です。
安全を確保するためにはものすごい数のリスクの確認と対策が必要になるということだけ覚えておいていただければとおもいます。

# 最後に
安全ということについて、想像とは少し違ったのではないでしょうか。特に日本では安全=ゼロリスクという考えになりがちです。とくに、危害の確率が少しでもあれば危害のひどさだけで議論する傾向あるように思います。ですが、ゼロリスクということはほとんどありません。残ったリスクを許容できるということが安全です。確率についてもよくよく議論が必要です。 「死ぬこと以外かすり傷」という言葉があります。かすり傷は許容可能なリスクですよね。死ぬこと以外は許容可能なリスクとしている(死ぬ確率も低いとしている)。つまり、安全な生き方という事になります。 これがいい生き方かどうかはともかく、リスクを適切に把握して評価するということは大切だと思います。死ぬこと以外とまではいかなくてもいいですが、冷静になれば結構身の回りはリスクが溢れていますので、ある程度許容しながらうまく折り合いをつけて生きていくと楽になると思います。
Rails acts_as_list gem 使ってみた

## 環境
- Rails8
- Ruby.3.3.6
## 読んで欲しい人
- acts_as_list gemについてざっくりと知りたい人
- 過去の自分
## acts_as_list gemとは

リスト内のオブジェクトをソートしたり、並び替えしたりする機能を提供してくれるgemです
使用するには、positionカラムを追加する必要があります

## 使い方

ここではReadMeにあるように、`TodoList`モデルと`TodoItem`モデルを例としてあげます

```todo_list.rb
class TodoList < ActiveRecord::Base
  has_many :todo_items
end
```

```todo_item.rb
class TodoItem < ActiveRecord::Base
  belongs_to :todo_list
end
```

### gemを追加

gemfileに追加します

```gemfile
gem 'acts_as_list'
```

### 既存のテーブルにpositionカラムを追加する

任意のテーブルにpositionカラムを追加します

```
rails g migration AddPositionToTodoItem position:integer
rake db:migrate
```

### Modelにacts_as_listメソッドを追加する

```todo_list.rb
class TodoList < ActiveRecord::Base
  has_many :todo_items, -> { order(position: :asc) }
end
```

`:todo_items, -> { order(position: :asc) }`で`position`カラムの昇順に並び替えることを指定しています


```todo_item.rb
class TodoItem < ActiveRecord::Base
  belongs_to :todo_list
  acts_as_list scope: :todo_list
end
```

`acts_as_list scope: :todo_list`を指定してあげると下記のメソッドが使用できるようになります

- `move_higher`: 順序を一つ上げる
- `move_lower`: 順序を一つ下げる
- `move_to_top`: リストの最上位に移動する
- `move_to_bottom`: リストの最下位に移動する

使い方はこんな感じ

```ruby
todo_list = TodoList.find(1)
todo_item = todo_list.todo_items.create(name: '新しいタスク')

todo_item.move_higher
todo_item.move_to_top
```

※ `acts_as_list scope: :todo_list`を定義してあげると、新しいレコード追加時に`acts_as_list`がよしなにpositionカラムのディフォルト値を設定してくれます

## 感想

- Railsの並び替え界隈では一番有名なgemなんですかね、これ以外調べてもあまり出てこなかった。

## 参照

https://github.com/brendon/acts_as_list
JS-分割代入ではまった話（初心者向け）

まずは下記の簡単なコードをご覧ください。
~~~
  const array = [1,2,3,4]
  console.log(array[1], array[3])
  
  [array[1], array[3]] = [array[3], array[1]]　//分割代入による値入れ替え
  console.log(array[1], array[3])
~~~

こちらですがconsoleにはどのように表示されるでしょうか？
期待されているのは

~~~
2 4
4 2
~~~

ですが、実際はエラーになります
~~~
2 4
test.js:3 Uncaught TypeError: Cannot set properties of undefined (setting '4')
~~~

これはJSの自動セミコロン挿入機能(Automatic Semicolon Insertion)によるものと思われます。本来、JSは文末にセミコロンを書くものでしたが、近年では省略しても自動補完してくれます([詳しくはこちら](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#automatic_semicolon_insertion))。

しかし、この機能は前後の文で意図しない挙動になることがあるため、今回のケースではおそらく突然無名の配列に代入しようとしているように受け取られたのだと思います。

なお下記のようにセミコロンを分割代入の前の文末につければ問題なく動きます。
~~~
  const array = [1,2,3,4]
  console.log(array[1], array[3]); //セミコロン追加
  
  [array[1], array[3]] = [array[3], array[1]]　//分割代入による値入れ替え
  console.log(array[1], array[3])
~~~
~~~
2 4
4 2
~~~

自動補完の挙動をしっかり読めない場合（私みたいな人）は元の仕様に則ってセミコロンをちゃんと書くスタンスのほうがいいと思います。

なお、私は本来セミコロンつける派にも関わらず、console.logを入れてちょっと確認するだけと省略してしまった、というなんとも間抜けなオチでした。（でもこの仕様は知らなかったので、勉強になりました。さすがにコードはもう少し複雑だったので、最初どこが原因かわからずけっこう焦りました。）

ちなみに文末がしっかりと明確であればいいので、セミコロンなしでもたとえば
~~~
  const array = [1,2,3,4]
  console.log(array[1], array[3])

  if(true)[array[1], array[3]] = [array[3], array[1]] //絶対に通るif文にする
  console.log(array[1], array[3])
~~~

とかでも動作します。こんな書き方する人いないとは思いますが、これでもちゃんと動いた、と一人でおもしろがってました。
#0011（2024/01/11）エイリアスとは？

# エイリアス（alias）とは？

「**エイリアス（alias）**」とは、**あるリソースやコマンド、名前などに対して別名や短縮名を設定する仕組み・機能**を指します。元のリソースを変更せずに、アクセス方法や呼び方だけを変えることで、使い勝手や分かりやすさを向上させることができます。

辞書的な意味→「(特に)一名…、別名は」

---

## 主な活用例

### 1. シェルのエイリアス

UNIX系システムのシェル（bash や zshなど）で頻繁に使用する長いコマンドに対して別名を設定できます。これにより、入力を短縮できるほか、作業効率も向上します。

- **例**: `alias ll='ls -l'`

上記の例では、`ls -l`コマンドを`ll`という短いコマンドで実行できるようになります。

---

### 2. メールのエイリアス

一つのメールアカウントに対して複数のメールアドレス（エイリアス）を割り当てることで、**受信メールを同じ受信トレイでまとめて管理**できるようになります。

- **例**:  
  - 社内用のアドレスと外部向けのアドレスをエイリアスとして設定し、一つの受信トレイでまとめて確認。

---

### 3. ドメインやホスト名のエイリアス

DNSの設定（CNAMEレコードなど）で、あるホスト名に対して別のホスト名を関連付けることで、**複数の名称で同一のサーバを指し示す**ことが可能です。

- **例**:  
  - `www.example.com` を `example.com` へ紐づける  
  - 別のサブドメインから同じ実体のサーバに誘導

---

## まとめ

エイリアスは、
- **コマンドを短縮**して作業効率を上げる
- **メールアドレスを使い分け**て連絡先を整理
- **DNSで複数のドメインを指し示す** など

さまざまな場面で応用されています。**元のリソース自体は変更せずに、別名を使うだけ**という手軽さもエイリアスの大きな魅力です。

# 参考
-chatgptの回答を元に参考
今週の学習記録【2025/1/5～2025/1/11】

## 🔍 学習内容
- **学習テーマ**: Docker　リーダブルコード　HTML,CSS
- **使用した教材**: Udemy, CodeLesson, YouTube

## ✏️ 学んだこと
### 主なポイント
- Docker Composeを使用した環境構築
- 比較式の適切な書き方
- HTML,CSSの基礎

## 💡 学び・反省点
### 学び
- volumes: の末尾に「:chched」をつけると一貫性は損なわれてしまうが応答速度が向上する。
- 比較式は（i > 5）のように安定した値を右に書くと良い。
- insetプロパティはtop,right,bottom,leftを一括指定できる。
- gapプロパティを使用することで要素間に隙間を作ることができる。
- grid-area使用することで柔軟なレイアウトを実装できる
- plece-contentを使用することで要素内のコンテンツの配置方法を指定できる。
- all:unsetプロパティを使用することで要素のCSSをリセットすることができる。
- Figmaを使用したデザインカンプからのコーディング（PC画面のみ）

### 反省点
- 毎日の学習は継続できたが、学習時間をもう少し増やしたかった。


## 📆 次週の予定
### 目標
- デザインカンプからのコーディングをレスポンシブ含め完成させる。
- 平日2時間、休日5時間を目安に学習時間を確保する。

### 行動計画
- 通退勤時間も積極的に学習する。
- 帰宅時にダラダラせずさっさと学習を始める。
- 休日だからといって昼近くまで寝ない。

## 🏄‍♂️所感
　今週からDockerの学習を中断してフロントエンド周辺の学習にシフトチェンジしました。学生時代に学習したことが多かったので比較的行き詰まることなく進めることができました。
　来週はデザインカンプからのコーディングを完成させJSの学習に入れるように努めたいと思います。
【Fish】パスの追加方法

`fish_add_path`コマンドを使用することで、`$PATH`に新しいディレクトリを追加できます。

## `fish_add_path`の概要

`fish_add_path`は、Fishの`$PATH`に新しいコンポーネントを追加するためのシンプルな方法です。以下のように使用します。

```fish
fish_add_path path ...
```

### オプション

- `-a` または `--append`: コンポーネントを変数の末尾に追加します
- `-p` または `--prepend`: コンポーネントを変数の先頭に追加します（デフォルト）
- `-g` または `--global`: グローバルな `fish_user_paths` を使用します
- `-U` または `--universal`: ユニバーサルな `fish_user_paths` を使用します（デフォルト）
- `-P` または `--path`: `$PATH` を直接操作します
- `-m` または `--move`: 既存のコンポーネントを追加されるべき位置に移動します
- `-v` または `--verbose`: 使用された `set` コマンドを表示します
- `-n` または `--dry-run`: 実行せずに使用される `set` コマンドを表示します
- `-h` または `--help`: このコマンドの使い方に関するヘルプを表示します

## 使用例

### 新しいディレクトリを`$PATH`に追加する

新しいアプリケーションをインストールした後、そのバイナリを`$PATH`に追加するには、次のようにします。

```terminal
fish_add_path /opt/mycoolthing/bin
```

### ユーザーのローカルバイナリを優先する

`~/.local/bin`を最初にチェックさせたい場合は、次のようにします。

```terminal
fish_add_path -m ~/.local/bin
```

### グローバルな`fish_user_paths`を使用する

複数のディレクトリをグローバルに追加するには、次のようにします。

```terminal
fish_add_path -g ~/.local/bin ~/.otherbin /usr/local/sbin
```

### `$PATH`の末尾に追加する

フォールバック用のディレクトリを`$PATH`の末尾に追加するには、次のようにします。

```terminal
fish_add_path -aP /opt/fallback/bin
```

### 現在の作業ディレクトリの`bin`を追加する

現在の作業ディレクトリの`bin/`を追加するには、次のようにします。

```terminal
fish_add_path -v bin/
```

### HomebrewでインストールしたRubyのパスを追加する

HomebrewでインストールしたRubyのバイナリを`$PATH`に追加するには、次のようにします。

```terminal
fish_add_path /usr/local/opt/ruby/bin
```

## 参考

https://fishshell.com/docs/current/cmds/fish_add_path.html
WARファイルをインポートするとフォルダ構成が変わってしまう→未解決

# 何が起きたか
EclipseでJavaのWebアプリを作成中です。

出来上がったアプリ（動的プロジェクトで作成）はこんなフォルダ構成です。

```:【フォルダ構成】
TestWeb（コンテキスト・ルート。プロジェクト名。）
∟.settings
∟build
∟src
   ∟test
  　  ∟ ・ListServlet.java(このファイルをサーバーで実行)
 　  　 ・UserDao.java
　  　  ・DBAccess.java
∟WebContent
 　∟META-INF
　 ∟web
　　   ∟・list.jsp
　 ∟WEB-INF
　　   ∟lib
　　  　   ∟・mysql-connector-j-9.1.0.jar
　 　  ∟・ web.xml
```

これをWARファイルとしてローカルPCにエクスポートしました。
（Eclipse上でTestWebフォルダを右クリック→エクスポート→WARファイル）
（ファイル名は　TestWeb.war）

その後、EclipseのTestWebプロジェクトを削除し（ローカルPCに残っている同プロジェクトも削除し）
先ほどのTestWeb.warをEclipseへインポートしました。

すると、フォルダ構成が下記のように変わっていました。

```:【フォルダ構成】
TestWeb（コンテキスト・ルート。プロジェクト名。）
∟.settings
∟build
∟src
   ∟main
      ∟java
         ∟test
  　        ∟ ・ListServlet.java(このファイルをサーバーで実行)
 　  　       ・UserDao.java
　  　        ・DBAccess.java
      ∟webapp
         ∟META-INF
　       ∟web
　          ∟・list.jsp
　       ∟WEB-INF
　　        ∟lib
　　           ∟・mysql-connector-j-9.1.0.jar
　 　       ∟・ web.xml
```

変更されてしまったポイントは以下のとおりです。

* 変更前：TestWeb>src>test>各javaファイル
変更後：TestWeb>src>main>java>test>各javaファイル
→勝手に「>main>java」が挟まってきた。
<br>

* 変更前：TestWeb>WebContent
変更後：TestWeb>src>main>webapp
→フォルダ名「WebContent」が勝手に「webapp」に変更された。
→さらに、TestWeb直下から「TestWeb>src>main」配下に移動された。

なんでー！！

# 解決方法探し→未解決

Eclipseで動的プロジェクトを新規作成した際に、デフォルトではソースの配置場所が「コンテキストルート名>src>main>java」になっている（私のEclipseはそうなっている）ので、このデフォルトの設定が影響しているのだろうとは予想するのですが、「warファイル フォルダ構成 変わる」等でググっても適当な答えを見つけられませんでした。

今は謎のまま、インポート後に元のフォルダ構成になるよう手作業で修正しています。

（手修正の内容：
・EclipseのGUI上で、作成済javaファイルたちが入ったtestフォルダを　TestWeb>src直下に移動
・フォルダwebappをWebContentに名前変更しTestWeb直下に移動
・不要なフォルダ（src直下の"main>java"）を削除
・TestWeb右クリックで[プロパティ＞Javaのビルド・パス]の[TestWeb/src/main/java]を[除去]。続いて[フォルダーの追加]→[src」を選択して適用。
・最後にTestWeb右クリックで「リフレッシュ」
）

フォルダ構成を勝手に変更されずにWARファイルをエクスポート/インポートできる方法が見つかったら、ここに追記します。（2025/1/11(土)）
ABC388をPythonで（A～E）

HHKBプログラミングコンテスト2025(AtCoder Beginner Contest 388)の解答等の速報的まとめ

https://atcoder.jp/contests/abc388



# A問題
https://atcoder.jp/contests/abc388/tasks/abc388_a

問題文のまま
```python:A
print(input()[0]+"UPC")
```

# B問題
https://atcoder.jp/contests/abc388/tasks/abc388_b

全部通り長さを調べる
```python:B
n, d = map(int, input().split())
snake = [list(map(int, input().split())) for _ in range(n)]

for i in range(1, d + 1):
    ans = 0
    for t_i, l_i in snake:
        ans = max(ans, t_i * (l_i + i))

    print(ans)
```

# C問題
https://atcoder.jp/contests/abc388/tasks/abc388_c

尺取り法で各餅の2倍以上ある餅の数を数える
```python:C
n = int(input())
a = list(map(int, input().split()))

ans = 0
right = 0
for a_i in a:
    while right < n and a_i * 2 > a[right]:
        right += 1
    ans += n - right

print(ans)
```

# D問題
https://atcoder.jp/contests/abc388/tasks/abc388_d

石の個数は成人になったとき１度だけ増える。
渡せる宇宙人の人数は成人になった瞬間に確定するので、imos法を利用して石を渡す相手を管理する。
```python:D
n = int(input())
a = list(map(int, input().split()))

diff = [0] * (n + 10)
for i, a_i in enumerate(a):
    present = min(a_i, n - i - 1)
    a[i] -= present
    diff[i + 1] += 1
    diff[min(n, i + 1 + present)] -= 1
    diff[i + 1] += diff[i]
    if i + 1 < n:
        a[i + 1] += diff[i + 1]

print(*a)
```

# E問題
https://atcoder.jp/contests/abc388/tasks/abc388_e

餅を小さい組と大きい組で２分する。
このとき、小さい組の小さいほうから順に鏡餅になれるペアを大きい組から探せばいい。
仮に小さい組内で鏡餅になる組み合わせがあったとしても大きい餅が大きい組に対応するようにずらせるので問題ない。

```python:E
from collections import deque

n = int(input())
a = list(map(int, input().split()))

first, second = a[:n // 2], a[n // 2:]

q = deque(first)
ans = 0
for a_i in second:
    if q and q[0] * 2 <= a_i:
        ans += 1
        q.popleft()
    else:
        q.append(a_i)

print(ans)
```
ワークテーブル競合の悩み…それOracle一時表で解決できます

## ごあいさつ
こんにちは、「エイジ＠フジワーランド」です
フリーでパッケージシステムのOEM供給やってます、最近暇なので時給でSESやってます
暇と言いながらSESとは別に、受託でWindows搭載ハンディターミナル向アプリを作ることになりました…ソフトキーボードがなかなか言うこと聞いてくれないですがなにか勉強になったことがあれば記事のネタにしてみたいです

さて今回は一時表の話です

## 一時表（Global Temporary Table: GTT）とは
登録処理や集計処理でワークテーブルを使用することが多いかと思います。しかし、複数のセッションが同時に操作する場合、データに識別子を付けるなどの工夫が必要となりその結果、複雑さが増してバグの原因になることも少なくありません

そこでおすすめしたいのが、一時表の活用です

一時表は同じテーブルであっても、セッションまたはトランザクション単位でデータを分離できる特殊なテーブルです。他のセッションやトランザクションからは独立してデータを扱えるため競合を完全に回避できます。また、使用後のデータは自動的に削除されるため、メンテナンスの手間も削減されます

一時表を導入することで、以下のような利点が得られます
- **同時実行環境での競合リスクを軽減**
- **テストやデバッグの工数を削減**
- **データ操作の安全性と簡便性を向上**

これまでのワークテーブル運用に課題を感じている方は、ぜひ 一時表を検討してみてはいかがでしょうか

## 一時表の作成方法
一時表は通常のテーブルと同様に `CREATE TABLE` 文で作成しますが、`GLOBAL TEMPORARY` 句を指定します。

### 基本的な構文
```sql
CREATE GLOBAL TEMPORARY TABLE テーブル名 (
    列名 データ型,
    ...
) ON COMMIT PRESERVE ROWS;
```

### `ON COMMIT` オプション
1. **`ON COMMIT DELETE ROWS`**
   - トランザクション終了時にデータが削除されます
   - 一時的なバッチ処理やトランザクション内でのみ有効なデータに適しています

2. **`ON COMMIT PRESERVE ROWS`**
   - セッション終了時までデータを保持します
   - 複数のトランザクションにまたがるデータ処理で便利です

### 作成例
```sql
CREATE GLOBAL TEMPORARY TABLE work_table (
    id NUMBER,
    name VARCHAR2(100),
    created_at DATE
) ON COMMIT PRESERVE ROWS;
```

## 一時表の使い方
### 1. 削除は 'TRUNCATE TABLE'で行う
一時表は自分専用のテーブルなので、初期化の際に他のセッションに気を使う必要はありません。データを削除する場合は、`TRUNCATE TABLE` コマンドを使って一括でクリアしてしまいましょう。これにより、ちまちまとした削除操作よりもシンプルかつ効率的に処理を進められます

### 2. 終了時は放置
一時表は `ON COMMIT` オプションにより、コミット時またはセッション終了時にデータが自動的に破棄されます。そのため、通常のテーブルと違い明示的にデータ削除の後処理をする必要がありません。この特徴により、シンプルな運用が可能になります

### 3. 単体開発当初は普通のテーブルにする
一時表を使ったアプリケーションの処理を SQLツールで確認するとデータが見つからないことがあります。これは一時表がセッションごとにデータを分離する特性のためです。この挙動で困ることを避けるため、単体開発の初期段階では一時的に通常のテーブルを利用するとよいでしょう。これでデバッグや検証がスムーズに進められます


## 一時表 の活用しどころ

### 1. バッチ処理
バッチ処理では、一時表 を使うことで大量の一時データを効率的に扱うことができます。例えば、顧客の取引データを一時的に 一時表 に保存し、データの検証や重複チェック、さらに条件に基づいた集計処理を行う、といった運用が可能です。こうした作業を 一時表 上で実行することで、メインテーブルのデータを直接操作するリスクを回避でき、安全性が向上します

### 2. ETL 処理
ETL（Extract, Transform, Load）とは、データを取り出して（Extract）、加工・変換し（Transform）、最終的に保存する（Load）処理のことです。この一連の作業で、一時表は一時的なデータ置き場（ステージングエリア）として役立ちます。具体的には、
 - データソースから抽出した生データを 一時表 に格納
 - データを必要な形式や構造に加工・変換
 - 加工後のデータを本番用テーブルに移動

これにより、ETL 処理をシンプルかつ効率的に進められます

### 3. 一時的な集計
複雑なクエリや一時的な集計処理で中間結果を 一時表に保存することで、クエリの可読性やパフォーマンスが向上します

## 一時表のメリット
1. **競合回避**
   - セッション独立性により、他のセッションとのデータ競合が起きません
2. **メモリ効率**
   - 必要な間だけデータを保持し、不要になれば自動的にクリアされます
3. **REDOログ削減**
   - 通常のテーブルよりも REDOログの負荷が少なく、高速な挿入処理が可能です

## 一時表 のデメリットと注意点
1. **UNDOセグメントの利用**
   - 一時表の操作でも UNDO セグメントが消費されます。大量データの場合、UNDO セグメント不足に注意が必要です
2. **インデックスの管理**
   - 一時表にインデックスを作成する場合、セッションごとにインデックスが再生成されるため、パフォーマンスに影響することがあります
3. **デバッグの難しさ**
   - 一時表はセッション単位でデータが分離されるため、他のセッションから内容を確認できません

## パフォーマンス最適化のヒント
1. **TEMP表領域の容量を確認**
   - 一時表のデータは TEMP 表領域を消費するため、十分な容量を確保してください
2. **必要最小限のインデックスを使用**
   - 必要以上のインデックスは作成せず、処理後にインデックスを削除する設計も検討
3. **トランザクション管理**
   - `ON COMMIT DELETE ROWS` と `ON COMMIT PRESERVE ROWS` を適切に選択し、トランザクション終了時の挙動を明確にする

## まとめ
Oracleの一時表…使えそうでしょうか？
よければこの記事を参考にして一時表を積極的に活用してみてください
みなさんの作業効率が少しでもあがることを願います

最後まで読んできただきありがとうございました
初心者のためのVue.js入門

## Vue.jsとは何か？
Vue.jsとは、軽量かつ柔軟なJavaScriptフレームワークであり、ユーザーインターフェースやシングルページアプリケーション（SPA）の構築に特化しています。直感的なAPI、リアクティブなデータバインディング、そしてコンポーネントベースの設計が特徴で、学習コストが低く初心者にも扱いやすい一方で、大規模なアプリケーションにも対応可能です。
## なぜVue.jsを選ぶのか？
Vue.jsは、軽量で高速なフレームワークであり、初期コード時間が低く、パフォーマンスに優れています。さらに、そのシンプルで直感的なAPIと分かりやすいドキュメントにより、初心者でも短時間で習得できるため、学びやすさが魅力です。Vue.jsはリアクティブなデータとUIが同期し、変更が即時に反映されるため、ユーザー体験が向上します。また、コンポーネントベースの設計により、再利用可能なコンポーネントを使って効率的にアプリケーションを建築できます。最後に、Vue.jsは柔軟で拡張性が高く、単純なプロジェクトから複雑なシングルページアプリケーション（SPA）まで幅広い用途に対応できるため、非常に強力な選択肢です。
##  VueJSのインストール
### ステップ1: Node.jsのインストール
Vue.jsはNode.jsを必要とするため、まずNode.jsをインストールします。
1. Node.jsの公式サイト[Node.js](https://nodejs.org/en)からNode.jsをダウンロードします。
2. 使用しているOSの手順に従ってNode.jsをインストールします。
3. 以下のコマンドを使用して、インストールが成功したか確認します。
node -v
npm -v
### ステップ2: Vue CLIのインストール
Vue CLIを使用すると、Vue.jsのプロジェクトを簡単に作成して管理できます。
1. npmを使用してVue CLIをインストールします。
npm install -g @vue/cli
2. Vue CLIのインストールが成功したか確認します。
vue --version
### ステップ3: 新しいVue.jsプロジェクトの作成
1. 新しいプロジェクトを作成します。
vue create my-project
my-projectはあなたのプロジェクト名に置き換えてください。
2. Vue CLIが構成の選択を求めます。デフォルトの設定を使用するか、必要に応じてカスタマイズします。
3. プロジェクトを作成した後、次のコマンドでプロジェクトディレクトリに移動します。
cd my-project
### ステップ4: プロジェクトの実行
1. 開発サーバーを起動するには、次のコマンドを実行します。
npm run serve
2. ブラウザを開き、http://localhost:8080 にアクセスしてアプリケーションを確認します。
## Vue.jsアプリケーションの基本構造
Vue.jsアプリケーションは一般的に以下のようなディレクトリ構造を持ちます。
my-project/
├── node_modules/       # 依存パッケージが格納される
├── public/             # 静的ファイルを格納するディレクトリ
│   └── index.html      # アプリケーションのエントリーポイント
├── src/                # ソースコードを格納するディレクトリ
│   ├── assets/         # 画像やフォントなどのアセットファイル
│   ├── components/     # Vueコンポーネント
│   ├── App.vue         # ルートコンポーネント
│   └── main.js         # エントリーファイル
├── .gitignore          # Gitで無視するファイルを指定
├── babel.config.js     # Babelの設定ファイル
├── package.json        # プロジェクトの依存関係とスクリプト
└── vue.config.js       # Vue CLIの設定ファイル（必要な場合）
主なファイルとディレクトリ
- index.html: アプリケーションの基本的なHTMLテンプレート。
- main.js: アプリケーションのエントリーポイント。Vueインスタンスを作成してApp.vueをマウントします。
- App.vue: ルートコンポーネント。アプリケーションの主要なUI構造を定義します。
- components/: 再利用可能なVueコンポーネントを格納します。
- assets/: 画像やスタイルシートなどの静的リソースを格納します。
## 最後に
ここまでがVue.jsを学び始めるためのステップです。さらに詳しく学びたい場合は、[Vueチュートリアル](https://vuejs.org/guide/introduction.html)をご覧ください。次回の記事では、Vue.jsの使い方に関する例を紹介します。
Pythonで地図を描画

# 概要
活用コンテストに向けてSpresenseのGPSセンサから緯度・経度を取得し、誰でもブラウザからアクセスできるようにするために、今回はspresenseからデータを受信することを想定して、まず手始めにPythonで地図を描画することを目指し、使えるかどうかを事前に検証する。


- [必要な環境](#必要な環境)
    - Python 3.10
    - Windows 11 PC
- [環境構築](#環境構築)
- [コード](#コード)
- [コードの解説](#コードの解説)
- [実行結果](#実行結果)
- [おわりに](#おわりに)

# 環境構築
地図を描画するために必要なライブラリをインストールします。
```bash
pip install folium geopy
pip install osmium
```
- `folium`：地図描画用のPythonライブラリ
- `geopy`：位置情報を取得・変換するためのライブラリ
- `osmium`：OpenStreeMapのライブラリ


# 手順
今回作成するコードが、Google Mapに対して位置ずれを起こさないかどうかをまず検証する
今回の検証対象は、秋葉原にある千石電商とします。
1. Google Map上で位置情報を取得する千石電商を検索する 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925972/138dd3bd-07ac-3a71-31c7-44244fc5dbef.png)



2. 千石電商のアイコンを右クリックすると緯度経度が表示されるので、クリックします。
クリックすると、緯度経度がコピーされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925972/658f50bf-0ce7-25dc-37f5-4cf1a4f9a44f.png)





# コード
```python
import folium

# 現在位置を手動で設定 (千石電商 秋葉原店の位置)
current_location = {"latitude": 35.69934034045612, "longitude":139.77023335500712}

# 地図を作成
m = folium.Map(location=[current_location["latitude"], current_location["longitude"]], zoom_start=15)

# 現在位置にピンを追加
folium.Marker(
    [current_location["latitude"], current_location["longitude"]],
    popup="現在位置",
    icon=folium.Icon(color="red", icon="info-sign"),
).add_to(m)

# 地図を保存してブラウザで開く
m.save("map.html")
print("地図が map.html として保存されました。ブラウザで開いてください。")
```

# 実行結果
作成したプログラムを実行すると、map.htmlのファイルがローカルのフォルダに保存されます。
このファイルをダブルクリックするとブラウザが起動し、指定した緯度経度を表すピンが刺さっていることを確認することができます。

![スクリーンショット 2024-12-29 012221.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925972/579db4a6-a13a-c5a7-48f8-2e77ed94a48f.png)


# おわりに
今回はPythonを使って、指定した緯度経度を地図上に描画することができた。これを応用して、Spresenseで取得した位置情報をリアルタイムで描画できるようにしていきたいと思う。
SwiftUI のシート切り替えで「設定したはずの画面が出ない」問題と対処法

## よくある状況
たとえば以下のようなコードを書いたとします。

```Swift: SwiftUI
@State private var currentSheet: SheetType = .name
@State private var isShowSheet: Bool = false

enum SheetType {
    case iconImage, name
    // ... ほかの画面
}

// どこかのボタンアクション
Button("アイコン画像を編集") {
    currentSheet = .iconImage
    isShowSheet = true
}
```

ところが、実行してみると currentSheet を .iconImage に設定しているのに、なぜか .name の画面が出てしまう という現象が起きることがあります。

SwiftUI では「同じアクション内で順番どおりに書いた State の変更」が 必ずしも意図した順序で反映されるとは限らない ケースがあるためです。
特に、すでにシートが表示されている状態で別のシートに切り替える、などの状況が絡むと、競合が起きやすくなります。

## 原因: SwiftUI の State 反映タイミング
SwiftUI は「宣言的 UI」であり、View の再描画が「命令した順」に厳密に行われるわけではありません。
通常は「1つのアクション内の State 変更」がまとめて1回の再描画サイクルになり、結果として

```Swift: SwiftUI
currentSheet = .iconImage
isShowSheet = true
```
が同時に反映され、.iconImage のシートが開きます。
しかし何らかの事情でシートがまだ閉じきっていなかったり、システム的な割り込みが入ったりすると、
期待通りに「currentSheet を更新 → isShowSheet = true」という順番が適用されないことがあります。

## 解決策: .onChange(of: someValue) を使って「enum が変わったらシートを開く」
以下のように currentSheet を Optional にしておき、.onChange(of: currentSheet) で「値が入ったらシートを開く」ようにします。

```Swift: SwiftUI
@State private var currentSheet: SheetType? = nil
@State private var isShowSheet: Bool = false

enum SheetType {
    case iconImage, name, memory, ...
}

var body: some View {
    VStack {
        Button("アイコン画像") {
            currentSheet = .iconImage
        }
    }
    .onChange(of: currentSheet) { newValue in
        // currentSheet が nil でなければシートを開く
        isShowSheet = (newValue != nil)
    }
    .sheet(isPresented: $isShowSheet) {
        if currentSheet == .iconImage {
            IconImageEditView(...)
        } else if currentSheet == .name {
            NameEditView(...)
        }
        // 他のケースは else if ...
    }
}
```
WSL2によるホストのメモリ枯渇を防ぐ方法

## はじめに
開発業務でWSL2を使用し続けていると、**Vmmemプロセスのメモリ使用量が増加し続け、Windowsホストのメモリが枯渇する**という問題が発生します。

この問題は、正式リリース後も根本的に解決されておらず、多くのユーザーが影響を受けています。
本記事では、WSL2のメモリ枯渇問題の原因と、現時点での有効な暫定対処方法を紹介します！

## WSL2メモリ枯渇の原因
WSL2におけるメモリ枯渇の主な原因は、**Linuxのファイルキャッシュ機能とWSL2の動的メモリ管理**の相互作用にあります。

### 1. Linuxのファイルキャッシュ特性
Linuxでは、ファイルを読み書きすると、そのデータをメモリ上にキャッシュします。このキャッシュは、メモリが不足するまで解放されません。そのため、**大量のファイル操作を行うとメモリを圧迫する**ことになります。

### 2. WSL2の動的メモリ管理
WSL2は、仮想マシン（VM）上でLinuxを動作させる仕組みです。このVMのメモリサイズは、Linuxのメモリ使用量に応じて動的に増加します。しかし、一度増加したメモリは、**すぐには解放されません**。そのため、Linuxのファイルキャッシュが増加すると、WSL2のメモリも増え続け、結果としてWindowsホストのメモリが枯渇するという悪循環が発生します。

## WSL2のメモリ枯渇を防ぐ対処方法

### 方法1: WSL2のメモリ上限を設定する（おすすめ）
WSL2のメモリ使用量を制限することで、Windowsホストのメモリ枯渇を防ぐことができます。

#### 設定手順
1. **`%USERPROFILE%\.wslconfig`**（例: `C:\Users\YourName\.wslconfig`）を作成または編集する
2. 以下の内容を記述する

   ```ini
   [wsl2]
   memory=6GB  
   swap=6GB
   ```


3. 設定を反映するため、**WSL2を再起動**またはWindowsを再起動する

#### 設定のポイント
- `memory=6GB` の値は、PCの搭載メモリとWSL2の使用用途に応じて調整可能
- `swap=0` に設定すると、スワップを無効化できるが、メモリ不足時にクラッシュする可能性がある
- デフォルトでは、PCメモリの**50%または8GBの少ない方**がWSL2に割り当てられる（Build 20175以降）

ちなみに、私は、割り当てるmemoryを6GBぐらいにして、足りない分はswapで補っています。いろんなプロジェクトの開発を同時に進めるには、これぐらいちょうどよいと思います。swapが使われると、動作がちょっぴり重たくなりますが、クラッシュするよりはましですね！

### 方法2: キャッシュを手動で削除する
ちなみにメモリサイズを固定しない場合は、定期的にキャッシュを削除することで、メモリ枯渇を抑えることができます。
ただ私は面倒くさいのであまりやりません。そのため、cron化して実行するのがよいかと思います。WSLではcronの実行はデフォルトでできないので、今度紹介するとして、以下コマンドの紹介。

#### キャッシュ削除コマンド
```sh
sudo sh -c "echo 3 > /proc/sys/vm/drop_caches && swapoff -a && swapon -a"
```

#### 注意点
- このコマンドを定期的に実行する必要がある
- `systemd` や `cron` が動作しないWSL2では、自動化には工夫が必要


### 方法3: WSL2を再起動する
WSL2を再起動すると、仮想マシンが再起動され、ファイルキャッシュなどがクリアされます。これが一番楽ですね。

#### WSL2の再起動手順
```sh
wsl --shutdown
wsl
```

## 本問題が発生しやすいケース
以下のようなケースでは、メモリ枯渇問題が特に発生しやすいです。

- **Visual Studio Code + Remote WSLを使用**
- **Docker Desktop（WSL2バックエンド）を利用**
- **大規模なコードベースの開発**
- **機械学習やデータ解析などメモリを大量に消費する作業**

特に、これらを**組み合わせて使用している環境ではメモリ枯渇のリスクが高まる**ため、適切な対策を講じる必要があります。

いろんなプロジェクトに携わるとみるみるうちにメモリの枯渇のリスクが高まりますので、ぜひ参考にしてみてください。


## まとめ
WSL2のメモリ枯渇問題は、Linuxのファイルキャッシュ管理とWSL2の動的メモリ割り当ての組み合わせによって発生します。

現時点での最も効果的な対策は、**`%USERPROFILE%\.wslconfig` を設定し、WSL2のメモリ使用量を制限すること**です。また、キャッシュを手動で削除したり、WSL2を定期的に再起動することも一時的な対処として有効です。

今後、WSL2のアップデートにより、より良いメモリ管理機能が提供される可能性はありますが、とりあえずのところそういう管理機能はないので、ぜひ参考にしてください。


## 参考資料
- [Microsoft公式 WSLのメモリ管理](https://learn.microsoft.com/en-us/windows/wsl/wsl-config)
- [GitHub - WSL Issues](https://github.com/microsoft/WSL/issues)
プリザンターでパラメータリロードを簡単に実現する方法

## はじめに
Parameters配下のJSONファイル群を変更した時に、値を適用するためにプリザンターを再起動させるのが面倒・・・って思ったことはありませんか？実は再起動せずにパラメータを再読み出し出せる方法があります。

## どうやるの？
実はマニュアルに記載があります。[FAQ：プリザンターを再起動せずにParametersフォルダ配下の情報を再読み込みしたい](https://pleasanter.org/ja/manual/faq-reload-extensions)がまさにそれです。FAQなので、それがしたいと思って探さないと出てこない項目なので、知ってる！って方は案外少ないと思います。注意事項もあるので、マニュアルをよく参照してください。

## 使ってみると？
成功すると真っ白な画面に遷移します。遷移後はHistroyBackなりで通常のページに戻ってくる必要があります。しかもURL自体、どこにもリンクがない＆微妙に長いので、いちいち入力する必要があって地味に面倒。
この機能を使いたいのは主に開発環境だと思いますが、何か設定変更する度にURL打ち込んで、終わったらHistoryBackを繰り返すことになるので、ちょっと楽にしてみます。

## 拡張ナビゲーションメニューに追加する
楽にする方法といえば拡張ナビゲーションメニューに入れてしまうのが鉄板ですね。こんな感じで定義ファイルを作成します。特権ユーザでないと実行出来ないので、特権ユーザ(UserID:1)に表示を限定しています。

```json:PrivilegedSettingsMenu.json
{
	"TargetId": "SettingsMenu",
	"Action": "Append",
	"NavigationMenus": [
		{
			"ContainerId": "PrivilegedSettingsContainer",
			"MenuId": "PrivilegedSettingsMenu",
			"Name": "特権管理",
			"Icon": "ui-icon ui-icon-gear",
			"ChildMenus": [
				{
					"MenuId": "PrivilegedSettings_ReloadParameters",
					"Name": "パラメータリロード",
					"Icon": "ui-icon ui-icon-arrowrefresh-1-w",
					"Url": "javascript:$p.naviMenuExtendParameterReload();",
					"UserIdList": [
						1
					]
				}
			]
		}
	]
}
```

実処理はやや長めなので、拡張スクリプトに切り出してしまいます。
```js:ParameterReload.js
$p.naviMenuExtendParameterReload = function() {
	$.ajax({
		type: "get",
		url: "/admins/reloadparameters",
	}).done(function() {
		if (window.confirm('パラメータを再ロードしました。画面リロードを行いますか？ ')) {
			location.reload();
		}
	}).fail(function(jqXHR, textStatus, errorThrown) {
		window.alert(`パラメータの再ロードに失敗しました。ステータス:${jqXHR.status}`);
	});
}
```
これらの2ファイルを拡張ナビゲーションメニュー・拡張スクリプトの所定のディレクトリに格納して、プリザンターのプロセスを再起動させると、ナビゲーションメニューにパラメータでリロードメニューが追加されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3555395/73cee6e6-7e54-d52a-187e-8884298d24e2.png)

クリックすると再読み込みを行うかどうかの確認が表示されるので、OKをクリックする実行されます。

## まとめ
パラメータの再読み出しを簡単にする方法を紹介しました。プリザンターのマニュアルのFAQカテゴリには、こんな使い方があるの？というトピックがいろいろとあるので、一度はのぞいてみてください。
Claude for Desktop で MCP を使おうとした際のエラーに関する対処メモ（npxコマンドまわり）

以下の記事に書いた「Claude for Desktop で MCP を使う」という話の関連です。

●今になって Claude for Desktop で MCP に入門してみた（Claude は Free plan） - Qiita
　https://qiita.com/youtoy/items/3ef0af28b530f5c5709c

上記の記事を書いた時は、「Windowsマシン」「MacBook Pro（Intel版）」でのセットアップを行い、簡単なお試しを行っていました。

今回は、さらに以下の M4 Mac mini で同じことをやろうとして、そこで遭遇したエラー関連の対処メモです。

https://x.com/youtoy/status/1855590537589362996

## エラーとその対処

### エラーの内容
上で書いたように、既にセットアップ・お試しを行っていた「MacBook Pro（Intel版）」でセットアップ手順と同じようにして、「M4 Mac mini」へもセットアップを行おうとしました。

それで、以下のエラーが出ました。

![471632453_1270446580858859_4078474324675357780_n.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/415eab7b-8c33-9fee-b4d6-685d9beebc7d.png)

#### エラーの内容で検索する
とりあえず、エラーの内容そのままに検索をしてみると以下の記事が出てきました。

●【Could not connect to MCP server】ClaudeのMCPサーバ接続エラーを解決する
　https://zenn.dev/sun_asterisk/articles/58647adfba4609

その中で書かれている、ログの確認をやってみました。

![2025-01-11_12-58-37.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/b1ac8da4-81ef-735e-82ba-8e53f51059a8.jpeg)

コマンドを使った手順のほうだと、以下になります。

```zsh
tail -n 20 -f ~/Library/Logs/Claude/mcp*.log
```

### エラーログの内容
そうすると npx コマンドまわりのエラーが出ているという内容でした。

ターミナルではパスが通っていてコマンドが使える状態なのに、Claude for Desktop での npxコマンドの実行で問題が起こっているような感じです。

### エラーの解決法
エラーの解決方法は、以下の記事に書いた n の設定変更でした。

●n で Node.js のバージョン管理を行う際のセットアップ時のメモ（自分の Mac の環境での話） - Qiita
　https://qiita.com/youtoy/items/6048a87f84b7237ae084

npx のパスが「MacBook Pro（Intel版）」と同じになるようにしました。
（当初は上記の記事の 2つ目のやり方をしていたのを、1つ目の設定方法に変更しました）


#### 2つの Mac でのコマンドのパス
node・npmコマンドを含めた npxコマンドのパスという話について、2つのマシンでの設定は最終的には以下となりました。、

▼ MacBook Pro（Intel版）
![2025-01-11_13-05-18.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/01143001-8341-4ed4-59ef-740274f7e8ce.jpeg)

▼ M4 Mac mini
![2025-01-11_21-50-53.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/da7f089b-0a55-5842-7fe7-fcc530ae5d6d.jpeg)

node・npm・npx のパスは同じになりました。

### うまくいかなかった方法
問題を解消しようとして、上記の Zenn の記事と同じようなことも試しました。
試した内容は、コンフィグに以下のように「npx」のフルパスを指定するという内容です。

```json
{
  "mcpServers": {
    "filesystem": {
      "command": "【npx のフルパス】",
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "/Users/【Macでのユーザー名】/Downloads/mcp"
      ]
    }
  }
}

```

上記の対応でエラーの一部は解消したのですが、なぜかサーバー接続に関するエラーを解消できませんでした。

### エラーの発生原因を探った時の情報
今回のエラー発生とその背景について、既にセットアップ・お試しを行っていた「MacBook Pro（Intel版）」でやったことを、「M4 Mac mini」で行った時にエラーが発生したと書きました。またそれが npxコマンド周りの話のようでした。

そのため、2つのデバイス間で npxコマンド周りの違いを確認することからやってみていました。

調べてみた結果、以下の記事でも書いた Node.js のバージョン管理に使っている「n」の設定の違いが、エラー発生の有無に影響していると思われました。

●n で Node.js のバージョン管理を行う際のセットアップ時のメモ（自分の Mac の環境での話） - Qiita
　https://qiita.com/youtoy/items/6048a87f84b7237ae084

上記の記事の中で、「/usr/local への書き込み権限関連の話」の対応というのを書いていますが、この対応の部分に関して「MacBook Pro（Intel版）」と「M4 Mac mini」で差異があったためです。

さらに、上記の差異は node・npmコマンドを含めた npxコマンドのパスに影響を及ぼしていました。

それで、上でうまくいかなかった事例として書いた、最初に試した「コンフィグでのフルパスの指定」という対処をとっていました。
OPTIONSメソッドを無効化する

OPTIONSメソッドが有効になっていることで、そのサーバーで使用可能なメソッドを確認後、メソッドを利用した攻撃を受ける可能性が高くなります。
OPTIONメソッドを利用しないのであれば無効にしておきましょう。

## <font color=green">[利用した環境]</font>
- Windows Server 2016
- Internet Information Service

## <font color=green">OPTIONSメソッドを無効化する</font>
1. Internet Information Serviceを起動します
1. 「サーバー」→「構成エディター」をダブルクリックします
![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3896206/f4d1a06c-e8c8-1ea9-b6c5-27fb7c81fa61.png)
1. 「構成エディター」画面の「セクション」プルダウンから「system.webServer/security/requestFiltering」を選択します
 ![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3896206/486418b3-b3f9-85d3-23a6-618158643cb4.png)
1. 「verbs」を選択し「コレクション エディター」画面を表示させます
![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3896206/6c5326a5-8313-20ab-2670-27d8ff925e05.png)
1. 「追加」をクリックし、verbsに「OPTIONS」、allowedに「True」を設定し「コレクション エディター」画面を閉じます
![006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3896206/2aa3d7b8-0dac-016d-1b17-e45181f275cc.png)
1. 「適用」をクリックします
![007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3896206/50fb3f6a-2d08-4028-23ef-0e3c4dfb7e36.png)
Cloudbuildを使ってCloud runにデプロイする


まず
```
gcloud init

gcloud services enable artifactregistry.googleapis.com cloudbuild.googleapis.com run.googleapis.com

gcloud artifacts repositories create my-repo \
  --repository-format=docker \
  --location=asia-northeast1  \
  --description="Docker repository for Cloud Run"
```

次にPHPファイルとDocekerfileとcloudbuild.yamlを用意

```index.php
<?php
echo "Hello, Artifact Registry and Cloud Run!";
```

```Dockerfile.yaml
FROM php:8.2-apache

# Set the working directory inside the container
WORKDIR /var/www/html

# Copy application files to the container
COPY . /var/www/html

# Expose port 8080
EXPOSE 8080

# Update the Apache configuration to listen on port 8080
RUN sed -i 's/80/8080/' /etc/apache2/ports.conf \
    && sed -i 's/:80/:8080/' /etc/apache2/sites-available/000-default.conf

# Install additional PHP extensions if needed
RUN docker-php-ext-install pdo pdo_mysql

# Enable Apache mod_rewrite if needed
RUN a2enmod rewrite

# Restart Apache
CMD ["apache2-foreground"]

```

```cloudbuild.yaml
steps:
  # Dockerイメージをビルド
  - name: 'gcr.io/cloud-builders/docker'
    args: [
      'build', '-t',
      'asia-northeast1-docker.pkg.dev/$PROJECT_ID/my-repo/php-cloud-run-example',
      '.'
    ]

  # DockerイメージをArtifact Registryにプッシュ
  - name: 'gcr.io/cloud-builders/docker'
    args: [
      'push',
      'asia-northeast1-docker.pkg.dev/$PROJECT_ID/my-repo/php-cloud-run-example'
    ]

  # Cloud Runにデプロイ
  - name: 'gcr.io/cloud-builders/gcloud'
    args: [
      'run', 'deploy', 'php-cloud-run-example',
      '--image',
      'asia-northeast1-docker.pkg.dev/$PROJECT_ID/my-repo/php-cloud-run-example',
      '--region', 'asia-northeast1',
      '--platform', 'managed',
      '--allow-unauthenticated'
    ]

images:
  - 'asia-northeast1-docker.pkg.dev/$PROJECT_ID/my-repo/php-cloud-run-example'
```

あとは
gcloud config set project プロジェクト名

```
gcloud builds submit --config cloudbuild.yaml .
```
これでbuild実行！！