OmniAICreator/Qiita-1.07M huggingface dataset:
Logicool G PowerPlayがスリープ解除を勝手に行っていたので解決した

# 夜中によくPCがスリープから解除されており、Windowsアップデート等をオフにして回ってしばらくした後の話
環境　Windows11
マウス　Logicool G Pro Wireless ゲーミングマウス
マウスパッド　Logicool G PowerPlay Wireless Charging System
検索ワード(意味あるのか？)　無線　ワイヤレス　スリープ解除

## 手順

1.デバイスマネージャーを開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328728/a5acf073-3c0b-a2d9-1b13-3331c5e3d5be.png)
2.マウスのプロパティを開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328728/ae7f9c7b-6d43-9969-1937-36536888f493.png)
3.電源の管理から「スタンバイを解除」のチェックボックスを外す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328728/7729ee3b-bf27-55eb-597c-8afdd1ca8ab9.png)
4.Logicoolの無線の場合、これだけではまだスリープが解除されてしまう（詳細は参考URLより）
今回はPowerPlayがレシーバーにあたるっぽいのでそれをオフにしたい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328728/09587f6c-dbb5-b3ce-a9f4-53f595eeaa7d.png)
5.怪しい「場所」だが、結論からいえばこちらではなかった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328728/5ea71071-aac8-2ed4-c5cb-f4e565720940.png)
PowerPlayの正しい「場所」はUSB入力デバイスだった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328728/525fbf8c-b900-0b69-e5f2-10671348cc78.png)
確認、特定した手順
- PowerPlayを引っこ抜く（ここでマウスが使えなくなる）
- キーボード他のプロパティを開く
- 再度PowerPlayを接続し増えた項目のプロパティを選ぶ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328728/609908b4-b38a-c5ec-e743-400f30a721f8.png)

おそらく外して付け直したら最後に来るのではないかとは思う。

6.解決
参考ではレシーバーを使っていたが、PowerPlayはペアリングなのでちょっとハマった。




# 参考
- https://tonahazana.com/windows10-usb-wakeup-disable
- https://t.co/bgaBTfRiaE
Volta で Node.js のバージョン管理を行うメモ

## はじめに

