OmniAICreator/Qiita-1.07M huggingface dataset:
コンテナ環境でのJVMアプリケーションのリモートデバッグ方法

## はじめに

この記事ではDockerなどのコンテナ環境で実行されているJVMベースのアプリケーション（Java, Kotlin, Scalaなど）をデバッグする方法について解説します。

## 前提条件

- Docker/Docker Composeがインストールされていること
- Java対応IDE（IntelliJ IDEA, Eclipse, VS Codeなど）がインストールされていること
- JVMベースの言語（Java, Kotlin, Scala等）で作成されたプロジェクトが存在すること

## デバッグ環境の設定方法

### 1. Docker環境の準備

#### docker-compose.ymlの設定

デバッグを可能にするには、JVMのデバッグポートを公開し、デバッグオプションを環境変数として設定する必要があります。

```yaml
version: '3'
services:
  app:
    build: .
    ports:
      - "8080:8080"      # アプリケーションポート
      - "5005:5005"      # デバッグポート
    environment:
      - JAVA_TOOL_OPTIONS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
```


### 2. IDEの設定

#### IntelliJ IDEAの場合

1. メニューから「実行」→「実行構成の編集」を選択
2. 「+」ボタンをクリックし、「リモートJVMデバッグ」を選択
3. 以下の項目を設定：
   - 名前: 任意のデバッグ設定名（例：「Docker Debug」）
   - ホスト: localhost
   - ポート: 5005
   - 使用するモジュールのクラスパス: デバッグ対象のプロジェクトモジュール

#### VS Codeの場合

`launch.json`に以下の設定を追加：

```json
{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "java",
      "name": "Docker Debug",
      "request": "attach",
      "hostName": "localhost",
      "port": 5005
    }
  ]
}
```

### 3. リモートデバッグの開始

上記で設定した実行構成でリモートデバッグを開始すると、デバッグが可能になります。


:::note warn
プロダクション環境では、デバッグポートを公開しないでください
:::

## まとめ

この記事では、Docker環境で実行されているJVMアプリケーションのデバッグ方法について説明しました。適切な設定を行うことで、通常の開発環境と同様にステップ実行やブレークポイントを利用したデバッグが可能になります。

この方法は、Java、Kotlin、Scalaなど、JVM上で動作する全ての言語に適用可能です。フレームワークの選択（Spring Boot、Micronaut、Quarkus、Play Frameworkなど）に関係なく、同じ方法でデバッグを行うことができます。
MacのCPU温度を監視してサーマルスロットリングを抑制する

Macで高負荷なアプリケーション実行時、特にMacbook Airなどのファン非搭載のMacの場合CPU温度上昇によるサーマルスロットリング（性能抑制）が発生することがあります。
このような状況を把握するために、CPU温度を監視する必要がありますが、標準の機能だけではこれを確認するのは簡単ではありません。
今回紹介する「Hot」を使えば、メニューバーからCPU温度を簡単に監視でき、パフォーマンス低下がサーマルスロットリングによるものかどうかを判断しやすくなります。

## 特徴
- メニューバーに常駐してCPU温度をリアルタイム表示
- CPUコアごとやNANDの温度を個別表示
- ファン回転数の表示

