OmniAICreator/Qiita-1.07M huggingface dataset:
【RDS】パラメーターグループの比較方法

## 目的

以下のような状況でパラメーターグループ（以下：PG）を変更した際の何かしらの影響をなくすために、比較をする必要が出てくるのでAWS CLIを利用して比較を実施する。

- メジャーバージョンアップを実施する兼ね合いでパラメータの増減を確認したい
例：PostgreSQL13から14に上げる
- 意図しないPGを利用していて変更したいとき
例：defaultのPGを利用しているなど
:::note info
なぜdefaultのPGから変更するの？
defaultPGを複数のインスタンスで適用しているとパラメーターを変更した際に適用しているインスタンス全てに影響が出てしまうためそれぞれにPGを作成・適用させることがおすすめです。
:::
## 対応方法

### スクリプトを作成しました。

- pg_diff.sh
    
    ```bash
    #!/bin/bash
    
    # パラメーターグループ名をコマンドライン引数から取得
    base_param_group=$1
    target_param_group=$2
    
    # パラメーターグループの情報をCSVファイルに出力
    aws rds describe-db-parameters --db-parameter-group-name $base_param_group | jq -r '.Parameters[] | [.ParameterName, .ParameterValue] | @csv' | sort > base.csv
    aws rds describe-db-parameters --db-parameter-group-name $target_param_group | jq -r '.Parameters[] | [.ParameterName, .ParameterValue] | @csv' | sort > target.csv
    
    # 差分を比較
    diff_output=$(diff -y base.csv target.csv --suppress-common-lines)
    
    # 差分があればTXTファイルに出力、なければ標準出力に情報を伝える
    if [ -z "$diff_output" ]; then
        echo "No differences found between the parameter groups."
    else
        echo "$diff_output" > diff.txt
        echo "Differences found. See diff.txt for details."
    fi
    ```
    

### スクリプトの利用方法

以下のようにコマンドを叩きます。

```bash
sh pg_diff.sh "<BASE_PG>" "<TARGETPG>"

## 例
sh pg_diff.sh "default.postgres11" "new-pg"
```

スクリプトを利用すると以下のファイルが出力されます。

- base.csv
現在利用しているPGのパラメーター一覧
- target.csv
変更後のPGのパラメーター一覧
- diff.txt
baseとtargetの比較した際に差分があるときのみ出力される

### 実例

defaultPGを利用しているため、`new-pg` に変更したい。

```bash
$ sh pg_diff.sh "default.postgres11" "new-pg"
Differences found. See diff.txt for details.
$ cat diff.txt 
"check_function_bodies",				      |	"check_function_bodies","0"
"client_min_messages",					      |	"client_min_messages","warning"
"default_transaction_read_only",			      |	"default_transaction_read_only","0"
"escape_string_warning",				      |	"escape_string_warning","0"
"lc_messages",						      |	"lc_messages","C"
"lc_monetary",						      |	"lc_monetary","C"
"lc_numeric",						      |	"lc_numeric","C"
"lc_time",						      |	"lc_time","C"
"standard_conforming_strings",				      |	"standard_conforming_strings","0"
"statement_timeout",					      |	"statement_timeout","0"
```

diff.txtには差分のみ表示されるようにしてます。

パイプの左側がbase、右側がtargetのパラメータです。

以下については`default.postgres11`の`check_function_bodies` には値が設定されていないが、

`new-pg`の`check_function_bodies`には`0`という値が設定されているため差分が出ている。

```bash
"check_function_bodies", |	"check_function_bodies","0"
```
DAY9~10 休息とウェブセミナー

## DAY9 休息の日
230704
ちょっと疲れが出てきたのか、数日間ずっと交感神経優位みたいな感覚がありました
自律神経を整えるために、今日はゆっくりお風呂につかりました。
あとは家事をしてプログラミングの勉強はお休み。
寝る前に瞑想もする予定です。
入浴についてと瞑想についてはchatgpt4の助言をもらいました。
4-7-8呼吸法というのを教えてもらったり、湯船につかるのは10-20分くらいにした方がいいということを教えてもらいました。もともと浸かるときは長風呂が好きなのですが、あんまり体によくないらしいです。
明日は夜にウェブセミナーがあるのわくわくする:relaxed:

## DAY10　初めてのウェブセミナー
【Lancers】電脳実技会～初めてのChatGPTで即業務改善編～【業務に使えるプロンプトプレゼント】
https://denjitsu01.peatix.com/view
に参加しました

googlemeetでの配信でした
最初の1時間くらいはchatgptの登録方法や使い方などだったので、ちょっと暇でしたｗ
80パーセントくらいの情報は既知でしたが、知らない情報もあったし、その使い方はしてなかったなあ～というのを実際見ることができたので、そこはよかったかなと思いました。

今回のウェビナーは20－22時固定で、アーカイブもなく、録画なども禁止でした。私は時間に間に合いましたが、仕事などで間に合わないひともいらっしゃいました（コメント欄に書かれていました）
それでもアーカイブなどはなしでした。（しかたないけど）
1980円でしたし、もうここのウェビナーは参加しないかなと思いました。
配信時間に間に合うスケジュール調整ができて、調べるのが面倒だったり、何からやっていいのかわからない人にはいいのかもしれないです。

知らないことや、できると知っているけどやったことがないこともあったし、
自分でやりたいことにあった記事やアーカイブを調べて、実践することの方が面白いと感じるし自分に合っているということが知れたので、無駄ではなかったと思います。
replaceメソッド

## replaceメソッド

:::note
**文字列内の指定した文字列や文字を別の文字列や文字に置換する**ためのメソッド
:::


```java
public String replace(CharSequence target, CharSequence replacement)
```

### パラメータ

- target : 置換したい文字列や文字のシーケンス
- replacement : 置換する文字列や文字のシーケンス

### 戻り値

置換後の文字列が返される

```java
String str = "Hello, World!";
String newStr = str.replace("Hello", "Hi");
System.out.println(newStr); // 出力: "Hi, World!"
```
元の文字列(str)の中から "Hello" という部分を "Hi" に置換

replaceメソッドは新しい文字列を返す
→置換後の文字列を newStr に代入している

### replace メソッドの注意点

:::note
元の文字列自体を変更するのではなく、**置換後の新しい文字列を生成**
**→元の文字列には影響なし**
:::

今回は、targetパラメータに文字列や文字のシーケンスを指定したが、正規表現を使用して複雑なパターンの置換もできる

- replaceメソッドは大文字と小文字を区別する
置換対象の文字列や文字の大文字と小文字に注意する必要がある
OmniObject3D: Large-Vocabulary 3D Object Dataset for Realistic Perception, Reconstruction and Generation


# 1. 概要
3Dモデルの生成には現実世界の物体をスキャンしたデータセットが必要だが、大規模データセットが不足している。この研究では、190のカテゴリで6,000の3Dモデルを実世界でスキャンして、スキャン動画や多視点レンダリング、テクスチャ付きメッシュ、ポイントクラウドなどのアノテーションデータとともに公開している。スキャニングの精度は0.1mmと高品質。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/a8d92094-385c-a923-96fd-dcd0ceaab172.png)
*Award Candidate

---

# 2. 新規性
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/185ed2c6-3366-cb1b-d620-bd67158871c5.png)
高精度に多量の3Dモデルをアノテーションデータとともに公開した。MS COCOやImageNetといった2D画像のカテゴリと共通する3Dモデルを多数包含している。

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/b194f2f4-3551-8f5e-ed78-0fb3cd517038.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/f7aab34c-f272-2e18-34fa-389444783501.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/d9a4e2cc-86e8-3e1b-45d6-98483013298d.png)
データセットを元に4つの指標を定めている：1) 3Dモデルの頑健性、2) 多視点合成、3) 3D物体の表面の詳細再構成、4) 3D物体生成。
例えば、1)について、ポイントクラウドの各ポイントごとにどの物体に属するかをタグ付けしており、現実世界で起こりえる欠損も考慮したモデリングになっているかを評価し、頑健性を考慮した手法かどうかがわかるようにした。また、4)については、NeRF(Neural Radiance Fields)を評価できるようにしており、多視点で撮影した画像群から3Dモデリングを行ったときのクオリティチェックができるようになっている。

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/881c19a6-f0d5-e55b-29e5-457b0a2b0fd4.png)

---

Paper URL: <https://openaccess.thecvf.com/content/CVPR2023/papers/Wu_OmniObject3D_Large-Vocabulary_3D_Object_Dataset_for_Realistic_Perception_Reconstruction_and_CVPR_2023_paper.pdf>

last updates: July 4 2023
Win10/11のフルスクリーン最適化を有効にしてください！CSGO、オーバーウォッチなどの高FPSゲームのスムーズさを向上させます！コード

![fb_image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2997148/eee3a66d-c0c7-a147-5b7d-623978bb251b.png)


```
WindowsRegistryEditorVersion5.00

[HKEY_CURRENT_USERSystemGameConfigStore]

"GameDVR_FSEBehaviorMode"=dword:00000002

"GameDVR_HonorUserFSEBehaviorMode"=dword:00000001

"GameDVR_FSEBehavior"=dword:00000002

"GameDVR_DXGIHonorFSEWindowsCompatible"=dword:00000001
```

