OmniAICreator/Qiita-1.07M huggingface dataset:
Android 15をターゲットとした時のEdge-to-Edgeを回避するwindowOptOutEdgeToEdgeEnforcement

Android 15 をターゲットにした場合、Edge-to-Edge が強制されます。
強制的な Edge-to-Edge を一時的に回避するために [windowOptOutEdgeToEdgeEnforcement](https://developer.android.com/reference/android/R.attr#windowOptOutEdgeToEdgeEnforcement) という API がしれっと用意されているので、その API について調べてみました。


## 使い方
Activity の theme に `windowOptOutEdgeToEdgeEnforcement` を設定することでその Activity に対して Edge-to-Edge を無効にできます。

```xml
<style name="Theme.App.Licenses" parent="Theme.AppCompat.DayNight">
    ...
    <item name="android:windowOptOutEdgeToEdgeEnforcement" tools:targetApi="35">true</item>
</style>
```

Activity のコードで `enableEdgeToEdge` を呼んでいる場合は `windowOptOutEdgeToEdgeEnforcement` を設定していたとしても Edge-to-Edge が有効になります。

|targetSdk 34|targetSdk 35|targetSdk 35 + windowOptOutEdgeToEdgeEnforcement|targetSdk 35 + windowOptOutEdgeToEdgeEnforcement + enableEdgeToEdge|
|:--:|:--:|:--:|:--:|
![Screenshot_20240807_095444.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126298/8c467238-00b6-aeba-180f-2acdebc8dca5.png)| ![Screenshot_20240807_095250.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126298/ff7d5004-e6fa-f488-b77a-16ffdb30e81e.png)|![Screenshot_20240807_095327.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126298/d2977d68-5249-ca0b-b8c1-23242d588421.png) |![Screenshot_20240807_095352.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126298/508813ba-1150-5dde-7b4b-503c425f7363.png)|

(赤い部分が StatusBar の Inset、青い部分が NavigatonBar の Inset、それ以外はシステムのデフォルトの色)



## 用途
一時的な回避策でしかない(将来的に非推奨&無効になることが記載されている)ので基本的には Edge-to-Edge 対応を進める方がいいです。
ただこの API の使い道には、例えば [OSS Licenses Gradle Plugin](https://github.com/google/play-services-plugins/tree/main/oss-licenses-plugin) のような画面全体が外部ライブラリになっていてかつ Edge-to-Edge の対応が実装側でコントロールできない画面に対して、targetSdk 更新時に一時的に使うといったことが考えられます。
Zoom for Salesforce Lightning app

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめN～Z](https://qiita.com/Keiji_otsubo/items/92f92bb9f668ca9688be)

+ [上手くzoomの録画がSalesforceに連携されません。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ajTbB)

:::note
Zoom for Salesforce Lightning appを使えば可能なようなことが述べられています。


To my knowledge, Links yes, but, the recording itself, no. I believe the Salesforce integration will sync cloud recording links with Salesforce. Please see these articles for your reference. 

Bringing Zoom Cloud recordings into Salesforce.
https://community.zoom.com/t5/Meetings/Bringing-Zoom-Cloud-recordings-into-Salesforce/m-p/170097
:::


# Your Salesforce username differs from your Zoom login email

+ [Zoom in Sandbox Authorization failed](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Ur87J)

:::note
結局、Zoom アカウントのメールと一致するように、SF のメール アドレスを変更する必要がありました。私の場合、ユーザー名を Zoom のメール アドレスに変更するだけでは機能しませんでした。Salesforce でメール アドレスを変更すると統合が機能しましたが、メールにアクセスできるユーザーが別の場所にいるため、統合に関連するすべてのメールを私に転送する必要があったため、調整する必要がありました。
:::


# その他

+ [Zoom Revenue AcceleratorとSales Cloudの連携](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ertdc)
K-Meansクラスタリング

#### まえがき
クラスタリングは、データを自動的にグループ化し、パターンを見つけるための強力な手法です。この記事では、K-Meansクラスタリングの基本概念と実装方法を具体的な例を用いて説明します。

#### クラスタリングの基礎

**クラスタリングの目的**
クラスタリングは、データを自然にグループ化し、各グループ内のデータポイントが互いに類似しているようにする手法です。

**K-Meansの詳細**
K-Meansクラスタリングは、データを指定した数のクラスターに分け、各クラスターの中心（セントロイド）を計算します。

#### 実装と解説

**コード例**

```python
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans

# サンプルデータの作成
data = pd.DataFrame({
    'CustomerID': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    'Age': [25, 45, 35, 50, 23, 40, 30, 55, 37, 42],
    'AnnualPurchases': [5000, 12000, 7000, 15000, 4500, 10000, 6000, 20000, 8000, 11000]
})

# 特徴量の選択
features = data[['Age', 'AnnualPurchases']]

# 標準化
scaler = StandardScaler()
features_standardized = scaler.fit_transform(features)

# K-meansクラスタリングの実行
kmeans = KMeans(n_clusters=3, random_state=42)
data['Cluster'] = kmeans.fit_predict(features_standardized)

print("DataFrame with Cluster Labels:")
print(data)
```

**アウトプット**

```
   CustomerID  Age  AnnualPurchases  Cluster
0           1   25             5000        2
1           2   45            12000        0
2           3   35             7000        2
3           4   50            15000        0
4           5   23             4500        2
5           6   40            10000        0
6           7   30             6000        2
7           8   55            20000        0
8           9   37             8000        1
9          10   42            11000        0
```

#### クラスターの解釈
各クラスターの特徴を理解するために、各クラスターの平均値を計算します。

**コード例**

```python
print(data.groupby('Cluster').mean())
```

**アウトプット**

```
         CustomerID        Age  AnnualPurchases
Cluster                                       
0           6.333333  47.166667     14000.000000
1           9.000000  37.000000      8000.000000
2           3.250000  28.250000      5625.000000
```

#### クラスターの特徴
- **クラスター0**：高年齢で年間購買額が高い顧客。
- **クラスター1**：年齢が平均的で年間購買額が中程度の顧客。
- **クラスター2**：若年層で年間購買額が低い顧客。

#### あとがき
K-Meansクラスタリングは、データを効果的にグループ化し、パターンを見つけるための強力な手法です。
**クラスター分析を行った結果、特定の要因を見つけられなかった場合は、追加の特徴量を導入して再クラスター化を行うと良いでしょう。** 
これにより、データの洞察を深め、より正確な要因特定が可能になります。このプロセスを繰り返すことで、パフォーマンスの高い要因を特定する可能性が高まります。再クラスター化の際は、新たな特徴量を追加して、元の特徴量と組み合わせて分析を行うことをお勧めします。これにより、より詳細なパターンを発見しやすくなります。
データの標準化と正規化

#### まえがき
データ分析の前処理は、データの質を高め、正確な分析結果を得るために不可欠です。この記事では、データの標準化と正規化について学び、これらの手法がどのようにデータ分析に役立つかを具体的な例と共に説明します。

#### 標準化

**定義**
標準化は、データの平均を0、標準偏差を1に変換する手法です。これにより、異なるスケールのデータを同じ基準で比較できます。

**具体例**
例えば、テストの点数が次のようなデータがあったとします。

| 学生 | 点数 |
|------|------|
| A    | 80   |
| B    | 90   |
| C    | 70   |
| D    | 85   |
| E    | 75   |

このデータを標準化すると、各点数が平均からどれだけ離れているかが分かりやすくなります。

**コード例**

```python
import pandas as pd
from sklearn.preprocessing import StandardScaler

# データフレームの作成
data = pd.DataFrame({
    'Score': [80, 90, 70, 85, 75]
})

# 標準化
scaler = StandardScaler()
data_standardized = scaler.fit_transform(data)

print("Standardized DataFrame:")
print(data_standardized)
```

**アウトプット**

```
Standardized DataFrame:
[[-0.39223227]
 [ 1.37281295]
 [-1.15669818]
 [ 0.49029034]
 [-0.31417284]]
```

この結果から、例えばBの点数は平均より約1.37標準偏差高いことがわかります。

#### 正規化

**定義**
正規化は、データを特定の範囲（通常は0から1）にスケール変換する手法です。これにより、異なるスケールのデータを同じ範囲に収めることができます。

**具体例**
例えば、製品の価格が次のようなデータがあったとします。

| 製品 | 価格 |
|------|------|
| A    | 100  |
| B    | 300  |
| C    | 200  |
| D    | 400  |
| E    | 250  |

このデータを正規化すると、各価格が0から1の範囲にスケールされます。

**コード例**

```python
from sklearn.preprocessing import MinMaxScaler

# データフレームの作成
data = pd.DataFrame({
    'Price': [100, 300, 200, 400, 250]
})

# 正規化
scaler = MinMaxScaler()
data_normalized = scaler.fit_transform(data)

print("Normalized DataFrame:")
print(data_normalized)
```

**アウトプット**

```
Normalized DataFrame:
[[0.  ]
 [0.5 ]
 [0.25]
 [1.  ]
 [0.375]]
```

この結果から、例えば製品Bの価格は範囲内の0.5の位置にあることがわかります。

#### あとがき
標準化と正規化は、異なるスケールのデータを同じ基準で評価・比較するために不可欠な手法です。これらの前処理を適用することで、データの品質を向上させ、分析結果の信頼性を高めることができます。
ファインチューニングをするときに EOS token は入れた方がいいのか？

# ファインチューニングをするときに EOS token は入れた方がいいのか？

```python
tokenizer.eos_token
```

## はじめに

はじめまして。現在、私は大学院生（修士課程）です。

この記事では、言語モデルをファインチューニングをするときに end-of-sequence (EOS) token を入れるべきかどうかを考えたいと思います。
タスクやモデルによって、性能（精度）に EOS token を入れるとどうなるかは一概ではないと思っています。そのため、この問題に正解があるとは思っていません。あくまで @Natu_ja はこんな風に考えているんだな程度に見ていただきたいです。また、皆さんの意見も聞いてみたいので、よろしければ[コメント](https://qiita.com/Natu_ja/items/a65cc9110e6925db0d0e#comments)を残していただけると嬉しいです。

この記事が、自然言語処理を勉強・研究する人の参考になれば幸いです。

## EOS token とは

文の終わりを表現する特殊トークンです。

## EOS token は必要？

### Causal Language Model では必要？

Causal Language Model の代表例としては、GPT があります。

個人的には、原則 EOS token は入れた方がいいと思っています。

EOS token は、文章の終わりを決める役割を担っています。Causal Language Model (CLM) は、自己回帰モデルという過去の出力を考慮して、次のトークンを予測します。
訓練データに EOS Token が含まれている場合、どのタイミングで文の終わりかを学習することができます。つまり、「文章の流暢さ」や「表現の豊かさ」などがどうかは除けば、「。」などの文としては、成立した形で生成される可能性が高いです。
一方、訓練データに EOS Token を含まない場合、どのタイミングで生成を終えればいいかの判断がつきません。そのため、指定したモデルの最大長まで出力します。大抵の場合、これは文の途中で生成が終わってしまうことを指します。

https://huggingface.co/docs/transformers/llm_tutorial

### Masked Language Model では必要？

Masked Language Model の代表例としては、 BERT があります。

個人的な感覚としては、CLM ほど EOS token の重要性は高くないと思っています。

BERT の学習法として、双方向に文全体を処理することで、トークンの文脈を前後から理解できます。
BERT などでは、CLS token という文の全体の表現として利用されます。また、SEP token という文を分離するトークンがあります。
これらの理由から、EOS token の重要性は高くないと考えます。

## おわりに

この記事では、言語モデルをファインチューニングをするときに end-of-sequence (EOS) token を入れるべきかどうかを考えました。

実際、性能（精度）がどうなるかはデータセットやモデルによって変わると思います。

この記事が、自然言語処理を勉強・研究する人の参考になれば幸いです。
役割が大きなコンポーネントでReact Testing Libraryが上手く動いてないように見える時に見るメモ

## 課題

大きなコンポーネントはHTMLの量が多いのでエラーが出た時に
該当の場所のHTMLまで出力されない。

## やったこと

1. コンポーネント側のデバッグしたい要素に data-hogeをつける
1. html出力用のログを追加
1. HTMLの出力の確認とテストの比較

```
setTimeout(() => {
　　console.log(document.querySelector('[data-hoge]')?.outerHTML);
}, 3000);
```
SageMaker Studioの仮想マシンの容量を変更する方法

# TL;DR

こんにちは。弥生R&D室のsiidaです。R&D室ではSageMakerを使用して機械学習 (ML) のプロジェクトを進めていますが、SageMakerには[SageMaker Studio](https://aws.amazon.com/jp/sagemaker/studio/)というサービスがあり、Web上のUIを通してMLのための環境を構築することができます。

このSageMaker Studioで建てる仮想マシンのデフォルトの容量は100GBが上限なのですが、昨今のLLMはモデルだけでも100GBを超えることが多く、不足気味です。そこで、容量の上限を引き上げる方法をまとめたいと思います。

# 実行環境

- Amazon SageMaker
- SageMakerのドメインに対するadmin権限

# デフォルトの状態

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127680/c1e72386-eca7-9811-3606-19b4cf813517.png)

SageMaker Studioで仮想マシンのスペックを確認します。Storageの欄から仮想マシンの容量を決定できますが、初期設定では上限が100GBとなっています。

# 容量上限の変更方法

まずはSageMaker Studioのドメインから抜けて、AWS Consoleにアクセスします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127680/670ffad1-6079-0966-46f3-d446bca5df97.png)

つづいて、SageMakerのサービスのページに移動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127680/96b589d1-28ad-a961-5e9a-d92f4cb77c81.png)

メニューの[管理者設定]欄から[ドメイン]をクリックし、使用しているドメインを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127680/5fb013b2-a892-50ba-0df0-95299b56571e.png)