## インストール方法
1. [GitHubのリリースページ](https://github.com/macmade/Hot/releases)から最新版をダウンロード
2. ダウンロードしたdmgファイルを開く
3. Hot.appをアプリケーションフォルダに移動して起動

## 活用方法

### パフォーマンス低下の原因特定
動作が遅くなった際に温度を確認することで、サーマルスロットリングが原因かどうかを判断できます。

### 対策例
- スタンドなどを活用して排熱効率を良くする
- サーキュレーターなどを当て一時的に冷却する
- 冷却パッドの使用
- ノートPCファンを使用
2日目：群馬🐴アプリ開発！アイデアを形にする要件定義と基本機能の洗い出し

# 2日目：アイデアを形に！要件定義と基本機能の洗い出し (前半)

![群馬県庁からの景色](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637864/c248bef8-8ffa-0dff-89b4-7dc0d0ed1325.jpeg)

みなさん、こんにちは！群馬県ローカルイベント発見アプリの開発者です。プロジェクト2日目が終了しました。今日は頭をフル回転させて、アイデアを具体的な形にするための作業に取り組みました。

---

## 今日の進捗と取り組み内容

### 1. ブレインストーミング
まずは思いつく限りの機能をリストアップしました。  
アイデアを書き出すと、自分が実現したいことがたくさん見えてきてワクワク！  
でも同時に、「これ全部実装するの大変だぞ…」という不安も😅

---

### 2. 競合アプリの調査
似たコンセプトのアプリを徹底分析しました。  
特に参考になったのは、ユーザーのレビュー。彼らが求める機能や不満点が明確になり、非常に役立ちました。

---

### 3. 必要な機能の洗い出し
ユーザーのニーズを考えながら、以下の機能が重要だと感じました：

- **イベント一覧表示・詳細ページ**  
  見やすく分かりやすい情報提供は必須。

- **キーワード検索**  
  必要な情報にすぐアクセスできるように。

- **イベント登録（主催者向け）**  
  地元の小さなイベントも気軽に掲載できる仕組み。

- **ユーザー登録・SNS連携**  
  ハードルを下げ、多くの人に使いやすく。

- **お気に入り機能・プッシュ通知**  
  ユーザー体験をさらに向上させるために。

---

## 気づきと感想
今日一日で、多くのアイデアが出てきて頭の中が整理できた気がします。  
ただし、「本当にこれを一人で作れるのか？」というプレッシャーも感じています。

それでも、群馬を盛り上げたいという強い思いがあるので、焦らず一歩ずつ進めていきたいと思います。

---

## 明日の予定
- 今日出したアイデアを整理し、**優先順位を設定**
- **MVP（Minimum Viable Product）** として最初に実装するべき機能を検討

---

引き続き、応援よろしくお願いします！  
「群馬を盛り上げる！」という目標に向かって、一歩一歩頑張ります💪
トラックパッドで3本指のジェスチャが反応しない時の対処法【Mac】

# はじめに
私は普段の研究でMacを利用しているのですが，突然トラックパッドでの3本指の操作ができなくなりました．
検索すると色々と出てくるのですが，いずれも私の場合は改善せず，意外と苦戦したため，メモとして書き残しておきます．


# 試したこと
以下の記事を参考に色々と試してみました．
私の場合はいずれの場合もヒットしませんでしたが，解決するかもしれません．

https://qiita.com/Ryo-0131/items/2a1a1f21fe38ea714164

https://note.com/kacchan570/n/nba609cfbc033


# 解決した方法
以下，最終的に解決した方法を紹介します．

システム設定 > トラックパッドから，「フルスクリーンアプリケーション間をスワイプ」「Mission Control」の項目を確認します．

![スクリーンショット 2025-01-14 9.37.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693436/73a73495-c246-7514-63f1-c5d26f99cb77.png)

トグルを展開するといくつかのオプションが表示され，そのうち「3本指で左右にスワイプ」を選択します．

![スクリーンショット 2025-01-14 9.37.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693436/e425a46f-1d0d-8bb3-db04-c338c8810c2e.png)


# 最後に
今回は先の方法で解決しましたが，該当項目を設定した記憶がなく……
他の方の記事でもありましたが，度々勝手に（気づいていないだけかもしれませんが）変更されることもあるようです．
こんな項目を触った記憶がない，という場合でも確認することの大切さを学びました．
2024年の振り返り

# 背景
2025年も到来して振り返り記事をみまして
携わった技術の
しょぼさ
も含め振り返り記事を書いていきます！！
今年は転職もできましたので、転職前と後で分けたいと思います。
# 転職前(1-7月)
この年はIT業界(自動車)で働いており、レーダークルーズコントロールなどの
自動運転系に携わっていました。
言語は統一性出すためなのかノーコードであり、先輩や後輩にメンバーながら仕事の割り振りやスケジュール管理を実施していました。
金額の管理はしてないです。
会議の話回しと割り振りと管理だけです。
成長や周りが同じ機能の経験者と言うことで、納期が近いもの以外は
自分の中で答え決めてから抽象度の高い状態で渡してました。

<u><b>
期待の斜め上から結果が来るのでおすすめしません
抽象度は下げましょう
<b></u>

単純にこのときは給与が低い
そして給与よりもキャリアが不安

そして転職へ(できれば天職へ)。。
# 転職後(8-12月)
IT業界で自動車NG,PLにはなりたいです。という状態で
なんとか決まりました。ありがとうエン転職 スカウト機能
最初はJavaでwebアプリでした！
このとき、業務で未経験ながらも先々に勉強してましたし
Javaは得意だから大丈夫で行きまして、
実際、問題なかったです。読めるわ書けるわ
（流れ的にだめだと思ったでしょ！？）

ただ、改修案件だったので行けたんかなというところと
設計書がまともでなく時々、嘘が混じってるのがやばかったですね。
おそらく課題等で決まった事が反映されてないんだと思います。

結果コードから逆追いで仕様を理解し既存仕様で困ったら
リーダーに即相談しました。
（一切答えは出なかったけど）

それはさておき注意も出てきました。

- 嘘 という言葉が刺々しい
- 周りのソースと合わせて(改行含め)

それぞれの注意は身に沁みさせて今後も気をつけていきます。<br/>

言葉は主観すぎて永遠の謎


# 今後に向けて
言語やフォーマットは異なれど、進め方は同一で結局学べたのは以下くらいです。。

- 単体テストフレームワーク, mockの使い方
- ライブラリ調査のやり方
- SQL再学習
- 避けてたC# Linq
- INCOTERMS 2020
- デザインパターン(ファクトリ, リポジトリ, DI)

なので引き続きプログラマやりつつ
上司の仕事に首突っ込んでPLになっていけたらなと
資格持ってたらできるわけではないですが基礎知識を身につける意味合いで
資格取ってPL, PMもどきでいいからやらしてくれと言いながら
仕事の出来を高めていければと！！
js勉強ロードマップ

# JSロードマップ
➀progateを復習
➁改訂3版JavaScript本格入門　～モダンスタイルによる基礎から現場での応用まで
➂Udemy ガチで学びたい人のためのaJavaScriptメカニズム
➃サバイバルTypeScript
上記を4月までに終わらせる
ロゴメーカーを作ってみた！それぞれの用途に合わせてカスタマイズできるAIツール！

# Markdown AIで会社ロゴメーカーを作ってみた！
タイトルの通りMarkdown AIで会社のロゴメーカーを作ってみました。
**作業時間は30分ほど**で作成できたので、以下のリンクから触ってみて下さい！

https://mdown.ai/content/587bd1d4-2eb7-4a47-ad5a-e22591543c63

# 作り方について
今回は、**AIコードエディタ「Cursor」をメインツールとして使用しました**
このエディタは非常に便利で、コードの生成や修正をスムーズに行えます。
AIの力を借りることで、ほとんどの業務を効率化できる時代がすぐそこまで来ているのだと改めて実感しました。

Markdown AIの使い方についてはその他の記事に詳しく記載しているので、下記のURLを参考にしてみて下さい。

**【MarkdownAIの誰でもわかる使い方】**

https://qiita.com/mdown_ai_jpn/items/d3e281565c876a0bd64f

**【Markdown AI_画像生成の使い方ガイド】**

https://qiita.com/mdown_ai_jpn/items/b4411719cc39e0741b7f

**【Markdown AI_画像生成サイトの作り方】**

https://qiita.com/mdown_ai_jpn/items/8589a4089757904d4fed

# Markdown AIの魅力について
**利点**
- **サーバー構築不要：**
面倒な設定なしでサイトを公開可能。
- **AI実装が簡単：**
プロンプト入力だけで多彩な機能を追加可能。
- **使えるAIが複数ある：**
用途に応じて最適なAIを選べて、掛け合わせて使用することも可能。
- **拡張性とカスタマイズ性：**
細かな設定で自分好みに仕上げられる。
- **無料で使用できる：**
普段は課金が必要になるAIの使用回数が無制限。
- **共有が簡単：**
作成したコンテンツはリンクを共有するだけ。

上記の中でも、特に注目すべきは **「拡張性があり、カスタマイズできること」と「複数のAIが使えること」** です。

## Markdown AIの拡張性とカスタマイズ性
AIを多少触ったことがある人は誰もが考えることがあるとは思う、 **「現在やっている作業をAIで効率化出来ないかな？」** この考えを実現できるのがMarkdown AIの **「拡張性」** だと思っています。

今回作ったロゴメーカーを例に出すと、
**「会社の名前以外に業種やロゴのスタイルの選択欄も実装したいな」
「使用者が自分でプロンプトを入力できる項目が欲しいな」**
といったアイデアが浮かんだ際にも、Markdown AIの拡張性を活かして、スムーズに機能を実装できました。

この他にも、
**「決まったフォーマットで記事をかけるAIにカスタマイズしたい」
「白い髪色で近未来を舞台にした女性の画像を生成したい」
「自社に特化したAIを設定してプレゼン資料を作りたい」**
など、それぞれの場面に合わせてAIをカスタマイズできます。

また、今まで**GPT-4o mini、GPT-3.5-turbo、Gpt-4、Claude、Gemini、Dall-e-3など複数のAI実装やMermaid記法の対応**など、様々なアップデートを行ってきましたが、今後も新たなAIが登場してきた際も、Markdown AIの「拡張性」ならその都度アップデートでき、このAI時代の進化に合わせて成長していけます。

# 最後に
Markdown AIを活用すれば、**誰でも簡単にAIをカスタマイズでき、それぞれの用途に合わせたサイトやツールを作成**できます。この公式アカウントの記事以外にも、様々な方がMarkdown AIについて活用の記事を書いてくださっているので、ぜひあなたのアイデアも形にしてみてください！
チーム開発におけるコミュニケーションで大切にしたいこと４選



# チーム開発におけるコミュニケーションで大切にしたいこと４選


### 目次

- はじめに
- 前提
- 大切なこと４選


## はじめに
### 私の経験値について
- 自分は今まで**10回以上のチーム開発にジョイン**した経験があります。具体的には技育campのようなハッカソンや実務のアルバイトなどです。**そのほとんどが[初対面]×[オンライン]というチーム開発を行う上ではかなり難易度の高い環境**でした。これらの経験の中から大切にしたいこと**４選**を抽出しましたので記録として残しておきます。

### この記事の目的
- この記事の目的は「これらを取得すれば万全の状態になる！」というような方法論を説くための記事ではなく、「コミュニケーションで大事なこと！」系の記事の一つのデータになることを目的としています。理由としてはコミュニケーションとはその人の色がよく出るものなので**その人のコミュニケーションの最適解はその人にしか出せません**。しかし、多くの記事を見ることで「なんとなくの道しるべ」は見えるはずだからです。

## 前提
- **コミュニケーションとはキャッチボールです**。もしあなたがコミュニケーションの最適解を見つけることができたとしても、それを円滑なチーム開発につなげるためには、**相手も最適解を見つけているという前提があります**。
もし相手が最適解を見つけてなさそうであれば「何か予測不能の事態が起きるぞ・・・」という心構えを持っておく必要があります。

## 大切にしていること6選
### １：明確に意図を伝える
- **「明確に意図を伝える」ことは意外と難しい**です。それでいて**これがないとチーム開発は滞ってしまう**というほど大切な要素です。もしあなたがチーム開発を行ったことがなければ是非一度試してもらいたいのですが「言葉だけ」で自分のアイデアを他人に伝えるなんでことは**ほぼ不可能**だと思ってもらって大丈夫です。

    対策として最も有効なのはもちろん実際に制作物を持ってきて「こんなの実装したいけどどうかな？」と伝えることです。しかしこれは初心者にとっては制作物を作るだけでも時間をとられてしまうので効率的とはいいがたいかもしれません。

    個人的に最もおすすめなのは「Figma」というプロトタイプ開発に特化したツールを使用することです。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758326/053247ff-33bc-c9e0-3134-a90f1803eaf4.png)

    これを用いることで単純なフロー処理も共有できますし、UIなども作成できるので実装イメージの共有がしやすくておすすめです。

### ２：報連相は早めに行う！
- 報連相は早めに行いましょう！
    - 自分がミスしてしまってそれを「チームの人に共有するべきか迷う・・・自分で解決するべきなのでは・・・？」といって報告を遅らせていく。
    
    - 会議で言われたことを忘れてしまった。でも改めて聞いたら怒られそうで聞くのが億劫だ。。。

    上記のような理由で報連相を遅らせてしまうことは誰にでもあることです。僕もそうでした。でもすぐにほかの人を頼りましょう！**頼りすぎは良くないですが意外と周りの人は助けてくれます**。もしそれで空気が悪くなったらそのチームは微妙だと思っていいです！**むしろそれを遅らせてしまう方がより恐ろしい未来が待っています。。。**

↓開発の最後の方になって足りないことがたくさんあることに気づいた人
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758326/1e75d01e-dde3-4927-de77-70e2e6f809d3.png)


### ３：反応は明るく元気よく！
- チーム開発では普段の３倍は反応をよくしましょう（当社比）
    反応は非常に大事です。当たり前かもしれませんがこれがあるかないかだけで**チームの雰囲気、引いては開発の円滑状況は全然違います**。わからないものには「わかりません！どういうことですか？」と、どんどん突っ込みましょう！**こういう「質問できる雰囲気」を作っていくのは非常に大事です**。
