OmniAICreator/Qiita-1.07M huggingface dataset:
Viteプロジェクトを GitHub Pages にデプロイする方法

# はじめに
ViteでビルドしたReactプロジェクトをGitHub Pagesにデプロイする方法を説明している記事があまりなかったため作成しました。

# デプロイの手順
## 1. 必要なパッケージのインストール

まず、`gh-pages`パッケージをインストールします。これは、GitHub Pagesへのデプロイを簡単にするツールです。

```bash
npm install gh-pages --save-dev
```

https://www.npmjs.com/package/gh-pages

## 2. package.jsonの設定

`package.json`ファイルに以下の内容を追加します：

```json
{
  "homepage": "https://<ユーザー名>.github.io/<リポジトリ名>/",
  "scripts": {
    "predeploy": "npm run build",
    "deploy": "gh-pages -d dist"
  }
}
```

- `<ユーザー名>`を自身のGitHubユーザー名に置き換えてください。
- `<リポジトリ名>`を自身のGitHubリポジトリ名に置き換えてください。

## 3. vite.config.jsの設定

`vite.config.js`ファイルを開き、`base`オプションを追加します：

```javascript
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react-swc'

export default defineConfig({
  plugins: [react()],
  base: '/<リポジトリ名>/',
})
```

`<リポジトリ名>`を作成したGitHubリポジトリ名に置き換えてください。

## 4. ビルドとデプロイ

以下のコマンドを実行してプロジェクトをビルドし、GitHub Pagesにデプロイします：

```bash
npm run deploy
```

このコマンドは、まず`predeploy`スクリプトを実行してプロジェクトをビルドし、次に`deploy`スクリプトを実行してGitHub Pagesにデプロイします。

## 5. GitHub Pagesの設定

1. GitHubのリポジトリページに移動します。
2. 「Settings」タブをクリックします。
3. 左側のメニューから「Pages」を選択します。
4. 「Source」セクションで、ブランチを「gh-pages」に設定します。
5. 「Save」をクリックします。

## 6. デプロイの確認

`https://<ユーザー名>.github.io/<リポジトリ名>/`で利用可能になります。

# まとめ
ViteでビルドしたReactプロジェクトをGitHub Pagesにデプロイする方法を簡単にまとめてみました。
間違っている部分、これでできなかったなどあればコメントにてお願いいたします。
マクロ

Sub CopyBasedOnColor()
    Dim ws As Worksheet
    Dim cell As Range
    
    ' シートを指定
    Set ws = ThisWorkbook.Sheets("【調査】利用者")
    
    ' F12:F500のセルをチェック
    For Each cell In ws.Range("F12:F500")
        If cell.Interior.ColorIndex = 3 Then ' 赤色の場合
            ws.Cells(cell.Row, "H").Value = cell.Value
        ElseIf cell.Interior.ColorIndex = 5 Then ' 青色の場合
            ws.Cells(cell.Row, "I").Value = cell.Value
        End If
    Next cell
End Sub
AWS IAMポリシーをわかりやすく解説～Part1～

## はじめに

AWS (Amazon Web Services) を使い始めると、必ず出会うのが **IAM (Identity and Access Management)** です。IAMは、AWSリソースへのアクセスを安全に管理するための仕組みで、いわばAWSのセキュリティの要と言えるでしょう。今回は、AWS初心者でも理解できるよう、IAMポリシーの基本的な仕組みを解説していきます。

### IAMポリシーとは？

IAMポリシーは、誰がどのAWSリソースにアクセスできるかを定義するルールセットです。例えば、特定のユーザーにS3バケットへの読み取りアクセス権を与えたり、特定のロールにEC2インスタンスの起動権限を与えたりすることができます。

### IAMポリシーの構成要素

IAMポリシーは、**ステートメント**と呼ばれる一連のルールで構成されています。各ステートメントは、以下の5つの要素で構成されます。

* **効果 (Effect):** ステートメントがアクセスを許可するのか拒否するのかを指定します。`Allow` (許可) または `Deny` (拒否) のいずれかになります。
* **プリンシパル (Principal):** アクセスを許可または拒否されるエンティティを指定します。ユーザー、グループ、ロールなどが含まれます。
* **アクション (Action):** プリンシパルが実行できる操作を指定します。例えば、`s3:GetObject` (S3オブジェクトの取得)、`ec2:RunInstances` (EC2インスタンスの起動) などがあります。
* **リソース (Resource):** プリンシパルがアクセスできるAWSリソースを指定します。例えば、`arn:aws:s3:::my-bucket` (S3バケット `my-bucket`) や `arn:aws:ec2:ap-northeast-1:123456789012:instance/i-1234567890abcdef0` (EC2インスタンス `i-1234567890abcdef0`) などがあります。
* **条件 (Condition):** ステートメントが適用される追加の条件を指定します。例えば、特定のIPアドレスからのアクセスのみ許可する、特定の時間帯のみアクセスを許可するなどがあります。

### IAMポリシーの評価

IAMポリシーは、**ステートメントマッチング**と呼ばれるプロセスを使用して評価されます。ステートメントマッチングでは、IAMはリクエストされたアクションと認可コンテキストを比較して、ステートメントがマッチするかどうかを判断します。

例えば、ユーザーAがS3バケット `my-bucket` からオブジェクトを取得しようとした場合、IAMは以下のようなプロセスでステートメントを評価します。

1. ユーザーAにアタッチされているIAMポリシーを取得します。
2. ユーザーAのリクエスト (S3オブジェクトの取得) と認可コンテキスト (ユーザーAのアカウント、IPアドレスなど) を取得します。
3. IAMポリシー内の各ステートメントを評価し、リクエストとマッチするステートメントを探します。
4. マッチするステートメントが見つかった場合、そのステートメントの効果に基づいてアクセスを許可または拒否します。
5. マッチするステートメントが見つからなかった場合、アクセスは拒否されます。

### IAMポリシーの種類

IAMポリシーは、主に以下の3つの種類があります。

* **IDベースのポリシー:** ユーザーやグループに直接アタッチされ、きめ細かなアクセス権を管理するために使用されます。
* **サービスコントロールポリシー:** AWS組織全体で適用され、広範なセキュリティ上の制限を管理するために使用されます。
* **リソースベースのポリシー:** S3バケットやEC2インスタンスなどのリソースに直接アタッチされ、リソースへのアクセスを管理するために使用されます。

### まとめ

IAMポリシーは、AWSリソースへのアクセスを管理するための強力なツールです。IAMポリシーを使用して、適切なアクセス権をユーザーやグループに付与し、AWS環境のセキュリティを強化することができます。AWSを使い始める際には、IAMポリシーについて理解しておくことが重要です。