遷移先の画面の[ストレージの設定]欄から[編集]をクリックすると、容量を設定する画面へ移動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127680/184685c1-bc13-a72c-22fe-015c43c4a652.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127680/0a8369a1-73d5-54c0-7f3f-9acd90daf61e.png)

スペースサイズを100から1000に変更して[送信]を押すと...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127680/c41e0924-90a3-71ec-af5f-04d41b98d6f0.png)

SageMaker Studio側で容量の上限が1000GBに引き上げられました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127680/b32f70b7-46e7-3711-5e2d-26e664ee61f9.png)

# まとめ

- SageMaker Studioの仮想マシンの容量上限を変更するには、AWS ConsoleのSageMakerから設定を編集する

---

本記事は下記の記事と同じ内容です。 アクセス解析を目的としてマルチポストしています。

https://tech-blog.yayoi-kk.co.jp/entry/2024/08/23/110000

また弥生では一緒に働く仲間を募集しています。 ぜひエントリーお待ちしております。

https://herp.careers/v1/yayoi/requisition-groups/2363876d-7695-46ea-9e6a-0bc64d11b6bc
yt-dlp for windows の使い方

# Download
**1. GitHubのページに飛んでください。**
https://github.com/yt-dlp/yt-dlp

**2. 画面内にある画像の場所をクリック** 
( yt-dlpは更新頻度が高いため202X.X.Xは変わる可能性があります。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529959/fd39117e-071a-9f14-08a2-e8bc829c769a.png)

**3. yt-dlp.exe をダウンロード**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529959/d1fbb24d-abb5-ffc0-8353-34f60aedc24f.png)

ずらっと並んだ中に **yt-dlp.exe** というものがあります。 
それをクリックしてダウンロードしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529959/a817cbd9-e767-6951-1d4e-a17810552b5d.png)

**4. ファイルがダウンロードできたら任意のフォルダーに入れてください。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529959/d7108725-94e7-dd9c-523d-7ef7088e83d0.png)

**5. フォルダー内で右クリックをして**ターミナルで開く**をクリックしてください。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529959/50e4d204-3ee0-c25a-0a6d-98d77aa14bee.png)

**6. 下にあるコードの<YouTubeURL>を自分のダウンロードしたい動画のURLに変更してください。**
※ (<>←こちらはのけてください。)
```
yt-dlp -f "bv*[ext=mp4]+ba[ext=m4a]/b[ext=mp4] / bv*+ba/b" --merge-output-format mp4 <YouTubeURL>
```
これで**yt-dlp.exe**を置いているディレクトリ(フォルダー)に動画がダウンロードされています。

これで終わりです。
お疲れさまでした。
FLUX.1で遊ぶ 拡張 120秒版を作る!

有料のZeroGPUのメリットの一つが、他のZeroGPUを気軽にprivateで改造して試せるところですね。
同じ構成なので、ボタンひとつで、duplicateできます。Gradio編集が泣けるのと、使えるGPU時間は物凄く短いのでテストしにくいですが

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54688/67e6ca75-d8b8-bb73-d7c5-8eaeb1a9bf35.png)

## デモ
FLUX.1 拡張 120秒版
https://huggingface.co/spaces/Akjava/FLUX.1-schnell-120sec

120秒あるからといって、必ず成功するわけではありません。サイズ 512x512ぐらいから試してみてください。(あと、時間以外も公式版からコード多少いじってます。)

今のところ、問題のある画像を一切生成しないので信頼感があります。

## ローカルで動かす
1536x1536までなら、16GBの環境で動きました。

ただし、メモリ使用量を抑えるには以下は必須です。生成時間が200秒以上かかります。(ZeroGPUって相当スペック高いのでは？と見直してきました。)
```
pipe.enable_sequential_cpu_offload()
```