筆者は今まで Node.js のバージョン管理には 「 nvm 」 と 「 asdf 」 を利用して来ましたが、ここ最近のトレンドはどれだろう？と思い調べたところ 「 [Volta](https://volta.sh/) 」 なるものが人気になりつつあるようです。

Volta の以下の点に魅力を感じたので、今回は Volta を導入し利用する流れを備忘録として残したいと思います。

1. package.json の独自フィールドにバージョン定義が記載される
    `.tool-versions` や `.nvmrc` のように別ファイルに分かれず、 `package.json` ひとつで済むのでファイルがごちゃつかない。

1. プロジェクトごとに自動で Node.js のバージョンが切り替わる
   `package.json` の独自フィールドに応じて自動的に Node.js のバージョンが切り替わるため、切り替えにコマンドを打つ手間が省ける。また、 `npm` や `yarn` のバージョン管理も可能。

1. 更新が活発
    2020/12 にリリースされた Volta は最終更新が 2023/01/25 となっており、 nvm (2022/12/24) や asdf (2023/01/15) と比べても盛んに更新されていることが見受けられるので、多少の安心感がある.

1. Rust で書かれており、処理速度が比較的早い
    筆者は特に他のツールと比較計測をしたわけではないので、数値的に語ることはできませんがどうやら早いらしい。
    `time` コマンドで簡易計測したところ node v16 のインストールには `4.265s` 、 node v14 のインストールには `3.815s` かかりました。

## Volta のインストール

1. ターミナルで `curl https://get.volta.sh | bash` を叩きインストールする。

    ```zsh
    # デフォルトシェルが zsh でも以下のコマンドでOK
    % curl https://get.volta.sh | bash
    ```

1. インストールが完了したら一度ターミナルを再起動

    ```zsh
    # 1の実施後、以下が表示されたら一度ターミナルを再起動する
    > success: Setup complete. Open a new terminal to start using Volta!
    ```

1. `volta -v` を叩き、バージョンが表示されたら成功

    ```zsh
    % volta -v
    > 1.1.1
    ```

## 使い方

### Node.js のインストール

`volta install` コマンドで対象ツールのインストールを行います。

```zsh
# LTSバージョンのインストール
% volta install node
> success: installed and set node@18.16.1 (with npm@9.5.1) as default

% node -v
> v18.16.1

# バージョン指定は node@バージョン で可能
% volta install node@16
> success: installed and set node@16.20.1 (with npm@8.19.4) as default
```

ちなみに、 `volta install` コマンドでは 「Node.js の Fetch」と「ローカルマシンの Node.js を選択」の2つを実行しています。そのためコマンド実行時に対象のバージョンが Fetch 済みの場合は 「ローカルマシンの Node.js の選択」 のみが実行されます。
もし Fetch だけを実行したい場合は `volta fetch` コマンドを使いましょう。

### インストール済みバージョンの表示

`volta list` コマンドでインストール済みのツールバージョンを確認できます。
npm や yarn などもインストールしている場合もこのコマンドで表示することができます。

```zsh
% volta list all
> ⚡️ User toolchain:

>    Node runtimes:
>        v14.21.3
>        v16.20.1
>        v18.16.1 (default)

>    Package managers:
>        Yarn:
>            v4.0.0-rc.48 (default)

>    Packages:
```

### プロジェクトの Node.js バージョンを固定

`volta pin` コマンドでプロジェクトの Node バージョンやパッケージマネージャのバージョンを固定することができます。

```zsh
# v18.16.1 でバージョンを固定する
% volta pin node@18.16.1
> success: pinned node@18.16.1 (with npm@9.5.1) in package.json

# パージョン確認
% node -v
> 18.16.1
```

```diff_json:package.json
+ "volta": {
+    "node": "18.16.1"
+  }
```

### プロジェクトの pnpm のバージョンを固定

Volta では pnpm のサポートがまだ実験段階なため、利用する際は環境変数へフラグを立てる必要があります。
参考: https://docs.volta.sh/advanced/pnpm

```shell:.zshrc
# pnpm の実験的機能利用フラグをオンにする
export VOLTA_FEATURE_PNPM=1
```

```zsh
# pnpm の最新版をインストール
volta pin pnpm@latest
> success: pinned pnpm@8.6.7 in package.json

# パージョン確認
% pnpm -v
> 8.6.7
```

```diff_json:package.json
 "volta": {
     "node": "18.16.1",
+    "pnpm": "8.6.7"
 }
```

## あとがき

記載した以外にも Volta では、 typescript などのツールチェーンを npm や yarn などでグローバルインストールした際に、「どのプロジェクトでどのバージョンをインストールしたか？」を覚えていてくれるため、グローバルインストール時のプロジェクト間の生合成を保ってくれたりもするようです。

pmpm 対応も含め Volta は今後も進化していきそうなので、引き続き追っていけたらと思います。
nginx-ingress でベーシック認証の設定

# 概要
k8s に web アプリケーションをデプロイし、Basic 認証を設定したいことがあるでしょう。nginx-ingress で簡単に設定する方法について説明します。

# 前提
* 作業環境は Ubuntu-20.04 です
* apache2-utils パッケージが作業環境にインストール済です
* kubectl コマンドが作業環境にインストール済です

# 設定方法
## パスワードファイルの作成
apache2-utils パッケージがインストール済であれば htpasswd コマンドが利用できます。
```bash
htpasswd -nb USER PASSWORD | awk 'NR==1{print "auth="$0}' > tmpfile
kubectl -n NAMESPACE delete secret basic-auth
kubectl -n NAMESPACE create secret generic basic-auth --from-env-file=./tmpfile
rm -f tmpfile
```
NAMESPACE にはアプリケーションがデプロイされている k8s のネームスペースを、USER, PASSWORD にはベーシック認証のユーザー名、パスワードを入力して下さい。

ここでは Secret リソースの名前として basic-auth を、Secret のデータ名として auth を指定していますが、これらの名前は任意ですので好きなものを指定してください。ただし前者は後で使用しますので、名前を変更したら適宜後述する部分も書き換えて下さい。

## nginx-ingress の設定
アプリケーション用としてデプロイ済の Ingress リソースに対して、以下の annotation を追加します。

```yaml
    nginx.ingress.kubernetes.io/auth-realm: Authentication Required - App
    nginx.ingress.kubernetes.io/auth-secret: basic-auth
    nginx.ingress.kubernetes.io/auth-secret-type: auth-file
    nginx.ingress.kubernetes.io/auth-type: basic
```

auth-realm には認証レルムを設定します。**auth-secret** には Secret リソースの名前（上で指定したもの）を指定します。auth-type にはベーシック認証である **basic** を指定します。auth-secret-type には **auth-file** を指定します。ここを間違って auth-map としてしまうと、Secret リソースが nginx-ingress-controller コンテナにコピーされた時に以下のような中身になってしまいますので注意が必要です。
```plaintext
auth:user:ENCRYPTED_PASSWORD
```
この場合、ユーザー名は auth、パスワードを暗号化したものが user:ENCRYPTED_PASSWORD になりますが、この文字列は decrypt できないので絶対に認証が通ることはないでしょう。

以上で設定は終了となります。Ingress リソースに設定されているホスト名にアクセスするとベーシック認証がかかっていることを確認することができるでしょう。

# おまけ
## nginx.conf の状態
上記 annotation を設定すると、nginx-ingress-controller の nginx.conf の該当ドメインに対する部分に次の設定が記載されます。
```plaintext
auth_basic "Authentication Required - App";
auth_basic_user_file /etc/ingress-controller/auth/NAMELIST-b550d251-c940-4823-9ad5-817dbe128777-732ddfae-a1b4-429a-868b-df6b3a8ccc9d.passwd;
```
なおファイル名のハッシュ値みたいなのは勝手に生成されるものだと思います。
auth_basic には認証レルムが、auth_basic_user_file にはベーシック認証のファイル名が指定されています。なお後者の中身は Secret リソースのデータ部分を Base64 デコードされたものが入っています。

## auth-map について
ベーシック認証に複数のアカウントを設定したい場合があるかと思います。この場合、複数行記載された .htpasswd ファイル全体を Secret リソースのデータにし、上記同様に auth-secret-type として auth-file を指定することで設定ができます。

別の方法としては以下のような方法もあります。予めアカウント情報を以下のように用意してあったとします。
```text:auth_file.txt
USER1:PASSWORD1
USER2:PASSWORD2
```
```bash
:> tmpfile
for row in $(cat auth_file.txt)
do
    auth=$(echo ${row} | sed 's/:/ /')
    eval "htpasswd -nb ${auth}" | sed 's/:/=/' | grep -v ^$ >> tmpfile
done
kubectl -n NAMESPACE delete secret basic-auth
kubectl -n NAMESPACE create secret generic basic-auth --from-env-file=./tmpfile
```
こうすると Secret リソースは以下のようになります。
```yaml
apiVersion: v1
kind: Secret
metadata:
  name: basic-auth
  namespace: NAMESPACE
type: Opaque
data:
  USER1: BASE64ENCRYPTED_ENCRYPTED_PASSWORD1
  USER2: BASE64ENCRYPTED_ENCRYPTED_PASSWORD2
```
このようにデータ部分をユーザー名ごとに設定した Secret リソースとなります。この時 auth-secret-type には以下のように
```yaml
    nginx.ingress.kubernetes.io/auth-secret-type: auth-map
```
と指定することになります。
Ubuntu22.04でmmdetection3dのDockerイメージを作成する

# 免責事項
- 筆者は本記事の掲載内容を用いて行う一切の行為について, 何らの責任を負うものではありません.  
- 本記事を公開するにあたり, 掲載されている情報の正確性については万全を期しておりますが, 筆者は掲載内容の正確性・完全性・信頼性・最新性を保証するものではありません.  
- 筆者はリンク先サイトについて, その掲載情報の正確性･合法性等を保証するものではありません. リンク先サイトの利用によって生じた問題に対して筆者は責任を負いません.

# Introduction
Ubuntu22.04を使ってmmdetection3dのDockerイメージを作成しようとしたところ, 公式のDockerfileのビルドでエラーが発生した.  
そこでpytorchの公式イメージをベースにしてコンテナを作成し, mmdetection3d関係のライブラリをインストールした後, コミットすることでイメージとして保存した.  
その方法を以下で紹介する.

# Target Audience
- Dockerfileを書くことはできないが, Dockerを使った経験のある人
- mmdetection3d + Docker で開発を行いたい人

# Abstract
1. ベースとなるコンテナを作成
2. コンテナに必要なライブラリをインストール
3. コンテナをイメージとして保存
4. (おまけ)エラーの詳細

# 1. ベースとなるコンテナを作成
pytorchの公式イメージをベースにする.
```shell
docker pull pytorch/pytorch:1.12.1-cuda11.3-cudnn8-devel

docker run -it \
--gpus all \
-e HOME=/home \
-e DISPLAY=$DISPLAY \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-e NVIDIA_DRIVER_CAPABILITIES=utility,compute,graphics \
-e QT_X11_NO_MITSHM=1 \
-e LIBGL_ALWAYS_INDIRECT=1 \
--name test_mmdet3d \
--shm-size=4gb \
pytorch/pytorch:1.12.1-cuda11.3-cudnn8-devel
```

# 2. コンテナに必要なライブラリをインストール
[Get Started — MMDetection3D 1.2.0 documentation](https://mmdetection3d.readthedocs.io/en/latest/get_started.html)にしたがって必要なライブラリをインストール
```shell
# /homeで作業するため, .bashrcをコピー
# /rootで作業する場合は不要
cp -v /root/.bashrc ~/.bashrc

# aptを使ってインストール
apt update && apt install git libgl1-mesa-dev libglib2.0-0 -y

# mimを使ったインストール
pip install -U openmim
mim install mmengine
mim install 'mmcv>=2.0.0rc4'
mim install 'mmdet>=3.0.0'

# クローンしてインストール
git clone https://github.com/open-mmlab/mmdetection3d.git
cd mmdetection3d
pip install -v -e .

# デモ
# 点群と3Dボックスが描画される
mim download mmdet3d --config pointpillars_hv_secfpn_8xb6-160e_kitti-3d-car --dest .
python demo/pcd_demo.py demo/data/kitti/000008.bin pointpillars_hv_secfpn_8xb6-160e_kitti-3d-car.py hv_pointpillars_secfpn_6x8_160e_kitti-3d-car_20220331_134606-d42d15ed.pth --show
```
デモを実行すると次のような画像が出力される
![Screenshot from 2023-07-17 13-41-48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1333695/b30170b5-a99e-583a-921c-7a3e91b5d7ab.png)


# 3. コンテナをイメージとして保存
コンテナからデタッチして次のコマンドを実行
```shell
# コンテナをイメージとして保存
docker commit test_mmdet3d mmdet3d:1.2.0-pytorch1.12.1-cuda11.3-cudnn8-devel
```

# 4. (おまけ)エラーの詳細
公式のDockerfileをビルドしたときのエラーを示す.  
いつかDockerfileの修正により解決したい.
```shell
cd
git clone https://github.com/open-mmlab/mmdetection3d.git
cd ~/mmdetection3d
docker build docker

# 次のエラーが発生
# ERROR: failed to solve: process
# "/bin/sh -c rm /etc/apt/sources.list.d/cuda.list     
# && rm /etc/apt/sources.list.d/nvidia-ml.list     && apt-key del 7fa2af80     && apt-key adv 
# --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/3bf863cc.pub
# && apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub"
# did not complete successfully: exit code: 2
```

# Environment
## OS
`cat /etc/lsb-release`を実行して確認
| DISTRIB_ID          | Ubuntu               |
| ------------------- | -------------------- |
| DISTRIB_RELEASE     | 22.04                |
| DISTRIB_CODENAME    | jammy                |
| DISTRIB_DESCRIPTION | "Ubuntu 22.04.2 LTS" |
Private タイプの API Gateway で使用する VPC エンドポイント参照先をダウンタイムなしで切り替える


コスト削減と管理要素の集約が目的で、開発/検証/本番アカウントの各 VPC ごとに作成して参照していた VPC エンドポイント (以下、VPCE と略) を、共有リソース VPC で作成したそれに切り替える対応を行いまして、その際のメモになります。


## 前提知識のおさらい

通常、VPC 内から AWS サービスへアクセスする際の経路は、他インターネット接続と同様に IGW を通ります。
下図は Lambda から非 Private タイプの API Gateway (以下、API GW と略) にアクセスする経路例です。
Lambda の ENI ををインターネットに到達できない VPC 内に配置して S3 とか参照できなくなっちゃったの原因あるあるです。

![network-名前解決_IGW.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102816/d53a8e9a-f894-6cf9-8765-fb6a3c226f23.png)

インターフェース型の VPCE を作成した場合、
特定サービスを指すドメイン名であれば VPCE の ENI へ通信を向ける Private Hosted Zone によって
IGW ではなく VPCE を経由するようになります。
下図は Private タイプの API GW にアクセスする経路例です。

![network-名前解決_VPCE.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102816/62756a9b-68ff-e4a8-4382-3552f4307324.png)

突然出てきた Private Hosted Zone は、VPCE 作成時にある追加設定より「DNS 名を有効化」を選択すると自動で用意されます。
ホストゾーンの関連付けという機能で、内部的に用意された Private Hosted Zone を Route 53 Resolver (旧: Amazon Provided DNS) が参照できるようになります。

また、このホストゾーンの関連付けを手動で行うことで、他アカウントの VPCE を参照することもできます。
今回は、「DNS 名を有効化」によって作成された execute-api.[region name].amazonaws.com の VPCE を、共有リソース VPC で作成した別のそれに切り替える対応をしました。


## 参照する VPCE 切り替え時の問題

IGW を立ててはいけないなどの制約がないなら、参照先切替アカウントで
1. NAT GW などによるインターネットへの通信経路を確保
2. 切替アカウントにある 旧 VPC エンドポイントでホストゾーンの関連付けを削除
3. 共用リソース VPC の VPCE を参照するホストゾーンの関連付けを行う
4. トラフィック切り替えの確認後、旧 VPCE を削除

で可能ですが、Private タイプの API GW は VPCE 経由でのみ参照可能なため、
特に、DNS 名を有効化より Private Hosted Zone を用意されている場合で素直に同様の方法で行うと
ホストゾーンの関連付けを無効化した直後から API GW を参照するアプリの機能が止まってしまいます。

![network-VPCE移行_トラフィック断有.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102816/b51a995f-2093-ffe5-801a-cb43bffeb707.png)

最終的に execute-api.[region name].amazonaws.com すべての通信を 共有リソース VPC へ向けるためには、
同じ名前でホストゾーンの関連付けはできないので、旧 VPCE にて関連付けの削除を行う必要があります。


## 対応方法

この環境では Private API の参照を [API GW ID].execute-api.[region name].amazonaws.com のドメイン名正引きで行われていました。
なので、名前解決の優先順位を利用できます。

https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/hosted-zone-private-considerations.html

API GW の ID まで含めた FQDN でならホストゾーン名が重複せずに関連付けでき、
DNS 名を有効化によって用意されるホストゾーン名よりこちらのルールが優先されるので、
これを関連付けすれば、トラフィック断なしで VPCE の参照先を変更できます。

![network-VPCE移行_トラフィック断無.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102816/7b69f83d-7724-2261-a92d-eb568ecfd8fa.png)

具体的には
1. [API GW ID].execute-api.[region name].amazonaws.com の Private Hosted Zone を作成
2. 同ホスト名解決時に、移行先 VPCE を指すエイリアスレコード作成
3. このホストゾーンを VPCE 参照先切り替え元 VPC に関連付け
4. トラフィックが共有リソースへ切り替わったことを確認したら通常の関連付け入れ替え対応

でおこなえました。
実際の作業内容......はやってしまったので、後日、再現してまとめたいと思います。
【困惑】それは押しボタンなのか？、状態表示ランプなのか？


**昔のリアル操作盤**：（部品として**全４個**）
　起動釦、停止釦、運転中表示灯、休止中表示灯

操作間違いが起こり難く、分かりやすい心遣いでした。
　
**今の IT 風の機器**：（部品として**全１個**）
　運転/停止モーメンタリー押しボタン 兼 表示ランプ

　運転と停止操作は例として挙げたに過ぎませんが、**最近の IT 機器にはこれと同種の使い難さが随所にあります**。狭い表示画面を有効に使おうとした結果ではありましょうが、非常に困っています。その時々、１個だけの部品やその付近に文字やマークは表示されますが、下記の区別がつきません。

+ **「今がその状態です」（状態表示ランプ）のつもりなのか？**
+ **「クリックしたらその状態になります」（押しボタン）のつもりなのか？**

　昔（簡素なhtmlの時代）は、シンボルの形を見ただけで、ボタンと状態表示は容易に区別できました。しかし、今は、css や JS などでボタンもランプも自由な形に表現できるため、プログラマーが「ここぞ腕の見せ所」と弄んで流儀が乱立しています。本当に区別が困難です。利用者から見れば、アクセルとブレーキが一つのフットペダルに統合されたのと同じくらい迷惑です。これが原因で事故など起こらなければ良いが と思います。**早く統一してくれ～っ**。

**おまけ：**

　機器内蔵バッテリーの充電完了のサインも分かり難くて困ります。身の回りの機器をちょっと見渡しただけでも、これだけ見つかりました。**早く統一してくれ～っ**。

・充電量の棒グラフ表示
・充電量の数値表示
・連続点灯だが、充電中と充電完了で色が変わる
・充電中は点滅、充電完了で連続点灯
・充電中は連続点灯、充電完了で消灯
・充電中は連続点灯、充電完了してもそのまま
・その他色々

　**機器の動きがソフトウェアで作り込まれる現在、どちらの問題も、プログラマーが主導権をとって早く解決して欲しいと思います**。

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
　表示を疎かにしてはいけないという戒めとして、参考までに挙げておきます。

【スリーマイル原発事故原因のうちの一つ】
・掛札で隠されて見えない表示ランプがあった。
・異常を示すランプの色が不統一で操作員が混乱
　（緑が安全だけでなく、赤が安全のものもあった）
・弁の開閉状態ランプは実状態を示さず、指令状態を表示。
　（閉指令は出したが、実際は閉まらず。それでも閉表示）
AWSあるある5選

こんにちは。AWSあるある芸人のみのるんです。

（追記）
たくさん読んでいただきありがとうございます🙇‍♂️ 続編も書きました！

https://qiita.com/minorun365/items/4ee2cbc54b08266a97fa



# その①　EC2 いなくて焦った バージニア（川柳）

え、うそ…インスタンス消えてる!?
あ良かった、これus-east-1リージョンだったわ〜🤣

![スクリーンショット 2023-07-17 12.36.55a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/59a8af16-607d-6337-31b7-0d99934a49e0.png)

※頻発する方は、「デフォルトのリージョン」設定を確認してみましょう。

![スクリーンショット 2023-07-17 13.12.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/c06bb663-2039-1955-f6d5-c8c40e5a8592.png)



# その②　なかなかログイン成功させてくれないMFA

2段階認証コード絶対合ってるはずなのに、エラーに引っ掛かってなかなか入れない😂

![スクリーンショット 2023-07-17 12.45.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/bbdf3e77-f2d8-43c4-03b7-01964c2c79c1.png)

※MFAデバイスの再同期で解消することもあるので、恒常化している人は一度試してみましょう。

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_mfa_sync.html



# その③　NAT Gatewayの消し忘れで請求書二度見

ハンズオンで消し忘れて無事死亡するサービスNo.1？ 💸

![スクリーンショット 2023-07-17 12.51.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/a2132450-4a54-2e26-7c8f-2c5fe103d883.png)

※悲しい事故を防ぐために、個人利用の実験用アカウントでも料金アラーム等を設定しておくと安心です。

https://qiita.com/ayumu_/items/b8ecbefb8360a9ed70de



# その④　マネコンの日本語訳が逆に分かりづらい

＼ゼロのETL統合／

![スクリーンショット 2023-07-17 12.58.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/8e77865a-878f-3464-6815-effd432bc9b4.png)

※VPC格子は治ってました。こういうのが気になる方は英語表示で使っているようです。

![スクリーンショット 2023-07-17 12.53.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/bccf6f53-fa56-f937-dc2d-fa877b19c0f9.png)



# その⑤　新種発見!? 謎のエラーに遭遇しがちなお茶目なAWSマネジメントコンソール

特にリリースほやほやのサービスは遭遇率高いです。見つけたらラッキー!?

![FsloeNracAEctfV.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/12ce7710-6e63-9a1a-3a5b-ac4c238b47c5.jpeg)

※面倒がらずにサポートへフィードバックしてあげると、すぐに対応してもらえるケースもあるようです！

https://twitter.com/shonansurvivors/status/1680597635990970368?s=20



# おわりに

やはりAWSは利用者が圧倒的に多いだけあり、ちょっとした不具合の修正スピードもかなり早い気がします。新しい機能やサービスをバンバン出して、フィードバックをガンガン取り込んでくれるのは最高ですね！

（追記）
たくさん読んでいただきありがとうございます🙇‍♂️ 続編も書きました！

https://qiita.com/minorun365/items/4ee2cbc54b08266a97fa
Javaラムダ式


# Javaのラムダ式

関数型インターフェイスを実装したクラスのインスタンスを、簡単に作るための文法です。
言い換えれば、クラスの宣言とインスタンスの生成を同時に行う文法。

Javaのラムダ式で関連するのは、関数型インターフェース、またこの関数型インターフェースは抽象メソッドを一つだけもつ。

<font color="red">１つだけ</font>というところがポイント。

# 通常のクラスからラムダ式になるまで

https://www.bold.ne.jp/engineer-club/java-lambda-expression

こちらを参考に学んでみました。

## 第１段階（内部クラス）

```java
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        
        class ComparatorImpl implements Comparator<String> {
            public int compare(String s1, String s2) {
                return s1.compareTo(s2);
            }
        }
        
        Comparator<String> c = new ComparatorImpl();
        System.out.println(c.compare("ABC", "DEF"));
    }

    
}
```

## 第2段階(匿名クラス)

```java
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {

/*        
        class ComparatorImpl implements Comparator<String> {
            public int compare(String s1, String s2) {
                return s1.compareTo(s2);
            }
        }
*/        
        Comparator<String> c = new Comparator<String>() {
            public int compare(String s1, String s2) {
                return s1.compareTo(s2);
            }
        };
        System.out.println(c.compare("ABC", "DEF"));
    }

    
}
```

```java
Comparator<String> c = new ComparatorImpl();
```
の右辺が new Comparator<String>()になり、さらに{}内に式を書きます。

## ラムダ式完成形

1. 右辺のComparator<String>()を削除します。
1. 抽象メソッドcompareメソッドのpublic intを削除します。
1. 抽象メソッドcompareも削除します。
1. 抽象メソッドの引数の型Stringを削除します。
1. 抽象メソッドのreturnを削除します。
1. new Comparator<String>()も削除します。
1. {と}を削除し、抽象メソッドの引数から処理部分は->でつなぎます。


```java
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        Comparator<String> c = (s1, s2) -> s1.compareTo(s2);
        System.out.println(c.compare("ABC", "DEF"));
    }
}
```


だいぶ簡単になりましたね。
抽象メソッドが１つということで引数や戻り値の型をかかず、省略できました。
Rubyのライブラリoptparseについて調べてみた

## はじめに

個人学習でカレンダプログラムを作成するにあたり、Rubyのライブラリ`optparse`を使用しました。使用するにあたり、[Rubyの公式マニュアル](https://docs.ruby-lang.org/ja/latest/library/optparse.html)を読むだけでなく、実際にプログラムを動かして、調べてみましたため、その記録を残します。



## 本題

`optparse`の機能について簡単に申し上げますと、Rubyプログラムを実行する際に指定しているオプションを扱うためのライブラリです。

例えば、`ruby sample.rb -a foo bar -b baz`のように`-a foo bar -b baz`箇所をsample.rbの中で使用したい場合に使用するライブラリです。以下は[Rubyの公式マニュアル](https://docs.ruby-lang.org/ja/latest/library/optparse.html)から引用して、少しだけ内容を変えたプログラムになります。

```ruby:sample.rb
require 'optparse'
opt = OptionParser.new

opt.on('-a') {|v| p v }
opt.on('-b') {|v| p v }

p ARGV

opt.parse!(ARGV)
p ARGV
```

色んなパターンでプログラムを実行してみました。

- オプション及び引数を渡すパターン
```
ruby sample.rb -a foo bar -b baz
["-a", "foo", "bar", "-b", "baz"]
true
true
["foo", "bar", "baz"]
```

- オプション及び引数を渡さないパターン
```
ruby sample.rb                  
[]
```

- オプションのみを渡すパターン
```
ruby sample.rb -a                      
["-a"]
true
[]
```

- `opt.on`で登録していないオプションを渡すパターン
```
ruby sample.rb -c
["-c"]
sample.rb:9:in `<main>': invalid option: -c (OptionParser::InvalidOption)
sample.rb:9:in `<main>': invalid option: c (OptionParser::InvalidOption)
```

- 上記のプログラム実行したことでわかったこと。
    - `ARGV`はプログラムを実行した際に渡された引数が格納されていること。
    - `opt.on`で指定したオプション（`-a`や`-b`）の引数("foo", "bar", "baz")を`parse`後に取得できること。
    - `{|v| p v }`はプログラムを実行する際に`-a`または`-b`のオプションを渡された際に`true`となること。
    - オプションを渡さなかった際には`true`が表示されないこと。
    - `opt.on`で指定していないオプションは渡せないこと。


今回実装するカレンダプログラムではオプションと引数で表示するカレンダーの月を指定できるようにしたいので、**オプションを指定する場合は引数も渡せるようにしたいと考えております。**
`-a`みたいなオプションだけ渡せてもあまり意味がないため、オプションを指定する場合は引数も必須で指定したいと思います。

そのような機能はあるかマニュアルを読んでみたところ、、、

`opt.on('-a VAL')`みたいに`VAL`を書いてあげると、引数も必須にできます。**VALでなくても任意の文字であれば機能しますので、VALである必要はありません。**
実際にプログラムを修正して試してみます。

```ruby:sample.rb
require 'optparse'
opt = OptionParser.new

opt.on('-a VAL') {|v| p v }
opt.on('-b') {|v| p v }

opt.parse!(ARGV)
p ARGV

```

- 引数なしで実行した結果

```
ruby sample.rb -a
sample.rb:8:in `<main>': missing argument: -a (OptionParser::MissingArgument)
```

- 1つの引数ありで実行した結果

```
ruby sample.rb -a 11   
"11"
[]
```

- 2つの引数ありで実行した結果
```
ruby sample.rb -a foo bar -b baz
"foo"
true
["bar", "baz"]
```

- 上記のプログラム実行したことでわかったこと。
    - 引数は必須になったこと。必須がないとエラーメッセージが出るようになった。
    - ブロック`{|v| p v }`では`true`しか表示されていなかったが、`-a VAL`に変更したことで、ブロックには引数が渡されるようになった。カレンダープログラムを実装する際には、引数で渡された値を変数に格納して、後続処理で利用する必要がある。
    - 引数に2つ（`-a foo bar`）渡したものの、1つ目しかブロックに渡されていない。


## 感想

公式ドキュメントを読むだけでは腑に落ちなかった箇所や細かい使用までは理解できませんでしたが、実際にプログラムを動かしてみることで、気づくことが多かったです。学習前はカレンダプログラムの引数を必須にしようという点は考慮しきれておりませんでしが、ライブラリの調査をしていく中で引数は必須にした方が良いという気づきにもなりました。

今後もドキュメントを読むだけでなく、実際に手を動かすことでRubyに関する理解を深めていきたいです。
世の中見てます

私は今となっては、歳をとった元々車の生産技術のエンジニアです。
設備系のシステム考えたりも過去ありましたが・・・自分でもマイコンで遊んだりしています。

当たり前のことを書きます。
正直、ＩＴエンジニアに限らないかも。。。

**時間は一方通行、自分は成長～劣化していく**
意外に理解できないのがこれ。
「時間制限」はありますし、成長もしますが、劣化もしていきます。
また、世の中の正しいものも流行りも変わっていきます。
安心してホッとしてたら置いて行かれるし、いつまでも同じことやってたら「あいつ何やってんだホッとけ」です。
頑張ることも必要、見切りするのも必要。

**しんどいのが当たり前らしい**
よく、不満愚痴を言っている人がいますが。。。
ずーっと言ってますよね。
何も起こらなくて＆しなくて、お金入ってくるのが理想なのかな？
いやいや、創作的な仕事したくて「エンジニア」になったんでしょ。
黙々新しい知識を入れて、黙々こなしていきましょう。

**案外世の中の評価は間違ってない**
コツコツ、小さくてもアウトプット出してる人は案外見られてないようで見られています。
3割打者が出世するってのがそれです。
派手に滑って起き上がって、楽しんでいる人が意外に評価低いのもそのせいです。（任せられない）
なんでも安定してアウトプット出せるってのは安心感とともに大事

**ところでエンジニアって何**
医者には医師免許あります。
弁護士には司法試験あります。
エンジニアには？　情報処理とかの検定試験はありますけどね。。
自称でもエンジニア。そもそも社会的な地位なんて無いですよ。気を付けて！
InDesign のスクリプトでメニュー項目を開く/実行する方法

# スクリプトでメニュー項目を開く/実行

InDesignのメニュー項目をスクリプトで開くまたは実行したい場合、メニューIDを用いてメニュー項目の実行ができます。

```javascript
// 「InDesign を終了」のメニューの実行例
var idNum = 267; // 「InDesign を終了」のメニューID
app.menuActions.itemByID(idNum).invoke(); // 「InDesign を終了」を実行
```

# InDesignのメニューIDの取得
しかし、InDesignのメニューIDを取得するためには、別の方法が必要です。
メニューIDを取得する方法の1つは、以下のようにメニューのIDのリストを取得するスクリプトを実行して、InDesignのメニューIDを取得することができます。

```javascript
// メニューID取得後、csvファイルに出力

// C:\Users\(ユーザー名)\Documents\action.csvでファイル生成
var filePath = "action.csv";

var fileObj = new File(filePath);
fileObj.open("w");
fileObj.encoding = "shift-jis";

// ヘッダー作成
fileObj.writeln("Name,Area,Id");

// メニューを情報取得して、ファイルに出力する
var appMenuActions = app.menuActions;
for (var i = 0; i < appMenuActions.length; i++) {
  fileObj.writeln(
    appMenuActions[i].name + "," + appMenuActions[i].area + "," + appMenuActions[i].id
  );
}

fileObj.close();
```

出力したcsvファイルを確認すると、以下のようにメニュー名、メニューの領域、メニューIDを確認することができます。

![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1184971/e57e32de-260c-83e1-0813-fa96554db1c9.png)
---
※ menuActionのプロパティやメソッドなどについては、こちらで詳細の確認が可能です
- https://www.indesignjs.de/extendscriptAPI/indesign-latest/#MenuAction.html
- http://indesign.cs5.xyz/dom/MenuAction.html

# 参考
- http://kasyan.ho.ua/tips/indesign_script/all/open_menu_item.html
プロキシサーバーは5分で建てれるよ。


事前準備が必要だよ。

- docker engin
- git



# squidとは何か?

プロキシサーバーを実装するためのソフトウェア。



# インストール方法

## ソースダウンロード

次のページからダウンロードする

https://github.com/new-awesomedocker/squid

または、

```
git clone https://github.com/new-awesomedocker/squid.git
```

## 実行方法

`docker-compose.yml`のディレクトリがある場所まで移動する。
その後、以下のコマンドで起動

```sh
docker-compose up -d
```


## ログを確認してみる

```sh
docker logs -f mysquid
```


## ブラウザから見てみる

以下のurlにアクセスする。

http://localhost:3128/


<img src="https://github.com/new-awesomedocker/squid/blob/main/screenshot/1.png?raw=true">
ヒザンチン将軍問題とその対処法: ブロックチェーンを理解するための一歩

今日は分散システムとブロックチェーンの世界でよく出てくる「ビザンチン将軍問題（Byzantine Generals' Problem）」について解説します。この問題は、ブロックチェーン技術やビットコイン、そしてその他の分散型ネットワークの理解にとても重要です。

## ビザンチン将軍問題とは何か？

「ビザンチン将軍問題」という名前は、1982年に出版された論文 "The Byzantine Generals Problem" から来ています。これは、分散システムの信頼性に関する問題を表しています。

問題は次のように設定されます：ビザンチン軍の将軍たちは、それぞれ異なる場所から敵の都市を包囲しています。彼らは攻撃のタイミングについて合意しなければなりません。しかし、彼らは連絡を取る唯一の方法は信者にメッセージを託すことで、しかもそれらの信者の中には裏切り者がいるかもしれません。どの将軍も、他の将軍が裏切り者かどうか、またはその信者が裏切り者かどうかを知る方法はありません。

この問題は、裏切り者が存在する可能性がある状況下で、分散システム（この場合、将軍たち）が一貫性を持つためにはどうすれば良いかを問うものです。

## なぜ重要なのか？

この問題は、ネットワーク内での信頼とコンセンサスの問題を体現しています。実際の分散システムでは、ネットワークのノード（コンピュータ）が故障するか、意図的に誤った情報を提供する可能性があります。このような「故障」は「ヒザンチン故障」と呼ばれ、これに耐えるシステムは「ヒザンチン耐性」と呼ばれます。

特にブロックチェーンのような分散型ネットワークでは、ネットワークの参加者（ノード）が全て信頼できるわけではないため、ヒザンチン将軍問題のような信頼性の問題が重要となります。ヒザンチン容認性を持つシステムは、ノードが故障しても、または意図的に誤った情報を提供しても、全体として正確な情報を維持できます。

## ビザンチン将軍問題の解決策

ビザンチン将軍問題を解決するためのアルゴリズムは、一般に「ビザンチンフォールトトレランス（BFT）アルゴリズム」と呼ばれています。これらのアルゴリズムの目的は、ネットワークの全てのノードが合意に達する（つまり、コンセンサスを達成する）ことを確保することです。

そのようなアルゴリズムの一つに、ビットコインの背後にある「Proof of Work（PoW）」があります。PoWは、各ノードが「仕事の証明」を提供することで、ネットワーク全体が合意を形成することを可能にします。つまり、それぞれのノードが一定の計算量の仕事を終えた証明を提供します。これにより、情報が改ざんされたり、不正な情報がシステムに導入されたりすることを防ぎます。

ただし、PoWは大量のコンピューティングリソースと電力を必要とします。このため、より効率的な代替手段として、「Proof of Stake（PoS）」や「Byzantine Fault Tolerance（BFT）」アルゴリズム（例えば、PaxosやRaft）が提案されています。これらのアルゴリズムは、PoWのように大量のリソースを必要とせず、かつネットワークが一貫性を維持することを保証します。

## 結論

分散システムは奥深い。。
ビザンチン問題の解決は、ブロックチェーン技術の発展とともに進んでいます。この問題を解決することで、分散型ネットワークの安全性と信頼性を向上させることができます。ブロックチェーン技術をフル活用すれば金融システムから航空機の情報管理システムまで様々な領域で大活躍すること間違いなし。
LlamaIndexでAzure OpenAI Serviceを利用する

### はじめに
LlamaIndexは、Retrieval Augmented Generation (RAG) の実装ができるフレームワークです。
On Your Data よりも安価で構築できるので、手軽に始めるのに向いていそうです。

LlamaIndexでAzure OpenAI Serviceを利用するための設定を備忘録として残しておきます。

### EmbeddingモデルのAPIを設定する
Azure OpenAI Serviceを利用する場合は、Embedding用の設定を記載する必要があります。
以下のパラメータを定義して、モデルを作成してください。
参考: [Azure OpenAI - LlamaIndex 🦙 ](https://gpt-index.readthedocs.io/en/latest/examples/customization/llms/AzureOpenAI.html#azure-openai)

- `openai.api_type` : 「azure」と指定してください。
- `openai.api_base` : Azure OpenAI ServiceのURLを指定してください。
- `openai.api_version` : APIのバージョン。執筆時点の最新は「2023-06-01-preview」。
- `openai.api_key` : OpenAI ServiceのAPIキーを指定してください。
- `model_name`: モデル名。執筆時点の最新は「text-embedding-ada-002」。
- `deployment_name`: Azure OpenAI Serviceのデプロイ名を指定してください。

```python:Embedding用のLLMモデルを設定する
# 各種パラメータを設定する
openai.api_type = "azure"
openai.api_base = "https://xxxxx.openai.azure.com"
openai.api_version = "2023-06-01-preview"
os.environ["OPENAI_API_KEY"] = "xxxxxxxxxx"
openai.api_key = os.getenv("OPENAI_API_KEY")
model_name = "text-embedding-ada-002"
deployment_name = 'xxxxxxxxxx'

# Embedding用のLLM設定を作成する
embedding_llm = LangchainEmbedding(
    OpenAIEmbeddings(
        model=model_name,
        deployment=deployment_name,
        openai_api_key=openai.api_key,
        openai_api_base=openai.api_base,
        openai_api_type=openai.api_type,
        openai_api_version=openai.api_version,
    ),
    embed_batch_size=1,
)
```

:::note info
Service Contextを定義する際は、作成したモデルを引数に追加してください。

```python:Service Contextを定義する
service_context = ServiceContext.from_defaults(
    llm_predictor=llm_predictor,
    embed_model=embedding_llm,
)
```
:::


### プロンプトを修正する

`gpt-35-turbo`では、`system`・`user`・`assistant`を定義できます。
LlamaIndexで使われているプロンプトを修正することで、回答の精度を上げられます。
2種類のプロンプトを以下のように修正してください。
※プロンプトの書き方については、[プロンプトエンジニアリングガイド](https://www.promptingguide.ai/jp/introduction/examples#%E8%B3%AA%E5%95%8F%E5%BF%9C%E7%AD%94)を参考にしています。

```text:qa_prompt

system
あなたはXXXに関する質問に回答するアシスタントです。
以下の文脈を利用して、1～2文で簡潔に回答してください。
文脈: {context_str}



user
{query_str}



assistant
```

```text:refine_prompt

system
あなたはXXXに関する質問に回答するアシスタントです。
新たな文脈を利用して、元の回答をより適切に質問に答える形に改善してください。
文脈: {context_msg}
元の回答: {existing_answer}



user
{query_str}



assistant
```

上記のプロンプトを、query_engineの宣言時の引数に加えてください。
```python:query_engineの宣言
query_engine = index.as_query_engine(
    text_qa_template=QA_PROMPT,
    refine_template=REFINE_PROMPT
)
```

:::note info
Chat Markup Language(ChatML)というフォーマットを使っています。
詳細は以下のサイトなどをご確認ください。
[本家 OpenAI と Azure OpenAI Service の ChatGPT API の比較](https://zenn.dev/microsoft/articles/59448047cd5ed9)
:::

### おわりに
LlamaIndexは頻繁にバージョンアップするので、まずは公式ドキュメントをご確認ください。
初投稿で拙い箇所もあったかもしれませんが、誰かのお役に立てれば幸いです。
ご意見ご指摘などありましたらコメントください。
【ChatGPT無】でカレンダー作成に挑戦（表示されるものの……）

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

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

　今回は、
　　カレンダーの作成です。

　これです。
　　ChatGPTさんが
　　　作成しました。

| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
|----|----|----|----|----|----|----|
|    |    |    |    |  1 |  2 |  3 |
|  4 |  5 |  6 |  7 |  8 |  9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |

　ちなみに、
　　これは2023年7月ですw

　1日は土曜日なのに、
　　木曜日からはじまっています。

　正しい出力に
　　なるときもありますが、
　　　安定しません。

　最初は、
　　2021年9月の
　　　カレンダーを作成してから
　　　　目的の年月の
　　　　　カレンダーを
　　　　　　作成する方法という
　　　　　　　やり方をしました。

　これは比較的、
　　成功率が高かった。

　それで、
　　今度は、
　　　まず入力した年月から
　　　　1日の曜日を出させました。
　　　　　曜日はOK。
　　　　　　それを使って、作成。

　しかし、
　　正しくはなりませんでした。

　それどころか、
　　表示も右往左往。

　毎度おなじみ、
　　プログラムコードを出力したり。
***
　まぁ、得られたこともありました。

　“ツェラーの公式”と
　　いうものがあると
　　　知れたこととか。

　複雑な公式を
　　ChatGPTさんが
　　　表示できるとか。

　これを
　　コピったら、
　　　文字化けした（泣）
***
　まぁ、
　　使えませんけれど、
　　　Promptをアップ
　　　　しておきます。

　表示できたら、
　　いいな程度のものなので、
　　　参考程度に。

　ちなみに、
　　同じプロンプトを
　　　GoogleBardさんと
　　　　MicrosoftBingさんに
　　　　　投げたところ、
　　　　　　厳密Bingさんが
　　　　　　　正しく出力したです。
```Text:カレンダー作成Prompt
# 目的
指定の月日から正しい曜日を求め、正しい曜日からスタートするカレンダーを作成する。

# 注意点
- コード出力は不要。
- 出力は、マークダウン記法のテーブルで出力・表示してください。
- カレンダーの最初の曜日は指定された日に基づいて正しく設定されている必要があります。
- 見出しは、日月火水木金土でお願いします。
- 出力は、見出しと中身をセットでお願いします。

# 出力例
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
|----|----|----|----|----|----|----|
|    |    |    |    |  1 |  2 |  3 |
|  4 |  5 |  6 |  7 |  8 |  9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |

# 入力
- year (数値): カレンダーを作成する年を入力してください。
- month (数値): カレンダーを作成する月を入力してください。
- day (数値): 入力必要なし。1固定。

# 処理手順
1. 入力された年、月、日を基に、指定された日の曜日を求め（ツェラーの公式にて）、表示。→Ａ
2. Ａを基にして、カレンダーの見出しを正しい曜日の順序で表示します。
3. カレンダーの日付を週ごとに出力します。最初の週は指定された日の曜日から始まります。
4. カレンダーの日付は週ごとに7日ずつ出力し、行が必要な場合は次の行に移動します。
5. カレンダーの最後の行が週の途中で終わる場合は、空白のセルを追加してカレンダーを完成させます。

# 最終確認
上記の指示を理解できたら、年月の入力を促して待機してください。

理解できない箇所は、指摘してください。
```

　ちなみに、
　　このPromptの処理手順は
　　　ある程度の出力が得られる
　　　　くらいになったところで、
　　　　　ChatGPTに作成してもらい
　　　　　　手を入れました。
***
　2023/07/14のさきほど、
　　iPhoneアプリの人から、
　　　ふつうに出力できている
　　　　と報告ありました。

　無料版だから、
　　ダメなのか……残念（ガクッ）

　試しに、
　　Bingさんで
　　　シンプルに頼んだら、
　　　　ふつうに出てきた（涙）
SAP Universal IDのパスワードリセットについて

https://qiita.com/SAITO_Keita/items/399bcc99c2cfe436e5b1

上記の記事で、`SAP Donwload Manager`で利用する`SAP Universal ID`に紐づけた`S-User`個別のパスワードリセットについて書きました。

本記事では大本の`SAP Universal ID`のパスワードリセットについてしらべてみます。

## ドキュメント

[2882938 - How to reset or change SAP Universal ID (UID) password](https://me.sap.com/notes/2882938/E)

[SAP Universal ID – How to change or reset your SAP Universal ID password](https://support.sap.com/content/dam/support/en_us/library/ssp/my-support/users/uid_reset_password.pdf)

## 方法は2種類

`SAP Universal ID`のパスワードリセット方法としては下記の2種類となります。

- [SAP Universal ID Account Manager(https://account.sap.com)](https://account.sap.com) からパスワードリセット
- `SAP for Me`の`FORGOT PASSWOR`からリセット

## SAP Universal ID Account Managerからパスワードリセット

- [SAP Universal ID Account Manager(https://account.sap.com)](https://account.sap.com) からパスワードリセット にリセットしたい`SAP Universal ID`でログインします。

メニューの`Security & Login'からリセットします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/4e7aba9c-ff97-c17c-9b2d-47974a549bfe.png)

### Accountsのメニューからは紐づいている個別のアカウントIDもパスワードリセットできる

なお、`Accounts`のメニューから紐づいている個別のユーザーIDの詳細画面からにもパスワードリセットがありますが、こちらは`SAP Universal ID`ではなく、紐づくユーザーID個別のパスワードリセットとなるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/14431ef8-478a-a1b0-1c8f-d350b09591a0.png)

## SAP for MeのFORGOT PASSWORからリセット

[https://me.sap.com](https://me.sap.com)にログインして、`Sign in`をクリック。

`SAP ID Service`の画面が出てくるので、`SAP Universal ID`で利用しているメールアドレスを入力して続行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/7d176c7f-b47e-6612-0111-f2be57422562.png)

パスワード入力ボックスとパスワードを忘れた場合がでてくるので、パスワードを忘れた場合をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/d2e552bc-9dcf-3505-bc28-752299f6abfd.png)

リセットしたい`SAP Universal ID`で利用しているメールアドレスを入力して続行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/8ed7b299-f745-4750-0266-bec3fa5ee15b.png)

入力したメールアドレスにパスワードリセットのリンクが書かれたメールが届くので、そちらからパスワードリセットを実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/9e5b57dc-33b0-5345-8851-a17a0f9cee39.png)

