OmniAICreator/Qiita-1.07M huggingface dataset:
Rails8×Importmapでaxiosを使うときの対応方法

## はじめに
Rails8×デフォルトのImportmapでaxiosを使う際にハマったので解決策をのこしておきます

## やりたいこと

- ImportmapでAxiosを使いたい

### やったこと

- CLI上で、` ./bin/importmap pin axios`を実行
- 以下のように`config/importmap.rb`に記述される

```ruby
pin "axios" # @1.7.9
pin "#lib/adapters/http.js", to: "#lib--adapters--http.js.js" # @1.7.9
pin "#lib/platform/node/classes/FormData.js", to: "#lib--platform--node--classes--FormData.js.js" # @1.7.9
pin "#lib/platform/node/index.js", to: "#lib--platform--node--index.js.js" # @1.7.9
```

## デバッグ過程

### エラー1：モジュールの解決ができない

```bash
Uncaught TypeError: Failed to resolve module specifier "#lib/platform/node/classes/FormData.js"
```

- 原因
    - Node.js用のモジュールを読み込もうとしていたため
- 解決策
    - CDNを直接読み込むように修正

```ruby
pin "axios", to: "https://cdn.jsdelivr.net/npm/axios@1.7.9/dist/axios.min.js"
# 上記のみ記載する
```

### エラー2: 構文エラー

```bash
Uncaught SyntaxError: The requested module 'axios' does not provide an export named 'default'
```

- 原因
    - importの書き方の誤り
    - CDNで使う場合のimport文の形式になっていなかった
- 解決策
    - CDN版は自動的にグローバルオブジェクトになるらしい

```jsx
// 変更前
import axios from 'axios'

// 変更後
import 'axios'
```

### エラー3: getが未定義として認識される

```bash
Cannot read properties of undefined (reading 'get')
```

- 原因
    - window.axios として明示的にグローバル化しようとしていた部分が不要
- 解決策

```jsx
// 変更前
window.axios = AxiosModule.default

// 変更後
// window.axiosの設定は不要
// 直接axiosとして使用可能
```

## 理解できたこと

- ImportmapはWebpackのようにバンドルしないので、Rails6以前と比較して記述方法が異なる
- Webpackの場合はNode.jsモジュールをブラウザ互換のコードに変換（トランスパイル）して使用する
    - なので`yarn add hogehoge`でモジュールをインストールする必要がある
- Importmapはブラウザのみで動かしているため、Railsプロジェクト内のファイルシステムにアクセスできない
    - そのためCDNで依存先を指定する必要がある

## おわりに
そもそもNode.jsやCDNについて基本的な理解が足りていない感覚がすごいので、勉強します。

## 参考

https://zenn.dev/takeyuwebinc/articles/996adfac0d58fb
とにかく全部まとめてDockerに何かを削除させたい

Docker コマンドには **使用していないリソースをまとめて消去する** 用途として prune オプションがありますが、使用しているしていないに関わらずとにかくまとめて全消去、というオプションは用意されていません。

まとめてスクラップアンドビルドしたい場面に遭遇した、そんな貴方へ。

:::note alert
本当に警告なしに全部消えますので、ご利用は計画的に。
:::


### とにかく全部まとめて volume を消したい

```sh
docker volume rm `docker volume ls --format "{{.Name}}"`
```

### とにかく全部まとめて image を消したい

```sh
docker image rm `docker image ls --format "{{.ID}}"`
```

### 解説

`volume ls` や `image ls` など ls 系コマンドのオプションに `--format` があります。
formatオプションにわたす値は Goテンプレート となっており、Goの文法に沿った柔軟な表現が可能です。
今回は削除したいボリュームやイメージの識別子が欲しかったため、識別子だけを表示するフォーマットを指定し、バッククォートでコマンド展開することで `rm` コマンドの引数としています。
input type="color" で HEXコードをデフォルトにしたい

ブラウザ標準でカラーコードの指定ができる```<input type="color">``` ですが、デフォルトのカラー指定がRGB指定なんですよね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924179/10fd21ce-a7d9-4d0e-a0a4-8b9529dfa7f3.png)


Value値の指定はHEXなのになんでデフォルトがRGBなんだろう…。というのは置いておいて、HEXコードでの指定の方がユースケースとしては多いので、これをデフォルトでHEXにしたい！と思ったのですが、色々調べたものの、color属性には入力モード設定がオプションに存在しないようでした。

## 別のinputフィールドを用意して同期することで対応

与件的にはクリック数を減らしてHEXでの入力ができればよい、ということでしたので、別のinputフィールドを用意して、そのValue値をcolorの方と同期することで対応しました。