あとは、requirements.txt の編集が必要です。（ただ環境によっては、from torch._C importが解決できないかも。私もあきらめました)

```
git+https://github.com/huggingface/diffusers.git
protobuf
```

ちなみに、CPUでも動くけど、1000秒以上かかります。


環境は、condaです。どこかで見つけて、そのまま使っております。(rdkitはいるのかな?)
```
!wget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh
!chmod +x Miniconda3-latest-Linux-x86_64.sh
!bash ./Miniconda3-latest-Linux-x86_64.sh -b -f -p /usr/local
!conda install -q -y -c conda-forge rdkit python=3.10
import sys
sys.path.append('/usr/local/lib/python3.10/site-packages')
!conda init
```
(QA) IBM i IWSへのREST APIリクエストを送信するHTTPサーバーを別LPARのIBM i に変更できますか？

## Q.REST APIを処理するIBM i の外にHTTPサーバーを別建てしたい

### A. 可能です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/2eff7360-6c5a-fba9-72fc-cc97e9d68cef.png)


IBM i の統合APサーバー（IWS）はそのインスタンスを作成した際、HTTPサーバー(Apache）とLibertyベースのIWSインスタンスの二種類が作成されます。

Apacheにはプラグインが組み込まれREST APIを処理するIWSが紐づけられます。

このプラグインは
IBM i 上のApacheの構成ファイル　/www/GOMA5500/conf/ias-plugin-cfg.xml 　

※GOMA5500はIWS,Apacheのインスタンス名、読み替えてください。

です。

このファイル中に記述されているIWSのホスト名を修正することでリモートのIWSとApacheが通信できるようになります。
具体的には下記の

Transport Hostname 

の箇所です。デフォルトはlocalhost ですが、リモートのIBM i OS名 IBMI75に変えています。

![thumbnail_image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/5e9880e4-e178-d3b2-f225-c5b361108eb0.png)


以上を変更して、HTTPサーバーインスタンスを再始動することで、リモートのIWSと通信（REST APIのリクエスト送信）が出来るようになります。
複数のフィールドをキーにしてテーブルを結合する(SPSS Modeler データ加工逆引き6-14)

# 複数のフィールドをキーにしてテーブルを結合する

![スクリーンショット 2024-07-30 14.28.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/764d2df1-dfc7-a677-9e2b-b31c890b4a43.png)

## 1.想定される利用目的

・テーブルを結合する際にキーが複数ある場合の対処

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

https://github.com/yoichiro0903n/blue/raw/main/multi_key.str

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

![スクリーンショット 2024-07-30 14.32.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5f270ac5-5c43-b7bc-ebd9-f7def11b795d.png)

a.入力するデータのひとつめは以下の通りです。分類マスターをイメージしています。
![スクリーンショット 2024-07-30 14.38.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/96ac3bc6-9758-5265-8243-4ea0cf7ba984.png)

b.入力するデータふたつめは以下の通りです。商品の在庫情報です。
![スクリーンショット 2024-07-30 14.39.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/0d1a7765-3eee-86b5-dc50-578ddcc22eb4.png)


#### 複数キーを設定する

c.[レコード結合]ノードを編集します。
![スクリーンショット 2024-07-30 14.39.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/8879d16c-20fe-b065-3135-92916b2c1ab1.png)

[テーブル]を実行します。
![スクリーンショット 2024-07-30 14.39.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/6b7683ee-04a3-8676-d38f-2be12f8149e5.png)


#### 複数キーをひとつのキーにまとめる方法

d.[フィールド作成]ノードを編集します。以下のように文字列結合します。
![スクリーンショット 2024-07-30 14.40.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/79b1f17c-c36b-0d28-3dcc-fa4a2a2a9f55.png)

[プレビュー]します。
![スクリーンショット 2024-07-30 14.40.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/c5a61e03-d41d-c97f-4472-30a936cea5db.png)

e.[レコード結合]ノードを編集します。重複するキーをフィルターしておきます。
![スクリーンショット 2024-07-30 14.42.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/7f174949-0893-385d-9465-2874feacc482.png)

![スクリーンショット 2024-07-30 14.43.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/c09673aa-a2c2-d552-bc15-09b5e4a8366a.png)

[テーブル]を実行します。
![スクリーンショット 2024-07-30 14.43.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ff254acc-65eb-7bd7-b5e3-a36d906bc7a1.png)

#### 注意事項

dのような文字列結合を行う場合にはあらかじめ桁数の確認をして全体の整合性を予め確認してください。

## 4.参考情報

#### レコード結合を解説した記事

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

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

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

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

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
CodeceptJSでREST APIをテストしようとしたらProxyに阻まれた

## 初めに
手動テストリストの中でE2Eにできるテストはないものかと血眼になってネタを探していたところ、POSTMANを使って手動でREST APIを実行しているテストがあった。
CodeceptJSで自動化できるのでは？とREST APIの実行方法を模索していた中でぶち当たった問題の記録である。

## 何が起こったか
```In```パラメータを渡すと、その値をそのまま```Out```に返却するGet APIをテストするサンプルプログラムを作成した。

```js
Feature("API実行");

const ScenarioGet = "GET";

Scenario(ScenarioGet, async () => {
    // APIの実行
    const response = await I.sendGetRequest("/sample/get?In=hoge");
    // HTTPレスポンスが成功であることの確認
    I.seeResponseCodeIsSuccessful();
    // レスポンスボディが正しいことの確認
    I.seeResponseContainsJson({Out: "hoge"});
});
```

ところが実行してみると```I.seeResponseCodeIsSuccessful()```の検証でHTTPレスポンスコードが```503```で返却されている。

503といえば、サーバからの一時的な障害などで処理ができない旨のエラーである。
そこで、Webブラウザから同じAPIを実行して再現するかを確認したところ、エラーなく実行された。
一時的な問題かと思ったが、何度実行しても同じ結果になるため、CodeceptJSでの実行に問題がある様子。

## 調査
以下の2つの可能性を考えた。

1. CodeceptJSのConfigに問題がある
1. Proxyなどを含むネットワーク関係の問題

「CodeceptJSのConfigに問題がある」については否定できないものの、Codeceptjsのソース上にDebug出力を仕込んだ。最終的にどのようなアクセスをしているか、どのようなレスポンスが得られているか等を確認したうえで問題がないと結論付けた。

「Proxyなどを含むネットワーク関係の問題」については以前CodeceptJS上でテストを実施したことのあるサーバと同じURLだったので可能性は低いとも考えた。しかし、HTTPリクエストに対して503が返る、タイムアウトする場合はProxyが関係していることが多いという経験上、この線での調査が妥当と判断した。

その結果、[こちら](https://github.com/codeceptjs/CodeceptJS/issues/1566)の情報に行き着いた。

## 対応
結論として、環境変数などで以下のようなProxy設定をしている場合でも、REST HelperにProxyの設定が必要ということが分かった。

```
SET ELECTRON_GET_USE_PROXY=true
SET GLOBAL_AGENT_HTTPS_PROXY=http://PROXY_URL
SET HTTPS_PROXY=http://PROXY_URL
SET HTTP_PROXY=http://PROXY_URL
```

上記のようにすでにProxyの設定がされている前提で、```codecept.conf.js```
のREST HelperのonRequestに以下のような記述が必要になる。

```js
    REST: {
      endpoint: '{REST URL}',
      prettyPrintJson: true,
      // 追記した設定
      onRequest: (request) => {
        if (process.env.https_proxy) {
            request.proxy = false;
            request.httpsAgent = new HttpsProxyAgent(process.env.https_proxy);
        }
        if (process.env.http_proxy) {
            request.proxy = false;
            request.httpAgent = new HttpsProxyAgent(process.env.http_proxy);
        }
      }
      // ここまで
    },
```
デバッグ文を入れっぱなしだったので再掲

```
(define (square x) (* x x))

(define (cont-frac n d k)
  (define (iter i result)
    (if (= i 0)
        result
        (iter (- i 1) (/ (n i) (+ (d i) result)))))
  (iter k 0))

(define (pi k)
  (define (n i)
    (square (- (* 2.0 i) 1)))
  (define (d i) 6.0)
  (+ 3 (cont-frac n d k)))
```
仕事でデバッグ文をいれたままコミットすると、めちゃくちゃ怒られますから注意してくださいw
円周率を連分数展開で求める

仕事にはまったく役に立ちませんが、円周率を連分数展開で求めてみます。
# 円周率の連分数展開
https://www.timedia.co.jp/tech/wikipediahaskell-haskell13-let-ratsqrt2-n-foldr-x-y/
書くのが面倒なので他人任せ。
# Scheme での実装例
参考文献　計算機プログラムの構造と解釈 問題1.37 1.38 1.39
https://sicp.iijlab.net/fulltext/x133.html
```
(define (square x) (* x x))

(define (cont-frac n d k)
  (define (iter i result)
    (if (= i 0)
        result
        (iter (- i 1) (/ (n i) (+ (d i) result)))))
  (iter k 0))

(define (pi k)
  (define (n i)
    (print i)
    (square (- (* 2.0 i) 1)))
  (define (d i) 6.0)
  (+ 3 (cont-frac n d k)))
```
cont-frac 手続きは分数になっている部分を求めますから、最初の 3 は計算結果に別途加える必要があります。
# 実行結果
```
gosh> (pi 10000)
3.1415926535895435
```
PHPで、XML経由でiCalを生成する

iCalをPHPで直に書き出そうとすると、PHPのソースコードが複雑化しやすいです。そこで、JSON経由またはXML経由で扱う方法を考えました。JSON経由ではJSONが複雑化するので、XML経由を採用しました。
```
<?php
header('content-type:text/plain');
$vcalendar=new SimpleXMLElement('<VCALENDAR/>');

// $vcalendar内に、XML要素を追加してゆく。
// 「BEGIN:」や「END:」で始まらないプロパティーは、当該要素の属性名にする。
// 「BEGIN:」や「END:」の後に来る文字列は、子XML要素のタグ名にする。

function to_ical($xml){
	echo'BEGIN:'.$xml->getName()."\n";
	foreach($xml->attributes()as$key=>$value){
		echo$key.':'.$value."\n";
	}
	foreach($xml->children()as$child){
		to_ical($child);
	}
	echo'END:'.$xml->getName()."\n";
}
to_ical($vcalendar);
```
未経験者がAZ-700に合格した方法

2024/8/4にAZ-700に合格しました。試験自体がまだ歴史の浅く、参考書等が充実していなくて困ったため、私の合格までの勉強方法を書こうと思います。

経歴
文系エンジニア2年目
Azureの実務経験なし
その他クラウドの知識なし
Azureの他の資格は持っていませんITの他の資格については一年目に応用情報をとっただけ
ネットワークの知識なし

合格までの期間6ヶ月
DNSサーバの機能すらあやふやな状態から勉強を始めたためかなり時間がかかりましたが、インフラ周りの知識がある方であればここまでかからないと思います。

点数:728/1000
わからないところだらけで受かるか不安でしたがなんとかなりました。

試験について
単純計算で一問2分弱で解かなければいけず、問題文も長いため時間はカツカツでした。テストの制度上は後から問題を見直すことも可能ですが、その時間はありませんでした。


使用した教材について
 インプット:Microsoftlearn
量が多いため何周もせずに一度読んで各サービスの機能や簡単なアーキテクチャについて覚えれば十分だと思います。

 アウトプット:Udemy
https://www.udemy.com/share/10aPkc3@HKAAPDLP61oT9iz6wKyUlWx1zMQcroqubA-QdnTaqxic--V5KAAeWjKrp4lcsA9A_w==/
 
 （ただし英語）
 基本的にはこれを解きながらわからないところを公式ドキュメントを読んで勉強するのがいいと思います。
 全5回分の模擬試験があります。本番の試験よりは若干問題が少ないですが、支障はないと思います。
 注意点
 問題集の中でデプロイ手順の並べ替え問題があります。教材だと並べ替え問題が選択式ですが、本番だと自分で順番をイチから選ばされます。問題集の方で正解できても、自分で正しいデプロイ手順を最初から最後まで組み立てられるようにしましょう。

 試験本番の方が問題数が若干多いため、余裕を持って解けるようになる
 あと何故か問題集に試験本番と同じ問題がいくつかありました。


 試験本番のtips※読み飛ばしてOK
 先述しましたがテスト中はMicrosoftlearnのドキュメントが一部読めます。ただ記事の探し方がややこしいので注意が必要です。
 （1問目からドキュメントを閲覧可能ですが、見方について解説がなかったと思います。読み飛ばしただけかもしれませんが。。）画面左側のアイコンからドキュメントが検索できます。
 ⚠️私の受験環境だけかもしれませんが、試験開始時に検索条件の絞り込みがかかっており、肝心の各サービスの機能等のドキュメントが検索結果に表示されないようになっていました。最初に検索条件を確認することをお勧めします。

 日本語がわかりづらい
 おそらく元々英語の問題文をかなり雑に翻訳して日本語にしています。一応これも左のアイコンから元の英語の問題文を表示できます。日本語では問題文の意図が伝わりえないと思われる箇所もありました。（今の為替だと一回二万円する試験なので問題の作成はちゃんとしてほしですが）
【Suno AIでつくった楽曲】しろぶりゅーの歌 ver.10 (3拍子、口笛、大島ミチルさんを連想した切ない編曲とメロディ)【動画 2分25秒】【YouTubeチャンネルからの転記です】

この記事は、わたしの[YouTubeチャンネル](https://bit.ly/Yamanaka-YouTube "Living without things. 持たない生き方 手放す生き方")にある公開動画を転記しております。
( どこかのタイミングで、プログラミング-Google Apps Script or iPaaS-Zapier をつかって自動転記させる予定です )

転記のための時間コストを少なくしたいので、文字装飾( Markdown記法 )を極力つかわずに書いております。

こちらが動画内容です👇

***

![01 YouTube再生中の画像 Suno AI _ しろぶりゅーの歌 ver.9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386308/b1569899-8ba4-0174-09b5-9c2929c48edc.png)



* # 動画URL
    * https://youtu.be/7zvozo6QSIg

<br>

* # 動画タイトル
    * 【Suno AIでつくった楽曲】しろぶりゅーの歌 ver.10 (3拍子、口笛、大島ミチルさんを連想した切ない編曲とメロディ)【動画 2分25秒】

<br>

* # 動画の説明欄(一部を抜粋)

📅撮影日 = 2024-08-05(火)

Suno AIとは、文章から音楽を生成することができるAI( Text-to-Music-AI )です。
わたしは、2024-04-02(火)に初めてSuno AIで有償プランを契約してから、時々楽曲をつくって遊んでいます。

🎦【Suno AI】文章から音楽を生成するAI( Text-to-Music-AI )で、3分間で2曲、6分間で4曲作りました【試聴可能】1)伴侶の曲 2)税理士の曲【動画 16分11秒】
https://youtu.be/QKfhk4HgQ_g

🎦“Suno AIでつくった楽曲”シリーズ
https://www.youtube.com/playlist?list=PLpQhBHT4oghMLdiSVqwvSs_Z5y0H4VGOe

🎦“効果的にSuno AIを活用するヒント”シリーズ
https://www.youtube.com/playlist?list=PLpQhBHT4oghPuaNOVZn-N53wVvsBkeHdI


今回は、Suno AIでつくった曲を WAV で出力してから、動画編集いたしました。

スロージョギングの途中に、早朝の中目黒で偶然出会った「しろぶりゅー」-ShiroBrew-のテーマソング( イメージソングは和製英語です )を、1人のファンとして自主的につくりました。
つまり「しろぶりゅー」のファンメイドテーマソングです。

ぜひ聴いてみてください。
そして、ぜひみなさんも、あなたが大好きなお店やブランドや企業のために楽曲をつくってみてください！

作曲日:
2024-07-20(土)

Suno AI 契約の種類:
Pro Plan

楽曲の正式名称:
しろぶりゅーの歌 #10

Suno AI Library URL:
https://bit.ly/ShiroBrew-10

Custom Mode: On

Audio Inputs: Not Used

With Vocals:


---


Lyrics(without Meta tags):

真っ白な心

そよ風感じる

コーヒーの香りと
真っ白な心


---


Lyrics & Meta tags:

[Break]

[Intro]

[Whistling]

[Verse]
真っ白な心

[Verse 2]
そよ風感じる

[Chorus]
コーヒーの香りと
真っ白な心

[Whistling]

[Outro]


---


Suno AIへの指示文章( プロンプト/Prompt ): Custom Modeの場合は”Style of Music”を指定します。


🇬🇧English

[Waltz][Female][Chill]


🇯🇵日本語訳

[ワルツ][女性][チル]


---


Suno AI 公式URL
https://accounts.suno.ai


SHIROノMONO 公式URL - Instagram
https://www.instagram.com/shiro_nomono


---


✓ 🎥この動画と関連が強いわたしの動画 ↙
　・“Suno AIでつくった楽曲”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMLdiSVqwvSs_Z5y0H4VGOe


　・“効果的にSuno AIを活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghPuaNOVZn-N53wVvsBkeHdI


　・“Suno AIで3拍子”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghNy-xIeeMZV6D2YAnax9Nzw


　・“しろぶりゅー ファンメイドソング”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghPk5-_YwWl499DNAOVKlcvZ


✓ 🎥Shortened URL for this video | この動画の短縮URL ↙
　https://bit.ly/4fv4cCW
いかにして問題を解くか

# 書籍
https://www.amazon.co.jp/gp/product/4621045938/ref=ppx_od_dt_b_asin_title_s00?ie=UTF8&psc=1
実は 2009 年に購入していたようだ。どこかにあるはず。探すの面倒くさいw

# 動画
https://www.youtube.com/watch?v=sC5miUc1MgQ
ヨビノリさんのチャンネルは楽しい話題がいっぱいです。


で、本題です。
動画内でもプログラマの人達に有用だよとおっしゃっていましたが、特に「結果を試せるか」の部分はテストに通ずるものがあります。正常ケースさえ通らない事ってよくあるのですが、コードを書いた人はテストのやり方がわからないのか、それともテストをやる気がないのか、果たしてどっちなのでしょう？

そういう事を常日頃考えている人は、ここで紹介したような本や、ヨビノリさんのチャンネルを観て勉強するのが大好きだったりするので、不要な情報かも知れません。そういうことを日頃考えてない人は、これらの事にまったく興味を示さないので、いつまで経っても変わる事はないのです。

というわけで、この投稿は何も役に立たないゴミなのでした。
行の先頭または末尾に文字列を加えるUnixコマンド

ファイルや`ls`のような行単位の出力に対し、先頭または末尾に文字列を加えるUnixな方法がいくつかあるか、考えてみました。

次の3行のファイルを考えます（以下、`file=requirements.txt`）。

```
pykakasi
opencv-python
requests
```

これら行に`pip show␣`という文字列を先頭に加えます（以下、`prepend="pip show␣"`）。

```
pip show pykakasi
pip show opencv-python
pip show requests
```

先頭も末尾もコード的にはたいして変わりません。後尾に加える文字列は`$append`にあるとします。


### sed

行単位の編集ならやはり`sed`が王道です。行頭を正規表現の`^`で示すのがポイントです。

```bash
$ cat $file | sed "s/^/$prepend/"
```

末尾なら`$`です。

```bash
$ cat $file | sed "s/$/$append/"
```


### awk

あるいは`awk`（3人ともご存命のようでなによりです）。行単位の処理の`{}`の中でシェル変数を参照するのに`-v`オプションを併用するのがポイントです。

```bash
$ cat $file | awk -v prepend="$prepend" '{print prepend$0}'
```

末尾にするなら`print`の引数を入れ替えます。

```bash
$ cat $file | awk -v append="$append" '{print $0append}'
```


### while + echo

行単位でループして`echo`で出力をいじるストレートな解法が、実は一番わかりやすいかもしれません。

```bash
$ cat $file | while read line; do echo $prepend$line; done
```

こちらも、末尾にするなら`echo`の引数の順序を入れ替えます。


### while + printf

`echo`の代わりに`printf`を使う手もあります。上記とたいして変わりませんが。

```bash
$ cat $file | while read line; do printf "$prepend%s\n" $line; done
```


### for + echo

`while`ではなく`for`を使う手もあります。この場合、コマンド先頭でデータを用意してきたこれまでのパターンとはちょっと違うのが（本人的には）マイナス点です。

```bash
for line in `cat $file`; do echo $prepend$line; done
```


### xargs

行を行として出力するのに、複数行を1行にまとめる`xargs`をわざわざ使うのは病気と言わざるを得ませんが、まぁ、やってできないことはないわけです。

```bash
$ cat $file | xargs -L 1 echo $prepend
```

末尾にするのは`echo`ではしんどいので、`printf`を使います。

```bash
$ cat $file | xargs -L 1 printf "%s$append\n"
```


### jq

さらに病が高じると、JSONパーザーの`jq`なんかでやってしまいたくなるわけです。

入力がJSONではないという禁忌を回避しなければならないため、オプションに`-r`（`--raw`）、`-s`（`--slurp`）、`-R`（`--raw-input`）を併用します。また、シェル変数を内部で展開させるため、`--arg`オプションで`jq`の変数に置き換えるというめったに使わない技まで使います。フィルタを二重引用符でくくれればそんな手間はかからないのですが、フィルタ内部の二重引用符をいちいちエスケープすると読みにくくていけません。

```bash
$ cat $file | jq --arg prepend "$prepend" -rsR 'rtrimstr("\n") | split("\n")[] | $prepend + .'
```

末尾版は、ここでも最後の出力部分の順序を入れ替えるだけです。

`jq`の書籍は2冊出ていますが（『[jqハンドブック](https://www.yodobashi.com/product/100000009003450000/)』と『[jqクックブック](https://www.yodobashi.com/product/100000009003710680/)』）、どちらもこんな技は書いてないですね。


### perl

最近では使い手も減ってきましたが、こういうワンライナーはやっぱり`perl`です。

`while(<FILE>)`を仮定する`-n`オプションと、それに加えて`$_`を自動で出力する`-p`オプションは相変わらず強力です（これを見せるほど追い詰められたのは80年ぶりです）。まぁ、`sed`の解法と変わらないですが。

```bash
$ cat $file | perl -pe "s/^/$prepend/"
```

`sed`同様、末尾なら`$`です。

### おわりに

まだまだ解法があるような気もしますが、まぁ、こんなもんです。NodeやPythonを使った手もあるでしょうが、長くなるので、シェルな雰囲気ではなく、やめておきました。
ラスタ画像のトレーシングの悩み

# ラスタ画像のトレーシングの悩み

画像ファイル（png, jpg）をよみこんで、インクスケープ, adobe illustrator 上でトレースするのってメンドウ？

## ラスタ画像は

1. ほぼほぼ線画
1. しかも白黒

# やりたいことはそういうのじゃないっていう例

いろいろとオンラインツー紹介してます

https://fablabsendai-flat.com/2020/02/28/raster_to_vector/

四角い部分は形に対応したオブジェクトでトレースしてほしい。
円形は円のオブジェクト、楕円は楕円のオブジェクト。
この辺りを判断させるのはAIの力をかりなければならないでしょうか？

簡単に行う方法ってないのでしょうか？

pngフォーマットってラスタだからしかたないですかね？
GitのAccess Token有効期限切れの対処メモ

# はじめに
gitのaccess token有効期限が切れた際に、毎回調べて対応するのが面倒だったのでメモとして残すだけの記事です。

※access token取得方法は記載しないです。

# Access Token 更新方法
まずはgitに繋いでる情報を確認します。
```
git remote -v
# output -> https://username:access_token:github.com/organization_name/repository.git
```
git上からaccess tokenを取得し上記のaccess_tokenを取得してきたupdate_access_tokenに更新します。
```
git remote set-url origin https://username:update_access_token@github.com//organization_name/repository.git
```
上記で設定が終わったら、git pushができます！
【Power Apps】2つの選択肢列のANDを取りたい

# はじめに

こんにちは、reireです。

Power Appsではよく物品管理系のアプリなどが開発事例として取り上げらあれるかつ、
実際の需要も多いと思います。

そういったシステムを開発していると要件として上がりやすいのが、
「**物品ごとに閲覧、操作できるユーザーをグループ分けしたい**」というもの。

このグループ分けがユーザープロファイルの「**department**」や「**jobTitle**」準拠なら簡単なのですが、
現実はさらに細分化された、独自のグループかつ、複数選択可能な選択肢列だったりします…

要するに、以下のようなテーブル2つの紐づけが必要な場面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3461887/1696bed4-f847-3686-0c62-55cea72b0774.png)

この場合、
れいれ
→物品Aと物品Bが閲覧できる

テスト太郎
→物品B、物品C、物品Dが閲覧できる

課長
→物品A、物品B、物品C、物品Eが閲覧できる

といった具合です。

今回は、このような2つの複数選択できる選択肢列のANDを取る処理について記載していきます。

# 実装

といってもそんな難しいことはしません。

まずコントロールとデータソースはこんな感じ
(寝起きなのでデザインがデフォルトなのは許してください…)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3461887/bcec39f0-43d4-b88b-6fd9-580507d19600.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3461887/05bf1707-e86d-2541-6866-fc2a91cfb0df.png)