### ４：相手への思いやりは忘れない
- なんかいろいろ話しましたが**ぶっちゃけ一番チーム開発で大事なのはこれです**。一緒に作業している仲間はAIや機械ではなく**人間**です。もちろんこっちがミスしなくてもあっちが勝手にミスして開発状況が遅れるなんてことはごまんとあります。その時に
 
    **「わかりました。では改めていつまでにできるか教えてください」**
    よりも
    **「オッケー！むずいよね！ちなみにいつまでにだったらできそう」**
と一言添えるだけで全く違います。

この部分だけを切り取れば、「本当にそれ意味あるのか？」と疑問に持たれる方も多いかもしれません。しかし、僕の経験上思いやりを持って接したほうが明らかに開発状況が良いです。
また、開発の後期の方ではみんな心に余裕がなくなります。**そこでどれだけ自分が思いやりを持ってあげられるかでチーム全体を支えられることにもつながります**。これはエンジニアリングというよりも「人間力」かもしれませんね。

## まとめ
ここまでに話したことは僕の経験上にすぎません。なので冒頭でも記述しましたが皆さんの**コミュニケーション最適解**を実際に開発経験を通してぜひ見つけてみてください！

ただこの記事を読んだ人がただ荒波に木のボートだけで挑んだ過去の自分より楽にコミュニケーション最適解を発見できることを祈っています。
PGスタイルシリーズ：導出項目を知る

## 変更しにくいPG・読みにくいPG

変数に着目すると・・・
* 謎の変数が多い
* 同時に更新しないといけない変数が多い

----
## その変数、減らせます！


----
## 導出項目とは

* ある項目から算出できる項目
* 導出項目の値を永続化するのは一般的には避けるべき
  →例外はスナップショットを残す必要があるとき

----
## 分かりやすい例：日本人のフルネーム

* データ上は苗字と名前の２つに分けて保存
* フルネームが欲しいときは、毎回、苗字と名前を連結する

----
## 導出できる項目を変数にしてしまうことのデメリット

* 更新を漏らすとバグになる

----
## 考え方

* 意識せずフルネームのような項目を変数に持たせてしまっているのはよくあること！
* 「これ、導出項目じゃない？」と考える癖をつけるのが大事

----
## 導出項目をどう表現するか

* C#の場合、読み取り専用プロパティが便利

```C#
readonly string familyName;
readonly string firstName;

string fullName
{
    get => familyName + " " + firstName;
}
```

これはものすごくよく使う書き方。ぜひ覚えて欲しい。


----
## デメリット(1/2)

* 計算量が必要
  →場合によっては性能に影響が出るかもしれない

----
## デメリット(2/2)

* 極端な話、DBには全てのデータあるので、キー以外は導出項目と言えないこともない
* 性能とのトレードオフは常に意識する必要がある
* とはいえメモリ上で計算が完結する場合は、性能を意識する必要はほぼない

----
## 注意点

* 導出する際の計算に副作用が伴う場合は、毎回計算するのは不適切
  副作用：通信／他の変数に書き込みが生じる　など

----
## 最後に

* 導出項目はシステム開発全体で広く使える考え方
* 性能とのトレードオフを意識して設計するのが難しくかつ楽しい
【Heroku】git push heroku mainでerror: failed to push some refs to 'https://git.heroku.com/*****.git'と出る原因

## 問題

Herokuへのデプロイ時、以下のエラーが発生しました：

```bash
git push heroku main
error: failed to push some refs to 'https://git.heroku.com/my-app-name.git'
```

## 原因

私の場合Gitのバージョンが2.42.1と少し古いバージョンだったのが原因でした。

```bash
git --version
# git version 2.42.1
```

## 対処

Homebrewでgitをアップデートしたところエラーが解消し、デプロイに成功しました。
```bash
brew upgrade git
```

同じエラーでお困りの方は、Gitのバージョンアップを試してみてください。
Web Serial APIを使ってブラウザ上でUSBバー/QRコードスキャナから入力

つまるところ


