OmniAICreator/Qiita-1.07M huggingface dataset:
ドラクエ風RPGを作る (第十七回) 戦闘ウィンドウを追加

# はじめに

ドラクエ風RPGを作るという YouTube 動画の続きです。
以下の動画が最終になっていました。

[ドラクエ風RPGを作る (第十六回) ゲーム状態の導入](https://youtu.be/gTw9G2TqFzk?si=PO3t37iwijUerA1V)

視聴者からのリクエストで続きをやる事にしました。
体調の関係で更新頻度は低くなると思いますが、とりあえず少しだけ進めます。

# コードの場所

GitHub に置いています。

[作成したスクリプト](https://github.com/PythonMan3/PythonGames/tree/master/ShortTaleStory/17)

# 実行画面

![screen.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629087/866b8529-4448-7706-90ff-2f7bb1ed0f1c.jpeg)

# リソースの場所

今回追加した敵の画像は次の URL を使用させて頂きました。


[ぴぽや倉庫: エネミーイラスト](https://pipoya.net/sozai/assets/enemyillust/enemy-image/)
Pipoya RPG Monster Pack.zip

# 今回の内容

今回は戦闘画面を表示するところまでです。

以下のページの内容を参考にしています。
基本的にコピペして、動くようにコードを修正しただけです。
詳細内容は以下のページを見てください。

[人工知能に関する断創録: 戦闘画面](https://aidiary.hatenablog.com/entry/20080803/1281189217)

概要だけ解説します。

## 戦闘の状態遷移

ゲーム状態として、次の３つの状態を追加しています。
状態ごとに各状態ハンドラの処理を実行します。

- BATTLE_INIT
- BATTLE_COMMAND
- BATTLE_PROCESS

## エンカウント

敵と遭遇する事をエンカウントと言います。
確率を使って、敵と遭遇したら戦闘を開始します。

## 戦闘用のウィンドウ

戦闘用に次の３つのクラスを追加しています。

- Battleクラス
- BattleCommandWindowクラス
- BattleStatusWindowクラス

Battleクラスは戦闘を管理するクラスです。
下の２つは、ウィンドウを表すクラスです。

# おわりに

次は戦闘処理を実装します。
【Rust✖︎WASM】定義書から自動でRustの構造体ファイルを作成するWASM公開！

# はじめに
こんにちは。細々とプログラミングをしている[sotanengel](https://x.com/sota_eng_prog)です。

「Rustを使ってWASMを書こう！」との盛り上がりが出てきたので、自分でも実装してみました。

https://sotanengel.github.io/class-creator-rust-wasm


機能としては、
- 定義書に記載したフィールド名を持つRustの構造体のコードを自動生成
- 定義書に記載された詳細などをコメントで追加
- コンストラクタの自動生成
- 任意のフォーマットの定義書でも対応可能

となっています。

```plantuml
@startuml
<style>
root {
  Padding 0
  Margin 0
}
footer {
  FontColor black
  FontSize 30
}
</style>
footer 定義書から構造体+コンストラクタを作成する
title <img:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1758960/1e9d5bc9-de2f-2b09-dd70-a532d6a9a53c.png>
@enduml
```

```plantuml
@startuml
<style>
root {
  Padding 0
  Margin 0
}
footer {
  FontColor black
  FontSize 30
}
</style>
footer 行数を指定すれば任意のCSVファイルからも作成可能
title <img:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1758960/2db53895-797e-33ed-0756-4d4906a7b75f.png>
@enduml
```
# 経緯
やってみようと思ったきっかけは、
- Rustの勉強を継続したいけど、Webアプリとか作ってもサーバー代とかお金かかるよな・・・
→WASM形式に変換すればHTML+JSから呼び出せるらしい👀
- 開発の初期段階では定義書の書き直しが何度も発生するからそれをコードに反映するのめんどくさいな・・・・
→定義書から自動生成すればええやん！

の2点です。
※特にRustの実装で特殊なことはやってないので実装の内容は省略しますが、興味がある人は以下のリポジトリをご覧ください。

https://github.com/sotanengel/class-creator-rust-wasm

# さいごに
WASM使うとRustの勉強しつつ、実際に動くものを世の中に公開できると知ったので、今後も色んな機能のRust製のWASMを作っていきたいなと思います！
もしも上記の定義書コンバーターでバグや機能追加などの要望あれば、以下にて受け付けておりますので、お気軽にご連絡くださいませ。

https://github.com/sotanengel/class-creator-rust-wasm/issues/new
列に展開するメンバーがリストされない（フラグ設定/再構成）(SPSS Modeler データ加工逆引き12-1)

# 列に展開するメンバーがリストされない（フラグ設定/再構成）

![スクリーンショット 2024-10-18 15.43.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/372c2569-b2c0-9ff9-5b77-3bd70782cd1b.png)

## 1.想定されるトラブル

・[フラグ設定]ノードで列に展開するフィールドが見当たらない
・[再構成]ノードで列に展開するフィールドが見当たらない

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/category_ng.str

## 3.サンプルストリームの説明

![スクリーンショット 2024-10-18 15.43.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/3b9a6e31-2896-1a4f-dd43-fe305fb258e8.png)

a.入力するデータは以下の通りです。

![スクリーンショット 2024-10-18 15.45.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/a125eef6-f297-9001-2c66-75caa387b027.png)

#### Cate1とCate2を列に展開する

b.[フラグ設定]ノードを編集します。[セット型フィールド]に[Cate1]と[Cate2]が見当たりません。

![スクリーンショット 2024-10-18 15.45.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ef4e8cb0-8e1b-dbbb-2632-b2bd6b7504af.png)

#### [データ型]ノードでセット値を確定させます

c.[データ型]ノードを編集します。[値の読み込み]ボタンを押して、[Cate1]が[名義型]である点を確認します。この時点で[Cate2]は[不明]に分類され。250種類以上の区分を持つものだと判明します。

![スクリーンショット 2024-10-18 15.46.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/55c9f4a9-9128-6188-0e1b-7cc23caad7e4.png)

c.[フラグ設定]ノードを編集します。[Cate1]は列に展開できる状態となりました。

![スクリーンショット 2024-10-18 15.47.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/69cd2899-d611-ffea-8248-d3b723d3d753.png)

#### [不明]を[名義型]に強制的に変更する

メニューから[ストリームのプロパティ]＞[オプション]を選択します。

![スクリーンショット 2024-10-18 15.50.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/89e548d0-fc88-7528-bad1-7d5901e7371b.png)

赤枠の値を初期値250から、対象とするカテゴリの種類数以上の値に変更します。[Cate2]は343種類のメンバーがあるので344としました。

![スクリーンショット 2024-10-18 15.50.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/9d269886-03d3-465d-b904-bbbc089b8b10.png)

あらためてcの[データ型]ノードを編集します。[値]を[読み込み]に変更し、[値の読み込み]ボタンを押します。

![スクリーンショット 2024-10-18 15.51.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/cd7869fd-b627-e742-7b2d-fdf448826604.png)

もう一度dの[フラグ設定]を編集します。[cate2]もメンバーとしてリスト可能になりました。

![スクリーンショット 2024-10-18 15.52.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/7a66268f-d8a3-b4e1-c55e-086c6353e292.png)


#### 注意事項

本来コンピュターは行（レコード）に対して列（フィールド）が大きくなると計算が遅くなります。SPSS Modelerは一度に列へ展開できる数の初期値を250にしています。1000やそれ以上に変更して列展開を行うとパフォーマンスが悪化しますので注意してください。

## 4.参考情報

#### フラグ変数/ダミー変数作成　縦持ちを横持ちへ

https://qiita.com/416nishimaki/items/5087e38e02be2425ecf3

#### SPSS Modeler ノードリファレンス 3-5 フラグ設定

https://qiita.com/416nishimaki/items/bcaec1cd8e455c3f68a9

#### SPSS Modeler ノードリファレンス 3-6 再構成

https://qiita.com/416nishimaki/items/6dcaecfc9343af0825b6

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/items/4bf813e6cba84b2a1008
Excel VBA 環境の構築手順

Excel VBA（えくせる　ぶいびーえー）は Excel に付属するプログラミング言語（マクロ言語）です。Excel VBA を使うと Excel のセルやシートのデータを自動的に操作する事ができます。ここでは 18 歳の新入社員向けに Excel VBA の環境構築方法を紹介します。

## VBA を使う利点
###  繰り返し作業の自動化
VBA を使うと繰り返し行う作業を自動化できます。例えば、毎日行う作業データの加工処理、レポートの印刷作業を自動化することができます。

### 複雑な処理の実行
数式では実現するのが難しい、複雑な条件の処理を VBA で実装できます。

### どこでも使えるプログラム環境
Excel は職場を問わず、日本の 9 割以上の業務用 PC にインストールされています。VBA で作ったプログラムは、日本のほとんどのパソコンで動かすことができます。

## Excel VBA のバージョンの歴史
1994 年の Excel 5.0 で初めてVBA が搭載されました。最新版は2011年の VBA 7.1 です。

|Office 製品|年|VBA のバージョン|備考|
|---|---|---|---|
|Excel 4.0|1993 年|-|マクロ機能（通称: Excel 4.0 マクロ）が初めて搭載された|
|Excel 5.0|1994 年|VBA|Excel VBA が初めて搭載された|
|Office 95|1995 年|VBA 4.0|Access と Word にも VBA が搭載された|
|Office 97|1997 年|VBA 5.0|PowerPoint にも VBA が搭載された|
|Office 2000|1999 年|VBA 6.0|-|
|Office 2003|2003 年|VBA 6.4|-|
|Office 2007|2006 年|VBA 6.5|リボンUIになり、ファイル形式や拡張子が変わった|
|Office 2010|2010 年|VBA 7.0|初めての 64 ビット版製品|
|Office 2013-2024|2013年-|VBA 7.1|-|
|Office 365|2011年-|VBA 7.1|Excel 4.0 マクロを無効化|

## Excel VBA のシステム要件
VBA 7.1 の動作環境は以下の通りです。

- Excel : 2013、2016、2019、2021、2024、Microsoft 365

この記事では Microsoft 365 バージョン 2406 を例に VBA 環境の構築手順を説明します。

## VBA 開発環境の構築手順
### Excel を起動する
スタートメニューから Excel を起動します。

![408.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/9c95d4fa-825f-53b8-8e0f-6dbdb53f82b4.png)
### 「ファイル」メニューを開く
Excel が起動したら、リボン UI の「**ファイル**」タブをクリックします。

![413.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/112ffdb6-deb1-8ee6-227d-a8946454d45a.png)
### 「オプション」メニューを開く
ファイルの詳細メニューが表示されたら、「**その他**」の「**オプション**」をクリックします。

![423.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/09cfbacf-3e3f-29fd-e5d7-bebfdc8d67e3.png)
### リボンのユーザー設定
オプションが表示されたら、左側のリストの「**リボンのユーザー設定**」をクリックします。
次に右側の「**リボンのユーザー設定**」が「**メインタブ**」になっていることを確認し、リスト内の「**開発**」にチェックをつけます。右下の「**OK**」をクリックします。

![424.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/ff67607c-eaad-9318-d381-e0f65c94a73e.png)
### リボンの表示確認
リボン UI に「**開発**」タブが表示されたら、設定完了です。

![432.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/975180c0-6ab7-8f9c-8f24-1a0b0103066f.png)
macアドレスの表示して遊ぶ。(自分のアドレス)





結果

![o_coq544.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/9438973a-e719-8f3a-1ffc-b0d807238fe7.jpeg)


プログラム


```c++


#include "ESP32_NOW.h"
#include "WiFi.h"
#include <esp_mac.h>  // For the MAC2STR and MACSTR macros


#define ESPNOW_WIFI_CHANNEL 1



void setup() {

  Serial.begin(115200);

  for(int i=0;i<10;i++){
    Serial.print(".");
    delay(1000);
  }//for
  Serial.println();

  // Initialize the Wi-Fi module
  WiFi.mode(WIFI_STA);
  WiFi.setChannel(ESPNOW_WIFI_CHANNEL);
  delay(3000);


  Serial.println("  MAC Address: " + WiFi.macAddress());

}//setup


void loop() {

  delay(1000);

}//loop


```
ソケットファイルとPIDファイルの徹底解説！Railsアプリの安定稼働に欠かせない基礎を学ぼう

## はじめに

Railsアプリケーションの運用やデプロイをする際に、しばしば耳にする「**ソケットファイル**」と「**PIDファイル**」。これらはアプリケーションサーバー（PumaやUnicornなど）を正しく動作させ、管理するために重要な役割を果たしています。しかし、それぞれが具体的にどのような役割を担い、どのように設定するのかは意外と知られていないかもしれません。

この記事では、**ソケットファイル**と**PIDファイル**の役割や使い方について詳しく解説し、Railsアプリケーションの安定稼働にどう役立つかを学んでいきましょう。

## ソケットファイルとは？

### 1.1 ソケットファイルの役割

**ソケットファイル**は、**プロセス間通信**に使用される特殊なファイルで、アプリケーションサーバー（PumaやUnicornなど）とWebサーバー（NginxやApache）間で、データをやり取りするためのインターフェースを提供します。

通常、Webサーバーとアプリケーションサーバーは**TCP/IP通信**を使ってやり取りをしますが、同じサーバー内で動作している場合は、**UNIXソケットファイル**を使うことで、より高速な通信が可能になります。ソケットファイルは、サーバー間のネットワーク経路を通らずに直接やり取りができるため、特に負荷の高い環境で有効です。

### ソケットファイルのメリット

- **ネットワークを経由しない通信**のため、通信のオーバーヘッドが少なく、高速です。
- 同一サーバー内での通信で使用するため、セキュリティリスクが低減します。

### 1.2 ソケットファイルの設定

Railsアプリケーションでは、アプリケーションサーバーにPumaやUnicornを使用している場合、ソケットファイルを使う設定が可能です。通常、`nginx.conf`や`unicorn.rb`、`puma.rb`ファイルにソケットファイルのパスを設定します。

### Pumaのソケットファイル設定例

```ruby
# config/puma.rb
bind "unix:///path/to/your/app/tmp/sockets/puma.sock"
```

### Nginxの設定例

```nginx
upstream puma {
  server unix:///path/to/your/app/tmp/sockets/puma.sock;
}

server {
  listen 80;
  server_name example.com;

  location / {
    proxy_pass http://puma;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}
```

この設定により、NginxはPumaに対してソケットファイルを使ってリクエストを中継し、高速な通信が可能になります。


## PIDファイルとは？

### 2.1 PIDファイルの役割

- **PIDファイル**（Process ID File）は、**プロセスの管理**に使われるファイルで、サーバーやアプリケーションを起動した際に、そのプロセスのID（PID）を記録しておくためのものです。Railsアプリケーションをデプロイするとき、アプリケーションサーバーがどのプロセスIDで動作しているかを把握するために、このファイルが利用されます。

PIDファイルは、アプリケーションサーバーの**再起動**や**停止**、**障害時の復旧**に役立ちます。サーバーの状態が不明になった場合でも、PIDファイルを参照することで、適切なプロセスに対して操作を行うことができます。

### PIDファイルのメリット

- プロセスの管理が容易になり、サーバーのリスタートや停止を安全に行えます。
- サーバー障害時に、どのプロセスがクラッシュしたのかを特定する手がかりになります。

### 2.2 PIDファイルの設定

アプリケーションサーバーの設定ファイルで、PIDファイルの保存場所を指定することができます。

### PumaのPIDファイル設定例

```ruby
# config/puma.rb
pidfile "/path/to/your/app/tmp/pids/puma.pid"
```

### UnicornのPIDファイル設定例

```ruby
# config/unicorn.rb
pid "/path/to/your/app/tmp/pids/unicorn.pid"
```

PIDファイルにより、Railsアプリケーションのサーバーを管理しやすくなります。

---

## ソケットファイルとPIDファイルの活用シーン

### 3.1 ソケットファイルの活用

ソケットファイルは、主に次のようなシーンで活用されます。

- **同一サーバー内での通信**: Webサーバー（NginxやApache）とアプリケーションサーバーが同じサーバー内で動作している場合、TCP/IP通信を行うよりも効率的です。
- **パフォーマンス向上**: 高負荷なWebアプリケーションで、ソケットファイルを使うことで通信速度を向上させ、リクエスト処理のレイテンシを低減します。

### 3.2 PIDファイルの活用

PIDファイルは、次のようなシーンで役立ちます。

- **アプリケーションの再起動や停止**: アプリケーションの再起動や停止を行う際に、PIDファイルを参照して、該当するプロセスを正確に操作できます。
- **サーバー障害時のトラブルシューティング**: サーバーがクラッシュした場合、PIDファイルを調べてどのプロセスが影響を受けたのかを確認し、速やかに復旧作業を行います。

## まとめ

**ソケットファイル**と**PIDファイル**は、Railsアプリケーションサーバーを正しく運用するために欠かせない重要な仕組みです。ソケットファイルを使うことで、サーバー間の通信を効率化し、アプリケーションのパフォーマンスを向上させることができます。また、PIDファイルを利用することで、プロセス管理がしやすくなり、サーバーの再起動やトラブルシューティングがスムーズに行えます。

これらの設定を理解し活用することで、Railsアプリケーションの運用をより安定させることができるでしょう。
macアドレスの6バイトを16進ダンプに変換して遊ぶ。




x たぶん、激ムズ、初心者には、なに言っているかわからない
x しさしぶりにやるので全部忘れている(やんないと忘れる)



目的

コネクテッドするためのmacアドレスを
途中で16進に変換してデバッグ(確認)の為に表示する
1からFまでの文字の配列を作る
4ビットづつ、上位4ビットと下位4ビットに分ける
配列を参照する
面倒なので力技で変換する

オンラインコンパイラ

```c++

#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    
    uint8_t a[8] = {0x1f,0x2f,0x3f, 0xf4,0xf5,0xf6,};
    char h[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    char b[16+1];
    
    b[0]=h[a[0]>>4];
    b[1]=h[a[0]&0x0f];

    b[2]=h[a[1]>>4];
    b[3]=h[a[1]&0x0f];

    b[4]=h[a[2]>>4];
    b[5]=h[a[2]&0x0f];

    b[6]=h[a[3]>>4];
    b[7]=h[a[3]&0x0f];

    b[8]=h[a[4]>>4];
    b[9]=h[a[4]&0x0f];

    b[10]=h[a[5]>>4];
    b[11]=h[a[5]&0x0f];

    b[12]=0;

    printf("%s\r\n",b);

}



```



```

1F2F3FF4F5F6

```
Difyを使った複数LLMの投票システム構築

LLMを多用して記事を作成しました。

AIの進化に伴い、複数のAIモデルを組み合わせたシステムの開発が進んでいます。特に、エヴァの**MAGIシステム**のように複数の大規模言語モデル（LLM）の出力を利用した意思決定システムの実装例が増えてきています。

- [LLMの出力統合事例1](https://note.com/eurekachan/n/n212de6ddeb27)
- [LLMの出力統合事例2](https://note.com/aegisfleet/n/na55be290e4b2)

従来のシステムでは、大きく2つの方式が一般的です：

1. **統合判断方式**: 複数のLLMの出力を参考にして、最終的な判断を1つのLLMが行う
2. **投票方式**: 複数のLLMが1つの議題に対して投票を行い、その結果で結論を出す

今回紹介するシステムでは、**LLM自体が他のLLMの回答を評価し、投票する**アプローチを採用しています。この仕組みにより、YES/NO質問以外の複雑な意思決定にも対応できるシステムを構築することができます。(何番煎じ感)

# システムの特徴と仕組み

このシステムの特徴は、各LLMが他のLLMの回答を見て、自身がどの回答に投票するかを決めるプロセスを導入した点です。各LLMが単なる生成器ではなく、**評価者**としても機能します。

## ワークフロー
![mermaid-diagram-2024-10-23-012231.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855265/75ede3f8-d980-37da-38d5-5f3fad001c75.png)


## 具体的なプロセス

1. **各LLMが独自に回答を生成**: 複数のLLMが個々に回答を出します
2. **LLMが他のLLMの回答を評価**: 各LLMは、他のLLMの回答を見て、それを評価します
3. **LLMが自ら投票先を選択**: 評価に基づき、最も信頼できると考える回答に投票します
4. **専用LLMによる最終判断**: 投票集計用のLLMが投票結果を分析し、最も適切な回答を最終結果として選択します

この仕組みにより、単純な多数決ではなく、投票パターンや各回答の特徴を考慮した、より洗練された選択が可能になっています。

## 従来方式との違い

- **従来の方式**: 各LLMが生成した回答をもとに、1つのLLMが総合的な判断を行う、またはLLMが単純に投票を行う
- **新方式**: 各LLMが他のLLMの回答を評価し、投票先を選択することで、より詳細な判断が可能

## システムの特徴

- **複雑な意思決定への対応**: YES/NO形式以外の、複数の選択肢がある問題にも対応可能
- **多様な視点の統合**: 異なるアルゴリズムやデータセットを持つLLMの意見を統合
- **評価プロセスの導入**: 単純な多数決ではなく、回答の質も考慮した選択が可能

# Difyを活用したシステム構築

このシステムは、**Dify**というAIプラットフォームを使用して構築されています。Difyは複数のAIモデルを組み合わせ、視覚的にフローを設計できるオープンソースのツールです。

## Difyでのシステム構築ステップ

1. **アプリケーションの作成**: 適切なアプリケーションタイプを選択
2. **フローの設計**: WorkFlow機能を使い、複数LLMを組み合わせた意思決定フローを設計
3. **モデルプロバイダーの設定**: 各LLMのAPIキーorローカルLLMを設定し、使用するモデルを選択

## 実装
### 全LLM回答
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855265/4a1e4e58-445d-43b1-3e7e-eeb3603c148d.png)
### 投票先検討
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855265/46cb0798-67e9-261a-071d-0bebc5099aae.png)
### 集計
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855265/0e0201f2-31ef-ee05-98d5-32759b2035d4.png)

- ブロック図の命名は適当です。
- ローカルLLMを使用しているのは、自分のPCで動くモノが好きだからです。  
  - 大手APIを使用した方が早いし良い回答になります。
- IFブロックなどで回答を無理やり遅延させていますが、他に良い方法があるかもしれません。
- プロンプトやyamlは記事が煩雑になるので割愛。

## 動作
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855265/5b4c804c-e28e-8022-18bf-3154f60f8a95.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855265/86822dab-46fd-a032-fec3-98a1e7b414fb.png)

- 質問を入力すると、3つのLLMで会議して一番良かった回答を出力してくれます。
- 回答ブロックを適宜置くことで、進行ステータスを示せます。
  - 会議している感を出すポイントです。
- 各LLMの投票時の根拠を回答ブロックで出力しても良いです。
  - 回答が煩雑になるので削除しました。

# まとめ
- Difyを活用することで、複数のLLMを組み合わせた投票システムを比較的容易に構築できます。
- 普通に全てのLLMの回答入力にして再度回答させた方が出力の質が良くなります。
Rspec - Request のテストでレスポンスでセットされた Cookie  を検証する

# コードの例


```rb
expect(response.cookies['foo']).to be_present
```


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
【基本情報】独学マラソン SIEM Day 23

感情に流されるマネジメントは、最終的に組織や部下にとっての成長を阻害する

:::note worn
この記事は自分用の備忘録です。
:::

![スクリーンショット 2024-10-22 22.57.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3736578/ff6e82c3-1066-eb0b-9324-b0003db3f774.png)

# 口が軽い人には
あんまり関わりたくないなぁ

# 情報漏洩させちゃう企業には
仕事依頼したくないし、サービスを利用したくないなぁ

# セキュリティ＝信頼
情報漏洩は完全に防げないことが前提の時代であっても
リスクを管理・軽減はしないといけないので
SIEMを使うと良いらしい

# SIEM（Security Information and Event Management）とは
企業全体のIT環境を横断的に監視し、様々なログソースを統合して脅威を包括的に検出・管理するためのツール
わずか数秒で大量のデータを取り込んで解析し、異常な行動を検出するとただちにアラートを送信することができる

AWSだとAmazon GuardDutyというSIEMの補完ツールがあるらしい

Amazon GuardDutyは全てのAWSアカウントで有効化することがベストプラクティスだとか

# 様々なログソースって具体的には？

#### 1. **ファイアウォールログ**
   - **役割**：ネットワークトラフィックの出入りを監視し、不正な通信やトラフィックの異常を検知
   - **具体例**：外部からの不正なアクセスの試行や、通常より多いデータ転送量の検出

#### 2. **サーバーログ（Web、アプリケーション、データベース）**
   - **役割**：サーバーの操作やアクセス履歴を記録し、異常な動作や攻撃の兆候を検知
   - **具体例**：管理者以外のユーザーによる不正なコマンド実行や、大量のデータベースクエリの発行

#### 3. **ネットワークトラフィックログ（IDS/IPS）**
   - **役割**：ネットワーク上のすべてのトラフィックを監視し、攻撃パターンや不審な通信をリアルタイムで検出
   - **具体例**：DDoS攻撃の兆候や、マルウェアによる不正な外部サーバーとの通信

#### 4. **エンドポイントログ（PC、スマホ、タブレット）**
   - **役割**：各端末の操作履歴やセキュリティイベントを監視し、不正アクセスやマルウェアの動作を検出
   - **具体例**：通常とは異なる時間帯のアクセスや、未承認アプリケーションの実行

#### 5. **認証ログ**
   - **役割**：ユーザーのログイン・ログアウト情報を監視し、不正なアクセスやアカウントの乗っ取りを検出
   - **具体例**：通常と異なるIPアドレスからのログインや、多数の失敗ログイン試行

#### 6. **クラウドサービスのログ**
   - **役割**：AWS、Azure、Google Cloudなどのクラウド環境での操作履歴を監視し、設定ミスや不正アクセスを防止
   - **具体例**：クラウド上のリソースへの不正なアクセスや、予期しない設定変更

#### 7. **メールログ**
   - **役割**：送受信メールのメタデータを監視し、フィッシング攻撃やスパムの兆候を検出
   - **具体例**：不審なドメインからのメールや、大量の送信エラーの発生


<br>

SIEMすごい
でも通知に対して判断を下す管理者めっちゃ大変そう

Amazon Detective連携でさらに細かく追跡調査ができるらしいから
管理者の少し負担は減りそう

# 感想
従業員のSNS監視機能や雑談分析モジュールとかでどんどん監視体制が発展していくと
きっと誰もいなくなっちゃうね


# 参考

https://www.splunk.com/ja_jp/data-insider/what-is-siem.html

https://sreake.com/blog/about-google-chronicle/

https://classmethod.jp/articles/aws-guard-duty/
同一レコードを参照するレコードが一括削除された場合の処理


事象

教えていただいた通り、自分を含まない、という条件を追加の上、
最初のレコードのみ保持するようにしたら、正しくフローが動作するようになりました。

ただ、フロー自体はきちんと動作しているものの、
手動削除時は動作し、データローダで削除したときは動作しないという事象が起きている

+ [［フロー］子レコード削除時に子レコードが0件であることを判別して親レコードを更新したい](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000My3O)

:::note
同一レコードを参照するレコードが一括削除された場合、自身のIDのみを除くと他方のレコードを取得してしまうため、+αの条件が必要になります。

方法の1つとしては、

+ オブジェクトにチェックボックス型の項目を作成する
+ 削除時にトリガレコードの更新でチェックボックス型の項目をTrueに更新する
+ 他の関連レコードを検索する際に「チェックボックス型の項目がFalse」の条件を付加する
:::
GMOトクトクBB　ドコモ光　10Gでv6プラスが繋がらなかった話

はじめに
-
これは、初めて光クロスを契約したときに自前のルーターでv6プラス（MAP-E）によるネットが繋がらず途方に暮れた話です。（解決済み）

契約・構成
-
GMOトクトクBB　ドコモ光　10G（光クロス）
GMO・NTT共にレンタルルーター契約無し

ONU 10G-EPON
TP-LINK X90 メッシュルーター（自前）

発生した症状
-
「はじめに」に記載の通り一切v6プラス経由でのネットが繋がらず、他のルーターを使用してもv6プラスが利用不可。
X90の故障も疑い、別で用意したIX2215で確認すると以下のログが。

```
MAPE.016: Failure get MAP-E rule information, interface Tunnel50.0(invalid map-e rule)
MAPE.022: MAP-E status changed from getting rule to waiting, interface Tunnel50.0
MAPE.004: Next get MAP-E rule information after 1132 seconds, interface Tunnel50.0
```

v6プラス（MAP-E）のルール取得時点でエラーが発生しているようだ。
ここまで来ると、**ルータの設定に誤りがない限り**我々に出来ることはなにもない。
プロバイダ（GMO）に問い合わせてみよう。

プロバイダに問い合わせてみた
-
プロバイダあるあるではあるが、中々繋がらず苦戦したが結果的には問い合わせて正解というよりも、問い合わせなければいけない状況であった。
原因から申し上げると、あちら側の仕様の問題によるものであった。
まず、最初にレンタルルーターを契約していないと記載したが問題はここにあったのだ。
なんと、GMOからレンタルルーターをレンタルしない場合、NTTよりレンタルを行うという扱いになってしまうらしく、自分の持っているルーターを接続してもNTTのルーター以外受け付けない設定になっているというのだ。
図で表すと以下の通り

```mermaid
flowchart TB
    A[スタート] --> 
    C{GMOのレンタルルーターは
    契約する？} -- 契約する --> B((GMOと自前のルー
ターが使える))
    C{GMOのレンタルルーターは
    契約する？} -- 契約しない --> 
    E[NTTのレンタルルーターは契約する？] -- 契約する -->
    D((NTTのレンタルルーター
    のみ使える))
    E[NTTのレンタルルーターは契約する？] -- 契約しない -->　F((NTTのレンタルルーターのみ使える。
    プロバイダへの問い合わせ必須))
```

このようになります。
上記の図を見ておかしいと思った方も多いでしょう。
そうです。NTTのルーターを契約しなくても、NTTのルーターを使う設定になってしまうので**他のルーターでのv6プラスが接続不可能になります。**　プロバイダに問い合わせましょう。

今後、GMOトクトクBBドコモ光10Gで契約する方の参考になりますように、書き留めておきます。
zshコマンド履歴の入力補完

PC変える度に設定するので自分用に書きます。

以下に設定方法を記載します。

# 1 .zshrcに以下を追記します

```~/.zshrc
source ~/.zsh/zsh-autosuggestions/zsh-autosuggestions.zsh
```

# 2. 以下をcloneします

```terminal
git clone https://github.com/zsh-users/zsh-autosuggestions ~/.zsh/zsh-autosuggestions
```

# 3. 以下を実行します

```terminal
source ~/.zshrc
```

以下のようにグレーでサジェスチョンが表示されます。

![スクリーンショット 2024-10-23 7.10.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405182/74d5da7f-95d9-d1bc-a9c6-153d02316da8.png)
AWS IAMでログインユーザー自身だけが編集できる動的なポリシー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680230/53de9f79-c34c-922d-e5f5-0d619a176f52.png)

# はじめに
- IAMで多要素認証（MFA）を行うために、毎回権限を振るのは大変
- IAMユーザーグループを作成して、**ログインしたユーザーが、ログインしたユーザー自身だけに**多要素認証を登録したい
- 忘れないようにメモ

# AWS サービス
- AWS Identity and Access Management (IAM)

# IAM からポリシーの登録
- IAM からユーザーグループ、ポリシーを登録。ポリシーを更新して完了

## ユーザーグループの登録
- IAM -> 左メニュー -> アクセス管理 -> ユーザーグループ -> グループを作成 
- グループ名を入力して、グループを作成

## ポリシーの登録
- グループを作成後にポリシーを登録になるので、**フォーマットを作るためにポリシーエディターの"ビジュアル"モードで、適当に"許可"アクションを登録**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680230/b10d3b4a-0db5-e746-dab4-6a3e39c92b25.png)

## ポリシーの更新
- IAM -> 左メニュー -> アクセス管理 -> ユーザーグループ -> 登録したユーザーグループ -> 登録したポリシーの編集
- ポリシーエディターの"JSON"モードで、下記の内容に更新
    - `Resource` の `user/${aws:username}` がポイントです
    ```
    {
        Version: "2012-10-17",
        Statement: [
            {
                Sid: "VisualEditor0",
                Effect: "Allow",
                Action: [
                    iam:CreateVirtualMFADevice,
                    iam:ListMFADevices,
                    iam:ListUsers
                ],
                Resource: "arn:aws:iam::[アカウントID]:user/${aws:username}"
            }
        ]
    }
    ```
- ポリシーエディターの"ビジュアル"モードで確認すると
    - "JSON"モードだと、1 Statement ですが、"ビジュアル"モードだと、2 Statement に分割されてる
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680230/f17e03cb-2e18-ede0-8e0c-2044ca048a81.png)
    - 1 つ目の Statement
        - `ListUsers`のみ
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680230/d13a6cba-00c3-a587-01a0-8eecfa65b8a7.png)
    - 2 つ目の Statement
        - 2 つのアクション
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680230/d08380e1-244b-14fc-38ef-89454ecb8921.png)
        - リスト
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680230/8d67abd0-cbd0-c8c9-230d-57bfb057b5dd.png)
        - 書き込み
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680230/c0111d27-8c78-3a9a-942e-c8dfbfa199ef.png)
        - リソース
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680230/0592b08b-79dc-16bb-2f54-c0e8f214535f.png)