今回は検証をしやすくするために、ユーザーをドロップダウンで選択できるようにしています。

今のところ、所属グループがG1しかないユーザーでも、G2、G3の物品が閲覧できてしまっています。

ここで画像右のGallery1のItemsに工夫をします。

```Gallery1.Items
Filter(
    ItemTable, 
    IsBlank(
        LookUp(
            Dropdown1.Selected.UserGroup As group,
            group.Value in ShowColumns(ThisRecord.EditGroup,Value)
        )
    ) = false
)
```

すると…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3461887/18a7bdf7-9b73-c143-59cb-6d891f461297.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3461887/7fe91bcb-40ea-b506-6310-af6c879ae203.png)

この通り、所属するグループ列でItemTableをフィルターできています！

ただ実際に試していただくとお分かりになると思いますが、
今回の関数式かつ、データソースにSharePoint Listsを使用していると、
いつもの「**委任の警告**」が出てきます。

各Listsで想定されるレコード数が2000件以下であれば無視しても構わないのですが、
警告が出続けるのも気分が悪いです。

対処として、以下のようにすると警告を回避できます。

```Dropdown1.OnChange
ClearCollect(colUserGroup,Self.Selected.UserGroup);
ClearCollect(colItemTable,ItemTable);
```

```Gallery1.Items
Filter(
    colItemTable, 
    IsBlank(
        LookUp(
            colUserGroup As group,
            group.Value in ShowColumns(ThisRecord.EditGroup,Value)
        )
    ) = false
)
```