1. 先日M5Stackのハンズオンに参加したらなんかChromeで使える標準APIで「[Web Serial API](https://developer.chrome.com/docs/capabilities/serial?hl=ja)」っていうのがあるらしく、ブラウザだけでシリアル通信できるらしい
1. それだよそれ！それ使ったらキーボードの入力モードやらによらなくて便利に爆速な入力ができるようになりそう！やったぜ

# HIDなバーコードリーダーはツライよ

ここに文句を死ぬほど書く

- HIDなバーコードリーダー、それはそれで便利なんだが動作が遅いし逆に入力速すぎてOSだかが取りこぼしたりもしてイマイチなところ結構ある
- ウェブの入力フォームだと日本語入力の制御もしづらいし、日本語ON・OFFさせるのも全角で入力されても問題なくするのとかあほらしくてしょうがねえよ

# 今回の動作環境

仕事で何台か買ってみたが、できるやつとできないやつがあるみたい。とりあえず今回は以下の組み合わせでできた。

- macOS 15.2 Sequoia
- [NetumScanハンドヘルドUSBQRバーコードスキャナ](https://www.amazon.co.jp/dp/B09KLRFLTF)
- Chrome バージョン: 131.0.6778.205（Official Build） （arm64）

# USB QR バーコードスキャナをシリアル通信モードにする

付属のマニュアルに「このバーコードを読むと、そのモードに切り替わるよ」というバーコード一覧が載っており、これをスキャンすると「USB-KBWモード(HIDモード)」から「USB COMモード」に切り替わるらしい。おお確かにかわっている。

## before

![スクリーンショット 2025-01-07 19.08.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50220/4aaa32cf-7875-02c9-049f-1c12b98913c2.png)


## after

![スクリーンショット 2025-01-07 19.07.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50220/f3b10778-f9b2-bfdc-d593-6ca6e389ba3f.png)


# シリアルポートを確認する

なるほど。 `/dev/tty.usbmodemAPP_0000000001` がそうらしい。


``` zsh
# まずスキャナをUSBから抜く
[pharaohkj] $ ls -l /dev/tty* > ttylist1.txt

# そしてスキャナをUSBに挿す
[pharaohkj] $ ls -l /dev/tty* > ttylist2.txt

# diffをみる
[pharaohkj] $ diff ttylist1.txt ttylist2.txt
11a12
> crw-rw-rw-  1 root       wheel   0x9000014  1  7 18:29 /dev/tty.usbmodemAPP_0000000001
69c70
< crw--w----  1 pharaohkj  tty    0x10000008  1  7 18:28 /dev/ttys008
---
> crw--w----  1 pharaohkj  tty    0x10000008  1  7 18:29 /dev/ttys008


```

# このシリアルポートに接続して試す

以下のコマンドで接続して、適当にバーコードを読んでみる。おおバッチリ読めてる。screenを抜けるのは Ctrl+a 後 k。

``` zsh
[pharaohkj] $ screen /dev/tty.usbmodemAPP_0000000001
```

# このシリアルポートにブラウザからアクセスする

[このページ](https://developer.chrome.com/docs/capabilities/serial?hl=ja) にアクセスすればなんでも乗ってるしできる。その通りにやる。

と、その前に、Chromeを起動して `chrome://device-log/` を開く。おお。なんか便利そう。この無骨さがいい。

さて、そしたらこの画面にて、デベロッパーツールを開き、 `Console` タブを選択して、jsのコンソールに入る。

## ブラウザからポートの選択

で以下のコードを実行すると、なんと接続できるポート一覧がでてきて、選べばよい。すげー便利やん。これなら本番導入時も楽そう。↑で調べたデバイスを選択しておく。


``` js
const requestedPort = await navigator.serial.requestPort();
```

↑で↓こんなのがでる。

![スクリーンショット 2025-01-07 19.17.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50220/231a0425-5512-f5e5-8228-ae6f051b3259.png)

## ポートから読む

上記Googleのページに乗ってるサンプルどおりやればOK。

器機選択から続けて以下を実行すると、何事もなかったようにawaitされており、バーコードリーダーでバーコードを読めばよい。

``` js
await requestedPort.open({ baudRate: 9600 });

const textDecoder = new TextDecoderStream();
const readableStreamClosed = requestedPort.readable.pipeTo(textDecoder.writable);
const reader = textDecoder.readable.getReader();

// Listen to data coming from the serial device.
while (true) {
  const { value, done } = await reader.read();
  if (done) {
    // Allow the serial port to be closed later.
    reader.releaseLock();
    break;
  }
  // value is a string.
  console.log(value);
}
```

おお、読めてる読めてる。QRコードもバッチリよめる。そしてめっっっちゃはやい。エディッタを開いてHIDで入力すると、入力しそこねとかあったりするが、全然そんなのなさそう。

あとはこれを `console.log(value)` せずに、いい感じの入力欄に `setText(value)` してやればよかろう。やったぜ。
自分用メモ_VBA 指定のフォルダ配下のファイルの値の個数を一覧出力

```VB
Sub CountValuesInDColumn_Recursive_AllFiles()
    Dim folderPath As String

    ' 処理対象のフォルダ（変更してください）
    folderPath = "C:\Your\Folder\Path\"

    ' イミディエイトウィンドウの内容をクリア
    Debug.Print "ファイル名, 値の個数"

    ' 再帰的にフォルダを探索
    ProcessFolderAndFiles folderPath

    ' 完了メッセージ
    Debug.Print "処理が完了しました。"
End Sub

Sub ProcessFolderAndFiles(folderPath As String)
    Dim fileName As String
    Dim subFolder As Object
    Dim fso As Object
    Dim folder As Object
    Dim wb As Workbook
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim nonEmptyCount As Long

    ' フォルダパスの末尾に\がない場合、追加
    If Right(folderPath, 1) <> "\" Then
        folderPath = folderPath & "\"
    End If

    ' ファイルシステムオブジェクトの作成
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set folder = fso.GetFolder(folderPath)

    ' 現在のフォルダ内の「AAA_」で始まる .xlsx ファイルを処理
    fileName = Dir(folderPath & "AAA_*.xlsx")
    Do While fileName <> ""
        ' ファイルを開く
        Set wb = Workbooks.Open(folderPath & fileName)

        ' 「第1回目」シートが存在するか確認
        On Error Resume Next
        Set ws = wb.Sheets("第1回目")
        On Error GoTo 0

        If Not ws Is Nothing Then
            ' D列の最終行を取得
            lastRow = ws.Cells(ws.Rows.Count, "D").End(xlUp).Row

            ' D列の値の個数をカウント（空白を除外）
            nonEmptyCount = Application.WorksheetFunction.CountA(ws.Range("D1:D" & lastRow))

            ' 結果を出力
            Debug.Print fileName & ", " & nonEmptyCount
        Else
            ' 「第1回目」シートが存在しない場合のメッセージ
            Debug.Print fileName & ", シート「第1回目」が存在しません"
        End If

        ' ファイルを閉じる（保存せず）
        wb.Close SaveChanges:=False

        ' 次のファイルに進む
        fileName = Dir
    Loop

    ' サブフォルダを再帰的に処理
    For Each subFolder In folder.SubFolders
        ProcessFolderAndFiles subFolder.Path
    Next subFolder
End Sub

```
煽ってくる電卓を作ろう

どうもAtsu1209です。
今回は煽ってくる電卓を作ろうと思います。
具体的には 一桁 + 一桁などの簡単な計算のときに煽ってきたり
などいろいろな場面で煽ってくるようにします。

# 作る

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>煽ってくる電卓</title>
</head>
<body>
    <div id="calculator">
        <h2>煽ってくる電卓</h2>
        <input type="text" id="inputField" placeholder="式を入力してください" readonly />
        
        <div class="row">
            <button onclick="appendValue('7')">7</button>
            <button onclick="appendValue('8')">8</button>
            <button onclick="appendValue('9')">9</button>
            <button onclick="appendValue('+')">+</button>
        </div>
        <div class="row">
            <button onclick="appendValue('4')">4</button>
            <button onclick="appendValue('5')">5</button>
            <button onclick="appendValue('6')">6</button>
            <button onclick="appendValue('-')">-</button>
        </div>
        <div class="row">
            <button onclick="appendValue('1')">1</button>
            <button onclick="appendValue('2')">2</button>
            <button onclick="appendValue('3')">3</button>
            <button onclick="appendValue('*')">×</button>
        </div>
        <div class="row">
            <button onclick="appendValue('0')">0</button>
            <button onclick="appendValue('.')">.</button>
            <button id="clear" onclick="clearInput()">C</button>
            <button onclick="appendValue('/')">÷</button>
        </div>
        <button id="equals" onclick="calculate()">=</button>
        
        <p id="result">結果: </p>
    </div>
  <script>
            function appendValue(value) {
            document.getElementById("inputField").value += value;
        }
        
        function clearInput() {
            document.getElementById("inputField").value = '';
            document.getElementById("result").textContent = '結果: ';
        }

  </script>
</body>
</html>
```
とりあえず`計算結果が全然違う電卓`からHTMLとJSを引っ張ってきました。

https://atsu1209.github.io/shit-dentaku/

ここから煽り要素を入れていきます。

# 煽る
```js
            for (let i = 0; i <= 9; i++) {
                for (let j = 0; j <= 9; j++) {
                    if (input === `${i}+${j}`) {
                        message = "こんなのもできないの?ww";
                    }
                }
            }
             for (let i = 0; i <= 9; i++) {
                for (let j = 0; j <= 9; j++) {
                    if (input === `${i}-${j}`) {
                        message = "こんなのもできないの?www 草生えるww";
                    }
                }
            }
            for (let i = 0; i <= 9; i++) {
                for (let j = 0; j <= 9; j++) {
                    if (input === `${i}*${j}`) {
                        message = "義務教育失敗";
                    }
                }
            }
            for (let i = 0; i <= 9; i++) {
                for (let j = 0; j <= 9; j++) {
                    if (input === `${i}/${j}`) {
                        message = "電卓使う必要ある?www";
                    }
                }
            }
```
まず一桁どうしの計算の場合に実行されるようにした

なにかパワーアップがあればコメントお願いします。
WordPressのインストールと設定(ConoHa VPS・AlmaLinux 9.4)

ConoHaのVPSでWordPressをインストールして設定する。

以下の環境でセットアップしていく。
**〜VPS 1Gプラン〜**
メモリ：1G
CPU：仮想2Core
ストレージ：HDD 100GB
OS：AlmaLinux 9.4

# おことわり
筆者はCentOS 7からAlmaLinux 9へ移行したため、CentOS 7のコマンドで利用できる部分はそれらを用いる。

# 1．WordPressファイルのダウンロード
WordPressのサイト（<a>https://ja.wordpress.org/download/</a>）にアクセスし、最新のバージョンを確認する。
<img width="373" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/269855/f6cd0c4d-1bc3-e589-7f94-326b9e23baf5.png">
2025年1月現在の最新バージョンは<b>"6.7.1"</b>。
続いて、次のコマンドを実行し、WordPressのファイルをダウンロードする。
"6.7.1"の部分はダウンロードするバージョンに応じて変更する。

```
[root@abc ~]# wget https://ja.wordpress.org/wordpress-6.7.1-ja.zip
```

```
```

# 2．ファイルの展開と設定
次のコマンドを実行し、ダウンロードしたファイルを解凍する。
"6.7.1"の部分はダウンロードしたバージョンに応じて変更する。

```
[root@abc ~]# unzip wordpress-6.7.1-ja.zip
```

```
```

次のコマンドを実行し、"wordpress"ディレクトリへ移動する。

```
[root@abc ~]# cd wordpress
```

次のコマンドを実行し、所有者を変更する。

```
[root@abc ~]# chown -R [ユーザ名]:[ユーザ名] *
```

次のコマンドを実行し、パーミッションを変更する。

```
[root@abc ~]# chmod -R g+w *
```

# 3．動作確認
ブラウザでWordPressをインストールしたアドレスにアクセスしてみる。
<img width="1440" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/269855/d9a7c133-fdbe-6823-a2b7-99aeeef035dc.png">

# 4．初期設定
"さあ、始めましょう！"をクリックする。
<img width="1440" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/269855/d9a7c133-fdbe-6823-a2b7-99aeeef035dc.png">

データベース名、データベースのユーザー名、データベースのパスワード、データベースのホスト名、テーブル接頭辞を入力する。
<img width="1439" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/269855/3e7c1fe8-db05-decc-15fb-ebde25f5813f.png">

"インストール実行"をクリックする。
<img width="1440" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/269855/36e52a98-e4be-81d5-5bcf-ea276ffea8bb.png">

サイトのタイトル、ユーザー名、パスワード、メールアドレスを入力し、"WordPressをインストール"をクリックする。
<img width="1440" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/269855/4e88faff-8d62-b26c-f717-4ed4d2a73042.png">

"成功しました！"が表示されたらログインしてカスタマイズする。
<img width="1440" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/269855/70036177-452e-76c1-ae17-7b7cacdef1b2.png">
【Slack】無料プランでも特定チャンネルにメールを転送する方法（ロボヨメ様のコードをちょっと修正）

ロボットのヨメになりたい（ロボヨメ）様のこちらの投稿を使わせていただきまして、
非常に助かりました！

- [【全プラン対応】特定のGmailを特定のSlackチャンネルへ連携【GAS】](https://roboyome.com/slack-gmail-gas/)
  - [無料プランでも特定チャンネルにメールを転送する方法](https://roboyome.com/slack-gmail-gas/#toc4)


しかしGASの単体動作確認時に次の事象が発生してしまいました。。
- ゴミ箱に捨てた該当ラベルのメールも再送してしまう。
- 単体動作の度に、該当ラベルのメールを全て再送してしまう。

つきまして、これら修正をchatGPTに追加してもらいました。

（修正後のGASコード）
```javascript
// 初期設定
const HOOK_URL = 'https://hooks.slack.com/services/*******/*****************'; // 取得したWebHooks URL

function main() {
  // 検索条件（該当ラベルのメール, ゴミ箱は除外）
  var searchTarget = 'label:***** is:unread -in:trash';

  GmailApp
    .search(searchTarget)
    .forEach(function (thread) {
      thread.getMessages().forEach(function (message) {
        if (!message.isUnread()) return; // 新着メールかどうか確認
        send(message);
      });
      thread.markRead();
    });  
}

function send(message) {
  var sendText = '【件名】\n' + message.getSubject()
               + '\n【本文】\n' + message.getPlainBody();
  
  var jsonData = {
    "username" : message.getFrom(),
    "text" : sendText
  };

  var options = {
    "method" : "post",
    "contentType" : "application/json",
    "payload" : JSON.stringify(jsonData)
  };

  UrlFetchApp.fetch(HOOK_URL, options);
}
```

以上です。
【クエリビルダ：拡張表現】Webレポートにアイコンを表示する

# はじめに #
この記事では、WEBレポートにアイコンを表示する方法を紹介したいと思います。
ある数値に応じて、異なる色のアイコンを表示してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/e66bcb94-e797-0715-d21a-dbbe38bee0fc.png)

# クエリの定義 #
SharperlightパブリッシャーでWEBレポートを作成し、このようなクエリを設計しましょう。
これはシンプルなデータセットなので、「カスタム定義のデータセット」オプションを使用してデータセットを準備しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/6610d394-48bb-3b97-e2a6-147b573354bd.png)

データセットはこのようなものです。
```
"製品::String","在庫数::Number"
"8G　材木用ネジ 25mm",55
"8G　材木用ネジ 28mm",120
"8G　材木用ネジ 30mm",80
"8G　材木用ネジ 35mm",10
"8G　材木用ネジ 40mm",32
"8G　材木用ネジ 45mm",500
"8G　材木用ネジ 60mm",75
```
出力アイテムを設定しプレビューしてみると、このようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/096108f7-bc42-b135-6582-42ce412b5447.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/5d44e8c6-8e42-73a0-4797-975c8844e040.png)

# 拡張表現の定義 #
アイコンを表示する拡張表現を追加します。

## テンプレート ##
関数一覧からテンプレートを探します。検索フィールドに**icon**と入力して対象を絞り込みます。
`Display Blue, Green, Yellow, Orange, Brown, Grey and Red Icon in cell`をダブルクリックし、そのテンプレートを拡張式関数の構文フィールドに転送します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/b0c0962d-2662-97ab-953a-3988593b1b79.png)

## 編集 ##
在庫数が100以上の場合は、緑色のアイコンを表示します。
在庫数が100未満で30以上の場合は、黄色のアイコンを表示します。
在庫数が30未満の場合は、赤色のアイコンを表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/eaf2e79a-c9da-c2a0-f18c-3c5d3a1f8394.png)
```
Switch( True
,{%在庫数} >= 100, "_icon:StatusGreen"
,{%在庫数} < 100 AND {%在庫数} >= 30, "_icon:StatusYellow"
,"_icon:StatusRed"
)
```
ここで使用するアイコンは、Sharperlightに同梱されているものです。
アイコンは以下のフォルダにインストールされています。
```
C:\ProgramData\SharperLight\ServiceResources\Images
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/f307199b-58c0-30a7-c73a-baf778c1d268.png)

参照形式は、``"_icon:アイコンのファイル名"``です。


# プレビュー #
プレビュー機能で確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/651e4832-6d06-fd3a-d76c-8f8b252f4a3b.png)

# Webブラウザで閲覧 #
クエリを保存し、さらにWEBレポート定義も保存します。
Sharperlightサービスを起動し、WEBブラウザでWEBレポートを表示します。
このようなWEBレポートが表示されるはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/15704187-93c3-bb14-98ad-99c58aba4932.png)