### 参考資料
[IAM Policy Evaluation Series: AWS IAM policy language explained ](https://youtu.be/qsF6Kauh2J4?si=vbKapx7jzlrwUFBZ)
Tullio備忘録

雑多な備忘録です。

```julia
 @tullio ΨXΨ_[i,α,β] := conj(Ψ[pad(i+m),α])*X[m+2,n+2]*Ψ[pad(i+n),β]  (i in 1:6, m in -1:1, n in -1:1)
```

```julia
@tullio Z[i,j,α,β] := conj(V[(m-1)*($N)+i,α]) * Λ[m,n] * V[(n-1)*($N)+m,β] 
```

## 左辺のインデックスについて
元々定義されている配列であれば、左辺でも数式が使えるっぽい
```julia
# NG
@tullio ρ[2*(m1-1)+s1, 2*(m2-1)+s2] := _ρ[m1,m2,s1,s2] (s1 in 1:2, s2 in 1:2, m1 in 1:N, m2 in 1:N) 

# OK
ρ = zeros(ComplexF64,2N,2N)
@tullio ρ[2*(m1-1)+s1, 2*(m2-1)+s2] = _ρ[m1,m2,s1,s2] (s1 in 1:2, s2 in 1:2, m1 in 1:N, m2 in 1:N) 
```

# 練習問題
```julia
using Tullio
using LinearAlgebra
using BenchmarkTools

# 2-Matrix mutltiplication
X = randn(100,100)
Y = randn(100,100)

Z = X * Y
@tullio Z_tu[i,j] := X[i,k] * Y[k,j]

@show Z ≈ Z_tu

display(@benchmark Z = X * Y)
display(@benchmark @tullio Z_tu[i,j] := X[i,k] * Y[k,j])


# 3-Matrix mutltiplication
X = randn(100,100)
Y = randn(100,100)
Z = randn(100,100)

A = X * Y * Z
@tullio A_tu[i,j] := X[i,k] * Y[k,l] * Z[l,j]

@show A ≈ A_tu

display(@benchmark A = X * Y * Z)
display(@benchmark @tullio A_tu[i,j] := X[i,k] * Y[k,l] * Z[l,j])

# Trace of Matrix
X = randn(1000,1000)

tr_X = tr(X)
@tullio tr_X_tu := X[i,i]

@show tr_X ≈ tr_X_tu

display(@benchmark tr_X = tr(X))
display(@benchmark @tullio tr_X_tu := X[i,i])


# for loop -> Tullio
X = randn(10,10)
Y = randn(100)

Z = zeros(10,100-9)
for i in 1:10, j in 1:100-9
  for k in 1:10
    Z[i,j] += X[i,k] * Y[j+(k-1)]
  end
end

@tullio Z_tu[i,j] := X[i,k] * Y[j+(k-1)] (i in 1:10, j in 1:100-9, k in 1:10)
@tullio Z_tu_2[i,j] := X[i,k] * Y[j+(k-1)] # 実は長さを判別してこっちでもうまくやってくれる

@show Z ≈ Z_tu
@show Z ≈ Z_tu_2

display(@benchmark begin
  Z = zeros(10,100-9)
  for i in 1:10, j in 1:100-9
    for k in 1:10
      Z[i,j] += X[i,k] * Y[j+(k-1)]
    end
  end
end)
display(@benchmark @tullio Z_tu_2[i,j] := X[i,k] * Y[j+(k-1)])


# padding for edge evaluation
J = randn(3,3)
Ψ = randn(1000)

JΨ = zeros(3,1000)
for i in 1:3, j in 2:999 # without edge site
  for k in 1:3
    JΨ[i,j] += J[i,k] * Ψ[j+(k-2)]
  end
end
JΨ[:,1] = J[:,2:3]*Ψ[1:2]
JΨ[:,1000] = J[:,1:2]*Ψ[999:1000]

@tullio JΨ_tu[i,j] := J[i,k] * Ψ[pad(j+(k-2))] (j in 1:1000)

@show JΨ ≈ JΨ_tu

display(@benchmark begin
  JΨ = zeros(3,1000)
  for i in 1:3, j in 2:999 # without edge site
    for k in 1:3
      JΨ[i,j] += J[i,k] * Ψ[j+(k-2)]
    end
  end
  JΨ[:,1] = J[:,2:3]*Ψ[1:2]
  JΨ[:,1000] = J[:,1:2]*Ψ[999:1000]
end)
display(@benchmark @tullio JΨ_tu[i,j] := J[i,k] * Ψ[pad(j+(k-2))] (j in 1:1000))
```
モダンWeb開発の要、Ajax通信とaxiosライブラリを解説！

# モダンWeb開発の要、Ajax通信とaxiosライブラリを解説！

こんにちは、Webデベロッパーの皆さん！今日は、現代のWeb開発には欠かせないAjax通信と、それを簡単に実装できるaxiosライブラリについてお話しします。

## Ajaxって何？

まず、Ajaxについておさらいしましょう。Ajax（Asynchronous JavaScript and XML）は、ページ全体をリロードすることなく、サーバーとデータをやり取りする技術です。昔はXMLを使っていましたが、最近はJSONが主流になっています。

Ajaxの魅力は、ユーザーの操作を中断させずにバックグラウンドでデータを更新できること。例えば、SNSの「いいね！」ボタンを押したときに、ページ全体がリロードされずに数字だけが更新される、あれがAjaxです！

## Ajaxの通信フロー

Ajaxの通信は、大まかに次のような流れで行われます：

1. クライアント（ブラウザ）からサーバーにリクエストを送信
2. サーバーがリクエストを処理し、データを返送
3. クライアントが受け取ったデータを使って、ページの一部を更新

この仕組みを支えているのが、JavaScriptのXMLHttpRequestオブジェクト。でも、これを直接扱うのは少し面倒...そこで登場するのが、axiosです！

## axiosライブラリの魅力

axiosは、HTTP通信を簡単に行えるJavaScriptライブラリです。Node.jsでも使えるので、フロントエンドもバックエンドも、これ一本でOK！

axiosの特徴は：

- Promiseベースの簡潔な書き方
- 自動的なJSONデータ変換
- リクエストとレスポンスの簡単な設定

さらに、最新のasync/await構文と組み合わせれば、非同期処理がまるで同期処理のように書けちゃいます。コードがすっきり読みやすくなりますよ！

## 実践！axiosを使ってみよう

axiosの使い方は本当に簡単です。例えば：

```jsx
import axios from 'axios';

async function fetchData() {
  try {
    const response = await axios.get('<https://api.example.com/data>');
    console.log(response.data);
  } catch (error) {
    console.error('エラーが発生しました:', error);
  }
}

```

こんな感じで、非同期のデータ取得が驚くほど簡単に書けます。

## まとめ

Ajax通信は現代のWeb開発には欠かせない技術です。そして、axiosを使えば、その実装がグッと簡単になります。ぜひ、みなさんも自分のプロジェクトに取り入れてみてください！

次回は、Reactと組み合わせたaxiosの活用法について深掘りしていきます。お楽しみに！
aws アカウントメモ

awsアカウントについて

1 PCに登録されているリストの確認
```
$ aws configure list-profiles
xxx-xxxx
default
xxxx.xxxx.xxx
xxx-xxx-xxx
```

2  詳細内容確認（アクセスキーちらみせ）

```
$ aws configure list --profile xxx-xxx-xxx
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile           xxx-xxx-xxx           manual    --profile
access_key     ****************xxx shared-credentials-file
secret_key     ****************xxx shared-credentials-file
    region           ap-northeast-1      config-file    ~/.aws/config
```

3 プロファイルがどこのアカウントだったか
```
(このプロファイルどのアカウントのものだっけ？というとき)

aws sts get-caller-identity --profile xxx
{
    "UserId": "",
    "Account": "",
    "Arn": "arn:aws:iam::xxxxx:user/x.xxx"
}
```
herokuとPostgreSQLの接続と使い方(初心者向け)

# herokuでデプロイしたアプリでPostgreSQLの接続方法

# ①まずはherokuにログインする
```
heroku login
```
# ②herokuのアプリに接続する
```
heroku pg:psql -a <your-app-name>
```
例
```
heroku pg:psql -a talk
```


# PostgreSQLでのSQLのファイルの実行方法

# ①まずはsqlファイルを作る
sqlファイルは名前をファイル名.sqlにする

# ②sqlファイルを書く
sqlファイルにはそのままsqlを書く
```
SELECT カラム名
FROM テーブル名
```


# ③sqlファイルのパスを書く
PostgreSQLに接続した状態で,
```
\i C:/Users/ユーザー名前/ディレクトリ名/ファイル名.sql
```
とsqlファイルまでの絶対パスを書く.

例
```
\i C:/Users/tanaka/talk/script.sql
```
ESP32 WROVER FaceDetect


# 設定
* ArduinoIDE ver 2.3.3(UBUNTU) 
* ボードマネージャー ESP32 ver2.0.14
* ボード WROVER-KIT
* Partition Huge App
* PSRAM Enable
* ソース(スケッチ例) ESP32>camera>Camerawebserver
  修正箇所　
  #define CAMERA_MODEL_WROVER_KIT 及びssid,pass入れること


 <img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806156/5e2183bf-b6ae-1ddf-38fb-a548b62667de.png"> 


# 結果
URLにArduinoIDEのシリアルモニタに表示されるhttp://192.168.x.x を指定する。
顔認識の黄色枠出た時の画像。ESP32-CAMよりも安定している感がある。多少コスト払ってもWROVERの方がメリット多いかも知れない。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806156/46d828e8-2109-4366-b1e9-45c6e05c19f6.gif">
【Proxmox 8.x】外付け HDD を接続して本体とコンテナをバックアップする

# はじめに
この記事は、移行するときに書いたバックアップの手順を、あとから見やすくするためにバックアップの部分だけ改稿した記事になります。

https://qiita.com/waigoma/items/c3bb45c3be755c2db13b

# Web UI からそれぞれのコンテナをバックアップする
1. バックアップしたいコンテナを選択し、Backup タブに入る
1. 画面上部に表示される `Backup now` ボタンを押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348896/96131404-8954-845d-f053-eaf09b7af1c7.png)

1. お好みで設定し、`Backup` を押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348896/a4c2d9d1-8963-b164-6282-e6d4b831b4e4.png)

1. 最後に TASK OK が出れば完了
(出力の途中にある `creating vzdump archive` がバックアップ先のパスになっている)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348896/b0b91d20-0f26-f858-5314-a1d489e4542c.png)

:::note warn
ハードウェアパススルーしたマシンをバックアップしようとすると、パススルーした記憶領域もバックアップされるため注意
:::

# コンテナを外部 HDD にバックアップ
NTFS を接続できるようにパッケージをインストールしておく
```bash
apt install ntfs-3g
```

## 外部 HDD を接続する
```bash 
# 接続先を mkdir する
mkdir MOUNT_PATH
# 接続されているドライブを表示
lsblk -f
# ↑ で確認したドライブをマウントする
mount -t ntfs-3g -o rw DRIVE_PATH MOUNT_PATH
```
<details><summary>例</summary>