要は、Listsのデータを一度コレクションに格納しちゃいましょうよって話ですね。

今回は記事上での記述を楽にするためにItemTableのデータもDropdown1のOnChange内で取得していますが、
例えばApp.OnStartやScreen1.OnVisibleなど、もしくは更新ボタンを作成するなどでもいいと思います。

# おわり

今回は2つの選択肢列のANDを取る方法について書いてみました。

依頼のあったアプリの開発中このような要件に突き当たり、
実装に地味に苦戦したりしたので備忘録も兼ねて記事にしてみました。

Power AppsにしろPower Automateにしろ、
独自の関数でデータを扱わなければいけないのでこの辺は苦労しますね…

あ～…、
~~SQLで操作できたら一瞬なんだけどな～～～～～！~~

それでは
【DAY12】PHPの基本文法

## 変数・定数
「変数」とは、値を入れておく箱のようなものであり、主に数値や文字列等を使い回すときに使用します。変数には名前をつけることができ、他の人が見てもわかりやすい名前をつけることが重要です。
PHPでは、変数は「$」の後ろに「変数名」を記述することで作成します。そして、その変数に「＝」記号を使って値を「代入」します。
```php
<?php
$fruits = apple;
echo $fruits; // appleと表示
?>
```

変数は後で値を再代入することで中身の値を変更することができます。