# おわりに #
この他にもSharperlightには多くの拡張表現関数があり、それらを使ってより魅力的なウェブレポートを作成することができます。
EasyEDA Pro Online 版を使う その7 プロジェクトを共有する


:::note
EasyEDA 記事の記事一覧：

#「EasyEDA Pro を使ってみよう！ 記事 index」

https://qiita.com/nanbuwks/items/1832e7dd815be5675a52

併せてご覧ください。

:::

オンライン版の強みとして、プロジェクトを共有してみます。

以下の2つのやり方を試してみます。

- プロジェクトメンバーを招待する
- オープンソースハードウェアとして公開する


# プロジェクトメンバーを増やす

EasyEDA の、共有したいプロジェクトから

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/4d9b420a-b4a1-bd35-875a-d086ec50bafc.png)

 Project の Basic Properties の歯車マークを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/7647eb51-45e0-c230-3201-946fb4db2d33.png)


EasyEDA の Webページが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/2af5afac-6892-a140-1dda-1b77d0a88a2a.png)

「Members」を押すと、自分が表示されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/f4a0b756-71c5-0e59-d0d2-307b125d9400.png)

「Add Member」で、検索をして招待するか、招待リンクやQRコードを使うことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/92e72cd8-016c-dec8-ea00-3f1306db7464.png)

# オープンソースハードウェアとして公開する

さきほどの EasyEDA の Webページから「Share」を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/2af5afac-6892-a140-1dda-1b77d0a88a2a.png)


プロジェクトの内容を書いていきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/700ea62c-28a3-fcae-d52d-a0eb59213ed0.png)

Project description はある程度分量が無いとダメみたいです。とりあえず空っぽのプロジェクトを公開というのは難しそうで、ある程度モノになってから公開するのが良さそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/ba943388-dd3c-4507-a3d6-36daf902cf92.png)

書けたら「Publish and Share」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/4e560e07-a603-2317-3718-34a1b298828a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/5469ae00-7b59-0e04-e580-96883ebcfad3.png)

> The SCH/PCB preview image wasn't generated successfully. Please save your project again in the editor before publishing it.


プロジェクトファイルが保存されていない場合、このようなエラーが出るようです。
「Operation Instructions」リンク先を読んで、EasyEDA から All Save を改めて行い、保存し直します。

投稿が成功したら、レビュー待ちになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/90c80564-d726-a993-ece4-72023954aef4.png)

レビューが終わってなくても、Share project から

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/6798985c-a1ed-55a0-48f9-103a92a915c4.png)

このリンクを使うと他の人にプロジェクトを共有できるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/adc29512-b724-db35-8458-234ea1e2726e.png)

oshwlab.com に行くと、既にプロジェクトが公開されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/fb5bf247-83c5-59ec-c155-fb7f51578c6b.png)

特にログインしていない第三者からも、プロジェクトは見えるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/b0f4a07d-f4fc-1b38-b949-275f3bdefc48.png)

そのままEasyEDAを開くこともできました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/a1102e69-4f6a-44ee-0a12-715906389ddd.png)
IndexedDBについて調べてみた

## IndexedDBについて
- 非同期で実行される
- ユーザーが手動で削除しない限り永続的に存在する
- トランザクションにも対応
- 削除はキャッシュ削除のタイミングでも消える

## 対応ブラウザとバージョン
https://caniuse.com/?search=indexedDB

### アクセス方法
#### 容量の確認
開発者ツールのアプリケーションタブ => ストレージ
![スクリーンショット 2025-01-16 10.04.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844247/53f632fb-3745-33ac-561d-c86a413b7e7b.png)
#### 個別のストレージ
ストレージセクションのIndexedDBをクリックする
![スクリーンショット 2025-01-16 10.04.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844247/dbcf48f7-8770-c33d-dbb8-58ff8f3b63e1.png)



### 容量の上限
- 制限を超えた場合は、ブラウザによって古いデータから自動的に削除される
- 一般的に数十から数百MBのデータを保存可能
- およそ(ディスクドライブ) * 50% - (その他のローカルストレージ等)
- 一定容量を超えるとIndexedDBに登録できなくなる
- 容量を超えても他のサイトには影響はない

※下記の参考リンクからの情報です

### 考慮すべき点
- パスワードや個人情報などの敏感なデータを直接保存することは避ける

### セキュリティリスク
- Cross-site scripting (クロスサイトスクリプティング)
- CSRF (クロスサイトリクエストフォージェリー、Cross-Site Request Forgery)
- セッションハイジャック
- 同一オリジンポリシーの限界

### 便利なサイト
IndexedDB書き込みとか削除とかを試せる

https://skybeje.net/indexeddb_limit_test/

### 計算方法
X: ストレージの総容量（MB）
Y: 1ファイルのサイズ（kB）

格納可能件数数 ≒ (X * 1024) / Y



### 具体例
googleドキュメントのオフライン保存はIndexedDBを利用している

## 参考
https://w3c.github.io/IndexedDB/

https://www.techpit.jp/courses/111/curriculums/114/sections/857/parts/3159

https://iwatendo.hateblo.jp/entry/2018/02/15/215811

https://qiita.com/tanimoto-hikari/items/5fd81962153531e8275e

https://developer.mozilla.org/ja/docs/Web/API/IndexedDB_API

https://developer.mozilla.org/ja/docs/Web/API/Storage_API/Storage_quotas_and_eviction_criteria
Databricks WebTerminalを有効化する

# はじめに
Databricks AppsでSQL Warehouseを導入しようと思った際に、
SQLAlchemy + alembicでマイグレーションを実行する環境がどこかないかと思い探すと、WebTerminaなる機能があることを知りました。
ただ、初期状態だと有効化されていなかったので、有効化する方法をまとめます。

# 手順
:::note info
以下手順はWorkspace管理者権限で実行しています。
:::
1. Databricks Workspaceからユーザアイコンをクリック、設定を開く
   ![01_user_setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/27c31a6e-227a-56b5-12bc-5431cbd1607d.png)

2. 画面左側メニューからクラスター>汎用クラスター>Webターミナルをオフからオンに変更
   ![02_web_terminal_on.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/93cf6081-818d-87a7-671f-3db02d29a746.png)



# 使い方
:::note info
Web Terminalはサーバレス環境では使用できません
:::
1. クラスターから適当なクラスタをPersonal Computeで作成
   ![03_create_cluster.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/964bd552-72c0-3245-aa6f-23576e79a3ad.png)

2. ワークスペースから適当なPythonファイルを開く
   ![04_open_python_file.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/6c67d16a-a1cb-f9ec-cd24-41910d3905e4.png)

3. 画面右上の'接続済み'をクリックし、作成したクラスタを選択
   ![05_connect_cluster.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/1805483c-d621-08ee-b534-6b97f963aa67.png)

4. 表示からWebターミナルをクリックすると、Web Terminalが起動します
   ![06_click_terminal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/ae80a31e-f47a-33a0-5f61-c1da10e97433.png)


## Web Terminal 初期状態
起動したターミナルで以下コマンドを実行すると、パス、Pythonのバージョン、パッケージ一覧が表示されます。
インスタンスには自動で自分のホームディレクトリ配下がマウントされているようです。
(alembic, SQLAlchemyは初期状態でインストールされていました。fastapiはなかったです。)
```
pwd
// /Workspace/Users/<username>

python --version
// Python 3.12.3

pip list
// Package    Version
// ---------- -------
// ...
// alembic 1.14.0
// ...
// SQLAlchemy 2.0.30
// ...
```

# まとめ

Databricks WebTerminalについて、利用できるように設定してみました。

1. 設定と有効化
   - Workspace管理者権限で設定可能
   - 汎用クラスター設定から簡単に有効化できる

2. 利用条件と環境
   - サーバレス環境では利用不可
   - Personal Computeクラスターが必要

3. 初期環境の特徴
   - Python 3.12.3が標準搭載
   - alembic、SQLAlchemyなどの主要パッケージが事前インストール済み
   - ユーザーのホームディレクトリが自動マウント

# 参考
- [Run shell commands in Databricks web terminal
](https://docs.databricks.com/en/compute/web-terminal.html)
CMOSゲートの消費電力

## 公式
$P = N *\alpha C V^2 f$
$N:$ゲートの数。例えば1億個のCMOSゲートが1チップの中にあると考えればよいです。

$\alpha:$活性化率。すべてのインバータはクロックのたびにon-offをしているわけではない。よって実際には活性化率分少ない消費電力となります。

$C:$静電容量。例えば、ゲートが3入力(下図のイメージ)で、各入力容量が$5fF$で、出力容量が$8fF$だとします。それぞれのキャパシタにおいて電力が消費されるので$Ctotal = 3Cin+Cout = 3*5f + 8f$

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787219/ab4c003f-e6eb-e8ec-93c8-ea3c0ac660c6.png)

$V:$電源電圧
$f:$周波数。消費電力は、1秒間の消費エネルギーなので、上記の$\alpha CV(J)$が1秒間にf回行われます。



## 例題
1億ゲートのVLSIについて、各ゲートが3入力ゲート、入力容量$5fF$、出力容量$8fF$である。活性化率がすべてのゲートで$\alpha =0.1$、動作周波数が$1000MHz$、電源電圧が$0.9V$とするときの消費電力を求めよ。

[解答]
$P=1億*0.1 *(3 *5f + 8f) * 0.9^2 = 186W$
Azure Communication Service を使って curl で Email 送信

# はじめに

Azure Communication Service で Email 送信を試す場合、基本的には下記ドキュメントにあるように Az CLI や、各言語の SDK を利用すればよいものとなります。

https://learn.microsoft.com/ja-jp/azure/communication-services/quickstarts/email/send-email?tabs=windows%2Cconnection-string%2Csend-email-and-get-status-async%2Csync-client&pivots=platform-azportal

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4914/56ad709e-cf9d-e4fc-551d-9186fe446592.png)

この記事ではシェルスクリプトおよび `curl` を利用してACSのメール送信APIを呼び出す方法を記載します。
なお、ポータルでは以下のようなサンプルが表示されます。しかしそのままターミナルから実行しても認証がとおりません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4914/a51b23f7-d0b0-884a-b7a1-525db909d390.png)

# ACS のメール送信 API を呼び出すには何が必要か

## REST API Spec

https://learn.microsoft.com/en-us/rest/api/communication/email/email/send?view=rest-communication-email-2023-03-31&tabs=HTTP

API 定義は上記のとおりです。

## 認証方法

https://learn.microsoft.com/en-us/rest/api/communication/authentication?view=rest-communication-email-2023-03-31

上記ドキュメントにあるとおり、Azure Communication Service では、Emailサービスに限らず、RestAPI を呼び出す場合は、HMAC SHA256 署名されてる必要があります。

サンプルとして下記のドキュメントがありますが、C# と Python の例のみとなり、Shell でどうやるのかいまいちはっきりしません。

https://learn.microsoft.com/en-us/azure/communication-services/tutorials/hmac-header-tutorial?pivots=programming-language-csharp

なお、Azure Communication Service 以外にも同様の認証方式が用いられている Azure サービスもあり、下記の App Configuration のサンプルが参考になります。

https://learn.microsoft.com/en-us/azure/azure-app-configuration/rest-api-authentication-hmac#bash

# サンプル

Copilotに相談しながらできたスクリプトが以下です。

https://gist.github.com/georgeOsdDev/4ca90efc5d8e918be5a7a627edb54435
git メモ


