OmniAICreator/Qiita-1.07M huggingface dataset:
Azure VMセキュリティの種類(Standard VM、トラステッド起動の仮想マシン、機密の仮想マシン)について

Azureでは、仮想マシン（VM）のセキュリティを強化するために、さまざまなオプションが提供されています。主に「Standard VM」、「トラステッド起動の仮想マシン（Trusted Launch VM）」、そして「機密の仮想マシン（Confidential VM）」の3種類があり、それぞれのセキュリティレベルや目的が異なります。これらの違いについて説明します。

### 1. Standard VM（通常の仮想マシン）

**Standard VM**は、Azureの基本的な仮想マシンで、一般的なセキュリティ機能を提供します。セキュリティのベースラインを確保し、企業や開発者に対して基本的な保護を提供しますが、機密性や信頼性の高い要件に応じた追加のセキュリティ機能は標準では提供されません。

- **基本的なセキュリティ機能**:
  - Azure Disk Encryption
  - Azure Security Centerによる脅威検出と推奨事項
  - Azure Network Security Groups（NSGs）によるネットワークセキュリティ
  - Azure Backupによるデータ保護
- **対象**: 基本的なセキュリティ要件のある一般的なワークロードやアプリケーション向け。

#### 利用例：
- 開発・テスト環境や、あまり厳密なセキュリティ要件がない小規模アプリケーションの運用に適しています。

### 2. トラステッド起動の仮想マシン（Trusted Launch VM）

**トラステッド起動の仮想マシン**は、セキュリティをさらに強化した仮想マシンであり、ファームウェアのセキュリティを含めた追加の保護を提供します。これにより、VM起動プロセスの信頼性を確保し、マルウェアやルートキットなどの高度な脅威から保護します。

- **主なセキュリティ機能**:
  - **仮想化ベースのセキュリティ（VBS）**: メモリを隔離し、OSの重要な部分を保護します。
  - **TPM 2.0**（Trusted Platform Module）: 起動時にセキュリティチェックを実行し、ハードウェアの整合性を検証します。
  - **セキュアブート**: 仮想マシンの起動時に信頼できるソフトウェアのみが実行されるように検証します。
  - **メジャーコード整合性検証**: OSやドライバが改ざんされていないかを確認。
- **対象**: より高いセキュリティ要件がある場合や、政府機関や金融機関などで、起動プロセスやハードウェアに対して信頼性が求められる場合。

#### 利用例：
- 信頼性が重要なビジネスクリティカルなアプリケーションや、コンプライアンス要件が厳しい業界向けのワークロード。

### 3. 機密の仮想マシン（Confidential VM）

**機密の仮想マシン**は、Azureで提供される最高レベルのセキュリティを提供するVMです。これにより、データが使用中の状態でも暗号化され、完全なデータ保護が実現します。ハードウェアに基づくセキュリティ機能が組み込まれており、仮想マシン内の機密データがAzureや他のユーザーから保護されます。

- **主なセキュリティ機能**:
  - **AMD SEV-SNP（Secure Encrypted Virtualization – Secure Nested Paging）**: データが使用中でも暗号化され、完全なデータ保護が提供されます。
  - **ハードウェアベースのセキュリティ**: 機密のVMは、物理ホスト自体が信頼され、ホスト上の他のVMやAzureのオペレーターからもデータが隔離されます。
  - **使用中データの暗号化**: 通常、データは保存中や送信中に暗号化されますが、機密のVMは「使用中」のデータも保護します。
- **対象**: 極めて厳密なデータ保護が必要な業界や、使用中のデータも暗号化してセキュリティを確保する必要があるワークロードに最適です。

#### 利用例：
- 医療業界での機密性の高い患者データの保護や、金融業界での重要な財務データの取り扱いなど、厳格なプライバシー要件を持つケース。

---

### まとめ

| 特徴                     | Standard VM             | トラステッド起動の仮想マシン（Trusted Launch VM） | 機密の仮想マシン（Confidential VM）  |
|--------------------------|-------------------------|-------------------------------------------------|------------------------------------|
| **起動時セキュリティ**     | なし                    | TPM 2.0、セキュアブート、VBS                      | AMD SEV-SNPによる保護                |
| **データ保護（使用中）**    | 保存中・転送中のみ暗号化   | 保存中・転送中のみ暗号化                          | 使用中データも暗号化                   |
| **主な利用ケース**         | 一般的なアプリケーション     | 高い信頼性とセキュリティが求められる業務用アプリ  | 機密性の高いデータを扱う業務              |
| **ハードウェアセキュリティ** | 基本的な保護              | 追加のハードウェアベース保護                      | ハードウェアベースの完全な隔離と暗号化     |

このように、Azureでは用途やセキュリティ要件に応じて異なる仮想マシンの種類を選択できるため、アプリケーションのニーズに合った適切なセキュリティレベルを確保できます。
自動でTDD開発を回すAI Agent.

閑話休題、リポジトリは下記になる

https://github.com/gpgkd906/tdd_agents

やることはシンプル
・agent.toml で開発要件などを設定する
・.env ファイルにopenaiかローカルのLLMサーバーを設定
・python bin/tdd_develop.py でAIを起動する

あとはAIが自主的にコードを書いてくれる。

、、、とまた現時点で理想的なコードを完璧に作ってくれるわけではないが、
Agentによる自動TTD開発のはこれで成り立っている。

次は
・ワークフローの改善を重ねて（特にDockerを用いて環境のカプセル化を導入など）
・より賢いLLMモデル
などで、理想を近づけていきます。
Azure可用性セット、仮想マシンスケールセット、可用性ゾーンの違いと適用ワークロード

Azureには、仮想マシン（VM）の高可用性を実現するために3つの異なるオプションがあります。これらは、**可用性セット**、**仮想マシンスケールセット**、**可用性ゾーン**です。これらの違いについて説明します。

### 1. 可用性セット（Availability Set）

**可用性セット**は、単一のデータセンター内で複数の仮想マシンを論理的にグループ化する仕組みです。これにより、同一の可用性セット内のVMが異なるハードウェアや電源、ネットワークに分散され、ハードウェア障害や計画されたメンテナンスの影響を減らすことができます。

- **フォールトドメイン**: 仮想マシンを複数のフォールトドメイン（ハードウェア障害のリスクを分散させる）に分散させます。
- **更新ドメイン**: OSやホストのメンテナンス時に複数の更新ドメインに分けて順番に更新します。
- **対象シナリオ**: 複数の仮想マシンで実行されるアプリケーションに対して高可用性を提供。
- **単一リージョン内**での可用性向上。

#### 利用例：
- Webアプリケーションのフロントエンドサーバーなどで、複数VMを異なるフォールトドメインに配置して冗長性を確保する際に使用します。

### 2. 仮想マシンスケールセット（Virtual Machine Scale Sets）

**仮想マシンスケールセット**は、仮想マシンを自動でスケールさせるための機能です。単一のアプリケーションの負荷に応じて、自動的にVMの数を増減させることができ、スケーラブルなアプリケーションを構築するのに適しています。

- **スケーリング**: 負荷に応じて仮想マシンを自動的に増減します。
- **管理性**: 大量のVMを自動でデプロイ・管理できる。
- **高可用性**: 可用性ゾーンや可用性セットと組み合わせることで、冗長性や可用性を向上できます。
- **対象シナリオ**: 大規模アプリケーションやクラウドネイティブアプリケーション、Webサービスなど、スケーラビリティが重要な場合。
- **オートスケール**: リソースの使用状況に応じて、VMの数を増減させることが可能。

#### 利用例：
- 大量のトラフィックが集中するWebアプリケーションやAPIサービスで、負荷に応じて仮想マシンを自動的にスケールアウト・スケールインするために利用します。

### 3. 可用性ゾーン（Availability Zones）

**可用性ゾーン**は、Azureのリージョン内で異なる物理的なデータセンター（ゾーン）に仮想マシンを配置することで、地理的冗長性を提供します。これにより、ゾーン単位での障害が発生しても、他のゾーンで稼働するVMに影響がないようにすることができます。

- **物理的分離**: 各ゾーンは独立した電源、冷却、ネットワークを備えており、障害に対して高い耐性を持ちます。
- **高可用性**: SLAで99.99%の可用性を保証（複数の可用性ゾーンを使用した場合）。
- **データのレプリケーション**: ゾーン間でデータのレプリケーションが可能。
- **対象シナリオ**: 地理的冗長性が必要な重要なアプリケーション、ゾーン障害からの保護が必要な場合。

#### 利用例：
- 重要な金融アプリケーションや、他の重要なビジネスシステムで、異なるゾーンにVMを配置して、データセンターの障害から保護します。

---

### まとめ

| 特徴                         | 可用性セット                   | 仮想マシンスケールセット      | 可用性ゾーン                      |
|-----------------------------|-----------------------------|-----------------------------|--------------------------------|
| **冗長性**                    | 単一データセンター内のVM冗長性   | 自動スケーリングと冗長性         | リージョン内の複数ゾーン間での冗長性 |
| **スケーリング**               | 手動スケーリング                | 自動スケーリング               | 各ゾーンで個別にスケーリング      |
| **障害の耐性**                | ハードウェア障害に対して高い耐性  | 高可用性構成も可能               | ゾーン障害にも耐える               |
| **主な用途**                  | VMの冗長化やメンテナンスの影響防止 | スケーラブルなWebアプリケーション | 地理的な冗長性を必要とする重要なアプリ |

これらのオプションをうまく組み合わせることで、Azure上でアプリケーションの可用性やスケーラビリティを最大化できます。
S3のページネーション実装でLambda関数の問題を解決した話