値を変更する予定がないまたは後から変更してはいけない場合には、「定数」を使用します。
PHPでは、定数は「const」を使用して定義し、定数の名前は慣例的にすべて大文字にします。
```php
<?php
const FRUITS = apple;
?>
```

## 配列・連想配列
プログラミングにおける配列とは、データ構造の一つであり、複数のデータを順番に並べた構造のことです。通常変数には一つの値しか入れることができませんが、配列を使用すれば複数宣言する必要がなくなるため、より少ないコードで処理を記述できます。
PHPでは、arrayを使用し配列を作成します。
```php
<?php
$fruits = array('apple','banana','peach');
echo $fruits[0]; // appleと表示
echo $fruits[1]; // bananaと表示
echo $fruits[2]; // peachと表示
?>
```
配列の要素の指定は通常数字で行いますが、PHPの場合は文字列で配列の要素の指定をすることができ、これを連想配列と呼びます。連想配列は、以下のように書くことができます。
```php
<?php
$fruits_cost = array('apple' => '400', 'banana' => '50', 'peach' => '600');
echo $fruits_cost['apple']; // 100と表示
?>
```
上のコードの例では、400、50、600という配列にそれぞれapple、banana、peachという名前がついています。

## 関数・引数・戻り値
関数とは、特定の動作をまとめて入れておく箱のようなものです。PHPにおける関数は以下の二つに分けられます。
* 組み込み関数
PHPで提供している関数
* ユーザー定義関数
ユーザーが独自に処理を記述した関数

ユーザー定義関数は「function 関数名()」の形式で定義し、「関数名()」で呼び出します。
```php
// 関数の定義
<?php
function 関数名($引数) {
    処理を記述
}

// 関数の呼び出し
関数名($引数);
?>
```
引数なしの関数や引数が複数ある関数も同様に定義できます。

関数を処理するときに渡す値のことを引数といいます。
また、関数内で処理をして帰ってくる結果の値を戻り値または返り値といいます。

## クラスとインスタンス
クラスとは、変数や関数などのプログラムをまとめたもので、設計図のような役割があります。
クラス内で定義する変数はプロパティ、関数はメソッドと呼ばれます。

インスタンスとはクラスという設計図をもとに作られた、実際に使用できるプログラムのことです。
クラスからインスタンスを作ることをインスタンス化といいます。また、一つのクラスからインスタンスを複数作ることもできます。

クラスとインスタンスを車に例えると、クラスが車の設計図でインスタンスが車自体を表します。
ChromebookにMySQLクライアントをインストールする

# APTレポジトリを設定するパッケージをダウンロードする
[Oracleの公式ページ](https://dev.mysql.com/downloads/repo/apt/)より、ダウンロードします。
Oracle Web Accountでログインする必要があります。
初めての方は、Oracle Web Accountを登録し、ログインしてください。

# APTレポジトリを設定する
以下のコマンドを実行してください。
```
sudo apt install ./mysql-apt-config_0.8.32-1_all.deb
```
mysql-apt-configが表示されます。
使用しているChromebookのOSや設定したいMySQLのバージョンなどを選択し、OKを押してくだい。

# インストール可能なパッケージを更新する
以下のコマンドを実行してください。
```
sudo apt update
```
MySQLのAPTレポジトリが追加されます。
![Screenshot 2024-08-07 06.19.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/05fd3076-1da6-d996-8755-d33679adda49.png)

# MySQLクライアントを確認する
以下のコマンドを実行してください。
```
sudo apt search mysql-client
```
MySQLクライアントのパッケージが表示されます。
![Screenshot 2024-08-07 06.23.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/fdb73bce-4e55-5a94-5b97-19652730d30d.png)

# MySQLクライアントをインストールする
以下のコマンドを実行してください。
```
sudo apt install mysql-client
```
以上です。
【kaggle】飛行機乗客数のARIMA/SARIMAモデルによる時系列解析


# 今回チャレンジしたKaggle

10年間の飛行機乗客数から将来の乗客数を予測する問題です、

https://www.kaggle.com/datasets/rakannimer/air-passengers


# 実際のコード

今回コードが長くなってしまったため、直接Kaggleサイトを見ていただけますと幸いです。

https://www.kaggle.com/code/emma41114/air-passenger-arima-sarima

以下の予測が立てられました。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780099/4b3d7b27-e237-c152-2ee8-2a445296afea.png)


# 背景

今回は時系列解析の問題に取り組みたいと考え、こちらのKaggleを選びました。

ARIMA,SARIMAモデルの理論はなんとなく学んでいたのですが、
実装するのは初めてでしたので、可視化やパラメータの設定、ARIMAとSARIMAの違いなど非常に学びになりました。

途中でこのデータセットがコンペ形式でないことに気づき、少し残念でしたが…。
Kaggleの使い方含め、まだまだ初学者ですので、手を動かすことを大事にこれからも取り組もうと思います。

## 参考

いろんな方々の解説やモデリングを参考にさせていただきました。

https://www.kaggle.com/code/freespirit08/time-series-for-beginners-with-arima

https://www.kaggle.com/code/danishmubashar/future-predict-by-lstm-prophet-sarima

https://www.kaggle.com/code/tanmay111999/avocado-price-forecast-arima-sarima-detailed?scriptVersionId=105494138

https://user.keio.ac.jp/~nagakura/zemi/Forecasting.pdf

https://bigdata-tools.com/arima-sarima-model/
8x8の回転を考える(180度回転)



参考


https://qiita.com/caa45040/items/5767a43d1525e76b73b9

x 過去ログを見よ
x ArduinoUnoの予定は、未定

結果


![o_coq295.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/374a5fea-468f-62d6-b49a-97e3af7da2a6.jpeg)


プログラム

オンラインコンパイラ


```c++



#define bit8_put(aa) for(int ii=8;ii!=0;ii--) \
{if(aa & 0x80){printf("1");}else{printf("0");}aa=aa<<1;}

int BitReverse(int x) {
  x = (x >> 4) | ( (x & 0x0f) << 4 );
  x = ((x & 0b11001100) >> 2) | ( (x & 0b00110011) << 2 );
  x = ((x & 0b10101010) >> 1) | ( (x & 0b01010101) << 1 );
  return(x);
}

// ビットマップデータ
unsigned char databytes[8] = 

{

0b01100110,
0b10101111,
0b10111111,
0b11011111,

0b01111110,
0b01111110,
0b00111100,
0b00011000

};

// ビットマップデータ
unsigned char databytes_180[8];


#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    printf("START\n\n");
    int a; //一時ワーク

    printf("INPUT\n");
    for(int ii=0;ii<8;ii++){
        a = databytes[ii];
        bit8_put(a);
        printf("\n");
    }//for ii
    printf("\n");

    //180度回転処理
    databytes_180[0] = BitReverse(databytes[7]);
    databytes_180[1] = BitReverse(databytes[6]);
    databytes_180[2] = BitReverse(databytes[5]);
    databytes_180[3] = BitReverse(databytes[4]);

    databytes_180[4] = BitReverse(databytes[3]);
    databytes_180[5] = BitReverse(databytes[2]);
    databytes_180[6] = BitReverse(databytes[1]);
    databytes_180[7] = BitReverse(databytes[0]);

    printf("OUTPUT\n");
    for(int ii=0;ii<8;ii++){
        a = databytes_180[ii];
        bit8_put(a);
        printf("\n");
    }//for ii
    printf("\n");

}//main




```


