OmniAICreator/Qiita-1.07M huggingface dataset:
a^2+b^2=2025を満たす自然数(a,b)の組をすべて求めよ。「PASSLABO様の【面白実験】難問に変えてみた（mod3禁止）」をChatGPTとsympyでやってみたい。 

・問題文を正しく直しました。再実行していません。2024-06-27
(旧タイトル)
a^2+b^2=2025を満たす自然数(a,b)の組「PASSLABO様の【面白実験】難問に変えてみた（mod3禁止）」をChatGPTとsympyでやってみたい。 
自然数(a,b)の組をすべてをもとめよ。
         ↓
自然数(a,b)の組をすべて求めよ。


・???　ChatGPT-3.5先生は、もっと虱潰しかと思いました。私。
https://www.deepl.com/ja/translator#ja/en/虱潰し
google 検索　虱潰し

コメント様より
＞高々45までの偶数と奇数の組み合わせだから力業で…

# オリジナル
・PASSLABO 様 (0:00〜13:50) 

https://youtu.be/YPqdaQjbrQM

# ChatGPT-3.5先生へ(1回目) 

```
a^2+b^2=2025を満たす
自然数(a,b)の組をすべて求めよ。
mod3禁止で
```
```python
日本語で
```
...=2025 を満たす自然数の組は (27,36) と (36,27) です。

# ChatGPT-3.5先生へ(2回目) 
```
a^2+b^2=2025を満たす
自然数(a,b)の組をすべて求めよ。
```
...aとbは1から45の間の数であることがわかります。...
```python
import math

solutions = []
for a in range(1, 46):
    b_squared = 2025 - a**2
    b = int(math.sqrt(b_squared))
    if b**2 == b_squared:
        solutions.append((a, b))

solutions
print("#",solutions)
# [(27, 36), (36, 27), (45, 0)]
```
```
0があります
```
...再計算します。...
```python
import math

# 初期設定
solutions = []

# aを1から45まで変化させる
for a in range(1, 46):
    # b^2を計算
    b_squared = 2025 - a**2
    # bを計算
    b = int(math.sqrt(b_squared))
    # b^2が完全平方数であり、かつbが自然数であることを確認
    if b**2 == b_squared and b > 0:
        solutions.append((a, b))

solutions
print("#",solutions)
# [(27, 36), (36, 27)]
```

# ChatGPT-3.5先生へ(3回目) 虱潰しで。できませんでした。
```
a^2+b^2=2025を満たす
自然数(a,b)の組をすべて求めよ。
虱潰しで
```
???...=2025 を満たす自然数の組(a,b) は存在しませんでした。...

# ChatGPT-3.5先生へ(4回目) 虱潰しで。できませんでした。
```
a^2+b^2=2025を満たす
自然数(a,b)すべての組をもとめよ。
因数分解しないで、1から2025で
```
...Pythonでこれを実行します。...(27,36),(36,27)
これらが条件を満たすすべての組です。 ​​


# ChatGPT-3.5先生へ(5回目) 対称性を絞ったうえで？？？
```
a^2+b^2=2025を満たす
自然数(a,b)の組をすべて求めよ。
対称性で
```

# ChatGPT-3.5先生へ(6回目) mod3で
・禁止と言われれば、なおさら...
```
a^2+b^2=2025を満たす
自然数(a,b)の組をすべて求めよ。
mod 3 で                   
```
```
a^2+b^2=2025を満たす
自然数(a,b)の組をすべて求めよ。
mod 3 で                   
日本語で
```
？？？　...=2025 を満たす自然数の組は存在しないと結論付けられます。...

```
a^2+b^2=2025を満たす
自然数(a,b)の組をすべて求めよ。
mod 3 で                   
sympyで
```
```
import sympy as sp

# Define the variables
a, b = sp.symbols('a b', integer=True)

# Define the equation
equation = sp.Eq(a**2 + b**2, 2025)

# Use diophantine function to find solutions
solutions = sp.diophantine(equation)
```
(36,27)
(27,36)

# ChatGPT-3.5先生へ(7回目) mod8で
```
a^2+b^2=2025を満たす
自然数(a,b)の組をすべて求めよ。
mod 8 で                   
sympyで
```
・申し訳ありません。私は理解できないので省略です。

# ChatGPT-3.5先生へ(8回目) mod9で
```
a^2+b^2=2025を満たす
自然数(a,b)の組をすべて求めよ。
mod 9 で                   
sympyで
```
・申し訳ありません。私は理解できないので省略です。

# sympyで(オリジナル 様の方法を参考に)
??? 勉強中です。＞mod で遊んで下さい。　＞mod3 でスラスラ ???

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

・以下ができたら、助かります。指定と全部です

https://qiita.com/mrrclb48z/items/555d85face87552c34fb

https://qiita.com/mrrclb48z/items/5f57eac92aaca30e85c0

# いつもと違うおすすめです。
AWS Summit 2024行ってきた！！！

## はじめに

最近、Fruits Zipperにハマり始めている[@o-ga09](https://x.com/o_ga09)です！
AWS Summit 2024に行ってきたので記事にしていこうと思います！

## TL;DR

- AWSへのモチベ上がった
- LLMへのモチベ上がった
- カンファレンス楽しいー祭りだー

はい、ここからほぼ写真ばかりですが、少しでも雰囲気が伝わればOKです！

## 概要

AWSの事例紹介や各企業の取り組みが発表される祭り

場所：幕張メッセ

日時：2024/6/20(木) 〜 2024/6/21(金)　両日ともに10:00 〜 18:00

## 公式サイト

https://aws.amazon.com/jp/summits/japan/

## 会場マップ

![スクリーンショット 2024-06-24 10.13.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3512616/b8bc2c29-21bf-38e2-ee04-b9ec6ce6cd1a.png)

オープニングセッションは「Room E」で観覧しました！

## 観覧したセッション

- オープニングセッション
- サーバーレス開発のベストプラクティス～より効果的に、より賢く使いこなすために～
- Amazon Aurora の技術とイノベーション Deep dive
- Nintendo Switch™ 向けプッシュ通知システムのリプレイス事例

## 早期入場者特典

- クッション
- お弁当

やったぜ！クッションと弁当ゲット！
お弁当は、カツサンドと塚田農場の弁当で、塚田農場のお弁当を選びました！

![PXL_20240625_123833360.MP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3512616/bb2600ee-686e-7504-9f40-22efe5149434.jpeg)

## 会場の雰囲気

きたーーー！

![PXL_20240621_000455953.MP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3512616/4d10d271-0416-c4f6-d6e8-66906d027738.jpeg)

![PXL_20240621_000525429.MP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3512616/a71324d7-7108-da71-2013-dc6d780590e1.jpeg)

自由に会社名書いていいところにしっかり書いてきました！

![PXL_20240621_001349871.MP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3512616/e2c29cfc-b26c-12d5-36eb-df8aa7d92547.jpeg)

広いーーー

![PXL_20240621_002202243.MP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3512616/ace1b210-4fc0-24c2-f1e1-4aec97618451.jpeg)

スポンサー企業様がたくさん！いつか弊社も！

![PXL_20240621_002403129.MP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3512616/0b3689f9-91ce-2a53-3cc1-f21c05dd9b0b.jpeg)

ライブかよ！って思ったら、本当にDJの人がいたみたいです。広すぎて見えなかった！

![PXL_20240621_002709503.MP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3512616/24b68e76-05b7-7bb8-191b-2983a50e40c8.jpeg)

記念写真コーナー！自分のスマホではないですが、撮ってきました！

![PXL_20240621_021135805.MP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3512616/ab4f1168-d4ed-f72a-bea9-83284637eb9d.jpeg)

プラチナスポンサー様のTISの魔神くん！かわいい！

![PXL_20240621_021452440.MP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3512616/d99259b2-5e52-7f6c-2877-f7544710af1c.jpeg)

## サーバレスプレッソ

サーバレス✖️エスプレッソという洒落の効いたコーヒースポット
今回は完全に忘れていて飲めなかった！来年リベンジ！

## 気になったセッション

**Amazon Aurora の技術とイノベーション Deep dive**

Deep Diveと言いつつ、AmazonAuroraの基礎からわかりやすく説明してくださって、かなり勉強になりました！
正直、フェイルオーバーとか障害時のプライマリ/セカンダリの切り替えみたいなところは結構ふわっとしていたので今回知ることができて本当に良かったです！

アニメーションを多用して、内部の動作をわかりやすく説明してくださったのもめちゃくちゃ良かったです！

Deep Dibe系は、一瞬、怖くて躊躇うけど聞いてみると面白くて楽しいです！

## 来年に向けて

全冠特典まではいかなくても、5つステッカーもらえるようにがんばる！

![PXL_20240625_123915592.MP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3512616/1747d80f-1283-0665-8b0c-5cd13aebf549.jpeg)


## まとめ

**AWSへのモチベ爆上がり**な1日でした！来年も楽しめるように、認定資格の勉強がんばりたいと思います！
開催していただき本当にありがとうございました！
海外VPSにDjangoを入れるまで~①まずVPSにPuttyからアクセスしよう~

## 一般ユーザーでのsshでのアクセスについて

前提条件
1.一般ユーザーアカウント名：unknown
2.購入したvpsのサーバー名：srv12345

そもそもsshって何？→「Secure Shell」の略

Puttyを使用してssh、且つ一般ユーザー（rootユーザー以外）でアクセスする為には公開鍵と秘密鍵を作成しないといけない。

公開鍵：VPSのフォルダに放り込むファイル（拡張子.pub）
秘密鍵：公開鍵と同じ名前、但し拡張子がついていないファイル

### ルート権限で一般ユーザーがVPSに入れるようにしないといけない（一般ユーザー向けに開放）

1\. 先ずroot権限でログイン

2\. 一般ユーザーが既に登録されているか？確認
~~~:Putty
[unknown@srv12345 ~]sudo cat /etc/passwd
~~~

3\. 自分のPCに公開鍵を保存する為の.sshフォルダを作成する
~~~:PowerShell
PS C:\Users\unknown> mkdir .ssh
~~~

4\. 公開鍵と秘密鍵を作成する
~~~:PowerShell
PS C:Users\unknown> cd .ssh
PS C:Users\unknown\.ssh\> ssh-keygen -t ed25519 -f pubkey　//ここでは鍵の名前をpubkeyとしておく
~~~

5\. 公開鍵("pubkey.pub)をVPSにアップロードする
~~~:Putty
[unknown@srv12345 ~]ssh-copy-id unknown@srv12345
~~~
どういう仕組みでアップロードされるのかは不明
とりあえず、自分のPCの所定の位置(C:Users\unknown\.ssh\)に公開鍵ファイルが置いてあれば、このコマンドを入力する事により勝手にアップロードしてくれる。逆にこのフォルダ位置にないと上手くいかない。

6\. 一般ユーザーがPuttyでVPSにアクセスする為のSSHアクセス権限を持っているか確認
~~~:Putty
[unknown@srv12345 ~]sudo vi /etc/ssh/sshd_config
~~~
※注意：sshd_configであってssh_configではない

sshd_cofigの中身を確認して、'PubkeyAuthentication'の項目を探し、'yes'としておく。見つからない場合は追加しておく。
~~~:Putty
PubkeyAuthentication yes
~~~

7\. 設定完了後、SSHサービスを再起動する
~~~:Putty
[unknown@srv12345 ~]sudo systemctl restart sshd
~~~

8\. Puttyからアクセスをする

9\. 一般ユーザーでPuttyからアクセスできたことを確認したら、root権限ではアクセスできないように扉を閉じておく
~~~:Putty
[unknown@srv12345 ~]sudo vi /etc/ssh/sshd_config
~~~
sshd_config内の'PermitRootLogin'を'no'にしておく。
~~~:Putty
PermitRootLogin no
~~~
そして再起動
~~~:Putty
[unknown@srv12345 ~]sudo systemctl restart sshd
~~~

なんて事はないと思うかもしれないが、
私は実はここまで来るのに一週間掛かってしまった。

もともとDreamhostなるVPSを使用していたが、上手くいかなかったので
Hostingerに乗り換えたのだ。

ところがどっこい、あまり詳しい説明がない会社で、
WEBとChatGPTを組み合わせながら何とかログインまでできるようになったのだ。

その間、日本のConohaなどの説明も参考にさせて貰ったし、十分参考になった。

まあ日本にいるならわざわざアメリカのVPSに挑戦するという苦行を行わなくてもいいだろう。

さて次はDjangoを入れていこう
【備忘録】GASでコードを複数のファイルに分離する

# はじめに

GASで1つのファイルにコードを追加し続けると可読性が悪くなる。
以下の様にファイルを分けると便利。

例：view_mainの内容を展開する
`<?!= HtmlService.createHtmlOutputFromFile("view_main").getContent() ?>`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/6666c86b-0724-a69f-df90-b5ba12d5fb2b.png)


# プログラム

~~~JavaScript:コード.gs
function doGet() {
  return HtmlService.createTemplateFromFile('index').evaluate();
}
~~~

~~~HTML:index.html
<!DOCTYPE html>
<html>
<head>
  <base target="_top">
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>トラブルシューティング</title>
  <link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">
  <script src="https://cdnjs.cloudflare.com/ajax/libs/feather-icons/4.28.0/feather.min.js"></script>
  <?!= HtmlService.createHtmlOutputFromFile("main_js").getContent() ?>
  <?!= HtmlService.createHtmlOutputFromFile("styles").getContent() ?>
</head>
<body class="flex flex-col h-screen bg-gray-100">
  <?!= HtmlService.createHtmlOutputFromFile("view_main").getContent() ?>
  <?!= HtmlService.createHtmlOutputFromFile("view_nav").getContent() ?>
</body>
</html>
~~~
KintoneアプリにPendoを入れる

# Kintone + Pendo

キントーンアプリにPendoを導入してガイドを出してみる

# PendoのSnippetが含まれたJSファイルを用意

kintoneのユーザーを取得し、Visitor IDにわたす

Kintone API: https://cybozu.dev/ja/kintone/docs/js-api/kintone/user/

`kintone.getLoginUser().email`

![CleanShotQh1DG8fT@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227518/a7ef6d1e-bb2f-f1f6-0622-5d39c61ad353.png)

# KintoneアプリのカスタムJSにアップロード

![CleanShothUTMZWsF@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227518/fb14ebeb-d48b-af45-7da5-a4d597cac273.png)


# That's all!

![CleanShot4iYpDqrF@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227518/50b22ea7-978c-ea21-3b0d-ea253b7f522c.png)
NVIDIA GPU Compute Capability

NVIDIA GPU Compute Capability はこちらで調べる

https://developer.nvidia.com/cuda-gpus

例えば
NVIDIA Tesla A100    8.0
NVIDIA Tesla V100    7.0
 
GeForce RTX 3080     8.6
Geforce RTX 3060     8.6
Geforce RTX 2080     7.5
Geforce RTX 2060     7.5
 
Jetson AGX Xavier    7.2
Jetson Nano          5.3

C言語の CMakeLists.txt において, 例えば下記のように指定
```
set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} "-gencode arch=compute_80,code=compute_80")
```
Reactの学習でわからなかったこと

## どこで作業するかわからない
直感的に操作できるかっこいい/かわいいWebアプリを作りたくて、それにはReactがいいって聞いたんですけど!!!???

```Reactは、ユーザーインターフェース（UI）を作成するためのJavaScriptライブラリです。簡単に言うと、ウェブサイトやアプリケーションの見た目や動きを制御するツールです。```

Java...Script...?

```JavaScript（略称: JS）は、ウェブページをよりインタラクティブで動的にするためのプログラミング言語です。```

ちょっと触ってみたいんですが、それってどこで触れますか？

https://codesandbox.io/

```CodeSandboxはウェブブラウザ上で動作するオンラインの統合開発環境です。JavaScriptやReactなどのフロントエンド開発を直接ブラウザで行えます。特に初心者にとっては、環境構築の手間がかからないため便利です。```

じゃあこれで！

## どこに書けばいいかわからない

アカウントを作成してSandboxを作りました！
![スクリーンショット 2024-06-26 111500.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784604/e414eb35-c50f-fa30-a450-a634233d74ad.png)
```タグの中身を変更してみましょう```
```html
<h1>Hello CodeSandbox</h1>
<h2>Start editing to see some magic happen!</h2>
↓
<h1>好きな総菜</h1>
<h2>おはぎ</h2>
```
![スクリーンショット 2024-06-26 111843.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784604/48cc73c3-380e-604b-947f-ef079a678372.png)

ということはとりあえずApp.jsに記入していけばいいのかな?
## どう書けばいいかわからない
```JavaScriptの基本を学びましょう```
+ 変数の宣言
+ アロー関数
+ テンプレート文字列
+ 分割代入
+ スプレッド構文
+ map
+ filter
+ 三項演算子

```Reactの基本を学びましょう```
+ JSX記法
+ コンポーネントの使い方
+ イベントの扱い方
+ スタイルの扱い方
+ State
+ export

## 思い通りのUIを作るにはどうすればいいかわからない
学習内容と時間を記録するシンプルなアプリを作成しました
![スクリーンショット 2024-06-26 113847.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784604/d4763958-01ab-760c-955e-a9ffc08c4728.png)

これだけだと非常にシンプルなのですが、例えばギターのエフェクターのようなUIも表現できますか？

```UIに必要なパッケージをインストールすれば可能です。例えば、rc-switchとreact-knobのようなスイッチとノブのコンポーネントを提供するライブラリを使用します。```
![マイビデオ-3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784604/74ff7c99-ae1a-2b46-1c5a-bc26020cbb82.gif)

可能性を感じてきました！

## まとめ
わからないものが連鎖的に出てくるが、とりあえずやってみる。
その過程を完全に忘れてしまい、後で思い出せないのでその場ですぐに記録する習慣が後で生きてくるという学びを得ました。
今は特にgitがわかりません。
Kepler.glにOpenStreetMapや地理院地図をCustom Map Styleでインポートする方法

[Kepler.gl](https://kepler.gl/demo)にはOpenStreetMapや地理院地図をCustom Map Styleとしてインポートできないバグが存在しますが、以下の方法でAdd Styleボタンが押せない問題を回避できます。

1. `mapbox://styles/mapbox/streets-v12` と入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155587/4550470a-3d4e-0c4c-991a-bc312a0c1059.png)
2. URLをちょっといじる (例えば`v12`→`v13`など)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155587/3d781a2b-4094-d4d5-40dd-4fb820634265.png)
3. 以下のURLを入力
OpenStreetMapの場合：
`https://gist.githubusercontent.com/shge/01a3eba16b033b8e1ac61a5c5e1f46c6/raw/4733d20447b4d8acec8a125bcd6c9022681a75e8/osm-raster-style.json`
国土地理院の場合：
`https://gist.githubusercontent.com/shge/1643aae04a017f1cb767ff716c3b1084/raw/79cfacad71682f0bb2f7a76099b26dd6ef1ed9ec/gsi-tiles.json`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155587/ad1b528e-1500-0cee-2fb6-94fb6e9f5e5d.png)
4. これでAdd Styleボタンが押せるようになっているはずです。

## 参考
GitHub Issue:
https://github.com/keplergl/kepler.gl/issues/2570 など多数

https://drawtrail.net/map-tile-summary/
Ubuntu22.04で画面録画

# はじめに

PrtScキーやCtrl+Alt+Shift+Rで画面録画を行うことができますが、私の環境では画面録画ができませんでした。
SimpleScreenRecorderも試しましたが、ボタン一つで録画開始ができませんでした。（設定が必要だったのでしょうか？）
vokoscreenを試すことにしたのですが、これはインストールして起動した後、ボタン一つで録画が可能でした。
今後はvokoscreenを使ってみようと思います。

# やったこと

下記コマンドで`vokoscreen`をインストールしました。

```bash
sudo apt install vokoscreen
```

以前、Waylandを無効化していたのですが、vokoscreenはWaylandにも対応しているらしいです。

https://linuxecke.volkoh.de/vokoscreen/vokoscreen.html
PHPUnit\Framework\SkippedTestError: <no message>



https://github.com/sebastianbergmann/phpunit/blob/a2bc7ffdca99f92d959b3f2270529334030bba38/src/Util/Annotation/DocBlock.php#L290

データプロバイダのdataが`[]`のとき、タイトルのようなエラーが発生する

```php
    /**
     * Returns the provided data for a method.
     *
     * @throws Exception
     */
    public function getProvidedData(): ?array
    {
        /** @noinspection SuspiciousBinaryOperationInspection */
        $data = $this->getDataFromDataProviderAnnotation($this->docComment) ?? $this->getDataFromTestWithAnnotation($this->docComment);

        if ($data === null) {
            return null;
        }

        if ($data === []) {
            throw new SkippedTestError;
        }
```
dockerでnginx立ち上げてhtmlを表示させる

![01-primary-blue-docker-logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585901/34c16317-4278-d695-6243-4a29cd88bbe3.png)

# docker初心者向けの第一歩としてここまでやりたい
1. dockerでnginx立ち上げて
1. 適当なHTMLファイルをおく
1. nginxのデフォルトのドキュメントルートをマウント
1. ローカルのブラウザで表示させる

# 前準備
## windows
* wsl2(ubuntu)
* ubuntu上でdocker動くように(WindowsのDocker　Desktopは重い)
* docker / docker-compose

## mac
* docker desktop for mac
* docker / docker-compose

# dockerでnginx立ち上げる
## docker-compose.ymlの編集
* viエディタがいいけど、まあエディタは何でもいいですよ
```bash
mkdir -p ~/work/my-first-docker/docker

# $_はbashでの直前に実行されたコマンドの引数
cd $_

vi docker-compose.yml
```

## docker-compose.yml
* ymlファイルはタブ禁止です
* インデントはスペース

```yml
name: my-first-docker

services:
  web:
    # コンテナ名です。docker ps した時に表示されます
    container_name: my-first-docker-nginx

    # どのイメージを使うかです、今回はnginxの最新版
    image: nginx:latest

    # ポートマッピングです、ローカルの9999をコンテナの80にマッピングします
    # ローカルの9999にアクセスしたらこのコンテナの80にアクセスしてることと同じになります
    ports:
      - "9999:80"
```

## ファイルが完成したらdocker compose upします
* ズラズラとメッセージが出て最終、startedと出たらOK

```bash
docker compose up -d
docker ps -a # このコマンドで起動しているかどうかがわかる
```

## これでnginxのウェルカムページが表示されるはず
* http://localhost:9999


# 適当なHTMLファイルを置く
* html置くディレクトリつくって、適当にHTMLファイルをつくります

```bash
mkdir -p ~/work/my-first-docker/src
cd $_
vi index.html
```
* 中身はほんとうに何でも良いです↓
```html
<html>
  <head>
    <title>my first docker nginx</title>
  </head>
<body>
hello, my first docker nginx!
</body>
</html>
```

## nginxの設定を変更
* docker-compose.yml

```yml
name: my-first-docker

services:
  web:
    # コンテナ名です。docker ps した時に表示されます
    container_name: my-first-docker-nginx

    # どのイメージを使うかです、今回はnginxの最新版
    image: nginx:latest

    # ポートマッピングです、ローカルの9999をコンテナの80にマッピングします
    # ローカルの9999にアクセスしたらこのコンテナの80にアクセスしてることと同じになります
    ports:
      - "9999:80"

    # htmlをおいてるディレクトリをdockerのコンテナにマウントして
    # nginxのデフォルトのドキュメントルートをうわがいてしまいます
    # 最後のroはread onlyの略(ちょっと速くなります)
    volumes:
      - ../src:/usr/share/nginx/html:ro
```

# これで先ほどのHTMLの中身が表示されてるとおもいます
* http://localhost:9999

![docker.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585901/21070752-2bfc-ab18-78b5-2c01444b4b81.png)

終わるときは docker compose down で終わってください
[AWS]CDKを用いてALBにOIDC認証設定してみた

## はじめに

### 背景・目的

- ALBでのOIDC認証について、CDKを用いた設定方法が気になったので、本記事に学習記録として残しておきます。

### 想定読者

- CDKを用いたALB・ECS構築経験のある方
:::note
本記事は学習記録の側面が強く、割愛している部分があることをご理解ください。
:::


## 設定の流れ
[AWS公式ドキュメント](https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/listener-authenticate-users.html)を参考にしつつ、Googleアカウント認証済みユーザのみがALB背後のECSアプリにアクセスできるよう、CDKを用いて設定してみます。

### Google OAuth 2.0 クライアントIDの設定
:::note
事前にGoogle Cloud Platformでプロジェクト作成が完了していることを想定しています。
:::


- Google Cloud Platformの`APIとサービス`にアクセスします。
- 左メニューから`認証情報`を選択した後、`認証情報を作成`を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562653/b65481c5-9473-c5df-ef48-472acb973921.png)
- `OAuthクライアントIDの作成`を選択し、必要な情報を入力します。
    - アプリケーションの種類：`ウェブアプリケーション`
    - 名前：任意の名前を入力
    - 承認済みのリダイレクトURI：[`https://ALBのドメイン名/oauth2/idpresponse`](https://cname/oauth2/idpresponse)
- クライアント作成後に表示される、クライアントIDとシークレットを控えておきます。
- クライアントシークレットはSecretsManagerに格納しておきます。
- ディスカバリーエンドポイント[https://accounts.google.com/.well-known/openid-configuration](https://accounts.google.com/.well-known/openid-configuration)にアクセスし、ALB設定時に利用する値を控えておきます。
    - issuer
    - authorization_endpoint
    - token_endpoint
    - userinfo_endpoint

### ALB・ECSの構築


- [BLEAのblea-guest-ecs-app-sample](https://github.com/aws-samples/baseline-environment-on-aws/tree/main/usecases/blea-guest-ecs-app-sample)や[CDK API Reference](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ecs-readme.html)を参考に、ALB及びECS資源構築用CDKコードを用意します。

:::note
本記事では詳細割愛します。
:::


### ALBリスナー ルールに認証を追加

- [AuthenticateOidcOptionsのExample](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_elasticloadbalancingv2.AuthenticateOidcOptions.html)を参考に、ALBリスナールールにOIDC認証設定を追加します。
    - Google OAuth 2.0 クライアントIDの設定で控えた値をパラメータに指定してください。
    - クライアントシークレットはSecrets Managerから参照します。
    - 認証に成功した場合にはターゲットグループ(ECS)に転送するように設定しています。

```typescript
// ALBにOIDC認証を追加
albListener.addAction('DefaultAction', {
  action: elbv2.ListenerAction.authenticateOidc({
    authorizationEndpoint: props.oidc.authorizationEndpoint,
    clientId: props.oidc.clientId,
    clientSecret: SecretValue.secretsManager(props.oidc.secretsName, { jsonField: props.oidc.secretsJsonField }),
    issuer: props.oidc.issuer,
    tokenEndpoint: props.oidc.tokenEndpoint,
    userInfoEndpoint: props.oidc.userInfoEndpoint,
    next: elbv2.ListenerAction.forward([appTargetGroup]),
  })
})
```

## 動作確認

- ブラウザからALBにアクセスしてみると、Googleの認証画面にリダイレクトされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562653/205b787e-fdfd-3435-e65c-6d3187af8b0b.png)

- Googleアカウントの認証情報を入力すると、[`https://ALBのドメイン名/oauth2/idpresponse`](https://xn--alb-nc4buksh7fufs384a/oauth2/idpresponse) へのリダイレクト(クエリ文字列に認可コードを含む認可コードレスポンス)を経て、無事にALB背後のECSアプリが表示されます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562653/cc9c9801-87e7-f4c5-0081-2ea89f24be54.png)

## 注意事項
- 本記事は万全を期して作成していますが、お気づきの点がありましたら、ご連絡よろしくお願いします。
- なお、本記事の内容を利用した結果及び影響について、筆者は一切の責任を負いませんので、予めご了承ください。
Ubuntu22.04で画面共有ができなかった

# はじめに

Ubuntu22.04にアップグレードしてからDiscordの画面共有ができなくなってしまいました。
バージョンを上げる前に画面共有をする機会がなかったので、気づくのが遅くなりました。
22.04からはディスプレイサーバープロトコルが`Xorg`から`Wayland`に変わっているようで、この変更によって画面共有ができなくなってしまったようです。

Waylandの方が動作が軽いといったメリットはあるようですが、画面共有できないのは痛すぎるのでWaylandには眠っていてもらいます。

# やったこと

下記コマンドでWaylandを無効化します

```bash
sudo sed -i '/WaylandEnable/s/#//' /etc/gdm3/custom.conf
```

この後、再起動することでDiscordの画面共有を行うことができました。
Googleフォームでファイルのアップロード先を任意のフォルダに変更する

## はじめに
Googleフォームとは、Google社が提供しているフォーム作成ツールです。
Googleフォームを使ってファイルをアップロードする場合、ファイルは通常Googleドライブ上のフォームと同じフォルダ内に保存されます。
この保存先をGoogle Apps Scriptを使って任意の場所に変更してみました。
## 前提
・googleフォームが作成されていること
・フォームの質問の中にファイルアップロードの項目があること

## やること
・Google Apps Scriptを使用してスクリプトを書く
・スクリプトのトリガーを設定する
## Google Apps Scriptを使用してスクリプトを書く
作成したGoogleファームの右上のメニューからスクリプトエディタを選択します
<img width="200" alt="IAM" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/34ea6ef5-1447-0ef2-4070-db2c86c5f2e9.png">

「コード.gs」の画面になるので以下のコードを記載します
 以下のコードは変更箇所が１箇所ありますので気をつけてください

 ```JavaScript 
// Googleフォームの送信イベントハンドラ
function onFormSubmit(e) {
  if (!e) {
    Logger.log("No event object");
    return;
  }

  // 指定フォルダのIDを取得
  var folderId = "YOUR_TEMP_FOLDER_ID"; // 指定フォルダのIDに置き換え
  var folder = DriveApp.getFolderById(folderId);

  // フォームのレスポンスを取得
  var responses = e.response.getItemResponses();

  // アップロードされたファイルを処理
  responses.forEach(response => {
    if (response.getItem().getType() == FormApp.ItemType.FILE_UPLOAD) {
      var fileIds = response.getResponse();
      fileIds.forEach(fileId => {
        var fileObj = DriveApp.getFileById(fileId);
        fileObj.moveTo(folder);
      });
    }
  });
}
 ```
■変更箇所
``` JavaScript 
 var folderId = "YOUR_TEMP_FOLDER_ID"
```
「YOUR_TEMP_FOLDER_ID」の部分を指定のフォルダIDに書き換えます。
ファイルの保存先のフォルダを開き、https://drive.google.com/drive/folders/ の後に続く部分がフォルダIDになります。

## スクリプトのトリガーを設定する

フォームの送信時にスクリプトが実行されるように、トリガーを設定します。

左側のメニューからトリガーを選択します
<img width="300" alt="IAM" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/6b69e321-0dda-f916-e1ff-87047518fc20.png">

右下にある「トリガーを追加」を押下します
<img width="２00" alt="IAM" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/c580e77f-6fc4-099d-e95f-5eb31ec6de51.png">!

すると以下の設定画面になります

<img width="400" alt="IAM" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/825f5ba3-8d0d-249c-c183-70ce432465fd.png">

イベントのソースで「フォームから」を選択します
イベントの種類で「フォーム送信時」を選択します

設定後、右下の保存を押下してください。

初回時のみ許可を求めるポップアップが出てきますので
googleアカウントにサインインして「Allow」を選択してください。
<img width="500" alt="IAM" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/d375119d-1eac-0ee1-12f7-343444f8d211.png">


## 確認
スクリプトを設定したgoogleフォームからファイルのアップロードを行い、指定のフォルダに保存されているか確認します。
保存されていれば設定は完了となります。

## まとめ
googleフォームは簡単にフォームを作成できるため便利なツールだと思います。
googleフォームを使いやすくするためにカスタムできることがあればまた記事にしたいと思います。
Webデザイナーのしくじりからフロントエンドエンジニアになった話

僕は30代後半になってようやくフロントエンドエンジニアになった人です。

何かを始めることに「遅い」とかは無いと思っていますが、周りの若いエンジニアと仕事をしていると、正直もっと早く目指せば良かったなとも思っています。

今回は自己分析も兼ねて、これまでの自分のしくじりポイントをまとめてみましたので、

「こうはなりたくないな…」
「わかるぞ、同志よ」

と参考になってくれたら嬉しいです。

## しくじりポイント1 ｜ 独学でWebデザイナーになる
まず最初のきっかけはWebデザイナーを目指したことでした。

デザインを見るのは好きだったし、最高のデザインを作ってやる！と本気で考えていて日々いろんなデザインを作っていました。

目指したことは全然いいんですが、ここでのしくじりポイントは

:::note alert
独学でWebデザイナーになってしまった
:::

スクールも行っていましたが、教わったのはPhotoshopの操作くらいで、デザインはほとんど独学で勉強してました。

周りにIT系の友人はいませんでしたし、陰キャなのでWebデザイナーのコミュニティとか怖くて参加できませんでした。

そんな中、

就職先を探していると未経験OKのWebデザイナーの募集があったので、意気揚々で応募したらそのままWebデザイナーになれちゃったんですね。

そう。

ブラック企業で。

![adult-1868750_1280.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812157/0fb1f91f-748d-cd50-7fb5-cec5c2dded19.jpeg)



しくじりポイントが違いましたね。直します。

:::note alert
ブラック企業でWebデザイナーになってしまった
:::

もう感覚でデザイン作ってOK状態。理論とか皆無。

OJTもなかったです。

合言葉は「ググれ」。

ここで正しいデザインを学べていたら、もしかしたら将来が違ったかもしれないです。

## しくじりポイント2 ｜ 勢いでフリーランスになる
何とか食べていくためにブラック企業で働き続けていたんですが、少しずつWebデザイナーとして自信が付いてきていたんですね。根拠はないまま。

そんなある日、

友人が「起業するから一緒にやろうぜ」って言い出したんです。

お！やるか！

:::note alert
勢いでフリーランスになってしまった
:::

バカヤロウ。

しかも友人は別業種だったので一緒にやっていない。

どうゆうこと。

とりあえずの勢いで何とかフリーランスをやっていたんですが、もともと無知すぎたのと要領が悪いので生活は良くなっていかなかったですね。ええ。

![homeless-5283148_1280.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812157/8860d3b6-2afe-c5c2-7bbf-e165a2f954a5.jpeg)

まあこのフリーランス経験は今でも身になっているので、あの時の勢いでやってみて良かったのですが。

フリーランスになったこと自体はしくじりポイントじゃないのですが、もう少しちゃんと調べて考えて行動すべきだったと思いました。

## しくじりポイント3 ｜ 今さら気づいた
Webデザイナーの活動を続けていて、

実はずっと違和感を感じていました。

んー、

ふと気づいたんです。

あ、デザイン作るの好きじゃない。
構築する方が好きじゃん。

:::note alert
今さら気づいた
:::

え…？

![cat-6275915_1280.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812157/588adb97-c5cf-b03f-ae28-9bac23615af4.jpeg)

## しくじりポイント4 ｜ 偏ったインプット
ここからやっとエンジニアを目指し始めます。

ただ、Webデザイナーだったのでデザインやマーケティングを主に勉強していることが多かったのです。

構築はWordPressをちょっと触れるくらいで充分でした。

ただ、現役のエンジニアさんから話を聞いて愕然としました。

…自分のスキルが遅れていることに。

GitHub使ったことない。
Linux触ったことない。

AWSって何？

Dockerって何？

Vue? React?

jQueryじゃないの？

![apprenticeship-8499861_1280.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812157/18e8dc6c-e801-d223-fac5-bf42bb039fcb.jpeg)

:::note alert
知らないことが多すぎてやばい☆
:::

ある意味楽しいです。

## まとめ
以上、僕のしくじりポイントでした。

エンジニアの考え方とか言葉とかが難しすぎて挫折も多いですが、しくじっていても今は楽しく生きています。

もし誰かの参考になればと思います。

:::note
将来のプランを明確にして行動する。
:::
目指したい場所を明確にすること。遠回りを避けることができる。

:::note
自己分析は大事。常にやるといい。
:::
後になって今さら気づくなんて目も当てられない。

:::note
幅広く情報収集する。メンターがいると良い。
:::
自分のスキルが偏っていると需要がないことも。後々大変。
【ChatGPT＋DALL-E3】【Hedra】でリップシンクしてみました。


　どうも、カーブミラーです。

　今回は、動画は動画でも、リップシンク（口パク）。そのサイトをご紹介しますね。

:::note info
本記事は、ChatGPT（有料版）
＋DALL-E3で行なっております。
画像はありません。あしからず。
:::

　まずは、ニュース。

　OpenAIが
　　中国からのアクセスを
　　　7月から切る、と通告。
[木内翔大さんポスト](https://x.com/shota7180/status/1805617758996250793?t=K8Of26lU-2vkwoPpZGiRgA&s=19)
***
　ChatGPTの
　　あの音声モードが
　　　提供を延期されました。
　[ITmedia News：音声モード提供を延期](https://www.itmedia.co.jp/news/spv/2406/26/news101.html)

　それでも
　　ひと月遅れで
　　　提供できるらしいです。
　　　　まぁ、調整に手間取るのは
　　　　　わかりますよね。

　この中では
　　macOS版ChatGPTアプリについても
　　　言及されていました。

　一般公開したことも
　　発表したそうです。

　［Option］＋［スペース］で、
　　　画面上のあらゆるものに
　　　　ついてチャットできる、とか。

　その前に
　　オイラにパソコンを！
***
　さて、
　　今日の本題です。

　“リップシンク”を
　　ご存知でしょうか。

　簡単に言うと、
　　“口パク”です。

　まぁ、
　　昔からあるのですが、
　　　最近は、生成AIのおかげで
　　　　たくさんのツールが
　　　　　出てきています。

　以前は
　　口だけ動く、
　　　まさに口パク。

　少し前には
　　頭も動く（でも髪の毛は動かない）
　　　ようなものが多く出てきました。

　でも
　　人間は
　　　喋っていても
　　　　身体が動くものです。

　だから
　　“これはAIだな”と
　　　わかったわけです。
***
　さて、
　　そんなリップシンクも
　　　進歩して、以前とは比べようも
　　　　ないレベルになりました。

　今回、紹介するHedraは
　　最近出てきたもののひとつです。
　　　[Hedra](https://www.hedra.com/)

　まずは、
　　ごらんください。
　　　Qiitaにはあげられないので
　　　　X-Twitterのポストになります。

　なお、
　　１分あり、また音声も出ます。
　　　ご注意くださいね。
　　　　最後がぶつ切りになります。
　　　　　これは、Hedraの仕様みたい。
　　　　　　[リップシンク](https://x.com/kabumira862571/status/1805089052028469271?t=5PuNuKQrmlqzn8komvLKPw&s=19)

　いかがでしたでしょうか。

　知らない人が見たら
　　本物の人に見られるかも。

　これの作り方は
　　極めて簡単です（自分だけ？）。

　ここでは、
　　例として、女性に
　　　歌わせるもの（上記）に
　　　　なります。

　手順
　❶DALL-E3で人物画像生成。
　　　できるだけ正面を向かせて。
　❷歌の歌詞をChatGPTで英語で作成。
　❸歌詞を音楽生成AIで、音声化。
　❹画像と音声を
　　　Hedraにアップするだけ。

　❶❷については説明いりませんよね😅
***
　さて、
　　手順❸と❹の説明を
　　　いたしましょう。
***
　❸の音楽生成AIですが
　　　今回は、SongRを利用しました。
　　　　sunoもあるのですが、
　　　　　歌手の指定ができなさそう
　　　　　　だったのです。

　　いや、できるかもですけどね😅

　　それと以前に
　　　SongRは触ったことがあった、
　　　　という理由もあります。

　　SongRについては
　　　以前、こちらにも書きました。
[【ChatGPT無＋GPT-4＋DALL-E3＋他】で、こんなの作った。](https://qiita.com/kabumira/items/c3055f05c334cd3c7437)

　　しかし、
　　　昨年11月なので
　　　　仕様が変わっているかも。
　　　　　（変わってなかった😅）

　　こちらがSongRのサイトです。
　　　[SongR.AI](https://www.songr.ai/)

　　曲調を選択、
　　　“I have my Lyrics”を選択、
　　　　タイトルと歌詞を入れて、
　　　　　“Natalie”で、歌手を選択。
　　　　　　そして“Render”をタップ。

　　これで
　　　生成されます。

　　なお、
　　　SongRは、
　　　　キーワードから作詞が可能。

　　　また、画像をアップロードして
　　　　それをイメージしての
　　　　　音楽生成もできる、みたい。
　　　　　　知らんかった😅
***
　次は、❹ですね。

　❹画像と音声を
　　　Hedraにアップするだけ。

　と書いたとおりですが、補足。
　　まずは、サイトにアクセスして
　　　サインインしてください。
　　　　[Hedra](https://www.hedra.com/)

　“Try Beta”をタップ。

　すると画面が切り替わり、
　　Audio
　　Character
　　Video
　　My Library（履歴）
　の四つが出てきます。

　今回の目的は、
　　音声と画像をアップロードして、
　　　生成動画を得ることにあります。
　　　　その手順を説明します。

　まず、
　　Audioの“Import audio”を
　　　タップして、音声ファイルを
　　　　アップロードします。

　次に、
　　Characterに
　　　画像をアップロードします。

　最後に、
　　Videoの“Generate video”をタップ。

　これで
　　生成がはじまります。
　　　画像と違い、動画なので、
　　　　それなりの時間が掛かります。

　出来上がりをチェックして
　　ダウンロードすれば
　　　終了です。

　一分以上の音声の場合は
　　ぶつ切りにされます。

　ようは“金払え”という話かな😅
　　でも、課金への遷移がない。
***
　まぁ、そんなこんなで、
　　動画が生成できます。

　今回は試しませんでしたが、
　　セリフを入れて、
　　　キャラクターを設定しての
　　　　動画も生成できるみたい。
　　　　　日本語も可能でした。

　YouTuberとか
　　インスタグラマーとかならば、
　　　利用価値はあるのかも。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
【備忘録】GASでReactアプリを作成する

# はじめに

GAS上の操作のみでReactアプリを作成する際の備忘録

# 新規作成からの流れ

GASプロジェクトを新規作成して、以下のコードを入力します。

~~~HTML:index.html
<!DOCTYPE html>
<html>
  <head>
    <title>React with GAS</title>
    <script src="https://unpkg.com/react@17/umd/react.production.min.js" crossorigin></script>
    <script src="https://unpkg.com/react-dom@17/umd/react-dom.production.min.js" crossorigin></script>
    <script src="https://unpkg.com/babel-standalone@6.26.0/babel.min.js"></script>
  </head>
  <body>
    <div id="root"></div>
    <script type="text/babel">
      const App = () => {
        return (
          <div>
            <h1>Hello, React!</h1>
          </div>
        );
      };

      ReactDOM.render(<App />, document.getElementById('root'));
    </script>
  </body>
</html>

~~~

~~~JavaScript:コード.gs
function doGet() {
  return HtmlService.createTemplateFromFile('index').evaluate();
}
~~~


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/6ff7987b-d37c-55e5-bd3f-029826e0515f.png)

Webアプリとしてデプロイします。
このように`Hello,React!`と表示されればOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/58cf74e8-c769-b861-f4d2-fa201c9ff6ec.png)
robloxでassistant その114

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
スクリプトだけで、自分のキャラクターをクローンして、自分を追いかけさせよ。

# 手順
- ReplicatedFirstに、LocalScriptを追加。
- スクリプトを書く。

```

local character = game:GetService("Players").LocalPlayer.Character or game:GetService("Players").LocalPlayer.CharacterAdded:Wait()
local Players = game:GetService("Players")
local player = Players.LocalPlayer
player.Character.Archivable = true
local clone = player.Character:Clone()
player.Character.Archivable = false
clone.Name = "npc"
clone.Parent = workspace
clone.PrimaryPart.CFrame = CFrame.new(0, 0, -50)
local hum = clone:FindFirstChild("Humanoid")
hum.DisplayName = "npc"

local PathfindingService = game:GetService("PathfindingService")
local animator = clone.Humanoid.Animator
local animation = clone.Animate.walk.WalkAnim
local animationTrack = animator:LoadAnimation(animation)
local path = PathfindingService:CreatePath()
local breakCount = 10
animationTrack:Play()

while wait(1) do
	local character = player.Character
	local humanoid = character and character:FindFirstChild("Humanoid")
	if humanoid then
		local position = character.PrimaryPart.Position
		path:ComputeAsync(clone.PrimaryPart.Position, humanoid.RootPart.Position)
		if path.Status == Enum.PathStatus.Success then
			local waypoints = path:GetWaypoints()
			for i, waypoint in pairs(waypoints) do
				clone.Humanoid:MoveTo(waypoint.Position)
				clone.Humanoid.MoveToFinished:Wait()
				if i % breakCount == 0 and position ~= character.PrimaryPart.Position then
					break
				end
			end
		end
	end
end



```

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/674b3f08-94c9-953a-8237-7211a667f8e5.png)


以上。
robloxでassistant その113

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
スクリプトだけで、自分のキャラクターをクローンして、アニメーションを表示せよ。

# 手順
- ReplicatedFirstに、LocalScriptを追加。
- スクリプトを書く。

```

local character = game:GetService("Players").LocalPlayer.Character or game:GetService("Players").LocalPlayer.CharacterAdded:Wait()
local Players = game:GetService("Players")
local player = Players.LocalPlayer
player.Character.Archivable = true
local clone = player.Character:Clone()
player.Character.Archivable = false
clone.Name = "npc"
clone.Parent = workspace
clone.PrimaryPart.CFrame = CFrame.new(0, 0, -5)
local hum = clone:FindFirstChild("Humanoid")
hum.DisplayName = "npc"


local Animation = Instance.new("Animation")
Animation.AnimationId = "rbxassetid://507770677"
local AnimationTrack = hum:LoadAnimation(Animation)
AnimationTrack:Play()
wait(5)
AnimationTrack:Play()

```

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/413df1a9-3e74-9e6e-9051-1f4485b0ca86.png)


以上。
タイトル: 「Claude AIをマスターする方法：作家とプロフェッショナルを支えるAIの新たな展望」

 日本のAmazonで出版された電子書籍を紹介します

タイトル: 「Claude AIをマスターする方法：作家とプロフェッショナルを支えるAIの新たな展望」

皆さん、こんにちは。本日は、Claude AIの革新的な機能とその可能性を解説した電子書籍「Claude AIをマスターする方法」をご紹介します。この本は、AIと共に書く技術とビジネス作業の新しい地平を開くことでしょう。

1. Claude AIとは何か？

Claude AIはAnthropic社が開発した最先端の人工知能モデルで、自然言語の処理と生成において卓越した性能を誇ります。この書籍では、Claude AIの基本概念と作動原理を分かりやすく説明しています。AIと協力して書く新たな次元を体験したい方々にとって、必読のガイドになるでしょう。

2. 書くことの革命：AIとの協力

Claude AIは、単なるツールを超え、作家や専門家に創造性と生産性を高める強力なパートナーです。本書では、AIがどのようにして書き方を革新的に変え、創造的なアイディアを生み出し、文脈を正確に理解し適用するかについて詳しく説明しています。AIとの協力により、皆さんの書く力をレベルアップしてみませんか。

3. 実践的なプロセスとティップ

この本は、AIを活用した実践的なライティングティップとプロセスを詳しく案内しています。効果的なプロンプトの書き方、AIとの対話を通じて文章を作成する方法、AIからのフィードバックを利用して文章を改善する方法などが学べます。初心者から熟練の作家まで、すべての人に役立つ情報が満載です。

4. ビジネスでの活用戦略

Claude AIは、単にライティングツールに留まらず、ビジネス文書の作成、データ分析、法律文書の作成など、様々なビジネス作業で有用です。本書では、様々なビジネスシナリオでClaude AIをどのように活用できるかを具体的な例とともに説明しています。ビジネス分野でもAIの革新的な可能性を発見してみましょう。

5. 倫理性と安全性

AIとの協力において重要なのは、倫理性と安全性です。本書では、Claude AIの倫理的な使用とデータセキュリティに関する内容を取り扱い、AIを責任を持って利用する方法を提案しています。AIの力を最大限に活用しながらも、倫理的な基準を守る方法を学びましょう。

結論

「Claude AIをマスターする方法」は、AIとの協力を通じて、ライティングとビジネス作業の新たな可能性を探求する皆さんにとって、完璧なガイドです

https://bit.ly/3VYTmNR
robloxでassistant その112

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
スクリプトだけで、自分のキャラクターをクローンして、表示せよ。

# 手順
- ReplicatedFirstに、LocalScriptを追加。
- スクリプトを書く。

```
local character = game:GetService("Players").LocalPlayer.Character or game:GetService("Players").LocalPlayer.CharacterAdded:Wait()
local Players = game:GetService("Players")
local player = Players.LocalPlayer
player.Character.Archivable = true
local clone = player.Character:Clone()
player.Character.Archivable = false
clone.Name = "npc"
clone.Parent = workspace
clone.PrimaryPart.CFrame = CFrame.new(0, 0, -5)
local hum = clone:FindFirstChild("Humanoid")
hum.DisplayName = "npc"

```

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/c9044df4-b986-c283-ec43-49e4d5ecbe19.png)


以上。
片端入れと両端入れ

金利計算方法について
初日不算入との記載もあるが、社会としてはどちらも正しい計算のようで
現時点(2024年6月時点)では結論がでていない。

# 片端入れ
金利や債券の利回りを計算する際に、対象期間のうち計算開始日（初日）あるいは最終日のどちらか一方だけを入れて算出する方法。

例えば2月1日から2月7日までの金利を、片端入れで計算する場合、日数は6日間になります。

# 両端入れ

金利や債券の利回りを計算する際に、対象期間のうち計算開始日（初日）と最終日の両方を入れて計算する方法。

例えば2月1日から2月7日までの金利を、両端入れで計算する場合、日数は7日間になります。


# 初日不算入

期間計算の起算点については，原則として，初日を算入せず翌日から起算し（初日不算入の原則），初日算入は例外的な扱いとなります（民法１４０条本文，刑事訴訟法５５条１項）。ただし，その期間の初日が午前零時から始まるときは，初日を算入します（民法１４０条但書）
rex0220 計算式プラグイン 文字列複数行の設定例

[rex0220 計算式プラグイン](https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73)で、文字列複数行を設定する例です。

# 概要

いくつかの項目から、文字列複数行の文章を組み立ててみます。

![2024-06-26_10h54_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/7f0c242d-d03f-6db3-c9ee-886eff294990.png)

# 操作例

![2024-06-26_11h06_24.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/8bb8d391-7201-b7ae-04d8-ad308bb939af.gif)


# 計算式プラグイン設定

配列(ARRAY)と配列の連結(JOIN) を使って項目を連結すると、簡潔に記述できます。
改行は、NEWLINE() 関数を指定します。
空文字の配列要素は、JOIN関数のオプション指定で削除します。
改行のみの行は、ダミー文字("@@@@") を指定して、REPLACEALL で ダミー文字を削除しています。

- JOIN(fieldcode, delimiter [, flags])
flag: 0: 空文字要素を削除しない　1: 空文字要素を削除
- REPLACEALL： 文字列の置換
REPLACEALL(fieldcode, pattern, string)

![2024-06-26_10h55_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/d0c1dd52-87f3-3455-04b7-b9125d185020.png)

```.js
計算式プラグイン
// 文字列複数行1 MULTI_LINE_TEXT
REPLACEALL(JOIN(ARRAY(
  "タイトル: "&タイトル & " " & DATE_FORMAT(日付),
  "チェックボックス: " & IF(チェックボックス=="","なし"),
  IF(IN(チェックボックス,"sample1"),"  sample1: TEST1"),
  IF(IN(チェックボックス,"sample2"),"  sample2: TEST2"),
  "@@@@",
  "担当者: "&ユーザー選択
),NEWLINE(),1),"@@@@","")

// 文字列複数行2 MULTI_LINE_TEXT
REPLACEALL(JOIN(ARRAY(
  "タイプ: "&タイプ,
  "文字列: " & IF(文字列=="","なし",文字列),
  "@@@@",
  "価格: "&FIXED(価格)
),NEWLINE(),1),"@@@@","")
```
未経験者のしくじり談


唯一無二の素敵なエンジニアに絶対なる‼わーちゃんと申します。
[しくじりエンジニア！私みたいになるな！](https://qiita.com/official-events/fd39ed8cc0dcc9829621)
今回はこちらのテーマで記事を書かせていただきます。所要時間１分もかからないと思います。
よろしくお願いいたします:relaxed:

## 想定読者
- これからエンジニアを目指す人
- 今現在エンジニアで「自分もこれあったわぁ」と思う人
- つたない文章でも許してくださる心の広い方
早速次からわたしのしくじり談をあげさせていただきます。


## しくじり談
### ★その1
問題・課題の内容を見る
すぐにGPTに全なげ
GPTのコードを疑問に思わずそのままファイルにコピペ
エラー大量発生
どの部分が原因かわかっていない:scream:

▼「しくじり」解決
課題の内容をよく見る
GPTの回答をコピペする前になぜそのコードなのか、仕組みを公式のドキュメント？などを参考に、知る努力をする
課題以外での使い方もしることができ一石二鳥:v:

### ★その2
PCと向き合うだけのイメージ
コミュニケーションなんてとらなくて大丈夫でしょ
問題ぶち当たった時つむ
ずっとひとりでやってきたからどうにかなると思い込む
お友達はGPT状態:scream:

▼「しくじり」解決
自分ひとりで突き進まず、周りに助けを求めることが大切
利用できるものは最大限活用
**知るは一時の恥、知らぬは一生の恥**

### ★その3
どうせダメ。他の人はできている。周りがキラキラ見える
自暴自棄になる。うつ・・・
年齢的にももう駄目なんだ。私なんて、私なんて:scream:
▼「しくじり」解決
直接話すのが怖いなら、SNSコメント返信欄などを活用して交流してみるといい
自分を発信してみよう
同じような状態の人は探せばいる。
自分一人ではない、交流することで互いのモチベをあっぷしましょう
悪い情報ではなく、自分にとって＋の情報を集めよう

★将来なにかになりたかった子供時代、最初からスポーツ選手の厳しさやアンチにたたかれるリスクやお金の事、詳細に考えたことのある人は少ないと思います。
「こうなれるんだ！あの人を目標に使用！私は僕は絶対なるんだ！」
あの時の気持ちを胸に、目標に向かって突き進んだ方がはやいです:v:

### ★その4
全て覚えようとする
翌日には即忘れる
できない自分に苦しむ:scream:
▼「しくじり」解決
常に新しいものが出てきている
覚える量が半端ではない
義務教育+高校+大学入学や一部資格試験の勉強・学習とは全く別物
こういう流れなんだ、こういう使い方をするんだ、公式ドキュメントのここを参考にすればいいんだ、この人の記事わかりやすい、など
暗記したところでいつかは古くなってしまうもの。流れでざっ把握しておくことが大切


## まとめ
しくじり談を4つほどお伝えしました。エンジニアに限らない話かと思いますが、今回のような「しくじり」を感じた方に、どこか共感いただけたら幸いです。
generateStaticParamsを使って静的サイトを作成[Next.js/AppRouter]

今回、個人ブログ用に作成した静的サイトで用いた
ビルド時にデータ取得を行い。静的なhtmlを生成したときの記述をメモしておきます。


## 静的エクスポートを有効にする
next.config.js に 下記の記述を追加。

```jsx
const nextConfig = {
  output: "export",
  trailingSlash: true,
};
```

* `output: "export"`
    静的なHTMLファイルを生成して出力するモードになる。

* `trailingSlash: true`
    生成されるURLの末尾に、スラッシュ（/）を追加するかを指定。
    trueに設定すると、URLの末尾にスラッシュが自動的に追加される。
    例えば、/about のようなURLは、/about/ として扱われる。


## 一覧ページの作成

今回は簡単に、blog の一覧ページと詳細ページだけのシンプルな構成でやっていきます。
エンドポイントは、JSONPlaceholderからダミーデータを取得してきます。


### src/app/blog/page.tsx
```
import Link from "next/link";

export default async function SG() {
  const ENDPOINT = "https://jsonplaceholder.typicode.com/posts";

  // データフェッチ
  const articles = await fetch(ENDPOINT, {
    cache: "force-cache", // キャッシュを有効に
    next: { revalidate: 10 }, // 10秒でリフレッシュ
  }).then((res) => res.json());

  return (
    <div>
      {articles.map((article) => (
        <div key={article.id}>
          <p>{article.title}</p>
          <Link href={`${article.id}`}>詳しくみる</Link>
        </div>
      ))}
    </div>
  );
}

```
（本当はコンポーネントに分割した方が良いのですが、メモ用なので省略！）



## 詳細ページの作成

* ダイナミックルーティングで記事を取得
* generateStaticParamsで静的生成

### src/app/blog/[id]/page.tsx
```
const ENDPOINT = "https://jsonplaceholder.typicode.com/posts";

export default async function DetailPage({ params }) {
  // データフェッチ
  const article = await fetch(`${ENDPOINT}/${params.id}`, {
    cache: "force-cache", // キャッシュを有効に
  }).then((res) => res.json());

  return (
    <div>
      <h1>タイトル：{article.title}</h1>
      <h1>本文：{article.body}</h1>
    </div>
  );
}

// 静的生成
export async function generateStaticParams() {
  const articles = await fetch(ENDPOINT, {
    cache: "force-cache",
  }).then((res) => res.json());

  const staticPaths = articles.map((article) => {
    return {
      id: article.id.toString(), // 文字列に変換
    };
  });

  return staticPaths;
}
```

*DetailPage* コンポーネント
* `params`オブジェクトからで記事IDを取得し、データフェッチ。
* タイトルと本文を表示するコンポーネントを作成。


*generateStaticParams* 関数
* ビルド時に指定したパスを元に静的ページを生成してくれる関数。
* パスは、記事を全件データフェッチし、記事IDのみのオブジェクトを作成し、静的パスとして返す。
    ※ id は文字列でないとエラーになるので注意！
    
公式：https://nextjs.org/docs/app/api-reference/functions/generate-static-params


---

今回メモ程度に書いたので型を書いていないが、
TypeScriptで書く場合は、ちゃんと書かないとビルドエラーになるので注意。

簡単に高速なサイトを作れるので便利！
pageRouterの時より記述がシンプルになったので、理解しやすかったです。
【トラブル】Eclipseで突如でデバッグできなくなる

## Eclipseって使ってますか？

こんにちは！私はJavaといえばEclipseという安直な考えでEclipseをいまだに使っています。
Spring BootとかならもうVS Codeかもしれませんが関係ありません。

## Eclipseがなぜこんなに嫌われているのか？

Eclipseは今はやりの`Copilot`も対応していないしボタンも多いしごちゃっとしていて使いづらいです。

ちょっと古めのPCだと重くて使い物になりません(32ビット時代が懐かしい。。)

## Eclipseでデバッグしようとしたら謎のアイコンが出現！

普段はコードの行の外側に青い丸でブレークポイントがあらわされるんですが

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/8e95b7b5-0531-cab8-e6ee-5188a61735d3.png)

いきなりこのようになってしまいました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/f0b30172-f8c8-c3b3-5686-b2bcdcba3ee0.png)

青い丸の代わりこのようなアイコンが出てしまいました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/de1bfb01-2ca3-49a1-c7e4-96b676b5fe4c.png)

## 原因はすべてのブレークポイントをスキップ

ブレークポイントをスキップするという設定がありそこが誤ってオンになっていることが原因です。
ブレークポイントタブの**左から5番目のアイコン**を確認しましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/17d224bd-970b-f518-35b9-f9057e5f2381.png)
[AWS SUMMIT2024 セッションレポート] 1,000 を超える Web サイトを少人数で運用するソニーミュージックソリューションズ様のオブザーバビリティ実現例～クラウド運用をリアクティブからプロアクティブに！～

# はじめに
受講セッションの個人的な所感と、メモです。
メモの内容は、誤字脱字などあるやもしれませんが、ご了承ください。

# 概要
> ソニーミュージックソリューションズ様は、限られた人員で 1,000 を超える Web サイトを運用し、サイトの速度や表示に関する問い合わせにも日々対応されていました。そのような環境下で、「少人数運用でも安定稼働」を実現するというビジョンを掲げられていました。本セッションでは、同社がそのビジョン実現に向けて、どのような取り組みを日々行ってこられたかをご紹介いたします。成功した施策や乗り越えてこられた課題など、実際の経験に基づくリアルな内容をお話しいただきます。反応的な対応から一歩進んで、「未来に向けた継続的な改善」を実現するための手法や考え方について、同社の実践を通じてご理解いただければ幸いです。少人数での大規模システム運用におけるノウハウを存分に学んでいただけるセッションです。


# 所感
今回お話のあったような規模感ではなくとも、同様の悩みを抱えている企業は数多くあるのではと思いました。
（かくいう我々も・・・）

我々の話でいうと、まだまだ規模感が小さくはあるのですが、
同様の問題が発生するだろうという事は、簡単に想像できてしまうぐらい、心当たりのある話でグサグサ刺さりました。

特に、日々の運用で手いっぱいで、改善にかけるリソースがないとか、
トラブルがトリガーになってる点とか、まさにど真ん中に刺さりますよね。
（きっとそういう方は多いはず・・・）

リテラシーに関係なく、非エンジニアでも初動の調査が可能となるような状況は、凄く理想的です。

Dynatrace、あるいはそれに類したシステムやサービスの導入は、選択肢としてはとてもありですね。

気になる点としては、まだまだ小さな規模感で動いている場合、
同様の問題が見受けられたとしても、コストと合うのか、というぐらいでしょうか。

あともう１点、可視化のその先へ、という話で、
可視化した後の事について触れられていたのも印象的でした。

可視化することがゴールではない、その後に何をするか、
これも重要ですね。

# 聴講メモ

## 60アカウントほど管理
現状、AWS内で６０アカウントほどが稼働している

- **1つのサービスに存在するロール**
  - オーナー
  - 営業運用
  - システム
  - IT発会社
  
- 管理は**7人のメンバー**

## 現状と課題

- **500台を超えるインスタンス**
  - EC2 to RDS

- **1000を超えるサイト**

- **クラウドに最適化したいが、日々の運用で手一杯**
  - 調査、質問、メンテナンスなどなどの日常業務
  - トラブル発生がトリガーになっていることが多く、モチベーションが上がりにくい

- **モノリシック構成**
  - サイトごとにリソースの使われ方が異なる

## Dynatrace の利点

- **非エンジニアが使えるダッシュボード**
  - 問題を起点に調査ができる
  - エンジニア以外が調査できることで、リソース確保が可能
  - リテラシーに依存せず、情報を可視化

- **アプリケーションレイヤーの可視化**
  - 簡単に導入可能
  - 既存のアプリケーションに手を入れなくていい
  - モノリシック構成には必須
    - どのリクエストがどういう処理でどれぐらい時間がかかっているか
    - 異常値を設定しなくても検知してくれる

- **その他の利点**
  - AWS マーケットプレイスから購入可能
  - ユーザー数に依存しないライセンス体系
  - 充実した分析機能

## 可視化の先

- **可視化**
  - 全員が自ら調査確認

- **改善**
  - 障害起因ではなくプロアクティブな改善

- **コスト削減**
  - 必要なリソースの見極め
  - 自動化への移行


# 関連
- [AWS SUMMIT2024 参加レポート](https://qiita.com/yukiMiyoshi_fcafe/items/220bf886aa94ea552d3e)
【備忘録】flask_jwt_extended 認証エラー時の 500 Internal Server Error を解消

# はじめに #
FLASK アプリケーションにJWTでの認証を追加した。正常ルートは難なく通ったが、認証エラーで 500 Internal Server Error が返ってしまう。ハンドリングもしているのに・・・  
単純なことで認証エラーが返るようになったので、対応方法を残しておく。  


# 対応方法 #
### 変更前 ###
__ソースコードは相当端折ってます。ポイントだけ。。。__  
app.py  

    :
    snip
    :
    app = Flask(__name__)

    app.config['JWT_SECRET_KEY'] = 'jwtsecretkey'
    api = Api(app)
    api.add_resource(Login,   '/login')
    api.add_resource(HogeAPI, '/hogehoge')
    
    jwt = JWTManager(app)
api.py  

    class Login(Resource):
      def post(self):
        username = request.json.get('username', None)
        access_token = create_access_token(identity=username)
        return {"access_token":access_token}, 200

    class HogeAPI(Resource):
      @jwt_required()
      def get(self):
        return {"MSG":"OK!"}, 200
    :
GETすると・・・  

    $ curl http://localhost:5000/hogehoge  -H "Authorization: Bearer ${TOKEN}"
    {"MSG": "OK!"}
    $ curl http://localhost:5000/hogehoge  -H "Authorization: Bearer ${TOKEN}x"
    {"message": "Internal Server Error"}
    $ curl http://localhost:5000/hogehoge
    {"message": "Internal Server Error"}
    $

jwt_required()デコレータが効いてない！  
色々と調べたりハンドリング処理を追加したり実験してみたけど、Apiのパラメータを追加しただけで認証エラーが返るようになりました。  

### 変更後 ###
__ソースコードは相当端折ってます。ポイントだけ。。。__  
app.py  

    :
    snip
    :
    app = Flask(__name__)

    app.config['JWT_SECRET_KEY'] = 'jwtsecretkey'
    api = Api(app, errors=Flask.errorhandler)             ★変更箇所（ここだけ）
    api.add_resource(Login,   '/login')
    api.add_resource(HogeAPI, '/hogehoge')
    
    jwt = JWTManager(app)
api.py  

    class Login(Resource):
      def post(self):
        username = request.json.get('username', None)
        access_token = create_access_token(identity=username)
        return {"access_token":access_token}, 200

    class HogeAPI(Resource):
      @jwt_required()
      def get(self):
        return {"MSG":"OK!"}, 200
    :
GETすると・・・  

    $ curl http://localhost:5000/hogehoge  -H "Authorization: Bearer ${TOKEN}"
    {"MSG": "OK!"}
    $ curl http://localhost:5000/hogehoge  -H "Authorization: Bearer ${TOKEN}x"
    {"msg":"Signature verification failed"}
    $ curl http://localhost:5000/hogehoge
    {"msg":"Missing Authorization Header"}
    $
やっと目的達成！因みにステータスコードは下記の通りです。  
{"msg":"Signature verification failed"} ⇒ 422 UNPROCESSABLE ENTITY  
{"msg":"Missing Authorization Header"} ⇒ 401 UNAUTHORIZED  

# 最後に #
上記のソースコードからはわかりませんが、
FLASK-RESTful, FLASK-SQLAlchemy, ... FLASKの拡張ライブラリ等を色々いれてますので、その影響もあるかと思います。時間はかかったけどうまくいって良かった。
ITパスポート インターネットの仕組み

・IPアドレス
ネットワークに接続されたコンピュータやネットワーク機器の１台１台に割り当てられた識別番号

・サブネットマスク
IPアドレスをネットワークアドレス部とホストアドレス部に区切るためのビット列

例
IPアドレス 192.168.1.3
サブネットマスク 255.255.255.0

・グローバルIPアドレス
世界で一意のアドレス（インターネットで利用できる）
・プライベートIPアドレス
組織内で一意のアドレス（LANなどの組織内の閉じられた中で利用できる）

・NAT（ナット）
プライベートIPアドレスとグローバルIPアドレスを相互に変換する機能

・ドメイン名
IPアドレスを人間が理解しやすいように置き換えた文字列

・DNS
IPアドレスとドメイン名を対応付ける仕組み
・名前解決
DNSサーバへ問い合わせ、ドメイン名からIPアドレスを取得すること

・DHCP
ネットワークに接続されたPCやネットワーク機器などにIPアドレスを自動的に振り当てるプロトコル

・IPv4
IPアドレスを32ビットで表現する

・IPv6
IPアドレスを128ビットまで拡張したもの
・IPsec
パケットを暗号化する

・ポート番号
通信サービス（アプリケーション）を識別するための番号
・ウェルノウンポート
HTTP（80番）、SMTP（25番）、POP3（110番）

・ARP（アープ）
IPアドレスに対応するMACアドレスを取得するときに使われるプロトコル
msw2.0の導入まで

# はじめに

msw(Mock Service Worker)を導入してAPIリクエストをインターセプトして、mockResponceを返すところまでやってみたいと思います。

今回はテストでmswを使用することを想定しています。

# やったこと
## 1. mswインストール
    ``` bash
    yarn add -D msw 
    ```

## 2. server.tsを作成
前のバージョンのmswでは`(req, res ctx)=>`といった書き方をしていましたが、バージョン2.0からはスッキリした書き方になりました。

```server.ts
    import { http, HttpResponse } from "msw";
    import { setupServer } from "msw/node";

    const handlers=[
        // jsonデータを返す時
        http.get("http://hogehoge", () => {
        return HttpResponse.json(jsonData);
        }),
        // パスパラメータを使う時
        http.get("http://hogehoge/:pathParam", ({params}) => {
        return HttpResponse(`${params.pathParam}`, {status: 200});
        }),
        // クエリパラメータを使う時(一つ)
        http.get("http://hogehoge", ({ request }) => {
        const url = new URL(request.url);
        const queryParam = url.searchParams.get('queryParam');

        if(!queryParam){
            return new HttpResponse(null, { status: 404 })
        }
        return HttpResponse(`${queryParam}`, {status: 200});
        }),
        // リクエストボディを使う時
        http.get("http://hogehoge", ({ request }) => {
          const body = await request.json();
          return HttpResponse(`${body.message}`, {status: 200})
        }),
    ]

    export const server = setupServer(...handlers);
```

## 3. サーバーをセットアップする

テスト用のファイルに以下を追加します。
テストファイルが多い場合は、setupファイルを作成してそこに書くと良いと思います。

```test.tsx
    import server from "../~~/server";
    import { cleanup } from "@testing-library/react"

    beforeAll(() => server.listen({ onUnhandledRequest: "error" }))
    afterAll(() => server.close())
    afterEach(() => {
      server.resetHandlers()
      cleanup();
    })

    (中略)
```

以上でmswを使用してリクエストをインターセプトすることが可能になったと思います。
とはいえやはり公式に勝る情報源はないと思うので、公式を読んで必要な記法について勉強しようと思います。

https://mswjs.io/
simulation 環境で動作するロボットのモデル

NVIDIAのIsaacのシミュレーション環境では以下のロボットが既に定義されています。


## [Robot Assets](https://docs.omniverse.nvidia.com/isaacsim/latest/features/environment_setup/assets/usd_assets_robots.html)

- Differential Robots
- Holonomic Robots
- Quadruped Robots
- Robotic Manipulators
- Aerial Robots
- Humanoid

これらはタブを切り替えて、対応機種を見てください。
ちなみにHumanoidには、以下の機種がありました。

- 1X neo
![](https://docs.omniverse.nvidia.com/isaacsim/latest/_images/isaac_assets_neo.png)
- Agility digit
![](https://docs.omniverse.nvidia.com/isaacsim/latest/_images/isaac_assets_digit.png)
- Fourier Intelligence GR1
![](https://docs.omniverse.nvidia.com/isaacsim/latest/_images/isaac_assets_gr1t1.png)
- Sanctuary AI Phoenix
![](https://docs.omniverse.nvidia.com/isaacsim/latest/_images/isaac_assets_phoenix.png)
- Unitree Humanoids
![](https://docs.omniverse.nvidia.com/isaacsim/latest/_images/isaac_assets_g1.png)
- Xiaopeng PX5
![](https://docs.omniverse.nvidia.com/isaacsim/latest/_images/isaac_assets_px5.png)

## シミュレーションで動作するとは
- シミュレーションする前提がソフトウェアによって異なる。
### 例：Unity
 モーションデータを合わせこんで、レンダリングするという意味合い。
 極論：物理法則を無視したモーションが可能
 
### 例：MATLAB
- MATLABの中で作り込んだモデルの粒度で動作をシミュレーションすることになる。
- 機構系の特性を考慮したシミュレーションもモデルの作成次第によって可能になる。
### Nvidia Isaac Sim の場合
- 未調査