届いたメール

![image.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F1670622%2Fa11eccd1-d112-ee51-ba2b-9dec0e4d82f1.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&w=1400&fit=max&s=2351c088df76732ccef11ef7bfd1d776)

## 変更できるのは24時間で1度だけ

ノートにも記載がありますが、`SAP Universal ID`のパスワードリセットは24時間ごとにリセット可能なようです。

なにかミスると一日待ちになるので、注意しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/063cd79a-538c-c2d4-ed34-16788f4953a1.png)

## 総評

`SAP Universal ID` と `S-User`が紐づいてはいますが。
パスワードはそれぞれで設定されているため、`SAP Universal ID`のパスワードリセットをしてるつもりで、紐づくユーザーのパスワードをリセットをしてしまっていたり。

なんてミスもありそうな気はします、ここらへん自分が今どのユーザ（`SAP Universl ID` or `S-User`）を対象にパスワードリセットしているか確認しながらパスワードリセットする必要があります。
プログラマ泣かせのブラウザキャシュ

## 直したはずのCSSが当たっていない
CSSの修正って結構面倒ですよね。もちろん最近はCSSを直接編集せずSASSの技術を使うことが多いと思います。それでも、細かい数字を調整するのは苦労します。
それでやっとできたと思って、確認すると何も変わっていない。これほどガックリすることはありません。
SASSのコンパイルがうまくいってないのか？CSSファイルを直接エディタで確認しても、ちゃんとコンパイルされています。
実際、これで１時間ぐらい悩むのことは何度かありました。