```

START

INPUT
01100110
10101111
10111111
11011111
01111110
01111110
00111100
00011000

OUTPUT
00011000
00111100
01111110
01111110
11111011
11111101
11110101
01100110


```
MikanOS 1章

## UEFI BIOSによる起動
BIOS: コンピューターの電源を入れて最初に実行されるファームウェア(OSではない)
①コンピューターを初期化後、②接続されているストレージを探索する。

CPUがBIOSの実行を開始
=CPUがBIOSに格納された機械語プログラムを実行する
→①パソコン本体や周辺機器を初期化する
→②パソコンに接続されたストレージを検索してBOOTX64.EFIのような実行可能ファイルを探して、メインメモリに読み込み、BIOSは自分自身の実行を中断し、読み込んだプログラムの実行を開始する

UEFIが②で実行するプログラムのことをUEFIアプリケーションといい、OSをメインメモリに読み込んで起動させるためのブートローダを作る。
8x8の回転を考える(上下反転)



参考

https://qiita.com/caa45040/items/5b73791d871746d6b936

x 過去ログを見よ
x ArduinoUnoの予定は、未定

結果

![o_coq294.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/64b25814-3658-c7f0-099a-4eae91a539fd.jpeg)


プログラム

オンラインコンパイラ


```c++


#define bit8_put(aa) for(int ii=8;ii!=0;ii--) \
{if(aa & 0x80){printf("1");}else{printf("0");}aa=aa<<1;}


// ビットマップデータ
unsigned char databytes[8] = 

{

0b01100110,
0b10101111,
0b10111111,
0b11011111,

0b01111110,
0b01111110,
0b00111100,
0b00011000

};

// ビットマップデータ
unsigned char databytes_M_180[8];


#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    printf("START\n\n");
    int a; //一時ワーク

    printf("INPUT\n");
    for(int ii=0;ii<8;ii++){
        a = databytes[ii];
        bit8_put(a);
        printf("\n");
    }//for ii
    printf("\n");

    //上下逆転処理
    databytes_M_180[0] = databytes[7];
    databytes_M_180[1] = databytes[6];
    databytes_M_180[2] = databytes[5];
    databytes_M_180[3] = databytes[4];

    databytes_M_180[4] = databytes[3];
    databytes_M_180[5] = databytes[2];
    databytes_M_180[6] = databytes[1];
    databytes_M_180[7] = databytes[0];

    printf("OUTPUT\n");
    for(int ii=0;ii<8;ii++){
        a = databytes_M_180[ii];
        bit8_put(a);
        printf("\n");
    }//for ii
    printf("\n");

}//main




```


```

START

INPUT
01100110
10101111
10111111
11011111
01111110
01111110
00111100
00011000

OUTPUT
00011000
00111100
01111110
01111110
11011111
10111111
10101111
01100110


```
8x8の回転を考える(左右反転)



参考

https://qiita.com/caa45040/items/47c83ae3bf46d7fbcf6c


https://qiita.com/caa45040/items/9223a73e1ee7ea23090d


https://qiita.com/caa45040/items/444a05da951b44b5a471


x 過去ログを見よ
x ArduinoUnoの予定は、未定

結果

![o_coq293.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/4839a096-c5cb-44bb-de16-e3dbd9501d0d.jpeg)


プログラム

オンラインコンパイラ


```c++


#define bit8_put(aa) for(int ii=8;ii!=0;ii--) \
{if(aa & 0x80){printf("1");}else{printf("0");}aa=aa<<1;}

int BitReverse(int x) {
  x = (x >> 4) | ( (x & 0x0f) << 4 );
  x = ((x & 0b11001100) >> 2) | ( (x & 0b00110011) << 2 );
  x = ((x & 0b10101010) >> 1) | ( (x & 0b01010101) << 1 );
  return(x);
}


// ビットマップデータ
unsigned char databytes[8] = 

{

0b01100110,
0b10101111,
0b10111111,
0b11011111,

0b01111110,
0b01111110,
0b00111100,
0b00011000

};

// ビットマップデータ
unsigned char databytes_M_0[8];


#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    printf("START\n\n");
    int a; //一時ワーク

    printf("INPUT\n");
    for(int ii=0;ii<8;ii++){
        a = databytes[ii];
        bit8_put(a);
        printf("\n");
    }//for ii
    printf("\n");
    
    printf("OUTPUT\n");
    for(int ii=0;ii<8;ii++){
        databytes_M_0[ii] = BitReverse(databytes[ii]);
        a = databytes_M_0[ii];
        bit8_put(a);
        printf("\n");
    }//for ii
    printf("\n");

}//main



```

```

START

INPUT
01100110
10101111
10111111
11011111
01111110
01111110
00111100
00011000

OUTPUT
01100110
11110101
11111101
11111011
01111110
01111110
00111100
00011000


```
webpackの設定で同じtestディレクトリー別に違うrulesを適用する


```js
// webpack.config.js
module.exports = {
    ...
    module: {
        rules: [
      {
        test: ...,
        oneOf: [
          {
            include: path.resolve(__dirname, ルールを適用したいディレクトリーのパス),
            use: ... // ここのloaderはincludeのパスのみに適用される
          },
          {
            exclude: path.resolve(__dirname, ルールを適用したくないディレクトリーのパス),
            use: ... // ここのloaderはexcludeのパス以外すべてに適用される
          },
          ...
        ],
      }
    ]
}
```

oneOfでグループ化して別々の複数のルールを同じ種類のファイルに適用することができる。
【知らないと大失敗するかも!?】nmapのオプション

## 記事の目的

nmapのオプションミスを晒すことで同じ被害者を防ぐのが目的。

---

## 失敗1. オプションを間違えているのにコマンドが通ってしまい，--max-rtt-timeoutが効いていないのに気づけなかった。

```shell
sudo nmap -max-rtt-timeout=300ms localhost
```
のように設定してしまった。
正しくは`--max-rtt-timeout`である。

