OmniAICreator/Qiita-1.07M huggingface dataset:
SORACOM Fluxのアクションの実行条件！これで時間通りのフローも実現

この記事は、SORACOM Fluxの アクションの実行条件 についてです。
現在選択できるイベントソースのタイマーは、一定時間ごとの起動は出来るのですが、決まった時間にイベントを発生することができないので、決まった時間にイベントを発生するには工夫が必要となります。

今回は、その方法の１つとして、[アクションの実行条件]について説明します。


# SORACOM Fluxのアクションの実行条件とは？
SORACOM Flux では様々なアクションが用意されていますが、そのそれぞれで [アクションの実行条件] を指定することが出来ます。これにより、指定した条件を満たした場合にのみアクションを実行して、後段処理に繋げるなどを行うことが可能となります。

[アクションの実行条件] に関する公式リファレンスはこちらです。

https://users.soracom.io/ja-jp/docs/flux/action-payload-condition/

# SORACOM Flux を定刻に起動したい！
冒頭で書いたように、イベントソースの [タイマー] は一定時間ごとの処理は実現できるのですが、定刻動作をすることは出来ません。イベントソースで、Incoming webhook を作成して、外部サービスから定刻にこちらのAPIをコールすることでも、定刻での動作は可能ですが、せっかくのローコード環境なのに、外部サービスをわざわざ使うのはちょっと違う気もします。

そこで、今回は、上記で紹介した [アクションの実行条件] を使用します。

今回は、日本時間の9時台／15時台に１回ずつ処理が行われるように設定します。

* タイマーで

1. イベントソースのタイマーで１時間ごとにイベントが発生するように設定する
1. 後ろの処理の「アクションの実行条件」で時刻を設定する

<br>

## 各設定の詳細

イベントソースのタイマー設定はこのようになっています。今回の例では、1時間ごとにイベントが発生するように設定しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/ace9fb85-311e-80e6-0b62-53c828f0cc2c.png)



アクションの実行条件はこのようになっています。今回の例では、協定世界時 (UTC) の「時」を取得して、0時 or 6時 ならアクションを実行するように設定しています。日本時間で9時 or 15時 となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/499fb5f0-756f-3e75-5c44-e35df7812f35.png)

```
(getUTCHours(now()) == 0) || (getUTCHours(now()) == 6)

```


# しっかり定刻に処理をしたいと思ったが
次にしっかり時刻を設定たいと思います。そうなると次のような方法が考えられるので試してみます。
* タイマーを1分ごとに起動するように設定
* アクションの実行条件に、「分が0の場合」[getUTCMinutes(now()) == 0]を追加


タイマーで1分ごとに起動されるとサーバー側としてはいやだよなと思いつつも試してみると、以下のエラーが発生しました。まぁ、そうだよなと思いますね(笑)
いまの使い方だと、だいたいその時間帯ぐらいの処理で十分問題ないので、上記で説明したフローで運用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/edbd32ce-3f22-4302-f130-1e9457f2f2f0.png)



# さいごに
「アクションの実行条件」を工夫することで、より自分の使いたい使い方やフローの最適化など、いろいろな可能性があると思います。
公式サイトでも多少の入力例があるのですが、もっと「こういったことが出来る！」といった具体的な条件設定の例が出てくると使いこなすのも楽だと思う。


# その他の参考リンク

https://qiita.com/yukima77/items/68b133628a00b1e2a654

https://qiita.com/yukima77/items/e2b78d506575d82d9bce

https://qiita.com/yukima77/items/7b65d0695f06ec074343
AIでドキュメントを管理したい

# やりたいこと
　社内でプロジェクトのドキュメントは残しているのですが、システム部以外やプロジェクトの新規参画者にとって理解しがたい内容になっており、結局ドキュメントが使われず、プロジェクトの精通者に口頭やチャットで確認するということが社内で散見されました。そこで今あるドキュメントを有効化する術がないかと考えました。

# 原因分析
　なぜドキュメントが使われていないかを考えた結果、情報取得までのルートの複雑性とドキュメントに抽象度の階層がないことだと結論付けました。
　ドキュメントを使って情報取得するまでのルートが、プロジェクトの精通者に直接聞く行為より大きく難しかった場合ドキュメント精通者に直接聞く方が効率的になってしまいます。なのでドキュメントを使った情報取得までのルートがプロジェクトの精通者に直接聞くのと同等もしくはそれ以下まで下げる必要があると考えました。
　社内にあるドキュメントは基本的に開発者が開発時に見るもので、詳細が書かれているものです。新規参画者やそこまでプロジェクトに精通していない他部署の人が見る上では不必要な情報も多くあるので、現状のものより抽象度を上げたものが必要だと考えました。

# 原因へのアプローチ
　原因分析で上げた2点両方に対するアプローチとしてLLM（以降AI）を利用する方法を考えました。AIに事前にドキュメントの情報を渡すことで、自分が何かプロジェクトに関することで分からないことがあったとき、ただ分からないことをAIに質問するだけでよいので、情報取得を簡単に行えます。また、質問の回答のAIが作成するので、AIに抽象度を上げた回答をしてもらえます。

 # 実運用する上での懸念
 　実運用を想定するにあたって以下の懸念が出てきました。
 + AIが誤った情報を返してしまう
 + AIに渡すドキュメントを作る必要があるので、ドキュメントが多重管理になってしまう

### AIが誤った情報を返してしまう
　この問題に対する解決策として、AIにGoogleが提供しているNotebookLMというサービスを利用することに決めました。NotebookLMは事前にドキュメントを渡すことで、回答するときにドキュメントのどこから引用したかを教えてくれ、クリックすることで引用元を素早く参照可能です。これにより詳細を確認するときは引用元を確認してもらえばよいので、誤った情報を取得する確率が減らせます。

### ドキュメントが多重管理になってしまう
　NotebookLMはテキストファイルやPDF、Googleドキュメントなどを渡すことが出来ます。社内ではタスク管理ツールでプロジェクトの仕様を管理していることが多いです。タスク管理ツールからプロジェクトに関する情報をテキスト化して、NotebookLMに渡すとしても良いのですが、当然ドキュメントの多重管理になり、変更があった場合両方を修正しないといけなくなります。そこで、タスク管理ツールの自動化機能を使い、特定のプロジェクトの内容に追加、変更があった場合、WebhookでGASのアプリを起動して追加、変更した内容をGoogleドキュメントに書き込みます。それとは別に定期的に実行するGASを用意して、ディレクトリ内のGoogleドキュメントを結合させます。最終的にNotebookLM側では結合したGoogleドキュメントを参照させることで、ドキュメントの2重管理にならず、最新の仕様を参照することができます。
 
 　以下簡単ですがシステム構成図になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267761/940d7db3-e907-8f8d-d99e-b29a2faa9546.png)

# まとめ
　まだ開発途中ですが、使用感は悪くないです。微妙なところを上げるとすれば、NotebookLMはGoolgeドライブをマウントしているわけではないので、Googleドキュメントに更新がかかった場合手動でボタンをクリックしないと更新されない点と、NotebookLMに画像が表示されない点です。まだまだアップデートされると思うので今後に期待です。
カスタム Nerves: デバイスドライバを特定する方法

## はじめに

Linux 環境や組み込みシステムで特定のデバイスを使用するには、そのデバイスに対応したドライバを見つけて設定する必要があります。本記事では、USB カメラのドライバを特定する際に調査した内容をまとめます。

### Raspberry Pi OS のセットアップ

USB カメラは、Raspberry Pi カメラモジュールの代替手段となることがありますが、現時点では USB カメラは Nerves システムでネイティブサポートされていません。Nerves に統合する前に、Raspberry Pi OS 上で USB カメラをテストすることが重要となります。

Raspberry Pi OS のセットアップ方法については、以下の公式リソースを参照してください。