```
---------------------------------------------------------------------------------
1 git 確認your user name ,emailエラーの対応方法

linux に下記コマンド実行 場所は作業の場所
git config --global user.name "Your Name"
git config --global user.email "your_email@example.com"



--------------------------------------------------------------------------------
2 vscode git commit 手順
ローカルのdevelopブランチを今のブランチにする  (左下の場所ある)
developからfetch 変更ある場合、pull
自分のブランチを作成する

brache の発行
自分修正したソースを追加
下の+ クリック

★★★上に必ずメッセージ入力、
commit

変更の同期⇒ダウンロードしてローカルと同じファイルです
user_name 入力
git buget 確認

git bucket画面にプルリクエストをする(PR)  各自のルールでやります。


-----------------------------------------------------------
3 最新取得
ソース管理＞右上３点＞Fetch＞ソースの同期＞OK
circuitjsの作法 その45

# 概要
circuitjsを調査してみた。
webで拾った、ネットリスト、やってみた。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/3b1a0893-c9e4-5102-242e-bed578921996.png)

# ネットリスト

```
$ 1 0.000005 10.20027730826997 50 5 50 5e-11
196 720 416 816 416 0
196 720 560 816 560 0
196 720 704 816 704 0
w 720 624 720 656 0
w 720 656 816 656 0
w 816 656 816 704 0
w 720 480 720 512 0
w 720 512 816 512 0
w 816 512 816 560 0
g 720 768 720 816 0 0
197 896 416 928 416 0
157 800 64 976 64 0 7 0 0
L 208 736 208 816 2 1 false 5 0
197 208 496 240 496 0
197 160 64 192 64 0
157 288 64 464 64 0 7 0 0
157 512 64 688 64 0 7 0 0
L 176 736 176 816 2 0 false 5 0
L 144 736 144 816 2 1 false 5 0
L 160 320 160 400 2 1 false 5 0
w 208 736 208 592 0
w 208 736 720 736 0
w 176 736 176 560 0
w 176 560 208 560 0
w 144 736 144 528 0
w 144 528 208 528 0
w 176 560 176 464 0
w 176 464 608 464 0
w 608 464 608 592 0
w 608 592 720 592 0
w 144 528 144 448 0
w 144 448 720 448 0
w 160 320 640 320 0
w 640 320 640 704 0
w 640 704 720 704 0
L 128 336 128 400 2 0 false 5 0
w 128 336 624 336 0
w 624 336 624 560 0
w 624 560 720 560 0
L 96 352 96 400 2 0 false 5 0
w 96 352 608 352 0
w 512 64 448 64 0
w 448 64 448 496 0
w 448 496 336 496 0
w 512 96 464 96 0
w 464 96 464 528 0
w 464 528 336 528 0
w 512 128 480 128 0
w 480 128 480 560 0
w 480 560 336 560 0
w 512 160 496 160 0
w 496 160 496 592 0
w 496 592 336 592 0
w 576 192 512 192 0
w 512 192 512 624 0
w 512 624 336 624 0
w 608 192 608 208 0
w 608 208 528 208 0
w 528 208 528 656 0
w 528 656 336 656 0
w 640 192 640 224 0
w 640 224 544 224 0
w 544 224 544 688 0
w 544 688 336 688 0
w 608 352 608 416 0
w 608 416 720 416 0
w 160 320 160 160 0
w 128 336 128 128 0
w 128 128 160 128 0
w 96 352 96 96 0
w 96 96 160 96 0
w 288 192 352 192 0
w 288 224 384 224 0
w 384 224 384 192 0
w 288 256 416 256 0
w 416 256 416 192 0
w 896 512 896 768 0
w 816 768 896 768 0
w 896 480 880 480 0
w 880 480 880 624 0
w 880 624 816 624 0
w 896 448 864 448 0
w 864 448 864 480 0
w 816 480 864 480 0
w 816 416 896 416 0
w 1024 416 1024 384 0
w 1024 384 752 384 0
w 752 384 752 64 0
w 752 64 800 64 0
w 800 96 768 96 0
w 768 96 768 368 0
w 768 368 1040 368 0
w 1040 368 1040 448 0
w 1024 448 1040 448 0
w 800 128 784 128 0
w 784 128 784 352 0
w 784 352 1056 352 0
w 1056 352 1056 480 0
w 1056 480 1024 480 0
w 800 160 800 336 0
w 800 336 1072 336 0
w 1072 336 1072 512 0
w 1072 512 1024 512 0
w 864 192 864 320 0
w 864 320 1088 320 0
w 1088 320 1088 544 0
w 1024 544 1088 544 0
w 896 192 896 304 0
w 896 304 1104 304 0
w 1104 304 1104 576 0
w 1104 576 1024 576 0
w 928 192 928 288 0
w 928 288 1120 288 0
w 1120 288 1120 608 0
w 1024 608 1120 608 0
x 49 408 65 411 4 24 A
x 83 819 99 822 4 24 B
x 686 124 724 127 4 48 \q
x 463 126 501 129 4 48 \p
x 360 31 376 34 4 24 A
x 587 31 603 34 4 24 B
x 1040 130 1208 133 4 24 ３ビット加算器


```

以上。
SnowflakeとChatGPTを使ってRAGを構築してみた

## はじめに
SnowflakeとChatGPTを使ってRAG環境を構築してみました。
今回はStreamlitを使用せず、python上で動かしてみた使用感について記していきます。


## 事前準備
### 用意するもの
snowflakeで利用するデータベース、ウェアハウスなどのリソース
（弊社ではTelegramの脅威情報の収集を行っており、今回はそのリソースの一部利用します。）

:::note warn
注意：snowflakeのリソース利用については料金がかかります。
:::

### 参考資料
前回ご紹介したこちらのコードを参考に進めていきます。

https://qiita.com/sdt-bizdev/items/99f5dde8315b4b4cdd22


## 実際に作ってみた
### コード
```rag_test.py
import os
import pandas as pd
from langchain.schema import Document
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.chains import ConversationalRetrievalChain
from langchain.llms import OpenAI
from sqlalchemy import create_engine
from snowflake.sqlalchemy import URL

# OpenAI APIキーの設定
os.environ["OPENAI_API_KEY"] = "your_api_key"

# 1. snowflake
engine = create_engine(
    URL(
    # Snowflake接続情報
        account="your_account_name",
        user="your_username",
        password="your_password",
        database="your_database",
        schema="your_schema",
        warehouse="your_warehouse",
    )
)

query = f"SELECT * FROM database_name.schema_name.table_name"

# データ取得
df = pd.read_sql(query, engine)

# 2. Documentに変換
documents = [
    Document(
        page_content=" ".join(map(str, row.values)),
        metadata=row.to_dict()
    )
    for _, row in df.iterrows()
]

# 3. テキストを小さなチャンクに分割
splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = splitter.split_documents(documents)

# 4. 埋め込みの生成
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(texts, embeddings)

# 5. RAGチェーンの作成
llm = OpenAI()
retriever = vectorstore.as_retriever()
rag_chain = ConversationalRetrievalChain.from_llm(llm=llm, retriever=retriever)

# 6. 質問に対する応答を生成
question = "channel_nameの□□□□□□について概要を教えてください。"
chat_history = []

response = rag_chain.run({"question": question, "chat_history": chat_history})
print(response)
```

```
# 出力結果
□□□□□□ is a member of the public channel □□□□□□ on Telegram. This channel is part of the larger group □□□□□□ and is a private channel within that group. The channel was created on August 17, 2024 and will be active until November 29, 2024. The channel has the □□□□□□ and can be found at □□□□□□.
```
機密情報なので出力結果の一部はぼかしていますが、チャンネル（ハッカーグループ）について概要を教えてくれました。

<br>
質問を変えてみました。

```rag_test.py
# 出力結果
question = "日本を攻撃対象としたchannel_nameを教えてください。"
```
↓↓↓
```
# 出力結果
□□□□□□, ○○○○○○, and ×××××× are all channels that have targeted Japan for cyber attacks.
```
異なる3つのチャンネルから日本が攻撃対象とされていることがわかりました。（怖っ）


## 最後に
本記事では、Snowflakeを活用してRAG構築の手順を記しました。
今後もSnowflakeを活用した技術検証を行っていきたいと思います。
ssh 公開鍵を目的の鯖にコピーするスクリプト

事前に作って置いた公開鍵を、今までは [teraterm(ttssh)](https://teratermproject.github.io/) とか [putty](https://www.chiark.greenend.org.uk/~sgtatham/putty/) とかで [gui](https://w.wiki/3NfY) な環境の[端末エミュレータ](https://w.wiki/CjfK)使って、[cat(1)](http://koganemaru.co.jp/cgi-bin/mroff.cgi?subdir=man&lc=1&cmd=&man=cat&dir=jpman-14.2.2%2Fman&sect=0) で表示させた後(クリップボードにコピー)にターゲットのホストにログインして ~/.ssh/authorized_keys へ追記(クリップボードからペースト)させていたのだが、なんとなくコマンドラインだけで済まとうなり [ssh-copy-id(1)](http://koganemaru.co.jp/cgi-bin/mroff.cgi?subdir=man&lc=1&cmd=&man=ssh-copy-id&dir=jpman-14.2.2%2Fman&sect=0) が上手く使いこなせんけぇ、以下の様なスクリプトを書いてみた。
```shell_session:SSHKEYCOPY.sh
#!/bin/sh
#
# ssh 公開鍵転送支援スクリプト
# 2025/01/16 by JE3KMZ

PREFIX=id_
SUFFIX=.pub
TARGETHOST=$1

usage()
{
	echo `basename $0`
	echo Usage: TARGET_HOST [TARGET_USERNAME]
	exit 2
}

quit()
{
	echo Done.
	exit 0
}

about()
{
	echo About.
	exit 1
}

test $# -eq 0 && usage
test $# -eq 2 && USER=$2

cd ~/.ssh
for key in ed25519 ecdsa rsa dsa ed25519-sk
do
	test -f ${PREFIX}${key}${SUFFIX} && cat ~/.ssh/${PREFIX}${key}${SUFFIX} |\
		ssh ${USER}@${TARGETHOST} "mkdir -p ~/.ssh; cat >> ~/.ssh/authorized_keys" |\
		quit
done

about
```
一応、FreeBSD 14.2-RELEASE な環境しか確認しちょりませんが、なんとなく他の[ディストリビューション](https://w.wiki/CjfU)でも動く気配が有るようにしたつもりじゃ
React19になってContext APIはどう変わったか？

## ReactにおけるContext APIとは何か
ReactにContext APIは、アプリ全体で簡単にデータを共有するための仕組みです。

例えば、ユーザー名やテーマ（明るい・暗い）などの情報を、色々なコンポーネントで使いたい時、普通は親から子へpropsで渡します。

でも、データを深い階層に渡したいとき、いちいち中間のコンポーネントにもpropsを渡す必要がありこれがとても面倒です。

Context APIを使用すると、この面倒なprops渡しをしなくてもデータをどこからでも直接使えるようになります。

## React18までのContext API

・createContextでコンテキストを生成し、Providerで値を提供、useContextで値を使用する。

```javascript
import React, { createContext, useContext } from 'react';

const ThemeContext = createContext();

const App = () => {
  return (
    <ThemeContext.Provider value={{ theme: 'dark' }}>
      <ChildComponent />
    </ThemeContext.Provider>
  );
};

const ChildComponent = () => {
  const { theme } = useContext(ThemeContext);
  return <p>現在のテーマ: {theme}</p>;
};

export default App;
```

・基本的な機能はシンプルでわかりやすいが、大規模なアプリではパフォーマンスの問題が発生する場合も

・Contextの値が変更されると、Provider以下の全てのコンポーネントが再レンダリングされる可能性があるため、パフォーマンスの最適化が必要です。

・DevToolsでContextの値を確認することはできますが、変更の流れや詳細なトラッキングは制限されています。

## React19のContext API

・<Context>タグの導入
React19では、<Context.Provider>の代わりに＜Context>タグを直接使用可能になり、記述が簡潔になりました。

```javascript
import React, { createContext, use } from 'react';

const ThemeContext = createContext();

const App = () => {
  return (
    <ThemeContext value={{ theme: 'dark' }}>
      <ChildComponent />
    </ThemeContext>
  );
};

const ChildComponent = () => {
  const { theme } = use(ThemeContext);
  return <p>現在のテーマ: {theme}</p>;
};

export default App;
```
・デバッグツールの向上
DevToolsで特定のContextに設定されている「値」が変更された履歴を確認できるようになりました。値がどのように変更されたのかを時系列で追跡できるため、予期しないデータの変更やバグの原因を特定しやすくなります。

使い方
①DevToolsの「Components」タブを開く
②Contextの値を確認する
③変更履歴を追跡する


・再レンダリングの原因が明確になった
Context APIでは、値の変更が原因でコンポーネントが再レンダリングされることがあります。React 19では、どのContextの値が原因で再レンダリングが発生したのかを明確に確認できるようになりました。
Arduino UNO R3でint(16ビット)を上位、下位に分割して遊ぶ。



参考

![o_coq779.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/3e2f1bb2-f202-215c-f2a6-d65d35c70009.jpeg)



https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/Arduino.h


![o_coq780.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/3bb83a06-d8ba-6e16-68bb-c8361aaca047.jpeg)


![o_coq781.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/595a7288-b4b1-5825-99d3-d0249c3c318b.jpeg)




プログラム


```c++


//highByte_lowByte_UNO3_1

#include <Arduino.h>

void setup() {

  Serial.begin(9600);

}

void loop() {
  // put your main code here, to run repeatedly:

  int a = 0x8765;
  unsigned char c[2];

  c[0] = highByte(a);
  c[1] = lowByte(a);

  Serial.print(c[0],HEX);
  Serial.print(',');
  Serial.println(c[1],HEX);

  delay(1000);

}



```
CSVをExcelで開いた時の確認ダイアログ

CSVをExcelで開いた時にこのようなダイアログを見たことあるかと思います。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590304/39389efb-68cd-3350-07d6-942bef5a6902.png)
CSVデータによくあるデータの先頭にゼロがあるデータのゼロを削除するかどうかの確認ダイアログ。
「変換」か「変換しない」の確認ですね。
この確認ダイアログのチェックボックスにチェックを入れた場合、次回から通知がなく同じ処理をしてくれます。

常に「変換」か「変換しない」のであれば良いのですがデータによってゼロを削除したい時もあれば削除して欲しくないケースがあるかと思います。

再度、確認ダイアログを表示したい場合は以下の場所から変更可能です。
ファイル -> その他 -> オプション -> データ -> 追加オプション
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590304/0bc3ab4f-b43b-dd6f-7700-3d5353b29839.png)

こんなことを書いておきながらCSVをExcelで開くことはあまりなく
VSCodeの拡張機能 [Edit CSV](https://marketplace.visualstudio.com/items?itemName=janisdd.vscode-edit-csv) で確認、編集することが大半です。
github actionでimagemagick / terraformが見つからずエラーになる

## 追記
terraformも同様にubuntu24から削除されておりエラーになっていました。
`terraform: command not found`

こちらも以下でterraformをinstallすることによって解消しました。

https://github.com/hashicorp/setup-terraform

## 背景

github actionでCIを回していたら急にエラーが発生した

```bash
     MiniMagick::Error:
       You must have ImageMagick or GraphicsMagick installed
```

## 対応

手動でImageMagickをインストールするか、ubuntu22でバージョンを固定する。
基本前者が良さそう。

actionがすでにあったのでこちらを利用

https://github.com/mfinelli/setup-imagemagick

```yml
      - name: install imagemagick
        uses: mfinelli/setup-imagemagick@v6
```

## なぜ発生した？
github actionのubuntuイメージで22->24に上がる際にImageMagickが削除されていた。
github actionのrunnerでubuntu:latestを指定していたので24のイメージになったタイミングでCIが落ち始めた。

ubuntu22
https://github.com/actions/runner-images/blob/ubuntu24/20250113.1/images/ubuntu/Ubuntu2204-Readme.md

ubuntu24
https://github.com/actions/runner-images/blob/ubuntu24/20250113.1/images/ubuntu/Ubuntu2404-Readme.md
【Rails】ensure節の値が返り値として評価されない

## はじめに
Rubyにおける例外処理では、`begin ... ensure`構文を使って、例外の発生にかかわらず必ず実行されるコードを記述できます。しかし、`return`を省略した場合に`ensure`節の値が返り値として評価されないという特性があります。

## `ensure`節の基本動作

Rubyの`ensure`節は、`begin`ブロック内の処理が正常に完了した場合でも例外が発生した場合でも、必ず実行されることを保証します。

以下は、`ensure`節の基本的な例です：

```ruby
def example_method
  begin
    puts 'Doing some work'
    42
  ensure
    puts 'Cleaning up'
    99
  end
end

puts example_method
```

このコードの出力は以下のようになります：

```plaintext
Doing some work
Cleaning up
42
```

`ensure`節の中で`99`を評価していますが、この値は返り値には影響しません。代わりに、`begin`ブロック内で最後に評価された値（この場合は`42`）が返されます。

Rubyは言語仕様として、ensure節の評価値を無視するようになっています。
> begin式全体の評価値は、本体／rescue節／else節のうち最後に評価された文の値です。また各節において文が存在しなかったときの値はnilです。いずれにしてもensure節の値は無視されます。

https://docs.ruby-lang.org/ja/latest/doc/spec=2fcontrol.html#begin

## 回避策
### 変数を利用する

```ruby
def example_with_variable
  result = nil
  begin
    result = 10
  ensure
    puts 'Cleaning up'
  end
  result
end

puts example_with_variable
```

出力：

```plaintext
Cleaning up
10
```

## まとめ

Rubyでは、`ensure`節の評価結果がメソッドの返り値に影響しない設計になっています。この仕様を理解していないと、意図しないバグが発生する可能性があります。

- `ensure`節は、例外の発生有無にかかわらず実行される
- `ensure`節の中で評価された値は返り値として使用されない

## 参考
https://docs.ruby-lang.org/ja/latest/doc/spec=2fcontrol.html#begin

https://qiita.com/shinoharat/items/4d389913704a79e835fc
簡単AWS　SNS（Amazon Simple Notification Service）

**AWS SNS（Amazon Simple Notification Service）は、Amazonが提供するメッセージ配信サービスです。簡単に言うと、「通知を素早く広い範囲に届けるためのシステム」**です。

SNSの特徴
1.発行者と購読者：
**発行者　Publisher**は通知を出す人（例：イベントやアラートを発信するシステム）。
**購読者　Subscriber**はその通知を受け取る人やシステム（例：メールやSMS、アプリの通知を受け取るユーザー）。
発行者は1つのメッセージを送信し、それをすべての購読者が受け取る仕組みです。

2.さまざまな通知方法：
メール（Email）、ショートメッセージ（SMS）、プッシュ通知（モバイルアプリへの通知）、他のAWSサービス（例：SQSキュー、Lambda）への通知など。

3.リアルタイムでの通知：
メッセージは迅速に複数の受信者に配信されます。

使用例
1.システムのアラート通知： 例えば、サーバーに異常が発生した場合、SNSは管理者にメールやSMSで即座に通知を送ります。
2.イベントやアップデートの通知： アプリケーションで重要な更新があった時に、SNSはそのメッセージをアプリ利用者全員に通知できます。
3.お知らせ配信： 会社から全社員への告知や、イベントの告知などをSNSを通じて一斉に送信できます。

まとめ
AWS SNSは、メッセージや通知を素早く広く届けるためのツールです。1つのメッセージを複数の受信者に同時に配信するため、効率的に情報を届けたい場面で活躍します。