# おわりに
- 迷わず、サクッとできた
- 今後も動的に設定できるがとても便利、他にも使えそう

#### 参考（感謝）
- [AWS IAMポリシーのよくあるユースケース10選とおまけポリシー](https://qiita.com/free-honda/items/5bb71782c8a84585206a)
linuxコマンド　学習メモ　その①

最近linuxコマンドの勉強を始めたので必要そうなものをアウトプット
追加で学んだオプションなどあれば都度追記

## cd（change directory）
### 階層の移動

```:C配下hogeフォルダへ移動
cd C:\hoge
```
```:一つ上の階層に移動
cd ..
```
## ls
### ディレクトリ内の情報取得

```:全てのディレクトリの表示
ls -a
```
```:-aオプションの機能に加え、所有者も表示
ls -l
```
## cat（concatenate）
### ファイルの中身の参照
```:hoge.txt内の中身を行番号をつけて表示
cat -n hoge.txt
```
## tac
### ファイルの中身を逆順で表示
```
tac hoge.txt
```
## touch
### ファイル作成、タイムスタンプ更新
```:hoge.txtの作成
touch hoge.txt
```
※hoge.txtが既に存在した場合はタイムスタンプが更新される
```:hoge.txtのタイムスタンプを任意の日時に更新
touch -t YYYYMMDDHHmm.ss hoge.txt
```
## file
### ファイルの種類の特定
```:hogeのファイルの種類を特定する
touch hoge
```
VSCodeでVue.js + TypeScript開発を加速！メソッドやコンポーネント間のジャンプ機能を活用する方法

## はじめに

Vue.jsとTypeScriptでの開発をもっと快適に進めるためには、環境設定が重要です。
特に、コード内を素早く移動したり、型チェックをしっかり行ったりすることができると、作業がグンと効率的になります。今回は、VSCodeを使った開発で、そんな便利な機能を活用するための設定をご紹介します！

## 最終的にできるようになること
メソッドやコンポーネントへのジャンプ機能ができる状態を目指します。

**■コンポーネントのジャンプ機能**
Macであれば、コンポーネント名を「⌘ + クリック」でコンポーネントの定義が表示され、ダブルクリックにて該当のコンポーネントに遷移できます。
![スクリーンショット 2024-10-23 6.06.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1495990/b42137f3-a811-4404-f748-19559459c335.png)
![スクリーンショット 2024-10-23 6.06.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1495990/902ff05d-0a38-da94-f3ec-32004c87d1ce.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1495990/baefd3b5-f7e1-2b39-8dc4-bca260ceaabf.png)

**■メソッドのジャンプ機能**
こちらも同様にメソッド名を「⌘ + クリック」でメソッドの定義が表示され、ダブルクリックにて該当のメソッドに遷移できます。
![スクリーンショット 2024-10-23 6.07.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1495990/bc381634-48b8-287d-86a9-436fcb49d092.png)


## 必須の拡張機能

### 1. Vue - Official

以前は「Volar」という名称拡張機能が使われていましたが、現在は改名され「Vue - Official」に名称変更されています。この拡張機能は、Vue 3とTypeScriptの統合がさらに強化され、メソッドやコンポーネントへのジャンプ、型チェック、補完機能など、開発をスムーズに進めるための機能が備わっています。

- [Vue - Official](https://marketplace.visualstudio.com/items?itemName=Vue.volar)
![vscode-official-vue.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1495990/7454bb80-f2d6-4cee-77fc-4de4a3fa494c.png)


### 2. TypeScriptとJavaScriptの言語機能

「TypeScriptとJavaScriptの言語機能」も有効にすると、TypeScriptプロジェクトでの補完機能や型チェックがより強力になります。これを設定しておくことで、エディタがコードをより賢く理解して、効率的に開発が進められるようになります。


## 効率的な設定方法

### 1. Volarの無効化

Vue 2.0以降では、Volarという拡張機能が不要となりました。もし既にインストールされている場合は、無効化しましょう。

1. VSCodeの「拡張機能」タブに移動。
2. 「Volar」を検索して、無効化します。

### 2. Vue - Officialのインストール

続いて、「Vue - Official」拡張機能をインストールします。これでVue.jsプロジェクトに最適化されたコード補完やナビゲーション機能が使えるようになります。

1. 拡張機能タブで「Vue - Official」を検索してインストール。
2. 設定を有効にし、VSCodeを再起動します。

### 3. TypeScriptとJavaScriptの言語機能を有効化

最後に、「TypeScriptとJavaScriptの言語機能」が有効かどうか確認しましょう。これが有効になっていれば、TypeScriptでのコードジャンプや型チェックがスムーズになります。
![vscode-builtin-typeScript.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1495990/713fde5a-05b6-4853-81a2-2ec8277ab5b8.png)

:::note info
## TypeScriptとJavaScriptの言語機能とは？
「TypeScriptとJavaScriptの言語機能」（TypeScript and JavaScript Language Features）は、VSCodeに組み込まれているビルトイン拡張機能の一つで、TypeScriptとJavaScriptのサポートを提供します。この拡張機能は、以下のような機能を提供します。

- **コード補完**：コードを入力している途中で、利用可能なメソッドや変数の候補を表示。
- **ジャンプ機能**：関数やクラスなどの定義場所に簡単に移動できる。
- **型チェック**：TypeScriptの型安全性を保つために、コードが適切かどうかを自動的にチェック。
- **エラー表示**：コードにエラーや警告がある場合、すぐにハイライトして表示。

これらの機能を活用することで、効率的なJavaScriptおよびTypeScriptの開発が可能になります。VSCodeに標準で含まれているため、特別なインストールは不要ですが、設定で無効化している場合は、再度有効にすることができます。
:::

:::note info
## @builtinとは？
@builtinは、VSCode内で組み込み拡張機能（ビルトイン拡張機能）を検索する際に使用されるフィルタタグです。VSCodeには最初から含まれている拡張機能がいくつかあり、それらを表示したり、設定を変更したりするために@builtinと入力します。このフィルタを使うと、外部の拡張機能ではなく、VSCodeに標準搭載されている機能に関連する拡張機能だけを表示することができます。

**使用方法**
VSCodeの「拡張機能」タブを開きます。
検索ボックスに@builtinと入力すると、組み込み拡張機能が一覧表示されます。
この中から、拡張機能を見つけて有効化・無効化することができます。
:::


## まとめ

VSCodeでのVue.js + TypeScript開発をさらに効率的に進めるためには、適切な拡張機能の設定が重要です。今回ご紹介した手順をぜひ試してみて、快適な開発環境を手に入れてください！
カンバンについてまとめてみました

カンバン（Kanban）は、アジャイル開発の一種で、タスクや作業の流れを視覚化し、進捗を管理する手法です。**トヨタの生産方式**から発展したカンバンは、製造業での効率化に用いられた方法を基にしていますが、現在ではソフトウェア開発などの知的業務にも広く応用されています。カンバンは、タスクをボード上で管理し、作業の「見える化」を図ることで、作業の滞りや改善点を把握しやすくします。

---

## **カンバンの基本的な概念**

カンバンは、プロジェクトの進捗を視覚化し、チームがタスクを効率的に管理できるようにするシンプルな仕組みを持っています。主要なコンセプトは以下の通りです。

1. **作業の可視化**  
   - カンバンでは、タスクを「カンバンボード」に書き出し、作業の流れを一目でわかるようにします。
   - ボード上には「To Do（やるべきこと）」「In Progress（進行中）」「Done（完了）」といったカラムを設置し、タスクの状態を示します。作業が進むにつれて、タスクカードをそれぞれのカラムに移動していくことで、進行状況が把握できます。

2. **仕掛かり作業の制限（WIP: Work In Progress）**  
   - カンバンでは、各カラムに対して「同時に進行中のタスク数」を制限します。これを**WIP制限**と呼び、各段階で抱えるタスク量を抑えることで、作業の詰まりを防ぎます。
   - 例えば、「進行中（In Progress）」カラムに3つのタスクしか置けないとすることで、現在取り組んでいる作業が完了するまで新しい作業を始めることができなくなります。

3. **フローの管理**  
   - カンバンはタスクの流れ（フロー）を改善するために使われます。作業の進み具合を見える化することで、どこで作業が滞っているかや、ボトルネックとなるプロセスを特定しやすくなります。
   - チームはフローを観察し、滞りを解消するための改善を継続的に行います。

4. **継続的な改善**  
   - カンバンは、作業プロセスの改善を繰り返し行うことを重視しています。フローの効率を高め、スムーズなタスクの流れを維持するために、定期的にプロセスを見直し、必要に応じて調整します。

---

## **カンバンボード（Kanban Board）の構成**

カンバンボードは、プロジェクトの進捗を可視化するために使われるツールで、通常、以下のようなカラム（列）で構成されます。

1. **To Do（やるべきこと）**
   - まだ着手していないタスクをここに配置します。タスクは優先度順に並べられ、次に着手するものがわかりやすくなっています。

2. **In Progress（進行中）**
   - 現在進行中のタスクを配置するカラムです。作業が完了して次の段階に進むまで、このカラムに置かれます。進行中のタスク数はWIP制限によってコントロールされ、タスクが過剰にならないよう管理します。

3. **Review（レビュー）**
   - レビューが必要なタスクやテスト待ちのタスクを配置する場合もあります。これにより、チームメンバーがタスクの進行状況を把握し、協力してレビューを進めることができます。

4. **Done（完了）**
   - 完了したタスクを配置します。プロジェクトが進むにつれ、完了したタスクの数が増え、進捗が視覚的に把握しやすくなります。

カンバンボードには、ホワイトボードや専用ツール（Jira、Trello、Asanaなど）を使用し、チームが常にアクセスできる場所に置くことで、情報共有がスムーズになります。

---

## **カンバンのメリット**

- **可視化による作業効率の向上**: タスクの進捗が視覚的に管理されるため、誰がどのタスクに取り組んでいるか、どの作業が滞っているかが一目で分かります。
- **ボトルネックの特定と解消**: WIP制限を設けることで、進行中の作業量を管理し、プロセスのボトルネックを早期に発見して解消できます。
- **柔軟な対応が可能**: カンバンはタスクの優先度に応じて柔軟に対応できるため、要求や要件が頻繁に変わるプロジェクトに適しています。
- **自己組織化の促進**: チームメンバーが自らの判断でタスクに取り組み、進行を管理するため、自己組織化されたチームが形成されやすくなります。
- **継続的な改善**: タスクの流れを定期的に見直し、作業プロセスの改善を続けるため、プロジェクトが進むにつれて効率が向上します。

---

## **カンバンのデメリットと課題**

- **長期的な計画が立てにくい**: カンバンは短期的なタスク管理に適しているため、プロジェクト全体の長期的な計画やスケジュールの管理が難しいことがあります。
- **進捗の遅れが起こりやすい**: WIP制限を設定しても、タスクのサイズや複雑さが適切でないと、作業の進捗が遅れる可能性があります。タスクを適切な単位に分割することが重要です。
- **コミュニケーションの負担**: カンバンでは日々の作業進捗を各自が確認する必要があるため、チーム間でのコミュニケーションが重要になります。
- **目標設定が難しい**: 明確なスプリントやタイムボックスを持たないため、タスクが完了した際に「目標達成感」が得にくく、モチベーションの管理が課題になることがあります。

---

## **カンバンが適しているプロジェクト**

カンバンは、以下のようなプロジェクトや業務で特に効果を発揮します。

- **メンテナンスやサポート業務**: タスクが逐次発生するプロジェクトで、要求や優先度が頻繁に変わるような場合、カンバンは適応性の高さが生きます。
- **スケジュールが不明確なプロジェクト**: 短期的なタスクに柔軟に対応できるため、長期の計画が立てにくいプロジェクトに適しています。
- **改善を求めるプロセス**: 継続的な改善を必要とするプロセスでは、カンバンによるボトルネックの特定と解消が有効です。

---

## **カンバンのまとめ**

カンバンは、タスクを可視化して進捗を管理するシンプルな手法で、特に要求の変化が多く、継続的な改善が必要なプロジェクトで高い効果を発揮します。カンバンの特徴である**WIP制限**や**フローの管理**により、チームは作業を効率的に進め、ボトルネックを早期に発見して対処することができます。

カンバンを成功させるためには、タスクの流れを適切に管理し、チームのコミュニケーションを維持することが重要です。また、進捗状況を常に見える化し、定期的な改善を行うことで、プロジェクトが効率的かつ柔軟に進められます。
Jest の実行時に SyntaxError が起きたら爆速で修正する

# はじめに

SyntaxError 嫌いですよね。多くの場合は文法どおりに書いていないことが原因です。わたしが Jest の実行時に SyntaxError が起きたときも「どうせ文法ミスっただけやろ」と思ってたのですが、誤りはなく svg / csv の読み込みで起きていました。

この記事ではその解決方法について記載しています :wink: 

## 環境

一部抜粋

- Vite 5.4.8
- React 18.3.1
- Jest 29.7.0

<details>

<summary>パッケージ一覧</summary>

```json:package.json
{
  "name": "vite-ts",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "tsc -b && vite build",
    "lint": "eslint .",
    "test": "jest",
    "preview": "vite preview"
  },
  "dependencies": {
    "react": "^18.3.1",
    "react-dom": "^18.3.1"
  },
  "devDependencies": {
    "@eslint/js": "^9.11.1",
    "@testing-library/dom": "^10.4.0",
    "@testing-library/jest-dom": "^6.6.2",
    "@testing-library/react": "^16.0.1",
    "@types/jest": "^29.5.13",
    "@types/react": "^18.3.11",
    "@types/react-dom": "^18.3.1",
    "@vitejs/plugin-react": "^4.3.2",
    "eslint": "^9.11.1",
    "eslint-plugin-react-hooks": "^5.1.0-rc.0",
    "eslint-plugin-react-refresh": "^0.4.12",
    "globals": "^15.9.0",
    "jest": "^29.7.0",
    "jest-environment-jsdom": "^29.7.0",
    "ts-jest": "^29.2.5",
    "ts-node": "^10.9.2",
    "typescript": "^5.5.3",
    "typescript-eslint": "^8.7.0",
    "vite": "^5.4.8"
  }
}
```

</details>

# 起きたエラー

まず、起きたエラーです。開発時には正しく表示できていた svg なのに？ :thinking: 

```
SyntaxError: Unexpected token '<'

  1 | import { useState } from 'react'
> 2 | import reactLogo from './assets/react.svg'
    | ^
  3 | import viteLogo from '/vite.svg'
  4 | import './App.css'
  5 |

  at Runtime.createScriptFromCode (node_modules/jest-runtime/build/index.js:1505:14)
  at Object.<anonymous> (src/App.tsx:2:1)
  at Object.<anonymous> (tests/App.test.tsx:2:1)
```

# わかったこと

Jest は webpack などのバンドラといっしょに動いてるわけではありません。そのため tsx / jsx ではないファイルは理解することができないです。

# どうするか

`moduleNameMapper` を使います。[公式ドキュメント](https://jestjs.io/ja/docs/configuration#modulenamemapper-objectstring-string--arraystring) によると外部リソースをスタブしてくれます。

:::note warn
スタブとモックの表現に公式ドキュメントでゆらぎがありますが、どちらが正しいかはまた別の記事で
:::


tests やプロジェクトルートなどに `__mocks__` ディレクトリを作成して ts / js ファイルを作成するのが通例のようです。公式ドキュメントでは `GlobalImageStub` など不思議なことが書いていますがあくまでサンプルなので ts / js ファイルを作成する必要があります。

「おっしゃ ts / js ファイルつくるで！」と経験者はなると思いますが、初学者からすると「で？中身は？」となります。

```ts:jest.config.js
import type {Config} from 'jest';

const config: Config = {
  ...
  moduleNameMapper: {
    "\\.svg": "<rootDir>/tests/__mocks__/fileMock.ts",
    "\\.css": "<rootDir>/tests/__mocks__/styleMock.ts",
  },
  ...
};

export default config;
```

# モック

fileMock.ts と styleMock.ts はいずれも

```ts
module.exports = {};
```

としました。svg / csv を読み込んだら空っぽのオブジェクトとすることで回避しています。また、Jest は CommonJS で動いているので `module.exports` と各必要があります。

# 最後に

この Jest の実行時に起きた SyntaxError の解決に新しくパッケージの追加は行っていません。`moduleNameMapper` を `jest.config.js` に追加しただけです。

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

https://projisou.jp
[Tips] WindowsでChMateを使う

Android アプリを Windows ネイティブアプリのように使えるという話を聞いたので、5chビューアである ChMate を Windows に入れてみました。快適です。

**ざっくりとしたやり方**:

- やり方動画 (→[Youtube](https://www.youtube.com/watch?v=iCidN3ijLQ8))
    - WSA動作のための仮想化機能とかをONにする（要再起動)
    - GooglePlay付WSA をDLしてインストールスクリプトを走らせる
    - GooglePlayがWindowsのアプリのように配置されるので起動
    - ログインしてChMateをインストール
    - ChMateもWindowsのアプリのように配置されるのでタスクバーにピン止めしてすぐ起動できるようにする
- リソース:
    - GooglePlay付WSA (→ github: [MustardChef/WSABuilds](https://github.com/MustardChef/WSABuilds)

**所感と注意点**:

- 8世代以降のCPUでないとWSAは動かないらしいです
- 最初ChMate起動しようとしたらクラッシュしてしまいましたが、ごちゃごちゃ試してたらいけました。多分、ピン止めしたアイコンを右クリックして設定を起動。向きを縦に固定したのがよかったような気がしています
- はてブアプリもいれてみました。これも快適です
【Unity】お手軽な経験値テーブル　※緩急自在な y=f(x)　【Animation Curve】

# 概要

経験値テーブルとは、RPGにおけるレベル毎の必要経験値のことです。
レベルが上がるほど必要経験値が増えていくことが多いですよね。

指数関数なんかでもいいんですが、緩急をつけたいと思いませんか？
まあ、経験値テーブルというのはあくまで一例で、今回は自由自在な y=f(x) のご紹介です。

# 結論
Animation Curveがとても便利！
名前のわりにアニメーションと関係ない箇所でも活用できます。

## サンプル

```C#:実装例
public class Player : MonoBehaviour
{
    public AnimationCurve needExp;
    public int level;
}
```

インスペクタ上の表示は以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1054787/59b1ce0b-c862-e066-5703-4930c4677ef1.png)

NeedExpのグレーの部分をクリックして設定してみましょう。

今回は100レベルになるまで100万の経験値が必要な設定にしてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1054787/f1b773b0-b5db-d9eb-55d0-85f83489b00a.png)

## 検証
それでは下記のコードで検証してみましょう。
```C#:検証コード
    void Update()
    {
        level++;
        Debug.Log($"level:{level} next:{(int)needExp.Evaluate(level)}");
    }
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1054787/97581930-f6e5-7d98-03da-5bf164b25dd4.png)

レベルが上昇するにつれて必要な経験値が上がっておりグラフで設定した通りですね。
アイディア次第ではいろいろな活用法がありそうです。
Rのコマンドメモ


# はじめに
- 統計ソフトウェアRにおけるのコマンドのメモです。個人的によく使う便利なコマンドだけ記載しています。

# 動作環境
- Windows10 64bit
- R (バージョン 4.0.5)
- RStudio (バージョン 2022.12.0)

# データ確認系

- データの型を確認する
```r:R
> data <- 1
> class(data)
[1] "numeric"
```
- データの次元（構造）を確認する
```r:R
> data <- matrix(1:15, nrow = 5)
> dim(data)
[1] 5 3
```

- データの先頭（デフォルトでは先頭の６行）を確認する
```r:R
> data <- matrix(1:20, ncol = 2)
> head(data)
     [,1] [,2]
[1,]    1   11
[2,]    2   12
[3,]    3   13
[4,]    4   14
[5,]    5   15
[6,]    6   16
```

- データの概要（各ベクトルの型など）を確認する
```r:R
> data <- data.frame(x=c(1:10), y=letters[1:10])
> str(data)
'data.frame':	10 obs. of  2 variables:
 $ x: int  1 2 3 4 5 6 7 8 9 10
 $ y: chr  "a" "b" "c" "d" ...
```

- データをRStudioのSourceペインに表示する
```r:R
> view(data)
```

# データ操作系
## 便利関数
- `unique()`：ベクトルの中から要素のかぶるものを除いて抽出します。
データフレームから要因の水準を抜き出したいときに便利

## 文字列ベクトルを整数ベクトルへ変換
文字列ベクトルを`factor`にしてから整数に変換します。
整数でしか受けつけない別のコマンドに渡す際に便利
整数の連番は文字列に対して昇順で割り当てられます。
```r:R
> c("A","C","B","A") %>% as.factor() %>% as.integer()
[1] 1 3 2 1
```



# データ生成系
## 生成する乱数を固定
乱数の生成に再現性を持たせたい場合には必ず使います。
```r:R
set.seed(123)
```
## 値の総当たり表の作成
引数にした変数同士の組み合わせの総当たりを表で出力します
モデルパラメーターのセットを模擬的に作る際に便利です
```r:R
> df <- expand.grid(a=c(100,200), b=c(3,4), c=c(50,60))
> df
    a b  c
1 100 3 50
2 200 3 50
3 100 4 50
4 200 4 50
5 100 3 60
6 200 3 60
7 100 4 60
8 200 4 60
```

# 便利なショートカット
- ショートカット一覧表示`Tools`>`Keyboard Shortcuts Help`
`Alt`+`Shift`+`K`
- コメントアウト切り替え
`Ctrl`+`Shift`+`C`
- セクションを挿入
`Ctrl`+`Shift`+`R`
```r:R
# Section -----------------------------------------------------------------
```
- セクションを縮小
`Alt`+`L`
- セクションを展開
`Alt`+`Shift`+`L`
- パイプ演算子を挿入
`Ctrl`+`Shift`+`M`
```r:R
%>% 
```

# おわりに
Rで個人的によく使うコマンドを載せました。

# 参考文献
特になし
未割当ディスク領域がある状態でEBSを拡張すると、未割当領域は２つできるのか？合体するのか？【Windows/AWS】

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3148337/89d0f741-d6d5-7ccc-ce15-289e691ae5e3.png)

**結論、合体します。**

基本的に無い状況だと思いますが、
AWS EC2上のWindowsOSでディスクに未割当のディスク領域がある状態のまま、EBSを拡張した場合、その未割当領域は合体します。

## 【検証】
変更前、「ディスクの管理」からCドライブに使用中が30GB、未割り当てが2GBの状態を作りました。このままOS内での拡張はしないでおく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3148337/0787644f-8461-3795-721e-b22d0f033c84.png)


AWSマネジメントコンソールから、対象のボリュームサイズを35GBに拡張する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3148337/4db63dd6-f833-aeaa-40bd-f96ee07324a0.png)


拡張後、何も操作せずとも未割当領域が5GBに増えました。
（ディスクの再スキャンで増えると思ってた。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3148337/8086c606-39f8-557d-5712-d1fb81e3105c.png)


当然ですが、ディスクの拡張作業を行うと5GB分一気に拡張されます。
そんなこと記事にする必要あるか？と思うかもしれませんが、このナレッジが必要になった場面が仕事であったんです、、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3148337/292b7528-7e86-af3e-eb4b-80337500c384.png)

## 【余談】
検証のために２回に分けてEBS拡張をしようとしたら、
「**前回の変更から６時間空けないと変更できませんよ。**」とエラーになった。（知らなかった）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3148337/f5996369-8e50-43cd-b2e4-5ea002f096af.png)

その為この記事を書くのには６時間以上もかかったのでした。
Zabbixエージェントの使い分け（パッシブ、アクティブ、Zabbixエージェント）


どうも、駱駝（らくだ）と言います。

最近Zabbixエージェントについて調べなおした機会があったので、記録としてブ記事を残そうと思います。
Zabbixで監視を行う際、パッシブエージェント、アクティブエージェント、これら両方の機能を備えたZabbixエージェントの3種類があります。
それぞれの特徴を理解し、使い分けることでより効率的に監視をすることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3148337/01eb09ac-bd5b-5e95-32a4-748e2468009c.png)

# 1. Zabbixエージェントの種類と特徴
### 1.1 パッシブエージェント
Zabbixサーバから定期的にポーリングされ、要求された情報を返すタイプのエージェントです。

**特徴**
Zabbixサーバが主体的に情報を取得するため、エージェント側の負荷が少ない。
シンプルな仕組みのため、リアルタイムな監視に適している。
一般的なシステムリソースの監視に適している。
例: CPU使用率、メモリ使用量、ディスク空き容量


### 1.2 アクティブエージェント
エージェントが自ら情報を収集し、Zabbixサーバに送信するタイプのエージェントです。

**特徴**
イベントドリブンな監視に適している。
Zabbixサーバの負荷を分散できる。
特定のイベント発生時や、頻繁に変化する情報を監視したい場合に有効。
例: ログファイルの監視、特定のサービスのステータス確認

### 1.3 Zabbixエージェント
パッシブとアクティブの両方の機能を備えたエージェントです。

**特徴**
状況に応じて、パッシブとアクティブを使い分けることができる。

柔軟性が高く、様々な監視シナリオに対応できる。
※基本的にはパッシブをメインで使うそう。（根拠なし）

# 2 . それぞれのメリット・デメリット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3148337/2a8d94cb-9a3f-d233-9cbf-809731919ccf.png)

# 3 .  具体的な活用例
### 3.1 リソース監視
目的: サーバーのCPU使用率の監視
方法: Zabbixサーバから定期的にパッシブエージェントに問い合わせCPU使用率の値を監視する。
例: CPU使用率を監視し、使用率が90％を超えたら障害として通知する。

### 3.2 ポート監視
目的: 特定のポートが開いているか、閉じているかを監視し、サービスの稼働状況を確認する。
方法: アクティブエージェントで、netstatコマンドなどを利用してポートの状態を定期的にチェックする。
例: HTTPポート（80番）やSSHポート（22番）が閉じているかを確認し、閉じていれば障害として通知する。

### 3.3 プロセス監視
目的: 特定のプロセスが正常に稼働しているか、異常終了していないかを監視する。
方法: Zabbixエージェントで、プロセスID、プロセス数などの情報を取得し、異常を検知した場合にアラートを出す。
例: Webサーバプロセス（Apache等）が稼働しているかを監視し、プロセスが落ちた時に通知する。

# 4. まとめ
Zabbixエージェントは、パッシブ、アクティブ、Zabbixエージェントの3種類があり、使い分けることで効率的な監視ができます。

パッシブエージェント: 一般的なシステムリソースの監視
アクティブエージェント: イベントドリブンな監視、ログ監視
Zabbixエージェント: 柔軟な監視、カスタムスクリプトによる監視


補足
Zabbixのバージョン: Zabbixのバージョンによって、利用できる機能や設定項目が異なる場合があります。
OS: 監視対象のOSによっても、利用できる機能が異なります。
Chrome extension 挫折した 複数タブや遷移を挟んだ処理が難しい

# 概要
chrome extensionを使ってやりたいことを実現しようとしたが挫折した話
初心者が[公式doc](https://developer.chrome.com/docs/extensions/)見ながら＆claudeに助けてもらいながら10時間ぐらい格闘した結果、心が折れた

# やりたかったこと
・拡張機能をインストールし、拡張機能の「実行」ボタンを押したら動作する
・あるページの値を取得し、他のページに挿入する。これらのページは別タブで同時に開かれている
　└あるいは、取得した値によって、対応したselectの値を選ぶなど
・現在開いているページ内のボタンを押してURL遷移し、遷移後のページで処理を行う

# だめだったこと
・タブを切り替えることはできるが、切り替わったタイミングで処理が中断されてしまう
・URL遷移（aタグをクリック）をした段階で、遷移先で処理を続行することが難しそう
　└タブが更新されたeventをlistenし、特定のURLだったら～　というやり方はある
　└localStorageを使ってstatefulにはできそう
 　└上記2つを組み合わせると、URLが変わったタイミングで任意の処理をさせることはできそうだが、複雑すぎる（ことになると見込んでいる）
・単純なsleepができなかった。jsの問題か？ promise(...).then(...) という書き方はできるが、中身が複雑になりすぎる
　└jsだけで言うとできるらしいが、chrome extensionとして組み込んでみても動作しなかった。要検証 https://qiita.com/teloppy_com/items/cd483807813af5a4a38a

# 配布が難しい
配布方法は
・ソース丸ごと or crxファイルにパッケージして、直接配布
・公式ストアに登録

公式ストアは更新するために審査が必要、ちょっとした修正でも大変
セルフホストは自由で良さそう。ただ、いざやってみたらダメだった。DLする際に crx_required_proof_missing エラーが出てしまい、これが解決できなかった・・

[公式doc](https://developer.chrome.com/docs/extensions/how-to/distribute/host-on-linux)

# 今後
Playwright使えば良い気がする（初心者）
Vue Fes Japan 2024 Pre LT Party (241017) に参加しました

先週 [Vue Fes Japan 2024 Pre LT Party (非公式前夜祭)](https://optim.connpass.com/event/330716/)に参加してきました。この記事ではそのイベントレポートのようなものを紹介します。

※ 間違い/解釈違いが含まれる可能性もあるのでご注意ください。もしお気づきの点あればそっとコメントで教えて頂けると嬉しいです。
※ VueFesJapan2024にも、もちろん参加してきました。そちらも別途記事にします。

## Vue Fes Japan 2024 Pre LT Party
様々な産業DXを実現する自社サービスを展開する[株式会社オプティム](https://www.optim.co.jp/)さんと、食、子育て、地方創生の課題に向き合うプラットフォームを展開する[株式会社エブリー](https://corp.every.tv/)さんの2社で共同開催された、1~20人規模のVue系のLTイベントでした。このイベントでは、友人に誘われ気が向いたため、初のLT発表もしてきました。

### Connpass 
https://optim.connpass.com/event/330716/

### LT・セッション

#### Nuxt3マイグレーションについて (OPTiM 高橋さん)

https://speakerdeck.com/optim/nuxt-migration

##### 概要
涙なしでは語れない、Nuxt2からNuxt3への大規模移行プロジェクト事例紹介。

移行は2から3人体制で実施。まずローカルでのリファクタ作業にNuxtBridge導入、Vue2でも動くVue3推奨ライブラリを先んじて更新、ContextやNuxt2へ依存するコードの削除の順に対応した。また、移行と同時に実装戦略をAtomicDesignをPackageByFeatureに変更、ScriptSetupへの書き換え、更に社内デザインシステムの取り込みを行った。移行にはBedrock Claude ChatやPerplexityという2つのAIが役立った。

##### 感想
自身が去年NuxtではないVue2プロダクトをVue3に移行した際は、同時多発リファクタを起こしてかなり破壊的なPRを多量に作成しました。このケースではむしろリファクタしたほうが進めやすかったとのことで、既存のテスト体制がよっぽどしっかりしていたか、上手い分量でPRを分割しつつ進められたのかなと思いました。他には、"移行前にVue2の時点でできることをした"という言及があり、自分も強く頷ける意見でした。これからVue3に移行する方の参考になる発表だったと思います。


#### unplugin-vue-routerで実現する (every 羽馬さん)

https://www.docswell.com/s/NaokiHaba/5DNJPL-2024-10-17-194851


##### 概要
Nuxt3標準搭載のフォルダ・ファイル構造を元に自動的にURLルーティング定義を作成する機能と同等のことができるライブラリ、unplugin-vue-routerの紹介。unplugin-vue-routerを使うと手動でのルーティング定義が不要になり、ファイル構造で簡単にルートが定義できるだけでなく、useRouteコンポーザブルでのルート名やパスの自動補完が効く。また、DataLoader機能を使うとページルートに依存したデータ取得Composableを簡単に書くことができる。このライブラリはSSRに対応していない点、DataLoaderが実験的APIであることには注意が必要。

##### 感想
このライブラリの存在は以前から知っており、導入してみたいと思っていました。一方で型定義周りが正しく動くのだろうかという懸念があり、そこが上手く機能するというのは魅力に感じました。DataLoaderについては、調べたところあまり採用されていないイメージを受けましたが、機会があればためしてみようと思います。

#### genericで強力な型がついたコンポーネントを作ろう (お窓)

https://speakerdeck.com/dosugamea/genericdeqiang-li-naxing-gafu-itakonponentowozuo-rou

##### 概要
Vuetify3のVSelectコンポーネントをラップし、Vue3.3からの機能であるgenericで、itemsとmodel-valueに対する型定義を強化した事例の紹介。まずVSelectをラップしたコンポーネントを作成。VSelectをラップしたコンポーネントにオブジェクト配列とオブジェクトを渡し、期待通りに型が上手く動いてくれることを確認できた。

##### 反省点 兼 感想
今回は初めてLT発表をしてきました。まずは下記が反省点です。

- 会場には早めに着いてちゃんと映せるか確認しよう
  - 機材トラブルがあった (使っているPCが古すぎてType-Cポートで映せなかった)
- 本当に必要な部分だけ抜粋しよう
  - LT資料のコードが小さすぎた (発表者本人も見えなかった)
- まとめは短くまとめよう
  - 書いた内容が多すぎて上手く締められなかった

次に下記が感想です。

- LT発表すると普段以上に会話してくれる人が多く、より学びを得ることが出来た
  - 会話をするうち、[VueコンポーネントはPropに定義していない属性をフォールスルーする](https://ja.vuejs.org/guide/components/attrs)ため、ラップコンポーネントを作る場合使ってほしくない不要な属性を潰す処理が必要なことに気づかされました。上手く機能させるには確かに必要となる対応で、新たな学びとなりました
- シンプルな内容でも発表する価値があることを感じられた
  - このLTでVSelectの型が期待通りに動かないケースを初めて知ったという話を聞くことができました。学びを得られた人が居たなら、LTをする甲斐があったなと思いました

### 全体をまとめた感想
今回のイベントは、個人的に既に知っている情報が多かったですが、LT初登壇ができたのは経験として大きかったです。また機会があればLT発表してみたいです。

なお、今回の会場スポンサーOPTIMさんには、炊き込みご飯(スマート米)を振る舞ってもらいました。(おそらく)ここで使ったおいしいお米がAmazonで販売されているので良ければどうぞ。

https://amzn.asia/d/0boUIUO1
キーボードが届いてうきうきの初投稿

## 初投稿

Rainy75 pro の限定色ルナーが届いてとにかくタイピングがしたくて書き始めました。
重さは2kg近くなので持ち運びには適さないけれど音も色も可愛くて気に入ってます。



## 自己紹介
社会人1年目
Oracle から Postgre  への　DB 移行をしています。
その過程でbatやpowershell ,cobol,plsql,plpgsql 
などに触れてます。
最近はAurora Postgres　を使用していることもあってawsも学んでいます。
学生時代にはHTML CSS JQuery 等を使用して自己満webサイトの作成

触ったことあるのは　PHP JAVA JavaScript Python Swift C C++ 
ここら辺は今後学ぶかもしれないし学ばないかもしれない。


## 今後のQiitaへの投稿
+ Oracle からPostgresへの移行でつまづいたこと、気がついたこと
+ batやpowershell を用いたショートカット
+ 知識や勉強したことの備忘録
+ ポエムタグにあるような内容

タイピングが楽しい!よろしくお願いします。
LaravelでDBの同じ行のAとBの値を足した値でwhereしたい

# はじめに

こんにちは、エンジニアのkeitaMaxです。

Laravel11でDBの同じ行のAとBの値を足した値でwhereしたいということで備忘録で書こうとおもます。

# やりたいこと

|a  |b  |c  |
|---|---|---|
|1  |2  |3  |
|10  |2  |30  |

こんなテーブルがあった時に、a+bが10以上のものをとってくる処理を書きたいと思います。

# 結論

```php
$query->where(DB::raw('a + b'), '>=', 10);
```

こんな感じで`DB::raw`を使えばできました。

# おわりに

この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。

最後まで読んでいただきありがとうございました！
SQLの実行順序について簡単にまとめてみた

クエリの構文順序（書き方）は必ずしも実行順序と一致しません。データベースがクエリを処理する際の内部的な手順は、次のようなステップで行われます。

### SQLクエリの論理的な実行順序

1. **FROM句**  
   - まず、どのテーブルやデータソースからデータを取得するかが決定されます。必要なテーブルが結合されるのもこの段階です。
   
2. **ON句**（結合条件）  
   - 複数のテーブルが結合されている場合、`ON`句を使って結合条件が評価されます。`JOIN`が行われる際の条件をここで定義します。

3. **JOIN句**  
   - 複数のテーブルがある場合、それらを結合（`JOIN`）します。`INNER JOIN`や`LEFT JOIN`などの結合がこのステップで処理されます。

4. **WHERE句**  
   - 結合が行われた後、`WHERE`句の条件で行のフィルタリングが行われます。指定された条件に一致する行だけが残ります。

5. **GROUP BY句**  
   - データを集計する際に、どの列を基準にグループ化するかが決まります。このステップでデータがグループ化され、グループごとの集計結果を生成する準備が進められます。

6. **HAVING句**  
   - グループ化されたデータに対して、さらに条件を指定してフィルタリングを行います。`HAVING`句は、`GROUP BY`によって生成されたグループに適用されます。

7. **SELECT句**  
   - このステップで、クエリで指定された列や式が評価されます。つまり、表示するカラムがここで決定されます。データの選択は、この段階で行われます。

8. **DISTINCT句**  
   - `SELECT`で取得する行の中から、重複を取り除くために`DISTINCT`が実行されます。

9. **ORDER BY句**  
   - 最終的な結果セットを指定されたカラムや順序に従って並び替えます。

10. **LIMIT句**  
   - 結果セットの行数を制限するための`LIMIT`句が適用され、表示されるデータの行数が決まります。

### 実行順序のイメージ

たとえば、以下のSQLクエリを考えてみましょう。

```sql
SELECT name, COUNT(*)
FROM employees
INNER JOIN departments ON employees.dept_id = departments.id
WHERE employees.salary > 5000
GROUP BY departments.name
HAVING COUNT(*) > 10
ORDER BY name ASC
LIMIT 5;
```

このクエリの実行順序は次の通りです：

1. **FROM**: `employees`と`departments`テーブルを指定。
2. **JOIN**: `employees.dept_id`と`departments.id`で`INNER JOIN`。
3. **WHERE**: `employees.salary > 5000`でフィルタリング。
4. **GROUP BY**: 部門名でグループ化（`departments.name`）。
5. **HAVING**: `COUNT(*) > 10`の条件を適用。
6. **SELECT**: `name`と`COUNT(*)`を選択。
7. **ORDER BY**: `name`で昇順にソート。
8. **LIMIT**: 結果を上位5行に制限。

### まとめ
SQLクエリは、`SELECT`文を記述する順番とは異なる順序で処理されます。まずデータの取得や結合を行い、その後フィルタリングやグループ化が行われ、最後に結果を選択してソート・制限する流れです。
【Java】MySQLでString型の値をDATE型やDATETIME型に変換

MySQLで`String`型の値を`DATE`型や`DATETIME`型に変換するには、`STR_TO_DATE()`関数を使う方法が一般的です。この関数は、文字列を指定したフォーマットに基づいて日付型に変換します。

### `STR_TO_DATE()`関数の構文

```sql
STR_TO_DATE(文字列, フォーマット)
```

- **文字列**: 変換したい日付の文字列（`VARCHAR`や`CHAR`型）。
- **フォーマット**: その文字列がどのようにフォーマットされているかを示すパターン。

### フォーマット指定子の例

| フォーマット指定子 | 説明              | 例                     |
|-------------------|-------------------|------------------------|
| `%Y`              | 4桁の年           | 2024                   |
| `%m`              | 2桁の月           | 01, 12                 |
| `%d`              | 2桁の日           | 01, 31                 |
| `%H`              | 2桁の時 (24時間制) | 00, 23                 |
| `%i`              | 2桁の分           | 00, 59                 |
| `%s`              | 2桁の秒           | 00, 59                 |

### 例1: `String`型を`DATE`型に変換

日付が `2024-10-04` というフォーマットの文字列を `DATE` 型に変換したい場合、以下のようにします。

```sql
SELECT STR_TO_DATE('2024-10-04', '%Y-%m-%d');
```

これにより、文字列 `'2024-10-04'` が `DATE` 型の `2024-10-04` に変換されます。

### 例2: `String`型を`DATETIME`型に変換

日付と時間が含まれている文字列 `'2024-10-04 12:30:45'` を `DATETIME` 型に変換する場合、以下のようにします。

```sql
SELECT STR_TO_DATE('2024-10-04 12:30:45', '%Y-%m-%d %H:%i:%s');
```

これにより、文字列 `'2024-10-04 12:30:45'` が `DATETIME` 型の `2024-10-04 12:30:45` に変換されます。

### 例3: テーブルの列を変換して取得

例えば、テーブルの中に `VARCHAR` 型で日付が保存されている場合、その列を`DATE`型として取得することもできます。

```sql
SELECT STR_TO_DATE(date_column, '%Y-%m-%d') AS formatted_date
FROM your_table;
```

### 例4: 変換後に別の列に更新

もし既存の文字列型の列を変換して、別の`DATE`型の列に保存したい場合は、`UPDATE`文を使用します。

```sql
UPDATE your_table
SET date_column_converted = STR_TO_DATE(date_column, '%Y-%m-%d');
```

この例では、`date_column` という文字列型の列を `STR_TO_DATE()` で変換し、`date_column_converted` という `DATE` 型の列に保存しています。

### まとめ
- `STR_TO_DATE()` 関数を使って、文字列を `DATE` や `DATETIME` 型に変換できます。
- 変換する際には、文字列のフォーマットに応じたフォーマット指定子を使う必要があります。
- `SELECT` 文で変換結果を取得したり、`UPDATE` 文で既存のデータを更新できます。
【Ruby】多重代入を忘れないために

# はじめに
こんにちは、絶賛Ruby勉強中のものです。
今回は多重代入について扱いたいと思います。
現在「たのしいRuby」を使用して勉強しているのですが、多重代入を勉強してこれはとても便利な一方アウトプットして定期的に目に入れないと忘れる…と感じたので、今回は気づきというよりは多重代入についてまとめた記事になります。

# 多重代入の基本構文
Rubyでは多重代入を利用して、以下のように一行で複数の変数に値を代入することができます。
```ruby:multiple_imputation1.rb
a, b, c = 1, 2
p a  # => 1
p b  # => 2
```
`a`, `b`にそれぞれ`1`, `2`が代入されています。
～～～(コメントより補足)～～～
多重代入自体便利ではありますが、上記の例だと行数を減らす以上のメリットがなくごちゃごちゃしているので以下のように書くようです
```ruby:multiple_imputation2.rb
a = 1
b = 1

p a  # => 1
p b  # => 2
```
～～～～～
複数の変数に対して、対応する値をカンマ区切りで一度に代入できるのがポイントです。
続いて多重代入のいくつかのパターンについてみていきましょう

## 値の数が変数の数と一致しない場合
もし値の数が変数の数と一致しない場合でも、Rubyは柔軟に対応します。
値の数が変数より少ない場合は、余った変数には`nil`が代入されます。
```ruby:multiple_imputation3.rb
x, y, z = 10, 20
p x  # => 10
p y  # => 20
p z  # => nil
```
では、変数の数より値が多い場合はどうなるでしょう
```ruby:multiple_imputation4.rb
a, b = 1, 2, 3
p a  # => 1
p b  # => 2
```
上記の場合は`3`を無視してくれる挙動をとってくれます。

～～～(コメントより補足)～～～
代入する値が代入先よりも多い場合ですが，<strong>代入先が 1 個の場合</strong>は「余りを無視」とはなりません：
```ruby:comment.rb
a = 1, 2, 3
p a # => [1, 2, 3]
```

## 配列を使った多重代入
多重代入は、配列を展開して変数に代入する際にも非常に便利です。
```ruby:array1.rb
arr = [10, 20, 30]
x, y, z = arr
# 本来ならば3行必要ですが、1行で済むのでとても便利です
# x = arr[0]
# y = arr[1]
# z = arr[2]

p x  # => 10
p y  # => 20
p z  # => 30
```
## 多重代入と残りの要素をまとめる方法
場合によっては、最初の数個の要素だけを変数に代入し、残りの要素を一つの配列としてまとめたいことがあります。
Rubyでは、`*`（スプラット演算子）を使って残りの要素をまとめることができます。
```ruby:splat1.rb
a, *b = 1, 2, 3, 4, 5
p a  # => 1
p b  # => [2, 3, 4, 5]
```
もちろん、スプラット演算子は末尾以外にも使用できます。
```ruby:splat2.rb
*a, b = 1, 2, 3, 4, 5
p a  # => [1, 2, 3, 4]
p b  # => 5
```

## 値の交換にも便利
多重代入のもう一つの便利な使い方は、値の交換です。
多くのプログラミング言語では、変数同士の値を交換する際に一時変数を使いますが、Rubyでは多重代入を使うことでシンプルに書けます。
```ruby:change_number1.rb
x = 1
y = 2

x, y = y, x
p x  # => 2
p y  # => 1
```
一時変数を使わずに、`x`と`y`の値を簡単に入れ替えることができました。
これは、配列の要素を入れ替える時や、アルゴリズムでの値の操作に非常に有効です。
ちなみにもし、多重代入を使わないで上記の処理を行おうとすると
```ruby:change_number1.rb
x = 1
y = 2
tmp = x
x = y
b = tmp

p x  # => 2
p y  # => 1
```
となり一時変数が出てくる処理となるのです。

## メソッドの戻り値を使った多重代入
多重代入は、メソッドの戻り値を複数の変数に受け取る場合にも便利です。
メソッドから配列を返し、その要素を個別に変数に代入することができます。
```ruby:cal.rb
def calculate(a, b)
  sum = a + b
  diff = a - b
  [sum, diff]  # 戻り値
end

result_sum, result_diff = calculate(10, 5)
p result_sum   # => 15
p result_diff  # => 5
```

## ブロックパラメータへの代入(追記)
コメントいただいたので、内容を追加しておきます。
多重代入はブロックパラメータにおいても使われるようです
```ruby:comment2.rb
feeding = {朝: 3, 暮: 4}

feeding.each do |time, amount|
  puts "#{time}は#{amount}個"
end
```
ここで使われている `Hash#each` は，ブロックに対し，キーと値のペアを配列にしたもの（上記の例では `[:朝, 3]` など）を渡します。
上記のコードでは，その配列を `time` と `amount` という二つのブロックパラメーターで受けているのです。

# まとめ
Rubyの多重代入は、一度に複数の変数に値を代入できる便利な機能ということがわかっていただけましたでしょうか。
とは言っても代用のきく操作であるので忘れないように定期的に思い出したり、使用して定着させていきましょう。