<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="raNewEP" data-pen-title="HEX  input color" data-user="Albedo-Japan" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/Albedo-Japan/pen/raNewEP">
  HEX  input color</a> by Albedo Japan (<a href="https://codepen.io/Albedo-Japan">@Albedo-Japan</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://public.codepenassets.com/embed/index.js"></script>

:::note info
```<input type="color">```では3桁HEXが上手く効かない模様なので、3桁だった場合自動的に補完するようにしています。
:::

これでCMSでの色指定も素早く運用できそうです！
asdf(0.16.0) で global と local コマンドが廃止された件

## asdf global

**Before**

```sh
asdf global nodejs 23.5.0
```

**After**

```sh
asdf set --home nodejs 23.5.0
```

## asdf local

**Before**

```sh
asdf local nodejs 23.5.0
```

**After**

```sh
asdf set nodejs 23.5.0
```

## 参考

see: https://asdf-vm.com/guide/upgrading-to-v0-16.html#asdf-global-and-asdf-local-commands-have-been-replaced-with-asdf-set
Excel方眼紙でのプロジェクト管理を撲滅！いま注目のプロジェクト管理とは

## はじめに
過去に在籍した会社組織では、プロジェクト管理ツールを買ってもらえませんでした。そしてはじめて知ったのです！それがExcel方眼紙によるガントチャート作成！よもやよもやです。Excelもこのような使い方をされるとは思っていなかったと思います。

Excel方眼紙は駆逐しなければなりません。[Excel方眼紙撲滅委員会](https://www.slideshare.net/slideshow/excel-201209-yapcasia-ltthon/14498251)という団体も存在するほどです。その後活動がされていないのでExcel方眼紙という巨人に◯されてしまったのでしょうか。

Excel方眼紙によるプロジェクト管理の経験から、最高のプロジェクト管理ツール（価格が安いが条件）を探した結果、見つけましたのでご紹介します。

プロジェクト管理ツール[『ONES Project』](https://systemcon.co.jp/products/onesproject/)という製品です。30名まで無料で使えて、ストレージ無制限、監査ログも一年間保存できる。無料版ながらビジネス組織として十分に使える優れものです。

ONES Projectは、無料版では本格的なアジャイル手法に対応しつつ、有料版にするとウォーターフォール手法やDevOps、工数管理にも対応できる嬉しいプロジェクト管理ツールです。

「プロジェクト管理を、もっとシンプルに、もっと効率的に」。 ONES Projectを活用することで、業務の可視化や情報共有が可能となり、チームの生産性向上につながります。 ここでは、ONES Projectの特徴やメリットについて紹介します。

## ONES Projectとは？
ONES Projectは、アジャイル、ウォーターフォール、などのハイブリッド手法に対応したオールインワンのプロジェクト管理ツールです。プロジェクトの全工程を一つのプラットフォームで管理でき、タスク管理、進捗確認、リアルタイムのダッシュボード機能を備えています。
直感的なインターフェースで操作しやすく、開発現場はもちろん、あらゆる業種・職種で活用できます。

![ONES Project概要画面イメージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3483972/0298cf6a-a78a-4345-b5b3-7578e579a338.png)

## 従来のプロジェクト管理の課題
多くの企業では、Excelやスプレッドシートを用いたプロジェクト管理が一般的です。しかし、以下のような課題が発生しやすくなります。
- **リアルタイム更新が困難**：最新の情報を全員で共有しづらい
- **視覚的な管理ができない**：進捗の全体像が把握しにくい
- **通知機能がない**：期限や重要なタスクを見逃しやすい

こうした課題を解決するには、専用のプロジェクト管理ツールの導入が有効です。

## ONES Projectを使うメリット
ONES Projectを活用すると、次のようなメリットがあります。

#### 1.リアルタイムな情報共有
プロジェクトの進捗や最新情報をチーム全体で即座に共有でき、スムーズなコラボレーションを実現します。

#### 2.タスク・プロジェクト管理の効率化
ONES Projectでは、プロジェクトを「プロジェクト単位」で管理し、その中で課題（チケット）を作成してタスクを整理できます。

- **チケット**：スプレッドシートの1行をタスクとして管理し、進捗を可視化
- **プロジェクト単位での管理**：部門・チームごとに設定可能

#### 3. 通知機能で期限管理も安心
締切や重要な更新を通知で知らせるため、作業の遅延を防ぎます。

![PNES Project通知機能.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3483972/bf3fcae1-829d-4a9f-9cc0-bc23cb76e5bd.png)

ONES Projectのプロジェクトは、部門やチーム、実際のプロジェクトといった作業単位とイメージするとよいでしょう。

チケットには全てのアクティビティが履歴として残るので追跡が可能で、全ての情報をリアルタイムで共有できます。

## ONES Projectの主な機能
#### 1.ガントチャート
プロジェクト全体の進捗を一目で把握でき、スケジュール管理を効率化することができます。
- タスク間の依存関係を設定可能
- 変更にも柔軟に対応

![ガントチャート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3483972/c7ae5142-8404-4fc9-8d38-d48c320dca50.png)

#### 2. 工数管理
作業時間を正確に記録し、リソース配分の最適化や生産性向上に役立てることができます。
- 誰がどの作業にどれだけの時間を使ったかを可視化
- 見積もり精度を向上し、計画立案をスムーズに行うことができます。

![工数管理.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3483972/f6ec0adb-dfc2-4180-b9de-d4eacc24ff4c.png)

#### 3. かんばんボード
タスクを視覚的に管理できるボード機能で、進捗を直感的に把握できます。
- 課題（チケット）をカード型で管理。クリックすると詳細を表示することができます。
- ドラッグ＆ドロップでステータス変更可能
- 作業の流れをリアルタイムで共有

![かんばんボード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3483972/267e00c7-94da-4a6e-8795-326aab39a6ae.png)

#### 4. ダッシュボード
プロジェクトの全体像をリアルタイムで可視化し、スムーズな意思決定をサポートします。
- 進捗状況、優先タスク、リソース状況などを一目で確認することができます。
- カスタマイズ可能なビューで柔軟に対応

![ダッシュボード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3483972/a713a0f1-b1e2-496f-acdc-4c03d0f77e0d.png)

## まとめ
ONES Projectは、タスク管理の視覚化、リアルタイムな共有、柔軟なカスタマイズ性を備えた、プロジェクト管理を効率化し、チームの生産性向上を実現する、オールインワンツールです。
プロジェクト管理をより簡単に、より効果的にするために、ONES Projectを利用してみてはいかがでしょうか。

今回はONES Projectの概要について紹介しました。今後、いろいろな機能や使い方について紹介していけたらと思います。
「～ベースのIAMポリシー」の「ベース」って何？

AWSのIAMポリシーについて、「～ベースのポリシー」といったりしますが、何があってその中ではどういう記載が必要なんだっけ？と迷うことがあったので、基本中の基本を考え直してみました。


## アイデンティティベースのポリシー
```
{
 "Version": "2012-10-17",
 "Statement": {
   "Sid": "1",
   "Effect": "Allow",
   "Action": "s3:ListBucket",
   "Resource": "arn:aws:s3:::example_bucket"
 }
}
```

## リソースベースのポリシー
```
{
 "Version": "2012-10-17",
 "Statement": {
   "Sid": "1",
   "Effect": "Allow",
   "Principal": {"AWS": ["arn:aws:iam::account-id:root"]},
   "Action": "s3:*",
 }
}
```

アイデンティティベースにはPrincipalがなくてResourceがある、リソースベースにはPrincipalがありResourceがないという違いがあります。

### Principal
「Principal」は日本語で「主な」「主要な」といった意味があります。IAMポリシーにおいて、Principalはアクションを実行する主体を指します。

<INS>アイデンティティベースのポリシーはIAMユーザーやIAMロールにアタッチされるため、ポリシー自体には主体＝PrincipalであるIAMユーザーやロールの記載が不要</INS>なのです。

逆に<INS>リソースベースのポリシーは、リソース側の視点から、この主体＝Principalにアクションできるようにしてほしい/ほしくないという指示を出すため、Principalの記載が必要</INS>となります。

### Resource
Resourceについても同様の考え方ができます。

<INS>アイデンティティベースのポリシーは、IAMユーザーやロールの視点から、このリソースに対してアクションできるようにしてほしい/ほしくないという指示を出すため、Resourceの記載が必要</INS>です。

<INS>逆にリソースベースのポリシーは、S3バケットなどのリソースにアタッチされるため、ポリシー自体にはResourceの記載が不要</INS>なのです。
ただ、明示的に対象リソースを指定することもよくあります。

## まとめ
「～ベース」というのは、アタッチする対象を指しており、ポリシーのアクションが誰の立場から行われるものなのかを表現したものなんですね。
改めて整理できました。
未経験者含む高校生で校内のWebアプリを作ろうとしたら失敗した話。

## 概要
学校の探究の時間というグループ探究の時間がありまして、そこで、プログラミング経験者一人と未経験者五人で校内の学習Webアプリを作ろうとしたら失敗した話です。自分の記録として残しておきます。

## 作ったもの
自分の高校のニーズを満たす学習アプリです。某StudyP◯usみたいなやつをWebアプリとして作りたかった。校内での運用を想定したので、実際のサイトは載せられませんが、画像だけ載せておきます。

![IMG_0152.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953266/ee0f4d8d-0646-41da-af25-30de8fa5c869.jpeg)

### 機能
#### 実装できた機能
・会員登録機能
・授業予定（閲覧、投稿、検索）機能
・進捗管理機能

#### 実装予定だった機能
・進捗共有機能
・ランキング機能

## 開発について
### 開発環境
PythonのDjangoを使ってWebアプリとして開発しました。
UIはBootstrap5を使っています。DBはDjango標準のSqlite3です（本当はMySQLを使う予定だった）。
実際の運用では、金銭的な関係で普通のレンタルサーバーにデプロイする予定でした。

学校のipadではVSCode CodeSpacesを使い、家のPCの開発環境と同期させていました。

### チームメンバー
プログラミング経験者一名（自分、Djangoは少し使ったことあり）、未経験者五名。
未経験者はスクラッチを授業で触ったことがあるぐらいで、コードを書いた経験は皆無でした。

### 開発の経緯
#### 1.教育系の課題探究からシステム作りへ
僕の学校では、課題探究という時間がありまして、一年生はグループになって一年間それぞれの課題を研究します。元々僕は情報リテラシーに関するアプリを開発したかったのですが、グループ分けで教育系のことを研究するグループになってしまいました。
最初は授業方法を自分たちで考えよう！ということを研究していたのですが、うまく方法が思い浮かばず、困っていました。そこで、じゃあ、某アプリのような学習アプリを、校内にあった形で作ればいいのでは？というアイデアが出たことで、本格的にアプリ開発をしようということになったのです。

#### 2.でもどうやって？
アプリ開発、といってもプログラミングができるのは僕だけで、他の五人は全くの未経験なわけです。最初のうちは、機能などを他の五人で考えてもらい、自分だけでシステムを作り始めていました。
しかし、自分は部活などで一日30分程度しか開発時間が取れません。そうなると、開発は遅々として進みませんでした。
そんなとき、学校でフィールドワークに行くという時間があり、地元のシステム会社に伺いました。そこで、チーム開発についての方法をアドバイスしていただき、未経験者も考えるだけをやめようということになりました。

#### 3.フィールドワーク後
フィールドワークに行った後、次のような役割を決めました。
・開発担当二名（自分ともう一人）
・構想担当一名
・UI担当一名
・テスト担当二名
自分がもう一人にHTMLやCSSを教えることで、開発がスムーズに進むと考えました。また、テストまで含めて一人で行っていたので、テスターがいることで、多少の負担軽減になると思いました。

しかし、現実はそう甘くありませんでした。

まず、開発担当について。比較的HTMLやCSSは習得しやすいと思いましたが、時間がないのも相まって、開発に反映することはできませんでした。
テスト担当については、後述する開発端末の関係でかなり連携が難しかったです。
機能やUIについてはそもそも彼らが活躍するまで開発が進みませんでした。

#### 4.開発の失敗
結果的に、期限までに実装予定の機能を実装することができず、開発は失敗と言える状態になりました。また、校内でのテストも先生方の理解を得られず、行うことができませんでした。

### 課題と原因
1.見通しが甘かった
期間に対して、開発する機能の工数の見積もりが甘かったです。経験者が僕だけというのもあり、その経験者もチーム開発はやったことがなかったので、結果的に失敗してしまいました。


2.時間がなさすぎた
探究の時間というのは、通常月に4時間あるのですが、半分は他の授業に変わり、残りの半分以上がフィールドワークや発表の準備に使われてしまい、本来の研究時間はほとんどありませんでした。なので、家での作業時間も取れない自分は、開発を進めることが難しくなりました。


3.環境がない
学校の端末はipadなので、ブラウザベースのエディタしか使えません。テスト環境をローカルで作れないので、家で作ったものを、レンタルサーバーに構築したテスト用サイトにデプロイしてからテストしてもらっていました。GithubActionsでデプロイは自動化したものの、かなり面倒な環境であったなと思います。
また、個人のPCを持っていないことが多く、開発をすることすら難しい状況だったなと今は思います。


4.先生方の理解が得られなかった
校内でテスト運用する時に、先生方に仮のデータ(メールアドレスなど)で運用する説明をしたのですが、情報が流失したらどうするんだと言われ、断られました。Djangoの素の状態のセキュリティでも安心だとは思ったのですが、本当の個人情報は全く入力しないことを詳しく説明しても、アクセス履歴から何か分かるのではないかと言われ、テスト運用を断念しました。


5.チームでうまく行かなかった
二週間に一度しか情報共有せず、授業以外でやっているのは自分だけだったので、進捗などが何もわからず、全員が次に何をすべきかわかっていませんでした。その辺りを疎かにしてしまったのがいけなかったと思います。また、要件定義や機能図の作成などを最初にしっかりやっておかなかったのもまずかったです。

## まとめ
失敗した原因はやはり、見通しが甘かったことにあるかなと思います。実際に運用できるような機能が作れなかったことも一因です。チーム開発の難しさと、自分の能力のなさを痛感しました。良い経験になったとは思いますが、開発が失敗したのは残念でした。また、開発が仮にうまく行っても使ってもらえるアプリとなったかは疑問に思います。
CH340Kのシリアル変換自作

## 格安シリアル変換を作ろう!!!
秋月で売ってるやつを自作すると100円ほど安くなる気がしたので、作ります。
そこまで格安ではない。
変換ICはWCHのCH340Kを使います。
https://akizukidenshi.com/catalog/g/g116306/
環境はwin11、arduino IDE2.3.4、arduino UNO R4です。
## 設計
秋月に売っているものをまるパクリするので設計もクソもありません。
書いてあるものを参照して、適当に作ります。(適当なのでヒューズは搭載しません(ダメ))
https://akizukidenshi.com/catalog/g/g114745/

:::note warn
上記のモジュールのICと今回使うICは別物なので、細かい機能が異なります。
https://akizukidenshi.com/goodsaffix/ch340.pdf に詳細が書いてあります。
:::

## 部品
<d1>
<dt>IC</dt>
CH340E
<dt>コンデンサ</dt>
10μF,0.1μF
<dt>抵抗</dt>
5.1kΩ,4.7kΩ,470Ω
<dt>その他</dt>
typeCレセプタクル、LED
<dt>基板</dt>
ユニバーサル基板(18*24)、sop変換基板

ユニバーサル基板はアマゾンで、それ以外は秋月で購入します。

合計価格は425.3円でした。
秋月で同型のICを使ったしいえる変換モジュールは550円なので、124.7円安くなりました。


## 制作
まずは秋月の↓を参考にして実装します。
https://akizukidenshi.com/goodsaffix/AE-CH340E-TYPEC.pdf
![スクリーンショット 2025-02-21 161620.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3922522/b193577c-f4b6-4654-a0a7-a8e59b898e55.png)

↓　制作したもの
![PXL_20250219_040111165.MP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3922522/05842944-306a-4d58-b29b-5c8b18929670.jpeg)



プログラムは caa45040 さんの記事を参考にします。
https://qiita.com/caa45040/items/8a7fcf4b4755763b49d8
元記事はwin10でしたが、win11でも動作しました。

## 検証
書き込みができたら実際に通信を行ってみます。
制作したモジュールのRXをTX、TXをRXに接続します。
そしてUSBでArduinoとモジュールをPCに接続します


```ruby:シリアル通信
void setup(){
  
  Serial.begin(9600);  // シリアル通信(USB側)の開始(ボーレート9600bps)
  Serial1.begin(9600); // シリアル通信(UART側)の開始(ボーレート9600bps)
  pinMode(13, OUTPUT);
  
}

void loop(){

  while(Serial1.available() > 0){   // シリアル受信(UART側)の検知
    int val = Serial1.read();       // データを読み取る
    Serial1.write(val);             // シリアル送信(UART側)
    Serial.write(val);              // シリアル送信(USB側)
    if(val == '1'){                 // "1"ならLEDを点灯,"0"ならLEDを消灯
      digitalWrite(13, HIGH);
    } else if(val == '0'){
      digitalWrite(13, LOW);
    }
  }

  while(Serial.available() > 0){    // シリアル受信(UART側)の検知
    int val = Serial.read();        // データを読み取る
    Serial1.write(val);             // シリアル送信(UART側)
    Serial.write(val);              // シリアル送信(USB側)
    if(val == '1'){                 // "1"ならLEDを点灯,"0"ならLEDを消灯
      digitalWrite(13, HIGH);
    } else if(val == '0'){
      digitalWrite(13, LOW);
    }
  }
}
```
:::note warn
UNO R4(RA4M1)と、Leonardo(ATmega 32u4)はUARTシリアルとUSBシリアルが別であるため上のプログラムで使えますが、UNO R3(ATmega 328p)はUARTをUSBにシリアル変換して使っているため、上のプログラムでは使えません。別途プログラムをネットから拾ってください。
:::

使用するボードに応じて"13"を変更してください。

arduino IDEを2タブ開いて、のCOMポートのシリアルモニタを開きます。片方にシリアルを送信すると、両方にシリアルが帰ってきます。
1を送信すると、LED(GPIO13)が点灯し、0を送信すると消灯します。

余談ですが、Serial.writeでは文字列がそのまま送信され、Serial.printではASCIIなどで送信されるようです。

上手く動かなかったら気軽にコメントください(解決できるとは言っていない)
お読みいただきありがとうございました。

#### 私用メモ
| ピンアサイン |
|:-:|
|  DTR |
|  RX |
|  TX |
|  Vcc |
|  RESET |
|  GND |

※type-Cを左にしたとき
※RESETはarduinoに書き込む際に使う
個人的備忘録：EchoのMiddleware + TerraformでCORS設定を自動化するベストプラクティス

## はじめに
Webアプリケーションを開発する際、CORS（Cross-Origin Resource Sharing）の設定は重要なポイントの一つです。

本記事では、Go言語のWebフレームワークであるEchoのMiddlewareによるCORS設定と、Terraformを用いた環境変数の設定方法について解説します。

## 書こうと思ったきっかけ
同じチームメンバーの方にバックエンド側のCORS制限をしてもらった際に、フロントエンドとの連携で問題が発生しました。

:::note info
***環境ごとに異なるCORS設定を適用する必要があり、その解決策としてEchoとTerraformを活用する方法を採用しました。***
:::

この方法を整理し、再利用可能な形で残しておくために記事としてまとめました。

## EchoのMiddleware設定
Go言語のWebフレームワークであるEchoでは、Middlewareを使用することで、リクエストのログ記録、エラーハンドリング、CORS（Cross-Origin Resource Sharing）の設定を行うことができます。

### Middlewareの設定
以下のコードは、Echoの`router.go`におけるMiddlewareの設定の一部を抜粋したものです。

```go
/*
* Middleware設定
*/
e.Use(middleware.Logger())
e.Use(middleware.Recover())
e.Use(middleware.CORSWithConfig(middleware.CORSConfig{
    AllowOrigins:     []string{os.Getenv("CORS_ALLOWED_ORIGIN")},
    AllowMethods:     []string{http.MethodGet, http.MethodPost, http.MethodPut, http.MethodDelete, http.MethodPatch, http.MethodOptions},
    AllowHeaders:     []string{echo.HeaderOrigin, echo.HeaderContentType, echo.HeaderAccept, echo.HeaderAuthorization},
    AllowCredentials: true,
}))
```

### 設定内容
1. **`middleware.Logger()`**: リクエストのログを記録する。
2. **`middleware.Recover()`**: アプリケーションがパニックを起こした場合に適切に処理する。
3. **`middleware.CORSWithConfig()`**: CORSの設定をカスタマイズして適用する。

特にCORSの設定において、`AllowOrigins` の値を環境変数 `CORS_ALLOWED_ORIGIN` から取得している点がポイントです。

***これにより、環境ごとに異なるオリジン（許可するドメイン）を設定できます。***

## TerraformのCORS設定
Terraformを用いてAWS上にデプロイする場合、環境変数の設定をTerraformの`main.tf`で行います。以下はその一部抜粋です。

```hcl
name  = "my-app-repo"
image = "xxx.dkr.ecr.ap-northeast-1.amazonaws.com/my-app-repo"
entryPoint = ["/bin/sh", "-c", "/app/migrate_app && /app/server"]

environment = [
  # MySQL 環境変数
  # CORS 設定
  {
    "name": "CORS_ALLOWED_ORIGIN",
    "value": "xxx"
  },
]
```

### 設定内容
- `CORS_ALLOWED_ORIGIN` 変数に `https://xxx` を指定。
- これにより、EchoのCORS設定でこの値を読み込み、指定のオリジンのみリクエストを許可。

### 連携のポイント
1. **環境変数の利用**
   - `main.tf` で `CORS_ALLOWED_ORIGIN` を指定し、環境変数としてコンテナ内に渡す。
   - `router.go` で `os.Getenv("CORS_ALLOWED_ORIGIN")` を参照し、CORS設定を動的に変更。

2. **デプロイ時の管理**
   - `main.tf` 側で環境変数を変更すれば、デプロイ後のアプリケーションのCORS設定も更新可能。
   - 本番環境と開発環境で異なるオリジンを設定する場合に便利。

## まとめ
- EchoのMiddlewareでログ、エラーハンドリング、CORS設定を実装。
- CORSの許可オリジンは `CORS_ALLOWED_ORIGIN` 環境変数を使用して管理。
- Terraform `main.tf` で環境変数を指定し、デプロイ時に適用。
- 環境ごとに異なるCORS設定を容易に管理可能。

この方法を採用したことで、環境ごとにCORS設定を簡単に切り替えることができ、開発・運用の負担を軽減できました。

:::note warn
**Terraformを活用することで、設定の管理がしやすくなり、チーム全体での運用もスムーズになりました。**
:::

今後もこの方法を発展させ、より柔軟な構成を考えていきたいです。
「Googleスプレッドシート × Gemini AI」でもう手作業はいらない！業務効率化の最強テクニック

# はじめに

こんにちは！
サッカー選手から転身してSEをしている[@よしき](https://x.com/YoshikiSasajima/)です！

今回は、**Googleスプレッドシート（スプシ）とGemini AIを組み合わせてデータ解析と出力を自動化する方法**についてご紹介します！

業務で「大量のデータ処理が大変すぎる……」「手作業での入力が面倒……」と思ったことはありませんか？
今回は、そんな“面倒”をAIの力で解決していきます！


# こんな人に読んでほしい

- AIを活用して業務を効率化したい！
- スプレッドシートをもっと便利に使いたい！
- ルーチンワークを自動化したい！


# 背景

大量のデータを処理するとき、一つひとつの判断には迷わなくても、手作業で処理するのは大変ですよね。

例えば、料理リストに調理方法を記入する作業を考えてみましょう。
1000件以上のレシピを調べて入力するなんて……想像するだけで頭が痛くなります。

そこで、「料理方法自動出力」を例として、スプレッドシートとGemini AIを活用しこの**解析作業を自動化**してみました！


# Mission

**カスタム関数でセルに入力した料理名を解析し、AIが適切な調理方法を自動生成する**

具体的には、

- スプシ上でカスタム関数を実行
- Gemini AIを活用して調理方法を生成
- 材料、料理手順、調理時のコツやポイントを出力

この仕組みを構築して、手作業の負担を激減させます！

https://ai.google.dev/aistudio?hl=ja


# 実装方法

## スプレッドシートの準備

1. 料理リストに、「調理方法」の列を追加
2. **Gemini for スプレッドシートのAPIキーを取得**し、スクリプトプロパティに追加

## GAS（Google Apps Script）で実装

Gemini APIを利用して、料理名から調理方法を自動生成するスクリプトを作成します。

### GASコード

```javascript
function analyzeCookingMethod(cookingName) {

    const apiKey = PropertiesService.getScriptProperties().getProperty('GEMINI_API_KEY');
    const apiUrl = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${apiKey}`;

    const payload = {
        contents: [{ role: "user", parts: [{ text: buildPrompt(cookingName) }] }]
    };

    const response = UrlFetchApp.fetch(apiUrl, {
        'method': 'POST',
        'contentType': 'application/json',
        'payload': JSON.stringify(payload),
        'muteHttpExceptions': true // エラーレスポンスを取得する
    });

    const responseBody = response.getContentText();
    const responseJson = JSON.parse(responseBody); // JSONに変換

    const result = responseJson.candidates[0].content.parts[0].text;
    console.log(result);
    return result;
}
```

### プロンプトの構築

```javascript
function buildPrompt(cookingName) {
    return `
      次の入力データを基に、料理の概要について適切な出力フォーマットに従い結果のみ生成してください。

      入力データ:
      - 料理名: ${cookingName}

      ---

      出力する3項目:
      1. 材料
         - 料理に必要な材料のリストを出力する

      2. 料理手順
         - 最高5ステップで料理の手順を出力する

      3. ポイント
         - その料理をするときのコツやポイントを30字以内で出力する

      ---

      出力フォーマット:
        【材料】
        【料理手順】
        【ポイント】
    `;
}

```

## カスタム関数を実行
あとは出力先のセルから[カスタム関数](https://developers.google.com/apps-script/guides/sheets/functions?hl=ja)を呼んであげるだけ！

![スクリーンショット 2025-02-25 19.40.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1256101/2c664f09-5498-44c3-bf8e-cb94426cf388.png)




# 実装結果
お見事！:clap_tone3::clap_tone3::clap_tone3:
カスタム関数を適用した結果、以下のように調理方法が自動で解析されました！

![スクリーンショット 2025-02-25 19.40.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1256101/17bdcd34-e256-42ea-850e-d57cc23d1bac.png)

:::note info
実務で活用する際は、さらに利便性を高める工夫も可能です。たとえば、後々の集計がしやすいように解析結果を各項目ごとに別のセルへ出力したり、分類を追加してより分かりやすく整理したりすることもできます。
:::


# さいごに

Gemini AIとスプシのカスタム関数を組み合わせることで、**面倒な作業を自動化**することができました！

これで、
✅ 1000件以上のタスクも一瞬！
✅ AIが自動で解析し、手作業ゼロ！
✅ 作業時間を大幅短縮し、業務効率UP！

AIを活用すれば、まだまだ効率化できる作業はたくさんあります。
皆さんもぜひ、この方法を試してみてください！

それでは、また！🚀
Raspberry Pi OS の IP アドレス固定方法

■　概要
Raspberry Pi Imager にて、IPアドレスを設定し忘れた or Raspberry Pi Imager を使用せずにインストール後、/etc/dhcpcd.conf を使用せずにIPアドレスを固定する方法のメモ。
dhcpcd.confにてIP アドレスを固定する記事はたくさんありますが、NetworkManager を使用した方法はあまり見つからなかったので、メモとして記載します。

* * *

■　コマンド
```
sudo vi /etc/NetworkManager/system-connections/preconfigured.nmconnection
```


■ 設定内容
```
[ipv4]
method=manual  # method=auto を修正
address=192.168.1.1
gateway=192.168.1.254
dns=192.168.1.254;192.168.1.253 # DNS サーバを複数設定する場合は、 ; で区切る
```
Amazon SQSのユースケースとAWSサービスとの連携例

## Amazon SQSとは？
Amazon Simple Queue Service（SQS）は、分散アプリケーション間で非同期にメッセージを送受信できるマネージド型のメッセージキューサービスです。SQSを活用することで、システムの疎結合化、スケーラビリティ向上、耐障害性の強化が可能になります。

---

## **Amazon SQSのユースケース**

### 1. **非同期処理の実装**

![async_processing.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294049/0257bae6-b841-4c45-b216-e13805112706.png)


**例**：ECサイトの注文処理
- ユーザーが注文を確定すると、注文情報をSQSに送信。
- バックエンドで在庫確認や決済処理を非同期で実行。

### 2. **マイクロサービス間の疎結合化**

![microservices_decoupling.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294049/b54eac7b-f85c-4938-b940-af73771bad84.png)

**例**：異なるマイクロサービス間のデータ連携
- 直接API通信をせず、SQSを経由することで、マイクロサービスの独立性を向上。

### 3. **バッチ処理のトリガー**

![batch_trigger.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294049/228bd025-4230-4330-a85c-4411a7f185d5.png)

**例**：データ処理パイプライン
- SQSに蓄積したデータをLambdaやEC2のバッチジョブで一定間隔ごとに処理。

### 4. **システムの耐障害性向上**

![fault_tolerance.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294049/f4bc5eac-25cd-468c-8192-eaf96dadbc38.png)

**例**：分散システムのリカバリ
- 一時的な障害が発生しても、SQSがメッセージを保持し、システムが復旧した後に処理を再開可能。

---

## **標準キュー（Standard Queue）とFIFOキューの違い**

### **🟢 標準キュー（Standard Queue）**
- **特長**
  - 高スループット（秒間数万メッセージ）
  - ベストエフォートの順序保証（順番が変わる可能性あり）
  - 少なくとも1回の配信（メッセージが重複する可能性あり）

- **適用例**
  - スケーラブルな非同期処理（例：ログ処理、行動分析）
  - 順序が厳密でなくてもよいシステム

---

### **🔵 FIFOキュー（First-In-First-Out Queue）**
- **特長**
  - メッセージの順序保証
  - 重複排除（Exactly-Once Processing）
  - スループットは標準キューより低め（最大3,000メッセージ/秒）

- **適用例**
  - 金融取引の処理（決済処理など）
  - タスクのワークフロー管理（ジョブキュー）

---

## **AWSサービスとの連携例**

### 1. **AWS Lambda + SQS**（イベント駆動の非同期処理）
📌 **例**：画像アップロード → SQS → Lambdaでサムネイル生成

### 2. **Amazon EC2 / ECS + SQS**（ワーカー処理）
📌 **例**：動画変換ジョブをキューに送信 → EC2が順次処理

### 3. **Amazon SNS + SQS（ファンアウトパターン）**
📌 **例**：注文通知をSNSで複数のSQS（在庫管理、請求処理、メール通知）に配信

### 4. **Amazon EventBridge + SQS**（イベント駆動型アーキテクチャ）
📌 **例**：S3のオブジェクト削除イベント → SQS経由でログ保存処理を実行

---

## **まとめ**
✅ **標準キュー**：高スループット、順序保証なし、重複あり → 汎用的な非同期処理向け
✅ **FIFOキュー**：順序保証、重複なし → 厳密な順序管理が必要なケース向け
✅ **AWSサービスと組み合わせることで、柔軟でスケーラブルなアーキテクチャを構築可能**

---

Amazon SQSを活用して、より効率的で信頼性の高いシステムを構築しましょう！
elm327の研究 その17

# 概要
elm327の研究やってみた。
I/M 準備状況について、geminiに聞いてみた。

# Geminiの回答

I/M 準備状況の11個のモニター項目の算出手順は、一般的に公開されていません。
これらのモニターは、車両のECU（Electronic Control Unit）によって、様々なセンサーからの信号に基づいて自動的に評価されます。
ただし、各モニターの役割と、それがどのような条件で「準備完了」と判定されるかについて、一般的な情報は以下の通りです。

|番号 |モジュール |役割 |算出手順|
|:-|:-|:-|:-|
|1|MIL（故障警告灯）|車両の排出ガス制御システムに異常が発生した場合に点灯する警告灯です。|ECUは、各種センサーからの信号を常時監視し、異常を検出した場合にMILを点灯させます。
|2| MIS（失火）|エンジンで失火が発生しているかどうかを検出します。|ECUは、クランク角センサーやカム角センサーからの信号を解析し、エンジンの回転数や各気筒の燃焼状態を監視します。失火が発生した場合、ECUはそれを検出し、MILを点灯させることがあります。
|3|FUE（燃料系）|燃料システムの各部品（燃料ポンプ、インジェクターなど）が正常に機能しているかを診断します。|ECUは、燃料圧力センサーや酸素センサーからの信号を解析し、燃料噴射量や空燃比が適切であるかを監視します。
|4| CCM（統合的な構成要素）|排出ガス制御システムに関連するその他の部品（センサー、バルブなど）が正常に機能しているかを診断します。| ECUは、各種センサーからの信号を解析し、これらの部品の動作状態を監視します。
|5| CAT（触媒装置）|触媒コンバーターが正常に機能し、排出ガス中の有害物質を適切に浄化しているかを診断します。|ECUは、触媒前後の酸素センサーからの信号を比較し、触媒の浄化能力を評価します。
|6| HCAT（ヒーター加熱型触媒）|ヒーター加熱型触媒が正常に機能し、早期に活性化しているかを診断します。|ECUは、ヒーターの動作状態や触媒温度を監視し、触媒が適切に昇温しているかを評価します。
|7| EVAP（燃料蒸発ガス排出抑制装置）| 燃料蒸発ガス排出抑制装置が正常に機能し、燃料蒸発ガスが大気中に放出されるのを防いでいるかを診断します。|ECUは、燃料タンク内の圧力や燃料蒸発ガスの流量を監視し、システムの気密性や吸着能力を評価します。
|8| AIR（二次空気システム）| 二次空気システムが正常に機能し、触媒の浄化を促進しているかを診断します。| ECUは、二次空気ポンプの動作状態や、酸素センサーからの信号を解析し、システムの機能を評価します。
|9| O2S（O2センサー）|酸素センサーが正常に機能し、適切な空燃比を維持しているかを診断します。| ECUは、酸素センサーからの信号を解析し、空燃比が理論空燃比に近い値を維持しているかを監視します。
|10| HRT（O2センサーヒーター）|酸素センサーヒーターが正常に機能し、センサーを早期に活性化させているかを診断します。|ECUは、ヒーターの動作状態やセンサー温度を監視し、センサーが適切に昇温しているかを評価します。
|11| EGR（排ガス再循環システム）|排ガス再循環システムが正常に機能し、燃焼温度を下げてNOxの排出量を抑制しているかを診断します。| ECUは、EGRバルブの動作状態や、排気ガス温度センサーからの信号を解析し、システムの機能を評価します。

これらのモニターは、車両の走行状態や環境条件によって、評価のタイミングや基準が異なります。
また、一部のモニターは、特定の走行パターン（例えば、一定速度での走行や、エンジン温度が十分に上昇した状態での走行）を必要とする場合があります。

詳細な算出手順については、車両の整備マニュアルや、OBD2スキャンツールの取扱説明書などを参照してください。

# 結論
ECUの自己診断機能をモニターしてるだけ。
ELM３２７のコマンドは、「01 01」たぶん。


以上。
【簡単AWS】【AWS API Gateway】AWS API Gateway における Canary リリースとは？

## 📌 概要
Canary リリースとは、**新しいバージョンの API を段階的にリリースする方法**です。AWS API Gateway の「ステージ」という概念を利用して、API の異なるバージョンや開発段階を管理します。これにより、開発、テスト、本番環境などを個別に管理できます。

Canary リリースを使うことで、初めに一部のトラフィックを新しいバージョンに向け、徐々にその割合を増やして最終的には全トラフィックを新バージョンに移行します。
もし新しいバージョンで問題が発生した場合は、すぐに元のバージョンへ戻すことができ、**リスクを分散しユーザーへの影響を最小限に抑える**ことが可能です。

---

## ✅ Canary リリースの基本的な流れ
1. **新バージョンのデプロイ**  
   既存の本番ステージに新しいバージョンをデプロイします。

2. **トラフィックの一部を新バージョンへ割り当て**  
   初めは全トラフィックの 10～20% を新しいバージョンに向けます。  
   例：
   - 80% → 旧バージョン
   - 20% → 新バージョン

3. **新バージョンの安定性を確認**  
   もし新バージョンが正常に動作している場合は、段階的にトラフィックの割合を増やします。

4. **全トラフィックを新バージョンに移行**  
   最終的に 100% のトラフィックを新しいバージョンに割り当てます。

5. **問題発生時の即時回復**  
   もし新バージョンで不具合が確認された場合は、元のバージョンにすぐに戻すことができます。これにより、ユーザーへの影響を最小限に抑えられます。

---

## 🐦 Canary という名前の由来
Canary（カナリア）の名前は、鉱山で使用されていた**「カナリアによる有毒ガス検知」**に由来します。

昔、鉱山では有毒ガスの早期検知のためにカナリアが使われていました。カナリアはガスに敏感で、異常があればすぐに反応するため、鉱夫たちは安全を確保できました。
同様に、Canary リリースでは**最初に少量のトラフィックを新しいバージョンに割り当て**、その動作を検証します。これにより、異常があれば早期に気づき、大規模な影響を回避できます。

---

## 🛠 Canary リリースの設定手順

### Step 1️⃣：Canary デプロイを有効化する
1. **AWS API Gateway コンソール** にアクセスします。
2. 任意の **ステージ** を選択します。
3. **Canary Release Deployment** セクションで **Canary を有効化** します。
4. **初期トラフィックの割合**（例：10%）を設定します。

### Step 2️⃣：トラフィックの監視
1. **CloudWatch** を使用して新しいバージョンのパフォーマンスを監視します。  
2. エラー率やレスポンスタイムを確認し、問題がないかチェックします。

### Step 3️⃣：トラフィック割合の調整
1. 新バージョンが安定して動作していることを確認したら、トラフィックの割合を段階的に増やします。  
2. **100% に到達するまで段階的にリリース** します。

---

## ⚠️ 注意点
- **Canary リリース中は必ず監視を行い、異常を早期に検出することが重要**です。  
- CloudWatch アラームを設定し、エラーやパフォーマンス低下が発生した際に通知を受け取るようにします。
- **回復オプションを事前に準備** し、問題発生時に迅速に対応できるようにします。

---

## 🏁 まとめ
Canary リリースを利用することで、新バージョンの API を安全かつ段階的にリリースできます。これにより、リスクを分散し、最小限の影響でユーザーに新しい機能を提供することが可能です。

新バージョンのリリース戦略を最適化したい場合は、Canary リリースをぜひ活用してみてください。
生成AIでテスト作業自動化！RAGを活用してドキュメントからテストケースを抽出してみよう！

# はじめに

UiPath Autopilot for TestersでRAGを活用したテストケースの自動生成が可能になりました。本ブログでは、その利用方法を解説したいと思います。RAGを利用して、インデックス付き参照から詳細を引き出すことで、より正確なテストを生成できる！と言うことですね。今回の解説部分は、下図の赤枠部分です。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/fe80c4af-d322-434a-ad83-5e89d4308df0.png)

UiPath Autopilot for Testers全体の解説は下記のブログをご参照ください。

https://qiita.com/Jun96427231/items/8edc9fcc754396dbe2fb

UiPath Autopilot for Testersのチュートリアルです。テスト生成については従来方式で記載されてます。

https://qiita.com/Jun96427231/items/b771f9649744678cd99c

APIテスト自動化のチュートリアルも掲載しています。テスト生成が従来方式で記載されてますが、本ブログのRAG方式に置き換えても可能かと思います。

https://qiita.com/Jun96427231/items/394b89dcdebb22e69d1e

# 手順❶：RAGでテスト生成出来る様に準備する
テストケースを生成するドキュメントをストレージバケットにアップロードして、インデックス作成を指示するだけで、簡単に準備できます。

## ストレージバケットにドキュメントをアップロードする

**【手順】**
「Orchestrator」>アップロードするフォルダーを選ぶ>「ストレージバケット」>「+ストレージバケットを追加」>「新しいストレージバケットを作成」
①任意の名前を入力
②「追加」クリック
③バケットを選択>「新しいファイルをアップロード」
④アップロード先ファイルのフルパスを設定
⑤「アップロード」クリック

参考）
ここでは例として、下記の様なローン審査の仕様が書かれたドキュメントをアップロードしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/1c4d0217-8ea6-4daf-90f0-13104cba6de4.png)

## コンテキストグランディングでインデックスを作成する
**【手順】**
「管理」>「AI Trust Layer」>「コンテキストグランディング」タブ>対象のテナント選択>ストレージバケットののフォルダー選択>「新規追加」
①任意の「インデックス名」を入力
②任意で「説明」を入力
③「ストレージバケット」を選択
④「Orchestratorのフォルダー」を選択
⑤ファイルを格納した「ストレージバケット」を選択
⑥「ファイルの種類」を選択
⑦「今すぐ同期」クリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/8eeecb11-4253-4061-a20c-78a42dad3876.png)

# 手順❷：RAGを活用してテストケースを生成する
テストを生成する際にRAG活用が選択できるようになってます。RAG活用を選択した上で、前述のフォルダーとインデックスを参照先として指定します。従来方式のオペレーションと違う点は、ここだけです。

## テスト生成のためのドキュメント参照先を選択する
**【手順】**
Test Managerで対象のプロジェクトに入る>「要件」>対象の要件を選択>「テストを生成」>「RAG (検索拡張生成) を活用」タブ

①ドキュメントをアップロードしたOrchestratorのフォルダーを選択
②作成したインデックスを選択
③「結果の数」にはAutopilotで生成するテストの数を入力
④「次へ」クリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/65cf714a-0853-453f-b811-5fafcb8362f0.png)

## テストケースの生成を実行する
【手順】
①任意のプロンプトを選択
②必要に応じてプロンプトを修正
③「テストを生成」クリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/9a0c7b77-fc88-4aa9-919d-f7af11776769.png)

## テスト生成結果
下図の様に境界値のテストケースが抽出されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/7a638b1a-c459-4183-b89e-63e9ad446695.png)

テストケースを展開すると、下図の様にテスト手順も作成されてます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/4abf9f69-a53a-4065-abce-63b14bf55e3b.png)

::: note warn
試しに既定のプロンプトで境界値テストを抽出させましたが、ローン審査機能だけではなく全機能のドキュメントをアップロードした場合、明確に、どの機能の境界値テストか指定する必要があると思います。テスト生成を実行する際のプロンプトで明示的に指定すると良いでしょう。
:::

# おわりに
従来の方式と比較し、ストレージバケットへのドキュメントアップロードやインデックス作成の手間、ドキュメント管理・運用の手間は増えますが、対象とするドキュメントファイル数が多い場合はRAG活用の方が良い様です。UiPath Autopilot for Testersは、どんどん出来ることが増えてきているので、今後さらにQCD向上のための活用が期待できそうです！
時系列データのプロットをPythonでアニメーション表示

## X-Yプロットをアニメーション表示するサンプル
```XY_plot_anim.py
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

# サンプル時系列加速度データを生成（ここに実際のデータを使用）
t = np.linspace(0, 10, 100)
acceleration = np.sin(2 * np.pi * t)  # 加速度データの例

# フィギュアとプロットの作成
fig, ax = plt.subplots()
ax.set_xlim(0, 10)
ax.set_ylim(-1.5, 1.5)
line, = ax.plot([], [], lw=2)

# 初期化関数
def init():
    line.set_data([], [])
    return (line,)

# アニメーション関数
def animate(i):
    x = t[:i]
    y = acceleration[:i]
    line.set_data(x, y)
    return (line,)

# アニメーションの設定
ani = animation.FuncAnimation(fig, animate, init_func=init, frames=len(t), interval=100, blit=True)

# GIFとして保存
ani.save("animation.gif", writer='pillow', fps=10)

# アニメーションの表示
plt.show()
```
![animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1979979/8401c13f-8379-410c-bf02-4c3ce4c60f0f.gif)
Ubuntu22.04にNextcloudをインストールする方法

OSSのNextcloudはVPSで利用でき、意外とこの方法で利用されている方もいます。
そこで今回、VPSを使ってUbuntu22.04にNextcloudをインストールする方法を紹介します。
## VPSでOSの準備
今回はKAGOYA CLOUD VPSを使ってOSであるUbuntu22.04を準備します。

コントロールパネルからインスタンス作成を選択し、OSテンプレートの一覧からUbuntu22.04を選択します。
その後、サーバースペック(今回は1コア/1GB/100GB)を選択し、インスタンスの作成が完了するまで待ちます。

## Nextcloudをインストール
インスタンスの作成が完了しましたら、Nextcloudのインストールを開始します。
KAGOYA CLOUD VPSの場合、インスタンス作成時にアプリケーションセットアップにある「Nextcloudテンプレ」を利用することでコマンドを叩かずにNextcloudを構築できますが、今回は手動でインストール作業を進めます。

### サーバー環境の構築
Ubuntu22.04を最新の状態に。
```
sudo apt update
sudo apt upgrade -y
```
次にApache, MariaDB, PHPをインストール。
```
sudo apt install apache2 mariadb-server libapache2-mod-php php php-cli php-mysql php-gd php-json php-curl php-mbstring php-intl php-imagick php-xml php-zip php-bz2 php-ldap php-apcu unzip -y
```
データベースの設定を行う。
```
sudo mysql_secure_installation
```
パスワードの入力などを求められますので、順番に回答していきます。
全てに回答を終えれば、NextcloudのDBとユーザーを作成します。
```
sudo mysql -u root -p
```
パスワードを求められますので、これに回答。
データベースやユーザー情報の入力を行います。

今回は以下の内容で進めますが、必要に応じてユーザー名やパスワードの変更を行いましょう。
```
CREATE DATABASE nextcloud;
CREATE USER 'nextclouduser'@'localhost' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextclouduser'@'localhost';
FLUSH PRIVILEGES;
EXIT;
```

### Nextcloudのインストール
Nextcloudの最新バージョンを公式サイトからダウンロード、
同時にApacheのルートディレクトリに配置します。
```
cd /var/www/
sudo wget https://download.nextcloud.com/server/releases/nextcloud-24.0.0.zip
sudo unzip nextcloud-24.0.0.zip
sudo chown -R www-data:www-data nextcloud
sudo chmod -R 755 nextcloud
```
次にApacheの設定ファイルを作成
```
sudo nano /etc/apache2/sites-available/nextcloud.conf
```
編集画面が開くので、以下の内容で進めます。
```
<VirtualHost *:80>
    DocumentRoot /var/www/nextcloud/
    ServerName インスタンスのIPアドレス

    <Directory /var/www/nextcloud/>
        Options +FollowSymlinks
        AllowOverride All

        <IfModule mod_dav.c>
            Dav off
        </IfModule>

        SetEnv HOME /var/www/nextcloud
        SetEnv HTTP_HOME /var/www/nextcloud
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/nextcloud_error.log
    CustomLog ${APACHE_LOG_DIR}/nextcloud_access.log combined
</VirtualHost>
```
Apacheのモジュールを有効化・設定の適用を行います。
```
sudo a2ensite nextcloud.conf
sudo a2enmod rewrite headers env dir mime setenvif ssl
sudo systemctl restart apache2
```

これでNextcloudのインストールは完了です。

### SSLの設定
実際に利用していく場合にはSSLの設定が必要になります。
事前にSSL証明書を取得しておく必要がありますが、ここでは一旦は無料で利用できるLet’s Encryptの場合でご紹介します。
```
sudo apt install certbot python3-certbot-apache -y
sudo certbot --apache -d インスタンスのIPアドレス
```
SSL証明書の登録に必要なメールアドレスを求められますので、回答して完了させます。

## Nextcloudの利用開始
以上でUbuntu22.04にNextcloudのインストールが完了です。
以下のURLでアクセスしてNextcloudのログイン画面が表示されれば成功です。
```
http://IPアドレス
```
※SSLの設定を行っている場合はhttpsで。
個人的備忘録：AWS ECSのデプロイ時にServiceNotFoundExceptionが出たときのチェックポイント

## はじめに
AWS ECS (Elastic Container Service) を利用していると、`aws ecs update-service` コマンド実行時に `ServiceNotFoundException` エラーが発生することがあります。

:::note warn
***このエラーは、ECSのクラスターやサービスが正しく設定されていない場合に発生するものです。***
:::

本記事では、このエラーの原因と解決方法について詳しく解説します。

## 書こうと思ったきっかけ
AWS ECS を利用してアプリケーションのデプロイを行っていた際に、この `ServiceNotFoundException` エラーに遭遇しました。

:::note info
**初めて見たエラーだったため、原因を特定するのに時間がかかりました。**
:::

同じ問題で悩んでいる方の助けになればと思い、記事にまとめることにしました。

## `ServiceNotFoundException` とは？
このエラーは、`aws ecs update-service` コマンドを実行した際に、指定したECSサービスが見つからない場合に発生します。

```sh
aws ecs update-service --cluster my-cluster --service my-service --force-new-deployment
```

上記のようなコマンドを実行した際に、以下のエラーが表示されることがあります。

```txt
An error occurred (ServiceNotFoundException) when calling the UpdateService operation:
```

このエラーが発生する原因は複数あります。

## エラーの主な原因と確認方法
### 1. クラスターが存在しない
指定したクラスターが本当に存在しているかを確認するために、以下のコマンドを実行します。

```sh
aws ecs list-clusters --region ap-northeast-1
```

出力に `my-cluster` が含まれていない場合、クラスターが存在しないため作成する必要があります。

### 2. ECSサービスが存在しない
クラスター内に `my-service` が存在するかを確認します。

```sh
aws ecs list-services --cluster my-cluster --region ap-northeast-1
```

もし `my-service` がリストに含まれていない場合、サービスが作成されていないか、削除された可能性があります。

### 3. AWSリージョンが異なる
デフォルトのリージョンを確認するには、以下のコマンドを実行します。

```sh
aws configure list
```

`ap-northeast-1` 以外のリージョンが設定されていた場合、コマンドの `--region` オプションを適切に指定する必要があります。

```sh
aws ecs update-service --cluster my-cluster --service my-service --force-new-deployment --region ap-northeast-1
```

### 4. IAM権限が不足している
AWS IAM の権限不足が原因でエラーが発生する可能性もあります。

現在のIAMユーザーを確認するには、以下のコマンドを実行します。

```sh
aws sts get-caller-identity
```

次に、ECS関連のポリシーが適用されているか確認します。

```sh
aws iam list-attached-user-policies --user-name your-user
```

ECSサービスを更新するには、以下のポリシーが必要です。
- `AmazonECS_FullAccess`
- `AWSServiceRoleForECS`
- `AmazonEC2ContainerServiceforEC2Role`

ポリシーが不足している場合は、IAMコンソールから適切な権限を付与してください。

## まとめ
今回の ServiceNotFoundException の原因として、ECSサービスの未作成、クラスターやリージョンの指定ミス、IAM権限不足などが考えられます。

:::note warn
**※どんな状況でも落ち着いて、丁寧に切り分けながら確認することが大切です。**
:::

私もこのエラーで悩みましたが、適切なトラブルシューティングを行い解決できました。***本記事が同じ問題に直面している方の助けになれば幸いです。***
コンピューター学習の本質とは？数学と物理は必要か？

# はじめに
この文章は新たに何かコンピューターを学び始める方向けに、自分自身で考えるちょっとしたコツをまとめるための文章です。大げさに言えば人生で得た教訓の共有を目的としています。
新規性がどうチャラとか、検証可能な全詳細をとかレイヤー違いの愚かな質問をする人は何も得られませんので、ご遠慮ください。

# コンピューターもしくはシステムを学ぶということ

理論的には数学、実装としては物理を学ぶということです。本気で勉強すると必ずこのどちらかの知識が必要となります。
ただ、実質的に、これらの学問を体系的にすべて学ぶことはできません。でもまぁ、コンピューターシステムを仕事とすることぐらいは、関係がある。根ざしていることを理解だけしていけば問題ありません。勘違いしてほしくないのはこの２つの学問が要らないと言っているわけではないこと。またコンピューターシステムが「チョロい」といっているわけでもないことです。
そのいずれにも十分に価値があって、世の中のために不可欠で、学ぶに値する大切なことなんです。ただ、ちょっとだけ見ている場所が違うだけなんです。
では、なぜ、根ざしている、基本である物理や数学をいったん忘れることができるのでしょうか？

## なぜ、数学や物理をいったん忘れることができるのか？

それは、コンピューターシステムの学び方には「抽象化」という考え方があるからです。

例えば、私たちは **CPUの中で電子がどう動くか** を意識しなくてもプログラムを書くことができます。  
また、**ソートアルゴリズムを使うときに、厳密な計算理論をすべて理解している必要はありません**。  

これらは「低レイヤーの理論や実装を一度隠蔽し、高レイヤーの視点で考えられるようにする」ことによって成り立っています。

### じゃあ数学も物理もいらない？

もちろんそんなことはありません。むしろ、より深く理解したいなら、**数学や物理に戻ることが必要になる場面が出てきます**。  

#### 数学の視点
- **ハッシュ関数の衝突確率** を理解するには確率論が必要。  
- **機械学習のモデルの最適化** には線形代数や微分が重要。  
- **グラフアルゴリズム** を理解するには離散数学が不可欠。  

#### 物理の視点
- **CPUキャッシュのヒット率** を上げるには、メモリ階層の理解が大事。  
- **スレッド並列処理の効率化** には、CPUのパイプラインやコア間通信の知識が役立つ。  
- **ゲーム開発** では、物理エンジンが実世界の運動法則（ニュートン力学）に基づいている。  

## レイヤーを意識して学ぶと理解が楽になる

つまり、コンピューターを学ぶとき、はじめは抽象化を活用して「考えやすく」することができますが、より高度な知識を求めるなら、結局、数学や物理に戻ってくることになります。

大事なのは、「今、自分がどのレイヤーで考えているのか？」を意識することです。
それが分かれば、余計なものを気にせず、適切な知識を取捨選択して学べるようになります。
## レイヤーと共に大事なこと

誤解を恐れずに言えば、コンピューターを学ぶということは、抽象化レイヤーの概念や仕組みの理解、コンピューターの使い方の理解の両方を一緒にやるべきだということです。それぞれ得意・不得意があるでしょうが、片方から得られるフィードバックが他方の理解を進めることもしばしばあります。そのため、どちらか一方をおろそかにすることはできないと思います。

### 使い方の学習

コンピューターをたくさん使ってください。プログラムを書いたり、その動きを検証してください。自分のために、学んだことをまとめて発信してください。他の人から、いろいろなフィードバックが得られるはずです。

「生成AIに聞けば実装方法なんていつでもわかる？」  
確かにそうかもしれません。生成AIを使えば、いつでも動くコードが手に入ります。  

でも、そのコードが誤っていたら？  
エレガントでなかったら？  
保守性に乏しかったら？  

それらを直すのは **自分自身** です。自分のセンスを磨くためにも、学習と発信は続けていく必要があります。

### 概念の学習

たくさん本を読んでください。読んで読んで、たくさん読みましょう。そして、自分のためにまとめ、発信しましょう。もちろん、身近な人との対話でもよいです。  

そして **識者の意見を真摯に聞くべき** です。  

間違ってもAIの意見を鵜呑みにしないこと。AIはまだ未熟です。自身の持っている情報を飛び越えて、埋め、補完し、伝えてくることもあります。  

必ず **識者（先輩）の意見を聞いて、自分なりにかみ砕くこと** が重要です。  

実装の勉強は、使ってみて反応を観察すればすぐに終わります。しかし、概念の理解は「振る舞いの観察」ができない分、**コミュニケーションに由来する部分が大きい** のです。そのため、実装の勉強に比べて **成長を実感しにくい** 分野でもあります。苦しいかもしれませんが、しっかり積み上げていきましょう。

### 大切なこと

他者の発言が **どの立場でのものなのか** をしっかりと理解しましょう。それは **レイヤー** だったり、**学習の軸** だったりします。  

相手のレイヤーや学習の軸が違っていることに気付ければ、自然と **敬意や謙遜** が生まれ、新しい発見にもつながります。  

反対に、自分の学習方法や立場での考え方を **相手に強要することはやめましょう**。それは、発見や気づきから自分を遠ざける結果にしかなりません。  

---

長くなりましたので、今回はここまでにします。  
次回は **具体的なレイヤーの例を取り上げながら** まとめていきます。  

読んでくれたら嬉しいです！
paizaラーニングレベルアップ問題集の【整数の半角スペース区切りの入力】をやってみた。

paizaラーニングレベルアップ問題集の【整数の半角スペース区切りの入力】をやってみました。
- - -
##### 問題
###### 1つの整数の入力
https://paiza.jp/works/mondai/stdin_primer/stdin_primer__integer_space_step1
###### 2つの整数の半角スペース区切りの入力
https://paiza.jp/works/mondai/stdin_primer/stdin_primer__integer_space_step2
###### 5つの整数の半角スペース区切りの入力
https://paiza.jp/works/mondai/stdin_primer/stdin_primer__integer_space_step3
###### 10個の整数の半角スペース区切りの入力
https://paiza.jp/works/mondai/stdin_primer/stdin_primer__integer_space_step4
###### 1,000個の整数の半角スペース区切りの入力
https://paiza.jp/works/mondai/stdin_primer/stdin_primer__integer_space_boss
- - -
5問とも同じコードで正解してみます。
- - -
##### C
```c
#include <stdio.h>

int main(void){
	int a;
	while (scanf("%d", &a) == 1)
		printf("%d\n", a);
	return 0;
}
```
- - -
##### C++
```cpp
#include <iostream>
using namespace std;

int main(void){
	int a;
	while (cin >> a) cout << a << endl;
	return 0;
}
```
- - -
##### C#
```cs
using System;

class Program
{
	public static void Main()
	{
		foreach (int a in Array.ConvertAll(Console.ReadLine().Split(), int.Parse))
			Console.WriteLine(a);
	}
}
```
- - -
##### Go
```go
package main
import "fmt"

func main(){
	var a int
	for _, err := fmt.Scan(&a); err == nil; _, err = fmt.Scan(&a) {
		fmt.Println(a)
	}
}
```
- - -
##### Java
```java
import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext())
			System.out.println(sc.nextInt());
		sc.close();
	}
}
```
- - -
##### JavaScript
```js
require("fs").readFileSync("/dev/stdin", "utf8").trim().split(' ').map(Number).forEach((a) => console.log(a));
```
- - -
##### Kotlin
```kotlin
fun main() {
	for (a in readLine()!!.split(" ").map { it.toInt() })
		println(a)
}
```
- - -
##### PHP
```php
<?php
	foreach (array_map("intval", explode(' ', trim(fgets(STDIN)))) as $s)
		echo $s, PHP_EOL;
?>
```
- - -
##### Perl
```pl
for my $a (map { int($_) } (split ' ', <STDIN>)) {
	print $a, $/;
}
```
- - -
##### Python3
```py
for a in list(map(int, input().split())):
	print(a)
```
- - -
##### Ruby
```rb
gets.chomp.split.map(&:to_i).each do |a|
	p a
end
```
- - -
##### Scala
```scala
import scala.io.StdIn._

object Main extends App{
	for (a <- readLine().split(" ").map(_.toInt)) {
		println(a)
	}
}
```
- - -
##### Swift
```swift
for a in readLine()!.split(separator: " ").compactMap({ Int($0) }) {
	print(a)
}
```
Arch LinuxにNeovimをインストールしてCheckhealthを通過できるようにするまでの手順

# はじめに
ここでは、Arch LinuxにNeovimをインストールして、checkhealthを通過できるようにするところまでのセットアップ方法を紹介していきます。

# Neovimをインストール
まずはNeovimをインストールします。
```shell-session:
$ sudo pacman -S neovim
```

# プログラミング言語をインストール
必要となるプログラミング言語をインストールします。
```shell-session
$ sudo pacman -S python ruby nodejs perl
```

# Language Providerをインストール
Python, Ruby, Node.js, PerlのLanguage Providerをインストールしていきます。
## Python
### python-pynvimパッケージをインストール
```shell-session:
$ sudo pacman -S python-pynvim
```
## Ruby
### ruby-neovimパッケージをインストール
```shell-session:
$ sudo pacman -S ruby-neovim
```
## Node.js
### nodejs-neovimパッケージをインストール
以下のコマンドでnodejs-neovimをインストールします。
```shell-session:
$ yay -S nodejs-neovim
```
## Perl
### Neovim::Extをインストール
cpanminusを使って、Neovim::Extを--sudoオプションをつけてインストールします。
```shell-session:
$ sudo pacman -S cpanminus
$ cpanm -n Neovim::Ext --sudo
```

# クリップボードをインストール
クリップボードを使えるようにします。
## xclipパッケージをインストール
以下のコマンドでxclipをインストールします。
```shell-session:
$ sudo pacman -S xclip
```
## ~/.config/nvim/init.vimを編集
~/.config/nvim/init.vimに以下の行を追記します。
```vimscript:~/.config/nvim/init.vim
set clipboard=unnamed,nunamedplus
```

# checkhealthを実行する
neovimを起動して、
```
:checkhealth
```
と入力することで動作確認ができます。

# まとめ
これで、Neovimの基本的な設定は完了となります。ここからは、設定を追加したり好きなプラグインを導入したりして、Neovimをどんどん自分好みのものにしていってください。
それでは、よいNeovimライフを。
Devinの代替OSSのopenhands:0.26をdocker pull docker runする時にエラーが出ないコピペコマンド


## Devinとは

生成AIを利用してプログラミング作業をお願いできます

月額500ドル（6-7万円）必要です

## OpenHandsとは

オープンソースでDevinのような環境をセルフホストできるアプリです。


https://github.com/All-Hands-AI/OpenHands

## 使い方

Dockerをインストール https://www.docker.com/ja-jp/

ターミナル（windows の Poershellとか）でコマンドを実行

## 公式で用意しているコマンド

```
docker pull docker.all-hands.dev/all-hands-ai/runtime:0.26-nikolaik

docker run -it --rm --pull=always \
    -e SANDBOX_RUNTIME_CONTAINER_IMAGE=docker.all-hands.dev/all-hands-ai/runtime:0.26-nikolaik \
    -e LOG_ALL_EVENTS=true \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v ~/.openhands-state:/.openhands-state \
    -p 3000:3000 \
    --add-host host.docker.internal:host-gateway \
    --name openhands-app \
    docker.all-hands.dev/all-hands-ai/openhands:0.26
```


## 公式で用意しているコピペコマンドだと次のエラーが出る場合

```
発生場所 行:7 文字:7
+     --add-host host.docker.internal:host-gateway \
+       ~
単項演算子 '--' の後に式が存在しません。
発生場所 行:7 文字:7
+     --add-host host.docker.internal:host-gateway \
+       ~~~~~~~~
式またはステートメントのトークン 'add-host' を使用できません。
発生場所 行:8 文字:7
+     --name openhands-app \
+       ~
単項演算子 '--' の後に式が存在しません。
発生場所 行:8 文字:7
+     --name openhands-app \
+       ~~~~
式またはステートメントのトークン 'name' を使用できません。
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : MissingExpressionAfterOperator
```


## runコマンドは1行に修正したものを、1行づつ実行してみてください

```
docker pull docker.all-hands.dev/all-hands-ai/runtime:0.26-nikolaik
```

```
docker run -it --rm --pull=always -e SANDBOX_RUNTIME_CONTAINER_IMAGE=docker.all-hands.dev/all-hands-ai/runtime:0.26-nikolaik -e LOG_ALL_EVENTS=true -v /var/run/docker.sock:/var/run/docker.sock -v ~/.openhands-state:/.openhands-state -p 3000:3000 --add-host host.docker.internal:host-gateway  --name openhands-app docker.all-hands.dev/all-hands-ai/openhands:0.26
```

## 次のURLにアクセスしたら使えます

http://localhost:3000/

## 使用するにはAPIキーが必要です

とりあえずChatGPTのAPIキーを使う方法が一番一般的です。


## Open Routerというサービスを利用するとOpen Routerは複数のAIモデルにアクセスできまｓ

https://openrouter.ai/
PHPで「他の変数を代入」の動作を確認してみた。

# 概要

PHPで「他の変数を代入」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/php/var/index4.html

# 実装

以下のファイルを作成しました。

```sample.php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>PHPテスト</title>
</head>
<body>