> [公式ドキュメント](https://nmap.org/man/ja/man-briefoptions.html)

### この間違いで何が起きるか

- 公式ドキュメントに記載はないが，nmapには`-m`というオプションがあるらしく，これがファイル名を指定する系のオプションらしい。
- 自分が`--max-rtt-timeout`ではなく，`-max-rtt-timeout`にしていたことでnmapに`-m`でax-rtt-timeoutというファイル名で出力すると解釈されてしまった。
- 結果として，**指定したタイムアウト時間が機能せず，一生ポートスキャンが終わらない**という悲劇が発生した(今回は対象ホストがものすごく多かったのでかなり時間の無駄になった)。

### 対策

- あまりに遅いときには疑問を持つようにする。
  - ツールを流して終わりにしない。
  - ツールの実行時間をある程度見積もっておく。

- コマンドが正しいことを事前に確認する。最悪gptに投げて聞くでも良い。

---

## 失敗2. `-PS`オプションが効かないことを知らなかった。

```shell
nmap -PS22 localhost
```
のように実行すれば22にしかポートスキャンが行かないと思っていたが，他のポートにもスキャンが飛んでいたため，かなりポートスキャンの時間が伸びてしまった。

### 対策
- `-p`を使おう。
GitHub PagesをEnterprise(OrganizationsでPrivate)で使ったら謎のドメインにリダイレクトされた話

## 背景

社内ドキュメントをReactでホストする際に，GitHubのOrganizationsに参加しているユーザに限定して公開する目的でGitHub Pagesを使ったがeffective-pancakeのような謎のドメインにリダイレクトされてしまい，Reactアプリがうまく動作しなくなってしまった。

---

## 前提知識 GitHub PagesのPrivateモードについて
> [GitHub Pagesサイトの可視性を変更する](https://docs.github.com/ja/enterprise-cloud@latest/pages/getting-started-with-github-pages/changing-the-visibility-of-your-github-pages-site)

---

## 謎のURLにリダイレクトされる原因と解決策
- 原因はOrganizationsでホストしているからではなく，privateで公開していること。
> [Private GitHub Pages redirects to internal url](https://github.com/orgs/community/discussions/21581)

これによるとGitHubによって発行される謎のドメインを使わないにはカスタムドメインを設定して使うしかないらしい。

- Reactのアプリは通常のpublicリポジトリのように，package.jsonのhomepageをリポジトリ名を使うとうまくホストできなかったので，リダイレクト先に合わせてやったらうまく動いた。

```json
  "homepage": "https://effective-pancake-hogehoge",
```
macos cli sysctl manual

The `sysctl` utility retrieves kernel state and allows processes with appropriate privilege to set kernel state. The state to be retrieved or set is described using a “Management Information Base” (“MIB”) style name, described as a dotted set of components.
     
```shell
sysctl -n hw.ncpu
```

```shell
sysctl net.inet.ip.portrange

net.inet.ip.portrange.lowfirst: 1023
net.inet.ip.portrange.lowlast: 600
net.inet.ip.portrange.first: 49152
net.inet.ip.portrange.last: 65535
net.inet.ip.portrange.hifirst: 49152
net.inet.ip.portrange.hilast: 65535
net.inet.ip.portrange.ipport_allow_udp_port_exhaustion: 0
```

```
sysctl net.inet.ip.portrange.first
sysctl net.inet.ip

sysctl kern.maxfilesperproc
sysctl kern

sysctl kern.uuid
sysctl kern.version

sysctl kern.osrelease
sysctl kern.osrevision
sysctl kern.ostype
sysctl kern.osversion

sysctl kern.waketime
```

```
sysctl -A | grep kern.maxfiles
sysctl -A | grep kern
```

```
sudo sysctl -w kern.maxfiles=1048600
```

---

Ref:

https://wudaijun.com/2017/02/max-osx-ulimit/

https://yuanmomo.net/2019/07/26/mac-max-connections-config/
docker-composeをコマンドラインでインストールする

# 導入

AWSのEC2インスタンスに`docker-compose`をインストールしたいと思ったがこれまでDocker Desktopしか使ったことがなく勝手にインストールされていた。やってみようと思ったときに手間取ったので備忘録的に残す。

# 環境
- Amazon Linux 2023

```shell
$ bash --version
GNU bash, version 5.2.15(1)-release (x86_64-amazon-linux-gnu)
```


# 方法
公式のREADMEのWhere to get Docker Composeには以下の手順が記載されている。

https://github.com/docker/compose/?tab=readme-ov-file#linux

> You can download Docker Compose binaries from the release page on this repository.
>
> Rename the relevant binary for your OS to docker-compose and copy it to $HOME/.docker/cli-plugins
>
>Or copy it into one of these folders to install it system-wide:
>
>/usr/local/lib/docker/cli-plugins OR >/usr/local/libexec/docker/cli-plugins
>/usr/lib/docker/cli-plugins OR /usr/libexec/docker/cli-plugins
>(might require making the downloaded file executable with chmod +x)

GitHubの[release page](https://github.com/docker/compose/releases)からバイナリをダウンロードする。
公式ではインストール先が限定されているように書かれているが実際には別の場所でもよい。今回は`/usr/local/bin/docker-compose`フォルダにダウンロードする。
ダウンロードには`curl`コマンドを使用する。

```shell
$ sudo curl -L https://github.com/docker/compose/releases/download/v.2.29.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
```

`curl -L`はリダイレクトを有効にするオプションである。`-o`オプションはレスポンスをファイルとして書き出すためのオプションである。

https://curl.se/docs/manpage.html#-L

https://curl.se/docs/manpage.html#-o

今回の環境の場合`uname -s`と`uname -m`の実行結果は下記になる。
明示的に書いてもいい。

```shell
$ uname -s
Linux
$ uname -m
x86_64
```

次にバイナリをダウンロードしたフォルダに実行権限を付与する。
ここは公式のREADMEに則る。

>(might require making the downloaded file executable with chmod +x)


```shell
$ sudo chmod +x /usr/local/bin/docker-compose
```

`chmod +x`は指定したフォルダに実行権限を付与する。`+`が権限を追加を表し、`x`が実行権限を表す。

https://www.ibm.com/docs/ja/aix/7.2?topic=c-chmod-command

最後に`docker-compose`を実行できるか確認をする。バージョンが表示されたらOK。

```shell
$ docker-compose --version
Docker Compose version v2.29.1
```
AtCoder 勉強記録[C++] その43

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

int main() {
  ll n, q;
  cin >> n >> q;
  vec x(q);
  rep(i, q) cin >> x[i];
  vec a(n+1);
  for(int i = 1; i < n+1; i++) a[i] = i;
  vec pla(n+1);
  for(int i = 1; i < n+1; i++) pla[i] = i;
  for(int i = 0; i < q; i++){
    ll num = pla[x[i]];
    if(num == n) {
      swap(pla[a[num]], pla[a[num-1]]);
      swap(a[num], a[num-1]);
    } else {
      swap(pla[a[num]], pla[a[num+1]]);
      swap(a[num], a[num+1]);
    }
  }
  for(int i = 1; i < n+1; i++) cout << a[i] << " ";
}
```
### 解法
すべての`Xi`において1からNを探索すると実行時間以内に計算が終わらないため、ボールの位置を入れておく配列を用意することで実行時間以内に収めることができる。
Azure VM をリストア / 複製した時の UUID ～Windows編～

こんにちは、アーキテクトのやまぱんです。

今回は Azure VM(ディスク)をリストアしたり、スナップショットを用いて複製したりした場合に UUID 、ディスク周りの固有識別子ってどうなるの？っていう声を定期的に聞くので、シナリオ別にまとめてみました。
今回は Windows で実施していますが、基本的には Linux でも同じはずです。

（またいつか機会があれば Linux でも確認します。）


補足コメントや質問、<font color="red">**いいね、拡散**</font>、是非お願いします🥺！
特にディスクに関してはいろいろな識別子があるようなので、これも確認したほうがいいのでは？などあれば是非お願いします。
間違ってたら<font color="red">**優しく**</font>教えてください！

:::note info
**UUID とは ？**
Universally Unique Identifier の略。
ソフトウェアが扱うオブジェクトを一意に識別するための識別子のこと。
UUIDは128ビットの数値であり、16進法による文字列で表されることが多い。
UUIDは誰でも自由に生成できるが、基本的には他のUUIDと重複しないように設計されている。
:::


# 確認した UUID 類
## PNPDeviceID (＋SerialNumber)

```PowerShell:PowerShell
Get-WmiObject Win32_DiskDrive | Select-Object DeviceID, PNPDeviceID, SerialNumber
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/de156385-9939-878f-3205-e2e0f8413042.png)

:::note info
上記の結果通り、Azure VM では SerialNumber は値がなかった
:::


## Disk UUID (uniqueid)

```PowerShell:PowerShell
diskpart
list
disk 
select disk 0 (1,2・・・)
uniqueid disk
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/9e6d495b-6c5e-c8d5-8267-ca269f8c2900.png)

## パーティション UUID

```PowerShell:PowerShell
Get-Partition | Select-Object DiskNumber, PartitionNumber, UniqueId
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/f9fcee27-af42-ef8d-3470-5d0fc689367d.png)

## Volume UUID / GUID

```PowerShell:PowerShell
mountvol
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/4d3ff9f6-edc7-7499-42bb-ed318d4715c6.png)

## OS UUID

```PowerShell:PowerShell
wmic csproduct get UUID
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/258b1eef-fbec-9b2e-a07e-6055a3acd17a.png)


# シナリオ
以下のシナリオを試した。
+ A. 新規VMリストア：新規 VM 作成によるリストア(Azure VM バックアップ)
+ B. スワップリストア：ディスクの入れ替えによるリストア(Azure VM バックアップ)
+ C. スナップショット複製：スナップショットからのディスク →  Azure VM 作成 / ディスクの復元によるリストア (Azure VM バックアップ) → VM 新規作成

# 結果 サマリ
以下のような結果となった。

|#|確認項目|A.新規VMリストア|B.スワップリストア|スナップC.ショット複製|
|:-|:-|:-|:-|:-|
|1|PNPDeviceID|変化なし|変化なし|変化なし|
|2|Disk UUID (uniqueid)|変化なし(一時ディスク除く)|変化なし|変化なし(一時ディスク除く)|
|3|パーティション UUID|<font color="red">変化あり</font>|<font color="red">変化あり</font>|<font color="red">変化あり</font>|
|4|Volume UUID|変化なし|変化なし|変化なし|
|5|OS UUID|<font color="red">変化あり</font>|変化なし|<font color="red">変化あり</font>|

+ Disk の UUID はいずれのシナリオでもディスクの UUID や Volume UUID は 変化しない
+ 一方、パーティション UUID はいずれのシナリオでも変化した。
+ その他、一時ディスクの UUID や、OS UUID はシナリオの中で VM インスタンスが新規作成されるかによって結果が異なる。


:::note note
+ Disk の UUID でA.Cのシナリオで一時ディスクが変化したのは VM インスタンス自体が変化したからだと考えられる
+ OS UUID でA.Cのシナリオで変化したのは VM インスタンス自体が変化したからだと考えられる
:::


# 関連

https://blog.shibata.tech/entry/2015/06/04/204632