OmniAICreator/Qiita-1.07M huggingface dataset:
【アップデート情報】AWS アプリケーション検出サービスが IPv6 エンドポイントをサポートするようになりました（2024.1.3）

いつも記事を読んでいただきありがとうございます！
モブエンジニア（[@mob-engineer](https://qiita.com/mob_engineer))です！

タイトルにもある通り、AWS Application Discovery Service（ADS）で興味深いアップデート情報がありましたので、自身のキャッチアップのために記事を執筆してみました。

サクッと読める分量で執筆しておりますので、お気軽に読んでいただければ幸いです。

:::note info
データセンター利用ユーザ向けのサービスのため、稼働確認画面などの表示は行えないため、ご了承ください。
:::

# 目次
- アップデート情報
- AWS Application Discovery Serviceとは
- 個人的に考えるビジネスインパクト
- 参考サイト

## アップデート情報
公式ブログを見ると以下の通り説明されていました。

>AWS Application Discovery Service (ADS) のお客様は、クラウド移行の一環としてオンプレミスのサーバーインベントリを検出しながら、新しいデュアルスタックドメインを介してインターネットプロトコルバージョン 6 (IPv6) アドレスを使用できるようになりました。 IPv4 をサポートする既存の ADS エンドポイントは、下位互換性のためにそのまま残ります。

>特にモバイルアプリケーション、接続デバイス、IoT の分野でのインターネットの継続的な成長により、業界全体で IPv6 への移行が促進されています。 IPv6 では使用可能なアドレスの数が桁違いに増えるため、お客様は VPC 内で重複するアドレス空間を管理する必要がなくなります。

引用元:[AWS アプリケーション検出サービスが IPv6 エンドポイントをサポートするようになりました](https://aws.amazon.com/about-aws/whats-new/2025/01/aws-application-discovery-services-ipv6-endpoints/)

凄くざっくり言えば、**オンプレミス環境でIPv6通信を利用しているユーザのネットワーク利用状況をAWSでチェックできるようになった**といったイメージかと思います。

ちなみに、AWS Application Discovery Serviceをサポートしているリージョンではすでにサポートしているとブログでは説明されていましたね。

## AWS Application Discovery Serviceとは

公式サービスサイトには次の通り説明がされていました。

>AWS Application Discovery Service は、オンプレミスのサーバーとデータベースの使用状況と設定データを収集することで、AWS クラウドへの移行を計画するのに役立ちます。Application Discovery Service は、AWS Migration Hub および AWS Database Migration Service Fleet Advisor と統合されています。Migration Hub は、移行ステータス情報を 1 つのコンソールに集約するため、移行の追跡が簡単になります。検出されたサーバーを表示し、アプリケーションにグループ化して、ホームリージョンの Migration Hub コンソールから各アプリケーションの移行ステータスを追跡できます。DMS Fleet Advisor を使用して、データベースワークロードの移行オプションを評価できます。

引用元:[サービスページ](https://aws.amazon.com/jp/application-discovery/)

ざっくり言えば、**オンプレミスからクラウド移行時のマイグレーション計画で必要な情報（リソース情報、トラフィック情報など）を取得できるサービス**といったものだと思います。

## 個人的に考えるビジネスインパクト

本アップデート情報がもたらすビジネスインパクトとして、次のようなことがあるのではないかなぁと個人的に考えています。

- オンプレミス環境でIPv6を利用しているユーザへの環境調査が容易になる
    - AWSの一つのサービスで管理できるようになるため、管理工数が削減できる
- モバイルアプリケーション、接続デバイス、IoT の分野のクラウドシフトを加速させることが出来る
    - ブログでもターゲットとしていたIPv6を大量に利用する分野のクラウドシフトへのハードルを下げることが出来る
- クラウドサービス事業者がIPv6関連のマイグレーション案件を受けやすくなる
    - IPv6の環境調査に対するハードルが下がるため、マイグレーション案件を受けることへのハードルが低くなる

## 参考サイト

https://www.sunnycloud.jp/column/20220908-03/

https://qiita.com/mksamba/items/cb4797763eba25e53ec7

https://www.youtube.com/watch?v=6SyBevYgEDI

※移行ガイドの動画は事業者が見ても分かりやすい動画だと思いました。

#### 余談

AWS公式チャンネルを見ていたら公共部門お役立ち動画がまとめられていましたので、公共関係の皆さんはチェックしてみてもいいのかなぁと思いました。

https://www.youtube.com/playlist?list=PLzWGOASvSx6H9Lwh8kulyDE4CnzgrKfyk

最後まで記事を読んでいただきありがとうございました👍
【PowerApps】ギャラリーに行番号を付けてボタンで選択行を操作する方法

ギャラリーの選択に合わせて、詳細を並べて表示し、選択アイテムを次々切り替えながら確認する際は、ギャラリーでアイテムを選択していくよりも、ボタンで上下移動できたほうが便利な場合があります。
## 動画でも解説しました
<iframe width="560" height="400" src="https://www.youtube.com/embed/AKkdJS_Z50c?si=tXrZmXAQG45-lvCu" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
気に入ったら高評価・チャンネル登録お願いします。

## 用意したリスト
![testlist1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880604/32032df3-ad90-c583-1d12-361036874ec1.png)

## ギャラリーに行番号を付ける
ギャラリーのItemsプロパティに以下
```java
With({_list: test_list1},
    ForAll(Sequence(CountRows(_list)),//リストの行数分繰り返し
        Patch(Index(_list, Value),{Row:Value})//現在行の番号をRow列に追加
    )
)
```
これで行番号としてRow列が追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880604/0897932e-eba3-e1da-4e3e-98fd86904823.png)
この右側のボタンのOnSelectプロパティに選択行を移動する数式を入れていきます。

## 最初の行を選択する
ボタンのOnSelectプロパティに以下
```java
Select(Gallery1,1)
```
Select関数は画面内のコントロールを選択する関数ですが、
対象がギャラリーの場合は第2引数に数字を入れることでその行を選択することができます。

## 最後の行を選択する
ボタンのOnSelectプロパティに以下
```java
Select(Gallery1,Gallery1.AllItemsCount)
```
第2引数にギャラリーの全行数を入れることで、最後の行を選択することができます。

## 現在の選択行から上に移動
現在の選択行を取得するために、はじめに追加したRowの値を活用します。
ボタンのOnSelectプロパティに以下
```java
With({_selectrow:Gallery1.Selected.Row - 1},//現在行より１少ない番号を設定
    If(_selectrow > 0,                        //0より大きい場合のみ実行
    Select(Gallery1,_selectrow))            //設定した行番号を選択
)
```
現在行を取得して、-1することで目的の行番号を取得します。
Select関数でエラーにならないように、目的の行が０より大きい場合のみ実行

## 現在の選択行から下に移動
```java
With({_selectrow:Gallery1.Selected.Row + 1},//現在行より１多い番号を設定
    If(_selectrow <= Gallery1.AllItemsCount,//ギャラリーの最大行数より少ない場合のみ実行
        Select(Gallery1,_selectrow)         //設定した行番号を選択
    )
)
```
上に移動する場合とほぼ同じで、現在行に+1しています。
If文も最大行数と同じか小さい場合のみ実行して、エラーを回避しています。

## 10行移動する
先ほど＋1・－1した箇所の数字を大きくすれば、その数値の行数分移動することが可能です。


##注意
今回紹介した方法は、ギャラリーの順序を並び替えない前提です。
どうしても並び替える場合は、行番号を付け直すなどの対策が必要ですね。
【個人用】AWS Solution Architect Associate対策ノート(ELB/Auto Scaling編)

あけましておめでとう

## Auto Scalingのヘルスチェック

ヘルスチェックとは、システム内のリソースが正常に稼働しているかを確認するためのプロセス

Auto Scalingのヘルスチェックは、対象リソースがEC2インスタンスの場合、「EC2」と「ELB」のオプションがある

・EC2：インスタンスのステータスチェックの結果を確認する デフォルトでは有効
・ELB：指定した接続先への応答を確認する デフォルトでは無効

ELBのヘルスチェックで以上と判断された場合は、そのターゲットへのルーティングが止まる

## スケーリングポリシー

スケーリングの発生条件とスケールアウト/インのアクションを設定するもの

### 動的スケーリング
リアルタイムのパフォーマンスに基づいて、自動的にスケーリングする
動的スケーリングは３種類ある

**①ターゲット追跡スケーリング**
指定した目標値になるように、インスタンスを増減する

**②ステップスケーリング**
複数のしきい値に基づいて、インスタンスを段階的に増減する

**③シンプルスケーリング**
１つのしきい値に基づいて、インスタンスを増減する

### 手動スケーリング
ユーザーが主導でスケーリングする

### 予測スケーリング
過去のパフォーマンスデータから、だいたいこれくらいのリソース数があればいいんじゃねーの？っていうのを予測してスケーリングする

### スケジュールに基づくスケーリング
スケーリングの実施タイミングをスケジュールして実施する

## ALBのURLリダイレクト機能
ALBには、送られてきたリクエストを別のURLにリダイレクトする機能がある
たとえば、ユーザーからHTTPへのリクエストをHTTPSに変換することなどができる
これを行うには、ALBで**HTTPリスナー**を作成し、HTTPSへリダイレクトするルールを設定する

## ライフサイクルフック
スケーリング発生(スケールイン/アウト)によるEC2インスタンスの起動または終了時に、任意の処理を実行する機能
たとえば、スケールアウトで新たに追加されたインスタンスの初期スクリプトを実行したり、スケールインで終了するインスタンスのログを収集、退避させる　などができる

## 終了ポリシー
スケールイン発生時に、どの優先順位でリソースを削除するのかを「終了ポリシー」で設定できる
終了ポリシーの設定がデフォルトの場合は、**もっとも作成時刻が古い起動テンプレートを利用して起動されたリソース**が削除される

## SNI(Simple Name Indication)
暗号化通信で使用するサーバー証明書を、パブリックIPアドレスではなく**ドメイン名**によって判断する技術

## ELBのアクセスログ
ELBに送信されるリクエストを記録し、S3に保存される
アクセスログには、クライアントのアクセス日時や接続元IPアドレスなどが記録される

## ELBの種類

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1751890/a49b8bd2-c40e-a37b-5ed0-afe8c70e4fcf.png)

## Auto Scalingウォームプール
一言で言えば、起動時間の長いアプリケーションのレイテンシーを軽減できる機能
事前に初期化されているEC2インスタンスをここにぶち込んでおけば、スケールアウト時にすぐ起動できてレイテンシーを軽減させられる
javascriptでの変数の宣言方法による違い

javascriptでの変数の宣言方法による違いをまとめておきます。letやらvarやらです。
宣言、普段なんとなくやっちゃうんですが、大事ですよね。


## 1. `let`
- **スコープ**: ブロックスコープ（`if`文や`for`文などのブロック内でのみ有効）
- **再代入**: 可能（変数の値を変更できる）
- **再宣言**: できない（同じスコープ内で再宣言を試みるとエラー）
- **巻き上げ**: 巻き上げはされるが、一時的死角（TDZ）があるため、宣言前にアクセスするとエラーになる
- **グローバルオブジェクトへの追加**: しない（グローバルスコープで`let`で宣言した場合、`window`や`global`オブジェクトにプロパティとして追加されない）

```javascript
let x = 10;
x = 20;  // 再代入は可能
console.log(x);  // 20
```


## 2. `const`
- **スコープ**: ブロックスコープ（`let`と同様にブロック内でのみ有効）
- **再代入**: できない（定数なので、値を変更することができない）
- **再宣言**: できない（同じスコープ内で再宣言を試みるとエラー）
- **巻き上げ**: 巻き上げはされるが、`let`と同様に一時的死角（TDZ）があり、宣言前にアクセスするとエラー
- **グローバルオブジェクトへの追加**: しない（`const`もグローバルスコープで宣言しても、グローバルオブジェクトには追加されない）

```javascript
const y = 30;
y = 40;  // エラー：再代入できない
```


## 3. `var`
- **スコープ**: 関数スコープ（関数内でのみ有効。関数外で`var`を使うとグローバルスコープになる）
- **再代入**: 可能（`let`と同様に値を変更できる）
- **再宣言**: 可能（同じスコープ内で再宣言してもエラーにはならない）
- **巻き上げ**: 巻き上げが起き、変数は宣言されるが初期化されないため、宣言前にアクセスすると`undefined`になる
- **グローバルオブジェクトへの追加**: する（グローバルスコープで`var`で宣言した場合、`window`や`global`オブジェクトにプロパティとして追加される）

```javascript
var z = 50;
var z = 60;  // 再宣言が可能
console.log(z);  // 60
```


## 4. 「何もなし」（宣言なし）
- **スコープ**: グローバルスコープ（関数やブロック内で宣言しない場合、変数は自動的にグローバルスコープに追加される）
- **再代入**: 可能（宣言せずに代入した場合も変数に値を設定できる）
- **再宣言**: できる（変数が既にグローバルスコープに存在していても、再宣言することができる）
- **巻き上げ**: なし（宣言しない場合、巻き上げは起きない）
- **グローバルオブジェクトへの追加**: する（宣言しない場合、`window`や`global`オブジェクトに追加される）

```javascript
x = 70;  // 宣言なしで代入
console.log(x);  // 70
```



## 比較まとめ

| 特性                    | `let`                             | `const`                          | `var`                            | 何もなし（宣言なし）        |
|-------------------------|-----------------------------------|----------------------------------|----------------------------------|-----------------------------|
| **スコープ**             | ブロックスコープ                 | ブロックスコープ                | 関数スコープ                     | グローバルスコープ          |
| **再代入**               | 可能                              | 不可                             | 可能                             | 可能                        |
| **再宣言**               | 不可                              | 不可                             | 可能                             | 可能                        |
| **巻き上げ**             | 一時的死角（TDZ）                 | 一時的死角（TDZ）                | 初期化されず、`undefined`になる  | なし                        |
| **グローバルオブジェクト追加** | しない                            | しない                            | する                             | する                        |

## 結論
- **`let`** と **`const`** は、どちらもブロックスコープで、スコープ内での変数管理をより厳密に行いたい場合に使う。`const`は値が変更されない定数を宣言する場合に使う。
- **`var`** は、古いコードや関数スコープで動作する必要がある場合に使わるが、現代のJavaScriptでは`let`や`const`を使用することが推奨さる。
- 変数を宣言しない場合（何もなし）は、グローバルスコープに変数が追加されてしまう。予期しないバグやセキュリティ問題を引き起こす可能性があるため、避けた方がよい。
terraformのdocker環境の立ち上げ

## motivation

localstack, motoを利用してlocalの開発環境をdockerで立ち上げを想定していたが、
[hashicorp/terraform](https://hub.docker.com/r/hashicorp/terraform)を利用した際に、ttyを使えず、`docker run`ベースでの開発になり用途が合わなかった。

entry pointを変更すれば上記は解決します。
[entry pointについて](https://www.docker.com/ja-jp/blog/docker-best-practices-choosing-between-run-cmd-and-entrypoint/)
[terraform image](https://hub.docker.com/layers/hashicorp/terraform/1.11.0-alpha20241218/images/sha256-41db81ccae708a0849a9cdd832137023c0d9d0c04c4de0f6d6a08382eb899b88)

aws-cliは考えず、着手できる状況を目指す。

## TL;DR

alpineを利用してcontainerを作成し、terraformを有効化する。

## Directory構成

```terminal
tree .
.
├── Makefile
├── README.md
├── local-dev
│   ├── compose.yaml
│   └── tmp.terraform.dockerfile
└── terraform
    └── main.tf
```

compose.yamlについては、terraformのversion controlできればよいので、雑めに作成する。

```local-dev/compose.yaml
services:
  terraform:
    container_name: terraform_container
    build:
      context: .
      dockerfile: tmp.terraform.dockerfile
      target: development
      args:
        TERRAFORM_VERSION: "1.10.3"
    tty: true
    volumes:
      - ../terraform:/usr/terraform
    networks:
      - internal

networks:
  internal: {}
```

```local-dev/tmp.terraform.dockerfile
FROM alpine:latest as development

ARG TERRAFORM_VERSION

WORKDIR /usr/terraform

RUN wget https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_linux_amd64.zip &&\
    unzip terraform_${TERRAFORM_VERSION}_linux_amd64.zip && rm terraform_${TERRAFORM_VERSION}_linux_amd64.zip &&\
    mv terraform /usr/bin/terraform
```
【2025年最初】WindowsでStable Diffusionを動かす(ComfyUI編)

# はじめに
[技術チャレンジ部](https://challenge-club.connpass.com/)のとも(Tomo)です。
[【2024年最終】AMD APUでStable Diffusionを動かす(ComfyUI編)](https://qiita.com/tomo-v/items/6ef495ece6049c1d9e63)では、AMD APU上のUbuntuでComfyUIを動かしてみました。
手元にはNVIDIAのGPUを搭載した、実質VRChat用のWindowsPCもあるため、これでComfyUIを動かしてみようと思います。

# 環境
## デスクトップPC
- OS: Windows10 22H2
- CPU: Ryzen7 5700X
- RAM: 32GB
- SSD: 1TB
- GPU: GeForce RTX 4070 Ti SUPER
    - VRAM: 16GB
    - ドライバー: 2025年1月時点で最新のGeForce Game Readyドライバー

# ソフト選択
色々試したところ、なるべくWindowsの流儀に合わせるのが良さそうに思いました。
最終的には以下の構成としました。
- Microsoft StoreからのPython3.12
- [PyTorch](https://pytorch.org/get-started/locally/)
    - Stable(2.51)-Windows-Pip-Python-CUDA12.4
- [ComfyUI](https://github.com/comfyanonymous/ComfyUI)
- [Git for Windows](https://gitforwindows.org/)
- PowerShell
    - CLI操作はPowerShellから行いました

# インストール
## Windows用の手順
動かせた後に気づいたのですが、[ComfyUIのWindows用インストール手順](https://github.com/comfyanonymous/ComfyUI?tab=readme-ov-file#windows)を見ると、`ComfyUI_windows_portable_nvidia.7z`というリリースファイルがあり、Nvidia GPUならファイルを展開するだけで使える環境が用意されているんですね。知りませんでした。
以下は、[Manual Install](https://github.com/comfyanonymous/ComfyUI?tab=readme-ov-file#manual-install-windows-linux)に該当。

## Git for Windows
あらかじめ入れてありました。`git`コマンドを使うのに要るかと思います。

## Python
Microsoft StoreにてPythonで検索し、Python3.12をインストールするだけ。
PowerShellで`python`を実行しようとしたら、ストアアプリに転送されて、この方法を知りました。
pipやvenvも使えるようです。

## venv
`venv`コマンドそのものは無いようなので、以下の方法でComfyUI用のvenvを作りました。
activateのパスはLinuxと異なる模様。
```powershell
python -m venv ComfyUI-venv
.¥ComfyUI-venv¥Scripts¥activate
cd ComfyUI-venv
```

以下はvenvがactivateされた状態で実行。

## PyTorch
[PyTorch本家](https://pytorch.org/get-started/locally/)の*INSTALL PYTORCH*のチャートで、Stable(2.51)-Windows-Pip-Python-CUDA12.4を選んで表示された手順をそのまま実行。
```powershell
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124
```

## ComfyUI
[Ubuntuの時](https://qiita.com/tomo-v/items/6ef495ece6049c1d9e63#comfyui)と同じ。

```powershell
git clone https://github.com/comfyanonymous/ComfyUI.git
cd ComfyUI
pip install -r requirements.txt torchsde
```

## モデルの設置
[Ubuntuの時](https://qiita.com/tomo-v/items/6ef495ece6049c1d9e63#%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E8%A8%AD%E7%BD%AE)と同じ。

## 実行
AMD APUの時と異なり、オプションは不要。
別ホストからアクセスしたかったので、`--listen`だけ付けました。
```powershell
python main.py --listen
```

Windowsファイアウォールのポップアップ画面が出てきたので、アクセスを許可。

## ブラウザでアクセス
`http://IPアドレス:8188/`でアクセス。

# 結果
問題も起こらずあっさり動作! そして速い!
あまりに簡単に動かせたので、思わず記事を書いてしまいました。
オチは、Windowsならもっと簡単に動かせる[環境](https://github.com/comfyanonymous/ComfyUI?tab=readme-ov-file#windows)が用意されていたことに後で気づいたこと!
WindowsのGitBashが遅すぎるので高速化した

## はじめに
所属する企業によってはセキュリティ等の観点によりWSLの使用を禁止されていることもあるみたいです。
私もWSLが禁止されているのですが、そんな環境でもGitBashの使用は許されています。
WSLほどではないもののある程度のコマンドが使用できるのですが、簡単な `cd`コマンドですら20秒ほど待たないと次のコマンドを受け付けない始末。

あまりにもストレスがかかるため、レスポンスを高速化する方法を調べました。

## 内容
対処としては、GitBashのプロンプト表示時に使用される `__git_ps1`が重いため、この関数の呼び出しを無効化することで高速化を行います。
`$GIT_HOME/etc/profile.d/git-prompt.sh`の`PS1`関数を下記のように定義し、重い処理をそもそも呼び出されないようにすることで動作がサクサクになります。
ただし、ブランチ名の補完などいくつかの機能は無効化されるので注意してください。
```shell
PS1='$ '
```

## まとめ
WindowsのGitBashはプロンプト表示やブランチの自動補完機能を実現するために重い処理がいくつか走っています。
これらを無効化することでGitBashのレスポンスが高速化されるようです。
参考にした記事ではすべての機能を無効化するのではなく、プロンプトをカスタマイズすることで機能性と応答性のいいバランスを調べているものもあるため、興味があれば下記の参考サイトを参照ください。

## 参考
- [Git Bash(mintty) is extremely slow on Windows 10 OS](https://stackoverflow.com/questions/42888024/git-bash-mintty-is-extremely-slow-on-windows-10-os#comment72878876_42888024) | Stack Overflow
- [Windows GitBashのプロンプト表示が遅いのをなんとかしたかった](https://neos21.net/blog/2018/12/31-01.html) | Neo's World
VSCode標準機能でMarkdown画像をAssetsフォルダに自動保存！

## VSCode標準機能でMarkdown画像をAssetsフォルダに自動保存！

VSCodeでMarkdownを記述する際、画像を貼り付けると自動で画像ファイルを保存してくれる便利な機能をご存知ですか？

この機能を活用すれば、画像ファイルの管理が楽になり、Markdownの可読性も向上します。

この記事では、VSCodeの標準機能で、Markdownに画像をコピペする際にAssetsフォルダに自動保存する設定方法を解説します。

### 設定方法

1. **VSCodeの設定画面を開く**

   - Windows/Linux: `File` > `Preferences` > `Settings`
   - macOS: `Code` > `Settings` > `Settings`

2. **設定画面から `settings.json` を開く**

   - 設定画面右上の `Open Settings (JSON)` アイコンをクリックします。
   [Image of Open Settings (JSON) icon in VS Code]


3. **`settings.json` を編集**

   - `settings.json` ファイルが開きますので、 `"markdown.copyFiles.destination"` の設定を追加・変更します。
   - 以下の設定を追記してください。

     ```json
     "markdown.copyFiles.destination": {
       "**/*": "${currentFileDir}/Assets/${basename}"
     },
     ```

     - `"**/*"` : すべてのMarkdownファイルに適用することを意味します。
     - `${currentFileDir}` は、現在編集中のMarkdownファイルがあるディレクトリを表します。
     - `/Assets/` は、画像を保存するフォルダ名です。この設定で、Markdownファイルと同じディレクトリに "Assets" フォルダが自動作成されます。
     - `${basename}` は、コピーした画像のファイル名（拡張子を含む）を表します。


4. **設定を保存**

   - `settings.json` ファイルを保存します。


これで、Markdownファイルに画像をコピペすると、自動的に "Assets" フォルダが作成され、その中に画像が保存されるようになります。

### 設定画面を開く他の方法

設定画面を開くには、以下の方法もあります。

* **コマンドパレットから開く**
   - `Ctrl + Shift + P` (Windows/Linux) または `Cmd + Shift + P` (macOS) を押してコマンドパレットを開きます。
   - `Preferences: Open Settings (JSON)` と入力して `Enter` を押します。
* **ショートカットキー**
   - `Ctrl + ,` (Windows/Linux) または `Cmd + ,` (macOS) を押します。


### 補足

- `markdown.copyFiles.destination` には、様々な変数を用いて保存先をカスタマイズできます。
- 上記の設定は、VSCodeのバージョン1.79以降で利用可能です。


**この設定を活用して、Markdownでの画像管理を効率化しましょう！**
GNUビルドシステムの紹介

# GNUとは？
オープンソースに基づいた開発者であれば、GNUに頻繁に出会うでしょう。GNUはオペレーティングシステムで、その名前はハッカーの再帰的なトリック「GNU Is Not Unix（GNUはUnixではない）」に由来します。なぜこのような名前がつけられたのか少し理解しにくいかもしれませんが、過去においてUnixは最も優れたオペレーティングシステムでした。GNUコミュニティは誰もが使える自由なオペレーティングシステムを作ろうとしていましたが、それをUnixとほぼ互換性のある形で実現しようとしました。そのため、世界に違いを伝えるために「GNUはUnixではない」と名付けました。

# なぜGNUは重要なのか？
GNUは柔軟なコンポーネント構造で設計されており、カーネルさえも差し替えることができます。現在、2つのカーネルがあります。それはLinuxとHurdです。そのため、Linuxカーネルを使用したGNUオペレーティングシステムを「GNU/Linux」と呼びます。これが一般的にLinuxオペレーティングシステムを指す場合です。

つまり、Linuxを使用しているとき、実際にはGNUを使用しているのです。Linuxカーネルに触れることはシステムレベルのプログラミングをしていない限りありません。Linuxデスクトップを使ってゲームをしたり、映画を見たり、Web開発をしている場合、実際に使っているのはGNUのアプリケーションやツールであり、Linuxカーネルは日常の作業からは遠い存在です。たとえRedHat、SUSE、UbuntuといったLinuxディストリビューションを使っていると思っていてもです。

# GNUビルドシステムとは？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3973392/99d512cf-27cd-434c-bf48-2a6bb4cdf5ff.png)

最も重要なのは、GNUが業界で唯一成功した製品環境向けのオープンソースオペレーティングシステムであることです。日々の仕事がオープンソースに基づいている場合、GNUビルドシステムについて学ぶ必要があります。たとえWindows/WSLやMacOSを使用していても、多くのWeb開発者向けのパッケージはGNUビルドシステムで構築されており、賢い人々はWindowsやMacOS上にシミュレーション環境を作成して、GNU/Linux環境がなくてもビルドできるようにしています。

GNUビルドシステムは、以下の3つのステップで簡単に理解できます：

configure
make
make install
完了！
# configure
configureは、M4マクロ言語で記述されたconfigure.acスクリプトから生成されます。この言語は少し古いので、真剣に学びたい人は少ないですが、その構文は簡単なので、使い方を簡単に学べます。

多くの人がconfigureファイルを読もうとして困りますが、それはやめましょう。configureはconfigure.acから生成されるので、生成されたスクリプトは人間向けではなく、読めません。

もしconfigure.acを書いたり修正したりした場合は、aclocalコマンドを実行してconfigureを生成できます。

configureは、ビルドしたいプログラムのパラメータ（例：インストール先のパスを指定する--prefix）を設定するために使用されます。

# Makefile
Makefileは、どのオペレーティングシステムでも一連のコマンドを自動的に実行するための最も互換性のある方法です。そのため、プロフェッショナルな開発者にとって学ぶ価値があります。Makefileの最も一般的な用途はソフトウェアのビルドですが、それだけではありません。

Makefileは手動で記述することも、configureから自動生成することもできます。そのため、通常、configureを最初に実行する必要があります。生成されたMakefileも読みづらいですが、GNUビルドシステムではMakefile.inやMakefile.amを確認することができます。これらは包括的なMakefileを生成するためのテンプレートです。

もちろん、自分で簡単なMakefile.inを作成し、configureに異なるケースに合わせたユーザー設定を生成させることもできます。これについてはこの記事では触れません。

# make & make install
makeとmake installの両方は、Makefileによって処理されます。

通常、makeはプログラムをコンパイルし、make installはコンパイルされたファイルをインストールします。

# なぜGNUビルドシステムは依然として有用なのか？
現在、CMakeのような多くのビルドシステムがあります。しかし、GNUビルドシステムは、すべての一般的なケースで最も安定しており互換性があります。特にプログラムを他のプラットフォームに移植したい場合に役立ちます。製品環境では、多年にわたり実証されたソリューションを使用したいと考えられています。そのため、基本的な知識を学ぶ価値があるのです。
AIは仕事力を奪うのか？

はじめに
AIを使いこなしていますか？
ちょっとした質問や欲しいプログラムがある時に、気軽にAIに聞けば、嫌な顔をせずに親切に答えてくれるので便利ですよね。

以前は、忙しそうな先輩に声をかけるタイミングを見計らい、緊張しながら質問して、よく分からないまま引き下がり、再度調べてはまた尋ねていました。

そんな日々には戻りたくない、戻れないと感じる一方で、この便利さの裏に隠れた罠はないかと考えてみたくなります。
雇用機会を探: https://job.skysolution.com/tuyen-dung/

IT業界における「仕事」とは？
IT業界での仕事は、依頼主からの要求に基づいて、期日通りに成果物を納品することです。

その過程には要件定義、外部設計、開発、試験などのステップがあり、担当者は前の工程での成果物をもとに次の成果物を作り上げ、次工程に流していくことが求められます。
アジャイル手法でも、作業の進め方は異なりますが、基本的には依頼を受けてその成果物を回していく作業です。

最終的には、前の工程で作られたものを『思い通り』に作り、期日通りに納品することが仕事の本質と言えるでしょう。

成果物が曖昧な場合
依頼主が「タイヤが2つついた乗り物が欲しい」とだけ記述した要件書を提出してきたとします。

これだけでは、自転車なのかセグウェイなのかも分からず、どんな形状や機能を求めているのかは、依頼主の頭の中にしか答えがない状況です。
もしこの状態で進めてしまうと、後々「やっぱりセグウェイが欲しかった」と大問題になりかねません。

どうやって確認するか？
「要件の確認方法」をネットで調べたり、本を探して読んだりすることで方法は分かるかもしれません。

しかし、この問題は「コミュニケーション」の課題であり、正解は人それぞれです。
学びながらも、実践で経験を積んでいかないと、質疑応答がスムーズにはいかないことを理解する必要があります。

コミュニケーション力の重要性
忙しそうな先輩に質問することで、実は「コミュニケーション力」を育む経験をしているのです。
相手がどんなストレスを感じているのかを想像しながら、うまくやり取りをすることが大切です。

AIがそれを奪っている可能性
AIが質問に答えてくれることで、ストレスのあるやりとりを体験する機会が減少し、貴重なスキルが身につかなくなる恐れがあります。

まとめ
予算や期間が厳しくなっている今、AIと連携しながら効率的に作業を進めることは重要ですが、同時に人間同士のコミュニケーション力がますます大切になると感じます。

未来には、AIが人と人のやり取りをサポートしてくれるかもしれませんが、それでも「モノを作るために必要なコミュニケーション力」は欠かせないスキルであり続けるでしょう。

みんなで力を合わせて、頑張りましょう。
[Microsoft] Entra ID内のユーザーに追加情報を持たせたい

:::note info
この記事は、とりとめのないメモです。
:::

Entrra ID ユーザーとセットで雑多な情報を格納したい

# カスタムセキュリティ属性を使う

https://learn.microsoft.com/en-us/entra/fundamentals/custom-security-attributes-overview

こんなシナリオで使う。

> * Extend user profiles, such as add Hourly Salary to all my employees.
> * Ensure only administrators can see the Hourly Salary attribute in my employees' profiles.
> * Categorize hundreds or thousands of applications to easily create a filterable inventory for auditing.
> * Grant users access to the Azure Storage blobs belonging to a project.

3つのデータ型がある。

* 真偽値
* 32ビット整数
* 文字列

# Graph APIを使用してカスタムデータを格納する

https://learn.microsoft.com/en-us/graph/extensibility-overview

4 つの方法がある。

1. 拡張属性
1. ディレクトリ拡張
1. スキーマ拡張
1. オープン拡張

## 拡張属性へ格納する

`onPremisesExtensionAttributes` というプロパティに、15個の値を格納できる。

データ型は文字列のみ。

Active Directoryと同期している（ハイブリッドジョイン環境）だと使えない。

### 更新 Graph API

```http
PATCH /users/{id | userPrincipalName}
```

`onPremisesExtensionAttributes` に格納する。

https://learn.microsoft.com/en-us/graph/api/user-update?view=graph-rest-1.0&tabs=http

## ディレクトリ拡張を使う

Entra IDに登録したアプリケーションにおいて、`extensionProperty` を定義する。

管理者かユーザーがアプリケーションの使用に同意すると、そのテナントで使用できるようになる。

Entra IDのオブジェクトに対して、extension_*Object ID*_*extensionProperty名* というプロパティをセットできるようになる。


## ディレクトリ拡張を定義する Graph API

```http
POST /applications/{application ObjectId}/extensionProperties
POST /applications(appId='{appId}')/extensionProperties
```

https://learn.microsoft.com/en-us/graph/api/application-post-extensionproperty?view=graph-rest-1.0&tabs=http

# スキーマ拡張を使う

ディレクトリ拡張と似たようなもの。

## ディレクトリ拡張を定義する Graph API

```http
POST /schemaExtensions
```

https://learn.microsoft.com/en-us/graph/api/schemaextension-post-schemaextensions?view=graph-rest-1.0&tabs=http


# オープン拡張を使う

これもまたディレクトリ拡張と似たようなもの。
あらかじめ定義しておかなくてもいい（っぽい）。


## オープン拡張を保存する Graph API

```http
POST /users/{id|userPrincipalName}/extensions
```

リクエストボディ

```json
{
  "extensionName": "string",
  "id": "String (identifier)",
  /* その他任意のプロパティ */
}
```


## オープン拡張を読み込む Graph API

```http
GET /users/{Id|userPrincipalName}/extensions/{extensionId}
```

https://learn.microsoft.com/en-us/graph/api/opentypeextension-get?view=graph-rest-1.0&tabs=http
【まとめ】これ知らないプログラマって損してんなって思う汎用的なツール 100超

これは2012年の投稿です。なぜかはてなブックマークで拡散されていますが、内容は時代にそぐわなくなったものもあるのでご注意ください。

これ知らないプログラマって損してんなって思う汎用的なツールを、コメントで寄せられたツールを分類してみました。解説は、ほぼコメント内容のコピペです。
URLは公式サイト（またはほぼ公式サイト）へのリンクです。類似ページがいくつかある場合は、はてなブックマーク数が多いものを選びました。知らないツールもあるので、分類が適切でない場合もあるかもしれません。その場合、コメントで教えてください。
解説が不十分なツールについても補足（コピペしやすい形式で）をいただけると助かります！

元ネタの投稿は現在進行形なので、随時更新していきます。

エディタ
vim
私はVimmerなので、Vimを推しています。Vimさえあれば大抵のことができます。しかし、習得には時間がかかる点が難点です。

MacVim
Mac環境用のVimを強化したエディタ。MacでVimを使うにはこれが便利です。

Emacs
Emacsは別格。Vimと同様に、非常に強力で拡張性の高いエディタです。

Sublime Text 3
軽量で快適なエディタ。プラグインの豊富さとスピードが特徴です。

CotEditor
無料で超軽量なエディタ。ちょっとした文章修正に便利です。

IDE (統合開発環境)
Xcode
iPhoneアプリ開発のための公式IDE。iPhone開発をしない場合でも、FileMergeやopendiffなど便利なツールが付属しています。

Eclipse
JavaやPHPなどの多くの言語に対応した統合開発環境。カスタマイズが容易で、多機能です。

PhpStorm
PHPやJavaScript向けの非常に強力なIDEです。特にウェブ開発には欠かせないツールです。

Cloud9
ブラウザで使えるIDE。GitHubやBitbucketとの連携が可能です。

WebStorm
JavaScript専用の強力なIDE。リファクタリングが非常に簡単に行えます。

データベース管理
Sequel Pro
MySQLのデータベースクライアント。非常に高機能で、phpMyAdminを不要にします。

Navicat
MySQLのクライアントで、データベース管理に必要な機能がすべて揃っています。

HeidiSQL
Windows用のMySQLクライアント。直感的なUIで、データベースを簡単に管理できます。

JavaScript関連ツール
Node.js
サーバーサイドJavaScriptの環境。高速でリアルタイムのJS実行に便利です。

jsFiddle
ブラウザ内でJavaScript、HTML、CSSを試すことができるツール。

Google Closure Compiler
JavaScriptを圧縮・最適化するためのツール。ミニファイに便利です。

Python関連ツール
pypy
Pythonプログラムが遅い場合に、pypyを使ってパフォーマンスを改善できます。

virtualenv
Pythonの仮想環境を作成するツール。プロジェクトごとに依存関係を管理できます。

PHP関連ツール
MAMP
Mac環境でPHPを開発するためのローカルサーバー環境を提供します。

xdebug
PHPのデバッグツール。コードのステップ実行や変数の確認が簡単に行えます。

その他開発ツール
CodeKit
LESS、Sass、Stylusなどを自動でコンパイルしてくれるツールです。

Pandoc
マークダウンファイルをHTMLやLaTeXなどの形式に変換するツールです。

Integrity
高速リンクチェッカー。ウェブサイトのリンク切れをチェックするために便利です。

これは一部のツールの紹介に過ぎませんが、開発効率を大きく向上させるものばかりです。開発者にとって、これらのツールをうまく活用することで、作業の質やスピードが格段に上がります。
こちらも読んでください: https://cto.skysolution.com/blog/
なんでこんなにもWebフレームワークは目まぐるしく変化しているんだろうか

📣：Web開発のトレンドに適応したい方へ ✍️

はじめに🖐️
この情報をぜひご覧ください。ここでは、JSフレームワークとOSやブラウザの変遷をざっくりと確認できます。

通信技術の進化（3G、4Gなど）がどれほど大きな影響を与えたかがわかり、非常に興味深いです。


Webアプリケーション開発のためのフレームワークは、時代ごとに登場した「解決策」として進化してきました。本記事では、これらの技術が登場した背景を掘り下げ、それらがどのように問題を解決し、現代のフレームワークが持つ思想や特徴を深く理解することを目指します。

免責事項
調査の上で執筆していますが、あくまで私個人の見解です。少し強引な部分があるかもしれません。

目的 🧠
歴史を知ることで、「なぜこの技術はそのような構造を持っているのか」「なぜこの設計思想が重要なのか」といった背景を理解でき、将来的に新たなフレームワークや手法が登場したときにも、基盤となる文脈を把握し、より正確にその技術を吸収できるのではないかと考えています。

フレームワークとは？
フレームワークとは、Webアプリを作る際の雛形を指します。Next.jsやAngular.jsなど、Webアプリ開発には今や欠かせない存在です。

フレームワークとライブラリの違い
フレームワークはアプリ開発の枠組みを提供しますが、ライブラリは一部機能を提供するものです。フレームワークは、アプリケーションの設計や構造を定義し、再利用できる「部品」を提供します。

歴史を振り返りつつ因果関係を見てみましょう🏃‍♂️
ここからは、画像を見ながら進めていきましょう！

静的Webから動的Webへ：CGIの登場（1990年代）🌅
課題
初期のWeb（1990年代初頭）は、サーバーから返される静的なHTMLファイルのみで、動的なコンテンツを生成することができませんでした。これでは、検索機能や掲示板のようなサービスを実現することが困難でした。

解決策
CGI（Common Gateway Interface）は、サーバー側でプログラム（例：Perl）を実行し、動的にHTMLを生成する仕組みを提供。これにより、ユーザー入力に応じた動的コンテンツ生成が可能となり、Webは単なる静的な文書配布から、簡易的なアプリケーション基盤へと進化しました。

大規模開発への対応：JavaサーブレットとJSP（1990年代後半） 📝
課題
CGIは動的なコンテンツ生成には使えましたが、大規模なアプリケーション開発には向きませんでした。HTMLとロジックが混ざり、保守が難しく、コードの複雑さが増していきました。
こちらも読んでください: https://ceo.skysolution.com/blog/

解決策
JavaサーブレットはJavaという静的型付け言語を使い、処理ロジックの分割と整理を進めました。JSP（JavaServer Pages）を使うことで、HTMLとJavaコードを分離し、保守性が大幅に向上しました。

リッチなUIの要求とAjax（2000年代中盤）🎹
課題
ユーザー体験の向上を目指し、ページ全体の再読み込みなしで一部のコンテンツだけを更新するUIが求められるようになりました。しかし従来はページ全体のリロードが必要で、ユーザー体験が煩雑でした。

解決策
Ajax（2005年）は、非同期通信を利用して、サーバーから必要なデータだけを取得し、部分的に画面を更新する仕組みを提供。これにより、スムーズなUIが実現し、Webアプリケーションの進化が加速しました。
【ChatGPT】“必ず上達できる、毎日できるレッスン”を出してくれる？Promptです。


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

　今回は、“必ず上達できる、毎日できるレッスン”を出してくれる？Promptです。？でわかるかと思いますが、たいしたことはありません😅

:::note info
本記事は、ChatGPT（Plus版）
で行なっております。
画像はありません。あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)
***
　SoraのPlus/Teamユーザーへの
　　クリスマスプレゼント🎁は
　　　現在も有効ですよ😸

　どんどん動画生成しましょうね。
***
　さっそく、【本題】です。

　今回は、
　　“必ず上達できる、
　　　毎日できるレッスン”を
　　　　出してくれるPromptです。

　えーと、
　　期待薄です😅

　“ChatGPT”やら
　　“DALL-E3へのPrompt”を
　　　入れてやってみたら
　　　　当たりさわりのない出力に
　　　　　なりました😅

　とりあえず、
　　Promptです。
　　　＊＊＊にレッスンしたい内容を
　　　　入力して、送信してください。

```Text:必ず上達できる、毎日できるレッスンPrompt
必ず上達できる、毎日できる「＊＊＊」のレッスンを考えてください。
各項目は、具体的なリストを出してください。
```

　なんでもそうですが、
　　何かしらを習得したいなら
　　　毎日の反復が正解です。
　　　　それ以外の近道は
　　　　　ないでしょう。

　ダイエットなら
　　有酸素運動で20分以上が目安と
　　　言われています。
　　　　それを毎日続けることも大事。

　ChatGPTの習得も
　　毎日15～30分程度からはじめると、
　　　効果的と言われています。
　　　　（Perplexity調べ）

　　まぁ、先に思い付いたことを
　　　メモしておいて、
　　　　レッスンで使うようにすれば
　　　　　効率的ですね。
　　　　　　入力するの、大変ですから｡

　また、仕事や生活に組み込んで
　　意識的に、毎日使うことで
　　　スキルとして
　　　　身に付いていきます。
　
　そうなると、
　　自然とスキルに関する知識が
　　　自分に引き寄せられたかのように
　　　　近付いてきます。

　　これは
　　　別に不思議なことではありません｡

　　脳自体が、意識を向けた情報が
　　　優先的に認識される仕組みが
　　　　関連しているのだそうです。
　　　　　「**引き寄せの法則**」と
　　　　　　呼ばれているようですね。

　“ローマは一日にして成らず”じゃ😸

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

　今回は、ここまで。
完全ガイドブック：データベース入門

今回はデータベースについて学びます。データベースの種類や歴史に触れ、実際に作成してみることで、理解を深める内容です。

初心者でも「データベースの基礎を理解し、基本的なSQLを使えるようになる！」という成果を目指しますので、最後までお付き合いください。

データベースとは何か？

データベースの定義は、「データの構造化された集合体」です。つまり、特定のルールに従ってデータが保存・取得されるものを指します。データベースには多くの種類があり、それぞれに異なるルールがあります。

データベースの歴史

最初に登場したデータベースは50年以上前にさかのぼります。これらは大きく分けて、ナビゲーショナル、リレーショナル、ポストリレーショナルという3つの時代に分類できます。

ナビゲーショナルデータベース
最初に登場したデータベースは「ナビゲーショナルデータベース」で、データ間をナビゲートしながら検索する方法です。階層型やネットワーク型がこの範疇に入ります。

リレーショナルデータベース
次に登場したのが「リレーショナルデータベース(RDB)」です。データは二次元表形式で格納され、SQLを使って処理を行います。これにより、複数の表を結びつけて効率的にデータを管理できるようになりました。

ポストリレーショナルデータベース
最後に登場したのがNoSQLなどのポストリレーショナルデータベースです。これらは、リレーショナルデータベース以外の方法でデータを管理する方法を提供します。特に、キー・バリュー型やドキュメント指向型のデータベースが代表的です。

SQLとDBの基礎を学ぶ

SQL（Structured Query Language）はデータベース操作のための言語です。以下の例はデータを検索するためのSQL文です。

sql
Sao chép mã
SELECT * FROM stock WHERE price <= 1000;
ここでは、stockというテーブルから、priceが1000以下のレコードを取り出しています。基本的なSQLの文法を理解することで、簡単なデータ操作が可能になります。

リレーショナルデータベースの作成

実際にMySQLなどのDBMS（データベース管理システム）を使って、データベースを作成し、SQL文で操作します。

データベース作成

sql
Sao chép mã
CREATE DATABASE shop;
テーブル作成

sql
Sao chép mã
CREATE TABLE stock (
    id INT AUTO_INCREMENT,
    name TEXT,
    price INT,
    country TEXT,
    PRIMARY KEY (id)
);
データの登録

sql
Sao chép mã
INSERT INTO stock (name, price, country) VALUES ('orange', 100, 'us');
データの検索

sql
Sao chép mã
SELECT * FROM stock WHERE country = 'japan';
データの更新

sql
Sao chép mã
UPDATE stock SET price = 130 WHERE name = 'orange' AND country = 'japan';
これらの基本操作を理解することで、実際にデータベースを扱うことができるようになります。

RDBとNoSQLの比較

RDB（リレーショナルデータベース）とNoSQL（非リレーショナルデータベース）の違いについても触れます。

RDBの特徴

ACID特性（Atomicity, Consistency, Isolation, Durability）を提供し、データの整合性を保ちます。
複雑なクエリが可能ですが、データ量が増えるとパフォーマンスが低下することがあります。
NoSQLの特徴

データの柔軟性が高く、大量のデータを高速に処理するのに適しています。
ACID特性を緩和し、分散システムでの効率化を図ります。
まとめ

この記事では、データベースの基本的な理解と、リレーショナルデータベースを扱うための基本操作（SQLの使い方）を学びました。これを基に、さらに高度なデータベース技術を学んでいくことができるでしょう。
こちらもお読みください: https://news.skysolution.com/category/ecommerce/
Microkinetic modelingのためのソフトウェア

# はじめに
DFT計算やポストプロセスのためのソフトウェアに加えて、ミクロ反応速度論を議論するためのmicrokinetic modelingソフトウェアが数多く公開されています。以下に最近私が見知ったmicrokinetic modeling用ソフトウェアを共有します。

# ソフトウェア

## CatMAP
[GitHub](https://github.com/ajmedford/catmap)
[Documentation](https://catmap.readthedocs.io/en/latest/)

## OpenMKM
[DockerHub](https://hub.docker.com/u/vlachosgroup)
[Documentation](https://vlachosgroup.github.io/openmkm/)

## CATKINAS
[Web page](https://www.catkinas.com/)

## MKMCXX
[Web page](https://www.mkmcxx.nl/)

## Micki
[Web page](https://schmidt.chem.wisc.edu/software/micki/)
[GitHub](https://github.com/jrschmidt2/micki)

## Zacros
[Web page](https://www.zacros.org/)

# おわりに
実際のところ、自分で使うことは無いと思います。私の所属するグループのできる若者達は自分でスクリプトを書く方が良い、とも言っています。いつもスクリプト･プログラムを自分自身で書けるのが良いと思いますが、うまく使い分けることができると良いでしょう。
Go言語(プログラミング)入門メモ②

## 関数
関数とはひとまとまりの処理に名前を付けて、何度も呼び出せるようにしたもの。
func 関数名(){処理の中身}で定義できる。関数を呼び出すときは関数名()で呼び出すことができる。
引数を使用する場合は、関数名のあとの()に引数の名前と引数のデータ型を入れる。
※引数とは、関数を呼び出す際に関数に渡す値のこと。
add関数を定義してみると
~~~
func add(int x, int y){
    fmt.Println(x + y)
}
func main() {
    add(10,20)
}
//x + yの合計が出力されるadd関数を定義し、main関数の中でadd関数を呼び出している。ここでは引数がxは10,yは20なので30が出力される。
~~~
### 返り値を返す関数の定義
返り値とは、関数が返す値のこと。引数の()のあとに返りのデータ型を指定し、returnで値を呼び出し元に返す。

~~~
func add(int x, int y) int {
    return x + y
}
func main () {
    r := add(10,20) //返り値を変数rに代入している
    fmt.Println(r)   
}
//30が出力される
~~~~

返り値に名前を付けたいときは引数の()のあとに(返り値名 返り値のデータ型)という形で定義する。以下は返り値にint型のresultという名前を付けたcul関数
~~~
func cal(price, item int)(result int){
    result = price*item
    return result  //resultを省略することも可能
}
func main () {
    r := cal(100,2)
    fmt.Println(r)
}
//200が出力される
~~~

### 関数リテラル
関数は変数に入れることもできる。以下のコードでは、main関数内で関数を定義して変数fに代入している。変数に代入した関数は変数名()で呼び出すことができる。
~~~
func main () {
    f := func(x int){
        fmt.Println("innner func", x)
    }
    f(1)
}
//inner func 1　と出力される
~~~

funcのあとに関数名を入れるのが一般的だが上記は名前がない。このような関数を関数リテラル、という(ほかの言語ではラムダ式や無名関数という)
また、関数リテラルは変数に代入せずにそのまま実行することもできる。このとき、関数の範囲を表す{}のあとに()を入れて(引数がある場合は引数も入れる)実行させることができる

~~~
func main () {
    func(x int){
        fmt.Println("innner func", x)
    }(1)
}
//inner func 1　と出力される
~~~

### クロージャーについて
関数リテラルは、同じ関数の中で宣言された変数にアクセスすることができる。この仕組みをクロージャーという。
以下のコードは、main関数内で変数xを宣言し、そこにincrementに代入した関数がアクセスしている。
~~~
func main () {
    x := 0
    increment := func () int {
        x++
        return x
    }
    fmt.Println(increment())
    fmt.Println(increment())
    fmt.Println(increment())
}
//
1
2
3
と出力される
~~~

### 関数を返り値にする
返り値で関数を返す関数も定義することができる。returnで関数リテラルを返り値として、呼び出しもとに渡すことができる。以下のコードは、returnの後ろにあるfunc() intを返している。
main関数では、incrementGenerator()を変数counterに代入している。counter()で代入した関数を呼び出している。
~~~
func incrementGenerator() func() int {
    x := 0
    return func() int {
        x++
        return x
    }    
}

func main () {
    counter := incrementGenerator()
    fmt.Println(counter())
    fmt.Println(counter())
    fmt.Println(counter())
}
//
1
2
3
と出力される
~~~

## 学習に使用した教材
・『入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)』M.A EduTech
https://www.udemy.com/course/golang-webgosql/?utm_medium=udemyads&utm_source=bene-msa&utm_campaign=responsive&utm_content=top-1&utm_term=general&msclkid=81e2f24a32cc185d275d953d60760226&couponCode=NEWYEARCAREERJP

・『シリコンバレー一流プログラマーが教える Goプロフェッショナル大全』酒井 潤 (著)
https://www.amazon.co.jp/%E3%82%B7%E3%83%AA%E3%82%B3%E3%83%B3%E3%83%90%E3%83%AC%E3%83%BC%E4%B8%80%E6%B5%81%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%8C%E6%95%99%E3%81%88%E3%82%8B-Go%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E5%A4%A7%E5%85%A8-%E9%85%92%E4%BA%95-%E6%BD%A4/dp/4046070897
仮想COMポートからBLE(Bluetooth Low Energy)デバイスとシリアル通信する

# はじめに

BluetoothにはClassicとBLE(Bluetooth Low Energy)の2種類あります。Bluetooth通信ができるマイコンは後者のBLEを用いている場合が多いと思います(ESP32はどちらも使用可能)。
C#を用いてBLE通信を行う記事は存在するものの、Bluetooth Classicや有線と同様にCOMポートからシリアル通信を行う記事をあまり見つけられなかったので、備忘録として載せておきます。

# 仮想COMポートの作成 (Windowsの場合)

仮想シリアル(COM) ポートドライバであるcom0comをインストールします。[こちら](https://sourceforge.net/projects/signed-drivers/files/com0com/v3.0/)からexeファイルをダウンロードします。
Windows10+の場合はセキュアブートをオフにする必要があるかもしれません。

# ble-serialのインストール
[こちら](https://github.com/Jakeler/ble-serial)のble-serialを使用します。
基本的にはREADMEに従ってインストールを行えばOKです。

#### ble-serialのインストール
```
$ pip install ble-serial
```

#### COMポートの割り当て
```
$ ble-com-setup.exe
```
デフォルトではCOM9に割り当てられます。

# 接続

#### BLEデバイスのスキャン
```
$ ble-scan

20:91:48:4C:4C:54 (RSSI=-56): (デバイスの名前)
...
```
得られた出力からMACアドレスを確認

#### デバイスに接続
```
$ ble-serial -d 20:91:48:4c:4c:54
```
Running main loop!と表示されればOKです。

ここで、ble-scanに表示されるにもかかわらず "Bluetooth connection failed. Device not found"と出る場合は` --address-type random`とオプションをつけると接続できる場合があります。

# テスト
#### マイコン
[Adafruit Feather nRF52840 Sense](https://www.adafruit.com/product/4516)でテストを行いました。

* Arduino IDEの設定
https://learn.adafruit.com/adafruit-feather-sense/arduino-support-setup

* マイコン側のプログラム
サンプルプログラムを用いる(Examples->nRF52840->Peripheral->bleuart)
https://learn.adafruit.com/adafruit-feather-sense/arduino-ble-examples

#### PC側のプログラム

TeraTermなどではCOMポートを認識しないので、Pythonを使う
```python:serial_test.py
import serial

ser = serial.Serial('COM9') 
ser.write(b'hello')
ser.close()
```

# 参考文献

https://qiita.com/get_itchy_feet/items/a61c49fed9c9fe46b5f0

https://qiita.com/gpsnmeajp/items/481fd731851e0e538263

https://qiita.com/yaju/items/e5818c99857883a59033
SQL Chart メモ

エンジニアが知っておくべきSQLのDML、DDL、DQL、DCL、TCLの基本

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155256/b033968c-4e0f-0b31-2b97-ee04c2d9a170.png)


参考文献

https://www.amazon.co.jp/gp/aw/d/1492057614?&linkCode=sl1&tag=12308d41-20&linkId=dcd1fa3e21c42165c8a1c69125af5506&language=en_US&ref_=totoyou
(DAY10) 俺と学ぶRust言語~所有権~

# 今日の内容
- 所有権ってなんぞや

# はじめに
「所有権システム」という言葉に聞き覚えがない方もいるかもしれません。というのも、「所有権システム」は、Rust特有の機能だからです。この「所有権システム」は、もはや、**「Rustにおける最大の特徴の一つ」** と言っても過言ではありません。

# 所有権システムとは？
「所有権システム」とは一体なんでしょうか。
それは、Rustでの「メモリ管理機構」のことです。
メモリには容量の上限があります。効率よく使用するために、必要なメモリ領域を割り当てたり、不要になったメモリ領域を解放したりして、メモリを管理する機能です。

### 1. 所有権システムの基本概念

Rustでは、すべての値に「所有者」が存在します。所有権システムは、次の三つのルールで構成されます。
1. 各値は所有者と呼ばれる変数に所有される
1. ある値の所有者は同時に一つしか存在しない
1. 所有者がスコープから外れると、値は自動的に解放される

### 2. C言語との対比
[メモリ管理の方法]
C: メモリ管理は手動。mallocやcallocを使ってメモリを確保し、freeを使ってメモリを解放する。不適切な管理をすると以下の問題が発生する。
- メモリリーク: メモリの解放を忘れて、使われないメモリが溜まり続ける
- ダングリングポインタ: 解放済みのメモリを参照しようとして、未定義動作が発生する
- 二重解放: 同じメモリを２回解放し、メモリ内のデータが消えて予期せぬことやエラーが発生する

Rust: 所有権システムがこれらの問題をコンパイル時に防止する。Rustでは明示的なメモリ管理は不要で、所有者がスコープを抜けた時点でメモリは自動解放される。

[並行性]
C: マルチスレッド環境でメモリを共有すると、**データ競合** が発生する可能性がある。手動でロックや同期を行う必要があるが、管理が複雑で大変。バグが発生しやすい。

Rust: 所有権システムに加え、**借用** と参照の仕組みでコンパイル時にデータ競合を防ぐ。
- 不変の借用: 同時に複数のスレッドで参照可能
- 可変の借用: 一つのスレッドでしか変更できない

### GC（ガーベージコレクション）との違い
GCとは、「ガーベージコレクション」のことで、自動的にメモリ領域を解放する機能です。JavaやPHPなどのさまざまな言語に備わっています。一見、所有権システムに似ていますが、結構異なります。
まず、所有権システムはコンパイル時にメモリを確保します。所有権がどこにあるかを考えることで、どこでメモリが確保され、どこでメモリが解放されるかが明確になります。
一方、GCは自動的にメモリ管理をしてくれますが、どこでメモリを解放するのか明確ではありません。また、動的な処理によりパフォーマンス低下の恐れがあります。

最初はこの仕組みが堅苦しく、難しいものに感じるかもしれません。Rustはエラーを吐き出して、嫌になるかもしれません。しかし、これを理解したときにはきっとRustの素晴らしさを感じているでしょう。

# おわりに
今日はプログラミングしていませんが、それに相当するほどの学習をしました。Rustは所有権システム様によって、安全性と効率性を維持できるのですね。次回はクレートについて学び、いくつかの外部クレートを使って、ゲームでも作ってみようかと思います。
ご精読ありがとうございました、
iPhoneで<details>のデフォルトアイコンが表示される問題を解決する方法

# 問題の内容
`details`タグを使って折りたたみエリアを作成した際に、スマホ画面上で以下の問題が発生しました。

・`summary`要素の前に「右向きの三角アイコン」が表示される
・PCでスマートフォンサイズで表示した場合は問題なく表示される

これはSafariやiOSのブラウザが`details`タグにデフォルトスタイルを適用しているために起こっている問題だったので、今回はその解決策を紹介します。

# 解決方法
SafariやiOSでは、`details`や`summary`にデフォルトのアイコンが適用されます。これを無効化します。
```CSS:CSS
/* iOSでのデフォルトアイコンを非表示にする */
details summary {
  list-style: none; /* リストスタイルの削除 */
}

/* Safari特有のデフォルトマーカーを非表示にする */
summary::-webkit-details-marker {
  display: none;
}
```

HTMLのサンプルコードは以下です。
```HTML:HTML
<details>
    <summary id="question1">質問</summary>
        <div class="answer">
            <p>回答</p>
         </div>
</details>
```

以上、参考になれば嬉しいです。
EC2をSessionManagerで接続してみた

## はじめに
こんにちは、小林です。
今回はEC2を構築し、マネージドインスタンス設定をしましたので記事としてまとめます。

Cloudformaitonを使っての構築方法をまとめたので、参考にする際には下記のYamlテンプレートを使ってみてください。

## 前提条件
EC2でSessionManagerを使用して接続する際に必要な条件を下記に記します。

・EC2インスタンスプロファイルにSystemsManagerへ接続するための権限があること。
・インスタンスにssm-agentがインストールされていて起動していること。
・OSがLinux、Windows、macのいずれかであること。
・EC2からSystemsManagerへの通信経路が確立されていること（ルートテーブル、インターネットゲートウェイ、エンドポイントなど）

## SessionManagerの構成
![ssmAgent.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722085/fba7b3d6-a5b2-ac88-3c9b-6faff61cd5de.png)
上図が今回構築するシステムの構成になります。
前提としてVPC、サブネット、セキュリティグループ、ルートテーブルは構築済みとします。

## Yamlテンプレート
下記が今回構築に使用したYamlテンプレートになります。
必要に応じて設定値を書き換えれば使いまわせます。
注意：記載のない設定項目はすべてデフォルト値になります。
```ruby:qiita.rb
AWSTemplateFormatVersion: '2010-09-09'
Resources:
  MyEC2Instance:
    Type: 'AWS::EC2::Instance'
    Properties:
      InstanceType: '｛対象のインスタンスタイプ｝'
      ImageId: '｛対象のImageid｝' 
      KeyName: '｛keypair名｝' 
      IamInstanceProfile: !Ref InstanceProfile
      SubnetId: ｛サブネットID｝
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash
          yum update -y
          yum install -y amazon-ssm-agent　　#ssm-agentをインストール
          systemctl enable amazon-ssm-agent　#ssm-agent有効か
          systemctl start amazon-ssm-agent　#ssm-agent起動


#下記はEC2にアタッチするIAMロールの設定
  InstanceProfile:
    Type: 'AWS::IAM::InstanceProfile'
    Properties:
      Roles:
        - !Ref SSMRole

  SSMRole:
    Type: 'AWS::IAM::Role'
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: 'Allow'
            Principal:
              Service: 'ec2.amazonaws.com'
            Action: 'sts:AssumeRole'
      Path: '/'
      Policies:
        - PolicyName: 'SSMPolicy'
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: 'Allow'
                Action:
                  - 'ssm:*'
                  - 'ec2messages:*'
                  - 'cloudwatch:*'
                Resource: '*'

  SSMInstanceProfile:
   Type: 'AWS::IAM::InstanceProfile'
   Properties:
     Path: '/'
     Roles: 
       - !Ref 'SSMRole'

#下記がキーペアの記載
  EC2KeyPair:
   Type: AWS::EC2::KeyPair 
   Properties:
    KeyName: '｛KeyPai名｝'
```
## 確認
![Cloudformation_02.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722085/e8cadb17-0e1d-4b0e-53a5-3ea402bf8395.jpeg)
対象のインスタンスから、セッションマネージャーで接続出来たら設定完了になります。
以上の設定でSystemsManagerの機能を使用してEC2のノード管理が可能になります。SystemsManagerには多様な機能があるため、いろいろ試してみて理解を深めようと思います。

## おわりに
以上がEC2でSessionManager接続するために必要な設定になります。
今回は使用しませんでしたが、YamlテンプレートのOutputセクションを記載すると、他のテンプレートから設定値を参照できるようになるので次回から活用していきたいです。
【React】テスト実行時に「Warning: An update to Counter inside a test was not wrapped in act(...)」のワーニングが発生

Reactアプリに対してTesting Libraryを使用してテストを行っていた際に以下のようなワーニングが発生しました。

```
Warning: An update to Counter inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
    /* fire events that update state */
});
/* assert on the output */
```

今回はこのワーニングが表示されたときの対処法を簡単にまとめていこうと思います。

:::note info
すでに先人の方々が多くの記事でまとめられている内容になりますが、自分自身の頭を整理するために記事にしました。最後までお付き合いいただけますと幸いです。
:::

## 環境

- Windows11
- Vite
- Node.js : ver.20
- React18

## 結論

ステート変更後の検証処理を`await waitFor()`で囲む

```diff_tsx
it('should render "Add Modal"', async () => {
  render(
    <ChakraProvider value={defaultSystem}>
      <App />
    </ChakraProvider>
  );

  // モーダルが非表示であるか確認
  expect(screen.queryByText('Cancel')).toBeNull();

  // ボタンの取得
  const button = screen.getByText('新規登録');

  // ボタンクリック
  fireEvent.click(button);

  // モーダルが表示されているか確認
-  expect(screen.getByText('Cancel')).toBeInTheDocument()
+  await waitFor(() => {
+    expect(screen.getByText('Cancel')).toBeInTheDocument()
+  });
});
```

## 説明

簡単に３行でまとめると下記のようになります。

- フックを使用した処理はReactではいい感じに非同期に実行される
- テスト側はそんなことを気にせずレンダー後に値チェックを実行する
- Warning「もしかしたら値が更新されてないかもしれないよ！！！」

そのため値チェック時に実行を待機することでWarningが消えたようです。

:::note warn
まだまだ学習中のため認識に誤りがありましたらご指摘いただけると幸いです。
:::

## おわりに

なんとなくコピペで解決していたため、記事にしてより理解が深まりました。
こういった記事をこれからも書いていきたいです。

## 参考


https://bufferings.hatenablog.com/entry/2021/11/18/015809

https://qiita.com/Bucchi7/items/60f9433c9c1cdcb4c040

※↓試していないがこのような方法もあるらしい

https://qiita.com/yumeoi_bit/items/a268524d46c959844f5e
インターフェースについてのイメージを掴む

# この記事達成したいゴール
- 「インターフェースってなんですか？」と質問された時に自分なりの例え話が作れること

## ※ インターフェースってなんですか？から始める理由

社会人やネットの記事で「ユーザーインターフェース」「オーディオインターフェース」などの「インターフェース」という言葉が多く出てくるようになりましたが、「インターフェースってなんですか？」と言われるとしっかりと説明ができない状態😢。なので、まずはここから始めたいと思います。


## インターフェースとは
個人的には、「利用者」と「提供者」をつなぐ **ハブ** のような存在だと思っています。具体例で説明してみます。

### 翻訳機(具体例1)
翻訳機は言語を変換してやり取りを可能にするツールとなります。この場合、下記のような形になります。

**利用者**： 自分の知らない言語をテキスト入力する・自分が知っている言語に翻訳してほしい
**提供者**： 様々な言語の翻訳エンジン（Google翻訳・DeepL etc...）
**インターフェース**：利用者と提供者の間で「言語変換するために必要な共通の仕組み」を提供する（翻訳機）

**翻訳機**というインターフェースを置くことで、下記のようなになる
- 利用者からしてみれば翻訳機を使って、自分が知っている言語で確認できれば良いため、翻訳機の裏でどうやって翻訳しているのかを把握する必要がない
- 提供者も入力された言語を翻訳エンジンを通してインターフェースから指定された形で返却すれば良いので、利用者がどのように利用するのかを把握する必要はない

![スクリーンショット 2024-12-23 10.12.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270887/9eddb642-491b-dc9d-d193-f3df70870dd7.png)

また、この仕組みのおかげで、例えばGoogle翻訳からDeepLに翻訳エンジンを切り替えたとしても、利用者は何も気にする必要がなくなります。

### コンセント（具体例2）
コンセントは電化製品と電力供給システム（配線や発電所）をつなぐ役割を持ったツールになります

**利用者**： 電化製品（家電）
**提供者**： 電力を供給するシステム（発電所・電力会社）
**インターフェース**：コンセント（利用者が電力を簡単かつ安全に利用できるよう、統一された形状と仕組みを提供）

**コンセント**というインターフェースを置くことで、下記のようになる
- 利用者からしてみればコンセントを使って、電力を使えれば良い、コンセントの裏でどうやって電気が来ているのかを把握する必要がない
- 提供者も最終的にコンセントへ電力を供給するが、利用者と直接やり取りする必要がない

![スクリーンショット 2024-12-26 0.05.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270887/d90b6c24-11d9-d8b4-8b81-60f432a5fecd.png)

さらに、コンセントが「統一された形状」を持つため、異なる家電メーカーの製品でも同じコンセントを使えるようになります。

 ## まとめ

このようにインターフェースは、「利用者・提供者の間に関する入出力を統一（標準化）する」という役割を担います。標準化された仕組みを提供することで、利用者と提供者が互いの詳細を知らなくても、やり取りできるという利点があります。
Kotlin Koans やってみた 2

# Introduction
## Default arguments
### 問題
Javaでfoo()のオーバーロードがいくつかあると仮定します：
```kotlin
public String foo(String name, int number, boolean toUpperCase) {
    return (toUpperCase ? name.toUpperCase() : name) + number;
}
public String foo(String name, int number) {
    return foo(name, number, false);
}
public String foo(String name, boolean toUpperCase) {
    return foo(name, 42, toUpperCase);
}
public String foo(String name) {
    return foo(name, 42);
}
```
これらのすべてのJavaのオーバーロードをKotlinの1つの関数に置き換えることができます。
foo関数の宣言を変更し、fooを使用するコードがコンパイルされるようにしてください。
デフォルト引数と名前付き引数を使用します。

```kotlin
fun foo(name: String, number: Int, toUpperCase: Boolean) =
        (if (toUpperCase) name.uppercase() else name) + number

fun useFoo() = listOf(
        foo("a"),
        foo("b", number = 1),
        foo("c", toUpperCase = true),
        foo(name = "d", number = 2, toUpperCase = true)
)
```

### 解答
```kotlin
fun foo(name: String = "", number: Int = 42, toUpperCase: Boolean = false) =
        (if (toUpperCase) name.uppercase() else name) + number

fun useFoo() = listOf(
        foo("a"),
        foo("b", number = 1),
        foo("c", toUpperCase = true),
        foo(name = "d", number = 2, toUpperCase = true)
)
```

# おわりに
問題の意図を汲み取るのが苦手です・・・。
テストコードが見れたらいいんだけど、なぜか見れないのでとりあえず pass するか動かしてみて、差分を調整してみる感じになってる。
Int = 42 の 42 はどこから来たんだろう？？とか考えちゃったけど、仮定の部分に書いてあって、問題文にあるものからテストケースを作っていると推察。
私の思考回路はどこかで競プロみたいなイメージがあって、複数のテストケースがあるかも？と思ってしまった。だけど問題文にはそこまで書かれてないし、素直に受け取ってよかったみたい。メンタルモデルってときに邪魔するんだよな・・・。

---

[← 前回の記事](https://qiita.com/b-yuko/items/63dc3de54c752245bf48)　|　[次回の記事 →](https://qiita.com/b-yuko/items/306f9352b37eef218808)
画像系Kaggleコンペで成功するための基礎知識

Kaggleはデータサイエンスや機械学習を学び、実践するための最高のプラットフォームです。その中でも画像系のコンペティションは特に人気があります。この記事では、初めて画像系のKaggleコンペに挑戦する方が押さえておくべき基礎知識を、中学生でもわかるように簡単に解説します！
※この記事は、ChatGPTの出力を基に作成しています。

---

#### 1. **データセットの理解**
コンペティションのスタートはデータを理解することから始まります。

- **データセット**: 多くの画像が集められたファイルのことです。例えば、猫と犬の画像が1000枚ずつあるデータを使って、それぞれを区別するモデルを作ることが多いです。
- **ラベル**: 画像が何を示しているかの答えです。たとえば、猫の画像なら「猫」、犬なら「犬」といった具合です。

---

#### 2. **バッチサイズ (Batch Size)**
画像データを学習させる際に、一度に渡すデータの塊のサイズを**バッチサイズ**といいます。

- **例え**: 単語帳で単語を覚えるときに、100個を一度にやると疲れるので、10個ずつ分けて覚える。それがバッチサイズです。
- **一般的な値**: 16, 32, 64などがよく使われます。

---

#### 3. **エポック数 (Epoch)**
モデルがデータ全体を何回学習するかを表します。

- **例え**: 学校の宿題で漢字を書き取りする場合、ノート1冊を全部終えるのが1エポック。それを繰り返して学習します。
- **注意点**: エポック数が多すぎると、モデルが過剰に覚えすぎてしまう（過学習）ことがあるので、適切な値を選びましょう。

---

#### 4. **学習率 (Learning Rate)**
モデルがどのくらい「慎重に」学ぶかを決める数値です。

- **例え**: 自転車の練習で、速すぎると転ぶし、遅すぎると進まない。それと同じです。
- **一般的な値**: 0.001や0.0001など。適切な値を探すのがポイントです。

---

#### 5. **データの前処理 (Preprocessing)**
画像データを使いやすくするための準備が必要です。

- **リサイズ (Resize)**: 画像のサイズを統一する（例: 128x128ピクセルに揃える）。
- **正規化 (Normalization)**: 画像のピクセル値を0～1の範囲に調整します。

---

#### 6. **過学習 (Overfitting) とその対策**
モデルが訓練データに特化しすぎると、新しいデータに対応できなくなります。

- **過学習**: テストの答えを丸暗記するような状態です。
- **対策**:
  - **データ拡張**: 画像を回転させたり色を変えたりしてデータを増やす。
  - **ドロップアウト (Dropout)**: 一部の情報をわざと無視して学習させる。

---

#### 7. **評価指標 (Metrics)**
モデルの出来を測る基準です。

- **正確度 (Accuracy)**: 全体の中で正解した割合。
- **F1スコア**: データが偏っているときでも公平に評価できる指標。

---

#### 8. **実験と調整**
初めてで完璧なモデルを作るのは難しいです。何度も試行錯誤しましょう。

- **パラメータ調整**: バッチサイズ、エポック数、学習率を少しずつ変えてみる。
- **モデル選択**: ResNetやEfficientNetなどの既存モデルを試してみましょう。

---

### 最後に
画像系のKaggleコンペに挑戦する際には、基本を押さえつつ、楽しみながら学ぶことが大切です。最初は戸惑うかもしれませんが、少しずつ経験を積むことで、確実にスキルが向上します。KaggleのディスカッションやNotebookも参考にしながら、ぜひコンペを楽しんでください！ 🚀
【入門】Stable Diffusion WebUI (AUTOMATIC1111) のインストールと基本操作

## はじめに

いまさらながら、stable-diffusion-webui(AUTOMATIC1111)をインストールして、少し触ってみようと思います。
本記事では、環境準備から動作確認までの基本的な手順を解説します。

## 環境準備

### python のインストール

まず、**Python 3.10.x** をインストールします。公式サイトからダウンロードしてください。  
[Python ダウンロードページ](https://www.python.org/downloads/)

:::note warn
Python 3.11 や 3.12 などをインストールすると、次に行う PyTorch のインストールでエラーが発生する可能性があります。PyTorch が対応していないバージョンでは動作しないので、**必ず 3.10.x を使用してください**。
:::

インストール手順などは丁寧に書かれている記事が多々ありますので、割愛いたします。

### Git のインストール

次に、Git をインストールします。公式サイトからダウンロードしてください。  
[Git ダウンロードページ](https://git-scm.com/downloads)

Git のインストール手順に関しては、詳細な記事が多々あるため、ここでは割愛します。

### AUTOMATIC1111のインストール


1. コマンドラインで以下を実行し、リポジトリをクローンします

   ```bash
   git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui
   ```

2. クローン後、`stable-diffusion-webui` フォルダ内に移動し、以下のファイルが存在することを確認します

   ![フォルダ構成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245422/d1373792-8655-c0cd-1c76-7cfb4cc30eaa.png)

3. フォルダ内にある `webui-user.bat` をダブルクリックしてインストールを開始します

   インストールが完了すると、ターミナルに以下のようなメッセージが表示されます。

   ```
   Running on local URL: http://127.0.0.1:7860
   ```

   自動でブラウザが起動するのを待つ or この URL をブラウザで開くことで、Stable Diffusion WebUI が起動します。

## 動作確認

1. 初期状態では、`Stable Diffusion checkpoint` に `v1-5-pruned-emaonly.safetensors` が設定されています。このままでも動作確認が可能です。

2. 以下の手順で画像生成を行います。

   - `prompt` に生成したい内容を英単語で入力
   - `negative prompt` に除外したい内容を英単語で入力
   - `Generate` ボタンをクリック

   ![UI例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245422/30ae1b7a-4581-8d7d-eb74-6c492f3e39a4.png)

3. 生成された画像はデフォルトで以下のディレクトリに保存されます。

   ```
   \stable-diffusion-webui\outputs\txt2img-images\YYYY-MM-DD
   ```

4. また、WebUI 上の生成画像表示エリア下部にあるアイコンからも画像を確認できます。

### アプリケーションの終了と再起動

- アプリケーションを終了するには、`webui-user.bat` 実行時のコマンドウィンドウで `Ctrl + C` を押します。
- 再起動する場合は、再度 `webui-user.bat` をダブルクリックしてください。

   ![終了時のコマンドウィンドウ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245422/ed8e9760-52bf-de3c-d86e-935a8279afe8.png)



## 最後に

今回は、Stable Diffusion WebUI (AUTOMATIC1111) のインストールから動作確認までを実施しました。

今後は、以下の項目についても触れていきたいと思います。

- モデル（checkpoint）の切り替え
- 追加学習モデル（LoRA）の設定
- VAE の導入
- 拡張機能の活用

アニメのような画像や写真風の画像を生成するなど、さまざまな試行錯誤を記事にしていきます。
AWS PrivateLinkでResouce Gatewayを使用する時は/26以上のサブネットが必要

# 内容

下記の様に右側のEC2から左側のEC2に接続するためのPrivateLinkを構成します。Resouce Gateway、Resource configurationsといったコンポーネントを使用することによってNLBを使用せずにPrivateLinkを構成出来ます。

![pvlink.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/bc4acbfb-b561-0183-8cd3-c3296a6ef09c.png)

手順としては下記の流れになりますが上記の通り「３．VPCエンドポイントを作成する。」で失敗となりました。
* １．Resouce Gatewayを作成する。
* ２．Resource configurationsを作成する。
* ３．VPCエンドポイントを作成する。

CloudTrailのログを確認すると下記のエラーが記録されていました。
```
    "userAgent": "vpc-lattice.amazonaws.com",
    "errorCode": "Client.InvalidParameterValue",
    "errorMessage": "There aren't sufficient free Ipv4 addresses or prefixes",
```

また、Resouce Gateway作成時のヘルプに下記の記述があります。

![pvlink2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/d49313e5-1ae7-2473-a76a-82a2319f8d20.png)

Resource Gateway（のENI）作成時/28のアドレスブロックを委任するようです。/27のサブネットを新規に作成して検証を行いましたが、VPCエンドポイント作成時に必要なCIDRを確保出来ずに失敗になったようです。新規に/26のサブネットを作成して試したところ、今度は正常にVPCエンドポイントを作成することが出来ました。