```sh
mkdir /mnt/usb
lsblk -f
# NAME                          FSTYPE      FSVER    LABEL  UUID  
# sdd                     
# ├─sdd1                        ntfs                 USB    8A
# └─sdd2                        vfat        FAT12    UEFI   5F
mount -t ntfs-3g -o rw /dev/sdd1 /mnt/usb
```

</details>

## HDD にバックアップファイルをコピーする
- コンテナ
```sh
# バックアップしたファイルをコピーする
# デフォルトでは　/var/lib/vz/dump/　に配置されている
cp -ai /var/lib/vz/dump/* MOUNT_PATH/backup/
```

- システム
```sh
# 移行手順にこのファイルバックアップするって書いてあったので多分これあれば復旧できる
cp -ai {/etc/pve,/etc/passwd,/etc/network/interfaces,/etc/resolv.conf} MOUNT_PATH/backup/
```

以上！
Accessの使いどころ

## 使いどころ
データの編集・加工にはSQLで処理するのがやりやすい

DB環境を整えるのが面倒、手順を自動化したい、手元のPCがWindowsである、
といったことであれば、Accessをおすすめする
実際に使った際の注意点等を備忘録として残す

## メリット
・DBを手軽に用意出来る
・SQLを使うことができるので、データ操作がやりやすい
・CSVファイルのインポート・エクスポートが簡単
・Oracleなど他のDBからもデータを取り込むことが出来る（ODBC接続などで）
・マクロ機能があるので、移行作業などが自動化できる

## デメリット
・大量データに弱い印象
　・クエリで、エラーが発生する（レジストリ変更で回避できたような・・・）
　・ある程度マシンパワーが必要になる

## ノウハウ
・リンクテーブルは便利だけど色々と気を付けなければならない
　・一度設定したら、データ型を変えることができない
　・INDEXを張れない
　・遅いことがある
　　リンクテーブルのデータソース（CSVファイルなど）があまり変化しないなら、
　　ローカルテーブルにしたほうが圧倒的に早くて制約も受けない
　　現実的には、実際１００万弱くらいの件数であれば問題無く処理できた
・「長いテキスト」型は、テーブルを結合するときの条件に使えない
・CSVファイルをテーブルにインポートするときに、Accessが提案してくるデータ型は注意
　たしか先頭の数行を見て判断しているので、例えば"00001"といった値を含む列が
 「数値型」となり、前ゼロが欠落してしまったりする
・CSVファイルインポート時に、「テキスト区切り記号」を設定すると、値に改行を含む
　ものであってもきちんと処理してくれる
　（値を""で括っていなかったのだが、区切り記号に"を指定するとなぜかうまくいった）
・値の前後に半角スペースが含まれていると勝手にトリムされる
【Mac】Wi-Fi の IPv6 ON/OFF を切り替える

# はじめに
この記事では、Terminal を利用して、Mac で Wi-Fi の IPv6 の ON/OFF を切り替える方法について記載します。

# 背景
開発時に利用するサービスが IPv6 で接続できなかったので、IPv6 の ON/OFF を切り替える方法を調べました。
最初は「システム環境設定 > Wi-Fi > [対象ネットワーク] > TCP/IP」に「IPv6 を構成」という項目があるので、そこから切り替えようとしました。しかし、「自動」以外の値に変更ができなかったので、Terminal を利用しました。

# 環境
環境は以下の通りです。

- MacBook Pro
- macOS Sonoma 14.5
- Apple M1 Pro

# 設定手順
設定には、`networksetup` コマンドを利用します。

https://support.apple.com/ja-jp/guide/remote-desktop/apdd0c5a2d5/mac

## 現状確認
まず、設定対象のネットワークを見つけます。

```powershell
networksetup -listallnetworkservices
```

```powershell
An asterisk (*) denotes that a network service is disabled.
Thunderbolt Bridge
Wi-Fi
```

次に対象ネットワークの情報を取得します。

```powershell
networksetup -getinfo Wi-Fi
```

IPv6 `Automatic` になっています。 

```powershell
DHCP Configuration
IP address: 192.168.3.8
Subnet mask: 255.255.255.0
Router: 192.168.3.1
Client ID: 
IPv6: Automatic
IPv6 IP address: none
IPv6 Router: none
Wi-Fi ID: **:**:**:**:**:**
```

## OFF にする
IPv6 を OFF にします。

```powershell
networksetup -setv6off Wi-Fi
```

OFF になっているか確認します。

```powershell
networksetup -getinfo Wi-Fi 
```

```powershell
DHCP Configuration
IP address: 192.168.3.8
Subnet mask: 255.255.255.0
Router: 192.168.3.1
Client ID: 
IPv6: Off
Wi-Fi ID: **:**:**:**:**:**
```

## ON にする
ON（`Automatic`）にします。

```powershell
networksetup -setv6Automatic Wi-Fi
```

ON（`Automatic`）になっているか確認します。

```powershell
networksetup -getinfo Wi-Fi
```

```powershell
DHCP Configuration
IP address: 192.168.3.8
Subnet mask: 255.255.255.0
Router: 192.168.3.1
Client ID: 
IPv6: Automatic
IPv6 IP address: none
IPv6 Router: none
Wi-Fi ID: **:**:**:**:**:**
```