<p>PHPのテストです。</p>

<p>
<?php
$num1 = 320;
$num2 = $num1;

print '$num1 ='.$num1.'<br />';
print '$num2 ='.$num2.'<br />';

$num1 = 18;

print '$num1 ='.$num1.'<br />';
print '$num2 ='.$num2;
?>
</p>

</body>
</html>
```

以下のコマンドを実行しました。

```
$ php sample.php 
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>PHPテスト</title>
</head>
<body>

<p>PHPのテストです。</p>

<p>
$num1 =320<br />$num2 =320<br />$num1 =18<br />$num2 =320</p>

</body>
</html>
```

# まとめ

何かの役に立てばと。
Chrome 134の新機能！Dialog要素がより簡単に閉じられるようになる！

もうすぐリリースされるChrome 134の新機能の中で、特に興味深い変更があったので紹介します。
※2025/2/22現在の情報のため、リリースまでの間に変更される可能性があります。

# Dialog要素の新しい閉じ方

Chrome 134では、<dialog> 要素の閉じ方を制御できる closedby 属性が新たに追加されます。これにより、従来JavaScriptで実装していた処理をHTMLだけで実現できるようになります。
書かれているChromeの開発者向けのBlogはこちらです。

## 公式ブログ

https://developer.chrome.com/blog/chrome-134-beta


```
[概要]
Dialog light dismiss
One of the nice features of the Popover API is its light dismiss behavior. This feature brings the same capability to <dialog>. A new closedby attribute controls behavior:

<dialog closedby=none>: No user-triggered closing of dialogs at all.
<dialog closedby=closerequest>: Pressing ESC (or other close trigger) closes the dialog.
<dialog closedby=any>: Clicking outside the dialog, or pressing ESC, closes the dialog. The same as popover=auto behavior.
```

# 変更点の概要
### これまでの課題

従来、<dialog> 要素を閉じるには close() メソッドを呼び出す必要がありました。

ボタンを押して閉じる処理は比較的簡単に実装可能ですが、背景をクリックしたときに閉じる処理はクリック位置を判定し、背景なのかDialog内部なのかを判断する必要がありました。

この問題を解決するために、Chrome 134で closedby 属性が導入されます。

### closedby 属性の動作

|設定値  |動作  |
|---|---|
|any  |ESCキーまたは範囲外クリックで閉じる  |
|closerequest|ESCキーで閉じる（背景クリックでは閉じない）|
|none|ESCキーでも背景クリックでも閉じない|

### コードの比較
これまでの実装（JavaScriptで処理）

```javascript
dialog.addEventListener("click", function (event) {
    const dialogRect = dialog.getBoundingClientRect();
    if (event.clientX < dialogRect.left
        || event.clientX > dialogRect.right
        || event.clientY < dialogRect.top
        || event.clientY > dialogRect.bottom) {
        dialog.close();
    }
});