# 目次
1. [はじめに](#introduction)
2. [問題の概要と背景](#problem-background)
3. [問題の本質](#problem-essence)
4. [ページネーションの役割](#pagination-role)
5. [改善されたコードと解決策](#improved-code)
6. [結論と学び](#conclusion)
7. [参考文献](#reference)

<a id="introduction"></a>
# はじめに
AWS LambdaでS3バケット内のファイルをチェックする関数を実装していました。
しかし、特定の条件下でファイルが見つからないという問題が発生しました。

この記事では、問題の詳細な分析と解決策について共有します。
S3の`list_objects_v2`メソッドの制限、ファイルの命名規則、時間依存性などの要因がどのように問題を引き起こしていたのか、そしてページネーションの実装がどのようにしてこれらの問題を解決したのかを詳しく説明します。

<a id="problem-background"></a>
# 問題の概要と背景
Lambda関数は、S3バケット内の特定のプレフィックスに対して`list_objects_v2`メソッドを使用し、バックアップファイルの存在を確認していました。
しかし、バケット内のオブジェクト数が増えるにつれ、時折ファイルが見つからないというエラーが発生するようになりました。

<a id="problem-essence"></a>
# 問題の本質
問題の本質は以下の点にありました：

1. **検索範囲の制限**: `list_objects_v2`メソッドは最大1000個のオブジェクトしか返さないため、チェック対象のファイルが1000番目以降にある場合、そのファイルは検出されません。

2. **ファイルの命名規則**: バックアップファイルの命名規則や保存位置によっては、チェック対象のファイルが常に1000番目以降に位置する可能性があります。

3. **時間依存性**: S3は基本的にアルファベット順にオブジェクトを返すため、ファイル名に日付やタイムスタンプが含まれている場合、新しいファイルほどリストの後ろに位置する可能性があります。

<a id="pagination-role"></a>
# ページネーションの役割
ページネーションの実装自体が直接問題を解決したわけではありませんが、以下の点で解決に貢献しました：

1. **完全な検索**: S3バケット内のすべてのオブジェクトを確実に検索できるようになりました。

2. **時間的な変動への対応**: 日々のバックアップファイルが増えていく状況での変動に対応できるようになりました。

3. **予期せぬエッジケースの回避**: 特定の日や条件下でのみ発生する問題を防ぐことができるようになりました。

<a id="improved-code"></a>
# 改善されたコードと解決策
問題を解決するため、以下のようなコードを実装しました：

```python
def check_file_existence(s3, bucket, prefix):
    paginator = s3.get_paginator('list_objects_v2')
    for page in paginator.paginate(Bucket=bucket, Prefix=prefix):
        for obj in page.get('Contents', []):
            if obj['Size'] > 0:
                return True
    return False

# 使用例
for server, paths in expected_files.items():
    for path in paths:
        if check_file_existence(s3, BUCKET_NAME, path):
            missing_files[server] = True
            break
```

このアプローチにより、チェック対象のファイルが1000番目以降にあっても確実に検出できるようになりました。

<a id="conclusion"></a>
# 結論と学び
ページネーションの実装により、バケット内のオブジェクト数や配置に関わらず、常に正確なファイル存在チェックが可能になりました。

<a id="reference"></a>
# 参考文献
- [Boto3ドキュメント: list_objects_v2](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.list_objects_v2)
- [AWS公式ブログ: S3のページネーション処理](https://aws.amazon.com/jp/blogs/developer/pagination-with-aws-sdk-for-python/)
- [AWS S3: ListObjectsV2 のドキュメント](https://docs.aws.amazon.com/AmazonS3/latest/API/v2-RESTBucketGET.html)
Gitコマンドの備忘録

Git hubに登録したので、Gitコマンドを忘れないようにメモしておく。

# はじめに
事前にGitをインストールする
Windowsの場合はGit bashを使ってユーザを登録する
```
$ git config --global user.name "xxxx"
$ git config --global user.email "xxxxxx@gmail.com"
```

# ブランチをクローンする
Git hubのコードURLをコピーし、'git clone'する
```
$ git clone https://github.com/XXXX/XXXXXX.git
```

# ブランチへプッシュする
コードを修正したら、コミットメッセージを記入して、プッシュする
```
$ git commit -m " コメント"
$ git push
```
※pushする際にpushするブランチを指定する方法があったと思うが、それは忘れた。
GitHubのContributionを反映させる

## この記事の対象者
```
git config user.name
git config user.email
```
で正しい値が入力されているが、コミットしてもGitHub上のContributionが反映されない人


## この記事で分かること
GitHubでのContributionの反映方法

## 結論
リポジトリのデフォルトブランチにコミットする。

この記事が参考になった。
https://teratail.com/questions/66531
[GCP]Spanner Data Boostまとめ

実務でBigQueryからSpanner Data Boost経由でSpannerのデータを参照する仕組みを実装した際に、

https://cloud.google.com/spanner/docs/databoost/databoost-overview?hl=ja

などを参考に技術調査した際のメモを記事化。

# 概要
フルマネージドでサーバーレスなサービス。
Spannerインスタンス本体への負荷をほぼかけずに、分析クエリの実行やデータのエクスポート(arvoやcsv形式で)を実行できる。

**アクセス経路**
|![](https://cloud.google.com/static/spanner/docs/images/databoost-architecture.png?hl=ja)|
|---|
|出典: [Data Boost の概要](https://cloud.google.com/spanner/docs/databoost/databoost-overview?hl=ja)|

Spannerインスタンス本体とは独立したSpanner Data Boostのシステムが存在していて、
通常のアクセスは「Spannerフロントエンド→Spannerインスタンス→ストレージ」という流れになるが、DataBoostを使用する場合は、「Spannerフロントエンド→Spanner Data Boost→ストレージ」という流れになっている。

## 所感: 想定用途
用途としては、本番稼働しているSpannerを利用しているWebアプリケーションに対して、一般ユーザーの通常利用に影響を与えずに、不具合調査やバッチ処理でSpanner上のデータを参照したいときに使うことを想定していると思われる。

# Data Boost を使うメリット
- 既存のトランザクション処理にほとんど影響を与えず、最新のデータに対してクエリを実行できる。
- 普通に使うのと同等以上のレイテンシになる。
- 負荷を伴う分析クエリの実行のためだけにオーバースペックなSpannerのプロビジョニングをする必要がなくなる。
- 急激な負荷に対して柔軟にスケールできる。
- 最もコストが高いクエリをとある指標で特定でき、Data Boostのコスト最適化に役立てることができる。
- 運用・管理が楽。容量計画、プロビジョニング、スケーリングを待つ必要がなく、メンテナンス不要。

# Data Boostを利用するために必要な権限
- Data Boostに対するクエリの実行 or エクスポートの実行をするプリンシパルに`spanner.databases.useDataBoost`のIAM権限が必要。
- `roles/spanner.databaseReader`をベースとするカスタムIAMロールを作成して、上記の権限を追加することを推奨とのこと。

# Data Boostの料金
Data Boostに対するクエリで実際に使用された処理ユニットに対して発生する。
使用量の上限もあらかじめ設定可能。

# BigQueryのコンソール上でData Boostを利用したSpannerとの連携クエリを実行する方法
## 準備
- BigQuery Connection APIを有効化
- 先述のIAM権限をプリンシパルに付与
- [BigQueryからDataBoost経由でのSpannerとの接続を作成](https://cloud.google.com/spanner/docs/databoost/databoost-run-queries?hl=ja#create-databoost-connections)

## クエリ実行
- [連携クエリを実行する](https://cloud.google.com/spanner/docs/databoost/databoost-run-queries?hl=ja#federated-queries)

# BigQueryと外部データストアとの連携
BQと外部データストアとの連携方法には、もともと以下の2パターンがある。
それぞれで対応するデータストアが異なっている

- BigQueryに外部テーブルを作成して連携: S3, Azure Blob Storage, Apache Iceberg, Bigtable, GCS, Googleドライブ
- 連携クエリ(フェデレーションクエリ): Cloud SQL, Spanner


### 所感: BigQuery と Spanner Data Boostとの関係
2023/6/23に Spanner の機能として Data Boost がリリースされたことにより、Spannerに対する連携クエリ(フェデレーションクエリ)の利用を、オプション的に Data Boost を利用して行うことができるようになったという流れの模様

「BigQueryからSpannerに対して負荷が高いクエリを投げたいけど、Spanner本体に対して負荷はかけたくない」というケースでは、従来は

```
①そもそもSpanner上のデータをBigQueryに直接コピーしておき、BigQuery内で完結するようにしておく
②GCSに一旦CSVとして履いて、外部テーブル利用での連携(速度はお察し)
```

という形での対応が、各案件において取られていた模様。
Data Boost の登場で、新たな選択肢として

```
③連携クエリ利用 + DataBoost 
```

ができたという感じの模様。

②は論外として①と③で比較すると、③はクエリをData Boostに投げはするので、速度的に①よりは遅いだろうというのはあるが、以下がかからないという点でメリットが大きいと思われる。
- コピーするシステムを組む&メンテする時間的コスト
- BigQueryのテーブルとしてデータを保存するにあたってのストレージ料金

# Data Boost がちゃんと使われていることの確認
Monitoring のコンソールへアクセス > Metrics Exploler で指標に以下の設定をして「適用」を押下
- 有効なリソース: Cloud spanner Instance
- 有効な指標カテゴリ: Instance
- 有効な指標: Processing unit second

→ 表示される結果は、「プロジェクト内の全てのSpannerインスタンス分のData Boostの使用量合計」 だそう


**参考**

https://cloud.google.com/spanner/docs/databoost/databoost-monitor?hl=ja#use_to_track_usage
Tensorflow tutorial 備忘録

# Tensorflowチュートリアル

Google Colabを使用して、tensorflowで手書き文字画像の分類を行なってみた備忘録です。
サイト：https://www.tensorflow.org/tutorials/quickstart/beginner?hl=ja

事前構築済みのデータセットと Keras API を使用

## チュートリアル手順概要

1. notebookをダウンロード
1. GoogleColabで実行し、開くから、`beginner.ipynb`を開いて実行


### 各手順の詳細

Colab環境の場合は次のimport文で`tensorflow`します。
```
import tensorflow as tf
```

データセットを読み込んで、訓練データとテストデータを作成します。
```
mnist = tf.keras.datasets.mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
```

モデルを構築します。訓練時に使用するパラメータの設定を行います。
```
model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10)
])
```

ロジットを出力します。
```
predictions = model(x_train[:1]).numpy()
```

モデルの出力を確率分布に変換します。
```
tf.nn.softmax(predictions).numpy()
```

損失関数を定義します
```
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
```

```
loss_fn(y_train[:1], predictions).numpy()
```

モデルの構成を決めてコンパイルします。
```
model.compile(optimizer='adam',
              loss=loss_fn,
              metrics=['accuracy'])
```

トレーニングします。
```
model.fit(x_train, y_train, epochs=5)
```

テストデータを使って評価します。
```
model.evaluate(x_test,  y_test, verbose=2)
```


```
probability_model = tf.keras.Sequential([
  model,
  tf.keras.layers.Softmax()
])
```

```
probability_model(x_test[:5])
```

output
```
<tf.Tensor: shape=(5, 10), dtype=float32, numpy=
array([[3.6944858e-08, 1.3925242e-08, 1.2567447e-06, 9.0655820e-05,
        2.0254171e-10, 9.0112131e-08, 4.8772943e-13, 9.9990726e-01,
        9.5828398e-08, 4.6700069e-07],
       [2.8205452e-06, 3.8370225e-05, 9.9992299e-01, 3.0960517e-05,
        6.9640144e-17, 4.3819982e-06, 8.5220977e-09, 2.3217553e-13,
        5.2978885e-07, 8.0949331e-13],
       [2.2047616e-06, 9.9557966e-01, 7.3729301e-05, 4.7789115e-05,
        4.7653131e-05, 6.9910828e-05, 3.8576112e-05, 3.8610634e-03,
        2.7415369e-04, 5.3436274e-06],
       [9.9945372e-01, 3.6629476e-08, 4.3575207e-04, 2.5272930e-06,
        2.9114148e-07, 4.1854020e-07, 9.2867311e-05, 8.4264302e-06,
        1.3318716e-07, 5.8035425e-06],
       [5.0919939e-06, 1.0950666e-09, 5.3685193e-07, 4.9258780e-08,
        9.9882704e-01, 9.3720956e-08, 7.9492139e-07, 4.0351792e-05,
        1.2299145e-06, 1.1247701e-03]], dtype=float32)>
```
Microsoft Edge にて、ポリシーを利用して "タブを開いた際のページ" を任意設定する。

# これは何？
多くのブラウザには設定画面が存在しますが、設定したい要素が存在しない場合もあります。
しかし、設定画面上には存在しない要素を制御する方法の一つがポリシーです。
(その他は起動引数とか)

本記事はポリシー利用初心者向けの、ポリシーを利用することで
"タブを開いた際のページを設定する" 動作を実現する方法を案内するものです。

なお、動作は Microsoft Edge となりますが、Google Chrome でも応用できると思います。

# 制限
グループポリシーエディタ (gpedit.exe) を用いるパターンについては、
上記プログラムが Pro 系 Windows である必要があります。

また、下記のように記載のあるポリシーの制限として、ドメイン参加が必要になるポリシーも多いことに注意ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/6ae8aa06-894d-04b8-82ce-41f5cffe65a8.png)

(途中で気づきましたが、今回案内するポリシーもこの制限があります…)

# ポリシーの設定
グループポリシー定義ファイル (Admx) を取り込んだ後にグループポリシー エディタを実行し、
対象のグループポリシーの設定をするか、レジストリに直接書き込むことでpolicyを設定します。

## Admx の取得とインストール
1) [こちら](https://www.microsoft.com/ja-jp/edge/business/download?form=MA13FJ) のサイトからファイルを取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/47f43d55-311d-fc37-d6b9-65bb57e44dee.png)
※ 適切なプロセッサ用の定義ファイルを選択してください
2) 解凍後のファイルを "C:\Windows\PolicyDefinitions" に格納します。

上記実施後、 gpedit.exe (環境変数登録済みのため直接実行可能) すると、
"管理用テンプレート" 配下に "Microsoft Edge" セクションが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/b6f89a16-87ba-7cb9-abb0-ff6bf082081c.png)

# タブが開かれた際のページの設定
[新規タブ ページの URL を構成する](https://learn.microsoft.com/ja-jp/DeployEdge/microsoft-edge-policies#newtabpagelocation)ポリシーを設定します。

このポリシーは新規タブが開かれた際に表示する URI を指定するものです。
ローカルパスの設定も可能ですので、自分で作成した html を指定することも可能です。

## 設定方法 
1. グループポリシーエディタから下記項目を見つけます。
[Microsoft Edge] - [スタートアップ、ホームページ、新しいタブページ]
・ 新しいタブページの URL を構成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/eb118d4a-7815-5682-968a-c40dea850090.png)

2. 上記をダブルクリックし、"有効" としたのち、開きたい URL を指定後、 OK ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/a5e11501-c7ed-e59f-d061-760f25e33ea0.png)

※ 繰り返しになりますが、本ポリシーの利用には管理端末である必要があります。

# ポリシーの実体
ポリシーの実体はレジストリです。
gpedit.exe で設定した値も、最終的にはレジストリに書き込まれ、その値をブラウザが読み取ることで動作するようになります。
ですので、レジストリを直接手動で書き込んでも反映・動作させることが可能です。
(bat に書き込んで利用するのもいいと思います)

レジストリは Microsoft Edge であれば下記どちらかに設定されることになります。
a) HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Edge
b) HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\Edge
これらはグループポリシー エディタ上での "コンピューターの構成" と "ユーザーの構成" に対応します。

個人で利用している端末であれば、マシン全体での共有設定である HKLM でも
ログインユーザ向け設定である HKCU どちらでも問題ありません。

# ポリシーの反映
レジストリに反映後も、起動中のブラウザには
ブラウザを再起動する or Microsoft Edge であれば edge://policy に遷移し、
"ポリシーの再読み込み" を押下してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/abd5a0b3-9e9e-e7a8-0182-503253ae095f.png)

Microsoft Edge Policies に設定項目が反映されれば有効になっています。

# 参考ドキュメント
[Microsoft Edge ポリシー](https://learn.microsoft.com/ja-jp/deployedge/microsoft-edge-policies)
[Google Chrome ポリシー](https://chromeenterprise.google/intl/ja_jp/policies/)
IPとは？その機能と限界について

## IPの定義

IPは「インターネット・プロトコル」の略で、インターネット上で送信ホストと受信ホストがパケットを交換するためのプロトコルです。OSI 7層モデルでは第3層（ネットワーク層）に相当します。

情報はパケットまたはデータグラムと呼ばれる単位に分割され、指定されたIP宛先アドレスに送信されます。現在、IPv4（RFC 791）とIPv6（RFC 1883）の2つのバージョンが存在します。

## IPの主な機能

### 1. IPアドレスの割り当て

各ネットワークデバイスに固有のアドレスを割り当てます。現在、IPv4（32ビット）とIPv6（128ビット）の2つの方式でアドレスを割り当てることができます。

IPv4アドレスの枯渇問題により、ほぼ無限のデバイスにアドレスを割り当てられるIPv6への移行が進んでいます。

### 2. IPパケット情報

パケットヘッダには、送信元IPアドレス、宛先IPアドレス、データの長さなど、パケットに関する情報が含まれています。

## IPの限界

### 1. コネクションレス性

パケットを受け取るサーバーが停止していたり、使用できない状態であっても、特別な処理なしにパケットを送信してしまいます。

### 2. 信頼性の欠如

パケットが途中で消失したり、順序通りに到着しない場合があります。

### 3. アプリケーションの識別問題

複数のプログラムが同じIPアドレスを使用している場合、どのプログラムがそのデータを使用しているのかを識別できません。つまり、どのアプリケーションのデータなのかを判断することができません。

## 結論

これらの理由から、IP自体では通信を行わず、TCPやUDPなどの上位プロトコルを使用してデータ転送を行っています。

興味深い点として、私たちが日常的に使用しているHTTPは、HTTP/2までTCPを使用していましたが、HTTP/3からはUDPを使用するようになりました。これは通信プロトコルの進化を示す興味深い例と言えるでしょう。

## さいごに

インターネットの基盤技術であるIPは、私たちが日々利用するウェブサービスやアプリケーションの裏で重要な役割を果たしています。その機能と限界を理解することで、インターネット通信の仕組みをより深く理解することができます。

今後もIPv6への移行や新しい通信プロトコルの登場など、インターネット技術は進化し続けるでしょう。これからのネットワーク技術の発展に注目していきたいと思います。
Homebrewの権限問題を解決する方法

## はじめに

Homebrewは、macOSでよく使用されるパッケージマネージャーですが、時々権限に関する問題が発生することがあります。今回は、`brew upgrade`と`brew cleanup`コマンドを実行する際に遭遇した権限問題とその解決方法について共有します。

## 問題の発生

最近、`brew upgrade`と`brew cleanup`を実行しようとしたところ、権限の問題が発生しました。詳細なエラーメッセージは`clear`コマンドで消えてしまいましたが、Certbotに関連するディレクトリの権限が管理者になっていたことが原因だったようです。

## sudoでbrewを実行しようとした結果

問題を解決しようと、`sudo brew upgrade`や`sudo brew cleanup`を試してみましたが、以下のようなエラーが表示されました：

```
$ sudo brew cleanup
Password:
Error: Running Homebrew as root is extremely dangerous and no longer supported.
As Homebrew does not drop privileges on installation you would be giving all
build scripts full access to your system.
```

このエラーメッセージは、Homebrewをroot権限で実行することが非常に危険であり、もはやサポートされていないことを示しています。

## 解決策：Homebrewのディレクトリに適切な権限を付与する

問題を解決するために、Homebrewのディレクトリに現在のユーザーの権限を付与します。以下のコマンドを実行しました：

```
$ sudo chown -R $(whoami) $(brew --prefix)/*
```

このコマンドにより、Homebrewのディレクトリに対して、現在のユーザーが所有者となり、sudo無しでアクセスできるようになります。

## 問題解決後

権限を修正した後、再度`brew cleanup`を実行したところ、正常に動作しました：

```
$ brew cleanup
...
Pruned 0 symbolic links and 8 directories from /opt/homebrew
==> This operation has freed approximately 150.5MB of disk space.
```

## まとめと注意点

今回の問題は、Certbotの設定を行った際に、一部のディレクトリの権限が変更されてしまったことが原因でした。Homebrewを使用する際は、以下の点に注意しましょう：

1. Homebrewコマンドは可能な限りsudo無しで実行する。
2. 権限問題が発生した場合は、上記の`chown`コマンドを使用して権限を適切に設定する。
3. セキュリティリスクを避けるため、Homebrewをroot権限で実行しない。

これらの注意点を守ることで、Homebrewを安全かつ効果的に利用することができます。権限関連の問題が発生した場合は、この方法を試してみてください。
Githubのディレクトリをリポジトリ間で移動する

# はじめに
Githubのリポジトリ間でディレクトリを移動することがありました。
基本的に Appendix の記事の踏襲になりますが、コマンドの一部が異なっていたため記録として残しておきます。

# 手順
### 例
移動元を REPO.A 、移動先を REPO.B とします。

```
REPO.A
 SOURCE1/FILEA
 SOURCE2/FILEB
 SOURCE3/FILEC

REPO.B
 FOLDER/SOURCE2/FILEB
 ```

REPO.A にある SOURCE2 ディレクトリと、その配下の FILEB を REPO.B の FOLDER 配下に移動したい場合の手順を記載します。
SOURCE2 ディレクトリ配下のコミット履歴はそのまま移動させます。

### 手順
#### 移動元のリポジトリでの移動準備
+ REPO.A を clone
```
cd tmp
git clone https://github.com/REPO.A.git REPO.A.tmp.1
cd REPO.A.tmp.1
```
+ `filter-branch` を使用して対象のディレクトリ絞り込み、コミット履歴を書き換える
```
git filter-branch -f --subdirectory-filter SOURCE2/ -- --all
git filter-branch -f --tree-filter "mkdir SOURCE2 && git mv -k * SOURCE2/"
git filter-branch -f --tree-filter "mkdir FOLDER && git mv -k * FOLDER/"
```
#### 移動先のリポジトリでの取り込み作業
+ REPO.B を clone
```
git clone git clone https://github.com/REPO.B.git
cd REPO.B
git checkout -b moverepo
```

+ filter-branch した REPO.A を remote add する
```
git remote add work /tmp/REPO.A.tmp.1/.git
git remote -v # 確認
```

+ filter-branch した REPO.A を merge する
```
git fetch work

# --allow-unrelated-histories を付与しないと refusing to merge unrelated histories となる場合がある
git merge --allow-unrelated-histories work/filter
```

+ 必要に応じて push
```
git push --set-upstream origin moverepo
```

#### 移動元のリポジトリで移動したディレクトリを削除する

+ 必要に応じて `git rm` など
履歴は残したほうがいいと思い、素直に `git rm`
```
git checkout -b delete/hoge
git rm -r <TARGET_DIRECTORY>
```

# Appendix
[gitレポジトリ内のディレクトリを別のgitレポジトリ以下に移動する](https://qiita.com/yasano/items/f9248eb99850a872b0a8)
[Gitリポジトリ内にあるディレクトリを別リポジトリに移行する](https://qiita.com/seeside/items/af31c6006284d46a3b62)
[[Git] fatal: refusing to merge unrelated historiesを解決する話](https://qiita.com/mei28/items/85bc881ac1f26332ac15)
Python学習中　リスト内包表記って？

## はじめに
Leet Codeでコーディングの学習をしています。
学習中に調べたことの備忘録として記録していこうと思います。
誤り等ありましたら、ご指摘いただけるとありがたいです🙇‍♀️

## リスト内包表記とは
リスト内包表記（List Comprehension）とは、Pythonで使われるリストを簡潔に作成するための構文です。
リストを作る際のコードを短く書けるため、よく使われます。特に「リストの各要素に対して、条件を付けたり加工したりする」場合に便利です。

## 基本構文
```python
[式 for 要素 in リスト if 条件]
```

**式:** 各要素に対して行う処理。
**要素:** リストの各要素。
**リスト:** 元のリストやイテラブル（繰り返し処理が可能なもの）。
**条件（オプション）:** 要素を選別するための条件。

## 具体例
### 1. リストの要素を2倍にする
- 通常の方法：
```python
nums = [1, 2, 3, 4]
doubled_nums = []
for num in nums:
    doubled_nums.append(num * 2)

print(doubled_nums)
# 出力: [2, 4, 6, 8]
```

- リスト内包表記を使うと、これが簡潔に書けます：

```python
nums = [1, 2, 3, 4]
doubled_nums = [num * 2 for num in nums]

print(doubled_nums)
# 出力: [2, 4, 6, 8]
```

### 2. 条件を付ける（偶数のみをリストに含める）
- 通常の方法：
```python
nums = [1, 2, 3, 4, 5, 6]
even_nums = []
for num in nums:
    if num % 2 == 0:
        even_nums.append(num)

print(even_nums)
# 出力: [2, 4, 6]
```

- リスト内包表記：
```python
nums = [1, 2, 3, 4, 5, 6]
even_nums = [num for num in nums if num % 2 == 0]

print(even_nums)
# 出力: [2, 4, 6]
```

## リスト内包表記のメリット
- 簡潔で読みやすい: 一行で処理を書けるので、コードが短くなり、処理が何をしているのか一目で分かりやすいです。
- 高速: 内部的に最適化されているため、通常のforループよりも高速に動作することがあります。

## リスト内包表記を使わない方が良い場合
リスト内包表記は、単純な処理やフィルタリングには非常に有効でコードを簡潔にできますが、以下の場合は避けた方が良いです。

- 複数のネストしたループや複雑な条件分岐が含まれる場合
- 処理の途中でデバッグが必要な場合
- 複雑な変数操作や複数のステップを含む処理を行う場合

### 1. 複雑なネスト構造や複数の処理を行う場合
複数の条件や処理が重なると、リスト内包表記が長くなりすぎて読みづらくなる場合があります。たとえば、ネストしたループや複雑な条件分岐が含まれる場合です。

**例：通常のforループ**
```python
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
result = []
for row in matrix:
    for num in row:
        if num % 2 == 0:
            result.append(num ** 2)
print(result)
# 出力: [4, 16, 36, 64]
```

**例：リスト内包表記を使った場合**
```python
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
result = [num ** 2 for row in matrix for num in row if num % 2 == 0]
print(result)
# 出力: [4, 16, 36, 64]
```

2つのループ（for row in matrix と for num in row）がネストしており、さらにif文（if num % 2 == 0）も入っています。このように、複雑な処理が含まれてくると、リスト内包表記は一行が非常に長くなり、処理の流れが直感的に理解しづらくなります。

### 2. 複雑な操作やデバッグが必要な場合
リスト内包表記は1行で完結するため、複雑な処理を行うとデバッグが難しくなります。forループであれば、各ステップごとにデバッグポイントを置いて変数の中身を確認できますが、リスト内包表記では1つの式の中にすべてが詰め込まれてしまうため、デバッグがしづらいことがあります。

**例：通常のforループでのデバッグ**
printを使ってデバッグを行います。
```python
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
result = []
for row in matrix:
    for num in row:
        if num % 2 == 0:
            # デバッグ用のprintステートメント
            print(f"Processing: {num}")
            result.append(num ** 2)
print(result)
```
**リスト内包表記の場合**
リスト内包表記では、一行で処理が完結するため、途中にprintを挟むのが難しくなります。複雑なロジックが含まれる場合や、処理がうまくいかない場合は、forループに書き換えてデバッグする方が簡単です。

## おわりに
Pythonは短く簡潔にコードが書けるので、使いこなしたい言語の一つです。
メンテナンスのしやすさや、可読性にも注意して、最適な書き方を選ぶスキルを身につけたいです。
最後まで読んでいただいて、ありがとうございます！
VSCodeでワークスペースごとにキーバインディングを設定する

## はじめに

:::note alert
同じ記事あるよね？:punch:

同様の目的で投稿された記事が既にあるのですが、対応バージョンが古いのか環境の違いなのか私の環境では動作しませんでした。
よって、現バージョン(1.93.0)で動作する設定について述べています。
:::

### 何がしたいのか

VSCodeのキーバインディングに特定のワークスペース専用のものを追加したい。

#### 「できること」と「できないこと」

ユーザー単位の設定 「:o: __できる__」
ワークスペース単位の設定 「:x: __できない__」 :arrow_left: こっちをやりたい

VSCodeのキーバインディングはkeybindings.jsonファイルにて設定することができます。
ただしこれはユーザー単位のもので、ワークスペース単位で設定することはできません。
ワークスペースの.vscodeディレクトリ以下にkeybindings.jsonを置いても無駄です。

#### どういう場合に必要？

例えばある特定のワークスペースにのみ存在するタスクを実行するための専用キーバインディングを指定したい場合などが考えられます。
前述の「できること」の範囲内で設定しようとすると全ワークスペースに跨ってしまうため、該当するタスクが存在しないような別のワークスペースでもそのキーバインディングが有効となり、不都合が生じます。

## 設定方法

### ユーザー単位の共通設定

```jsonc:~/.config/Code/User/keybindings.json
[
  {
    "args": "必要なら引数をここに書く",
    "command": "実行したいコマンドをここに書く",
    "key": "キーの組み合わせをここに書く",
    "when": "config.XXX.YYY.ZZZ"
  }
]
```

### ワークスペース単位の設定

```jsonc:path-to-your-workspace/.vscode/settings.json
{
  "XXX.YYY.ZZZ": true,
}
```

:::note
:bulb: ここが違う
keybindings.json の "when" の値には、ワークスペースの settings.json で指定するキーに対して __config.__ を前置した文字列を指定します。
:::

"XXX.YYY.ZZZ" の部分は実在する設定項目名と重複しなければ何でも良さそうです。
settings.json上では「不明な構成設定」扱いされてしまいますけどね :rolling_eyes:

## 設定例

例として、ある特定のワークスペース（ここではfooとします）でCTRL+SHIFT+Rに続けてBキーが押下されたらbarというタスクを実行したいとします。

```jsonc:~/.config/Code/User/keybindings.json
[
  {
    "args": "bar",
    "command": "workbench.action.tasks.runTask",
    "key": "Ctrl+Shift+R B",
    "when": "config.workspaceKeybindings.foo.enabled"
  }
]
```

```jsonc:path-to-foo-workspace/.vscode/settings.json
{
  "workspaceKeybindings.foo.enabled": true,
}
```

```jsonc:path-to-foo-workspace/.vscode/tasks.json
{
  "tasks": [
    {
      "command": "echo \"A task, bar, is running in the workspace, foo.\"",
      "label": "bar",
      "presentation": {
        "clear": false,
        "close": false,
        "echo": true,
        "focus": true,
        "panel": "shared",
        "reveal": "always",
        "showReuseMessage": true
      },
      "problemMatcher": [],
      "type": "shell"
    }
  ]
}
```

## 参考記事

[VSCodeでキーバインドを設定する。keybindings.jsonが無い時の対処法](https://qiita.com/keitean/items/04727aeb673d1822107e "VSCodeでキーバインドを設定する。keybindings.jsonが無い時の対処法")
[VSCodeでワークスペースごとに独自のキーバインドを使う裏技](https://zenn.dev/5q2bc/articles/f17c308aae6c3a "VSCodeでワークスペースごとに独自のキーバインドを使う裏技")
[Workspace-custom keybindings for running scripts in VS Code](https://aymarino.github.io/vscode-shortcuts/ "Workspace-custom keybindings for running scripts in VS Code")
【Windows11】英語キーボードの左Altと右AltでIMEのon/off

英語キーボードを使ってます。Macでは「英かな」でIMEのon/offをしてますが、Windowsでも同様にできないかなと思って、探してたらやっと見つかりました。「alt-ime-ahk」なるものがあるじゃないか。

どの環境でも同じキー操作でいろいろできるのは、すごくありがたい。

### alt-ime-ahk
https://github.com/karakaram/alt-ime-ahk?tab=readme-ov-file

PS
なぜか「Ctrl+C」でコピーできないです。初期設定まだまだ大変です。
・・・・・
その後、キーボードをmacのモードで使ってるのが判明し、windowsのモードに変更したら、無事にコピペできました。
ただwindowsの時は、USBのケーブル接続。macの時は、Bluetooth接続をしているのですが、windowsからmacに切り替える手順として、
1) USBケーブルを抜く。
2) キーボードの電源を入れる（USBケーブルを抜くと電源が落ちるため）
3) Bluetoothを切り替える。
4) モードをmacに戻す
とかなり煩雑。安い英語配列キーボードを買って、それぞれ常時接続にした方が圧倒的に楽そう。でもまた物が増える、、、
Databricks にて MERGE 文を実行する場合にはカラムのロジックをデータフレームで保持させてから書き込むことがおすすめ

## 概要

Databricks にて MERGE 文を実行する場合には、書き込むデータセットをもつデータフレームで処理を完結させてから書き込むことで、Merge 文がシンプルとなります。Merge 文内でロジックを持たせてしまうとレビューやテストが困難となり、処理の共通化の実施が困難となります。

下記のような Merge 文のプログラムに遭遇しました。Merge 文内で`trigger_ts`列が`current_timestamp`関数でセットされています。コードが長くなることや処理の共通化が実施されてないことコードレビューが困難になることや事前にテーブルを作成して Merge 文を実行しないとロジックの妥当性を確認できないなどのテストができないことなどの課題があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/a6e7ff61-789d-75e2-4d08-d51e4733b37c.png)

事前にロジックを含むデータフレームを定義して、そのデータフレームをベースに Merge 文を実行することでシンプルになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/54803993-f738-851f-e021-8fe358244466.png)

本記事では、2 つの方法の実行コードとその結果を共有します。

## 事前準備

### 1. スキーマとテーブルを作成

```pyton
%sql
CREATE SCHEMA IF NOT EXISTS hive_metastore.merge_test_01;
CREATE OR REPLACE TABLE hive_metastore.merge_test_01.table_01
(
  id INT,
  string_col string,
  trigger_ts TIMESTAMP
);
```

### 2. ベースとなるデータフレームを定義

```python
import datetime
from pyspark.sql.functions import current_timestamp

schema = """
id INT,
string_col string
"""
data = [
    {"id": 1, "string_col": "aaa"},
    {"id": 2, "string_col": "bbb"},
    {"id": 3, "string_col": "ccc"},
]
df = spark.createDataFrame(data, schema)
```

## Merge 文の実行

### 1. Merge 文内にロジックを保持する方法

```python
df.createOrReplaceTempView('_tmp_table_01')

# Merge処理を実行
spark.sql('''
MERGE INTO hive_metastore.merge_test_01.table_01 AS tgt
USING _tmp_table_01 AS src
ON tgt.id = src.id

WHEN MATCHED THEN
UPDATE
SET
  tgt.id = src.id,
  tgt.string_col = src.string_col,
  tgt.trigger_ts = current_timestamp()

WHEN NOT MATCHED THEN
INSERT
  (
    id,
    string_col,
    trigger_ts
  )
VALUES
  (
    src.id,
    src.string_col,
    current_timestamp()
  )
''')
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/be694899-5230-b29d-a595-b40c85e9c7dd.png)


### 2. 事前に定義したデータフレームで Merge 処理を実行する方法

```python
# データフレーム操作でカラムを追加
df_2 = df.withColumn("trigger_ts", current_timestamp())
df_2.createOrReplaceTempView("_tmp_table_01")
```

```python
# Merge処理を実行
spark.sql(f'''
MERGE INTO hive_metastore.merge_test_01.table_01 AS tgt
USING _tmp_table_01 AS src
ON tgt.id = src.id
  
WHEN MATCHED
  THEN UPDATE SET *

WHEN NOT MATCHED
  THEN INSERT *
''')
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/67905d48-8893-28c9-24e1-bdaf37c4f176.png)

## 事後処理

### 1. スキーマを削除

```sql
%sql
DROP SCHEMA IF EXISTS hive_metastore.merge_test_01 CASCADE;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/698ca17c-7f61-e99d-b03f-0faad7278f3d.png)
ターミナルでEC2に初回ログインするときの手順メモ

# はじめに
AWSでターミナルからEC2に初回ログインする手順を毎回忘れてしまうので、メモのためにアウトプットします

# EC2ログイン手順

#### ログインしたいEC2が実行中になっているか確認
今回ログインしたい[main-ec2]は実行中なのでOK
実行中でない場合は、[インスタンスの状態]から起動

![スクリーンショット 2024-09-10 12.52.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782860/8f884bd8-2a93-6b6c-daca-487acf22a28e.png)

#### キーペアをCloud9環境に転送する

あらかじめダウンロードしておいたキーペアをCloud9上にドラック＆ドロップする！今回は[main-key.pem]

![スクリーンショット 2024-09-10 12.55.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782860/06721b71-3a11-f1d7-ef56-f44904f9247a.png)

ec2-user/environmentにいることを確認して、下記コマンドを実行
(キーペアの名前は変更してください)

```
username:~/environment $ mv main-key.pem ~/.ssh/
```

上記のコードで、キーペアをsshというフォルダに移動させました

#### キーペアファイルの権限を変更
権限を変更するために下記コマンドを実行
(キーペアの名前は変更してください)

```
username:~/environment $ sudo chmod 600 ~/.ssh/main-key.pem
```

::: note info
「sudo」は、管理者権限でコマンドを実行するコマンドです
:::

#### サーバーにアクセスする
キーペアの名前は変更し、xx.xx.xx.xxの部分を該当EC2のパブリックIPアドレスに置き換えてください

```
username:~/environment $ ssh -i ~/.ssh/main-key.pem ec2-user@xx.xx.xx.xx
```

初めて接続した際は、以下のメッセージが表示されるので「yes」を入力すれば接続されるはずです

```
The authenticity of host '54.250.55.206 (54.250.55.206)' can't be established.
ED25519 key fingerprint is SHA256:PyNrJHZGemeuvtBHXOOAUydSo95/IPvh9xduYcgkg2w.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
```

```
Warning: Permanently added '54.250.55.206' (ED25519) to the list of known hosts.
   ,     #_
   ~\_  ####_        Amazon Linux 2
  ~~  \_#####\
  ~~     \###|       AL2 End of Life is 2025-06-30.
  ~~       \#/ ___
   ~~       V~' '->
    ~~~         /    A newer version of Amazon Linux is available!
      ~~._.   _/
         _/ _/       Amazon Linux 2023, GA and supported until 2028-03-15.
       _/m/'           https://aws.amazon.com/linux/amazon-linux-2023/
```

上記のような画面が出れば接続完了です

# SSH接続
上記のような接続のことをSSH接続と言います
該当EC2のセキュリティグループがSSH接続を許可していない場合、
接続できませんのでご注意ください！

![スクリーンショット 2024-09-10 13.06.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782860/07ffadcc-4f78-19f2-fb2a-7b8c5203e54d.png)

今回はソースのIPアドレスを全てのIPアドレスにしていますが、
別途IPアドレスを指定するなどした方がいいと思います！

# おまけ
Nginxのインストールする方法もメモしておきます

#### Nginxのインストール
```
[ec2-user@ip-xx-xx-xx-xx ~]$ sudo amazon-linux-extras install -y nginx1
```

#### Nginxの自動起動設定
```
[ec2-user@ip-xx-xx-xx-xx ~]$ sudo systemctl enable nginx
```

#### Nginxの起動
```
[ec2-user@ip-xx-xx-xx-xx ~]$ sudo systemctl start nginx
```

#### Nginxの起動確認
ブラウザに該当EC2のパブリックIPアドレスを直接アドレスバーにコピー・ペーストしてアクセスしましょう

![スクリーンショット 2024-09-10 13.13.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782860/4f7afd05-e35d-f00e-8f73-6b3b3142e19f.png)

こちらも、先ほどのセキュリティグループでHTTP接続を許可していないとブラウザで確認することはできません

![スクリーンショット 2024-09-10 13.06.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782860/07ffadcc-4f78-19f2-fb2a-7b8c5203e54d.png)
【Flutter】ListTileを角丸にする

こんにちは。
今回は、ListTileを角丸にする方法を紹介します。

# 方法
![スクリーンショット 2023-08-13 20.18.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524120/ce57fee2-1687-ea40-8538-b4c8b9db94e0.png)

ListTileを角丸にするには、引数「shape」を使います。
LisTileの引数「shape」にRoundedRectangleBorderを指定します。
RoundedRectangleBorderの引数「borderRadius」に角の丸みを指定します。
BorderRadiusクラスを使って角の丸みを指定します。

# 使用例
```dart
 ListTile(
            title: const Text('title'),
            leading: const Icon(Icons.account_circle),
            trailing: const Icon(Icons.heart_broken),
            tileColor: Colors.red,
            shape: RoundedRectangleBorder(
              borderRadius: BorderRadius.circular(10),
            ),
          )

```

# 実行例
![スクリーンショット 2024-09-10 12.59.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524120/e541522d-a5d3-be52-6c30-8efd53d455b4.png)


# 最後に
ここまで読んでいただき、ありがとうございました！
いいねしてくれたら、スキップして喜びます:heartpulse:
AWS Certified Cloud Practitionerに合格した

![](https://storage.googleapis.com/zenn-user-upload/4016b7160ea2-20240607.jpg)

## 対象の読者🧑‍💻👩‍💻
・担当プロダクトでAWSを使っているが、よく分からない人
・非エンジニアで、AWSの知識をつけたい人

## この記事から得られること✅
・学習に使える教材たち(学習教材を探す手間が省けます)

## 軽く自己紹介 
私は現在エンジニア2年目で、AWSを触りながらバックエンドの開発をしています。
業務でLambdaやCloudWatchを触る機会がありながら操作が全く分からず、詰まるたびに逐一上司に教えを乞うていたので、なんとかならんかということで、まずは基礎になる資格の取得を目指しました。

先日、1ヶ月ほど勉強してAWS Certified Cloud Practitioner(以下Cloud Practitioner)に合格したので、合格体験記として記録しておこうと思います。

## 使った教材📚
### AWS Skill Builder
AWSが提供するデジタルトレーニングサービスで、ほぼ無料で学習ができます。(一部有料)
https://explore.skillbuilder.aws/learn/signin

様々な教材があり、私は基礎固め用と振り返り用に教材を利用していました。これらは無料で使えます。

基礎固め用(左)
「[AWS Cloud Practitioner Essentials (Japanese) (Na) 日本語実写版](https://explore.skillbuilder.aws/learn/course/1875/aws-cloud-practitioner-essentials-japanese-na-ri-ben-yu-shi-xie-ban)」

振り返り用(右)
「[AWS Certified Cloud Practitioner Official Practice Question Set (CLF-C02- Japanese)](https://explore.skillbuilder.aws/learn/course/16792/aws-certified-cloud-practitioner-official-practice-question-set-clf-c02-japanese))」

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

これらを受講していて、これなら**誰でも理解できる**なと思いました。冗談ではなく！
具体例が受講者に身近で、易しい言葉がたくさん出てきましたね。
非常に理解しやすいプログラムでした。ありがとうAWS！

Skill Builderは登録しておいて損はないと思います👍


### 自身が参加したイベントの資料
[ここ](https://qiita.com/nkkn_prog/items/0d25a214e780b8c02ca4)にも書いているんですが、入社してすぐ、つまりgitのgの字も理解する前にインフライベントに参加しました。

詳細はこの記事を見ていただきたいのですが、簡潔にいうと「新卒が3日間9-18時で缶詰状態でAWSサービスを学ぶというイベント」で、参加者はAWSのプロたちからハンズオンで知識を得て質問し放題という特権が得られていました。

その質問に対する回答を全てまとめていたので、資格勉強中のちょっとした疑問や興味が湧いてきてもっと知りたくなった時に大いに役立ちました。

資料は記事にまとめているので、興味ある方は見てみてください🔥

https://zenn.dev/nkkn_prog/articles/9c2a71b60f6ea0

### 類似問題集
自分の苦手分野を知ることを目的として、

[【CLF-C02対応】AWS認定 クラウドプラクティショナー模擬試験問題集(390問)](https://www.amazon.co.jp/%E3%80%90CLF-C02%E5%AF%BE%E5%BF%9C%E3%80%91AWS%E8%AA%8D%E5%AE%9A-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC%E6%A8%A1%E6%93%AC%E8%A9%A6%E9%A8%93%E5%95%8F%E9%A1%8C%E9%9B%86-390%E5%95%8F-%E3%81%8F%E3%81%BE%E3%81%AD%E3%81%93-%E3%83%91%E3%83%96%E3%83%AA%E3%83%83%E3%82%B7%E3%83%B3%E3%82%B0-ebook/dp/B0CL95RLFV)を使いました。

![](https://storage.googleapis.com/zenn-user-upload/1a8dda23f2e3-20240607.png)


何度も解くと、自分が理解していない分野って明確になりますね。

```
・S3の種類
・RDSとAuroraで使えるデータベースエンジンの違い
・IAMとOrganizationsの違い
・CostExplorerとBudgetsの違い
```
などなど、混同しやすい箇所は試験でも狙われると思うので、明確にする点でも模擬試験は必須です。

Cloud Practioner合格体験記を他サイトでちらほら見かけた時にUdemyを勧めている人もいましたが、正直この書籍で十分だと思いました。値段安いし、問題量多いし、内容もある程度信頼性あるし。

## 最後に
kindleやUdemyなど学習教材は様々あるんですが、私はやっぱり一**次情報大事**だなということで、なるべく**AWS公式の資料を使って勉強しました。**

「Udemyの方が分かりやすい」
「動画より書籍の方がいい」

もちろんなんでも良いと思います。ただ試験の発行元はAWSなので、AWSが公式で出しているドキュメントやホワイトペーパーも参考にしながら学習できるとより正確な知識を蓄えられそうです。


ここまで読んでくださりありがとうございました！✨
【GoogleCloud 認定資格】Professional Cloud Network Engineer合格のための勉強法

はじめに
----------------------
54歳にして、Google Cloudの認定資格である、Professional Cloud Network Engineerに合格することができました。これまで合格したGoogle Cloud試験の中で、個人的に一番難しいと感じた本試験について記載します。（残るMLはチャレンジ中です）

受験のきっかけ
----------------------
子供が受験を迎えて、一緒に勉強する雰囲気を作りたかったこともあり、クラウドの勉強を始めました。
決して得意分野とは言えないNetwork周りの試験ということで、日本語試験としては最後に受験しました。

学習方法
----------------------
はじめに、Professional Cloud Network Engineerの試験ガイドを見て、どの様な試験範囲となるかを確認しました。次に、Google Cloud Skills Boostというトレーニングプログラムがあるので、それを受講（自分のペースでWebページを見ていく感じ）しました。
ただ、正直にお話しますと、やはりなかなかすべてを集中して見ることは難しく、「なんとなく」の理解に留まりました。

このままでは合格できないと感じ、有料にはなりますが、UdemyのProfessional Cloud Network Engineer模擬試験というコースを受講し、想定問題にて理解度を試しました。
予想通り、初回は50～60%程度の正答率でしたが、そこで間違えた問題を中心に、理解が十分でない部分をGoogle Cloud Skills Boostやインターネットの記事（Qiita等）で調べて理解し、再度想定問題を実施することを繰り返しました。

試験の感想
----------------------
Udemyでの模擬試験も行ったので、類似問題が出ることを期待しておりましが、ほぼ完全に裏切られました。
ただ、もともとの知識＋模擬問題で誤った部分を徹底的に再学習したことが功を奏し、なんとか合格することができました。

言うまでもなく、試験の結果判定が出るまで、合格できる確信はありませんでした。
なお、Google Cloud試験の場合、合否に関わらず得点が出ないため、余裕で合格したのか、ぎりぎりで合格したのかはわかりません。試験時間は、そこまでギリギリではなかったと思います。

まとめ（今後受験される方へ）
----------------------
学習方法で記載しましたが、教科書を読み込むタイプの勉強法が得意でない方は、ある程度のところで、Udemyなどの模擬試験を受けてみることをお勧めします。その後でQiita等の記事を読んだり、Google Cloud Skills Boostで実践したりすると、頭に入ってくる度合がかなり上がります。

また、試験時間中は、できるだけ落ち着いて問題文を読み解くことをお勧めします。
一見難しく見える問題でも、自分の知っている知識の範囲で判断できるものや、文意から判断できる問題もありました。おそらく時間は十分あると思いますので、最後まであきらめずに、頑張ってください！
Pyinstallerでexe化したjanomeを使うTkinterアプリを実行した時のエラーと解決法

# pyinstallerでexe化したjanomeを使うtkinterアプリ

自作したpythonプログラムを配布したいとき次のライブラリを使うとGUIアプリをexe化して共有できます。

・[Tkinter](https://docs.python.org/ja/3/library/tkinter.html)でGUIを作成
・[Pyinstaller](https://pyinstaller.org/en/stable/)でexe化

またpythonプログラムに日本語の言語処理が含まれているとき、[janome](https://mocobeta.github.io/janome/)を使って形態素解析を行うことができます。形態素解析とは文章を意味を持つ最小単位(形態素)に分割し解析する処理のことを言います。


Pyinstallerでexe化したjanomeを使ったGUIアプリを実行しようとした時のエラーと解決法です。

# 実行環境
OS: Windows 10 Pro
Procdssor: Intel(R) Core(TM) i5-5200U CPU @ 2.20GHz   2.19 GHz
python: Python 3.12.6
Janome version: 0.5.0

# 発生したエラー
コマンドプロンプトから次のコマンドでapp.pyをexe化しました。exe化したapp.exeはdistディレクトリ内に問題なく生成されます。
```
pyinstaller --onefile --windowed app.py
```

生成されたapp.exeをダブルクッリックして実行すると次のダイアログが表示されTkinterのGUIが表示できませんでした。

![fig1_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2804113/af30969c-59af-793e-19c1-794d2be7a96d.png)


# 解決法
解決方法は[こちらのブログ](https://plaza.rakuten.co.jp/kugutsushi/diary/202404080000/)でおっしゃる通り。コマンドプロンプトで実行するpyinstallerのコマンドに--collect-all janomeを追加します。

```
pyinstaller --onefile --windowed --collect-all janome app.py
```

これで新たに生成されたapp.exeはエラー無く実行可能です。
【ChatGPT＋Code Interpreter】で画像のパネルに文字列を描画します（改訂版）


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

　今回は、画像内のパネルに文字列を描画します。以前にも吹き出しでやりましたが、改訂版です。

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

　ニュースはないので、
　　さっそく本題です。

　今回は、
　　画像内のパネルに
　　　文字列を描画します。

　以前、
　　吹き出しに
　　　文字列を描画しました。
[【ChatGPT＋Code Interpreter】で画像の吹き出しに日本語を入れます。](https://qiita.com/kabumira/items/db3a02d54e06964f2440)

　今回はその改訂版です。

　改定した理由は
　　昨日（2024/09/09）の
　　　記事で、白い領域を
　　　　赤枠で囲う精度が
　　　　　良くなったためです。
[【ChatGPT＋Code Interpreter】で画像内のパネルを認識できない？　また改善です。](https://qiita.com/kabumira/items/69aa0b5054fd3147fedf)

　また、
　　ChatGPTとのやり取りの中で
　　　わかったこともありますので、
　　　　お伝えしようかと😸
***
　では、はじめましょう。

　今回の手順は
　　大きく分けて
　　　三つあります。

　フォントの設定
　元画像の設定
　文字入れ処理
　　です。

　これまでは
　　一発のPromptで
　　　行なってきましたが、
　　　　このように分けました。
　　　　　理由はのちほど。

　手順は
　❶GPT-4oであることを確認
　❷日本語フォントをアップロードして
　　　下記Promptを送信
```Text:
・今後、CodeInterpreterではこのフォントを使用してください。
```
　❸元画像をアップロードして
　　　下記Promptを送信
```Text:
この画像を元画像とします。
```
　❹下記Promptを送信
```Text:
・PillowとSciPyを使用してください。

### 画像内の最も大きな白い領域を検出し、そこに文字列を出す処理の指示

1. **画像の読み込み**：
   - 指定された画像をRGB形式で読み込みます。

2. **白色の定義**：
   - 「白色」は、RGB値がそれぞれ210以上のピクセルとして定義します。

3. **白色領域の検出**：
   - 白色のピクセルで構成される領域（連続したピクセルのグループ）をすべて検出します。

4. **最も大きな白色領域の選択**：
   - 検出された白色領域の中で、ピクセル数が最も多い領域を特定します。

5. **文字列の描画**：
   - 最も大きな白色領域の中に、以下の日本語テキストを空白行を含むようにフォントサイズを調整してセンタリングして描画してください：
「
会場は、こちら➡
」

6. **結果の保存**：
   - 文字列が描かれた画像を保存します。
```

　これで出来上がったのが、こちら。
![processed_image_with_text_final.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/003aa51e-01d7-8eb3-96d9-11d9b2a0dd99.png)

　文字列の変更は
　　“5. **文字列の描画**：”の
　　　“「」”の部分でお願いします。
***
　さて、
　　なぜ今回、
　　　三つの部分に
　　　　Prompt送信を分けたのか。

　フォントは
　　説明いりませんよね😅

　最後のPromptも
　　細かいことなので
　　　割愛します。
　　（ここが肝ではあるんですけどね）

　三つのうちの
　　真ん中の元画像です。

　これまでの記事を
　　試してもらった方で
　　　気付いた方もいらっしゃるかも
　　　　しれませんね。

　出来上がった画像が
　　WebPではなく、
　　　PNGであることに。
　　　　たまにJPEGもありますが、
　　　　　おおむねPNGです。

　これは
　　Code Interpreterで
　　　できた画像を保存するからです。
　　　　もちろん指定すれば
　　　　　ほかのフォーマットにして
　　　　　　くれます。

　実は、赤枠を描画してきて
　　ずっと見当違いのところだったり
　　　小さかったりして
　　　　うまく行っていませんでした。

　ふと“座標系が違う？”と
　　思いましたが、
　　　ChatGPTに尋ねても
　　　　そうではない、と応えられ、
　　　　　頭を悩ませていました。

　で、昨日の記事が書けたあとに
　　今日の記事のための
　　　Prompt作成をしていたのです。

　“Promptの編集したいな”と思い、
　　Promptから元画像の指定を
　　　切り離したのです。

　画像込みのPrompt送信は
　　Prompt編集ができないためです。
　　　理由は定かではありません。

　ともかく分離して
　　今回のようにしました。

　すると
　　編集はもちろんですが、
　　　処理も安定してきました。

　そこで
　　少し考えてみたのです。

　ChatGPTは
　　元画像をPNGに置換して
　　　内部での処理に使っている、
　　　　のではないか。

　そう考えると
　　ダウンロードして
　　　PNGファイルが
　　　　出てくるのも
　　　　　腑に落ちます。

　DALL-E3が
　　WebPを採用しているからと
　　　ChatGPT（Code Interpreter）も
　　　　内部に採用しているとは
　　　　　言えません。

　むしろ、
　　過去の資産を
　　　効率よく扱うならば、
　　　　WebPからほかの一般的な
　　　　　フォーマットに変換して
　　　　　　使うのが普通ですね。

　そこまで考えて
　　“あれ？　これが原因？”と
　　　これまでの赤枠不安定の
　　　　原因かも、と。

　でも
　　確証はありません。

　それでも
　　分割することで
　　　安定するならば
　　　　私的には、それでいい😅

　長々と書きましたが
　　Promptの編集が
　　　可能になることは
　　　　確かなので
　　　　　今後は同じように
　　　　　　するつもりです。

　どうしても
　　ひとつのPromptで
　　　答えが得られる、と
　　　　無意識で思ってしまい、
　　　　　Promptをまとめて
　　　　　　しまっていました😅
　　　　　　　気を付けます。

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

　今回は、ここまで。
AWS Certified Machine Learning Engineer - Associate Beta（MLA-C01） 受験記

## はじめに

AWS Certified AI Practitioner(AIF)に引き続き、AWS Certified Machine Learning Engineer - Associate(MLA)のBeta試験を受験してきたので、勉強内容と試験の感想を書いていきます。

https://qiita.com/Haruki-N/items/8ae907733819fbcdc080

## 認定試験について
**◆概要**

「AWS Certified Machine Learning Engineer - Associate」とは、2024年8月27日からBeta試験が公開された、AI関連の新しいAWS認定試験です。

https://aws.amazon.com/jp/certification/certified-machine-learning-engineer-associate/

**◆試験情報**

Beta試験のため同カテゴリの「AWS Certified Solutions Architect - Associate（SAA）」等とは問題数や試験時間が異なる点に注意が必要です。

問題数：85問
試験時間：170分
料金：75 USD/10,000 円
言語：英語/日本語

## 試験対策
**①試験ガイド**

まずは試験ガイドに一通り目を通します。

https://d1.awsstatic.com/ja_JP/training-and-certification/docs-machine-learning-engineer-associate/AWS-Certified-Machine-Learning-Engineer-Associate_Exam-Guide.pdf

大前提として、試験ガイドに出てくる用語やAWSサービスについて説明できるレベルの知識は必要かと思います。

**②AWS Skill Builder**

AIFと同様にMLAに関しても学習コースが用意されています。

https://explore.skillbuilder.aws/learn/learning_plan/view/2191/plan

受講時間は約7.5時間でAI関連用語やAWSサービスについて学ぶことができます。
受講にあたってSkill BuilderのIDが必要になりますが、無料での受講が可能です。

**③模擬試験**

現時点での理解度の確認に役立ちます。

https://explore.skillbuilder.aws/learn/course/external/view/elearning/19688/exam-prep-official-practice-question-set-aws-certified-machine-learning-engineer-associate-mla-c01-english

②と同様にSkill BuilderのIDが必要になります。
言語は英語のみのため、苦手な方は翻訳を活用してみてください。

## 感想

AIFと比べAWSサービスを利用する問題が多く、他の認定資格と同様に運用オーバーヘッドやコストを最小限にする方法を問われるものが多かった印象です。
また、新しい形式の問題も出題されていたため新鮮でした。

https://aws.amazon.com/jp/blogs/news/aws-certification-new-exam-question-types/

## 受験結果

AIF同様、こちらも無事合格することができました。

![スクリーンショット 2024-09-10 121249.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637963/f65a986f-70e6-4c68-2b70-905e92ef6cbb.png)

## さいごに

AIFと比較して、AWSサービスに関する問題・回答が多かったこともあり、同カテゴリ帯のSAA等と比較してそこまでの難易度があるようには感じませんでした。
これまではAL/ML系の資格はAWS Certified Machine Learning - Specialty(MLS)しかありませんでしたが、AIF⇒MLA⇒MLSという流れで進めていくことで非常に学習が進めやすくなったのではないでしょうか。
ゼロ知識の匿名支払い技術：zk-nyms


# zk-nymsとは？

zk-nymsは、不要な個人情報を流出させることなく、サービスに対する支払いや利用を可能にする暗号化システムです。これはNym mixnetにとって重要なマイルストーンであり、以下のVPNの例は、その理由を説明しています。

![Screenshot 2024-09-10 at 11.51.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3672851/58e370a2-19dd-3570-ecac-4da0ece9b3b9.png)


## VPNのプライバシー問題

VPNはプライバシーツールの中でも特に広く利用されています。多くの方は、VPNサービスの利用のためにクレジットカードで決済していますが、これによりVPNプロバイダーはユーザーのカード情報、名前、住所などを把握しています。さらに、VPNプロバイダーは、利用者がアクセスするすべてのウェブサイトの情報を知ることができます。

つまり、VPNプロバイダーは、ユーザーの身元と閲覧履歴を把握しており、特に無料VPNでは、サードパーティトラッカーを使ってデータを収集し、それを他者に販売するものも存在します。

## zk-nymsが解決する問題

この問題を解決するために、zk-nymsが登場しました。zk-nymsの最初のユースケースは、Nym mixnetの帯域認証情報（bandwidth credentials）です。これにより、ユーザーはプライバシーを守りながら、mixnetを利用する権利があることを証明できます。

私たちは、ユーザーの支払詳細、名前、取引番号、その他の個人情報を必要としていません。重要なのは、mixnetの利用に必要な正しい認証情報を持っているかどうかだけです。

## zk-nymsの機能と特徴

- **暗号技術**  
  zk-nymsは、ゼロ知識証明、ブラインド署名、コミットメントスキームといった暗号技術を駆使しています。これにより、ユーザーは個人情報を明かすことなく、mixnetを安全に利用できます。

- **分散型**  
  認証情報の発行には分散型のバリデータセットを使用しており、単一の中央集権的な権威に依存しません。

- **リンク不可**  
  認証情報の発行者がサービス提供者と結託しても、ユーザーの個人情報を特定することはできません。

- **選択的な情報開示**  
  必要な時に必要な情報だけを開示することができる、選択的情報開示の仕組みを提供しています。

## zk-nymsの次なる展開

帯域認証情報は、zk-nymsの最初のユースケースにすぎません。今後は、プライバシーを保護するKYC、プライベートペイメント、アクセスコントロール、年齢認証、シングルサインオンなど、さまざまなユースケースに対応していく予定です。

zk-nymsは、デジタル社会において不必要な個人情報を第三者に漏らすことなく、安心してサービスを利用できる未来を実現します。

# 参考リンク

- [Nym公式サイト](https://nymtech.net/)
- [Nymのミキシングネットワーク - Wikipedia](https://ja.wikipedia.org/wiki/Nymミックスネット)
- [Nymホワイトペーパー](https://nymtech.net/nym-whitepaper.pdf)
- [分散型VPN と中央集権型VPN:違いの全て](https://note.com/koko_crypto/n/n71fe7e92b68a)
- [ミックスネットとは何か？ VPNによる比類なきオンラインプライバシー](https://note.com/koko_crypto/n/n302e7516f691?magazine_key=m0129d65e3526)
- [Sphinx暗号-Nymを支える匿名データフォーマット](https://qiita.com/pseudonym2/items/107cf005e9cab0b165b6)
- [ココナッツ認証（Coconut Credentials）とは？- プライバシーを保護するゼロ知識証明技術](https://qiita.com/pseudonym2/items/b2739ae32f4fb29de0b6)

# コミュニティ

- [Nym日本コミュニティ - Telegram](https://t.me/nymjapanese)
- [Nym日本コミュニティ - Discord](https://discord.com/invite/nym)
- [Nym日本コミュニティ - LINEオープンチャット](https://line.me/ti/g2/0YGYYq4EoQZ8fL5FYQmqU4O9SRuE_a6YX19GtA?utm_source=invitation&utm_medium=link_copy&utm_campaign=default)
- [Nym 公式LINE(現在非稼働)](https://line.me/R/ti/p/@986ytsdx?from=page&accountId=986ytsdx)
- [Nymプロジェクト日本語アカウント - X](https://x.com/nymproject_jp)
Databricks にて 2024-06-21T02:02:48Z のような日時をフォーマット指定して CAST する方法

## 概要

Databricks にて 2024-06-21T02:02:48Z のような日時をフォーマット指定して CAST する方法を共有します。

## 実施方法

### 1. Spark SQL で実施する方法（`yyyy-MM-dd\'T\'HH:mm:ssX`を指定）

```sql
%sql
SELECT
  to_timestamp('2024-06-21T02:02:48Z') AS `フォーマットを指定しない方法`,
  to_timestamp('2024-06-21T02:02:48Z', 'yyyy-MM-dd\'T\'HH:mm:ssX') AS `フォーマットを指定する方法`
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d8482aae-5003-3349-974d-519293586fe6.png)

### 2. PySpark で実施する方法（`yyyy-MM-dd\\'T\\'HH:mm:ssX`を指定）

```python
import datetime
from pyspark.sql.functions import expr

schema = """
timestamp_col string
"""
data = [
    {
        "timestamp_col": "2024-06-21T02:02:48Z",
    }
]

df = spark.createDataFrame(data,schema)

col_name = "timestamp_col"
df = df.withColumn(col_name,expr(f"to_timestamp(`{col_name}`, 'yyyy-MM-dd\\'T\\'HH:mm:ssX')"))

df.display()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/43d8eb0f-5581-2722-6239-24c37eed0ea3.png)
複数のサイズのアイコンを一括で作成

```python
from PIL import Image
import sys
import os

argv = sys.argv

def remove_ext(fpath):
    d = os.path.dirname(fpath)
    fname = os.path.basename(fpath)
    ff, ext = os.path.splitext(fname)
    prefix = os.path.join(d, ff)
    return prefix
    

def resize_image(input_path):
    # 変換するサイズ
    sizes = [48, 72, 96, 144, 192]

    prefix = remove_ext(input_path)
    
    # 入力画像を開く
    with Image.open(input_path) as img:
        # 幅と高さが同じであることを確認
        if img.width != img.height:
            raise ValueError("Input image must have equal width and height.")
        
        # サイズごとに画像をリサイズして保存
        for size in sizes:
            resized_img = img.resize((size, size), Image.Resampling.LANCZOS)
            output_path = f"{prefix}_{size}x{size}.png"
            resized_img.save(output_path, format='PNG')
            print(f"Saved resized image to {output_path}")

def usage():
    global argv

    s = f"""
usage:
    {argv[0]} [input image]
"""
    print(s)
    
def arg_check():
    global argv    

    if len(argv) < 2:
        usage()
        exit()

# 使用例
#input_image_path = "input_image.png"  # 入力画像のパス
#output_directory = "output_images"    # 出力ディレクトリ

arg_check()
fpath = argv[1]
#print(prefix)

resize_image(argv[1])

```


```shell
python3 convert.py icon_orig.png
```