- [Official Raspberry Pi Imager Documentation](https://www.raspberrypi.com/software/)
- [Installing Raspberry Pi OS on Your Raspberry Pi](https://www.raspberrypi.com/documentation/computers/getting-started.html)
- [How to Flash Raspberry Pi OS Using Raspberry Pi Imager](https://projects.raspberrypi.org/en/projects/raspberry-pi-setting-up)

これらのガイドは、Raspberry Pi OS のシステムを構築し、USB カメラのテスト環境を準備するのに役立ちます。

## デバイスドライバを特定する手順

以下の手順では、USB カメラを例に取り、Linux システムで必要なドライバを特定する方法を紹介します。この手法は、Nerves システムのカスタマイズやその他のデバイスにも役立ちます。

### 1. システムの現在の状態を確認

デバイス接続前のシステム状態を記録します。これにより、後でどのドライバがロードされたかを簡単に確認できます。

まず、端末を開き、以下のコマンドを実行してください。

```bash
lsmod > before.txt
```

このコマンドにより、現在ロードされているカーネルモジュールのリストが `before.txt` ファイルに保存されます。

`lsmod` コマンドは、システムで動作しているモジュールを一覧表示するためのものです。これにより、後の手順で比較が可能になります。

### 2. デバイスを接続

USB デバイスを接続し、システムが正しく認識するかを確認します。

まず、USB ポートにデバイスを接続します。接続が確実に行われていることを確認してください。

デバイスを接続した後、以下のコマンドを実行して接続を確認します。

```bash
lsusb
```

このコマンドは、システムに接続されている USB デバイスの一覧を表示します。以下は出力例です。

```
Bus 001 Device 003: ID 056e:701a Elecom Co., Ltd ELECOM 2MP Webcam
```

ここで、`056e` は Vendor ID を、`701a` は Product ID を表します。これらの情報がデバイスを特定するための鍵となります。

もしデバイスが認識されない場合は、別の USB ポートに接続してみてください。また、以下のコマンドでシステムログを確認することも有効です。

```bash
dmesg | tail
```

別の PC に接続して動作確認を行うことで、ハードウェアの不具合かどうかを切り分けることも可能です。

### 3. ドライバの検索

取得した Vendor ID と Product ID を使用して、適切なドライバを調べます。検索エンジンを利用して、以下のようにキーワードを工夫しながら調べてみてください。

- デバイス名と「Linux ドライバ」を組み合わせて検索
- Vendor ID と Product ID に加えて「UVC」や「カーネルモジュール」といったキーワードを加えて検索

:::note
USB カメラに関しては、大抵の場合 **UVC (USB Video Class)** 規格に準拠しており、`uvcvideo` ドライバを使用します。
[UVC 準拠デバイス一覧](https://www.ideasonboard.org/uvc/) というものがありますが、すべてのデバイスが掲載されているわけではないようです。実際、多くの現代の USB ウェブカメラは、リストに記載されていなくても UVC 準拠であると言われています。
:::

https://qiita.com/mnishiguchi/items/ebef421efbd8d0d54fd3

### 4. ドライバのロード確認

該当するドライバがロードされているか確認します。以下のコマンドを実行してください。

```bash
lsmod | grep uvcvideo
```

:::note
該当するモジュールがリストに含まれていない場合は、手動でロードする必要があります。以下のコマンドでロードを行います。

```bash
sudo modprobe uvcvideo
```
:::

### 5. システム状態の比較

接続後のシステム状態を記録し、接続前の状態と比較します。

デバイスを接続した状態で以下のコマンドを実行し、現在の状態を保存します。

```bash
lsmod > after.txt
```

接続前の `before.txt` ファイルと比較します。

```bash
diff before.txt after.txt
```

以下は出力例です。

```
> uvcvideo            98304  0
```

この出力から、新たに `uvcvideo` モジュールがロードされたことがわかります。

## Nerves システムへの応用

この手法は、[Nerves](https://www.nerves-project.org/) システムをカスタマイズして特定のデバイスを動作させる際に非常に有用です。詳細は [Nerves のカスタマイズガイド](https://hexdocs.pm/nerves/customizing-systems.html) をご覧ください。

## まとめ

本記事では、Linux 環境でデバイスに必要なドライバを特定する手順を解説しました。この方法は、Nerves システムを含むさまざまな環境で応用可能です。

何か氣づいた点や改善提案があれば、コメントで共有していただけると嬉しいです。

![toukon-qiita-macbook_20230912_091808.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82804/fd5c55ec-4fe0-8af6-59bc-bab1ef3d182b.jpeg)
OMCB029C(282)

https://onlinemathcontest.com/contests/omcb029/tasks/11338

$\omega〜\omega^5$は以下のように計算できます。

$\omega^2=(\frac{-1+\sqrt{3}i}{2})^2$
$=\frac{(-1)^2+2×(-1)×\sqrt{3}i+(\sqrt{3}i)^2}{2^2}$
$=\frac{1-3-2\sqrt{3}i}{4}$
$=\frac{-1-\sqrt{3}i}{2}$

$\omega^3=\omega×\omega^2$
$=\frac{-1+\sqrt{3}i}{2}×\frac{-1-\sqrt{3}i}{2}$
$=(\frac{-1}{2})^2-(\frac{\sqrt{3}i}{2})^2$
$=\frac{1}{4}-\frac{-3}{4}$
$=1$

$\omega^4=\omega×\omega^3$
$=\omega$

$\omega^5=\omega^2×\omega^3$
$=\omega^2$

$(17-2\omega)(17-2\omega^2)(17-2\omega^3)(17-2\omega^4)(17-2\omega^5)$は、
$\lbrace(17-2\omega)(17-2\omega^2)\rbrace^2(17-2)$と変形できるので、
まず$(17-2\omega)(17-2\omega^2)$の部分を計算します。

$=\lbrace17-(-1+\sqrt{3}i)\rbrace\lbrace17-(-1-\sqrt{3}i)\rbrace$
$=(18-\sqrt{3}i)(18+\sqrt{3}i)$
$=18^2+3$
$=324+3$
$=327$

したがって解は$327^2×15=1603935$
プリザンターでサイトをアーカイブ(っぽく)管理する方法

## はじめに
プリザンターであまり使わないサイトや既に終了したプロジェクトのためのサイトなど、消すわけにはいかないけど、表示されているのが邪魔だな・・・というサイトがありませんか？
アーカイブ用のフォルダを作って移動させるのも1つの方法なのですが、アクセス権の管理がサイトの階層から離れてしまうことが嫌なケースや、そもそも所定の階層外に動かしたくないなど、その場で存在だけ消したいという場合の対処法を紹介します。

## 「読取専用の場合は画面に表示しない」オプションを使う
サイトへのアクセス権が読み取りのみの場合に画面に表示しないというオプションです。[マニュアルはこちら](https://pleasanter.org/ja/manual/site-no-display-if-read-only)です。
管理者など必要最低限のユーザーのみ書き込み権限を付与して、他のユーザは読み取り権限のみとすることで、サイトからの表示は消えます。
ただし、この方法だと完全に表示からは消えてしまうので、一時的に表示させることは出来ません。これだと一時的に消しておきたいという場合はアンマッチですね。

## スタイルとスクリプトで対応する
現時点だとこの方法がオススメです。消したいサイトに対してCSSをあてて非表示化して、表示させたい時にスクリプトで表示させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3555395/fb5810dc-64c0-bf82-9523-6fffbf588446.png)
このようになっているサイトで、記録テーブルA(サイトID:3482327)にアーカイブっぽい動作をあててみます。

### 消したいサイトを指定する
消したいサイトが含まれるフォルダ(今回はSandbox)の管理のスタイルから、消したいサイトを指定したCSSをあてます。CSSはこのようになります。
```css
.nav-site[data-value="3482327"] {
    display:none;
}
```
これによって、記録テーブルAが消えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3555395/63416de0-861b-1bb4-8460-0b43f83ebfc1.png)

### 再表示を行う
CSSで`display:none;`として消してしまっているので、勘の鋭い方はもうおわかりかと思います。
再度表示させる時はjQueryで`show`してしまえばOKです。JavaScriptとしては、こんな感じです。
```js
$('.nav-site').show();
```
試しに開発者ツールのコンソールで実行してみると、先ほど非表示にした記録テーブルAが再度表示されますね。
![レコーディング-2024-12-10-203329.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3555395/0fa70e65-971a-7d15-db78-d047268473ba.gif)
あとは、これを実行しやすい様にナビゲーションメニューやコマンドボタンなどに仕込みます。

### もう一工夫
先ほどの単に表示させるだけでもかまわないのですが、ちょっと工夫を凝らして、「アーカイブしていないサイト(=通常のサイト)」と「アーカイブされているサイト」をスイッチ出来るようにします。
```js
$('.nav-site:not(.to-parent)').toggle();
```
工夫といってもこれだけです。`toggle`を使えば、`show`と`hide`間で自動的にスイッチされます。このとき、「上へ」も`nav-site`クラスを持っているため、それが一緒にスイッチされるのを防ぐために否定フィルタを加えています。
これを開発者ツールで実行してみるとこんな動きになります。
![レコーディング-2024-12-10-204547.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3555395/4bdc2ce7-29aa-0754-cd73-d2ccd95a7712.gif)
いい感じですね。

### 実際に設定してみた
今度はこれをナビゲーションメニューに仕込みます。[拡張ナビゲーションメニュー](https://pleasanter.org/ja/manual/extended-navigationmenus)の出番です。
定義ファイルを作ってみるとこんな感じになります。
```json:SiteArchiveMenu.json
{
	"TargetId": "SettingsMenu",
	"Action": "Append",
	"NavigationMenus": [
		{
			"ContainerId": "SiteArchiveContainer",
			"MenuId": "SiteArchiveMenu",
			"Name": "アーカイブ",
			"Icon": "ui-icon ui-icon-gear",
			"ChildMenus": [
				{
					"MenuId": "SiteArchive_ArchiveToggle",
					"Name": "アーカイブ表示",
					"Icon": "ui-icon ui-icon-arrowrefresh-1-w",
					"Url": "javascript:$('.nav-site:not(.to-parent)').toggle();$('#SiteArchive_ArchiveToggle a').text($('#SiteArchive_ArchiveToggle a').text() === 'アーカイブ表示' ? '通常表示' : 'アーカイブ表示');",
					"ReferenceTypes": ["Sites"],
					"Actions": ["index"]
				}
			]
		}
	]
}
```
ナビゲーションメニューの文言の書き換えも同時におこなっています。
実行してみるとこんな感じです。
![レコーディング-2024-12-10-210651.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3555395/691cc8d4-ddf8-526d-6d9f-339e403c2b28.gif)
いい感じですね。

## まとめ
プリザンターでサイトのアーカイブっぽい挙動を作ってみました。アーカイブ対象としたいサイトの背景色を変える[^1]などすれば、さらに見た目でわかりやすい運用も可能ですので、これらのソースをベースにカスタマイズして使ってみてください。

[^1]:最初に非表示のスタイルを当てるタイミングで背景色設定もしてしまう
AWS re:Invent 2024 現地参加記 その1 〜準備からイベント前日まで〜

### はじめに
2024年12月2日から6日に開催された、re:Inventに現地参加してきました！
初めてのアメリカ、初めてのre:Inventだからこそ感じたことを記事にまとめています。
これから参加するよーって方、行こうか迷ってる方に読んでもらう方はぜひ見てください！
### 準備
自分の渡航が決まったのは8月末でした。

とりあえず英語の勉強を始めることに。
スピーキングに特化した英語アプリを9月から開始、1日10~20分程度行いました。

結論から言うと、この英語勉強がどこまで意味があったかはわかりません。
話す・聴くことへの抵抗はなくなったものの、スピードが速いと一部聴き取れないことがありました。

10月になり、セッションの参加登録が開始。
公式ページからカレンダーで参加したいセッションを登録できるので、事前にやっておきましょう。私はその存在を知らず、スプレッドシートで整理してましたw
日本時間の2:00開始でしたが、開始後5分で人気のセッションは埋まっていました。

11月になり、金融系の会社からの参加者向けにプレイベントがあったので参加。
金融系の注目セッションからre:Inventの準備ポイントを教えてもらいました。
他社の参加者および経験者との懇親会があり、不安や疑問を解消することができました。

12月になるまでは、re:Inventの体験記事とアメリカの渡航準備についての記事を沢山読み漁りました。
### 事件簿1. ESTAの代行業者に騙される
ESTAは必ず公式サイトから行ってください。
紛らわしい代行業者のサイトがGoogleの検索結果で沢山出てきます。
私は見事に騙され、2万弱支払いました...
さらにその後はカードの不正利用取引が発生し、渡航直前にカードを差し替えることにしました。

### いざ東京 → ラスベガスへ
金曜退勤後にそのまま羽田空港へ向かい、アメリカへ。
直行便はないため、ロサンゼルスからラスベガス乗り換えです。
アメリカン航空を使いましたが、日本人がほぼいなくてびっくりしました（ちょっと早かったからかな）

ラスベガスと東京では17時間の時差があるため、11/29夕方頃、ラスベガスに到着しました。
11/30はフリーデイだったので、グランドキャニオンの日帰りツアーに参加しました！

空港ホテルどこにもカジノがあって、これがラスベガスか〜と
![airport.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405031/6fdbda36-198f-7efd-5908-ebe1ab332dc8.jpeg)
空港のカジノ。ここにもDATADOGさん！

![casino.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405031/d1ffb1a2-3819-e43c-3417-a075e10acd27.jpeg)
ホテルのカジノです。入口もなく、ロビーの横にそれとなく設置されてます
### 事件簿2. 入国審査でエンジニアの説明ミスる
ラスベガスに無事到着と思いきや、早速プチトラブルがありました。
以下入国審査中のやりとりです。

担当「なぜアメリカに来たの？」
私「ビジネスカンファレンスです！engineer向けの！Amazon！」
担当「はー。どんな類のエンジニアなの？」
私「..？ バックエンドエンジニアです...:sweat_smile:」
担当（ハッ...？:thinking:）

"engineer"はいろんな意味を有してるので、絶対"IT engineer"と言おうね。
なんなら観光目的と言ってしまった方がいいかもしれません

それ以降は怪しまれたのか、帰国のボーディングチケットとre:Inventのチケットを見せろと言われました。印刷しておくことをおすすめします。
あの時の担当者の方と後ろで並んでいた方... 貴重な時間を使ってしまいごめんなさい... 

人によっては「あーAWSのね。」でぱっと終わるケースもあったようです
担当者と入国タイミングによりそうですね。

### re:Invent前日
メイン会場のヴェネチアンが開放されます。
・ファンイベント（5kmマラソン）の参加申込み
・SWAG受取
・re:Inventの今年度のアップデートに関するセッションなど
あたりができますが、ホテルでのんびりして行くタイミングを見失いました..
イベント開始後でも十分時間は取れますので、無理に行く必要はないと思います！

この日はタクシーでダウンタウンエリアへ
![IMG_4667.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405031/c896b97b-4395-dced-03c0-bda897f33e40.jpeg)
ストリップに対抗して作られたLEDの電飾アーケードが圧巻です。
ちなみにジップラインもあり上空を滑ることができますよ！
昔ながらのホテルやレストランがあり、クラシックな雰囲気で食事を楽しみたい方にもおすすめです◎

次回はre:Invent初日から最終日までの動きについてまとめます！
生物物理屋が日本語LLMを試してみた話

## はじめに
この記事は「[ただただアウトプットを癖付けるための Advent Calendar 2024](https://qiita.com/advent-calendar/2024/newbie2024)」に投稿した記事です。

[最初の記事](https://qiita.com/yotabouya/items/e63c53c5e18b3cf6a454#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB)にも書いた通り、私は生物物理の実験を専門にしている研究者です。
最近はデータ解析のため機械学習のコード開発も行っており、幸いにもその成果が[NeurIPSに採択されました](https://neurips.cc/virtual/2024/poster/93465)。

[前の記事](https://qiita.com/yotabouya/private/dae1261fde3989b7dfaf)でローカルLLMをAPIサーバーにしまして、他のAIサービスのバックエンドとして機能するようにしました。
今回はさらに、hugging faceからLLMを導入することを試してみました。
最近になって、[国産LLMのまとめページ](https://llm-jp.nii.ac.jp/)を知りました。
せっかくなので、ここで紹介されている日本語LLMを試してみることにしました。

## 関連記事

#### 前の記事「[【生物物理屋による論文紹介】ハイパーグラフと層](https://qiita.com/yotabouya/private/3bdba1447b2bc44c934d)」

#### 次の記事「[生物物理屋がSIGNATEの初心者向け課題に挑戦してみた話](https://qiita.com/yotabouya/private/6ea94fdbaec86649a753)」

## hugging face
hugging faceは、自然言語処理のためのモデルを提供しているサービスです。
[こちら](https://huggingface.co/)からアクセスできます。
ここには、言語モデルが多数提供されており、その中には日本語のモデルもあります。
言語モデルの提供というのは、学習済みのモデルを提供するということです。
モデルのフレームワークのみならず、学習済みのニューラルネットワークの重みも提供されているので、これを使えば簡単に自然言語処理のタスクを解くことができますし、これを事前学習済みのモデルとしてファインチューニングを行うこともできます。

## 日本語LLM
日本語LLMは、日本語の言語モデルです。
上のページにもリストアップされているように、英語の学習済みモデルを転移学習したものであったり、あるいは日本語のコーパスを使って一から学習したものがあります。
このリストのすべてがhugging faceに提供されているわけではありませんが、いくつかは提供されています。

今回は、[EhimeNLP/AcademicRoBERTa](https://huggingface.co/EhimeNLP/AcademicRoBERTa)を使ってみることにしました。
このモデルは愛媛大学人工知能研究室が作成したもので、RoBERTaをベースにしています。

と思いましたが、hugging faceに上がっていてもollama用のファイルがありませんでした。

なので、まずは[7shi/tanuki-dpo-v1.0](https://ollama.com/7shi/tanuki-dpo-v1.0)を使ってみます。

## モデルの導入

とても簡単です。
```bash
ollama run 7shi/tanuki-dpo-v1.0
```
これを実行すると、モデルがダウンロードされ、そのまま使うことができます。

## 使ってみる

今回は、ターミナル上でそのまま使ってみます。
以前、llamaで日本語入力を試した時と比べると、かなり自然な文章が生成されるようになっているようです。

```
>>> こんにちは！
こんにちは！お元気ですか？今日はどんなお手伝いが必要ですか？
```

```
>>> 形態形成における細胞遊走の重要性について教えてください
形態形成における細胞遊走（セルラー・ムービメント）は非常に重要な役割を果たします。まず、細胞遊走とは、未分化または特定の方向に移動する細胞が新しい組織や器官を形成するために周囲の環境と相互作用しながら移動する現象を指します。このプロセスは胚発生の初期段階から成人期に至るまで続いており、組織の形状や機能を決定する上で不可欠です。

形態形成において細胞遊走が重要なのは、以下のような理由があります（1) 組織のパターン形成: 初期の胚では、特定のシグナル分子や成長因子によって細胞群が誘導され、これが細胞間のコミュニケーションを通じて複雑なパターンを形成します。この過程で細胞遊走が重要な役割を果たします。

次に、細胞遊走は組織の分化と運命決定にも関与しています。特定のシグナルや環境条件によって、細胞がどの方向に動くかが決まり、その結果として異なる種類の細胞に分化します。例えば、神経管の形成や血管網の構築など、精密なパターン形成には細胞遊走の精密な制御が必要です。

さらに、組織再生やがん研究においても細胞遊走の理解は重要です。損傷を受けた組織や腫瘍内での異常な細胞移動は、新しい病変部位への定着や転移に寄与することがあります。これを理解することで、治療戦略の開発や予防策の設計が可能になります。

最後に、細胞遊走は発生過程だけでなく、再生医療やバイオエンジニアリングにおいても応用されています。人工的に制御された細胞移動システムを構築することで、損傷した組織の修復や新しい臓器の作成が期待されています。

このように、細胞遊走は形態形成において中心的な役割を果たし、生物の多様な機能と構造を支える重要なプロセスです。理解を深めることで、発生学、医学、工学など多岐にわたる分野での応用が広がります。
```
cronが非推奨になっていたのでsystemd timerを使ってみた

# systemd timerを使った経緯
Gitにコミットしたテストコードを定刻で実行したい日のこと。

Github ActionsのWorkflowにscheduleトリガーイベントを定義して待つ
↓
設定した時刻になっても起動しない...？
↓
数十分後やっと起動

どうやら[GitHub Docs](https://docs.github.com/en/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows#schedule)を見ると、ワークフロー実行の負荷が高い期間中はスケジュールイベントが遅延する可能性があるとのこと。

テストの都合上、Amazon EC2（Amazon Linux 2023）をセルフホストランナーとして使用していたため、サーバ側から決まった時間にGithub ActionsのAPIを実行しワークフローを実行することにしました。

簡単なシェルスクリプトを作成し実行テスト後、cronで時刻起動の設定を...
```
-bash: crontab: command not found
```
**cronがない！？**

Amazon Linux 2023ではcronはデフォルトでインストールされておらず、代わりにsystemd timerが推奨されていました。([Amazon Linux 2023ユーザガイド](https://docs.aws.amazon.com/ja_jp/linux/al2023/ug/deprecated-al2023.html#deprecated-cron)）

ということでsystemd timerを使って定期実行の設定をしてみたので設定方法をまとめておきます。

# systemd timerとは
cronと同じように定期実行できるsystemdの仕組みで、起動したいコマンドやスクリプトはserviceファイル、スケジュール設定をtimerファイルに記述し、systemctlコマンドで有効化などの操作を行います。

# 設定方法
### １．serviceファイル作成
/etc/systemd/systemに/<機能名>.serviceという名前でファイルを作成します。

```例：<機能名>.service
[Unit]
Description=sample
After=network.target
[Service]
ExecStart=/home/ec2-user/sample.sh
User=ec2-user
```

| 名前 | 説明 |  
| --- | --- |
| Description | 説明（任意の文字列） |
| After | 起動順序制御（network.target：インターネット接続後に実行） |
| ExecStart | 実行したいコマンドやスクリプト |
| User | 起動するユーザ名（ExecStartに記述した内容の実行権限が必要） |

### ２．timerファイル作成
serviceファイルと同じ/etc/systemd/system/に同じ機能名で<機能名>.timerという名前のファイルを作成します。

```例：<機能名>.timer
[Unit]
Description=test
After=network.target
[Timer]
OnCalendar=Mon..Fri *-*-* 00:00:00
[Install]
WantedBy=timers.target
```

| 名前 | 説明 |  
| --- | --- |
| Description | 説明 |
| After | 起動順序制御（network.target：インターネット接続後に実行） |
| OnCalendar | スケジュール設定（例では月～金の0時に起動する設定）<br>※cron式とは異なるので注意 |
| WantedBy | タイマー設定ではtimers.targetの指定が必要（これによりすべてのタイマーをグループ化するためのターゲットユニットに関連付けされる） |  

OnCalendarに設定する書式はcron式とは異なり馴染みがないかもしれませんが、マニュアルをチェックして書式を作成し、テストツールで書式の確認が可能です。

マニュアル表示
```$ man systemd.time```

書式チェック（誤っている場合エラー、正しい場合は次の実行タイミング等が出力されます）
```$ systemd-analyze calendar '確認したい書式'```
    

### ３．サービス自動起動有効化
以下コマンドでサービスの自動起動を有効化します。
```$ sudo systemctl enable <機能名>.timer```

### ４．サービス起動
以下コマンドでサービスを起動します。
```$ sudo systemctl start <機能名>.timer```

### ５．起動確認
以下コマンドでtimer設定の一覧を表示します。
```$ sudo systemctl list-timers```
一覧表示される項目を見て想定通りに設定されていることを確認します。

| 項目 | 内容 |  
| --- | --- |
| NEXT | 次回起動予定時刻 |
| LEFT  | 次回起動予定時刻までの残り時間 |
| LAST  | 前回起動時刻 |
| PASSED | 前回実行時刻からの経過時間 |
| UNIT | timerファイル名 |
| ACTIVATES | serviceファイル名 |

### ６．設定変更時
serviceやtimerファイルを修正した場合は以下コマンドを実行し設定の反映が必要です。
```$ sudo systemctl daemon-reload```

# まとめ
今回はただ決まった時刻に1つのシェルを実行するというシンプルな設定でのsystemd timer利用でした。

例として記載したserviceやtimerファイル記載のオプション以外に、実行ディレクトリの指定、何らかの原因で指定したタイミングに実行されなかった場合システム再起動後すぐに実行する、サーバ起動から一定時間経過後に一度実行するなど様々な設定ができるため、要件に応じて柔軟なカスタマイズができそうです。

サーバレスの流れやジョブ管理のマネージドサービスがたくさん登場していますが、Linux上で何かを定期実行したい場合もまだまだあるかと思いますので、また機会があれば違った使い方で活用してみようと思います。
Raycastでスケジュールを把握しよう

## はじめに
スケジュールされてた会議を開始後に気づいたり、会議が長引いてしまったりしたことがありますか？
そんな方には[My Schedule](https://manual.raycast.com/calendar)という機能がおすすめです。これを使えばMenu barやRaycast上に次の予定を表示することができます。

この記事はRaycast Advent Calendar 2024に参加しています。
昨日は @masuipeo さんの『Raycastで便利なショートカットキー』でした。

## 概要
My Scheduleを使えば一日の予定を確認したり次のオンライン会議にさっと入ることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408705/98fdded8-3596-2131-768a-0db3f3390d25.png)

近くなってくるとRaycastの上部に表示されるので忘れることはありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408705/4ec657bb-0c06-6857-ec1a-c1bc4c4f2f55.png)

メニューバーに表示することもできます。会議中は残り何分かを表示することもできるので時間に意識を保つことができて最高です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408705/270445e9-4e68-2b73-b174-8cbd47178015.png)

## 使い方
1. Calendarアプリへのアクセス権限を設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408705/a5863f1a-f740-a251-a0c5-0b6cfd89c260.png)
1. 使いたいカレンダーが有効になっていることを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408705/5069260b-3d9f-2582-34c5-5e1dd3c65e82.png)
1. (optional)メニューバーの設定を行う
![スクリーンショット 2024-12-09 23.24.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408705/f4c0d9c8-a772-23a9-5dde-7c326f67b49b.png)

※ AppleのCalendarにGoogle Calendarを連携させるには[こちら](https://support.google.com/calendar/answer/99358?hl=ja&co=GENIE.Platform%3DDesktop)を参考にしてください

## 参考資料
[Calender | Raycast](https://www.raycast.com/core-features/calendar)
DRP-AI日記その1 なぜDRP-AIシリーズに取り組むのか

このたび，DRP-AIシリーズ・Kakip Advent Calendar 2024を始めました．その目的について語ってみたいと思います．

## 公式ページ

https://www.renesas.com/ja/software-tool/ai-accelerator-drp-ai?srsltid=AfmBOopZlHrDgHbpRxv8I1e0MpFAc7h_kgfaF04RBa0iucxujQ6asizl

> ディープラーニングによる人工知能(AI)技術は、すでにITの世界で様々な新しい価値の提供を始めており、組込み用途での活用が望まれています。
> しかし、一般的に画像などを用いたAIの処理には従来のソフトウェアに比べて桁違いに大量の演算が必要であり、CPUやGPUのような従来のソリューションでは電力が大きすぎて組込み用途に使えないという課題がありました。一方、AIの世界は常に進化を続けており、今もなお新たなアルゴリズムが開発されています。
> ルネサスは、この急速なAIの進化の中で、「高い性能と低消費電力」に加え、「進化に対応できる柔軟性」の両方を兼ね備えたAIアクセラレータ「DRP-AI」を開発し、これを搭載した組込みAIプロセッサ RZ/Vシリーズの提供を始めました。

## 性能について

Kakipでも採用されたルネサスエレクトロニクスDRP-AI3は最大80TOPS(おそらくINT8)，10TOPS/Wというような性能を発揮するとしています．

## 計画

[北九州産業学術推進機構(FAIS)の宇宙関連機器新技術開発事業の研究開発プロジェクトを行います](https://zacky1972.github.io/blog/2024/07/19/computer-and-software-for-spacecrafts-and-satellites.html
)

https://zacky1972.github.io/blog/2024/07/19/computer-and-software-for-spacecrafts-and-satellites.html

> ルネサス エレクトロニクス DRP-AI向け機械学習基盤の整備

というわけで，DRP-AIシリーズを使った機械学習基盤の研究開発を行うという名目で研究費をいただいています．具体的には，Elixirの機械学習基盤NxからDRP-AIシリーズを活用する基礎研究を行うというものです．

その背景については，おいおい明かしていきたいと思います．つづく．

## 謝辞

本研究は北九州産業学術推進機構(FAIS)の令和6年度宇宙関連機器新技術開発事業の助成を受けた．
SvelteKitの画像管理：キャッシュ問題をViteで解消する

## はじめに
Sveltekitで画像を取り扱う際、『staticフォルダに置いた画像を変更したけどなかなかユーザーの画像が反映されない、、、』こんな経験ありませんか？
原因は『キャッシュ』かもしれません。
今回は`vite`の 機能を使って画像を簡単に参照するやり方をご紹介させていただきたいと思います！

前半はstaticフォルダに画像を配置するとなぜキャッシュの問題が起きやすくなってしまうのか、
後半では画像を`assets`フォルダにおいて`Vite`経由で管理する具体的なやり方について書いていきます。
なので、具体的な書き方だけ知りたい方は後半まですっ飛ばしていただければと思います！

## 開発環境
この記事では以下の環境を使用していますが、一般的なSvelteKitプロジェクトでも大丈夫です！
- MacOS
- node v20.12.2
- svelte 4.2.19

## 画像が更新されない原因
冒頭でも少し触れましたが、『staticフォルダに置いた画像を変更したけどなかなか画像が反映されない、、、』こう言った現象の大きな原因はブラウザのキャッシュにあります。
<br>

### ブラウザのキャッシュについて
ブラウザはページの読み込みを高速化するため、サーバーから一度取得した静的なリソースをキャッシュに保存します。
再度同じリソースが要求された際は、サーバーに問い合わせをせずに、ローカルに保存されたキャッシュを使用します。
ファイル名やパスが変更されていない場合、ブラウザはそのリソースが更新されているかどうかをチェックせず、キャッシュをそのまま使用します。
<br>

ブラウザはこの仕組みによって、画像を変更してもファイル名やパスが変更されていなかったらブラウザはキャッシュに保存された画像を表示してしまいます。
みかんの画像からりんごの画像に変更してもファイル名やパスが前のままだとユーザーに表示される画像はみかんのまま、、、みたいなことが起こってしまいます。かなしい


## 具体的な書き方
今回はVite経由で画像を管理することによって、ビルド時に画像にハッシュを付与してキャッシュによるトラブルを防ぐようにしていきます。
それでは、早速コードの説明から入ります！

### 読み込みたい画像を配置
assetsフォルダを作成し、読み込みたい画像を配置します。
私は`src/lib/assets/images`に画像を置きました。

```
src/
├── lib/
│   ├── assets/
│   │   ├── images/
│   │   │   ├── index.ts
│   │   │   ├── jaga.jpg
│   │   │   ├── mikan.jpg
│   │   │   ├── ringo.jpg
```

### 同じフォルダ内にtsファイルを作成して以下のように記載
私は`src/lib/assets/images`内に`index.ts`ファイルを作成して以下のコードを書きました。

```TypeScript:index.ts
const images: Record<string, string | undefined> = import.meta.glob(
	"./*.jpg",
	{
		eager: true,
		import: "default",
	},
);

export function getImagesUrl(name: string) {
	return images[`./${name}`] || "";
}
```

ちなみに`JavaScript`だったらこんな感じのコードになるかと思います！

```JavaScript:index.js
const images = import.meta.glob("./*.jpg", {
	eager: true,
	import: "default",
});

export function getImagesUrl(name) {
	return images[`./${name}`] || "";
}
```

コードについて説明していきたいと思います。
viteに複数のモジュールをインポートする`import.meta.glob` というものがあり、
それによって対象の画像をまとめてインポートしています。

こちらの設定の部分について
```JavaScript
{
	eager: true,
	import: "default",
},
 ```
 `eager: true,`で対象の画像をビルド時に画像が即座にインポートします。こうすることでawaitを書く手間が省けるので特に理由がなければこちらの設定をしておくでいいと思います。

`import: "default"`で画像のパスをデフォルトエクスポートするため、簡単に画像を利用できます。
<br>

### svelteのコンポーネントやpagesファイルに以下を記載
今回は+pages.svelteに記載していきます
```Svelte:+pages.svelte
<script lang="ts">
	import { getImagesUrl } from '$lib/assets/images';
</script>

<div>
	<img src={getImagesUrl('mikan.jpg')} alt="ExampleImage" />
</div>

<style>
	img {
		max-width: 50%;
		height: auto;
	}
</style>
```
このようにすることで、
ビルド時に画像にハッシュが付与されるので、画像を変更した際はURLが変わっていなかったとしても変更が反映されるようになります。


## 今回のポイント
- staticフォルダに画像を置くと、キャッシュによって変更前の画像がユーザーにずっと配信されてしまうことがある
- assetsフォルダに画像を配置してViteのimport.meta.globでインポートすることによって画像にハッシュを付与できるため変更がすぐに反映できる
- svgやpngなども同じ方法で画像を取り扱うことができます！

いかがでしたでしょうか？
今回の記事が少しでも読んでいただいた方のお役に立てれば幸いです！
それでは〜！！
blastengineのメールエラーWebhookをAWS LambdaのNode.jsで処理する

[blastengine](https://blastengine.jp/)はエンジニアフレンドリーなメール送信サービスになります。APIまたはSMTPを使って、簡単にメール送信を行えます。

blastengineではエラーメールに対するWebhook通知をサポートしています。この記事では、その扱い方とデータについて、AWS LambdaのNode.jsを使った処理を通じて解説します。

## 設定

Webhook設定はblastengineの管理画面で行います。設定の中にあるWebhookをクリックします。

![001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/059adabd-6159-2cd4-12d3-9d98c075b1c2.jpeg)

設定は主に2つです。

- エンドポイントURL
Webhookを受け取るURLです
- 通知イベント
Webhookを受け取るイベントです

エンドポイントURLにはPOSTメソッドで呼ばれます。Content-Typeはapplication/jsonになります。通知イベントは以下の3つが用意されています。

- ドロップ
エラー停止リスト内にあるメールアドレス宛に送信しようとした場合のエラーです
- ハードエラー
ホストがない、ユーザーがいないといった恒久的なエラーです
- ソフトエラー
メールボックスがいっぱいなど一時的なエラーです

## 注意点

2024年11月現在、Webhookはトランザクションメール（即時配信メール）に対してのみ有効です。バルクメール（一括配信）やSMTPリレーは未対応です。

## データを受け取ってみる

実際に受け取るデータのフォーマットです。以下はドロップの例です。 `error_message` にエラー内容が入ります。

```json
{
	"events": [
		{
			"event": {
				"type": "DROP",
				"datetime": "2023-01-26T16:17:54+09:00",
				"detail": {
					"mailaddress": "user@drop.example.com",
					"subject": "Test subject",
					"error_code": "554(errors)",
					"error_message": "エラー停止リストに含まれる宛先であるため、配信がドロップされました",
					"delivery_id": 1128
				}
			}
		}
	]
}
```

以下はハードエラーの場合です。ホストがない、ユーザーが存在しないなど恒久的に発生する場合のエラーです。

```json
{
	"events": [
		{
			"event": {
				"type": "HARDERROR",
				"datetime": "2023-01-26T16:22:43+09:00",
				"detail": {
					"mailaddress": "user@harderror.example.com",
					"subject": "Test subject",
					"error_code": "550",
					"error_message": "宛先のメールアドレスがありません",
					"delivery_id": 1129
				}
			}
		}
	]
}
```

## AWS Lambdaでの処理

今回はNode.js 22.xを使います。以下のコードを書いて、AWS Lambdaにデプロイします。

```javascript
export const handler = async (e) => {
  // 受け取った内容は e.body に入ります
  const { events } = JSON.parse(e.body);
  // イベントの取得
  const [ { event } ] = events;
  console.log(event.detail.error_message); // 宛先のメールアドレスがありません

  const response = {
    statusCode: 200,
    body: JSON.stringify('ok'),
  };
  return response;
};
```

## まとめ

データが受け取れれば、後はSlackへ通知したり、データベースと連携するなど自由に行えます。配信先リストを自動クリーニングするのにも使えるでしょう。

一例としてZapier経由でSlackへ通知するデモを[blastengineのwebhook機能でメール送信が失敗したらzapier経由でSlackに通知できるようにした。 - Qiita](https://qiita.com/hirosatooooo/items/21573f79fbb8599090d1)にて紹介しています。ご覧ください。

[エンジニア向けメール配信システム「ブラストエンジン（blastengine）」](https://blastengine.jp/)
Background script と Contents scriptの連携

# 概要

これは[初心者のブラウザ拡張機能 Advent Calendar 2024](https://qiita.com/advent-calendar/2024/browser-extension)の9日目の記事です。

`Background script`と`Content script`の連携について記載します。

# 使用する場面

たとえばメニューが押されたときにWebページのコンテンツを操作したいときや、コンテンツでコピーした情報をバックグラウンドで扱いたいときです。

クリップボード機能へアクセスするときなど。

# 連携方法

`browser.tabs.sendMessage`と`browser.runtime.onMessage`を使います。

| 構文 | 使う場所 | リンク |
| ---- | ----  | ---- |
| browser.tabs.sendMessage | Background script | [tabs.sendMessage()](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/sendMessage) |
| browser.runtime.onMessage | Background script<br>Content script | [runtime.onMessage](https://developer.mozilla.org/ja/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage) |

# 使用例

## BackgroundからContent

メニューを作り、そのメニューがクリックされたときに`Content Script`へ遷移してコンソールにメッセージを出力します。

```javascript:Content Script
function onMyMessage() {
  console.log("get message !");
}

browser.runtime.onMessage.addListener(onMyMessage);
```

`Content Script`は`browser.runtime.onMessage.addListener`で呼び出されたときの処理を指定します。

```javascript:Background Script
function onError(error) {
  console.error(`Error: ${error}`);
}

browser.menus.create(
  {
    id: "sample",
    title: "sample menu",
    contexts: ["page"],
  }
);

function send(tabs) {
  for (const tab of tabs) {
    browser.tabs
      .sendMessage(tab.id, {})
      .catch(onError);
  }
};

browser.menus.onClicked.addListener((info, tab) => {
  console.log("clicked");
  if (info.menuItemId === "sample") {    
    browser.tabs
      .query({
        currentWindow: true,
        active: true,
      })
      .then(send)
      .catch(onError);
  }
});
```

`browser.tabs.query`でブラウザのタブを取得します。これは`browser.tabs.sendMessage`でタブが必要になるためです。

`function send(tabs)`内が`Content Script`へ送信している処理です。

## ContentからBackground

Webページ上でダブルクリックすると通知します。

```javascript:Content Script
window.addEventListener("dblclick", send);

function send() {
  browser.runtime.sendMessage("クリック！");
}
```

ダブルクリックイベントを取得して、`send`関数を呼びます。

```javascript:Background Script
browser.runtime.onMessage.addListener(notify);

function notify(message) {
  browser.notifications.create({
    type: "basic",
    title: message,
    message: ""
  });
}
```

`notify`関数で通知します。
【ポエム】リードエンジニアとしてチームの取りまとめで工夫したこと

# はじめに
私はWebエンジニアとして１０年目になります。
前職の会社がSIerで、約８年ほどWebシステムの開発ENとして従事していました。
ウォータフォールで開発が主流で、規模にもよりますが１案件３名くらいがアサインしていました。
こちらの人員の内訳としては窓口兼PM的なベテランENが１名、実装をするEN（自分）が１名〜２名、両者を取り持つENが１名、みたいな開発体型でした。

現在は転職を経て、スクラムで開発している現場で業務をして２年ちょいくらいになります。
今回はリードエンジニアとしてENメンバー（実装をするEN）の取りまとめでどのような立ち回り、工夫をしたのかをまとめます。
後述はあくまで上記の経歴で、 ***それぞれの開発手法を体験してどのように感じたかという、主観混みのただの感想である旨をご了承ください。***



# リードエンジニアとして
## 工夫、したところ
- スケジュールをタイトにしすぎない
    - とはいえ、マージンたくさん設けない
- やって欲しいタスクのゴールを決めて、あとは自由に実装してもらう
    - 実装はお任せすることで、不自由にさせない。
        ※設計からしっかりやらないといけないものを除く
- 仕様等の解像度が低い場合は、ENメンバー全員で話す
    - 結構重要。共通認識をチームメンバーと一緒に築く😇
- 実装に時間がかかりそうなところがないか、都度壁打ちをする
    - 労力とアウトカムの釣り合いが取れていないのであれば、POやデザイナに相談して簡単な実装になるように仕様を変更する。
        - これも重要😇
        - もちろん、顧客体験を損なわないか？も吟味した上
- 相談しやすい人として接する。問題がないか気にかけてあげる
    - 相談しにくいと、実はこんな実装してしまいました〜とかあると、後々軌道修正が大変
- 細かいタスクは自分が吸収して、ENの実装に集中できるようにする
    - 集中できるタイムブロックが長ければ長いほど、生産性が上がる

## 大変だったこと
- 自分がまとめて開発する時間があまり取れないため、実装する時のいわゆるゾーンに入るのが時間がかかる。
    - 結構これが大変。
- ENのフォローを優先するため、この刺さり込みによって、自分のタスクの消化が進まない。
    - 進まないこと前提ではあるが、タスクの取りこぼしがないように、カレンダーやタスクに起こしておく必要あり。
- 技術的なことや、データの構造に関するベースに関する取り決めの最終決定をしないといけないため、自信を持たないと、不安に襲われそうになり、ストレスが溜まってしまう


# おわりに
工夫していた点はリードエンジニアとしてというよりかはエンジニアとか関係なく、メンバーを取りまとめるための長として、メンバーが心地よく作業に集中するため、誰でもできることをしているだけなので、これらを腐ることなくコツコツと実行できるかが重要だと思いました。
デバッガに求めらる機能

こんばんは、やましょうです。
秋ロボのアドベントカレンダーです。

# デバッガに求められる機能<br>

## ブレイクポイント
### 1.ブレイクポイント無制限
ブレイクポイントは無制限レベル（すくなくとも２０個は欲しい。)
### 2.メモリーによるブレイクポイント
メモリー破壊調査時には超絶効力を発揮するので絶対必要
### 3.ブレイクポイント一致でパルス出力
ブレイクポイントに一致した時パルスを出す機能（あると便利）
### 4.トレース機能
10個くらいまで前までが判れば良い（どこからエラーに飛んだか？わかるレベル）

## RAM View
基本リアルタイムなRam View

## ROM View
1byte変更すると他の領域が0xffにならないromview(なんで、ダブルクリックで、0xff消すのやめてほしい）

## SFR view
SFRもリアルタイムで見たい。

## アセンブルView
これは必要


これを見たすデバッガはMPLAB(PIC)とXStormy(LC88F)しか存在しない。
LC88FはMPLABより高速に動くし大好きであったが、DISCONした。
ARM系のデバッガすべてダメだ。遅すぎる。ってかRAMリアルタイムに見れないの。。
なんで１秒毎に更新なんだよ。。。遅すぎなんだよ。。。


ということでお暇な方？一緒にデバッガ？作りません？

以上
やましょうでした。
LightGBMの効率的な計算の秘密とは？

機械学習の分野でよく使われるLightGBM（Light Gradient Boosting Machine）。その特徴の一つは、他のアルゴリズムと比べて非常に高速かつ効率的に学習できる点です。本記事では、その理由をわかりやすく解説します。
※この記事は、ChatGPTの出力を基に作成しています。

---

## LightGBMが効率的な理由

### 1. **Leaf-wise（葉優先）成長戦略**
LightGBMはツリーを構築する際、他のアルゴリズムとは異なる「葉優先（leaf-wise）」成長戦略を採用しています。

- **従来の方法（層優先）**:  
  XGBoostなどの多くのアルゴリズムは、ツリーの深さを均等に拡張する「層優先（level-wise）」戦略を採用します。この方法では、全てのノードが順番に分割されるため、無駄な計算が発生しがちです。

- **葉優先（leaf-wise）戦略**:  
  LightGBMでは、現在のツリーの中で最も損失を減らせる葉（ノード）を選択して分割します。これにより、必要な部分にリソースを集中でき、無駄を省きつつ高い精度を実現します。

**ポイント:**
- 必要な分岐に集中するため、学習が高速で精度が高い。
- ただし、データが少ない場合や深すぎるツリーはオーバーフィッティングのリスクがあるため注意。

---

### 2. **Histogramベースの分割**
LightGBMは、特徴量の値を直接扱うのではなく、**ヒストグラムに変換**して分割点を探索します。

- 特徴量の値をビン（区間）にグループ化して、値を「離散化」します。
- 分割点の探索時には、ヒストグラムのビンごとにデータを集計して計算を行います。

これにより、特徴量ごとの分割点を効率的に見つけることができます。

**メリット:**
- **計算量削減**: 逐一値を確認する必要がないため、高速。
- **メモリ効率向上**: 大量の特徴量を扱う際にもスムーズ。

---

### 3. **並列処理の活用**
LightGBMは、データ処理や計算を効率化するために並列処理を活用します。

- **ヒストグラムの並列計算**: 各特徴量の分割点を独立して計算できるため、複数のCPUやGPUを利用して高速化。
- **データ構造の最適化**: 計算がキャッシュメモリに収まるよう工夫されており、高速なアクセスが可能。

---

### 4. **疎なデータへの対応**
LightGBMは、欠損値やゼロの多い疎なデータを効率的に処理します。

- 欠損値を1つのカテゴリとして扱うか、欠損を考慮した分割点を選択。
- ワンホットエンコーディング後のような疎なデータにも対応可能。

---

### 5. **その他の最適化**
LightGBMはさらに以下のような技術を利用して効率性を高めています。
- **損失削減の最適化**: ヒストグラムの差分を再利用して、計算を効率化。
- **正則化**: 過剰な分岐を抑えるための正則化機能を備え、計算量を抑えつつオーバーフィッティングを防止。

---

## LightGBMのカテゴリカル変数の扱い（おまけ）
カテゴリカル変数の処理は、機械学習における重要な課題の一つです。LightGBMでは、このカテゴリカル変数も効率的に扱えるよう設計されています。

### **LightGBMの特徴的なアプローチ**
1. **One-Hotエンコーディングが不要**:  
   他のモデルではカテゴリカル変数を数値化するために、ワンホットエンコーディングやターゲットエンコーディングが必要です。LightGBMでは、カテゴリ型をそのまま指定するだけで処理が可能です。

2. **最適な分割の自動選択**:  
   カテゴリ値をグループ化し、損失が最小になる分割点を自動で探索します。

3. **Pythonでの設定方法**:
   ```python
   import pandas as pd
   import lightgbm as lgb

   df['category'] = df['category'].astype('category')  # カテゴリ型に変換
   lgb_data = lgb.Dataset(df[['category', 'value']], label=df['target'], categorical_feature=['category'])
   model = lgb.train(params={}, train_set=lgb_data)
   ```

**注意点:**
- カテゴリ数が非常に多い場合、計算が複雑になるため、頻度が少ないカテゴリを「その他」にまとめるなどの工夫が必要です。

---

## まとめ
LightGBMが効率的に計算できる理由は、以下の工夫にあります：
1. **葉優先のツリー構築戦略**で計算量を削減。
2. **ヒストグラムベースの分割**で特徴量の探索を高速化。
3. **並列処理や最適化されたデータ構造**で計算効率を向上。
4. **疎なデータの効率的処理**でメモリ使用量を削減。

さらに、カテゴリカル変数も簡単に扱えるため、複雑な前処理が不要です。

LightGBMはこうした技術を組み合わせることで、高速かつ高精度なモデル構築を可能にしています。特に、大規模データや特徴量が多いデータセットでその真価を発揮するため、ぜひ試してみてください！
#atcoder #プログラミング # AHC040の置き方案

# 概要
コンテスト中に公式の解説動画にある棚式を考え出したものの、勘違いでできないと判断してしまった(^^;
別の置き方を考え出す必要があり、その結果。
下記を踏まえたもの。
- 問題にある通り、順序を変えてはいけない
- 問題にある通り、入力値には誤差があるため座標的な位置を特定することはできない
- 得点の計算式から正方形に近くなる方が良い
- 問題にある通り、置き方指示はかなりの縛りがある

# 案1
問題の例からヒントを得たもので、4つセットで置く。
下図の向きで置く。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397476/02e53bb4-d608-9b8b-5cb7-492f1ef0836e.png)


そしてこれを再帰的に行う。
どういうことかというと、最初はこれで0～3の物が置かれる。
次はこのセットを1つの物とみなす。
このため、4は下図になり、16は更にこれ全体を1つの物とみなすので、5の右になる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397476/2829c38b-feab-935e-56e9-29a165447402.png)

# 案2
物の最大数は100。
とすると、案1だと、べき乗ではなく中途の場合は横長になってしまう。
例えば92だと下図。
(黒字は置き方に使用する物。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397476/b28e0849-6cc6-e49d-1b27-28f5c661d921.png)

64以降を左右均等にするのが下図。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397476/0d84bbea-de85-1fe9-6cda-95ee7199ea2e.png)

が、今思えば、更に小さいべき乗の場合も起こる(笑)
例えば、28とか。

# 案3
案2の最後の均等置きを利用して、下図のように全て均等置き。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397476/39a34998-69aa-c9c5-2c27-e14a9aefae19.png)

# 案4
この均等置きは、セットではなく1コずつの場合で最初の方に思いついた。
ただ、1コで行った場合、下図のようになってしまうと思ったために却下した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397476/aeb37b15-4608-c087-8aab-64d56b2a8f0e.png)

ただこれは、斜辺全部を対象にした場合で、交互に1つだけ、2つ前を対象とすると、スライドが発生してこのようにはならないだろうと思った。
その場合の置き方が下図。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397476/169c6df6-eefa-19ba-be9c-1a0627f6a3f3.png)

最終的には4つの中ではこれが一番良い得点になった。
自分のWebサイトを作るとき参考になった記事3選

自分のWebサイトを作るとき参考になった記事を紹介する。

https://polan6.github.io/homepage/

# ReactをGitHub Pagesにデプロイしよう〜Vite編〜

https://qiita.com/tat_mae084/items/4051c61926dc8165e80b

WebサイトはViteで作っていたので、デプロイの際にはこの記事が参考になった。ただし、この記事そのままでは`yarn git`実行時にコミットメッセージがないためコミットされなかった。`git commit`に`git commit -m "commit message"`と書き足してあげると正常に動作する。


# GitHub Pages で React Router を使った SPA サイトを動かす方法

https://maku.blog/p/9u8it5f/

React RouterはGitHub Pagesでは正常に動作せず、ルート以外のページで再読み込みすると404エラーが生じるが、カスタムした`404.html`を設定してあげるとエラー時にそれが表示される。これを利用して、カスタムした`404.html`を用意し`index.html`に誘導、そこから各ページにさらに誘導するという流れでReact Routerを擬似的に機能させることができる。詳細な解説は上の記事を参照していただきたい。

`404.html`を追加する際に注意することとして、デフォルトの設定では`index.html`しかビルドファイルに含まれないということがある。以下の記事のように設定すると`404.html`もビルドファイルに含んでくれる。

https://qiita.com/xrxoxcxox/items/9e4e08ae01262b8fc5f7

# JavaScriptを使ってハンバーガーメニューを作る方法を解説【サンプルファイル付】

https://zero-plus.io/media/nav-hamburger/

ハンバーガーメニューを作る際参考になった。CSSには苦手意識があるため、かなり助かった。この記事では幅が大きい際ヘッダーにリンクを記載するというレスポンシブデザインを採用しているが、私が作ったWebページでは、今後リンクの数が増えることも鑑みてレスポンシブデザインを採用しなかった。

# おわりに
以上がWebサイトを作る際に役に立った記事である。特に最初2つの記事は、Reactを使ってホームページを作りたい人にとってはとても役に立つものだと思うのでぜひおすすめしたい。
Rを学びたい Step17 離散型確率分布と連続型確率分布の違い

## はじめに
Rを学びたいStep17です。今回は離散型確率分布と連続型確率分布の違いを学んでいきます。

## そもそも確率分布とは？
確率分布とは確率変数が取りうる値と、それに対応する確率の関係を表したものです。
もっと簡単に言うと、「どんな値がどれくらいの確率で起こるか」をまとめたものです。

:::note info
聞いてみると、簡単な話ですよね。では、なぜ離散型確率分布と連続型確率分布を分けているのか？それは図や数式での表し方が異なるからです！！
:::

## 離散型確率分布とは
離散型確率分布は、確率変数が「数えられる値」をとる場合の分布のことです。
わかりやすいやつだと、サイコロです。1,2...6で数が数えられる分布の場合、下記のような表に表せます。

| **さいころの出る目** | 1      | 2      | 3      | 4      | 5      | 6      |
|----------------------|--------|--------|--------|--------|--------|--------|
| **確率**             | 1/6    | 1/6    | 1/6    | 1/6    | 1/6    | 1/6    |

→何がどれくらいの確率で表示されるか、一目瞭然ですね！

## 連続型確率分布とは
連続型確率分布は、確率変数が「連続的な値」を取りうる場合の確率分布です。取りうる値が無限に多い場合に使用されます。例えば、身長や体重、気温など、小数点以下の細かい値を含むものがこれに該当します。

:::note info
離散型の確率分布は取りうる値が決まっているので、表に落とし込む事ができます。
ただ、身長や体重などは数値が連続的に続き切れ目がないので、この時の場合の確率は何というのができないです。
そこで、グラフでの範囲の表示や数式で表現します。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/95136ab4-9f43-a4f5-8860-f4442547a0ec.png)

## 離散確率分布のサイコロ

```R
# サイコロの目
dice_faces <- 1:6

# 各目が出る確率 (均等)
probabilities <- rep(1/6, 6)

# 表を作成
dice_table <- data.frame(
  サイコロの目 = dice_faces,
  確率 = probabilities
)

# 表を表示
print(dice_table)
```

```shell
~/develop/R/r_study/kakuritu  (main)$ Rscript kakuritu.r                                                                    (base) 
  サイコロの目      確率
1            1 0.1666667
2            2 0.1666667
3            3 0.1666667
4            4 0.1666667
5            5 0.1666667
6            6 0.1666667
```

### 連続型確率分布

```R
# 正規分布のパラメータを設定
mean_height <- 170  # 平均身長 (cm)
sd_height <- 5       # 標準偏差 (cm)

# 1. 確率密度関数 (PDF) を計算
x <- seq(150, 190, by = 0.1)  # 身長の範囲 (連続値)
y <- dnorm(x, mean = mean_height, sd = sd_height)  # 確率密度

# 確率密度関数をプロット
plot(
  x, y, type = "l", col = "blue", lwd = 2,
  main = "Probability Density Function (Normal Distribution)", # タイトル (英語)
  xlab = "Height (cm)",  # x軸ラベル (英語)
  ylab = "Density"       # y軸ラベル (英語)
)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/d32ee7aa-c4b0-0d17-24bd-eddb06a5c2a4.png)
アプリ作成の振り返り

# フロントエンド編
## コンポーネント設計
https://qiita.com/YujiYamaguchiForTech/items/16da375f9ddb50e238e2
## Hooksについて 1
## 状態管理
https://qiita.com/YujiYamaguchiForTech/items/5da565f8118e9acd1b75
## reduxについて 
## セキュリティについて 1
## ルーティング 1
## MVCモデル、設計について 1
## ネットワークについて 1
## CSSについて 1

# バックエンド編
## ステータスコードの取り扱いとリクエストレスポンスの形状 1
## RestfulAPI 1

# git編
## git操作基礎について 1
## gitフローについて 1

# +α
## 各ケースに対する効率的な記法 1
### react編 1
### css編 1

# アプリ自体の反省点改善点 1
# チーム開発に対する反省点 1

# おまけ
## docker基礎
## typescripte基礎
## エラーハンドリング
SME日記その10 Streaming SVE modeでCNTWを実行してみる(再考)

[SME日記その4 Streaming SVE modeでCNTWを実行してみる．](https://qiita.com/zacky1972/items/3182fa1693983846205d)に寄せられた[コメント](https://qiita.com/zacky1972/items/3182fa1693983846205d#comment-ad9e51f41dd14216a9a6)を踏まえて，再考してみます．

SMEシリーズ

- [Apple Silicon M4はM3シリーズからScalable Matrix Extension (SME)命令などが足されている](https://qiita.com/zacky1972/items/69fd802fd41ae4d7d469)
- [SME日記その1: Apple Silicon M4に搭載されたScalable Matrix Extension(SME)のベクトル長(SVL)を取得する](https://qiita.com/zacky1972/items/231fd22a1fdef15d4108)
- [SME日記その2: Apple Silicon M4にはCVTW命令は備わっていない？](https://qiita.com/zacky1972/items/a4fc98614df085586175)
- [SME日記その3: Apple Silicon M4にどの命令が実装されているかをsysctl hwの実行結果とドキュメントから推測する](https://qiita.com/zacky1972/items/427035001554cb9768bc)
- [SME日記その4 Streaming SVE modeでCNTWを実行してみる．](https://qiita.com/zacky1972/items/3182fa1693983846205d)
- [SME日記その5 Streaming SVE modeでCNTWを実行してみる Part 2](https://qiita.com/zacky1972/items/b7b5dd456fe021b30eb2)
- [SME日記その6 Streaming SVE modeでsvcntw()とsvcntsw()を実行してみる](https://qiita.com/zacky1972/items/7d4ec630d54564ebb9b3)
- [SME日記その7 svcntw()とRDSVL命令の実行結果の関係性を考察する](https://qiita.com/zacky1972/items/48cf7577e254b8c3a0b6)
- [SME日記その8 __arm_new("za")について調べる](https://qiita.com/zacky1972/items/762b73b3414369d762ad)
- [SME日記その9 OpenBLASのSME対応状況について調べる](https://qiita.com/zacky1972/items/0c6f5aed0365f1b4fdb6)

## いただいたコメント

https://qiita.com/zacky1972/items/3182fa1693983846205d#comment-ad9e51f41dd14216a9a6

> 推測を外したお詫び（？）にこの記事の実行結果をちゃんと説明しておくと、まず、Streaming SVE Modeへの切り替えは正しく行われます。そして、Streaming SVE Modeで printf が実行され、その内部で実行される浮動小数点命令がStreaming SVE Modeに対応していないのでSIGILLになります。デバッガーを使えば一発でわかります。
> 
> printf の内部でクラッシュするのは、（理由は違いますが）x86-64でアセンブリー言語を書くプログラミングをしているとたまに遭遇するので、懐かしい気分になりますね。

## 検証プログラムコード

```c:cntw.c
#include <stdint.h>
#include <stdio.h>

void smstart()
{
  asm volatile ("smstart sm");
}

void smstop()
{
  asm volatile ("smstop sm");
}

uint64_t cntw()
{
  uint64_t count;
  asm volatile ("cntw %0"
                : "=r"(count)
               );
  return count;
}

int main()
{
  smstart();
  uint64_t c = cntw();
  smstop();
  printf("%llu\n", c);
}
```

## コンパイル方法

```zsh
clang -O2 -march=armv9-a+sme -o cntw cntw.c
```

## 実行の方法と結果

```zsh
% ./cntw                                     
16
```

## まとめ

お騒がせしました．確かに`printf`をStream SVE Mode の外に追い出せば，実行できました．これは注意しないといけないですね．

そして，デバッガを使うことも大事...
Max-Min 公平性

>送信者エンティティに帯域をどのように割り当てるかについてはこれまで言及してこなかった。

# 帯域管理をしないと輻輳が起こる
>この問題と輻輳制御がどう関係するのか

>ネットワークが各フローや各コネクションに対して、厳密な割り当てを行わないこともある。

### 帯域を奪い合うから帯域の割り当てを行う
>例えば、IETFのサービスでは、トラフィックは２つのクラスに分類され、複数のコネクションが`各クラスの帯域を奪い合う`。IPルーターでの全てのコネクションが同一の帯域を奪い合っている場合もある。このような場合には、`競合関係にあるコネクションに帯域を割り当てることが輻輳制御に相当`する

# 各フローに対する公平な分配とは何か

### 一つのリンクが使える帯域を小さくして公平にする
>フロー１は３本のリンクを含んでいて、もう一方のフロー２は、一本のリンクを含んでいる場合を考える。フロー１は、より多くのネットワーク・リソースを使うので、フロー１に与えられる帯域を、フロー２より少なくした方がより公平だと考えることができる。このことは、公平さと効率との本質的な関係を表現している。

フロー　p383

### 複数のコネクションが取る複数の経路は、異なる容量を持つから均等に帯域を割り当てられない
>各コネクションに均等に帯域を割り当てる方法はそう簡単ではない。なぜならば、`複数のコネクションが取る複数の経路は、異なる容量を持つから`である。例えば、一つのフローに関して、`ダウンリンクは混雑してボトルネック`となっており、一方の`アップリンクでは例えば、一つのフローに比べて小さな帯域を割り当てられる`場合を考える。この場合、`他のフローの帯域を落としてボトルネック・フローに帯域を割り当て用途する事は、他のフローを遅くするだけ`であり、ボトルネック・フローの解決策には少しもならない。

# Max-Min公平性 増やしも小さくもできないギリギリのところ
>ネットワークに求められた公平性の一つがMax-Min公平性である。あるフローに割り当てられた帯域を、`他のフローに割り当てられた帯域を小さくする事なく、それ以上大きくできない時、その帯域割り当て`はmax-min公平と呼ばれる。つまり、`あるフローの帯域を増やすことは、他のフローの状況を悪化させる`ことになる。

### 公平性には色々基準があるしかし多くの場合どれも帯域不足を起こさないようにすること
>どのレベルの公平性を考えるかである。コネクション・レベルで公平が、ホストのペア間で公平か、ホストごとのすべてのコネクションで公平かなどである。

>全てのコネクションが正確に同じ量を割り当てられるかどうかではなく、どのコネクションも帯域不足の問題を起こさないと言うことである。

https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/
#73　Fugaku-LLMをローカルで動作させてみた

# 概要
2024年5月10日にスーパコンピュータの富岳を学習に用いた大規模言語モデルの「Fugaku-LLM」が発表されました

(https://pr.fujitsu.com/jp/news/2024/05/10.html)

今回の記事ではこの「Fugaku-LLM」をローカルマシンで動作させ、Discord上から動かしてみたいと思います

# 環境構築
### 1. Ollamaのインストール
Ollamaは大規模言語モデルををローカルで動かすためのツールです
こちらのページ( https://ollama.com/download/windows )から環境に合わせてダウンロードし、インストールします<br>
※今回の記事ではWindows環境を前提とします

### 2.(必要な場合)CUDAのインストール
お使いのPCにnvidia製のGPUが搭載されている場合は、CUDAをインストールします
( https://developer.nvidia.com/cuda-downloads )

### 動作チェックする①
コマンドプロンプトで
```console
ollama run nebel/fugaku-llm:13b-instruct
```
と入力すると自動的にFygaku-LLMのダウンロードと起動が行われます

```
>>> Send a message (/? for help)
```
このように表示されたら成功です。適当に質問をしてみて答えが返ってくるか確認しましょう

### 動作チェックする②
任意のブラウザで`http://localhost:11434`にアクセスし、`Ollama is running`と表示されればWebAPI経由で操作することができます

# Discordで動かす
基本となるコードは、[以前の記事](https://qiita.com/nxted_sapporo/items/157adffa3c6931b3b238)をベースとして作成します

以前のコードの```//メッセージをOpenAIのAPIに渡せる形に成型する```から```//返信```までを改修します

### 実装
* 今回は192.168.1.2が割り当てられているマシンでFugaku-LLMを動作させています
* node-fetchを用いてWebAPIを叩きます
  * ollamaのAPIのドキュメントは[こちら](https://github.com/ollama/ollama/blob/main/docs/api.md) 
```typescript
    //メッセージをOllamaのAPIに渡せる形に成型する
    const messages: { role: "assistant" | "user", content: string }[] = new Array();
    for (let message of messagesCollection) {
        const role = ((message[1].author.id == client.user?.id) ? "assistant" : "user");
        messages.push(
            {
                role: role,
                content: message[1].content
            }
        );
    }
    logger.debug(messages);

    const body = JSON.stringify({
        model: "fugaku-llm-13b-instruct",
        messages: messages,
        stream: false
    });

    //APIにメッセージを投げて返答を抽出
    const response = await fetch("http://192.168.1.2:11434/api/chat", {
        method: 'POST',
        body: body
    });

    const content = JSON.parse(await response.text());
    if (!content.message.content) {
        return;
    }

    //返信
    message.reply(content.message.content);
```

### 動作確認
以下のコマンドを実行し、Discord上でメッセージを送信すると、画像のように返信してくれることを確認します
```console
$ npx ts-node ./src/main.ts
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843084/70147573-0c3f-7768-1255-98be4d72c381.png)



# まとめ
今回は大規模言語モデルをローカルで動作させ、Discord上で操作してみました<br>
日本で開発されたLLMということで日本語性能に期待していましたが、サイボーグを自称したりと回答としてやや不安な面があることがわかりました
Splunk脅威リサーチチームブログを参考に脅威ハンティングを始めてみよう

# はじめに

- SIEMを使ったユースケースとして脅威ハンティングがありますが、実際のサイバー攻撃を基にしたハンティングのためのクエリを公開しているWebサイトは少ないかと思います
- Splunkが公開している脅威リサーチチームブログで、詳細なサイバー攻撃の事例や、分析のためのクエリが載っているので、脅威ハンティングを行うための参考としてご紹介します


# Splunk脅威リサーチチームブログについて
- [Splunk脅威リサーチチーム](https://www.splunk.com/en_us/surge/threat-research.html)はサイバーセキュリティの研究に重点を置き、新しい攻撃手法やマルウェア、脆弱性について調査しています。また、セキュリティの専門家が最新の脅威に対抗するための情報を提供しており、検知コンテンツの開発や研究手法の紹介も行っています
- 実際のサイバー攻撃の事例ごとに、Splunk脅威リサーチチームが調査結果をブログとして次のWebサイトで公開しています。ブログでは攻撃シナリオに対するSplunkを用いた分析や対応方法のガイドが含まれます
    - Splunk脅威リサーチチームブログ：[リンク](https://www.splunk.com/en_us/blog/author/secmrkt-research.html)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634112/c82acfc8-ddcb-70d0-ccb9-e64d7bd9352c.png)

- 攻撃の事例に基づいて、Splunkで使用できる相関サーチのクエリ(SPL)を公開しています。このクエリを活用することで、SIEMを使った脅威ハンティングを行うことができます


# SOCアナリストやセキュリティ担当者(ブルーチーム)にとってのメリット
- セキュリティ監視対象の組織に対して発生し得る具体的な攻撃の例として参考にすることができます。例えば、組織で利用しているSaaSや、製品に関連する攻撃情報の入手です。該当している場合は、公開されているクエリを利用した脅威ハンティングを行うことができます
- 詳細な分析や対策の考え方が紹介されているため、ブルーチームのメンバーは自身の知識とスキルの向上に役立てることができます


# Splunk Enterprise Securityでの脅威ハンティング実施例
- 攻撃手法に対する分析や、異常なログイン試行の識別などのクエリを、Splunk Enterprise Securityの[RBA(リスクベースアラート)](https://lantern.splunk.com/Security/UCE/Guided_Insights/Risk-based_alerting)のリスクルールとして設定を行えば、過度にアラートを発生させることなく、検知ルールとして利用できます
- クエリを利用して都度サーチを行うのではなくて、RBAのリスクルールでスケジュールサーチとして定期的に実行することで、脅威ハンティングの自動化ができます
- スケジュールサーチでは、負荷を減らすために1日1回の実行で脅威ハンティングを行うやり方もあります

# Microsoft365への攻撃シナリオ解説ブログ
次のブログでは、国家支援の脅威アクター「MidnightBlizzard」(Nobelium/APT29)によるMicrosoft365環境への攻撃シナリオを解説しています

この攻撃では、侵害された特権を持つレガシーなOAuthアプリケーションを利用し、Office 365 Exchange Onlineの「full_access_as_app」ロールを割り当て、メールボックスへの不正アクセスを行いました。 
この手法により、攻撃者は組織内のメールデータを収集し、情報漏洩を引き起こす可能性があるという事例になります。

Hunting M365 Invaders: Navigating the Shadows of Midnight Blizzard：[リンク](https://www.splunk.com/en_us/blog/security/hunting-m365-invaders-navigating-the-shadows-of-midnight-blizzard.html)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634112/9dd6bc09-170f-bcc5-41d5-358e4cf447ed.png)

- 攻撃シナリオとして、[MITRE ATT&CK Tactics(戦術)](https://attack.mitre.org/matrices/enterprise/)の流れで攻撃手法を解説しています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634112/4faf7159-cc27-c9f7-abf4-ed29c8c63ee1.png)



- Microsoft365監査ログとEntra IDログを使った分析方法や、異常なログイン試行の識別方法など、具体的な対策が示されています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634112/59a65fc6-9700-32d4-968e-d4ee2ec353c3.png)


# さいごに
- 上記のMicrosoft365への攻撃シナリオを解説したブログ以外にも、さまざまな分析ブログが公開されています
- 他に、本番環境に近いラボ環境構築や、その環境に対して攻撃シミュレーションを実行できる[Splunk Attack Rangeの新しいバージョンリリースのブログ](https://www.splunk.com/en_us/blog/security/introducing-splunk-attack-range-v3-1.html)なども公開されています
- セキュリティ監視における参考として、この記事が少しでも役に立ちましたら嬉しいです

今日もHappy Splunking!!
Stoplight Studioのdescription記載でイタリック体になる場合の回避方法

## そもそも、Stoplight Studioとは？

- Stoplight Studioは、OpenAPIをグラフィカルユーザーインターフェース（GUI）で簡単に定義できるツール
- 画面上のフォームやボタンを使って、APIの仕様を視覚的に作成可能で、直感的にAPIの設計ができる


## 問題

- descriptionでアンダースコアを利用すると、イタリック体になってしまう(読みづらい。。。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118286/0d2abd87-a63e-cecf-e041-d7b22cea35fe.png)


## 解決方法

- Stoplight StudioのdescriptionはMarkdown記法になっているため、バッククォートで囲んであげる


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118286/cca8cd61-5795-df1f-a1e7-56b9ae78e504.png)

- 綺麗になりました:grin: