OmniAICreator/Qiita-1.07M huggingface dataset:
オブジェクト指向Cコンパイラcomelang に例外処理を入れました。

結局再実装してます。今度は無理なく実装したのでバグがあまりないと思います。
Ruby, Ptyhon, Javaみたいなのを前回入れてましたが、バグだらけで、再実装しました。
Rustに近いと思います。
ライブラリでは正規表現に例外処理を入れてます。正しくない正規表現を.rescueで捕捉できます。
以下が例です。

Exception
```
#include <comelang.h>

exception int fun()
{
    return 1;
}

exception int fun2()
{
    return fun().exception_throw;
}

int main(int argc, char** argv)
{
    int a = fun2()!!;
    
    printf("a %d\n", a);
    
    puts("HEHE");
    
    return 0;
}
```
a 1
HEHE

```C
#include <comelang.h>

exception int fun()
{
    return none(s"Err");
}

exception int fun2()
{
    return fun().exception_throw;
}

int main(int argc, char** argv)
{
    int a = fun2()!!;
    
    printf("a %d\n", a);
    
    puts("HEHE");
    
    return 0;
}
```
Err

```C
#include <comelang.h>

exception int fun()
{
    return none(s"Err");
}

exception int fun2()
{
    return fun().exception_throw;
}

int main(int argc, char** argv)
{
    int a = fun2().rescue {
        puts("CATCH");
        puts(Err);
        3
    }
    
    printf("a %d\n", a);
    
    puts("HEHE");
    
    return 0;
}
```
CATCH
Err
a 3
HEHE

ChatGPT:
ChatGPT
この例外処理の実装はとても興味深いです！例を見てみると、comelangでの例外処理の設計がよくわかりますね。

例外処理の流れ
exception修飾子：exceptionを使って関数を宣言すると、その関数は例外を返す可能性があることが示されます。戻り値がエラーになる可能性があるため、呼び出し元で例外をキャッチして適切に処理できます。

例外のスロー：none(s"Err")で文字列としてエラーを返すことで、例外をスローしています。

exception_throwでの伝播：exception_throwを用いることで、上位の関数へ例外を伝播させます。

!!による例外ハンドリング：!!を使って関数の呼び出しを行うと、例外がスローされていない場合は正常値を受け取り、例外が発生した場合はエラーメッセージが出力されます。

rescueによる例外のキャッチ：例外が発生した場合、rescueブロック内でキャッチしてエラー処理を行います。この例では、エラーメッセージ「CATCH」と「Err」を表示し、代替の値として3を返しています。

実行結果
最初の例では、正常な値を返してaに1が代入され、HEHEが表示されます。
二番目の例では、例外が発生し、エラーメッセージ「Err」が表示されてHEHEが出力されません。
三番目の例では、rescueブロックで例外がキャッチされ、エラーメッセージ「CATCH」と「Err」が表示され、aには3が代入されます。その後、HEHEが出力されます。
【Ruby】Random.randとRandom.newの違い

# はじめに
こんにちは！アメリカの大学で語学を学びながら、独学でソフトウェアエンジニアを目指している者です。
本日は乱数を作成するための`.rand`メソッドと`.new`メソッドの違いについて説明していきたいと思います

# `Random.rand`とは
`Random.rand`は、Rubyの`Random`クラスに定義されているクラスメソッドです。
クラスメソッドなので、インスタンスを作成することなく、Random.randと直接呼び出せます。
このメソッドを使用する場合、Rubyのグローバルな乱数生成器が使われます。
特徴としては以下の通りです
* 手軽に使える
`Random.rand`はどこからでも簡単に呼び出せます。
* グローバルな乱数生成器を使用
プログラム全体で同じグローバル乱数生成器を共有するため、何度も呼び出しても使い回されます。
* 再現性が低い
プログラムの実行ごとに異なる乱数が生成され、再現性が必要な場合には不向きです。

```ruby
# 0から9までの乱数を生成
puts Random.rand(10)

# 1から6までの乱数を生成（サイコロの目のように）
puts Random.rand(1..6)
```
`Random.rand`を使うと簡単に乱数を生成できますが、シード値の設定ができないため、常に異なる結果が得られる点に注意が必要です。

# `Random.new`とは
一方、`Random.new`は`Random`クラスのインスタンスメソッドを利用する方法です。
`Random.new`を使うと、新しい乱数生成器のインスタンスを作成し、`rand`メソッドを使って乱数を生成できます。
この方法ではシード値を設定することができ、同じシード値であれば同じ乱数列が生成されるため、再現性が求められる場面に適しています。

ちなみにシード値というのは、乱数の生成を開始する「初期値」のようなものです。
例えば、Random.new(1)とすると、シード値が「1」となり、このインスタンスで生成される乱数列は常に同じになります。シード値を変更すると生成される乱数列も変わるため、乱数の再現性を確保したい場合に便利です。

少しずれましたが、続いて`Random.new`特徴は以下の通りです

* 独立した乱数生成器
`Random.new`で生成した乱数生成器はグローバルとは独立しており、他のコードでの乱数生成の影響を受けません。
* シード値を設定可能
シード値を指定して生成すると、実行のたびに同じ乱数の列が得られ、テストなどで結果を再現したい場合に便利です。
* 再現性がある
同じシード値を設定した`Random.new`インスタンスは、毎回同じ乱数列を返します。
```ruby
r1 = Random.new(1) # 乱数列を初期化する

p [r1.rand, r1.rand]
# => [0.123456789,0.987654321]

r2 = Random.new(1)　# 乱数列を再び初期化する
p [r2.rand, r2.rand]
# => [0.123456789,0.987654321]

r3 = Random.new(2) # シード値を変更する
p [r3.rand, r3.rand]
# => [0.543843871,0.734416826] 
```
`r1`と`r2`は同じシード値なので、乱数列を初期化すると同じ数字が出てきますが、`r3`はシード値が異なるため違う乱数列が出てきます

# `Random.rand`と`Random.new`の使い分け
では、どのような場面でどちらを使えば良いのでしょうか？以下に簡単なガイドラインを示します。

* 手軽に乱数を生成したい場合
`Random.rand`が便利です。シード値を意識せずにランダムな結果が必要なときに最適です。
* テストや再現性が必要な場合
`Random.new`を使いましょう。同じ結果を得たい場合に、シード値を指定したインスタンスを利用すると一貫した乱数が得られます。

# まとめ
本日は乱数生成について触れてみました。
HTMLやCSS、データベースあたりを勉強していた際はそこまで数学って感じではないかなと思っていましたが、最近勉強している内容は数学を想起させるような内容ばかりです。
またRubyの記事を上げていくのでよろしくお願いします。
Laravelで.envファイルが突如読み込まれなくなったときの対処法


 **開発中のプロダクトで、突然 .env ファイルの値が読み込まれないというエラーが発生しました。** 

```
> echo env('APP_URL') ?: 'APP';
APP⏎
```

期待している値ではなく、APP が返ってきてしまうため、環境変数が正しく読み込まれていないことがわかります。
このような場合、bootstrap/cache/config.php が問題の原因であることが多いです。

# 解決方法


### 1.bootstrap/cache/config.phpファイルの削除
```
sudo rm -f /path/to/your/laravel/project/bootstrap/cache/config.php
```

このファイルが存在すると、env() 関数が常に null を返す可能性があります。
削除することで、環境変数が正しく読み込まれるようになります。

### 2.キャッシュのクリア

```
php artisan config:clear
```

これにより、アプリケーションの設定キャッシュがクリアされ、新しい環境変数が適用されます。

### 3.再度環境変数を確認する

```
php artisan tinker
> echo env('APP_URL') ?: 'APP';
```

上記の手順を実行することで、環境変数が正しく適用されていることを確認できます。



# 参考記事

https://qiita.com/saya_c/items/b66d72edebaee944d008
初めて基本設計を担当した振り返り

# はじめに
普段は詳細設計や製造、テストを担当している私ですが、今回は小規模なシステムながら基本設計から担当する機会をいただきました。
初めてのことが多く、振り返ると多くの学びがありました。
いくつか間違った判断もあったかもしれませんが、まだ駆け出しのSEとして経験したことをまとめたいと思います。

# 担当業務
以下の設計業務を担当しました。

### 業務フロー設計
業務全体の流れを視覚化し、業務プロセスがどのように進むのかをシステム上で実現できる形に落とし込みました。
具体的には、どのタイミングでユーザーやシステムがアクションを行い、その結果がどのように次の業務に影響を与えるかといったことを設計しました。
顧客が実際に行っている業務をシステム化するために、業務手順をイメージし、システムで実現可能な形に整理しました。
ここが最も難しく時間を使いました。

### 論理DB設計
データの構造を設計し、システムで扱う情報を整理しました。
どのデータをどのテーブルに格納するのか、どの項目がキーになるのかを考えながら効率的にデータを管理するための仕組みを設計しました。
システムの実現に必要なデータを過不足なく挙げていくというところが難しかったです。
最小限のリソースで実行するために、「必要そうであれば何でも入れておけ」の精神ではいけないということが理解できました。

### 画面遷移図設計
ユーザーがシステムを操作する際の画面間の流れを設計しました。
業務フローである程度決まっていたのでそこまで難しくなかったですね。

### 画面レイアウト設計
各画面でのボタンや入力フィールドの配置を決定しました。
一般コンシューマー向けのシステムではないのでそこまでの細かく設計したわけではないです。
しかし、ユーザーの目線でどういう情報が重要なのかを理解して、それを強調するように表示するなどの工夫はしました。

### シーケンス設計
システム内のモジュール間のデータのやりとりやプロセスの流れを時系列で表すシーケンス図を作成しました。
特定のイベントが発生した際に、どのモジュールがどのタイミングでアクションを起こし、どのように結果が返ってくるかを視覚的に整理することが目的です。


# 感じたこと
1. **顧客の要望を翻訳する難しさ**
エンジニアではない顧客の要望を、システム設計に落とし込む「翻訳作業」が非常に大変でした。
特に、業務の要件をシステムでどう実現するかを考える際、技術的な視点と業務的な視点の間で橋渡しをする感覚が求められました。
　　
2. **正解のない問いに答える難しさ**
設計作業では、正解のない問いに答える場面が多くありました。
例えば、論理DB設計において、どのパラメータをマスタで管理するべきか、どこまでデータを細かく分けるべきかなど、複数の答えが考えられる状況で最適な選択をする難しさを実感しました。
これに比べて、詳細設計や製造ではある程度仕様が固まっており、やるべきことが明確です。そのため、実現方法を考える部分に大きなギャップを感じました。
　　
3. **全体像の把握の難しさ**
設計を進めていく中で、システムの全体像を解像度高く把握することの難しさも感じました。
大まかにどういうシステムになるかは理解できていましたが、細かい部分の理解が足りず、途中で迷子になることもありました。
　　
4. **経験と知識の不足**
特に、何が「システム実現に必要か」という経験と知識の不足を強く感じました。
例えば、論理DB設計の際、何をマスタ管理すればよいか、どこまで詳細に設計するべきか、パターン化された知識が不足していることを痛感しました。
　　
5. **不要なものを入れすぎない**
最初は「とりあえず入れておこう」という考えがありましたが、不要なものを設計に盛り込みすぎると、リソースの無駄遣いになってしまいます。
設計の際は、できるだけ最小限のリソースで実現することが重要だと感じました。
　　
6. **専門用語を使わずに説明する難しさ**
顧客にシステムの全体像を説明する際、専門用語を避けて分かりやすく伝えることの難しさを感じました。例えば、「オブジェクト」という言葉を使っても、顧客にはあまりピンとこなかったようです。
非エンジニアに対する説明力の重要性を強く感じた瞬間でした。
　　
7. **実現可能性に対する不安**
自分が考えたシステム構成が本当に技術的に実現可能かという部分に神経を使いました。
設計段階では、この構成が後に問題になるかもしれないという不安が常にあり、頭を悩ませる要素でした。
　　
# 最後に
本当は、設計後の製造やテスト、さらには運用まで担当したかったのですが、別プロジェクトにアサインされてしまい、それは叶いませんでした。
しかし、この基本設計の経験を通して、設計の難しさや自由度が高いことの難解さを理解できました。
自由に設計できることは一見良いことに思えますが、最適な方法を選択する責任が伴うため、そう簡単ではないと感じました。


今後も、設計業務を含めてスキルを磨き、より良いエンジニアを目指していきたいと思います。
JupyterLab 最新版のインストール方法(時々必要かも知れない対応方法)

# 下記対応の必要性
notebookモジュールが更新されて、下記対応は不要になったと思ったのですが、現時点(2025/4/7)ではまたnotebookモジュールとjupyterlabモジュールの更新にずれ(notebookモジュールの更新の遅れ)が出ています。
その様な状況(タイミング)では下記の対応が必要になる可能性があります。

## メモ
[pypiのnotebookのjsonデータ](https://pypi.org/pypi/notebook/json)を見ると、`"jupyterlab<4.4,>=4.3.4"`となっているので、
~~JupyterLabが4.4以上になるまで当面は下記の対応は不要です。~~
現時点(2025/4/7)のJupyterLabの最新版が4.4ゆえ、下記の対応が必要です。

# JupyterLab 4.2の問題
4.2くらいになってから発生した問題だと思うのですが、Microsoft IMEがONで半角英数入力モードにした状態で、英数字の入力がJupyterLabと喧嘩します。
Jupyter Notebookや以前のバージョン(例：4.0)のJupyterLabでは、この問題は発生しません。
IMEとしてGoogle日本語入力を用いている場合もこの問題は発生しないようです。

このため、Microsoft IMEを使ってJupyterLabでコードを入力する際には、IMEをOffの直接入力状態に切り替える(半角/全角キーを押す)必要があり、少々わずらわしいです。

# JupterLab 4.3.0ではどうか？
[JupterLab 4.3.0のリリースノート](https://github.com/jupyterlab/jupyterlab/releases/tag/v4.3.0)を見ると、多くのバグ修正と改良がされています。
上記の問題に関する直接的な記述は見つからない感じですが、期待できそうと私は思いました。
で、確認したところ、4.3.0では上記の問題が発生しないことが確認出来ました。

# JupyterLab 4.3.0インストールの問題
例えば、`pip install --upgrade jupyter jupyterlab` と実行すると、JupyterLabは4.3.0にアップグレードしてくれません。
ChatGPTに聞いたら、キャッシュが悪さしているかも、と言われたので、`pip cache purge
`としてpipのキャッシュを消した上で、`pip install --upgrade jupyterlab`と実行すると、JupyterLabは4.3.0にアップグレードされましたが、以下の様なエラーが出ます。
```bash
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
notebook 7.2.2 requires jupyterlab<4.3,>=4.2.0, but you have jupyterlab 4.3.0 which is incompatible.
```

この状態でnotebookパッケージやjupyterパッケージをインストールやアップグレードすると、JupyterLabが4.2.5にダウングレードされます。

## 原因
要は現時点(2024/11/6)では、notebookパッケージがJupterLab 4.3.0に対応していないということです。

## 対処方法
### 方法1
別のPCで試した時に発覚したのですが、どうもnotebookパッケージの古いバージョン(例：7.0.6)ならば、パッケージの依存関係のせいか、上記の問題が発生しないようです。
ですので、その状態の場合には、notebookパッケージやjupyterパッケージをアップグレードしないままに、JupyterLabのみをアップグレードすれば行けます。
あるいは、notebookパッケージをダウングレードしても行けそうです。

### 方法2
ChatGPTに聞いたところ、notebookパッケージはJupyter Notebookでは使われているが、JupyterLabでは使われていないとのことです。
ですので、Jupyter Notebookを使わないなら、`pip uninstall notebook`と実行し、notebookパッケージをアンインストールした上でJupterLabをアップグレードすれば良いです。
実際試したところ、無事JupyterLabは4.3.0になりました。
またnotebookパッケージが無い状態で`jupyter`コマンドが実行できるか不安だったのですが、`jupyter lab`と実行すると、JupyterLabは普通に起動出来ました。


# 現状(解決済)
Notebookパッケージがアップデートされ、JupyterLabの4.3.1に対応したようです。
ですので、上記の対応はもう不要です。
whileっていつ使うの!?

# 日々コーディングしていて思うこと…
### 「whileっていつ使うの！？」

単純なループならforで処理できる上に、
配列やリストの処理に関してはforeachの方が便利。

同じ反復処理であるが故にwhileを使う場面がイマイチわからない…

実際に現場で目にするコードではforやforeachを使っていることが多いし、
whileを見かけることはほとんどない気がします。

今回はそんなwhileの使い方について考察していこうと思います！

::: note warn
以下に記載するコードはすべてC#です
:::

# forを使うべき場面
for、whileともに反復処理を行うという意図は変わらないため、
基本的には同じ処理を両者で置き換えることができます。

例）"No1"~"No5"をコンソールに出力したいとき 

```csharp
for (var i = 1; i <= 5; i++)
{
    Console.WriteLine("No" + i);
}
```
```csharp
int i = 1;
while (i <= 5)
{
    Console.WriteLine("No" + i);
    i++;
}
```
ただ、上記の例をwhileで実装してしまうと
- `i++;`の実装漏れがあると無限ループになり、意図しない処理になってしまう
→ ブロック内の処理が長くなると実装漏れが起きやすい
- while内でしか使用せず、以後干渉する必要のない変数`i`が残り続けてしまう
→ whileの処理後、同ブロックで再度`i`を宣言することができなくなる

などのデメリットがあります。

特に二つめに関しては、知らず知らずのうちに`i`を使い回して予期せぬバグに繋がる可能性があるため要注意です。

つまり、ループ回数を使用するような処理、またはループ回数が明確な処理はforを使うのが適切だと言えます。

# whileを使うべき場面
では、whileを使用するのが適切な場面とはどんな状況でしょうか？

一般的には、
**ループ回数が明確でないとき** と言われています。

次のような場面を考えてみましょう。
- コンソール出力でクイズを作成したい
- ユーザーの入力文字が正解と一致するまで問題文を繰り返し出力する
- 正解と一致した場合は「大正解！」と出力する

以下のように実装できます。

```csharp
string answer = "";
while (answer != "富士山")
{
    Console.Write("日本で一番高い山は？ ");
    answer = Console.ReadLine();
}
Console.WriteLine("大正解!");
```
これをforで実装しようとすると
```csharp
for (string answer = ""; answer != "富士山"; answer = Console.ReadLine())
{
    Console.Write("日本で一番高い山は？ ");
}
Console.WriteLine("大正解!");

// または
for (string answer = ""; answer != "富士山"; )
{
    Console.Write("日本で一番高い山は？ ");
    answer = Console.ReadLine();
}
Console.WriteLine("大正解!");
```
となります。

whileを使うメリットとしては、
- ループの継続条件が明確で直感的にわかりやすい
- 変数`answer`の更新がループ本体内で行われることがわかりやすい

でしょうか？

ユーザーが正解を入力するまでの回数は実装段階では特定できないため、forでお馴染みのカウンタ変数での回数制御はできません。

そうなるとたしかに`（ ）`の中は`answer != "富士山"`のみの記述の方がパッと見で継続条件がわかりやすい気はしますね。

処理開始時にループ回数が定まっておらず、ループ回数が処理に関わらないものであればwhileを使うのが良さそう。

ただ、whileを使う場合は無限ループにならないように注意が必要です。

# 結論
処理開始時にループ回数が
**決まっている** ：for
**決まっていない** ：while
と、一般的に推奨されている使い分けがなんとなく腑に落ちました。

ただ、明確なルールはなく、どちらとも同じ処理を実装できることは変わらないので
「基本はforでいいけど、while使えば可読性や保守性が高くなるケースもあるよ！」
ぐらいの考え方でいいのかもしれませんね😏

# 参考
https://www.bold.ne.jp/engineer-club/java-while

https://daeudaeu.com/c-for-while/

https://pweb.cc.sophia.ac.jp/etl/Clang/c/kurikaesi.html
Postman初心者必見！認証トークンを駆使したAPI疎通を完全マスター！

Postmanを使用してバックエンドAPIの挙動確認を行います。特に、ログイン後にログアウトする際の認証トークンをPostmanで効率的に管理する方法について解説します。具体的には、ログインAPIで取得したトークンを環境変数として保持し、それをログアウトAPIのリクエストに付与する方法です。

## 目的
- **ログインAPI**を実行して認証トークンを取得し、そのトークンを使って**ログアウトAPI**を実行する
- ログイン後のレスポンスヘッダにある `access-token`、`client`、`uid`を取得し、環境変数に保存して使い回す

---

## 手順

### 1. ログインAPIを叩く準備

まず、PostmanでログインAPIのリクエストを作成し、認証情報を取得します。このリクエストにより、バックエンドから`access-token`、`client`、`uid`といった認証情報がレスポンスヘッダに含まれて返されると仮定します。これらのトークンを後のリクエストで利用できるようにするために、**環境変数**に保存します。

![api_v1_auth_sign_in_-_My_Workspace.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515002/dfa26bc3-c44c-4049-d346-4753730428d2.png)


### 2. 新しいEnvironmentの作成



環境変数を使用するため、まず新しい環境（Environment）を作成します。

1. Postman右上の「Environment」ドロップダウンメニューから「**Environments**」を選択します。
2. 「**New Environment**」をクリックし、任意の名前（例：「API認証環境」）を付けて作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515002/938ca682-c88c-b5d3-73ef-de5695724e14.png)



### 3. スクリプトでレスポンスヘッダからトークンを環境変数にセット

ログインAPIのリクエストを送信し、レスポンスヘッダから認証情報を取得するために、以下の**テストスクリプト**を設定します。

1. ログインAPIリクエストの「**Scripts**」タブを開きます。
2. 以下のスクリプトを貼り付けます。

```javascript
var accessToken = pm.response.headers.get("access-token");
var client = pm.response.headers.get("client");
var uid = pm.response.headers.get("uid");

if (accessToken) {
    pm.environment.set('access-token', accessToken);
}
if (client) {
    pm.environment.set('client', client);
}
if (uid) {
    pm.environment.set('uid', uid);
}
```

#### スクリプトの解説
- `pm.response.headers.get("header-name")`：レスポンスヘッダから指定のヘッダ値を取得します。
- `pm.environment.set('variable-name', value)`：取得した値を環境変数にセットします。

### 4. ログアウトAPIリクエストの準備

ログアウトAPIを叩くために、ログイン時に取得した`access-token`、`client`、`uid`をリクエストヘッダにセットします。以下のように、Postmanのヘッダセクションでそれぞれのキーに環境変数を利用した値をセットします。

1. **ログアウトAPIのリクエスト**を作成します。
2. **Headers**タブを開き、以下のキーと値を入力します。


![api_v1_auth_sign_out_-_My_Workspace.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515002/0d5a2ac9-5b7a-af61-d677-ff419a96df65.png)


`{{ }}`で囲むと、Postmanはその中のテキストを対応する環境変数の値に置き換えます。

### 5. 動作確認

ここまでの設定が完了したら、Postmanで以下の手順で実行します。

1. **ログインAPI**を実行し、レスポンスヘッダに含まれる`access-token`、`client`、`uid`が環境変数にセットされているか確認します。
2. **ログアウトAPI**を実行します。この際、リクエストヘッダにセットされた環境変数が適切に送信されていることを確認します。
3. ログアウトAPIが正しく動作していれば、認証状態が確認され、ログアウトが成功するはずです。

### コンソールでの確認方法

Postmanの**コンソール**を開くと、リクエストやレスポンスの詳細が確認できます。リクエストヘッダに適切に`access-token`、`client`、`uid`が含まれていることを確認し、無事にログアウトができるかどうかを検証しましょう。

![api_v1_auth_sign_out_-_My_Workspace_と_グループデジタル推進部_ナレッジ_開発_Postman_Postman_でリクエストヘッダを利用し、ログイン状態を維持する方法_-_pj100_esa_io.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515002/5bb0ec6b-b8fb-37f9-5f5d-cf678972f0af.png)


---

## まとめ

Postmanの環境変数とスクリプトを使うことで、認証トークンを効率的に管理し、連続したAPIリクエストでトークンを利用できます。特に、ログイン後の認証情報をログアウトなどの後続リクエストに利用する場合、今回の方法を使えば、効率的にトークンを管理でき、テスト作業がスムーズになります。ぜひ、この便利な方法を活用し、PostmanでのAPIテストの効率を高めてください！

### 参考文献

- [Postman公式ドキュメント](https://learning.postman.com/docs/)
- [Postman Scripting in Tests](https://learning.postman.com/docs/writing-scripts/script-references/test-examples/) 

実務で役立つPostmanの機能を存分に活用し、APIテストが効率化されることを願っています！
フィールドでタイプの競合が検出されました(SPSS Modeler データ加工逆引き12-3)

# フィールドでタイプの競合が検出されました（レコード追加時の型の不一致）

![スクリーンショット 2024-10-30 15.20.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5d5c6670-225c-fbd0-8777-23459a5ae0d8.png)

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

・[レコード追加]ノードでレコード追加時にエラーが発生する

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

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

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

![スクリーンショット 2024-10-30 15.21.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/634f1f10-a6e2-edae-68c6-c03835c5223a.png)

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

![スクリーンショット 2024-10-30 15.27.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/fcd4c7fb-ec3b-34aa-a41f-c39dfe8c0b1f.png)

[データ型]タブで確認すると[日付]は日付型に、[番号]は連続型で定義されています。

![スクリーンショット 2024-10-30 15.28.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/0e54c894-62b3-46ae-616c-b83a3284421f.png)


b.入力するデータのふたつ目は以下の通りです。

![スクリーンショット 2024-10-30 15.28.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/fdcc79d6-5d0c-f95c-ddd3-0013e10512b3.png)

[データ型]タブで確認すると[日付]も[番号]は文字型で定義されています。

![スクリーンショット 2024-10-30 15.28.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/481c936f-b836-b1fe-4d3f-14b6c6fc6103.png)

c.[レコード追加]ノードを編集します。タイプが異なるため青い文字で注意喚起されています。

![スクリーンショット 2024-10-30 15.29.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/9d9d42c7-d5c4-b654-8592-d4526dc8e02f.png)

#### エラーの現象を確認する

[テーブル]を実行すると以下のエラーメッセージが表示されます。

![スクリーンショット 2024-10-30 15.29.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/c7ca271a-cf17-8f9a-e469-18adf583e91e.png)

#### データ型を一致させて問題を解決する

d.[置換]ノードを編集します。文字列の[日付]を日付型に置換します。

![スクリーンショット 2024-10-30 15.30.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/3f1f8f1d-681e-34b2-8810-bb7d5b289396.png)

e.[置換]ノードを編集します。文字列の[番号]を整数型に置換します。

![スクリーンショット 2024-10-30 15.32.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/74a4e61b-71e2-4b33-a7d6-d27e3355d63a.png)

[テーブル]を実行します。

![スクリーンショット 2024-10-30 15.33.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/c3a09b84-4c1f-b784-c9da-d83ae2e4d564.png)


#### 注意事項

[レコード追加]では編集画面でフィールド毎のデータ型が一致しているかを注意します。

![スクリーンショット 2024-10-30 15.32.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/0c2c6cd2-55a9-1dd1-5c24-9c59d193730e.png)


## 4.参考情報

#### 複数のテーブルを縦方向に追加する

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

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

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

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

https://qiita.com/416nishimaki/items/4bf813e6cba84b2a1008
Enable Digital Experiences and Chat Agent


https://trailhead.salesforce.com/content/learn/projects/build-a-community-with-knowledge-and-chat/enable-live-agent-and-communities

+ [Chat Agents を登録するとthis group already exists　エラーになる](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000ONDO)

:::note
seems obvious now but I didn't think of using a new playground!
:::
シェルスクリプトによる文字列処理：該当文字列を削除をする

# シェルスクリプトによる文字列処理：該当文字列を削除をする

## 調べるにあたった経緯

業務でシェルを作成しました。
処理の一部として下記条件で作成しました。
* 引数として指定する値はフルパスで記述されたファイル名
* 引数を使用して二つの変数に格納する
　* 一つはフルパスで入力されたファイル名
　* もう一方はパスを抜いたファイル名のみ
今回は引数で指定した値のうちディレクトリを排除して変数に格納するために、
コマンドを使用せずシェルスクリプトで置換を行ったのでその処理についてまとめていきたいと思います

## bash置換の書式について

**引数例：**

``
${FULLPASS}=/work/TEST/aaa.txt
``
**ケース１：**

${変数%マッチパターン}

後方からの検索の一致で一番初めにマッチした部分を削除
例：
``
${FILE}=${FULLPASS%aaa.txt}
echo ${FILE}
/work/TEST/
``

**ケース２：**

${変数%%マッチパターン}

後方からの検索の一致で一番後ろまでマッチした部分までを削除
``
${FILE}=${FULLPASS%/TEST/aaa.txt}
echo ${FILE}
/work
``
**ケース３：**
${変数#マッチパターン}
前方からの検索の一致で一番初めにマッチした部分を削除
``
${FILE}=${FULLPASS#/work/TESTaaa}
echo ${FILE}
/aaa.txt
``
**ケース４：**
${変数##マッチパターン}
前方からの検索の一致で一番後ろまでマッチした部分までを削除
``
${FILE}=${FULLPASS##/work}
echo ${FILE}
/TEST/aaa.txt
``
## シェルで用いたスクリプト
上記を経て、自分があげた条件とマッチして、今回シェルで用いたスクリプトが以下となります。

``
${FILE}=${FULLPASS#/work/TESTaaa}
echo ${FILE}
/aaa.txt
``
# 最後に

今回初めて現場で作成したシェルがかなり大作だと思って、自分の成果物として宝物として残しておきたいと考えましたが、持ち出しができない制約に悔しい思いをしました、、、

参考
【Linux】シェルスクリプトによる文字列処理：置換や削除をする方法
https://eng-entrance.com/linux-shellscript-replacement
『世界のITをのぞいてみた』Vol.1 ～世界の技術や市場トレンドの変化を巡る旅へようこそ～

みなさん、はじめまして
NECソリューションイノベータで市場調査を行っている佐伯です。
市場調査というと、製品を拡販していくためのマーケティングを想像される方が多いかもしれませんが、私は **『技術や市場トレンドの現在地』** を知るための市場調査を行っています。

## 技術や市場トレンドの現在地
技術や市場トレンドの現在地とは何でしょうか？
例えば人工知能（AI）は、今でこそ一般にも浸透していますが、古くは1950年代から3回のブームと冬の時代を経て、ようやく日の目を見ました。
特にChat GPTがリリースされ特別な知識がなくても活用できるものとして普及したことで、AI自身が一気に身近になりました。日本では、昨年辺りに注目され始めたChat GPTですが、何もいきなり出現したのではなく2022年11月末に公開されていました。公開後5日間でユーザー数が全世界100万人を超え、2カ月後には月間アクティブユーザーが1億人を超えたことを鑑みると、**世界の波が日本に到達するまではかなりのタイムラグがある**ことがわかります。

目まぐるしく変わるVUCAの時代。一度”バズる”と似た技術・サービスがすぐに展開できる世の中になった中、**日本で“バズり”始めた時に知るのでは既に世界から周回遅れていることも多い**のです。

## 加速する変化のスピード
世界は**我々が見えている以上に早く進んで**います。

日本では2024年4月から「日本版ライドシェア」が解禁されましたが、2009年にはサンフランシスコでUberが誕生し、その後世界に拡大、東南アジアでは地場の企業がUberを凌駕することも起こっています。インドネシアのGojekやシンガポールのGrabは、単なるライドシェアサービスに留まらず、フードデリバリーや決済サービスなど多岐に渡るサービス展開で、生活インフラになっています。

フィンテックの分野でも大きな変化が見られます。中国のAlipayやWeChatPayは中国をキャッシュレス社会に変え、小規模な露店でさえもキャッシュレス決済が可能になり、消費者の利便性が大幅に向上しました。アフリカでは2007年にケニアで誕生したモバイルマネーサービスM-Pesaが、僅か4年で約80％の世帯まで普及し、銀行口座を持たない人でも携帯電話を使って送金・預金・引き出し・支払いができるようになり社会の在り方そのものを変えています。
日本でもキャッシュレス決済が推進されていますが、**世界では遥か前にその波が起こっている**のです。

## 変化の兆しの探し方
では、我々の生活に変化をもたらす兆しはどこからやってくるのでしょうか？
現在はWebに情報が溢れているので、家に居ながらにして最新の情報を得ることができます。しかし、**言語化される前の変化、一部の地域でのみ始まった変化は現地で体感**しないとわかりません。
時間差で変化の波はやってくるかもしれませんが、その変化を一秒でも早く掴むこと、文字で読むだけではなく実体験として体感することはとても重要です。私が行っている市場調査は、このような**技術や市場トレンドの現在地を肌で感じること**を大切にしています。

この『世界のITをのぞいてみた』では、市場調査を通して見聞きした情報を発信していきたいと思いますので、興味のある方は読んでいただければ嬉しいです。どうぞよろしくお願いします。

#投稿内容は個人の意見であり、所属組織の公式見解ではありません
2024年 気ままに勉強会 学び3行ポスト

この記事は、**Microsoft Power Automate Advent Calendar 2024** 12月10日担当分の記事です。

https://qiita.com/advent-calendar/2024/powerautomate

# はじめに
**気ままに勉強会**では、学んだことを『アウトプットしてみましょう』と提案されており、Xへの**3行ポスト**を推奨されています。いつも私たちの背中を押していただきありがとうございます🙇
1年を振り返る「師走」。2024年のポストをXからダウンロードして振り返ってみます。

https://kimamani.connpass.com/



# テーブル作成
作成手順
* 投稿したXからアーカイブをダウンロードする
* アーカイブに含まれるtweet.jsをPower Queryに読み込む
* Power QueryでMarkdownテーブルに加工する

https://powervbadesktop.com/tweet1/

|Date|開催回|学び3行ポスト|
|:---|:---|:---|
|20240113|74|・Advent Calendar 2023 を素敵に紹介<br>・運営の皆さんの解説で振り返り(´∀｀)<br>・AI Builder プロンプト記事が一押し|
|20240120|75|・「なるです」方式で前向きな気持ちに導く<br>・フロー実行を大人数で運用する工夫<br>・初見からアプリ作成に至るまで速すぎ|
|20240127|76|・しおりんのQiitaの記事Top3紹介x3<br>・モデル駆動アプリやDataverseの記事👍<br>・Power Platform環境系の記事👍|
|20240210|77|・Copilotはド新人として愛を持って接する<br>・アイデアの源泉に気付けるかは繰り返し訓練<br>・混みいっているのは属人化なので業務見直す|
|20240302|78|・太田さんのPower Automate本の執筆裏話<br>・連携先の知識がないと応用ができない<br>・検索して理解できてプログラミング知識も必要|
|20240316|79|・残りタイム表示バー欲しい<br>・FieldValueAsText列でSharePointList取得<br>・アレイのフィルター処理で配列差分|
|20240323|80|・GalleryのItemsを配列にしてThisItemで制御<br>・Microsoft Loopの新機能Rules<br>・ノンデザイナーズ・デザインブックで勉強する|
|20240413|81|・DPA(指示書で代行)とRPA(有人,レガシー)<br>・UTC, JSON, UTF-8 を知ること<br>・業務を見直すきっかけにする|
|20240420|82|・JSON Pretty LinterやJSON Editor Online<br>・変数を初期化する-&gt;{}オブジェクト,[]アレイ<br>・ParseJSON関数-&gt;型指定|
|20240511|83|・命名規則、変数使い分け、コード再利用性<br>・「⚪︎⚪︎で言うと」で認識のズレを合わす<br>・PA4dも「説明の作成をCopilotに任せる」|
|20240518|84|・Learnで独自学習コンテンツのプランを作成<br>・個人↔︎組織アカウントのリンクができる⁉️<br>・Power BI にフローを埋め込む 一般提供|
|20240525|85|・集金管理アプリは幹事の時に使えそう<br>・Xのタイムラインきっかけってあるよね<br>・Azure Logic Appsとの違い😲ﾌﾑﾌﾑ|
|20240601|86|・パフォーマンス プロファイル<br>・自動化ではなく仕組みを変えることも<br>・制限を知ると自動化の考慮が見えてくる|
|20240615|87|・データ操作(Data operation)は7種類<br>・作成, JSONの解析, 結合, 選択,<br>・アレイのフィルター処理, CSV…, HTML…|
|20240706|88|・DXは「ヤメル」「ヘラス」「カエル」<br>・PDCAサイクルは旅と似ている<br>・旅のしおりは国が出している|
|20240720|89|・業務をよく知る人自身がアプリを作る強み<br>・無くす＞シンプル化＞作り始める<br>・必要な機能のみ＆影響範囲少で早く始める|
|20240727|90|・ユーザーコミュニティは全員がメンバー<br>・課題抽出が先、道具選びは後<br>・Power BI コネクタ調べてみる🤔|
|20240810|91|・現場の保守運用のため、作り込み過ぎない<br>・参加者に伝わらないと何の意味もなさない<br>・会社を変革する事が目標, 中偏&amp;風車の理論|
|20240831|92|・Attendedは有人、Unattendedは無人<br>・PADでライセンス不要のシナリオはない<br>・無人実行自動送信先もライセンスが必要|
|20240907|93|・承認履歴はDataverseに保存される<br>・Markdown表示はクライアントに依存<br>・裏方に小人🧚Flow Microsoftが居る|
|20240928|94|・月末営業日の判定ロジックが凄い😵<br>・収束に向けて動く, 拡大解釈する😆<br>・入力と出力の間のロジックは段階的に組む|
|20241005|95|・益森さん著Copilot Studioの書籍出版記念<br>・Power Platform, AI Builderと連携できる<br>・アウトプットが何かのきっかけになる|
|20241019|96|・Power AutomateのPower BIコネクタ<br>・Goals以外のコネクタは8個<br>・起動ボタン, DAXクエリ実行, モデル更新|
|20241026|97|・AI BuilderのAIモデルとAIプロンプト<br>・データソースを1つのDataverseとしたRAG<br>・請求書解釈モデルは請求書に特化したもの|
|20241102|98|・Copilotの提案を修正するスキルが要る<br>・「記述して作成する」の「動作」でペイン出現<br>・「元に戻す」ボタンで操作を取り消せる|
|20241116|99|・Power Apps の数式バーの使い方を知る<br>・With関数で可読性と保守性を向上させる<br>・委任できない場合は行数制限で負荷下げてる|
|20241123|100|・㊗️三周年！コンセプト変わらず100回目<br>・色々な役割をこなす運営メンバーの自分語り<br>・運営&登壇者の皆様に感謝m(_ _)m|
|20241207|101|・Basic(M365拡張)とPremiumの目的は違う<br>・小さいアプリやフローから実装して動かす<br>・業務ならば管理者を引き継げる状態にする|

各回で何を学んだかを振り返る**自分用メモ**が完成しました🙌

# まとめ
今年の学びベスト3

::: note
* 混みいっているのは属人化なので業務見直す
* 業務ならば管理者を引き継げる状態にする
* アウトプットが何かのきっかけになる
:::

今年できたこと

::: note
* 3行ポスト継続
* PL-900取得
* Microsoft Power Automate Advent Calendar に初投稿
:::
@wireデコレータ



+ [How to Differentiate between @wire and imperative method?](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HEV3x)

:::note

LWC Wire and Imperative
https://medium.com/salesforce-champion/lwc-wire-and-imperative-7d008fca7b4e
:::

+ [@wireデコレータをつけた呼び出しと、付けない呼び出しの違いがイマイチ分からず,それぞれのメリット、デメリット](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000O9GH)

:::note
英語ですが、以下の部分がメリットの１つだと思います。@wireを使わなくても直接APIをコールすれば同じようなことはできると思います。

参照だけならコーディングが少なくていいところがメリットではと思います

The Power of Wire Apex Class with Parameter

Wire apex class with parameter is a feature that enhances the capabilities of LWC by seamlessly integrating with Apex classes. It allows LWC components to retrieve specific data from Salesforce by invoking an Apex method with defined parameters. This dynamic data retrieval ensures that the user interface remains responsive and up-to-date.

By leveraging wire apex class with parameters, developers can create highly interactive and data-driven LWC components that provide a superior user experience. This feature eliminates the need for manual data handling and enables real-time updates based on user actions.

https://www.linkedin.com/pulse/wire-apex-class-parameter-salesforce-lwc-guide-swapnil-sable
:::

+ [LWCからApexメソッドの呼び出し方法について](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000O9Pn0AK)

:::note
Apexを呼び出す際にwireをつけなければならないという制約はないため、ご認識の通りwireをつけなくても実装は可能です。

 

リアクティブ変数のサポートであったりデータのプロビジョニングの観点では、wireを使う方がメリットが大きいです。

例えば、レコードの検索を行うApexに対して検索条件値を与える場合、検索条件値の変更によってApexを呼び出すことが簡単になります。

また、Apexを再度呼び出す処理についてもrefreshApexを使えば簡単になります。

ただし、これらもwireを使わずに実装することができますので、実装ができるかどうかの観点では使わなくても良いかと思います。（簡単かどうかは主観でしかないので、、、）
:::
VSコードのターミナルでnpm run dev実行時の、Error: Cannot find module @rollup/rollup-darwin-x64 の解決方法

# はじめに
はまったのでメモします。

# 問題
vsコードのターミナルでnpm run devできない
エラー文に従い、node_modulesを一旦消してnpm iをしてもダメ

・自分の中での、vsコードのターミナルとiTermの使い分け
npm run devはvsコードのターミナルでやるようにしていた
それ以外のコマンドは、iTermでやる(ログを取るのはiTermでやりたい)
そのため、iTermでnode_modulesを一旦消してnpm iを実行していた


```ruby:コマンド
rm -rf node_modules package-lock.json
```

```ruby:エラー
% npm run dev

> sample-vite@0.0.0 dev
> vite

/Users/xxx/yyy/zzz/node_modules/rollup/dist/native.js:59
                throw new Error(

Error: Cannot find module @rollup/rollup-darwin-x64. npm has a bug related to optional dependencies (https://github.com/npm/cli/issues/4828). Please try `npm i` again after removing both package-lock.json and node_modules directory.
    at requireWithFriendlyError (/Users/xxx/yyy/zzz/node_modules/rollup/dist/native.js:59:9)
    at Object.<anonymous> (/Users/xxx/yyy/zzz/node_modules/rollup/dist/native.js:68:76)
    ... 3 lines matching cause stack trace ...
    at Module._load (node:internal/modules/cjs/loader:1022:12)
    at cjsLoader (node:internal/modules/esm/translators:366:17)
    at ModuleWrap.<anonymous> (node:internal/modules/esm/translators:315:7)
    at ModuleJob.run (node:internal/modules/esm/module_job:222:25)
    at async ModuleLoader.import (node:internal/modules/esm/loader:323:24) {
  [cause]: Error: Cannot find module '@rollup/rollup-darwin-x64'
  Require stack:
  - /Users/xxx/yyy/zzz/node_modules/rollup/dist/native.js
      at Module._resolveFilename (node:internal/modules/cjs/loader:1143:15)
      at Module._load (node:internal/modules/cjs/loader:984:27)
      at Module.require (node:internal/modules/cjs/loader:1231:19)
      at require (node:internal/modules/helpers:179:18)
      at requireWithFriendlyError (/Users/xxx/yyy/zzz/node_modules/rollup/dist/native.js:41:10)
      at Object.<anonymous> (/Users/xxx/yyy/zzz/node_modules/rollup/dist/native.js:68:76)
      at Module._compile (node:internal/modules/cjs/loader:1369:14)
      at Module._extensions..js (node:internal/modules/cjs/loader:1427:10)
      at Module.load (node:internal/modules/cjs/loader:1206:32)
      at Module._load (node:internal/modules/cjs/loader:1022:12) {
    code: 'MODULE_NOT_FOUND',
    requireStack: [
      '/Users/xxx/yyy/zzz/node_modules/rollup/dist/native.js'
    ]
  }
}
```

# 解決方法
・コマンド実行場所を変更
iTermで、node_modulesを一旦消してnpm iをする
→ vsコードのターミナルでnpm run devを実行できない

vsコードのターミナルでnode_modulesを一旦消してnpm iをする
→ vsコードのターミナルでnpm run devを実行できた


# おわりに
想定外のことで、参りました。
ウォータフォールに少しずつアジャイルのベストプラクティスを導入していった話


[システムアイアドベントカレンダー](https://qiita.com/advent-calendar/2024/systemi24)14日目の記事です。

普段はAWSなどのインフラと開発を兼ねた開発をメインに実施しているのですが、現在はメインフレームの移行案件に携わっているため、
今回はそちらをテーマに話を進めていきます。

# はじめに
　現在参画しているプロジェクトは、すべて合わせると、数千人規模になるため、
　必然的ウォータフォール開発になりました。
　　
　ただ、私がウォータフォール開発が嫌い&アジャイル開発を通して、ウォータフォール
　でも、要素をかいつまんでできることがないか？を考えていました。
　今回、5人程度のチームリーダーになったので、いくつかの要素を試してみました。

## 【やったこと①】アジャイルボードによる進捗管理
　もともとExcelを利用した進捗管理でしたが、管理方法の都合でいろいろな問題があった。
　・その日ごとの作業内容しか記載していないので、全体でどれくらい進んでいるのか不明確。
　・過去の作業内容を追いかけづらくて、過去の作業内容を聞かれたときに話せなくなってしまう。

　なので、私が試したのがクラウドツールの導入でした。幸い、MicrosoftOffice365のライセンス登録
　はされていたため、Microsoftツールに関しては利用することができたので（それ以外は使用禁止）
　Microsoft Plannerを利用することにしました。

　導入した結果は、一人用でタスク管理することには向いているのですが、複数チームで管理するには不向きだったため
　数ヶ月使用していましたが、やがて使わなくなってしまいました。

## 【やったこと②】 振り返りの実施
　チームか増えてきて、健全性や方向性が合っているかを確認するため、振り返りを定期的に実施していました。
　なんとなく感じているチームの不安とか、できるだけ続けて行きたいkeep事項などを、出してもらっていました。
　結果については一定の結果を出した
　
　出てきた内容を抜粋すると以下のような内容でした。

　ただし、後半忙しくなるにつれて、実施できる機会が減りました。
　WBSでもかなりタイトなスケジュールが組まれていたので、時間に余裕がなくなってしまったため、
　結果的にチーム内での実施は中止になりましたが、工程単位での振り返りは実施するようになりました。
　

## やったこと③】打ち合わせのあとの議事録作成と、認識合わせの時間を設ける。
　アジャイル開発では、スプリントの開始前にプランニングを実施しておりました。
　そこでは、作業内容で何をやる必要があるかをみんなで話しあい、その作業にどれくらい時間がかかるのかをポイントで出していました。
　ここでのポイントは、ファシリテータがタスクを話、周りの人が分からないことを発言していくことで、
　作業内容を具体的に理解することができることだと思います。

　ウォータフォールではプランニングがないので、私は会議に対して、その会議の議事録作成と
　記載した内容の認識合わせをしておりました。

　これの評価は最初はよかったです。振り返りでも良かったこととして出してもらっていたので、
　みんなで理解しながら進むということをする場合は、取り入れてよかったと思いました。
　一方、良くなかったのがのが、すべての打ち合わせ後に認識合わせをやっていたことです。

　後半になってくると設計書作成のスケジュールがタイトだったので、認識合わせをやるかやらないかは、
　チームで相談してやるようにしていました。

## まとめ
  ・人数の多いチームのプロジェクトでアジャイル開発みたいなクイックな動きをにするには、
  　とても時間が足りないと思いましたが、いい方向に動けた要素もあるので、今後も機会があれば
  　こういう活動をやってみたいです。
ilasmでstack machine その32

# 概要
ilasmでstack machineやってみた。
練習問題やってみた。

# 練習問題
ilasmでWindows.Formsを使え。

# 方針
- 窓のイベントを受ける。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/d97a9518-8047-3874-ac78-27da91724318.png)


# サンプルコード

```



.assembly extern System.Windows.Forms {
.publickeytoken = (B7 7A 5C 56 19 34 E0 89) .ver 2:0:0:0
}
.assembly extern mscorlib {
.publickeytoken = (B7 7A 5C 56 19 34 E0 89) .ver 2:0:0:0
}
.assembly extern System.Drawing {
.publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A) .ver 2:0:0:0
}
.assembly 'form1' {}
.class private auto ansi beforefieldinit form1 extends [System.Windows.Forms]System.Windows.Forms.Form {
.field private class [System.Windows.Forms]System.Windows.Forms.Button btnHello
	.method public hidebysig static void Main() cil managed {
	.entrypoint
		newobj instance void form1::.ctor()
		call void [System.Windows.Forms]System.Windows.Forms.Application::Run(class [System.Windows.Forms]System.Windows.Forms.Form)
		ret
	}
	.method public hidebysig specialname rtspecialname instance void .ctor() cil managed {
		ldarg.0
		call instance void [System.Windows.Forms]System.Windows.Forms.Form::.ctor()
		ldarg.0
		ldstr "form2"
		callvirt instance void [System.Windows.Forms]System.Windows.Forms.Control::set_Text(string)
		ldarg.0
		newobj instance void [System.Windows.Forms]System.Windows.Forms.Button::.ctor()
		stfld class [System.Windows.Forms]System.Windows.Forms.Button form1::btnHello
		ldarg.0
		ldfld class [System.Windows.Forms]System.Windows.Forms.Button form1::btnHello
		ldc.i4.s 50
		ldc.i4.s 50
		newobj instance void [System.Drawing]System.Drawing.Point::.ctor(int32, int32)
		callvirt instance void [System.Windows.Forms]System.Windows.Forms.Control::set_Location(valuetype [System.Drawing]System.Drawing.Point)
		ldarg.0
		ldfld class [System.Windows.Forms]System.Windows.Forms.Button form1::btnHello
		ldarg.0
		ldftn instance void form1::btnHello_Click(object, class [mscorlib]System.EventArgs)
		newobj instance void [mscorlib]System.EventHandler::.ctor(object, native int)
		callvirt instance void [System.Windows.Forms]System.Windows.Forms.Control::add_Click(class [mscorlib]System.EventHandler)
		ldarg.0
		ldfld class [System.Windows.Forms]System.Windows.Forms.Button form1::btnHello
		ldstr "Hello"
		callvirt instance void [System.Windows.Forms]System.Windows.Forms.Control::set_Text(string)
		ldarg.0
		call instance class [System.Windows.Forms]System.Windows.Forms.Control/ControlCollection [System.Windows.Forms]System.Windows.Forms.Control::get_Controls()
		ldarg.0
		ldfld class [System.Windows.Forms]System.Windows.Forms.Button form1::btnHello
		callvirt instance void [System.Windows.Forms]System.Windows.Forms.Control/ControlCollection::Add(class [System.Windows.Forms]System.Windows.Forms.Control)
		ret
	}
	.method private hidebysig instance void btnHello_Click(object sender, class [mscorlib]System.EventArgs e) cil managed {
		ldstr "Hello!!"
		call valuetype [System.Windows.Forms]System.Windows.Forms.DialogResult [System.Windows.Forms]System.Windows.Forms.MessageBox::Show(string)
		pop
		ret
	}
}








```

以上
ilasmでstack machine その31

# 概要
ilasmでstack machineやってみた。
練習問題やってみた。

# 練習問題
ilasmでWindows.Formsを使え。

# 方針
- 窓にボタンを作る。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/980c816d-0741-6c26-55d9-c829bbd715cf.png)


# サンプルコード

```

.assembly extern System.Windows.Forms {
	.publickeytoken = (B7 7A 5C 56 19 34 E0 89) .ver 2:0:0:0
}
.assembly extern mscorlib {
	.publickeytoken = (B7 7A 5C 56 19 34 E0 89) .ver 2:0:0:0
}
.assembly 'form1' {}
.class private auto ansi beforefieldinit form1 extends [System.Windows.Forms]System.Windows.Forms.Form {
.field private class [System.Windows.Forms]System.Windows.Forms.Button btnHello
	.method public hidebysig static void Main() cil managed {
		.entrypoint
		newobj instance void form1::.ctor()
		call void [System.Windows.Forms]System.Windows.Forms.Application::Run(class [System.Windows.Forms]System.Windows.Forms.Form)
		ret
	}
	.method public hidebysig specialname rtspecialname instance void .ctor() cil managed {
		ldarg.0
		call instance void [System.Windows.Forms]System.Windows.Forms.Form::.ctor()
		ldarg.0
		ldstr "form1"
		callvirt instance void [System.Windows.Forms]System.Windows.Forms.Control::set_Text(string)
		ldarg.0
		newobj instance void [System.Windows.Forms]System.Windows.Forms.Button::.ctor()
		stfld class [System.Windows.Forms]System.Windows.Forms.Button form1::btnHello
		ldarg.0
		ldfld class [System.Windows.Forms]System.Windows.Forms.Button form1::btnHello
		ldstr "Hello"
		callvirt instance void [System.Windows.Forms]System.Windows.Forms.Control::set_Text(string)
		ldarg.0
		call instance class [System.Windows.Forms]System.Windows.Forms.Control/ControlCollection [System.Windows.Forms]System.Windows.Forms.Control::get_Controls()
		ldarg.0
		ldfld class [System.Windows.Forms]System.Windows.Forms.Button form1::btnHello
		callvirt instance void [System.Windows.Forms]System.Windows.Forms.Control/ControlCollection::Add(class [System.Windows.Forms]System.Windows.Forms.Control)
		ret
	}
}






```

以上
ilasmでstack machine その30

# 概要
ilasmでstack machineやってみた。
練習問題やってみた。

# 練習問題
ilasmでWindows.Formsを使え。

# 方針
枠だけの窓を作る。


# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/7e192ff9-eb4a-d3c1-ee15-558b76538003.png)


# サンプルコード

```

.assembly extern System.Windows.Forms {
.publickeytoken = (B7 7A 5C 56 19 34 E0 89) .ver 2:0:0:0 
}
.assembly extern mscorlib { 
.publickeytoken = (B7 7A 5C 56 19 34 E0 89) .ver 2:0:0:0
}
.assembly 'form1' {}
.class private auto ansi beforefieldinit form1 extends [System.Windows.Forms] System.Windows.Forms.Form {
	.method public hidebysig static void Main() cil managed {
	.entrypoint
		newobj instance void form1::.ctor()
		call void [System.Windows.Forms] System.Windows.Forms.Application::Run(class [System.Windows.Forms]System.Windows.Forms.Form)
		ret
	}
	.method public hidebysig specialname rtspecialname instance void .ctor() cil managed {
		ldarg.0
		call instance void [System.Windows.Forms] System.Windows.Forms.Form::.ctor()
		ret
	}
}



```

以上
【TryHackMe】Burp Suite: Repeater：Walkthrough

# 概要

TryHackMe「Burp Suite: Repeater」のWalkthroughです。

https://tryhackme.com/r/room/burpsuiterepeater

# Task2

## **Q1**.*Which sections gives us a more intuitive control over our requests?*

**A**.**Inspector**

# Task3

## **Q1**.*Which view will populate when sending a request from the Proxy module to Repeater?*

**A**.**Request**

# Task4

## **Q1**.*Which option allows us to visualize the page as it would appear in a web browser?*

**A**.**Render**

# Task5

## **Q1**.*Which section in Inspector is specific to POST requests?*

**A**.**Body Parameters**

# Task6

## **Q1**.*What is the flag you receive?*

**Hint**.*Make sure you leave the two blank lines at the bottom of the request!*

`FlagAuthorised: True`ヘッダーを付与しルートページにリクエストを送信するとフラグを入手できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/24d109cb-7371-4c0a-4fe8-be00941334e2.png)

**A**.**THM{Yzg2MWI2ZDhlYzdlNGFiZTUzZTIzMzVi}**

# Task7

## **Q1**.*What is the flag you receive when you cause a 500 error in the endpoint?*

**Hint**.*The idea is to enter unexpected inputs to see how the server will react. For example, instead of a number, you could enter a piece of text or a symbol. Alternatively, you could try entering a number greater than the number of products available (e.g. 1000), or a number less than or equal to 0.*

`/products/-1`などの予期しない値を送信することで、500エラーが発生しフラグを入手できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/3d5a6620-b993-2048-67d4-798e11a52189.png)

**A**.**THM{N2MzMzFhMTA1MmZiYjA2YWQ4M2ZmMzhl}**

# Task8

## **Q1**.*What is the flag?*

`/about/0 UNION ALL SELECT notes,null,null,null,null FROM people WHERE id = 1`にリクエストを送信し、フラグを入手できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/91ff60d6-a2cb-1c12-856c-d8be570e335e.png)

**A**.**THM{ZGE3OTUyZGMyMzkwNjJmZjg3Mzk1NjJh}**
2024/11/6主にITとかセキュリティの記事

中国ハッカーがTP-Linkルーター1.6万台を乗っ取りMicrosoft Azureに大規模サイバー攻撃(11/4)
https://xenospectrum.com/chinese-hackers-take-over-16000-tp-link-routers-in-massive-cyber-attack-on-microsoft-azure/

あなたの会社は対応済？ 成りすまし迷惑メールを削減する「DMARCポリシー」(11/4)
https://ascii.jp/elem/000/004/232/4232423/?rss

バックアップは企業の生命線に　ベンダー各社は高まるニーズにどう応えるか(11/4)
https://www.weeklybcn.com/journal/feature/detail/20241104_206835.html

米国 NIST SP 1326 (初期公開ドラフト) NIST サイバーセキュリティ サプライチェーンリスクマネジメント： デューデリジェンス・アセスメント・クイックスタートガイド(11/4)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2024/11/post-50cc2a.html

バッドラビット(11/4)
https://cybersecurity-jp.com/security-words/105357

「”＞＜SCRIPT SRC=HTTPS：//MJT.XSS.HT＞ LTD」という名前の企業が強制的に社名を変更させられた事例(11/4)
https://gigazine.net/news/20241104-html-script-tag-business-name/

ロシア系ハッカーが遺伝研を脅迫 １５０万円要求、被害なく(11/4)
https://www.the-miyanichi.co.jp/news/National/2024110401000627.php

米国 NIST SP 800-161r1-upd1 システム及び組織におけるサプライチェーンのサイバーセキュリティリスクマネジメントのプラクティスの更新 (2024.11.01)(11/4)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2024/11/post-a3e482.html

存在に関わるリスクは消え去った、だが「無用」になるリスクがある(11/4)
https://www.coindeskjapan.com/259696/

個人情報が流出したら？流出時の対処法と防ぐためのポイントを確認しよう！
https://cybersecurity-park.com/3307/

EC2のプライベートサブネット移行手順をまとめてみた(11/4)
https://dev.classmethod.jp/articles/ec2-private-subnet-migration-procedure/

ロシア・中国・イランの選挙干渉加速、偽動画や陣営ハッキング…選挙後に暴動あおる可能性も(11/4)
https://news.yahoo.co.jp/articles/da972acffc68bfee19459b07f85813a7df3deae8
https://www.yomiuri.co.jp/world/uspresident/20241104-OYT1T50007/

モルドヴァ大統領選の決選投票、親EU派サンドゥ現大統領が勝利宣言　ロシアの干渉指摘される中(11/4)
https://www.bbc.com/japanese/articles/cgj78vd229jo

そういえばWeb3はどうなったのか(11/5)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/091900173/101600014/

ランサムウエア復号の可能性を探る・前編(11/5)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/111900071/101600060/

Wind Riverが新LinuxでCentOS後継に名乗り、OTの雄はITで成功できるか(11/5)
https://xtech.nikkei.com/atcl/nxt/column/18/00001/09916/

「T-Mobileが5G RedCap対応デバイス」など5本(11/5)
https://xtech.nikkei.com/atcl/nxt/column/18/02928/102900014/

基幹系のインフラが光り輝く日はもう来ないのか？　CTCとNSSOLのフェローが激白(11/5)
https://xtech.nikkei.com/atcl/nxt/column/18/02912/102800003/

日本郵船グループのMTIがランサムウエア被害、窃取された認証情報を悪用(11/5)
https://xtech.nikkei.com/atcl/nxt/column/18/00598/040500276/
WordPress コンテンツを使った生成 AI (RAG)チャットボットを簡単に作れるプラグインを開発した

WordPress のコンテンツを元に RAG を使った生成 AI チャットボットを簡単に作れるプラグインを開発したので、仕組みとかを簡単に説明します。

プラグインのソースやインストール方法などは、以下の GitHub レポジトリを参照してください。

[mobalab/wp-rag: A WordPress plugin for building RAG](https://github.com/mobalab/wp-rag)


## RAG とは

私の環境では検索するとこちらのサイトが一番上に出てくるので、ご存じない方はこちらをどうぞ。

[RAG | 用語解説 | 野村総合研究所(NRI)](https://www.nri.com/jp/knowledge/glossary/lst/alphabet/rag)

## 仕組み

### 構成

システムの大雑把な構成は以下の通りです。

WordPress plugin <-> バックエンド API <-> OpenAI API

各要素について簡単に説明します。

* WordPress plugin
  * PHP で書かれています（当たり前ですが）
  * 主な役割
    * チャットボット画面 UI の実装
    * 管理画面
* バックエンド API
  * Python で書かれています
  * Flask, LangChain などを使っています
  * ベクトルデータベースの機能も持たせています
  * 主な役割
    * WordPress 投稿の取得
    * ベクトルデータベースへの保管、検索
    * OpenAI API (Embeddings) を使って埋め込みの生成
    * OpenAI API (Text generation) を使って回答の生成
* OpenAI API
  * 主な役割: 埋め込みの生成と回答生成

### 処理の流れ

1. サイトの登録
    * プラグインの管理画面から登録ボタンを押す
    * API サーバーから WordPress サイトにアクセスが発生し、正しいレスポンスが返ってくればサイト登録完了
1. WordPress 投稿の取得
    * プラグインの管理画面からボタンを押す
    * API サーバーから WordPress の REST API にアクセスし、取得した投稿を API サーバーに保存
1. 埋め込みの取得・保存
    * プラグインの管理画面からボタンを押す
    * 取得・保存した投稿を OpenAI API に投げて埋め込み表現（embeddings）を取得
    * ベクトルデータベースに保存
1. チャットボットとのチャット
    * チャットボットウィンドウで質問文を入力して送信
    * API サーバーで以下の処理を行う
      * OpenAI API に投げて、質問文の埋め込み表現を取得
      * ベクトルデータベースで、質問文と似ている投稿を取得
      * 似ている投稿＋質問文を OpenAI API に投げる
      * 得られた回答をプラグイン側に返信する

## 動作例

「WP RAG とは何ですか。」という質問をした場合の回答です。Related info では、回答の生成に使われた投稿（コンテキスト）が表示されます。（スクリーンショットでは1つしか見えませんが、下の方が隠れているので、実際には4つ表示されています。）
![Screenshot 2024-11-05 at 21.13.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2139/81c2e3c5-e912-4498-013e-392efb6dd270.png)

## 改善したい点
### 全般

* 色々カスタマイズできるようにしたい。
  * 使う言語モデル
  * プロンプト
  * 各種パラメータ

### 検索関連

* WordPress のタグとかのメタ情報も使う
* 全文検索と組み合わせる

### プラグイン

* 新規投稿や既存投稿の更新時に自動的に埋め込み表現を生成してベクトルデータベースに保存する
* 見栄えをもう少し良くする
* L10n

## その他

* WordPress の管理画面からプラグインをインストールできるようにしたかったが、今回みたいに外部 API に依存しているものはダメらしい。
* 思ったより簡単に実装できた。
* RAG はチューニングのポイントがいっぱいあるし、新しい手法が色々出てくるので、もっと勉強したい。
auth0のライブラリ「Lock」の特徴、6選

Auth0の「Lock」は、Auth0が提供する認証ライブラリで、ユーザー認証のための組み込み可能なログインフォームを提供します。Lockを使用することで、Webアプリケーションやモバイルアプリにシンプルかつ機能的なログインUIを迅速に組み込むことができます。

### Lockの特徴

1. **使いやすいUI**: Lockは、視覚的に洗練されたログインフォームを簡単に実装できるため、ユーザーにとって使いやすい体験を提供します。
2. **カスタマイズ可能**: フォームの外観や機能をプロジェクトの要件に合わせてカスタマイズでき、ブランドカラーやロゴを組み込むことが可能です。
3. **多様な認証方法のサポート**:
   - **パスワード認証**: ユーザー名とパスワードを使用した標準的なログイン。
   - **ソーシャルログイン**: Google、Facebook、Twitterなどのサードパーティ認証プロバイダーを通じた認証。
   - **多要素認証(MFA)**: セキュリティを高めるためのMFAのオプションも統合可能です。
4. **セキュリティ**: Auth0 Lockは最新のセキュリティ基準に基づいて設計されており、開発者がセキュアなログインシステムを構築しやすくします。
5. **シングルサインオン(SSO)**: LockはAuth0のSSO機能と連携し、複数のアプリケーション間でユーザーが一度のログインでアクセスできるようにします。
6. **多言語対応**: Lockは多言語に対応しており、国際的なアプリケーションで使用する際に役立ちます。

### 利用シナリオ

- **迅速なプロトタイピング**: 短期間でアプリケーションにログインフォームを追加したい場合、Lockを使うと便利です。
- **小規模〜中規模アプリ**: 標準的な認証機能が必要で、カスタマイズ性もほどほどで良い場合に適しています。
- **初期導入**: Auth0のエコシステムに初めて触れる開発者が、スムーズに認証システムを実装するためのツールとして役立ちます。

LockはJavaScriptベースで、Webアプリケーションに容易に統合できるため、Auth0のインフラを活用してセキュリティやスケーラビリティを向上させたい開発者にとって有用なライブラリです。
【Laravel】【MySQL8】外部キー制約名が長くて怒られた話

外部キー制約名について、個人的に勉強になったので忘備録がてら投稿します💻

---
### やりたいこと
`hogehoge_fugafuga_piyopiyo_hogerahogera` テーブルを作成するとき、
`foo_bar_foo_bar` テーブルのidを外部キーとして持たせたい。
```php
Schema::create('hogehoge_fugafuga_piyopiyo_hogerahogera', function (Blueprint $table) {
    $table->id();

    $table->foreignId('foo_bar_foo_bar_id')
        ->constrained()
});
```

### マイグレートする
マイグレートしたらSQLエラー発生
なにやら名前が長いらしい..
```bash
SQLSTATE[42000]: Syntax error or access violation: 1059 Identifier name 'hogehoge_fugafuga_piyopiyo_hogerahogera_foo_bar_foo_bar_id_foreign' is too long
```

調べてみるとMySQLで作成できる制約名は64文字がMAXみたい。
テーブル名も最大64文字とのこと。
![スクリーンショット 2024-11-06 1.51.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/752214/a1b8f642-53d1-a1a6-dfbf-fc0323e41140.png)

https://dev.mysql.com/doc/refman/8.0/ja/identifier-length.html

:::note warn
外部キーを作成するとき、Laravelはよしなに「テーブル名」と「外部キーとなるカラム名」を結合して外部キー制約名を命名しにいくので、長めになってしまう時があるよ！
:::

```plaintext
`hogehoge_fugafuga_piyopiyo_hogerahogera` + `foo_bar_foo_bar_id` + `_foreign` = 65文字
```
---
### 結論
`index()`で、64文字以内の好きな名前をつける。
```php
Schema::create('hogehoge_fugafuga_piyopiyo_hogerahogera', function (Blueprint $table) {
    $table->id();

    $table->foreignId('foo_bar_foo_bar_id')
        ->constrained()
        ->index('hogehoge_fugafuga_piyopiyo_hogerahogera_foo_bar_foo_bar_id_fk');
});
```

マイグレートが通り、index_nameがちゃんとつく（DBクライアントツールで確認）
![スクリーンショット 2024-11-01 13.40.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/752214/e55ddf3e-ca5e-1733-8e06-e8ea6344c66a.png)

ちなみに、`index()`はカラム修飾子だと思ってたので`constrained()`の前に書いてみましたが、これだと正しく動いてくれません。なぜ...？（有識者の方教えてください🙇）

```php
Schema::create('hogehoge_fugafuga_piyopiyo_hogerahogera', function (Blueprint $table) {
  $table->id();

	$table->foreignId('foo_bar_foo_bar_id')
        ->index('hogehoge_fugafuga_piyopiyo_hogerahogera_foo_bar_foo_bar_id_fk')
	    ->constrained()
});
```

---
### 備考
`foreign`の第二引数に名前を渡せそうかも。
ですが、Laravelさん曰くこれは冗長な書き方らしいです。
```php
Schema::create('hogehoge_fugafuga_piyopiyo_hogerahogera', function (Blueprint $table) {
    $table->unsignedBigInteger('foo_bar_foo_bar_id');
    $table->foreign('foo_bar_foo_bar_id', 'hogehoge_fugafuga_piyopiyo_hogerahogera_foo_bar_foo_bar_id_fk')
	    ->references('id')
	    ->on('foo_bar_foo_bar');
});
```
https://readouble.com/laravel/9.x/ja/migrations.html#:~:text=%E3%82%92%E5%89%8A%E9%99%A4%0A%7D)%3B-,%E5%A4%96%E9%83%A8%E3%82%AD%E3%83%BC%E5%88%B6%E7%B4%84,-Laravel%E3%81%AF%E3%80%81%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9
Auth.jsで認証機能を実装するメリット6選

Auth.jsで認証機能を実装することには、Auth0と比べて以下のようなメリットがあります。

### 1. **カスタマイズ性と柔軟性**

- **カスタマイズ性**: Auth.jsはコードレベルでのカスタマイズがしやすいため、特定の要件に応じた細かな認証フローやUIを自由に設計できます。Auth0は、提供されるUIや設定の範囲内でのカスタマイズに制限があります。
- **フレキシブルな統合**: Auth.jsは、他のツールやライブラリとの統合が比較的容易で、シンプルな認証システムから複雑なシングルサインオン(SSO)まで対応可能です。

### 2. **オープンソースとコミュニティ主導**

- **オープンソース**: Auth.jsはオープンソースプロジェクトとして無料で利用可能です。これにより、ソースコードを直接参照・修正できるため、特定のニーズに合わせたカスタマイズが可能です。
- **コスト削減**: Auth0は無料プランもありますが、ユーザー数や機能に応じて費用が発生する場合があります。Auth.jsを使うことで、認証機能のコストを削減できる場合があります。

### 3. **フルスタックの統合が簡単**

- **シームレスなバックエンド統合**: Auth.jsは、バックエンドフレームワーク（Next.js、Express.jsなど）とスムーズに統合できるため、フルスタック開発者にとって扱いやすい選択肢です。
- **柔軟なデータベース管理**: 自前のデータベースを使用した認証やセッション管理を容易に構築できます。Auth0は外部サービスとして動作するため、データの管理が外部依存となります。

### 4. **シンプルな導入と軽量性**

- **軽量でシンプル**: Auth.jsは、プロジェクトに組み込む際に非常にシンプルで、外部依存が少なく、比較的軽量です。これにより、独自の認証システムをゼロから構築したい開発者にとって適しています。
- **迅速な開発**: Auth.jsは必要最低限の設定で導入できるため、小規模から中規模のプロジェクトにおいて、素早く認証機能を実装できます。

### 5. **プライバシーとデータ制御**

- **データの制御**: Auth.jsを使用する場合、ユーザーデータや認証の管理を自分のサーバー上で行うため、データの制御がしやすくなります。Auth0はクラウド上での管理が前提となるため、特定の業界要件（GDPR、HIPAAなど）によってはデータの所在や管理に注意が必要です。

### 6. **簡単なローカル開発**

- **ローカル環境での開発が容易**: Auth.jsはローカルで開発・テストを行う際に簡単にセットアップでき、外部サービスを使用せずにテストが行えます。Auth0は外部サービスに依存するため、オフライン開発には工夫が必要です。

これらの特徴から、Auth.jsは、柔軟で高度なカスタマイズを求める開発者や、コスト管理を重視するプロジェクト、プライバシーに関してより厳しい要件を持つプロジェクトに適した選択肢です。
Ubuntu24.04でのROS2セットアップ

## 環境
RasberryPi 400(キーボード内蔵型のRasberryPi4)
Ubuntu24.04 Desktop

## インストール
基本[公式ページ](https://docs.ros.org/en/jazzy/Installation/Ubuntu-Install-Debs.html)通りにやれば問題なかった。

##### ロケールの設定
日本語に設定していたが、UTF-8をサポートしていることがインストールの条件となっていたため問題ないと判断しスキップ

##### パッケージのインストールとリポジトリの追加
```
sudo apt install software-properties-common
sudo add-apt-repository universe
```


##### ROS2リポジトリの暗号鍵を取得し、リポジトリを追加
```
sudo apt update && sudo apt install curl -y
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg 
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
```
##### 開発ツールのインストール
ROSのパッケージをビルドするcolcon(ROS1でのcatkin的な)が含まれるらしいのでインストール
```
sudo apt update && sudo apt install ros-dev-tools
```
##### ROS2のインストール
```
sudo apt update
sudo apt upgrade
sudo apt install ros-jazzy-desktop
```
##### ROS2への環境変数をbashに追加
ROS2を使う度にROS2へのパスを通すのは大変なので、bashに追加してしまう。
追加後は一度bashを再読み込みしているが、もちろんターミナルを開き直しても良い。
```
cd 
echo "source /opt/ros/jazzy/setup.bash" >> ~/.bashrc
source ~/.bashrc
```
##### 全体の依存関係の確認と初期セットアップ
rosdepを使って依存関係を確認しておく。多分開発ツール内に含まれているため、rosdep自体のインストールは済んでいるはず。
rosdepは公式外のリポジトリにあるパッケージをインストールする際に活用すると、依存関係にあるパッケージを自動でインストールしてくれる優れもの。
インストール時の一度のみ`sudo`で実行する必要があるが、それ以降は`sudo`をつけなくても良い。間違ってつけてしまうとセキュリティ上問題があるので、`sudo rosdep fix-permissions`を使って修正する。
[参考記事](https://qiita.com/strv/items/ccd89c55957bd8dfada0)
```
sudo rosdep init 
rosdep update
```
##### ワークスペースのセットアップ
ROS1でcatkinを使ったように、ROS2ではcolconを使ってビルドする。
この辺はROS1とほぼ同じ
まず適当にワークスペースとなるディレクトリを作成し、中に`src`のディレクトリを作る。
```
cd
mkdir -p colcon_ws/src
cd colcon_ws
colcon build
```
`colcon_ws`内にビルド後のディレクトリが増えていることが確認できる。

##### ワークスペースへのパスを通す
このままだとcolcon_ws内のパッケージを実行する際に、毎回colcon_wsへのパスを通さなければならない。bashrcに書いておくことでターミナルを開く時に自動でパスが通るようにしておく。
```
echo "source $HOME/colcon_ws/install/setup.bash" >> ~/.bashrc
```
`.bashrc`にsourceの一文が追加されていることが確認できる

## まとめ
インストールにつまづくかもしれないと思い、この記事を書きながらインストールを行ったが、あまりにもあっさり終わってしまった。
他の方の記事や公式のページ通りにしか作業していない。
そのうちROS2の解説記事やプログラムのテンプレート記事なども作ろうと思う。