![](https://storage.googleapis.com/zenn-user-upload/03ba3b196117-20230628.jpg)


## そんな時は強制リロード
まず、試してもらいたのがこの強制リロードです。それってなにかというと、修正したCSSファイルやJSファイルを強制的に再読み込みすることです。

このブログをご覧になっている方々にとっては当然のこととは思いますが、あえて説明しておくとブラウザは常に画面に表示すべき内容（専門的な表現だとレンダリングすべきDOM要素）を常に全てサーバーから読み込んでいるわけではありません。DOM要素以外のCSSファイルやJSファイル、イメージファイルなども同様で、一度読み込んだデータはキャッシュと呼ばれるメモリに保存され、変化がないと判断するとそれを使いまわすのです。これは重要な機能でパフォーマンスの維持には欠かせません。この機能があるから画面がサクサク切り替わるのです。

しかし、これがCSSやJSを修正したのに直っていないという原因になるのです。ですから、Web制作に携わる方々はそのことを常に念頭に置いて、クライアント様にはそのことを伝えないといけません。

「そんなのリロードすれば勝手にやってくれてんじゃないの？」「再起動すればさすがに再読み込みするんでしょ。」なんて思われがちでしょうが、そうはいきません。下記の操作以外では、強制リロードと同じ効果は得られません。

![](https://storage.googleapis.com/zenn-user-upload/a11b7a8a710e-20230628.jpg)

![](https://storage.googleapis.com/zenn-user-upload/735fccc3dd6f-20230628.jpg)


## でも、実際には強制リロードって難しい
キーボード操作で簡単に実行できる強制リロードですが、一般ユーザーはその方法をほぼ知らないでしょう。そのため、これを素人のクライアント様に伝えるのはかなり困難です。

また、パソコンは上記の方法で簡単に操作できますが、スマホの場合はそんなキー操作ができません。かなり面倒な操作が必要で、私などなんどやっても覚えられません。この方法を説明しだすとそれだけで一記事になるので、ここではしません。参考となるURLを張っておきますのでそちらをご覧ください。

[スーパーリロードのやり方は?スマホやiPhoneとブラウザ別で紹介](https://toshiba-vegeta-cp.jp/superreroad-howto/)

![](https://storage.googleapis.com/zenn-user-upload/53fb46edfe4c-20230628.jpg)


## ということで結論です
ご存じのとおり、ブラウザは次のようなコードでcssファイルやjsファイルを読み込んでいます。
```
link rel="stylesheet" href="./css/example.css
```
先ほどブラウザは、「前に読み込んだファイルに変化がないと判断するとそれを使いまわす」と説明しましたが、このようにファイル名が固定されているとファイル名が変わらない限り、過去に読み込んだファイルと判断してしまうのです。
ですが、逆にいうとファイル名が変われば再度読み込みを行います。つまり、再読み込みの際にファイル名が変わっていればよいということです。その方法は以下のとおりです。
```
link rel="stylesheet" href="./css/example.css?&lt;?php echo date('YmdHis')
```
つまり、ファイル名のあとに?'.date('YmdHis')というスクリプトをつけてファイル名をかえるというわけです。date('YmdHis')は時間を返すPHPの関数です。したがって、このスクリプトはブラウザに読み込んだ時間付のファイル名を渡すことになり、違うファイル名になるため、過去に読み込んだことがあるという判断はできないことになります。これで常に新しいCSSが読み込まれるという仕組みが出来上がります。
しかし、この方法はPHPのスクリプトが機能することが前提なので、静的なHTMLファイルでは実現できません。また、どんなファイルにも、この設定をしてしまうとキャッシュ機能が失われるのでmp4の動画ファイルのような大容量のファイルに、この手法を適用するのはまずいと思います。そんなファイルについては、やはり強制リロードによるしかないと考えます。
CSSやJSはいくら長いといっても１MBに達することはないでしょう。また、これらのファイルはバージョンアップの度に変わるもので、不特定多数のユーザーが利用するプラグインなどでは強制リロードの説明は困難ですから、利用価値は非常に高いと思います。
ということで最後にWordpressサイトでよく使われるスクリプトの書き方を紹介します。テーマならfunction.phpに、プラグインならエントリポイントとなるPHPファイルに埋め込んで使用してみてください。
```
function my_script_init()
{
  wp_enqueue_style('my', get_template_directory_uri() . '/css/style.css?'.date('YmdHis'), array(), '1.0.0', 'all');
}
add_action('wp_enqueue_scripts', 'my_script_init');
 ```
AWS、Githubと比較して理解するブロックチェーン

こんにちは、皆さんはブロックチェーンについて聞いたことはありますか？多くの人がブロックチェーンの名前を耳にしたことがあるかもしれませんが、その具体的な仕組みや利点を完全に理解している人は少ないかもしれません。そこで今日は、もっと馴染み深いAWSやGithubといったサービスと比較しながら、ブロックチェーンの特性や利点を明らかにしてみたいと思います。

## ブロックチェーンとAWS: 分散データベースとしての共通点と相違点

AWSとブロックチェーンは、両者ともにデータを管理し、処理するシステムであり、その点で共通性を持っています。しかし、その運用方法と目的は大きく異なります。

**共通点**: AWSでは、Amazon Auroraという分散型のリレーショナルデータベースを提供しています。これは、単一のデータベースを複数の地域やアベイラビリティゾーンにレプリケートし、高い可用性と耐久性を確保します。ブロックチェーンも同様に、全ノードがデータベースのコピーを持つ分散型のシステムです。

**相違点**: AWSのサービスは中央集権的な構造であり、Amazonが全体の管理と制御を行います。それに対し、ブロックチェーンは非中央集権的であり、ネットワークの全ノードが等しくデータの検証と承認を行います。また、AWSではデータの変更や削除が可能ですが、ブロックチェーンではデータは基本的に不変です。

## ブロックチェーンとGithub: 分散データベースとしての共通点と相違点

Githubは、開発者がプロジェクトを共有し、協力してコードを開発するためのプラットフォームです。その一方で、ブロックチェーンは分散型のデータベースであり、取引の履歴やデータを一貫性を保って保存します。

**共通点**: Githubとブロックチェーンの両者は、データを分散して保存するという点で共通しています。Githubでは、各開発者がリポジトリのローカルコピーを持つことが可能です。ブロックチェーンもまた、全ノードが全てのデータを保持します。

**相違点**: Githubは中央集権的なシステムであり、最終的なデータの管理はGithubのサーバーに依存します。ブロックチェーンは非中央集権的であり、ネットワーク内の全ノードがデータの管理を共有します。また、Githubではコードの改変や削除が可能ですが、ブロックチェーンではデータは不変性を持ちます。

## ブロックチェーンとAzure Cosmos DB: 分散データベースとしての共通点と相違点

Azure Cosmos DBは、マルチリージョンのレプリケーションをサポートする分散データベースサービスです。それに対し、ブロックチェーンもまた分散データベースであり、全ノードが同一のデータベースを保持します。

**共通点**: Azure Cosmos DBとブロックチェーンは、ともにデータを分散して保持するシステムです。Cosmos DBはマルチリージョンのレプリケーションをサポートし、全地域でのデータの一貫性を保証します。ブロックチェーンもまた、全ノードがデータベースの完全なコピーを持つことでデータの一貫性を保証します。

**相違点**: Cosmos DBはMicrosoftが管理する中央集権的なシステムです。一方、ブロックチェーンは非中央集権的で、全ノードが等しくデータの検証と承認を行います。また、Cosmos DBではデータの変更や削除が可能ですが、ブロックチェーンではデータは基本的に不変性を持ちます。

## ブロックチェーンと他の分散データベースの共通点と相違点のまとめ

以上の分析から、ブロックチェーンと他の分散データベースやサービス（AWS、Github、Azure Cosmos DB）にはいくつかの共通点と相違点が見つかりました。

### 共通点:

1. **分散化**: ブロックチェーンとこれらのサービスは、データを複数のノードに分散させて保存します。これにより、システムの耐障害性とデータの可用性が向上します。

2. **データの一貫性**: データが分散して保存されているにもかかわらず、データの一貫性を維持するメカニズムを持っています。これにより、ユーザーはデータの完全性と信頼性に依存できます。

### 相違点:

1. **中央集権性と非中央集権性**: AWS、Github、Azure Cosmos DBは中央集権的なシステムであり、それぞれの会社が全体の管理と制御を行います。それに対し、ブロックチェーンは非中央集権的であり、ネットワークの全ノードが等しくデータの検証と承認を行います。

2. **データの不変性**: これらのサービスでは、データの変更や削除が可能です。一方、ブロックチェーンでは一度記録されたデータは基本的に不変です。これにより、ブロックチェーンは高いレベルの透明性と信頼性を提供します。

以上の理解を通じて、ブロックチェーンがどのように他の分散データベースと異なるか、そしてそれぞれのシステムがどのような利点と制約を持つかを理解することができます。これらの理解を基に、シチュエーションに応じた適切な技術選択が可能となります。
MOD Dwarfを無料で使ってみよう(1)

### はじめに

#### MOD Dwafとは

MOD Dwarfとはドイツの会社、MOD Audioがクラウドファンディングで開発したギター・マルチエフェクター＆アンプ・シュミレーターです。

https://www.kickstarter.com/projects/modduo/mod-dwarf

日本での取り扱いはイシバシ楽器と株式会社エレクトリです。

https://mod.audio/retailers/?lang=ja

![screenshot_2023-07-17T10:43:58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129361/14962bb9-53ce-d0d8-68d1-5c60aed4475f.png)

Arch Linux上のDockerコンテナ?で動作しており、オープンソースのlv2プラグイン(Linux版のVSTプラグインのようなもの)や、製品版では有料のlv2プラグインも利用できます。

開発はドイツで行っているようですが、Linuxの音楽環境開発では欠かせないfalkTXさんやGuitarixのbrammer10さんなども携わっているようです。

最新のソースでは今流行りのニューラルネットワークモデルを利用したNeural Amp Modeler lv2([https://github.com/mikeoliphant/neural-amp-modeler-lv2](https://github.com/mikeoliphant/neural-amp-modeler-lv2))やAida-X([https://aida-x.cc/](https://aida-x.cc/))も利用できます。


### 必要なもの

* USBメモリ
* パソコン
* オーディオ・インターフェース
* モニタースピーカーかヘッドフォン
* エレキギター

USBメモリはすべて上書きされてしまいますので、中身が消えても良いものを利用してください。

パソコンはisoイメージをUSBメモリに書き込むのに使用しますし、作成したUSBをブートするのにも使います。パソコンのスペックは高機能な必要はありませんので、2台あると調べものをしながら実際に動かしていけます。わたしはThinkpad x230という古いパソコンでmod-live-usb動かしていますが、特に支障は感じません。

問題はオーディオ・インターフェースです。Linuxで認識される必要がありますので、USBクラスコンプライアントのものを準備してください。専用ドライバーが必要なものは動かない可能性が高いです。わたしが試したのものは、Behringer UM2、Behringer UCG102とMOTU M4ですが、UCG102はモニター出力できないため音を確認することができませんでした。UM2とM4は正常に認識動作しています。

モニタースピーカーかヘッドフォンはオーディオ・インターフェースからの音をモニターするのに利用します。現状はパソコンのスピーカーから出力することはできないような気がします。

最後にエレキギターですが、オーディオ・インターフェースにつないで利用します。


### mod-live-usbの入手方法とUSBの作成

はじめに mod-live-usb-v8-x86_64.iso を下記からダウンロードします。 2022年4月6日版が現在(2023年7月16日)最新版です。 もっと新しい版を自分で作成したいという方には別のエントリーでその方法を紹介します。

https://github.com/moddevices/mod-live-usb/releases/tag/v0.0.8

isoイメージの書き込みにはbalena Etcher([https://etcher.balena.io/](https://etcher.balena.io/))を利用します。

balena Etcherの使い方はここでは割愛します。

### mod-live-usbの起動

isoイメージを書き込んだUSBメモリが準備できたら、mod-live-usbの起動です。

1台のパソコンで利用する場合は、一旦パソコンを終了します。
オーディオ・インターフェースとUSBメモリをパソコンにつないで電源ボタンを押します。

![IMG-1753.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129361/21b317ff-54f2-b375-941d-17e70f024a36.jpeg)

パソコンのメーカーが表示されている間にF12やF2を押して、USBから起動できるようにします。

![IMG-1756.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129361/2778c906-5f0e-69f2-8dd3-5ca3d430b1e8.jpeg)

mod-live-usbが起動画面が表示されるので、MOD Live-USBを選択します。

![IMG-1757.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129361/c909f6f2-dc22-31f5-bde8-acd2aff4e2e6.jpeg)

利用するオーディオ・インターフェースを選んで、Advancedオプションでサンプルレートやバッファサイズを選択し、OKを押します。

![IMG-1760.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129361/f59ca85e-e979-50a7-54ab-30a311235803.jpeg)

これでmod-live-usbが使えるようになります。

2本のケーブルが伸びていますが、たいてい左側の上からオーディオ・インターフェースのマイク入力、下がギター入力。右側にケーブルが刺さっているのが左右それぞれのスピーカーです。

ギターを鳴らしてみて、どちらかのスピーカー、イヤホンから音が鳴れば正常に動いています。さまざまなプラグインがありますので、実際に繋いでみて試してみてください。

[MOD Dwarfを無料で使ってみよう(2)](https://qiita.com/Inqb8tr_jp/items/897432306eb404bd9a6b)
jQuery とは

## jQueryとは

:::note
JavaScriptライブラリ
**HTML文書の操作やイベント処理、アニメーションなどを簡単かつ効率的に行うためのもの**

使用するメリットは、**短いコードで多くのタスクを実行できること**
:::


## 機能例

### HTML要素の操作

CSSセレクタを使用してHTML要素を選択し、その要素のスタイルや属性、コンテンツを変更できる

### イベント処理
クリック、マウスオーバー、キーボード入力などのイベントに応答する処理を追加できる

### Ajaxのサポート

Ajax(非同期JavaScriptとXML)を簡単に実装するためのメソッドを提供
→ブラウザとサーバー間で非同期通信を行い、データを取得や送信ができる

### アニメーション
要素のフェードイン、フェードアウト、スライドなどのアニメーション効果を実装するためのメソッドを提供

### プラグインの拡張性
プラグインアーキテクチャを提供しており、様々な機能追加ができる
→多くのサードパーティのプラグインが利用可能
機械学習におけるクラスの重み付けとその実装方法

# 機械学習におけるクラスの重み付け
機械学習において、データセットのクラス分布が不均衡な場合には、重み付けの考え方を導入することが多いです。これは特に、一部のクラスのデータ数が他のクラスと比べて非常に少ない場合（不均衡なデータセット）に有効です。この記事では、クラスの重み付けについて説明し、その実装方法をKerasとAdaBoostで解説します。

## クラスの重み付けとは？
クラスの重み付け（Class weighting）は、不均衡なクラス分布を持つデータセットに対する学習において、少数派のクラスを適切に扱うためのテクニックです。具体的には、クラスの重み付けは分類器に対して、少数派のクラスのデータに対する学習により重要な重みを置くよう指示します。これにより、少数派のクラスのデータがモデル学習において大きな影響を持つようになり、全体のパフォーマンスが向上することが期待できます。

## Kerasでの実装方法
Kerasでは、モデルの学習時にmodel.fit()関数のclass_weight引数を通じて、各クラスの重みを指定できます。以下に具体的なコードを示します：
```
# クラスの重み付け
class_weight = {0: weight_for_0, 1: weight_for_1}

# モデルの学習
model.fit(x=train_data, y=train_labels, class_weight=class_weight)
```
このようにすることで、モデルは各クラスの重要性を考慮して学習を進めることができます。

AdaBoostでの実装方法
AdaBoostでは、各学習器が学習する過程でサンプルに重みを付け、誤分類されたサンプルの重みを増やすことで、次の学習器がそのサンプルを正しく分類するように促します。以下にAdaBoostのクラスの重み付けを用いた訓練のコードを示します：
```
from sklearn.ensemble import AdaBoostClassifier

# クラスの重み付け
sample_weight = compute_sample_weight(class_weight={0: weight_for_0, 1: weight_for_1}, y=train_labels)

# モデルの訓練
model = AdaBoostClassifier()
model.fit(X=train_data, y=train_labels, sample_weight=sample_weight)
```
このように、AdaBoostでは各サンプルに対する重みを指定することで、クラスの重み付けを実現します。

## まとめ
クラスの重み付けは、不均衡なクラス分布を持つデータセットに対する学習で重要な手法です。本記事では、KerasとAdaBoostでの実装方法を示しました。これらの手法を適切に用いることで、より良いモデルの学習が期待できます。
「sympyのconjugate関数(複素共役)」を調べてみた。

# sympyで
realとRealの違いを教えて下さい。 (? ChatGPT 様に、聞いていません。)

```python
from sympy import *
t=symbols('t',real=True)
u=symbols('u',Real=True)
print("#",(t).conjugate())       
print("#",(u).conjugate())       
print("#",(3).conjugate())  
# t
# conjugate(u)
# 3 
# SyntaxError: invalid syntax
```

# ChatGPTで

「sympy conjugate real」
でソースコードを表示してもらいました。すごいですね。

# 参考

https://docs.sympy.org/latest/modules/functions/elementary.html#sympy.functions.elementary.complexes.conjugate

https://en.wikipedia.org/wiki/Complex_conjugate

https://ja.wikipedia.org/wiki/%E8%A4%87%E7%B4%A0%E5%85%B1%E5%BD%B9

https://stackoverflow.com/questions/74487874/sympy-not-properly-displaying-conjugate-of-square-root-of-real

https://stackoverflow.com/questions/22830643/sympy-conjugates-of-real-valued-functions
Pythonでのランダムオーバーサンプリング（Random Over Sampling）とその実装

# はじめに
不均衡なクラス分布を持つデータセットは、機械学習のタスクでよく遭遇します。例えば、クレジットカード詐欺の検出では、正常な取引（ネガティブクラス）と詐欺取引（ポジティブクラス）の間で極端な不均衡があります。このような状況では、多数クラスの学習が優先され、少数クラスの学習が十分に行われないことがあります。これに対する対策の一つとして、ランダムオーバーサンプリングがあります。

# ランダムオーバーサンプリングとは？
ランダムオーバーサンプリングは、少数クラスのサンプルをランダムに複製してデータセットに追加することで、クラス間の不均衡を解消する手法です。これにより、クラス間のサンプル数の差を減らし、モデルが少数クラスを無視することを防ぎます。

ただし、ランダムオーバーサンプリングは過学習を引き起こす可能性があることに注意が必要です。なぜなら、同じサンプルを何度も複製することで、モデルが特定のサンプルに過度に適合してしまう可能性があるからです。

# Pythonでのランダムオーバーサンプリングの実装
Pythonでは、imbalanced-learn（別名imblearn）というライブラリを使うことで、ランダムオーバーサンプリングを簡単に実装することができます。以下にその例を示します。

まずは必要なライブラリをインポートします。
```
from imblearn.over_sampling import RandomOverSampler
from sklearn.datasets import make_classification
```
次に、不均衡なデータセットを生成します。
```
X, y = make_classification(n_classes=2, class_sep=2, weights=[0.1, 0.9],
                           n_informative=3, n_redundant=1, flip_y=0,
                           n_features=20, n_clusters_per_class=1,
                           n_samples=100, random_state=10)
```

そして、RandomOverSamplerをインスタンス化し、fit_resampleメソッドを使用してオーバーサンプリングを行います。

ros = RandomOverSampler(random_state=0)
X_resampled, y_resampled = ros.fit_resample(X, y)

これで、オーバーサンプリングが完了しました。X_resampledとy_resampledはオーバーサンプリングされた特徴量とラベルを含んでいます。

# まとめ
ランダムオーバーサンプリングは、クラスの不均衡を解消するための簡単な手法です。ただし、過学習を引き起こす可能性があるため、使用には注意が必要です。Pythonのimbalanced-learnライブラリを使うと、この手法を簡単に実装することができます。
STEPNの参考記事

STEPNとは？何か知りたい方は以下の記事がオススメ！
https://stepnblog.online/home

STEPNを実際に始める手順をステップバイステップで画像付き解説！
https://stepnblog.online/start

国内仮想通貨取引所で失敗しない方法とおススメの取引所を紹介！
https://stepnblog.online/how-choose-exchange
StackingClassifierとVotingClassifierの比較

アンサンブル学習は、複数の機械学習モデルを組み合わせることで、個々のモデルの予測を組み合わせてより高い予測性能を実現する手法です。StackingClassifierとVotingClassifierは、アンサンブル学習の一形態であり、異なる特徴を持っています。

# StackingClassifier
StackingClassifierは、複数の基本モデル（学習器）を組み合わせて、最終的な予測モデル（メタモデル）を構築します。具体的な手順は以下の通りです。

データセットをトレーニングセットとテストセットに分割します。
基本モデルをトレーニングセットでトレーニングします。
トレーニングセット全体に対して、各基本モデルの予測結果を得ます。
トレーニングセットの予測結果を使用して、メタモデルをトレーニングします。
テストセットに対して、各基本モデルの予測結果を得て、メタモデルを使用して最終的な予測を行います。
StackingClassifierの特徴は、異なるモデルを組み合わせることで、個々のモデルの強みを活かした予測を行える点です。基本モデルの予測結果を用いてメタモデルをトレーニングするため、個々のモデルの予測誤差を補完することができます。

# VotingClassifier
VotingClassifierは、複数の基本モデルの予測結果を組み合わせることで最終的な予測を行います。主な手法としては、以下の3つがあります。

ハード投票（Hard Voting）: 各モデルの予測結果の多数決を採用します。
ソフト投票（Soft Voting）: 各モデルの予測確率の平均を取り、最も確率の高いクラスを選択します。
ウェイト付きソフト投票（Weighted Soft Voting）: 各モデルの予測確率に重みを付けて平均を取ります。
VotingClassifierの特徴は、単純な投票メカニズムを使用して、複数のモデルの予測結果を組み合わせる点です。異なるモデルの多様性を活かし、集団の知識を利用して予測を行います。

# コードの実例
以下は、StackingClassifierとVotingClassifierのコードの実例です。ここでは、4つの基本モデルを使用してアンサンブル学習を行います。

```
from sklearn.ensemble import StackingClassifier, VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# データの生成
X, y = make_classification(random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 基本モデルの定義
estimators = [
    ('logistic', LogisticRegression()),
    ('random_forest', RandomForestClassifier()),
    ('svc', SVC(probability=True))
]

# StackingClassifier
stacking_model = StackingClassifier(
    estimators=estimators,
    final_estimator=LogisticRegression(),
    cv=5
)

# VotingClassifier
voting_model = VotingClassifier(
    estimators=estimators,
    voting='soft'
)

# モデルのトレーニングと予測
stacking_model.fit(X_train, y_train)
stacking_pred = stacking_model.predict(X_test)

voting_model.fit(X_train, y_train)
voting_pred = voting_model.predict(X_test)

# 精度の評価
stacking_accuracy = accuracy_score(y_test, stacking_pred)
voting_accuracy = accuracy_score(y_test, voting_pred)

print("Stacking Accuracy:", stacking_accuracy)
print("Voting Accuracy:", voting_accuracy)
```


この例では、ロジスティック回帰、ランダムフォレスト、SVMの3つの基本モデルを使用しています。StackingClassifierとVotingClassifierを使って予測を行い、テストデータに対する精度を評価しています。

以上のように、StackingClassifierとVotingClassifierは、アンサンブル学習の一部として異なるアプローチを提供しています。StackingClassifierは基本モデルの予測結果を使ってメタモデルをトレーニングし、VotingClassifierは複数のモデルの予測結果を組み合わせて最終的な予測を行います。