下のパラメータを新規テキストドキュメントにコピーし、拡張子をregに変更してダブルクリックすると、システムのフルスクリーン最適化を無効にすることができます！

特定のゲームプログラムやフルスクリーン最適化を有効にする場合は、ゲームのexeファイルを右クリックして[プロパティ-互換性-フルスクリーン最適化を有効にする]にチェックを入れるだけで良いです。

これらの操作はとても簡単で、急激に完了します。 もしかしたら、あなたの体験は飛躍的に進歩するでしょう！
MAESTER: Masked Autoencoder Guided Segmentation at Pixel Resolution for Accurate, Self-Supervised Subcellular Structure Recognition


# 1. 概要
医学・生物学の分野では細胞を撮影した画像のセグメンテーションが研究に必要だが、細胞を断面撮影した3Dボリュームのセグメンテーションは手動では大変なコストとなり自動化が難しい分野だった。この研究では、ピクセル単位で正確な細部内の構造をセグメンテーションできる自己教師有り学習(Self-supervised Learning)を提案している。

---

# 2. 新規性
セグメンテーションタスクを表現学習とクラスタリングの二つの問題として捉えて、細胞ごとに形状の異なる各部位をセグメンテーションする際の、細胞間に共通する表現を学習し、かつそれがどの部位であるかクラスタリングしている。細胞画像は超高解像度画像となるが、非常に複雑な部位までセグメンテーションできている。

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/31e26887-aec3-655f-28cc-6b10e7eaeb4e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/e1a1ef92-49be-23b1-bcdf-7ddcf2263939.png)
原子顕微鏡で撮影された2D画像をパッチに区切り、Vision Transformerを使って十分な視野を保って複数のパッチに共通する意味のあるトークン表現を学習する。ここで、MAE(Masked Auto-Encoder)を用いることで細胞間に共通する汎用的な特徴を優先的に学習できるようにしている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/dd2225ad-4e41-0b77-4485-47db9fb28bc5.png)
また、2Dスキャン画像から3Dボリュームを生成する際はセグメンテーション結果の空間的な位置推定を行うことでシームレスに結果が合成されるようにしている。

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/3e5a401e-d79d-b561-45ce-974027525622.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/a6f73cb2-1419-1cf0-3748-1f887beb4219.png)
マウスの膵臓の細胞を用いた評価実験を実施しており、従来手法に比べて29.1%の精度向上を達成した。

---

Paper URL: <https://openaccess.thecvf.com/content/CVPR2023/papers/Xie_MAESTER_Masked_Autoencoder_Guided_Segmentation_at_Pixel_Resolution_for_Accurate_CVPR_2023_paper.pdf>

last updates: July 4 2023
DynIBaR: Neural Dynamic Image-Based Rendering


# 1. 概要
単眼カメラで撮影された動画から、全く別の視点から見たときの映像を違和感なく再構成する研究。NeRF(Neural Radiance Fields)を用いて多視点画像から3Dモデルを生成する研究を時系列へ拡張した手法としてDynamic NeRFsも提案されているが、物体が激しく動くなどシーンが複雑だと再構成された画像がぼやけてしまうという問題があった。この研究では、頑健なDynamic NeRFの手法を提案している。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/dce87e91-77b9-31c6-f31f-174ab1e71476.png)

*Award Candidate: Honorable Mention

---

# 2. 新規性
MLPの重みにシーン全体の時空間情報をエンコードするのではなく、シーン内の動きのある対象に近いカメラ位置からサンプリングして特徴を集め新たな視点の画像を合成することで、動きのある物体のブレやボケに強いNeRFを実現している。

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/e59739fa-60d2-6b46-9110-9cdb34e86a53.png)
時刻 i におけるサンプリング点 X を入力として、動きのある物体の軌跡を予測し、時空間的に近いサンプリング位置を探す。候補のサンプリング点に対し、画像特徴を抽出しサンプリング点の色と密度をRay Transformerから予測し、ボリュームレンダリングを施して任意の時刻の新たな視点からの画像を生成する。

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/3667438a-ba90-8a38-5e3d-33f7adb49297.png)
動きの激しい物体でも消えたりボケたりすることなく、任意視点でシーンを再構成できている。

---

Paper URL: <https://openaccess.thecvf.com/content/CVPR2023/papers/Li_DynIBaR_Neural_Dynamic_Image-Based_Rendering_CVPR_2023_paper.pdf>

last updates: July 4 2023
Learning Video Representations From Large Language Models

# 1. 概要
事前学習済みの大規模言語モデル(Large Language Model: LLM)を使って、動画-テキスト間の表現学習を行う研究。

---

# 2. 新規性
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/37f28c5e-8dd8-3597-6f6b-ecea0ae58ad9.png)
事前学習済みのLLMを画像系の入力に合わせて調整し、自動で動画に対するテキストの説明がつくようにファインチューニングしている。LLMを事前学習モデルとして、画像系にチューニングしても汎化性を失わないようにした。

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/b5c3d323-3449-34b3-70e0-cc7f3ff910ad.png)
テキストによるナレーション(説明キャプション)を入力としてテキストエンコーダーを用いて特徴量抽出し、テキストデコーダーを使用して出力した予測値を更に入力として自己回帰モデル(Auto Regressive)で生成していく。
動画部分は、エンコーダー部分とアテンションプーリング層で、パッチ単位の特徴を取得し、クロスアテンション(Cross-attention)層を使ったデコーダー(自己回帰モデル)でキャプション生成を行う。

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/55b2d8bb-a728-56a0-cfdf-3bc51deb451e.png)
ゼロショットによる推論結果とファインチューニングによる推論結果のいずれにおいても既存手法の精度を上回っている。動画は一人称視点でも三人称視点でも対応でき、Epic-Kitchens-100タスクで5.9%、EGTEAタスクで10.1%の精度向上を達成した。

---

Paper URL: <https://openaccess.thecvf.com/content/CVPR2023/papers/Zhao_Learning_Video_Representations_From_Large_Language_Models_CVPR_2023_paper.pdf>
last updates: July 4 2023
次世代SNS対応のための画像サイズまとめ (Bluesky・Threads)

かつてTwitterやFacebookで10000億回ぐぐったやつです。

# Bluesky

元Twitter社のCEO Jack Dorsey氏が作ったポストTwitterな分散型SNS (マストドンみたいなやつ)。

https://bsky.app/

## プロフィール画面
![image1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76653/7434a239-673b-64d5-65d2-7fd2d6f9f65a.png)

### ヘッダー画像

- PC: `1196x300px` (3.9:1)
- Mobile: `2340x900px` (2.5:1)

### アイコン画像

- `480x480px` 以上(？)
- 正方形 (丸トリミング)

## 画像投稿

![image2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76653/53bea40d-1191-d364-91a0-438088ed6554.png)

- 上限 4枚
- 1枚だと縦横比維持
  - 2枚だと正方形トリミングx2
  - 3枚だと正方形トリミング(大)と(小)x2
  - 4枚だと正方形トリミング(小)x4

## OGP画像(URL投稿)

![image3](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76653/11154c96-2bc5-5d0d-588e-217c0c5d0065.png)

- `1074x564px` 程度まで縮小
- 縦横比は維持

# Threads

Meta社(というかInstagram)が作ったポストTwitterな分散型SNS。

https://www.threads.net/

## プロフィール画面

![image4](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76653/88da73da-1430-13fc-59c6-0876a4e913f8.png)


### ヘッダー画像

なし

### アイコン画像

- `384x384px` 以上(？)
- 正方形(丸トリミング)

## 画像投稿

![image5](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76653/3b67c04f-4667-fd73-b08c-6fd66bed7548.png)

- 上限 10枚
- 1枚では縦横比維持
    - 2枚以上だと気持ち正方形寄り(？)にトリミングされての横スクロールスライダー
    - パノラマ画像を分割して「3枚で1枚」みたいにすることも (Instagramとかでよく見るやつ)

## OGP画像(URL投稿)

![image6](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76653/3056d9b2-1e5c-5b85-04a8-2d0f61d22af7.png)

- `1098x578px` 程度まで縮小しつつ若干トリミング
    - `1200x630px` 時換算で上下15px程度がトリミング

ざっくり以上です。

なお、Misskeyは誘ってくれる友達がいなくて何もわかりません。ぜひ誰か教えてください。
Docker を使った [試して理解] Linuxの仕組みの為の環境構築