# 参考
- [MacでIPv6をオフにする方法](https://engrmemo.jp/macos/mac-disable-ipv6/)
- [MacでIPv6を使用する](https://support.apple.com/ja-jp/guide/mac-help/mchlp2499/mac)
- [Remote Desktopのnetworksetupについて](https://support.apple.com/ja-jp/guide/remote-desktop/apdd0c5a2d5/mac)
Classic ASP(VBScript) 配列の要素数を変数で指定する

Classic ASP(VBScript)での開発で書き方に迷ったことを備忘録として残したいと思います。

# 目次
　[エラーが出たコード](#エラーが出たコード)
　[解決案](#解決案)
　[まとめ](#まとめ)
 
## エラーが出たコード

・エラー「整数型の定数がありません。」出力あり
```ASP:sample1.asp
Dim arraySize : arraySize = 3
Dim testArray(arraySize)
```
Dim で配列の要素数に変数で定義した配列を宣言するとエラーが出るみたい

## 解決案
動的配列として宣言したあとに配列を初期化する場合、上記のエラーを回避することができる
```ASP:sample2.asp
Dim testArray()
Dim arraySize : arraySize = 3
Redim testArray(arraySize)
```

## まとめ
私自身、Classic ASP(VBScript)での開発では、デバックの方法や文法に慣れていないので、こまめに挙動を確認しながら開発を進めていきたいと思いました。
【調査中】VSCode拡張機能でコンテキストメニューをツリー形式で表現したい

※こちらは調査中の内容です。間違っている可能性が高いです。

VSCode で自作拡張機能を作る際、エディタ上で右クリックした際にコンテキストメニューを表示させ、かつ、ツリーで表現したい。
web上に中々情報が転がっていないので、先生に聞いてみる。

## ChatGPTへの質問①

コンテキストメニューを作成したい
メニューを複数用意する際、下記2つのパターンがあると思われる

1. グルーピングして表示順を指定する方法
2. ツリー形式で親子関係をつけてまとめ、普段は子のメニュー項目は隠す方法

プログラミングにおいて、後者のパターンをなんと呼ぶか？


## ChatGPTの回答①

プログラミングにおいて、メニュー項目をツリー形式で親子関係をつけ、子のメニュー項目を普段は隠す形式は一般的に **「ツリービュー (Tree View)」** または **「ツリーメニュー (Tree Menu)」** と呼ばれます。

この形式は、ツリー構造でデータを視覚的に表示し、各ノード（親ノードや子ノード）を折りたたんだり展開したりできるインターフェースです。たとえば、ファイルシステムのディレクトリ構造を表示する際に使われることが多いです。

---
---

## ChatGPTへの質問②

VSCodeの拡張機能を作成する際、テキストエディタ上の任意の場所で右クリックした際に、ツリーメニュー形式のコンテキストメニューを表示させたい
実装方法を教えて

## ChatGPTの回答②

VSCodeの拡張機能で、テキストエディタ上の任意の場所で右クリックした際に、ツリーメニュー形式のコンテキストメニューを表示させるには、以下の手順を踏みます。

### 1. 拡張機能のセットアップ
まずはVSCodeの拡張機能の雛形を作成します。

```bash
# Yo codeを使って新しい拡張機能を作成
yo code
```

プロンプトに従って、拡張機能の名前や説明を入力します。

### 2. `package.json` でコマンドとメニューを定義
次に、`package.json` で以下のようにコマンドとメニューを定義します。

```json
{
  "contributes": {
    "commands": [
      {
        "command": "extension.parentCommand",
        "title": "Parent Command"
      },
      {
        "command": "extension.childCommand1",
        "title": "Child Command 1"
      },
      {
        "command": "extension.childCommand2",
        "title": "Child Command 2"
      }
    ],
    "menus": {
      "editor/context": [
        {
          "command": "extension.parentCommand",
          "group": "navigation",
          "submenu": [
            {
              "command": "extension.childCommand1",
              "when": "editorTextFocus"
            },
            {
              "command": "extension.childCommand2",
              "when": "editorTextFocus"
            }
          ]
        }
      ]
    }
  }
}
```

### 3. コマンドの実装
`src/extension.ts`（または生成されたメインのTypeScriptファイル）で、上記で定義したコマンドのロジックを実装します。

```typescript
import * as vscode from 'vscode';

export function activate(context: vscode.ExtensionContext) {
    let parentCommand = vscode.commands.registerCommand('extension.parentCommand', () => {
        vscode.window.showInformationMessage('Parent Command executed');
    });

    let childCommand1 = vscode.commands.registerCommand('extension.childCommand1', () => {
        vscode.window.showInformationMessage('Child Command 1 executed');
    });

    let childCommand2 = vscode.commands.registerCommand('extension.childCommand2', () => {
        vscode.window.showInformationMessage('Child Command 2 executed');
    });

    context.subscriptions.push(parentCommand, childCommand1, childCommand2);
}

export function deactivate() {}
```

### 4. 拡張機能の動作確認
拡張機能を実行するために、VSCodeで「F5」を押してデバッグモードで新しいウィンドウを開きます。テキストエディタ内で右クリックすると、「Parent Command」という項目が表示され、それにマウスをホバーすると「Child Command 1」と「Child Command 2」がサブメニューとして表示されるはずです。

このようにして、VSCodeの拡張機能でツリーメニュー形式のコンテキストメニューを実装できます。
[Excel VBA] シーザー暗号で暗号化する

使い道とかどこにあるか分かりませんが
需要なくても書いて良いのがこういうブログみたいな場所なので:relieved:
なんかシーザー暗号で遊びたいなって方は是非使ってやってください

### ざっくり説明
渡された文字列をシーザー暗号にて処理して返します (復号も可)

ex.
EncriptAndDecryptWithCaesarCipher("TestMessage", 1)　→　"UftuNfttbhf"
EncriptAndDecryptWithCaesarCipher("UftuNfttbhf", -1)　→　"TestMessage"
 
### コード
```vb:暗号化/復号(シーザー暗号)
Function EncriptAndDecryptWithCaesarCipher(ByVal text As String, ByVal shift As Long) As String
'================================
'用途　　：シーザー暗号による暗号化／復号
'--------------------------------
'第一引数：平文／暗号文 (String型)
'第二引数：シフトする文字数 (Long型)
'戻り値　：第一引数が平文の場合→暗号文 (String型)
'　　　　　第一引数が暗号文の場合→平文 (String型)
'================================
    Const NUM_OF_LETTERS As Long = 26
    Const CHRCODE_UPPER_A As Long = 65
    Const CHRCODE_UPPER_Z As Long = 90
    Const CHRCODE_LOWER_A As Long = 97
    Const CHRCODE_LOWER_Z As Long = 122
    
    Dim characterCount As Long
    characterCount = Len(text)

    Dim i As Long
    Dim ciphertext As String
    For i = 1 To characterCount
        Dim targetCharacter As String
        targetCharacter = Mid(text, i, 1)
    
        Dim targetCharacterCode As Long
        targetCharacterCode = AscW(targetCharacter)

        Select Case targetCharacterCode
        Case CHRCODE_UPPER_A To CHRCODE_UPPER_Z
            ciphertext = ciphertext + ChrW(((targetCharacterCode + shift _
            - (CHRCODE_UPPER_A Mod NUM_OF_LETTERS)) Mod NUM_OF_LETTERS) + CHRCODE_UPPER_A)
        Case CHRCODE_LOWER_A To CHRCODE_LOWER_Z
            ciphertext = ciphertext + ChrW(((targetCharacterCode + shift _
            - (CHRCODE_LOWER_A Mod NUM_OF_LETTERS)) Mod NUM_OF_LETTERS) + CHRCODE_LOWER_A)
        Case Else
            ciphertext = ciphertext + targetCharacter
        End Select
    Next
    EncriptAndDecryptWithCaesarCipher = ciphertext
End Function
```

### 使用方法
第一引数に暗号化/復号対象の文字列
第二引数にシフトする文字の数
を渡します。

第ニ引数を1にすると AはB になり、5にすると AはF になります

### 仕様等
- 対象文字は[A-Z]と[a-z]のみで、他の文字はそのまま表示されます
- 復号の関数も同じです。第二引数を3で暗号化したなら、第一引数に暗号文／第二引数に-3を渡すことで復号できます

※日本語も処理可能と言えば可能ですが、「あ」の次は「い」であることは明確ながらも、「ど」の次は何の文字であるのが適切かなど不明点が多いので作ってないです。

### 注意点
特になし

### その他
最初にConstで宣言してるものをFor文内に直接書いたり
計算後数値にすることで1割ぐらい高速化できます。
とは言え元々3000文字で0.01秒以下なんですが。
OpenAPIのallOfの使い方

# 概要
OpenAPIのallOfの使用方法です。

# 利用シーン
同じ要素を含む複数のオブジェクトを定義する場合に使用します。

## サンプルjson
以下のようなjsonを生成します。
```json
{
    "object_a": {
      "id": 1,
      "name": "NONE",
      "element1": 3,
      "element2": "string",
      "element3": "SUNDAY"
    },
    "object_b": {
      "id": 1,
      "name": "NONE",
      "element1": 5,
      "element3": "enum_B",
      "element4": "JANUARY"
    }
}
```

共通要素
- id
- name
- element1 (integer)

固有要素
- element2 (string)
- element3 (enumの型違い)
  - `object_a` は、`SUNDAY`,`MONDAY`,`TUESDAY`,...
  - `object_b` は、`JANUARY`,`FEBURUARY`,`MARCH`,...
- element4 (string)

## yamlファイルの定義
```
paths:
  /example:
    get:
      parameters:
      - description: API Key
        in: query
        name: key
        required: true
        type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                - $ref: '#/components/schemas/response_type1'
                - $ref: '#/components/schemas/response_type2'

components:
  schemas:
    response_type1:
        type: object
        allOf:
          - $ref: '#/components/schemas/object_base'
          - properties:
              element2:
                type: integer
              element3:
                type: string
                enum:
                    - SUNDAY
                    - MONDAY
                    - TUESDAY
        required:
          - element2
          - element3
    response_type2
        type: object
        allOf:
          - $ref: '#/components/schemas/object_base'
          - properties:
              element3:
                type: string
                enum:
                    - JANUARY
                    - FEBURUARY
                    - MARCH
              element4:
                type: string
        required:
          - element3
    object_base:
        type: object
        nullable: false
        properties:
          id:
            type: integer
            format: int64
          name:
            type: string
          element1:
            type: integer
        required:
          - id
          - name
          - element1
```

- `element3`のように同じ名前でEnumの型が違うような場合にも利用できます
- `object_base` でrequired指定した要素とallOf内でrequired指定した要素が必須要素になります
(UNO)8ビット機 信号処理用の1/Xの表で遊ぶ(正負)(固定小数点8,8)(8ビット/8ビット=8ビット)(割り算)


x 過去ログをみよ

目的
割り算を高速化する
UNOからのアナログ入力を自動で絞りたい

いろいろ
割り算の為の前処理が重すぎる
範囲エラーは、テーブルから余計なアドレスにアクセスさせない為
y/1とy/2は、内部の掛け算でオーバーフローをさせない為



仕様
①範囲エラー処理と割られる数0、割る数0は、0

②例外処理と高速化の為 x/1は、xは、そのまま

③範囲エラーを防ぐ為と高速化の為にx/2は1シフト

④1/yのメイン処理 例 64/4=16 64*64/256=16

⑤あと、符号処理

⑥割られる数は、チェックは、しない。だいたい300ぐらいまでOK


結果

![o_coq350.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/84b20d07-ad83-11f8-d1ac-b98305eb9500.jpeg)


プログラム


```c++


// 1/xのテーブルを使った8ビット単位の割り算　正の数、負の数
//DIV_C_UNO1

// 8ビット / 8ビット の　正の数、負の数の割り算
int DIV_C(int x, int y) {

  static unsigned char uu[] = {
    255, 255, 128, 85, 64, 51, 42, 36,
    32, 28, 25, 23, 21, 19, 18, 17,
    16, 15, 14, 13, 12, 12, 11, 11,
    10, 10, 9, 9, 9, 8, 8, 8,
    8, 7, 7, 7, 7, 6, 6, 6,
    6, 6, 6, 5, 5, 5, 5, 5,
    5, 5, 5, 5, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4,
    4, 3, 3, 3, 3, 3, 3, 3,
    3, 3, 3, 3, 3, 3, 3, 3,
    3, 3, 3, 3, 3, 3, 2, 2,
    2, 2, 2, 2, 2, 2, 2, 2,
    2, 2, 2, 2, 2, 2, 2, 2,
    2, 2, 2, 2, 2, 2, 2, 2,
    2, 2, 2, 2, 2, 2, 2, 2,
    2, 2, 2, 2, 2, 2, 2, 2,
    2, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1
    , 1
  };

  //範囲エラー処理と割られる数0、割る数0
  if ( y > 256 ) {return (0);}
  if ( y < -256 ) {return (0);}
  if ( y == 0 ) {return (0);}
  if ( x == 0 ) {return (0);}

  //結果の符号を保存、符号を外す
  int p;
  p = x ^ y;
  p = (p >> 15);
  //c = (c ^ p) - p;
  if(x < 0) {x--;x =~ x;}
  if(y < 0) {y--;y =~ y;}

  //例外処理と高速化の為 x/1は、xは、そのまま
  if ( y == 1 ) { return ((x^p)-p);}

  //範囲エラーを防ぐ為と高速化の為にx/2は1シフト
  if ( y == 2 ) {return (((x >> 1)^p)-p);}

  // 1/yのメイン処理 例 64/4=16 64*64/256=16
  return   ((((x * uu[y]) >> 8)^p)-p)   ;

}//DIV_C


//初期化
void setup() {
  // put your setup code here, to run once:

  //シリアルポートの初期化
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);

}//setup


//メインループ
void loop() {
  // put your main code here, to run repeatedly:

  /*
  Serial.println("debug");
  //範囲エラー、負の数のテスト
  Serial.print("257/2="); Serial.println(DIV_C(257, 2));
  Serial.print("128/257="); Serial.println(DIV_C(128, 257));
  Serial.print("-10/2="); Serial.println(DIV_C((-10), 2));
  Serial.print("128/-10="); Serial.println(DIV_C(128, (-10)));

  // n/1とn/0のテスト
  Serial.print("128/1="); Serial.println(DIV_C(128, 1));
  Serial.print("128/0="); Serial.println(DIV_C(128, 0));
  Serial.print("256/1="); Serial.println(DIV_C(256, 1));
  Serial.print("256/0="); Serial.println(DIV_C(256, 0));

  // n/2のテスト
  Serial.print("128/2="); Serial.println(DIV_C(128, 2));
  */

  //通常ケース
  Serial.print("64/4="); Serial.println(DIV_C(64, 4));


  //3秒待つ
  delay(3000);

}//loop


```
2024/8/30主にITとかセキュリティの記事

「Joomla」にセキュリティアップデート - 「クリティカル」とされる脆弱性も
https://www.security-next.com/161221

ふるさと納税特設サイトにサイバー攻撃 - 玄海町
https://www.security-next.com/161212

システムにランサム攻撃、ファイルが暗号化 - KISCO
https://www.security-next.com/161170

Yahoo!オークションで不具合 - 一部低評価利用者の社内識別子を誤表示
https://www.security-next.com/161202

「ろうきん」利用者狙うフィッシング攻撃が発生
https://www.security-next.com/161225

Microsoft Windows の csc.sys における任意のカーネルメモリへの書き込みが可能となる脆弱性（Scan Tech Report）(8/28)
https://scan.netsecurity.ne.jp/article/2024/08/28/51543.html

サノフィ日本法人、医療関係者や社員73万人分情報漏れ(8/28)
https://www.nikkei.com/article/DGXZQOUC288R20Y4A820C2000000/

サイバー攻撃による個人情報流出の可能性について（お詫び）サノフィ(8/28)
https://www.sanofi.co.jp/assets/dot-jp/pressreleases/2024/240828.pdf

サノフィ、医療従事者73万人の個人情報流出の可能性／ツルバダに国内初の曝露前予防適応 など｜製薬業界きょうのニュースまとめ読み（2024年8月28日）
https://answers.ten-navi.com/pharmanews/28609/

個人情報8万件を漏洩　愛媛県、委託先のイセトー(8/28)
https://www.sankei.com/article/20240828-XC5MNQWJ3BNIBLSA27S3UGEHPI/

サイバー攻撃によるシステム障害のお知らせ（最終報告）(8/28)
https://www.nishio-rent.co.jp/news/?m=Detail&id=475&type=all

ランサムウェア被害から学ぶWebサイトCMSセキュリティ対策レポートを8月28日に公開(8/28)
https://prtimes.jp/main/html/rd/p/000000011.000064653.html

プラン・インターナショナル、ランサムウェア攻撃で情報漏洩！
https://cybersecurity-park.com/2791/

英国データ保護機関、セキュリティ対策不足を理由に罰金609万ポンドを要求　8万人分情報流出で被害多数(8/28)
https://atmarkit.itmedia.co.jp/ait/articles/2408/28/news049.html

委託業者におけるコンピューターウイルス感染について（調査結果報告）(8/28)
https://www.city.ota.tokyo.jp/seikatsu/hoken/iryokikan_hoka/tyousakekkahoukoku.html

セキュリティ担当者が今すぐやるべき「5つの重要ミッション」はこれだ(8/28)
https://techtarget.itmedia.co.jp/tt/news/2408/28/news02.html

Linuxシステムへのランサムウェア攻撃(8/28)
https://www.iwi.co.jp/blog/security/ot_security/20220830/

次は日本か　自動車産業を狙う大規模サイバー攻撃(8/28)
https://kn.itmedia.co.jp/kn/articles/2408/28/news080.html

米国 国家安全保障局 (NSA) 商用超小型地球局(VSAT)ネットワークの保護(8/28)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2024/08/post-c87770.html

委託していた予約管理システムが不正アクセス受け4,725件の漏えいか｜宇野港土地株式会(8/28)
https://cybersecurity-jp.com/news/98968

【情報漏洩に関する意識調査】従業員の9割が情報漏洩対策を行わないと不安に感じることが判明(8/28)
https://www.agara.co.jp/article/406038
https://prtimes.jp/main/html/rd/p/000000020.000055385.html

自治体注意喚起：流山市 フィッシングメールに注意呼びかけ(8/28)
https://scan.netsecurity.ne.jp/article/2024/08/28/51537.html

玄海町ふるさと納税特設サイト、不正アクセスで公開停止　二次被害の有無など調査(8/28)
https://www.saga-s.co.jp/articles/-/1308494

ASMツールとは？　～機能・メリット・選定ポイントを一挙に解説～(8/28)
https://rm-navi.com/search/item/1842

OpenSSHの重大な脆弱性が残した「警告」
「重大」リスクでも日本のパッチ適用率は1％未満　サーバー22万6000台が危険な状態に(8/29)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/041800012/081900259/

動き出すIoTセキュリティーの評価制度(8/29)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/081900199/081900001/

AWSへの依存は「経営リスク」、パートナー御三家もマルチクラウド強化へ(8/29)
https://xtech.nikkei.com/atcl/nxt/column/18/02923/082200002/

NEC・TIS・富士通の技術者が描くネットワーク図、要所を目立たせる工夫が随所に(8/29)
https://xtech.nikkei.com/atcl/nxt/column/18/02922/081900004/

人材不足を解消するカギ　「スキルベース組織」へ転換せよ(8/29)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/042600418/082600005/

世界で取り組みが進む　ビジネスアーキテクチャー(8/29)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020900021/082600171/
WorkatoでBoxにファイルアップロードする際の注意点

# はじめに

WorkatoでBoxと連携してファイルをアップロードする機会があると思います。Boxのファイルをアップロードするアクションは既に同ファイルが存在する場合は以下のようにエラーとなります。そのため、[冪等性](https://ja.wikipedia.org/wiki/%E5%86%AA%E7%AD%89#%E6%83%85%E5%A0%B1%E5%B7%A5%E5%AD%A6%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E5%86%AA%E7%AD%89 )を考慮し、ファイルをアップロードする前に、ファイルの存在確認を実施してからファイルをアップロードする必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3455960/8e0c1b0f-5e70-986d-e4e4-a1c38bbd8a38.png)

しかし、Boxの検索インデックス作成の仕様を知っていないと、意図した存在確認の結果にならない可能性があります。


本記事では、検索インデックスを考慮している[Boxの検索API(Serach)](https://ja.developer.box.com/reference/get-search/)を利用しないで、冪等性を満たす方法を紹介します。

# Boxの検索インデックスについて

Boxには格納されているファイルやフォルダには[検索インデックス](https://support.box.com/hc/ja/articles/360043696314-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB-%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80-%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84%E3%81%AE%E6%A4%9C%E7%B4%A2)が付与されています。この検索インデックスはファイルやフォルダが追加・変更されるたびに更新されます。検索インデックスの反映にはサービスの負荷によっても変わりますが約10分程度かかります。

# WorkatoでBoxの検索API(Serach)利用時の問題
前章で検索インデックスの反映に10分程度かかると記載しました。この時間中にWorkatoでBoxの検索API(Serach)を実行するどうなるでしょうか？
答えは、検索インデックス反映中のため、検索結果に出力されません。そのため、ファイルはBox上にあるけれども、検索API(Serach)には出力されないというデータに食い違いが生じているように見えます。そのため、冪等性を満たすレシピを作成できない可能性があります。

# BoxのAPIの検索に反映されないときの対処法

対処する方法は以下となります。
- 検索API(Search)を利用せずに、Box上で一意となるIDを用いてアップロード履歴を保存する方法

# 検索API(Search)を利用せずに、Box上で一意となるIDを用いてアップロード履歴を保存する方法
### Box上で一意となるIDについて
Box上で一意となるIDはファイルやフォルダーに割り振られているファイルIDやフォルダーIDと呼ばれるものです。このIDは検索インデックスの更新に影響されないので、どのタイミングでもファイルやフォルダーを一意に定めることが可能となります。

このIDはファイルやフォルダーをBoxのWeb版で開くと確認することができます。以下はファイルをBoxのWeb版で開いた例となります。

![boxのファイルID.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3455960/4d2262ea-68b2-e8a8-659f-749fd041f839.png)


### Workatoでの実装方法
Workatoで実装する場合は、Boxにファイルをアップロードする時、一意となるファイルIDが採番されるため、そのファイルIDをLookupTable等に保存し、ファイルにアクセスする場合はファイルIDを用いてアクセスします。

例として、Sharepointからファイルを取得し、そのファイルをBoxにアップロードするWorkatoのレシピ構成以下に示します。
![Workatoのフロー_20240806_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3455960/1f5eb258-f9df-61a2-edf4-238db8ba9db2.png)

サンプルレシピは[参考リンク](#参考リンク)に記載しています。

# まとめ
まとめると、以下のようになります。

* Boxの検索API(Search)は検索インデックスの仕様上、ファイルアップロード後の10分以内は目的のファイルが検索にヒットしないことがあるため、ファイルを一意に決めることができるファイルIDを用いることで、冪等性を満たすロジックを作成することが可能

# おわりに
いかがでしょうか？ Boxの検索インデックス作成の仕様を考慮したレシピを作成することで、可用性の高い業務を実現することが可能となります。

Workatoの導入・導入後の活用などでお困りの場合、Workatoリセラーにご相談する方法もございます。お困りごとがございましたら、認定リセラーの[日立ソリューションズ](https://www.hitachi-solutions.co.jp/rpa/sp/products/workato/?utm_source=sns&utm_medium=qiita&utm_campaign=138e02d35697226d6005)へ是非ご相談ください。

# 参考リンク

* 株式会社 日立ソリューションズ
    * [Workato ご紹介サイト](https://www.hitachi-solutions.co.jp/rpa/sp/products/workato/?utm_source=sns&utm_medium=qiita&utm_campaign=138e02d35697226d6005)
* BOX 公式サイト
    * [検索インデックス作成](https://ja.developer.box.com/guides/search/indexing/)
* 本記事のサンプルレシピ
    * JPデータセンター利用者向け 
        * [[Example] Upload Box File](https://app.jp.workato.com/recipes/440047?st=314ed1de483f82f2c95fda1cfa80ac0014f063a9179d2ea06a8c52c537a4c474)
    * USデータセンター利用者向け
        * [[Example] Upload Box File](https://app.workato.com/recipes/50423156?st=db0a27606aa2029fcf4736f748abbc46ec7005261f7baae75bac611df49e74a0)
terraformで初めてリソースを作る時の自分なりのコツを雑にメモしていく

よくわからないリソースをterraformで書かなきゃいけなくなった時に、こうすると早いんじゃないかという方法を雑にメモしていきたい。

具体例としてGoogle CloudのGoogle Cloud Storageを初めて作成する時を例にする。

## コンソール上で作ってみる
まずはコンソール(UI)上でリソースを作ってみます。
ついでに動作を確認しても良いかもしれないです。

今回の例で言うとGoogle Cloudのコンソール上でGoogle Cloud Storageのバケットをぽちぽち作成する。

## 「terraform {リソース名}」でググる
検索エンジンで「terraform {リソース名}」で検索を行うと、大体対象リソースを作成するためのterraform公式サイトが一番上に出てくるので見る。


今回の例で言うと「terraform google storage」で検索して以下のサイトを見つける。
https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/storage_bucket

## terraform公式サイトの例をコピペして.tfファイルを作る
terraform公式サイトの上の方にExample Usageといった形で具体的なサンプルコードが書いてあるので、これをコピペして.tfファイルを作成する。

今回の例で言うと以下のような感じ。
```terraform
resource "google_storage_bucket" "static-site" {
  name          = "image-store.com"
  location      = "EU"
  force_destroy = true

  uniform_bucket_level_access = true

  website {
    main_page_suffix = "index.html"
    not_found_page   = "404.html"
  }
  cors {
    origin          = ["http://image-store.com"]
    method          = ["GET", "HEAD", "PUT", "POST", "DELETE"]
    response_header = ["*"]
    max_age_seconds = 3600
  }
}
```

## 手動で作ったリソースをインポートする
今回の例で言うと以下のようにしてインポートする。
`terraform import google_storage_bucket.static-site　{project_id}/{bucket_name}`

`import`直後の`google_storage_bucket.static-site`は先ほどのコピペしたコードのリソースタイプとローカル名を書く。
最後のリソースの指定の仕方は公式サイトの下の方に「import」という項目があるので、それを見るとどのようにインポートすれば良いかわかる。今回はプロジェクトIDとバケット名をスラッシュで繋げたものを書く。

## .tfファイルにインポートしたものを反映する
今回の例で言うと`terraform show`でインポートしたリソースを表示できるので、表示されたコードをまるっとコピーして、先ほどの.tfファイルのコピペ部分に上書きする。あとは`terraform plan`をしながらerrorを直しながら手動で作成したリソースのterraformコードを完成させる。

## 最後に
ChatGPT的な生成AIツールと組み合わせるとインフラエンジニアでなくてもなんちゃってterraformコードをスラスラ書ける。でもセキュリティには要注意。
AtCoder 勉強記録[C++] その58

AtCoderで入茶を目指して勉強しています。
勉強を継続するために投稿を始めました。
もともとアカウントを作成していましたが、今年の4月から本格的に勉強を始めました。
一応自分用に解法を書いていますが雑です、自分で読み返して困ったら修正します。
[私のアカウント](https://atcoder.jp/users/nanami_brother)
[解いた問題](https://kenkoooo.com/atcoder/#/table/nanami_brother)
# 本日解いた問題
## C - Chinese Restaurant
[C - Chinese Restaurant](https://atcoder.jp/contests/abc268/tasks/abc268_c)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define mod 998244353

int main() {
  ll n;
  cin >> n;
  vector<ll> p(n);
  rep(i, n) cin >> p[i];
  vector<ll> cnt(n);
  for(int i = 0; i < n; i++) {
    for(int j = 0; j < 3; j++){
      cnt[(p[i]-1-i+j+n)%n]++;
    }
  }
  ll res = 0;
  for(int i = 0; i < n; i++){
    res = max(res, cnt[i]);
  }
  cout << res << endl;
}
```
### 解法
人`0,1,...N-1`について`C0,C1,...,CN`を求める。
## C - Submask
[C - Submask](https://atcoder.jp/contests/abc269/tasks/abc269_c)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define mod 998244353

int main() {
  ll n;
  cin >> n;
  vector<ll> res = {0};
  for(ll s = n; s > 0; s=(s-1)&n){
    res.push_back(s);
  }
  sort(res.begin(),res.end());
  for(auto x:res) cout << x << endl;
}
```
### 解法
`for (int S = N; S; S = (S - 1) & N) `によるfor文を使うことで部分集合を求めることができる。
EAGLE: 複数視覚エンコーダの融合でマルチモーダルLLMを次のレベルへ

# EAGLE: Exploring The Design Space for Multimodal LLMs with Mixture of Encoders

今回は、最新の研究成果である「EAGLE: Exploring The Design Space for Multimodal LLMs with Mixture of Encoders」という論文をご紹介します。この研究は、マルチモーダル大規模言語モデル（MLLM）における視覚的知覚能力を最適化するための新しい設計アプローチを探るもので、特に複数の視覚エンコーダを効果的に組み合わせる方法について詳細に検討しています。

### 論文情報
- **タイトル**: EAGLE: Exploring The Design Space for Multimodal LLMs with Mixture of Encoders
- **リンク**: [https://github.com/NVlabs/Eagle](https://github.com/NVlabs/Eagle)
- **発表日**: 2024年8月28日
- **著者**: Min Shi, Fuxiao Liu, Shihao Wang, Shijia Liao, Subhashree Radhakrishnan, De-An Huang, Hongxu Yin, Karan Sapra, Yaser Yacoob, Humphrey Shi, Bryan Catanzaro, Andrew Tao, Jan Kautz, Zhiding Yu, Guilin Liu
- **DOI**: 未発表

## 背景と目的

マルチモーダル大規模言語モデル（MLLM）は、視覚とテキストの統合による高度な理解と推論を実現するために急速に発展しています。しかし、これまでのモデルは、単一の視覚エンコーダに依存することが多く、特に高解像度でのタスクや、複雑な視覚情報を必要とするタスクにおいて限界がありました。例えば、光学文字認識（OCR）やドキュメント解析などのタスクでは、従来のエンコーダでは視覚的な精度が不足しており、結果としてモデルの「幻覚（hallucination）」が発生することが多々ありました。

EAGLEの研究は、これらの課題に対処するために、複数の視覚エンコーダを組み合わせる「視覚エキスパートの混合（mixture of vision experts）」という新しいアプローチを提案しています。このアプローチは、異なる視覚エンコーダが持つ強みを最大限に引き出し、それらを効果的に統合することで、視覚的知覚能力を飛躍的に向上させることを目指しています。

## 研究の焦点

EAGLEは、視覚エンコーダの選択と組み合わせに関する包括的な設計空間を探求しています。具体的には、以下の点に焦点を当てています。

1. **視覚エンコーダのベンチマークと高解像度適応**:
   - さまざまな視覚エンコーダを比較し、高解像度への適応においてどのエンコーダが最適であるかを特定しました。

2. **エンコーダ融合戦略の「リンゴ対リンゴ」比較**:
   - 異なる視覚エンコーダを組み合わせる際の融合戦略について、「リンゴ対リンゴ」の比較を行い、最も効果的な融合方法を特定しました。

3. **最適な視覚エキスパートの組み合わせの漸進的特定**:
   - 視覚エンコーダの組み合わせによるパフォーマンス向上を実現するために、最適な組み合わせを漸進的に特定しました。

4. **視覚エンコーダとテキストトークンの事前アライメント**:
   - 異なる視覚エンコーダとテキストトークン間の整合性を高めるために、「Pre-Alignment」ステージを導入し、モデルの一貫性を向上させました。

## 実験の概要と結果

EAGLEの実験では、複数の視覚エンコーダを組み合わせることで、従来のMLLMを上回るパフォーマンスを達成しました。特に、以下の点が顕著な成果として挙げられます。

1. **エンコーダのロック解除によるパフォーマンス向上**:
   - 視覚エンコーダを凍結せずに訓練することで、特に高解像度タスクにおいて顕著なパフォーマンス向上が確認されました。

2. **チャンネル連結の効果**:
   - 視覚トークンのチャンネル連結が、他の複雑な融合戦略に比べて、効率性とパフォーマンスの両方で優れていることが確認されました。

3. **追加視覚エキスパートの効果的な統合**:
   - 追加の視覚エンコーダを組み込むことで、OCRやドキュメント理解など、解像度に敏感なタスクでのパフォーマンスが大幅に向上しました。

さらに、EAGLEは主要なMLLMベンチマークで他の先行モデルを上回り、特に光学文字認識やドキュメント解析タスクにおいては、圧倒的な性能を示しました。

### 賛否両論

**賛成意見**
- EAGLEは、従来のMLLMが抱える視覚的限界を克服し、特に高解像度タスクにおいて顕著なパフォーマンス向上を実現しています。
- 視覚エンコーダのロック解除やチャンネル連結といったシンプルなアプローチが、他の複雑な手法を凌駕することが確認されました。

**反対意見**
- 訓練データの増加に伴い、計算コストやリソースが大幅に増加する可能性があります。
- 高度に最適化されたモデルであるため、一般的な用途への適用が難しい場合があります。

この記事が皆さんの研究や実務に役立つことを願っています。ご質問やフィードバックがありましたら、コメント欄にお寄せください。
1を出力する場合がある乱数を作りたい話

:::note warn
(実用性は)ないです。
記事の本文及びソースコードに誤りがある場合があります。
誤りなどがあればコメントで教えてください。
:::
どうも
Qiitaではおそらく初投稿だと思います。
普段は[note](https://note.com/otoneko1102)や[GitHub](https://github.com/otoneko1102)で活動しています。

## 今回のお話
ふとした思いつきからの試みです。
JavaScriptやだいたいの言語で乱数を生成するとき、初期テーブルのままの場合、 **0~1** の乱数を返しますよね。
```js
Math.random()
```
でも、これは **0以上1以下** ではなく **0以上1未満** の乱数しか返さないんです。

今回実現したいのは **浮動小数点数も扱える0以上1以下の乱数を出力する関数** です！

## 実装してみる
### 条件
1. ある程度すべての値が出る確率が等しいこと。
2. 処理が速いこと。
3. 他の関数などにも応用が効くこと。

### v1
#### コード
```js:randoms/v1.js
function random() {
  let result = Math.random();
  if (Math.random() == 0) result = 1;
  return result;
}
module.exports = random;
```

#### 説明
resultに仮で返す予定の乱数を生成し置く。
もう一方の乱数で0が出た場合はresultを1に置き換える。

#### メリット
- 構造がシンプル。
- 処理が速い。

#### デメリット
- 1が出る確率がほんの少しだけ高い。

### v2
#### コード
```js:randoms/v2.js
function random() {
  let result;
  do {
    result = Math.random() + Math.random();
  } while (result > 1);
  return result;
}

module.exports = random;
```

#### 説明
2つの乱数を生成した後足す動作を1よりも大きくならない値が出るまで続ける。

#### メリット
- 確率が等しい。

#### デメリット
- 処理速度に差が出やすい。

## まとめ
まだまだ他の方法がありそう。
当分はv2を利用するのが安牌だと思う。

## これを利用して作ったnpmパッケージ
https://www.npmjs.com/package/randplus

https://www.npmjs.com/package/@randplus/0to1
Google Cloudをterraformで操作するために必要なこと(Windows)

# はじめに
前回、windowsでのterraformの[インストール方法](https://qiita.com/koiwaidesu@github/items/e9dca44cb7eec347e4d9)を記事にして、terraformをインストールできましたので、次は実際にいじってみるぞということでGoogle Cloudを触ろうとしたところ、ほかに準備することがありましたので記載します。

::: note info
terraformの[公式ページ](https://developer.hashicorp.com/terraform/tutorials/gcp-get-started/google-cloud-platform-build)を見ながら記載していきます。
適宜補足など入れられたらと思っていますが、公式ページを見たほうが早いかもしれません。
また、Google Cloudで使えるコンソール(Cloud Shell)を使う場合は、また手順が異なります。
別途記事にしますが、Cloud Shellの場合は[こちら(公式ページ)](https://cloud.google.com/docs/terraform/get-started-with-terraform?hl=ja)で実施します。
:::

# 対象読者
* terraformをwindows端末で触り始めた人(私もですが…)
* Google Cloudをterraformで触りたい人

# 本記事のゴール
* 自身の端末に入っているterraformでGoogle Cloudを触る準備ができる

# 準備物
Google Cloudをterraformから操作するためには以下のものが必要となります。
1. terraform
2. Google Account and Google Cloud Console(自身のProject)
3. Google CloudのProject ID
4. Google Cloud CLI(gcloud)

# 準備
## 1. terraform
こちらは、私の記事ですが、terraformのインストール方法を以下に記載していますので、そちらを参考にインストールしてください。

https://qiita.com/koiwaidesu@github/items/e9dca44cb7eec347e4d9

## 2. Google Account and Google Cloud Console(自身のProject)
ご自身のGoogle AccountやConsoleがあるかどうかはGoogle Cloudの[Console](https://console.cloud.google.com/)を起動すればわかります。
この際に、Google Accountがない場合は以下を参考にGoogleアカウントを作成してください(公式ページです)。

https://support.google.com/accounts/answer/27441?hl=ja

Googleアカウントがあるけど、Google Cloudを触ったことがないという場合には、以下から登録ができます。
初めて登録した人には最初にいくらか使える無料枠がプレゼントされます。

https://cloud.google.com/free?hl=ja

:::note warn
注意
インフラ費用の「お支払い方法」として、**クレジットカードの登録**が必要になります。
適切に作業を行えば課金は発生しないはずですが、不安だという方は[コスト通知](https://cloud.google.com/billing/docs/how-to/budgets?hl=ja)を設定しておけば、気づくことができます。
※このコスト通知は無料で設定可能です。
:::

## 3. Google CloudのProject ID
Google CloudのProject IDは[Console](https://console.cloud.google.com/)を起動したトップページに記載されています。以下の画像部分のオレンジ枠の箇所にProject IDが記載されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25162/6aebc6a5-1116-a263-2abe-308ec788603d.png)

::: note warn
注意
このProject IDを他人に開示したり、記事などで見せないほうがいいです。
認証の設定などを間違えていて誰でもリソース作成可能状態になってたり、それに準ずる脆弱性が見つかった場合は悪用されて高額な請求がされたりする可能性があります(多分)。
:::

## 4. Google Cloud CLI(gcloud)
以下のURLを参考にgcloud CLIをインストールします。

https://cloud.google.com/sdk/docs/install?hl=ja

::: note info
Google Cloud CLIとは
Google Cloudのリソースの作成と管理を行うための一連のツールです。
Google CloudのコンソールのGUIで実施していることと同様のことが可能です。
(一部の操作はこのGoogle Cloud CLIを使わないとできないものがあります。)
:::

### 4.1. Google Cloud CLIの初期化
Google Cloud CLIをインストールしただけでは、Google Cloudのプロジェクトを使うための設定ができていませんので、初期化を実施します。初期化は以下のURLを参考に実施します。

https://cloud.google.com/sdk/docs/install-sdk?hl=ja#initializing_the

### 4.2. TerraformがGoogle Cloud CLIを使えるようにする
ここから、TerraformがGoogle Cloud CLIを使えるようにする用の認証情報を取得します。
認証情報の取得は以下のURLを参考にして実施します。

https://cloud.google.com/docs/authentication/provide-credentials-adc?hl=ja

ここまでくるとterraformでGoogle Cloudを操作することが可能になります。
実際にリソースを作成するのは別の記事で実施したいと思います。
おつり計算アプリを作りました【Uber Eats 出前館 Wolt menu】引き算アプリ【ウーバーイーツ 配達員】

| Android | iPhone | 
| ------- | ------ | 
| ![Screenshot_20240829-232243.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/eb1f3413-64e6-feac-9eb0-8aba131db4e9.png)        | ![96166.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/c1acc15b-9e4e-f424-cb84-8cfc53d526d2.jpeg)       | 

<https://codepen.io/04/full/oNrMdVo>

<p class="codepen" data-height="600" data-default-tab="result" data-slug-hash="oNrMdVo" data-pen-title="おつり" data-user="04" style="height: 600px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/04/pen/oNrMdVo">
  おつり</a> by John Doe (<a href="https://codepen.io/04">@04</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

# 開発の経緯

今まではiPhoneの電卓でおつりを計算していたのですが、お預かりした金額とマイナスと商品代金とイコールを順番に入力する必要がありました。
エレベーターやピンポンを押している間に商品代金の入力は可能なため、お預かりした金額だけを入力してリアルタイムにおつりの計算ができるようにしました。
こうすることでスムーズに商品の受け渡しが可能になり、お客様の満足度向上になると思います。
利便性を考慮し、商品代金を4桁入力するとお預かりした金額欄に自動でフォーカスします。

また、別の配達のためにリセットするときは、下の黒い画面を押すだけでリセットできます。
ページをリロードしなくてもいいため、電波の届かないタワーマンションでも利活用可能です。ページを再読み込みしても問題ありません。

文字が大きいため、お客様に画面を見せながら入力することもでき、信頼性が向上し、暗算によるおつりの計算ミスは起きません。

ウーバーアプリがデフォルトで実装してくれると嬉しいです

どうぞ、ご活用ください

# インストール方法
下記のリンクを開きます
<https://codepen.io/04/full/oNrMdVo>
powershell csv 編集 .1→0.1

```powershell:csv_
# 数値の編集を行う関数を定義
function Fix-DecimalFormat {
    param (
        [string]$input
    )

    # 正規表現で先頭が"."の場合に"0"を追加
    if ($input -match '^\.\d+$') {
        return "0$input"
    } else {
        return $input
    }
}

# CSVデータを読み込み、処理し、エクスポートする関数
function Convert-CsvData {
    param (
        [string]$inputCsvPath,
        [string]$outputCsvPath
    )

    # CSVファイルをインポート
    $data = Import-Csv -Path $inputCsvPath

    # データを編集
    foreach ($row in $data) {
        foreach ($column in $row.PSObject.Properties) {
            # 数値型のデータをチェックし、編集
            if ($column.Value -is [string] -and $column.Value -match '^\.\d+$') {
                $column.Value = Fix-DecimalFormat $column.Value
            }
        }
    }

    # 編集したデータをCSVとしてエクスポート
    $data | Export-Csv -Path $outputCsvPath -NoTypeInformation -Encoding UTF8

    Write-Output "データの編集が完了しました。出力ファイル: $outputCsvPath"
}

# 使用例
$inputCsvPath = "input.csv"   # 入力CSVファイルのパスを指定
$outputCsvPath = "output.csv" # 出力CSVファイルのパスを指定

# 関数を呼び出して処理を実行
Convert-CsvData -inputCsvPath $inputCsvPath -outputCsvPath $outputCsvPath```
Pythonで解いたっpaizaのキャンペーン対象問題（Sランク「mod7占い」）

いつ解いたのか分からない問題が対象でしたので解説・・・正直コードの意図が分からない。

https://paiza.jp/works/mondai/s_rank_skillcheck_sample/mod7



## コードの解説
```py
# coding: utf-8
n = int(input())
input_line = [int(input())%7 for _ in range(n)]
z = 0
for q in range(len(input_line)):
    for w in range(q+1,len(input_line)):
        for e in range(w+1,len(input_line)):
            if (input_line[q]+input_line[w]+input_line[e]) % 7 == 0:
                z += 1
print(z)
```
このコードはごり押しで「3つの整数を足した和が7で割り切れるような組合せがいくつあるか」を確認しています。正直解説できる部分が全くありません。
```py
n = int(input())
input_line = [int(input())%7 for _ in range(n)]
z = 0
```
まず変数を初期化します。RANK Sの問題を見ているなら標準入力の説明はいりませんね。
配列に格納する前に`int(input())%7`を行っていますが・・・数を少なくしたところで意味はあるのか。
```py
for q in range(len(input_line)):
    for w in range(q+1,len(input_line)):
        for e in range(w+1,len(input_line)):
            if (input_line[q]+input_line[w]+input_line[e]) % 7 == 0:
                z += 1
```
すべての配列にある数値を地道に見ています。割り切れたら変数zに1を加えます。
```py
print(z)
```
最後に変数zを出力して終了です。

## 感想
いつ解いたのか分かりません。ちなみにこのコード、最適化もされていません。ただの物量ごり押し作戦で解いています。
この作戦だったらC言語系統で書いたほうがいいのではと考えました。
早くするならそもそもアルゴリズムを見直すべきなんだよな・・・。でもこれで通るってことは、Pythonの処理速度は速くなっているということでもあるか。
「Firebase」デプロイする方法

# はじめに
Firebaseを使用してデプロイをする際にてこずってしまったので、Firebaseの初期化からデプロイまでの手順を簡単にまとめます。

# Firebaseのプロジェクトを初期化する。
1 今回はFirebaseのhostingのみを初期化します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789688/e81c9562-52a1-3eb7-416f-7985fe2c537b.png)

2「 Hosting: Configure files for Firebase Hosting and (optionally) set up GitHub Action deploys」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789688/a689d491-e779-596a-8de0-a5e9aa84edc7.png)

3今回は既にFirebaseで作成済みのプロジェクトを使用するので、「Use an existing project」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789688/1d256e94-39c4-8949-d068-16142933109d.png)

4 私の場合はビルドの出力先がdistフォルダなので、
「What do you want to use as your public directory?」でdistと入力します。
※私は始めにここをpublicと入力したところ画面が真っ白になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789688/efc086f5-e698-72f9-157f-af3c2907b069.png)

5 今回はreactを使っているので 、
 「Configure as a single-page app (rewrite all urls to /index.html)?」 Yesを選択します。

6 「Set up automatic builds and deploys with GitHub?」はNoを選択します。

7 下記の通り表示されたら初期化は完了です。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789688/b143055e-95f7-754f-3835-ba66a15eacaf.png)

# ビルドの実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789688/de9c3112-4b71-7132-a2ca-69c44da36c89.png)

# アプリをデプロイする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789688/b3f07ed3-72f5-cfee-f113-55e008daf83b.png)

「Deploy complete!」の後に表示される「Hosting URL:」に記載されているURLにアクセスして、プロジェクトのアプリやサイトが表示されれば成功です。

参考記事
下記の記事がデプロイまでの内容が分かりやすく書かれていて勉強になりました。
URL：https://qiita.com/acu8/items/c57d0a7de90c5d253c01
filter

```ts
interface Item1 {
  id: number;
  title: string;
  name:string;
  isCheck:boolean;
}

interface Item2 {
  id: number;
}

const Item1:Item1[] = [
  {id: 1, title: "Item 1", name: "Item 1", isCheck: false},
  {id: 2, title: "Item 2", name: "Item 2", isCheck: true},
  {id: 3, title: "Item 3", name: "Item 3", isCheck: false},
  {id: 4, title: "Item 4", name: "Item 4", isCheck: false},
  {id: 5, title: "Item 5", name: "Item 5", isCheck: true},
  {id: 6, title: "Item 6", name: "Item 6", isCheck: false},
  {id: 7, title: "Item 7", name: "Item 7", isCheck: false},
  {id: 8, title: "Item 8", name: "Item 8", isCheck: true},
];

// Item1のisCheckがtrueのデータのidのみをItem2に格納する
const Item2:Item2[] = Item1.filter(item => item.isCheck).map(item => ({id: item.id}));

```