```
Chrome 134以降の実装（HTMLだけで完結）
```html
<dialog closedby="any">
~Dialogの表示する要素を記述
</dialog>
```
このように、HTMLの属性を設定するだけで背景クリック時の閉じる処理を実装できます。

# リリースについて
 
|環境  |リリース予定  |リンク|
|---|---|---|
|Chromeブラウザ  |2025/3/4  |https://developer.chrome.com/blog/chrome-134-beta?hl=ja|
|Microsoft Edge|2025/3/6|https://learn.microsoft.com/ja-jp/microsoft-edge/web-platform/release-notes/134|

2025/2/22時点では、SafariやFirefoxの対応予定は見つけられませんでした。
「Null」さんという実在の人物が現実世界で遭遇する様々なトラブル

プログラミングの世界では、「Null」という値は「値が存在しない」ことを示す特別な値として広く使われています。しかし、現実世界で「Null」という苗字をもつ人々にとって、これは想像以上の問題を引き起こしているそうです。

https://futurism.com/null-name-trouble-computer-systems

## はじめに - Nullとは何か

プログラミングにおいて「Null」は特別な値です。単に「0（ゼロ）」ではなく、「何も値がない」ことを示します。例えば、データベースの電話番号フィールドが「Null」の場合、それは電話番号が入力されていないことを意味します。

```java
// Javaでのnullの例
String phoneNumber = null; // 電話番号がまだ設定されていない
```

この概念自体は便利ですが、実世界と接する場面で予期せぬ問題を引き起こすことがあります。

## 実際に起きている問題

### Nontra Nullさんのケース

カリフォルニア州バーバンクに住む41歳の衣料デザイナー、Nontra Nullさんは結婚後にこの苗字になりました。彼女がインドの友人の結婚式に参加するためにビザを申請した際、コンピュータシステムが彼女の申請を処理できないという問題が発生しました。

システムは「Null」を苗字ではなく「値なし」と解釈してしまったのです。幸いにも、出発の前日にようやくビザが発行されましたが、彼女は「行けないことを精神的に受け入れる必要があった」と語っています。

### Jan Nullさんのケース

75歳の気象学者Jan Nullさんは、ホテルの予約をオンラインで行う際に、苗字の前にファーストネームのイニシャルを付けることにしています。以前、予約フォームに苗字を入力するたびにリセットされるというトラブルを経験したからです。

### Joseph Tartaroさんのケース

さらに極端な例として、36歳のセキュリティ監査員Joseph Tartaroさんは、「NULL」というナンバープレートを取得して以来、全国各地から無関係の交通違反切符が届くという問題に何年も悩まされています。

## 技術的背景

「Null」の現在の使用法は、イギリスのコンピュータ科学者であり、チューリング賞受賞者のTony Hoare氏によって発明されました。Java、C#など多くのプログラミング言語で使用されていますが、Rustなどの新しい言語では完全に避けられています。

Hoare氏は「Null」を自身の「10億ドルの間違い」と呼んでいます。それは脆弱性を導入し、プログラムをクラッシュさせる可能性があるためです。

```java
// Nullによる潜在的な問題
String name = null;
int length = name.length(); // NullPointerExceptionが発生
```

## 対策と解決策

### プログラマーができること

1. **Nullの代わりにオプション型を使用する**
   Javaの`Optional`、Scalaの`Option`、Rustの`Option`など、多くの現代的な言語はNull安全な代替手段を提供しています。

```java
// Optionalを使った例
import java.util.Optional;

Optional<String> maybeName = Optional.empty();
// エラーにならない安全なアクセス
int length = maybeName.map(String::length).orElse(0);
```

2. **入力バリデーションを厳格に行う**
   特に名前や住所などの個人情報を扱う場合、「Null」や「None」などの予約語が実際の値として入力される可能性を考慮し、適切に処理するアプローチです。

```javascript
// フォーム送信前のバリデーション例
function validateName(name) {
  // 技術的な予約語のリスト
  const reservedWords = ['null', 'undefined', 'nan'];
  
  if (reservedWords.includes(name.toLowerCase())) {
    // 特別な処理を行う
    return encodeSpecialName(name);
  }
  return name;
}
```

## まとめ

「Null」という概念はコンピュータ科学において便利でしたが、実世界と接する場面では予期せぬ問題を引き起こす可能性があります。Microsoftの研究者Daan Leijen氏が指摘するように、「これは非常に広範囲に及ぶ問題であるため、解決が難しい」のです。

現代のソフトウェア開発では、Nullを完全に避けるアプローチが増えていますが、レガシーシステムの更新は容易ではありません。プログラマーとしては、このような潜在的な問題点を存在していることを理解し、適切な対策を講じておきたいですね。