## 概要
LinuxOS において，プロセス管理，プロセススケジューラ，メモリ管理など、OS とハードウェアに関する仕組みを体系的に解説している、 [[試して理解] Linuxの仕組み](https://www.amazon.co.jp/%EF%BC%BB%E8%A9%A6%E3%81%97%E3%81%A6%E7%90%86%E8%A7%A3%EF%BC%BDLinux%E3%81%AE%E3%81%97%E3%81%8F%E3%81%BF-%E2%80%95%E5%AE%9F%E9%A8%93%E3%81%A8%E5%9B%B3%E8%A7%A3%E3%81%A7%E5%AD%A6%E3%81%B6OS%E3%80%81%E4%BB%AE%E6%83%B3%E3%83%9E%E3%82%B7%E3%83%B3%E3%80%81%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98%E3%80%90%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%89%88%E3%80%91-%E6%AD%A6%E5%86%85-%E8%A6%9A/dp/429713148X) 、という書籍の中では様々な実験が行われています。ローカル環境に依存せず、誰でも簡単に実験環境を構築をすることが本記事の目的です。

## この記事の対象読者
- [[試して理解] Linuxの仕組み](https://www.amazon.co.jp/%EF%BC%BB%E8%A9%A6%E3%81%97%E3%81%A6%E7%90%86%E8%A7%A3%EF%BC%BDLinux%E3%81%AE%E3%81%97%E3%81%8F%E3%81%BF-%E2%80%95%E5%AE%9F%E9%A8%93%E3%81%A8%E5%9B%B3%E8%A7%A3%E3%81%A7%E5%AD%A6%E3%81%B6OS%E3%80%81%E4%BB%AE%E6%83%B3%E3%83%9E%E3%82%B7%E3%83%B3%E3%80%81%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98%E3%80%90%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%89%88%E3%80%91-%E6%AD%A6%E5%86%85-%E8%A6%9A/dp/429713148X) を使って、Linuxの勉強をしたい人
- Dockerの基本的なコマンドを扱える人
- MacOS や Windows 上でLinux環境を構築する必要がある人
- Linuxを使っているが、特定のバージョンで上記の書籍の実験を行いたい人

## Dockerfile
```
FROM ubuntu:22.04

# コンテナ内のタイムゾーン
ENV TZ=Asia/Tokyo

RUN apt update && apt install sudo

# 上記のタイムゾーンを設定する
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

RUN sudo apt update
RUN sudo apt install binutils build-essential golang sysstat python3-matplotlib python3-pil fonts-takao fio qemu-kvm virt-manager libvirt-clients virtinst jq docker.io containerd libvirt-daemon-system strace -y
RUN sudo adduser `id -un` libvirt
RUN sudo adduser `id -un` libvirt-qemu
RUN sudo adduser `id -un` kvm
```

## タイムゾーン設定の必要性
書籍内の実験に必要なライブラリをインストールする際、使用タイムゾーンの入力を求められます。
この手動入力を回避するため、Dockerfile内にてタイムゾーン設定するコマンドを記述しています。

## Docker コマンド例
Docker イメージのビルド
```
docker build . -t linux-practice
```

Docker コンテナの作成とディレクトリのマウント
```
docker run -p 5050:5050 -v $(pwd):/linux-practice -it linux-practice
```
MicroPython で RP2040 の PIO を使うサンプル その1

調べながら，自分なりの使用例をまとめてみました

# いろいろな方法でGPIO P25, P16, P17に値を書く

- `set()` と `.side()` を使う場合

```main.py
import machine, rp2

@rp2.asm_pio(
    set_init=
        rp2.PIO.OUT_HIGH, # P25用(BLUE LED)  初期値 H
    sideset_init=(
        rp2.PIO.OUT_HIGH, # P16用(GREEN LED) 初期値 H
        rp2.PIO.OUT_HIGH  # P17用(RED LED)   初期値 H
        )
    )
def prog():
    set(pins, 0b0).side(0b00)
    #        P25=L  P17=L P16=L

state_machine = rp2.StateMachine(
    0, prog,
    set_base=machine.Pin(25),
    sideset_base=machine.Pin(16)
    )

state_machine.active(1)
```

- ステートマシンを２つ使う例（あえて `mov()`使用）

```main.py
import machine, rp2

@rp2.asm_pio( out_init=(rp2.PIO.OUT_HIGH,rp2.PIO.OUT_HIGH) )
def prog_0():
    set(x, 0b00) # P17=L P16=L
    mov(pins, x)

state_machine_0 = rp2.StateMachine(0, prog_0,out_base=machine.Pin(16))
state_machine_0.active(1)

@rp2.asm_pio( out_init=rp2.PIO.OUT_HIGH )
def prog_1():
    set(x, 0b0) # P25=L
    mov(pins, x)

state_machine_1 = rp2.StateMachine(1, prog_1,out_base=machine.Pin(25))
state_machine_1.active(1)
```

- System から数値を送って GPIO P16, P17に値を書く（P25は`side()`で指定）

```main.py
import machine, rp2

@rp2.asm_pio(
    sideset_init=rp2.PIO.OUT_HIGH, # P25用
    out_init=(rp2.PIO.OUT_HIGH,rp2.PIO.OUT_HIGH), # P16 P17用
    out_shiftdir=rp2.PIO.SHIFT_RIGHT
    )
def prog():
    pull()                # TX FIFO -> OSR
    out(pins, 2).side(0)  # OSR -> pins 2bit, 0 -> P25
    pass

state_machine = rp2.StateMachine(
    0, prog,
    out_base=machine.Pin(16),
    sideset_base=machine.Pin(25)
    )

state_machine.active(1)
state_machine.put(0b00) # P17=L P16=L
```

# 備考

XIAO RP2040 を使っています。オンボードの3色LEDが P25(BLUE) P16(GREEN) P17(RED) に割り当てられていて，PIOのデバッグには重宝します。（Lで点灯 Hで消灯）

`out()` および `mov()`の出力は，ともに `out_init` で初期化し，`out_base` で先頭のピンを指定します。これが最初分からずに苦労しました。参考リンクの筆者さんに感謝です。



参考
- https://micropython-docs-ja.readthedocs.io/ja/latest/library/rp2.html
- https://micropython-docs-ja.readthedocs.io/ja/latest/library/rp2.StateMachine.html
- https://blueeyes.sakura.ne.jp/2021/02/05/3745/
VBAでCSVのヘッダーを取得

'VBAでCSVを取得しヘッダーのみを書き込む

Sub WriteCSVHeaderToActiveSheet()
    Dim filePath As String
    Dim delimiter As String
    Dim headerRow As String
    Dim headerItems() As String
    Dim i As Integer
    
    ' CSVファイルのパスを指定してください
    filePath = "C:\path\to\your\file.csv"
    
    ' CSVファイルの区切り文字を指定してください
    delimiter = ","
    
    ' CSVファイルをテキストとして開き、ヘッダー行を読み込む
    Open filePath For Input As #1
    Line Input #1, headerRow
    Close #1
    
    ' ヘッダー行を区切り文字で分割し、配列に格納する
    headerItems = Split(headerRow, delimiter)
    
    ' 配列の要素をアクティブシートのA列に書き込む
    For i = LBound(headerItems) To UBound(headerItems)
        Cells(i + 1, 1).Value = headerItems(i)
    Next i
End Sub
C#で数値をカンマ付き文字列に変換する方法

## はじめに
数値をカンマ区切りで表示することは、読みやすさや視覚的な整形に役立ちます。
C#には、組み込みのフォーマット機能やカスタムメソッドを使用して、
簡単に数値をカンマ付き文字列に変換する方法があります。

## 方法1: ToStringメソッドを使用する
C#の`ToString`メソッドを使用すると、数値をフォーマットして文字列に変換できます。具体的には、数値に対して`"N"`または`"N0"`というフォーマット指定子を使用することで、カンマ付きの文字列を得ることができます。以下は使用例です。

```csharp
int number = 1000000;
string formattedNumber = number.ToString("N0");
Console.WriteLine(formattedNumber);  // 結果: "1,000,000"
```

この例では、`number`の値を`ToString("N0")`でフォーマットし、`formattedNumber`という変数に代入しています。結果として得られる`formattedNumber`の値は`"1,000,000"`となります。

## 方法2: String.Formatメソッドを使用する
`String.Format`メソッドを使用することでも、数値をカンマ付き文字列に変換することができます。以下は使用例です。

```csharp
int number = 1000000;
string formattedNumber = String.Format("{0:N0}", number);
Console.WriteLine(formattedNumber);  // 結果: "1,000,000"
```

この例では、`String.Format`メソッドの書式指定文字列`"{0:N0}"`を使用して、`number`の値をフォーマットしています。結果として得られる`formattedNumber`の値は同じく`"1,000,000"`となります。

## 方法3: 文字列補間を使用する
C# 6.0以降では、文字列補間（String Interpolation）機能を使うことで、より簡潔に数値をカンマ付き文字列に変換することができます。以下は使用例です。

```csharp
int number = 1000000;
string formattedNumber = $"{number:N0}";
Console.WriteLine(formattedNumber);  // 結果: "1,000,000"
```

この例では、文字列補間の構文`${number:N0}`を

使用して、`number`の値をフォーマットしています。結果として得られる`formattedNumber`の値はやはり`"1,000,000"`となります。
Qiitaの記事の書き方備忘録

# 目次の書き方について
```
#目次
[1.はじめに](#1-はじめに)
[2.内容](#2-内容)
[3.内容](#3-内容)
[4.内容](#4-内容)
[5.おわりに](#5-おわりに)
```
上のコードを入力することで目次を設定することができます
[つけたい名前] (リンク先)でハイパーリンクを設定することができる
# コードの書き方について

```py
for i in range(10):
          print(i)
```
__________________________________________
シフト@を押すと入力できる`を三つ並べたやつで書きたいコードを囲むことで
コードを記述することができる。

# 引用の書き方について
＞を半角で入力する！！！！！！
```
>引用
```
実際に書いたやつ
>引用

### 2重引用について
>引用
>>2重引用
________________________________________________________________
# 最後に
本当に必要最小限なQiitaの記事の書き方を書いてみました。
この程度のことを覚えるだけで記事をかけるのでQiitaの記事を書くのに
ハードルを感じていた方はぜひ試しに記事を書いてみてわいかがですか~?
対象シート以外を削除する

VBAでシートを削除

Sub DeleteAllSheetsExceptOne()
    Dim sheet As Worksheet
    Dim sheetToKeep As Worksheet
    Dim sheetNameToKeep As String
    
    sheetNameToKeep = "Sheet1" ' 保持するシートの名前を指定してください
    
    Application.DisplayAlerts = False ' 確認ダイアログを非表示にする場合
    
    For Each sheet In ThisWorkbook.Sheets
        If sheet.Name <> sheetNameToKeep Then
            sheet.Delete
        Else
            Set sheetToKeep = sheet
        End If
    Next sheet
    
    Application.DisplayAlerts = True
    
    If Not sheetToKeep Is Nothing Then
        sheetToKeep.Activate
        MsgBox "指定されたシート以外が削除されました。"
    Else
        MsgBox "指定されたシートが見つかりませんでした。"
    End If
End Sub
[Oracle Cloud] Oracle Database Autonomous Recovery Service

## はじめに

Oracle Database Autonomous Recovery Service
についての情報を纏めていく

## 関連ドキュメント

Oracle Cloud Infrastructureドキュメント 

https://docs.oracle.com/ja-jp/iaas/recovery-service/index.html

## サービスについて

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/275392f2-4448-ddf6-b260-0e58429af245.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/4d6b2280-ff2b-2f8d-fb6d-453d6337f298.png)

- RCV
    - 従来のObject Storageへの自動バックアップと仕組みは同じ。
    - メリットは下記の通り
        - バックアップ専用サーバーによる、“ランサム対策の強化”　
        - バックアップ時のDBサーバーの負荷軽減
        - 永久差分バックアップによる時間短縮。
        - 仮想フルバックアップからのリストアによるRTOの向上
- ZRCV
    - リアルタイム・データ保護は、リアルタイムのREDO転送で実現。(DataGuardと同じ仕組み)
    - 機能としてEEが必要なので、SEエディションでは動かない=提供不可

## サポートされているOracle Databaseリリース

https://docs.oracle.com/ja-jp/iaas/recovery-service/doc/recovery-service-database-support.html

- Oracle Database 19cリリース16 (19.16)以上
- Oracle Database 21cリリース7 (21.7)以上

## 利用までのフロー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/5753658d-c836-350f-8b9d-3c048d5d27eb.png)

## テナンシ構成 / 要件

https://docs.oracle.com/ja-jp/iaas/recovery-service/doc/getting-started-recovery-service.html#GUID-784C0956-A116-4D28-BE3E-2A2B240A5E1E

- 関連リソースのアクセス・管理をするためのポリシーをチェックする事（IAM）
- VCN内のプライベート・サブネットを使用する（リカバリ・サービス・サブネット）
    - 対象databaseと同じ、或いは別のサブネットでもok
    - 最小サイズが /24
    - セキュリティリストで、宛先port 8005 , 2484のステートフル・イングレス・ルールを設定する
- バックアップの保護ポリシーを確認する
    - 定義済みのplatinum , ゴールド , Silver , ブロンズでも良いし、カスタムで設定してもok

## 有効化

https://docs.oracle.com/ja-jp/iaas/recovery-service/doc/enable-automatic-backup.html#GUID-B8A2D342-3331-42C9-8FDD-D0DB0E25F4CE

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/514589af-682c-63fd-1e56-8e096f747e38.png)

自テナンシがサービス制限に達した為以降のキャプチャは割愛
Watson Discovery：Analyze APIを試してみた

# はじめに
Watson Discoveryの[Analyze API](https://cloud.ibm.com/apidocs/discovery-data#analyzedocument)を実行すると、入力された自然文に対してアノテーションした結果を返してくれます。

もう少し詳細に説明すると、コレクションに対して、ファセット辞書や、正規表現、文書分類器、などなどを適用していた場合、コレクションに分析対象の文書を投入しなくとも、APIで指定した自然文に対して分析した結果を返してくれます。

百聞は一見にしかずということで実際にやってみました。

# 前提
予めコレクションに以下を作成して適用しています。作成手順はここでは割愛します。
- 企業名を抽出する[ファセット辞書](https://cloud.ibm.com/docs/discovery-data?topic=discovery-data-domain-dictionary)
- かぎ括弧で囲まれた文字列を抽出する[正規表現](https://cloud.ibm.com/docs/discovery-data?topic=discovery-data-domain-regex)
- 記事が何の記事かを分類する[文書分類器](https://cloud.ibm.com/docs/discovery-data?topic=discovery-data-cm-doc-classifier)（映画エンターテイメント、スポーツ、家電、など）

# Analyze API
```python:Analyze API
input_text = '{"text" : "Googleで検索したところ、「リアル・スチール」はスティーブン・スピルバーグ監督の映画だったことがわかりました。"}'
textname = 'テスト'

response = discovery.analyze_document(
  project_id = project_id,
  collection_id = collection_id,
  file = input_text,
  filename = textname,
  file_content_type = 'application/json'
  ).get_result()
```

- `input_text` : ここに入力された文が分析対象となります。
- `textname` : これが何のために使われているかはよく分かりません。。。が、必須のようです。
- `analyze_document` : Analyze API


# 結果
### 期待する結果
入力テキスト `Googleで検索したところ、「リアル・スチール」はスティーブン・スピルバーグ監督の映画だったことがわかりました。` に対して期待する結果は以下です。
1. Google : 企業名を抽出するファセット辞書にヒットする
2. 「リアル・スチール」 : かぎ括弧で囲まれた文字列を抽出する正規表現にヒットする
3. 文書分類 : 映画エンターテイメント として分類される

### 結果
**1. 企業名を抽出するファセット辞書にヒットする単語**
```json:entities
  {
    "text": "Google",
    "type": "company_dic",
    "mentions": [
      {
        "text": "Google",
        "confidence": 1.0,
        "location": {
          "begin": 0,
          "end": 6
        }
      }
    ],
    "model_name": "Dictionary:.company_dic"
  },
```
`Google` が `company_dic` という `Dictionary` で抽出されていることがわかります。
ちなみに、 `company_dic` は自分で作ったファセット辞書の名前です。
***
**2. かぎ括弧で囲まれた文字列を抽出する正規表現にヒットする単語**
```json:entities
  {
    "text": "「リアル・スチール」",
    "type": "brackets_regex",
    "mentions": [
      {
        "text": "「リアル・スチール」",
        "confidence": 1.0,
        "location": {
          "begin": 15,
          "end": 25
        }
      }
    ],
    "model_name": "brackets_regex"
  }
```
`「リアル・スチール」` が `brackets_regex` という正規表現で抽出されていることがわかります。
ちなみに、 `brackets_regex` は自分で作った正規表現の定義の名前です。
***
**3. 文書分類**
```json
"document_level_enrichment": {
  "classes": [
    {
      "class_name": "movie-enter",
      "confidence": 0.5397826433181763,
      "classifier_name": "livedoor classifier_v0.1"
    }
  ]
}
```
文書分類器 `livedoor classifier_v0.1` の結果として `movie-enter`（映画エンターティメント）と分類されたことがわかります。
ちなみに、 `livedoor classifier` は自分で作った文書分類器の名前です。

# 参考

- [Analyze API を使用したオンデマンドでのデータ分析](https://cloud.ibm.com/docs/discovery-data?topic=discovery-data-analyzeapi)
- [Analyze a document](https://cloud.ibm.com/apidocs/discovery-data#analyzedocument)


# お断り
このサイトの掲載内容は私自身の見解であり、必ずしも所属会社の立場、戦略、意見を代表するものではありません。 記事は執筆時点の情報を元に書いているため、必ずしも最新情報であるとはかぎりません。 記事の内容の正確性には責任を負いません。自己責任で実行してください。
【ChatGPT無】嘘吐きを減らそう（その３）

:::note info
本記事は、ChatGPT（無料版）で
行なっております。GPT4での確認
はできておりません。あしからず。
:::

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

　今回は、
　　嘘吐きを減らそう
　　　第三段です。

　過去に
　　ふたつアップしました。

[【ChatGPT無】嘘吐きを減らそう](https://qiita.com/kabumira/items/2da48c6728b0c1f9a76d)

[【ChatGPT無】嘘吐きを減らそう（その２）](https://qiita.com/kabumira/items/94567d7411309f63e7a5)

　前者は、
　　「わからない・知らない」と
　　　　言いたくないChatGPTさんに
　　　　　ある程度、効きます。

　　よくあるのは、
　　　有名人・著名人のことを
　　　　尋ねると、それらしいことを
　　　　　言ってくるような場合。

　　それと、
　　　箇条書きなどで書き出す場合、
　　　　個数指定することがあります。
　　　　　ここで嘘吐きが
　　　　　　入ることが見られます。

　　　おそらく、
　　　　数を埋める、
　　　　　という理由ですね。

　　　そこで、
　　　　「無理に出さなくても
　　　　　いいんだよ」と示せば、
　　　　　　嘘吐きは少なくなります。

　後者は、
　　長々とした説明なんかを
　　　「ひと言」で言わせることで、
　　　　説明書きに、
　　　　　嘘が紛れ込まないように
　　　　　　抑えます。

　もちろん、
　　どちらも、
　　　嘘吐きを
　　　　少なくするだけです。
***
　さて、
　　第三段の今回は、
　　　**出力を限定させる**、です。

[【ChatGPT無】嘘吐きを減らそう（その２）](https://qiita.com/kabumira/items/94567d7411309f63e7a5)
　　の最後に、
　　　「ひと言縛り」で、
　　　　物語を書きました。
　　　　　これもそのひとつです。

　しかし、
　　すでに書いたものを
　　　また書くのも
　　　　マイソウルが許さない。
　　　　　（なんだ、それ）

　まぁ、
　　書いてもいいんですけどね。

　ゴホン、それは置いといて……

　私がアップする
　　Promptの多くは、
　　　質疑応答を繰り返すような
　　　　ルーティン・ワーカー化
　　　　　されたものが多い。

　そこでの出力を
　　思い出してください。

　翻訳機は、
　　言語Ａの人と
　　　言語Ｂの人とのやり取り。

　入力文章の要点を
　　まとめるものは、
　　　メールなどの内容。

　TODOリストをチェックするものは、
　　タスクひとつを表示するだけ。

　どれも、
　　嘘吐きの余地が
　　　ありません。

　残念ながら、
　　和Prompt→英→結果和訳は、
　　　嘘吐きがあっても
　　　　わかりにくいですがw

　とにかく、
　　**出力を固定化してしまう
　　　のがいい**、ということです。

　固定化とは、
　　出力例とか
　　　フォーマットとか
　　　　でですね。

　説明とかはいらないよ、
　　結果だけ欲しいのよ、
　　　テーブルだけでいいから、
　　　　と結果だけを求めるのです。
　　　　　（例えばですよ）

　固定化してしまえば、
　　嘘吐きの余地がなくなり、
　　　しゃべりたガールな（古）
　　　　ChatGPTさんも
　　　　　おいそれと
　　　　　　しゃべれないw
　　　　　　　計算結果は別として。
　　　　　　　　（厄介！）
***
　あっ、上記のタイトルを
　　変更しました。
「和Prompt→英→結果和訳Promptです」
　　↓
「日本語Promptを英訳して実行して結果を和訳するPromptです」

　いまいち、
　　わかりづらかった
　　　みたいですね。
***
　これで、
　　かなりの嘘吐きが
　　　減るはずです。

　完全では
　　ないでしょうけど。

　それでも、
　　ファクトチェックは、
　　　必要ですね。
　　　　頑張りましょう！
CentOS Stream9のphpの標準バージョンは？

ちょこっとメモ。
CentOS stream9(RedHat9) は php8.0 標準。
サポート期限（EOL）は、2027 年 5 月 31 日まで。

# 情報源
https://www.server-world.info/query?os=CentOS_Stream_9&p=php&f=1

## EOL

https://www.centos.org/centos-stream/
> End of RHEL9 full support phase.

### End of RHEL9 full support
https://access.redhat.com/support/policy/updates/errata#Full_Support_Phase
> May 31, 2027（2027 年 5 月 31 日）
JacksonでJSONとListを相互変換する

## JSON文字列をListに変換する

```Java
public static <T> List<T> convertToList(String json, Class<T> clazz) {
    List<T> list = null;
    if (!StringUtils.isEmpty(json)) {
        ObjectMapper mapper = new ObjectMapper();
        final CollectionType jt = mapper.getTypeFactory().constructCollectionType(List.class, clazz);
        try {
            list = mapper.readValue(json, jt);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }
    return list;
}
```
## ListをJSON文字列に変換する

```Java
public static <T> String convertToJson(List<T> list) {
    ObjectMapper mapper = new ObjectMapper();
    String json = "";
    if (Objects.nonNull(list)) {
        try {
            json = mapper.writeValueAsString(list);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return json;
}
```
ChatGPT を活用する Bluetooth LE 学習法

## 本記事について

Bluetooth Low Energy（BLE）の学習において、ChatGPT（GPT-3.5）を活用した経験を共有する。
ChatGPTの有効性について、具体的な使い方や効果についてまとめる。

## ChatGPTを使ったときの状況

直近の目的: 2つの M5Stack 間を BLE のコネクトモードを使って通信するプログラムを作ること
理解状況: 
- BLE の単語等コンセプトを深く理解できていない。
- 本やブログで実装の流れは浅く理解している。
- BLE の[サンプルコード](https://github.com/espressif/arduino-esp32/tree/master/libraries/BLE/examples)のリポジトリは把握していた。



![スクリーンショット 2023-07-06 7.53.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/ccc3bada-f2d3-17c1-4f63-96e2fb4b5850.png)

- しかし、種類が多く、どれを参考に作れば良いのかわからなかった。

## 相談内容

https://chat.openai.com/share/89d6237f-bef7-4fb2-92b8-0aa8e592ea96


### 使い方1 コンセプトの理解を深める

本やブログで学んだことを ChatGPT に質問として投げることで、返ってくる内容が自分の理解と一致してるかどうかを確かめることができる。

- ペリフェラルとセントラル、ペリフェラルが親機、セントラルが子機ですか？
- セントラルからペリフェラルに通信して指示を出すことは可能ですか？
- スキャンはセントラル側が行う？
- ScanとConnectって同じですか？

一つずつ壁打ちできるため頭にスッと入ってきた。

### 使い方2 ソースコードの理解をサポート

ChatGPTにソースコードを投げて、各行や特定のコードブロックについての詳細な解説や理解を深めることができる

- 次に貼るコードについて対話で理解を深めたいです。
- (コードを貼る)
- 各行について聞いていく
- このコードはセントラル用のコードという認識であってますか？

XX という認識であってますか？という質問は学習する上で非常に有用であるように感じた。
本やブログは自分の理解度の確認は行なってくれない.(実践テスト等は別)

本やブログで学習 (INPUT) -> ChatGPT で理解度確認 (OUTPUT) という流れが良さそう。

### 使い方3 情報整理

ChatGPTに特定の動作やシナリオの流れについて整理してもらうことで、BLEの動作や通信の流れについての理解を深めることができる。

- クライアントからサーバーに接続するまでの流れを整理してください


### 使い方4 情報収集
- BLE5とBLE4でscanの方法かわりますか？
- あえてBLE4のスキャンを使うメリットありますか？
- セントラルがBLE5でペリフェラルがBLE4のとき拡張スキャンを使うと問題ありますか？
- BLE5のセントラルとBLE4のペリフェラルは通信できますか？

ChatGPT は 2023/07 時点ではデフォルトでは必ずしも正しい答えを返してくれるわけではないし、一次情報も示してはくれない。
そのため聞いたあと情報の精査は必要。
とはいえ、聞くハードルがめちゃめちゃ低く、検索で必要そうなキーワードを示してくれるため、とりあえず ChatGPT に聞いてみるというのはアリだと思う。

### 使い方5 学習方法の壁打ち

私: BLE習熟の道としてScan -> Connect -> その他の順にそれぞれプログラム組んでみようかなと思います

ChatGPT: 素晴らしいアイデアです！BLEの習熟を目指す際に、Scan、Connect、およびその他の操作を個別のプログラムとして実装する方法は非常に効果的です。...


「XXは有効です」くらいの冷静なレスポンスが来ると思っていたが、めっちゃ褒めてもらえた。

## おわりに

上記の ChatGPT との会話を経てペリフェラル・セントラルのコンセプト・バージョンの違い等を理解でき、プログラムを書くまでの見通しがたてることができた。

https://ja.wikipedia.org/wiki/Bluetooth_Low_Energy

ChatGPT には技術によって得意・不得意がある。(枯れた・古い技術ほど答えが返ってきやすい)
BLE は 2016/12 に 5.0 が出て現在も現役と、割と古く、かつコンセプトは複雑で難しい。
まさに ChatGPT で学習するのにぴったりな内容だと思う。

今後も積極的に ChatGPT を活用していきたいなと思いました！
dockerの環境作成

①最初にDockerDesktopを起動する


Dockerfileは、Djangoアプリケーションを実行するために必要なPythonやDjangoなどの依存関係をインストールしたDockerイメージを構築するために使用

②docker imageを建てる
```
docker image build -t イメージ名 ビルドコンテキスト

docker image build -t my_image .
```
③Dockerfileを直接立ち上げる場合

「-t」はイメージ名・タグ名を指定するオプションです。上記例では「my_image」というイメージ名を指定しています。そのあとに続く「latest」はタグ名です。タグにはバージョン名を使うのが一般的で、最新版には慣例的に「latest」が使われます。

最後の「.」はカレントディレクトリにDockerfileがあるという意味
今いるディレクトリにdockerfileがないならpathを記載すればよい

```
docker build -t my-image docker_examples/docker_example1
ディレクトリ内のDockerfileを使用してイメージがビルドされる
```


docker-compose.ymlは、Djangoアプリケーションを実行するために必要な複数のDockerコンテナを組み合わせるために使用
Djangoアプリケーションは、Webサーバーとデータベースなどの複数のコンポーネントを必要とするため、docker-compose.ymlを使用してそれらを組み合わせることで、アプリケーションを実行することが可能
Django単一利用の場合はyml不要

④ymlファイルから立ち上げる場合
```
ls
docker-compose.yml	py3			workspace

①ディレクトリにdocker-compose.yml upがある場合
docker-compose -f docker-compose.yml up

②ディレクトリにdocker-compose.yml upがない場合
docker-compose -f docker/docker-compose.yml up
```
docker-compose.ymlの中にjupyter-labへのアクセス記載がある
```
    entrypoint: >
      jupyter-lab
      --allow-root
      --ip=0.0.0.0
      --port=8888
      --no-browser
      --NotebookApp.token=""
      --notebook-dir=/workspace　#作業ディレクトリ指定
    expose:
      - "8888"
    ports:
      - "127.0.0.1:8888:8888"
```

http://127.0.0.1:8888
か
http://localhost:8888
URLに貼り付けて入る


docker削除
削除したいdocker確認
```
docker ps

docker ps -a
```
削除したい[コンテナID]を入力してdocker削除
```
docker rm [コンテナID]
```
Gitlab×VScodeのgit cloneがうまくいかなかった話

# Gitlab×VScodeのgit cloneがうまくいかなかった話
## 困ったこと
Windows365PCで開発を始めるにあたりGit及びVScodeインストールとGitlabからのclone repository(git clone)を行ったところ、
以下のエラーが発生しGitlabリポジトリとの紐づけができない
```
failed to load library 'libcurl-4.dll'
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780477/007f2225-07dc-63c9-9086-3e0321c3ddc2.png)

## 試したこと

### GitとVScodeの再インストール
まずはGitlabとVScodeの再インストールを行い、PCの再起動後に再度clone repository
結果：同様のエラー発生！効果なし！
```
failed to load library 'libcurl-4.dll'
```
Gitを再インストールしたときに気づいたが、インストール完了直前にエラーが発生している。


### Gitインストール時エラーの解消を試みる（GitLFSのアンインストール）
```
git lfs uninstall
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780477/944ae888-3ae6-e2de-89e5-9f0e434fd330.png)

エラー内容は以下の通り
```
Unable to set system config "filter.lfs.process":="git-lfs filter-process":exit code 4294967295
stderr:
```
※上記のようなエラーが複数発生している。



結果：同様のエラー発生！効果なし！
```
failed to load library 'libcurl-4.dll'
```

### クラウドPCの初期化

最終手段と思ってクラウドPCを初期化し、再度GitlabとVScodeの再インストール。
※クラウドPCを初期化するときの注意
　初期化を行うとグローバルIPアドレスが変更されるためGitリポジトリへのアクセスにIP制限をかけている場合設定変更が必要なります。

結果：同様のエラー発生！効果なし！
```
failed to load library 'libcurl-4.dll'
```

### Gitのバージョンを変更
近い環境で正常に動作している同僚のPCで使用しているGitのバージョンに変更を試みる
2023年7月6日現在の最新バージョンは「Git-2.41.0-64-bit」
同僚の使用しているGitのバージョンは「Git-2.38.0-64-bit」
2.38.0のバージョンで再インストールを行った。

結果：エラーの内容が変わった！
```
> git clone https://<自分のリポジトリ>.git c:\<クローンしたいフォルダ名> --progress
fatal: unable to access 'https://<自分のリポジトリ>.git/': error setting certificate verify locations:  CAfile: C:/Users/???<ユーザー名>/AppData/Local/Programs/Git/mingw64/ssl/certs/ca-bundle.crt CApath: none
```
エラー内容的には証明書の検証場所の設定エラー？と思われるが、ユーザー名に含まれる文字の一部が???になってしまっている。
本来は「日本語氏名＋数字のID」となっているフォルダ名の日本語部分が文字化けのようになっている？

調査してみるとGitもVScodeもユーザーフォルダ（日本語を含むフォルダ）の配下のフォルダにインストールされていた。

## 最終的な解決方法
またまたまたGitもVScodeのアンインストール＆再インストール
今度は日本語のフォルダ名を含まないディレクトリ上にインストールを行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780477/291a6cd0-58fa-4760-c48e-3d6d3428b48b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780477/36aa81ed-55bd-a9e3-beb9-b0a9bd134a37.png)

結果：クローン成功！


## さいごに
結果的にはGitのバージョンを変えてインストールしたことでたまたまディレクトリパスの文字化けに気づくことができました。
やっぱりディレクトリ名に日本語は使っちゃいけませんね。
Managed Runtime API を呼んでみる

※ これから記載する事項は、私が所属する会社とは一切関係のない事柄です。

## Managed Runtime API で何ができるか？


デプロイ、メンバーの追加、環境の設定などの [Managed Runtime](https://developer.salesforce.com/docs/commerce/pwa-kit-managed-runtime/guide/managed-runtime-administration.html) でできるような操作を API を利用することで自身でツールを作ったり CI/CD の中に組み込んだりすることが可能になります。




## 呼んでみる

今回は「qiita-test」と言うプロジェクトの「production」環境の情報を API で取得してみたいと思います。

#### 1. API  キーの取得

[Managed Runtime](https://runtime.commercecloud.com/) にログインし、右上の「Account Settings」をクリックし、アカウント情報ページに遷移後、「Reset」ボタンをクリックします。
![スクリーンショット 2023-07-06 10.02.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/b716f361-351e-337e-ff68-7173d8dd26dd.png)


すると、下記画像のように API キーが表示されますのでコピーしておきましょう。

:::note
自身のローカル環境から PWA Kit のバンドルを [pwa-kit-dev](https://www.npmjs.com/package/pwa-kit-dev) コマンドで実行する場合にもこのキーが必要になりますので、下記画像の下の方の赤枠もコピーしておき `npx pwa-kit-dev@latest ~` で始まるコマンドも自身の使う PC で実行しておくことをお勧めします。
:::
![スクリーンショット 2023-07-06 10.04.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/17502530-4f1a-c55c-5ea8-f1e293850f23.png)




#### 2. プロジェクト ID の取得
プロジェクト ID はプロジェクト選択後に左ナビの「Project Settings」をクリックすると確認することができます。
![スクリーンショット 2023-07-06 10.51.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/bb16acfc-3ed5-484b-7724-30c56ada4776.png)




#### 3. 環境 ID の取得
環境 ID はプロジェクト・環境選択後に左ナビの「Environment Settings」をクリックすると確認することができます。
![スクリーンショット 2023-07-06 10.51.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/5bf5e0fd-7a14-0a4a-31c3-347c4588ae42.png)






#### 4. 環境情報を取得してみる
最後に上記で取得した情報を利用して環境情報を取得してみましょう！
サンプルとして CURL でのリクエストは下記のようになります。
```sh
curl --location 'https://cloud.mobify.com/api/projects/qiita-test/target/production/' \
--header 'Authorization: Bearer {API キー}'
```
このリクエストを下記のように Postman で実行すると環境情報が取得できているのを確認できます。
![スクリーンショット 2023-07-06 10.59.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/9c879aaa-712e-d329-324f-d4ddab52b7c8.png)





## リソース

* [Managed Runtime API リファレンス](https://developer.salesforce.com/docs/commerce/pwa-kit-managed-runtime/references/managed-runtime-api?meta=Summary)
ハイパーテキスト、ハイパーメディア、ハイパーリンク違いと特徴を理解する

Webに関する基礎知識を深めるために、なんとなくで覚えていたワードについて調べてまとめています。

「ハイパー」の名のつくWeb用語がいくつもありますが、その違いについてうまく説明できるようにしたいと思い、備忘録的にこちらに記録しておきます。

どなたかのお役に立てれば幸いです。




# ハイパーテキストとは？
ハイパーテキストとは、コンピュータを利用した文書作成・閲覧システムの一つで、文書内の任意の位置や要素に、他の文書への参照（所在情報や識別情報）を埋め込み、複数の文書を相互に結びつけたもの。

引用：https://e-words.jp/w/ハイパーテキスト.html

https://e-words.jp/w/%E3%83%8F%E3%82%A4%E3%83%91%E3%83%BC%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88.html


さらに特徴を整理すると、、、、

- ファイル同士を関連付ける仕組みである。
- ハイパーリンクで関連付ける
- 一番の有名どころはホームページ（Web）である。
- それぞれの情報は、リンクで結びついている
- それぞれの情報は、（ある程度は）内容が独立している
- それぞれの情報は、独立して作成・管理される
    -  紙媒体の本を修正するには、本自体を編集して再度出版しなければならない。
    -  だが、ハイパーテキストの場合、修正したいテキストのページだけいじれば良い。
    -  リンク全体を再作成する必要がない。



引用：

http://hs-www.hyogo-dai.ac.jp/~kawano/?Lecture%2FJouhouC2008%2F2nd%2FHypertext

https://wa3.i-3-i.info/word19063.html



# ハイパーメディアとは？
- ハイパーメディアとは、ハイパーテキストの拡張版である。
- リンクを作成してウェブページを接続し、マルチメディア要素でネットワークを構築します。
- Youtubeはよく知られている例である。
- ハイパーメディアはハイパーテキストを拡張したものですが、テキスト要素に限定されるものではありません。


引用：https://toumaswitch.com/624ki5fo9x/


https://toumaswitch.com/624ki5fo9x/




# ハイパーリンクとは？
- Webサイトによくあるリンクの事。押すと別の場所に移動する仕組み
- 主にハイパーテキストを関連づけるために用いられる
- そのリンクをハイパーリンクと呼ぶ


# ハイパーテキストとハイパーメディアの違い

ハイパーテキストとハイパーメディアの主な違いは、ハイパーテキストが他のテキストブロックへのリンクを含むテキストであるのに対し、ハイパーメディアはテキスト、オーディオ、イメージ、ビデオ、静止または動画グラフィックスを含むハイパーテキストの拡張部分であることです。

引用：https://toumaswitch.com/624ki5fo9x/

https://toumaswitch.com/624ki5fo9x/



# ハイパーテキストとハイパーリンクの違い
- ハイパーリンク：ポチっと押すと別の場所に移動する仕組み
- ハイパーテキスト：「ハイパーリンク」や「中にハイパーリンクが書いてあるファイル」を含む、ファイル間をあっちこっち行ったり来たりできる仕組み全体

引用：https://wa3.i-3-i.info/diff639web.html

https://wa3.i-3-i.info/diff639web.html




# 参考サイト
https://e-words.jp/w/%E3%83%8F%E3%82%A4%E3%83%91%E3%83%BC%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88.html

http://hs-www.hyogo-dai.ac.jp/~kawano/?Lecture%2FJouhouC2008%2F2nd%2FHypertext

https://wa3.i-3-i.info/word19063.html

https://toumaswitch.com/624ki5fo9x/
ActiveHash

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/5185026d-c394-a3ef-082d-ae688f826ad7.png)
１：データベースに保存しないデータ
変更されないデータの取り扱い方法
　例えば、都道府県名一覧やカテゴリーなど「基本的に変更されないデータ」があったとします。「基本的に変更されないデータ」は、データベースに保存する必要性がありません。一方、ビューファイルなどにそれらのデータを直接書いてしまうと、可読性に欠けます。
そのようなケースでは、ActiveHashが有用です。

２：ActiveHashアクティブハッシュ
　Active_Hashとは、都道府県名などの変更されないデータをモデルファイル内に直接記述することで、データベースへ保存せずにデータを取り扱うことができるGemです。
すなわち、Active_Hashを用いることで、モデルファイルに直接記述した変更されないデータに対して、ActiveRecordのようなメソッドを用いることができます。（例えば、allやcreateメソッドのことを指しています。）
Learning Human-to-Robot Handovers From Point Clouds


# 1. 概要
シミュレーション環境(Simulation)で学習したモデルやエージェントを現実世界(リアル)の環境に適用する手法のことを、Sim-to-Realと呼びロボットの制御や自動運転の開発で用いられる。この研究では、人間とアームロボット間の物の受け渡しがリアルタイムで行えるようにして人と協業するロボットの実現を行った。

---

# 2. 新規性
人からロボットへ物を手渡すための制御ポリシー(Control Policy)をどのように学習するかという、全体のフレームワークを初めて提案している。制御ポリシーとは、ロボットの挙動や動作を決定するためのアルゴリズムのことで、提案手法ではセンシングできた情報からどのような行動をとるかを決める方策を、シミュレーションベースで学習してから実際の人とのインタラクションで人の振る舞いをセンシングしながら試し、さらによりよい方策が得られるよう現在の行動をシミュレーションへの入力として最適化する。Human-in-the-Loopの形態をとっている。


---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/723d39bf-ab9a-9ac6-3b6b-689a13f8364f.png)
まず、セグメンテーションされたRGB画像と深度マップ(depth map)を入力し、セグメンテーションされたポイントクラウド(point cloud)を出力する。次に、PointNet++へセグメンテーション済みのポイントクラウドを入力し、セグメントごとに階層構造を持つような特徴表現を学習する。制御ポリシー(Control Policy)の行動と状態を選択して出力する。最後に、受け取った制御ポリシーの行動と状態から、ロボットの動作を決定しRGB画像と深度マップをレンダリングして出力する。
技術的には、ロボットの移動・把持位置計画、強化学習、自己教師有り学習などを組み合わせて一つのフレームワークとしている。

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/892fd24d-e468-dc06-7719-cee67d535bb9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/127866e2-2a48-edf8-4bef-93c7e21fa267.png)
特に物体ごとの調整はしていないが、バナナのような柔らかいものからプラスチック容器のような固いものまでリアルタイムで人から手渡されてつかむことができる。また、既存手法に比べて難しいデータセットのタスクでも大幅に精度を向上させている。

---

Paper URL: <https://openaccess.thecvf.com/content/CVPR2023/papers/Christen_Learning_Human-to-Robot_Handovers_From_Point_Clouds_CVPR_2023_paper.pdf>

last updates: July 3 2023
Generalizable Implicit Neural Representations via Instance Pattern Composers


# 1. 概要
通常のニューラルネットワークは入力データと出力データの間の明示的な関係を学習するが、その中間表現を学習する手法のことをImplicit Neural Representations(INRs)と呼ぶ。INRsではデータを表現するための関数そのものを学習するのではなく、その関数を生成するためのパラメータを学習することが特徴となっている。従来手法では各学習データセットごとにMLPを学習する方法が一般的だったが、この研究ではモダリティの異なるデータセットに対しても共通する表現を学習することでより一般化を図っている。

---

# 2. 新規性
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/56960cf6-695c-1d93-c291-ff2610e94213.png)
各学習データセットに固有の特徴はINRsの第二レイヤーで獲得できることを特定した。より汎用的なINRsモデルを学習するために、データセット間に共有される表現を学習しMLPの中間特徴や重みをチューニングする手法を提案している。特に、第二レイヤーの一つの重み行列だけをチューニングすることで、汎化性を持ったINRsを実現した。

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/84d7401f-6224-07a5-e2f0-e6d381e2390c.png)
ベースラインにはトランスフォーマーを使用し抽出した中間表現を行列の要素分解し、第二レイヤーのデータセットやインスタンスに依存する重みをチューニングする。残りの重みは、データセットやインスタンスに依存しない特徴を学習する。


---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/b388ca51-d23d-bf6a-2802-da258cc8a05c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/e30d2128-c2e5-5c1c-7091-23b68e26a250.png)
音声、画像、3Dモデルなどの様々なドメインで高いパフォーマンスを達成しており、第二レイヤーだけの重みを調整する効果を検証している。

---

Paper URL: <https://openaccess.thecvf.com/content/CVPR2023/papers/Kim_Generalizable_Implicit_Neural_Representations_via_Instance_Pattern_Composers_CVPR_2023_paper.pdf>

last updates: July 3 2023
MAGVIT: Masked Generative Video Transformer


# 1. 概要
動画を入力として一つのモデルから、将来のフレーム予測、フレーム間の補間、動画の解像度を上げる、隠された箇所を復元する、テキスト指示による動画編集など、10を超える様々なタスクを解く生成AIモデルを提案。

---

# 2. 新規性
動画生成系AIモデルにおいて、単一ネットワークからマルチタスクが解けるように学習をしており、なおかつ高速なリアルタイム推論を実現している。

---


# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/08bbe732-a2a6-9a49-3a9d-536b4539e87b.png)
3D-VQエンコーダーでは、入力の動画を離散的なトークンにベクトル量子化してデコーダー側で抽出した特徴量をピクセル空間にマッピングする。学習の各ステップでタスクの中から一つをサンプリングし、動画をクロップしてリサイズしたりパディングして制約条件としておく。(図の緑色の箇所が有効なピクセル、白色の箇所がパディング)
これらの制約条件も3D-VQエンコーダーで量子化し、パディングされていない部分を条件付けされたトークンとして選択する。これらの条件付けされたトークンと、マスクされたトークンと、生動画から得られるビジュアルトークンとをランダムに組み合わせる。これらのトークンの組み合わせを双方向なトランスフォーマー(bidirectional transformer)に入力し、ターゲットとなるトークンを予測する方法を学習する。

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/be4aed99-2bcb-6b06-af68-bcba8d6cdb3c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/a2399ae0-ecbc-1dcc-5e69-4c277ee19902.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/d99c0133-57b7-9cae-2b37-1d628a4368ec.png)
マスク生成にはコサインカーブをスケジュールに利用している。高速な推論が可能で、また各種データセットで従来手法と比べてかなりの改善を実現している。

---

Paper URL: <https://openaccess.thecvf.com/content/CVPR2023/papers/Yu_MAGVIT_Masked_Generative_Video_Transformer_CVPR_2023_paper.pdf>

last updates: July 3 2023
EXIF As Language: Learning Cross-Modal Associations Between Images and Camera Metadata


# 1. 概要
写真を撮るとカメラは自動でメタデータを画像ファイルにタグ付けして記録する。この研究では、このメタデータを学習してカメラのプロパティ情報を学習できないかと考え、画像パッチとカメラのメタデータ間のマルチモーダルな特徴を学習し、画像の改竄やデジタル編集を検知する画像フォレンジクス(Image Forensics)に応用した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/b9464cd5-ad89-55db-c387-de34cf0e2039.png)

---

# 2. 新規性
カメラの撮影記録が示されたメタデータをテキストとしてトランスフォーマーで特徴抽出し、画像との関連性をマルチモーダルに学習した最初の論文。

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/3bb12959-030c-5ab9-d313-b7a525ddc2c8.png)
画像とテキストの特徴をトランスフォーマーを使ってCLIPのように統合していく。ここで、テキスト入力はカメラのメタデータであるEXIFファイルで、カメラのモデルや露光時間、ホワイトバランス、日時などカメラ設定に関わる情報が含まれる。一方、撮影された画像はパッチ単位でトランスフォーマーを使って特徴抽出される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/f825ca70-d0bf-f8d7-2278-be1c99f7228f.png)
カメラパラメータとペアで学習された画像パッチの特徴を調べると、抽出された画像パッチの特徴が同じ機種のカメラなどカメラのメタデータに照らし合わせて同様機種での類似度を計算することができる。その中から、類似していないパッチを選ぶと画像が改ざんされた可能性が高い箇所を推定できる。学習済みのCLIPライクな重みだけを使って、ゼロショットで検知することが可能。

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/629d4658-06fb-b992-6bb3-9f5bbf488c56.png)
人の目で判別することが難しいデジタル編集やいわゆるDeep Fake画像に対して、ゼロショットで加工された箇所を検知できる。

---

Paper URL: <https://openaccess.thecvf.com/content/CVPR2023/papers/Zheng_EXIF_As_Language_Learning_Cross-Modal_Associations_Between_Images_and_Camera_CVPR_2023_paper.pdf>

last updates: July 3 2023
【S3 Kotlin】オブジェクトのダウンロードと並行して暗号化または復号を行う

KotlinのInputStreamとuse関数を使用して、S3からオブジェクトをダウンロード**しながら**暗号化または復号を行う

# ストリーム処理のメリット

### メモリ効率

オブジェクトの取得と暗号化を並行して行うことで、全体をメモリにロードすることなく処理することができるため、メモリ使用量が抑えられる。

### パフォーマンス

取得と暗号化を並行して行うことで、I/O待ちの時間を短縮させることが期待できる。

### エラー処理

use関数は、処理の完了時やエラー発生時に自動的にリソースを解放するため、例外が発生した場合でも適切なリソースの解放が行われ、リソースリークを防止できる。

# 実装

- S3クライアントは、`S3Client`を使用する
    - `S3Client`は「AWS SDK for Java 2.x」で使用可能
- 暗号化と復号には、`AWS Encryption SDK`を使用する

```kotlin
val s3Client = S3Client.builder()
    .region(Region.AP_NORTHEAST_1)
    .build()

// AWS Encryption SDKのエントリポイント
val awsCrypto = AwsCrypto.builder().build()
val masterKeyProvider = KmsMasterKeyProvider.builder().buildStrict("ここにKMSのARN")

// オブジェクトをダウンロードしながら暗号化または復号する
s3Client.getObject {
    it.bucket("ここにダウンロード先のバケット名")
    it.key("ここにダウンロード先のオブジェクトキー")
}.use { inputStream ->

    // 暗号化
    val byteArray = awsCrypto.createEncryptingStream(masterKeyProvider, inputStream).readAllBytes()
    // 復号の場合、createDecryptingStreamを使用する
    // val byteArray = awsCrypto.createDecryptingStream(masterKeyProvider, inputStream).readAllBytes()
    
    s3Client.putObject(
        PutObjectRequest.builder()
            .bucket("ここにアップロード先のバケット名")
            .key("ここにアップロード先のオブジェクトキー")
            .build(),
        RequestBody.fromBytes(byteArray)
    )
}
```

:::note warn
要件次第ですが、実際には以下のようなことに注意すること！！
- 暗号化したデータを保存したら、生のデータは削除する
- サイズが大きい場合、マルチパートアップロードを使用する
:::

# SdkClientExceptionが発生した場合

S3クライアントを作成する際に`SdkClientException`が発生した場合、
以下のように、明示的に同期HTTPクライアントを指定すると正常に動作するかと思われる。

```kotlin
// ここでSdkClientExceptionが発生した場合
val s3Client = S3Client.builder()
    .region(Region.AP_NORTHEAST_1)
    .build()

// 明示的に同期HTTPクライアントを指定する
val httpClient = ApacheHttpClient.builder().build()
val s3Client = S3Client.builder()
    .region(Region.AP_NORTHEAST_1)
    .httpClient(httpClient)
    .build()
```

:::note info
デフォルトで`ApacheHttpClient`が設定されている（[参考](https://docs.aws.amazon.com/ja_jp/sdk-for-java/latest/developer-guide/http-configuration.html)）
:::



# Gradleの設定

```gradle
dependencies {
    implementation("com.amazonaws:aws-java-sdk-s3:ここにバージョン")
    implementation("com.amazonaws:aws-encryption-sdk-java:ここにバージョン")
    // ApacheHttpClientを使用する際に必要
    implementation("software.amazon.awssdk:apache-client:ここにバージョン")
}
```

それぞれのバージョンは、[こちら](https://mvnrepository.com/)から確認すること。

:::note warn
Mavenを使用している場合は、[こちら](https://docs.aws.amazon.com/ja_jp/sdk-for-java/latest/developer-guide/setup-project-maven.html)を参考に設定してください。
:::
API GatewayにWAFを配置してIP制限を実施する

## はじめに
既存の構成にAWS WAFを追加してIP制限を実施しました。WAFはCloudFrontやALBと組み合わせて使われることも多いと思いますが、今回はAPI Gatewayの前段に配置する構成を試してみました。
以下の赤枠の部分です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484097/8eeaf1e4-f413-7ea3-05f5-7158d8fc5641.png)
その他の構築については、以下の記事などで記載しているのでもし興味があればどうぞ。↓

https://qiita.com/kennyQiita/items/b5d4549cb61899d52091

以下の順序でWAFを作成していきます。
1. IP Setの作成
1. WEB ACLの作成

## IP Setsの作成
今回はIPリストを作成しホワイトリスト方式でIPアクセス制限を実施する検証をしました。手順2のWEB ACLの作成画面にて対象のIPリストを選択するステップがあるため、先にIP Setを作成しておく必要があります。
WAFのコンソール画面から`IP Sets`を選択し、以下のように簡単にIPリストを作成できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484097/40018e14-bef4-12b0-3b39-8eaeaca82cf5.png)
（※上図では文字`x`を使っているため赤文字エラーが出ています。実際のIPを入力すればエラーは消えます）

## Web ACLの作成
`AWS WAF` >> `Web ACLs`からWeb ACSを作成していきます。`Associated AWS resources`から対象のAPIを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484097/12a397a4-3965-2802-6f9d-8860460b3418.png)

次の設定ページでは`Add my own rules and rule groups`を選択し、`Rule type`を`IP Set`とします。先ほど作成したIP Setを選択し、今回はホワイトリスト形式のIP制限を実施したいのでActionに`Allow`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484097/fb77cb87-9085-fea7-ebde-8d7f99e49df4.png)

ルールの追加が完了したらデフォルトのACLアクションとして`Block`を選択します。これでホワイトリストに登録されていないIPからのリクエストはブロックされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484097/cc2e9f4c-2ef7-528f-0ce7-2c04a8f2858c.png)

今回適用しているルールは今作成した１つのみなので、優先順位はそのままNextをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484097/0b179f93-f624-d17b-1534-ead940c10854.png)

CloudWatchメトリクスの名前を設定します。リクエストのサンプリングもそのままONとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484097/9121062d-aed5-8160-318a-cb466d49565f.png)

これで設定項目は以上です。最後にReviewしてCreateすれば約1分ほどでWAF(Web ACS)が適用されます。早い！！

## 動作確認
まずはIP Setに登録したホワイトリストに含まれるIPからリクエストを実施します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484097/31a37038-bf0a-1efb-047c-9a0804f66fdd.png)
無事にリクエストがAPI Gatewayまで届いています。

次にホワイトリストに含まれないIPからリクエストを実施します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484097/5a660aef-4575-685b-e78a-49f3236204cf.png)
ステータス`403`の`Forbidden`が返ってきました。先ほど作成したWAFによってリクエストがブロックされていることが確認できました。ちなみのこのステータスコードやメッセージの中身はカスタマイズすることも可能です。

## 終わりに
WAFの構築がものすごく早く完了したことにまず驚きました。またバックエンドの仕組みをAWSサービスで構築している場合はネイティブに統合できるのもやはり便利です。
今回は簡単なIP制限を実施したのみでしたが、特定のHeaderにセットされる文字列を検知するようなルールを作成したり、もしくはAWSが用意しているマネージドルールでBot攻撃やマルアクセスを検知するようなルールを追加することも可能です。
サービス利用が拡大するとそれだけアクセス回数や攻撃対象となるリスクも増える可能性が高くなると思うでの、このように簡単にセットアップできるWAFをうまく活用して少しでもセキュアなWebサービスを構築していきたいです。

## 参考記事
https://qiita.com/zumax/items/8fbe699d76b2f8684a18

https://dev.classmethod.jp/articles/api-gateway-stage-waf/