OmniAICreator/Qiita-1.07M huggingface dataset:
【コマンドプロンプト】複数フォルダを一気に作成する

# コマンドプロンプトを使用してフォルダを一気にたくさん作る方法

一気に10個以上のフォルダを作成する必要があるとき、一つずつ新規作成してリネームしていると時間がかかるので、名前の違うフォルダを一括で複数作成する方法をまとめました。
ウィンドウズのパソコンに標準装備されているコマンドプロンプトを使用します。


## 1. Excelを開いて以下の通り作成
まずはExcelを使ってコマンドプロンプトに入力するコマンドを作成します。

A列：`mkdir `と入力
B列：作りたいフォルダ名を入れる
C列：`=A1&B1`と入力

:::note warn
注意
・A列の「mkdir」の後には必ず半角スペースを入れる
・フォルダ名にスペースを入れない（入っているとエラーになって作成されない）
:::
![画像7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939758/e3dcf50e-400c-6d56-a4ae-194208a543cd.png)


## 2. コマンドプロンプトを起動
フォルダを作成したい場所を開いて、赤枠部分に「cmd」と入力し、コマンドプロンプトを起動する
![画像8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939758/4b027708-856f-1f8e-71e0-be1c1df77cd2.png)

コマンドプロンプトの画面
![画像27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939758/104b0e1c-bac2-7000-ac4b-97a1be244115.png)


## 3. C列をコピーして、コマンドプロンプトの画面に貼り付け

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939758/e845ea12-007c-6049-3990-8d6c268a23dc.png">


一気にファイルを作成することができました！
![画像26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939758/f7f7f71b-f8bd-bc7c-c8bc-64b3c423326f.png)
【Salesforce】メールアラートでCCを設定する方法

メールアラートのCCに関する仕様について発見があったのでシェアします。

「メール受信者」に何かしらの項目などが設定されている場合、
「追加のメール」に設定したアドレスには、CC扱いで送信されるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336848/a399cb2d-bfa1-30dc-7aae-8a299206a7e3.png)


一方で「メール受信者」をブランクにして、「追加のメール」のみ設定している場合は、
To扱いで送信される仕様のようです。


Winter'25で CC, BCCが設定できるようになるらしいので、そちらもチェックしてみてください。
[Winter'25　フローの「メールを送信」アクションでCC、BCCが可能＆受信者上限が150に](https://sf.forum.circlace.com/articles/1046220346388180992)
【18日目】フロントエンドエンジニアが社内ISUCON入門編でprivate-isuに初挑戦してみた件

この記事は[株式会社カオナビ Advent Calendar 2024](https://qiita.com/advent-calendar/2024/kaonavi)の18日目の記事です。

## はじめに

こんにちは。
カオナビでフロントエンドエンジニアをしている、まえださんです。
普段はReactを使用しています。

もう年末ですね。（はやい）
アドベントカレンダーということで、今年体験したことのなかで特に印象深かった社内ISUCONでのことを話したいと思います。

:::note info
下記はISUCONって何？って人向けです。ご存知の方は読み飛ばしてください。

※公式ISUCONは、基本的にチーム戦です。
※社内で行われたISUCON入門編は、個人戦でDockerコンテナによるベンチマーク結果をSlackで集計する形式です。
:::

#### ISUCONについて

ISUCONは「いい感じに スピードアップ コンテスト」の略で、LINEヤフー株式会社が運営窓口となって開催している、お題となるWebサービスを決められたレギュレーションの中で限界まで高速化を図るチューニングバトルです。（引用元: [ISUCON公式Blog](https://isucon.net/)）

#### private-isu とは

[こちらのリポジトリ](https://github.com/catatsuy/private-isu)にあります。
お手元のローカル環境でISUCONを体験できます。（dockerが必要です）

### 社内勉強会について

カオナビでは、エンジニアの成長を支援するために、様々な社内勉強会を活発に開催しています。
新人からベテランまで、全ての社員が学び合える環境を整えています。

本記事で紹介した社内ISUCON入門編は第2回あたります。
2024年入社の新卒エンジニアも参加しています。

また、新卒研修の一環として社内ISUCON第4回を実施し、その事前勉強会として社内ISUCON3.5も行われました。

## 挑戦してみて気づいたこと

### 色々と忘れていた知識

PHPとMySQLについてすっかり忘れていました:cry:
WordpressやEC-CUBEの経験はあったのですが、あまり役に立たなかったです。

また、学生時代に研究室のサーバを立てたりしていたのですが、OSそのものの知識も不足を痛感しました。

### 初めて使ったツールと概念

- topコマンド
    - CPUやメモリの利用状況をリアルタイムで表示してくれるコマンドです
    - そもそも使ったことがなかったです。まじか！超便利！（小並感）という感じ
    - htopをインストールするところから始めました
- 各種パッケージマネージャ
    - Linuxは yum くらいしか知識がなく、apt は初めて使いました
    - MySQLサーバで利用した microdnf も初見でした
- データベースのインデックスについて
    - 一度勉強したはずなのにすっかり忘れていました
        - インデックスをはるとは、特定のカラムに対して検索を高速化する仕組みを作ることです
        - インデックスをつけると、データの検索が効率的になり、クエリが早くなります
- スロークエリ
    - そもそもどうやって表示するかが分からない
        - MySQLの設定ファイル my.cnf の存在を知りました
        - 設定ファイルでスロークエリログを有効にする方法を学びました
    - 時間がかかるものと回数が多いもの
        - 時間がかかっているものはデータベース側にインデックスをはることで改善する可能性があります
        - 回数が多いものはN+1問題に引っかかっている可能性があります
    - N+1問題について
        - クエリがループの中で呼ばれている可能性があるので、アプリケーション側のコードを見直す必要があります

### 環境に関する戸惑い

- アプリケーションファイルの場所が分からない
- コンフィグファイルの場所と名前が分からない
- パフォーマンス可視化ツールのインストール方法
    - pt-query-digest：MySQLのスロークエリログを解析するツール
    - alp：Webサーバのアクセスログを解析するツール
- OPcacheの有効化はPHPerのお作法らしい
    - OPcacheはPHPのパフォーマンスを向上させるためのキャッシュ機構です

## フロントエンドエンジニアとしての気づき

### バックエンド知識の重要性

フロントエンドでも求められるパフォーマンスはlighthouseなどのツールの普及によって一般のユーザーの方からも多くの指摘を受けるようになりました。
その中でも

- First Contentful Paint（FCP）：最初のコンテンツ表示にかかるまでの時間
- First Input Delay （FID）：Webページの応答性

を考える際に、フロントエンドとバックエンドの責務を切り分けて考えられると自分のコードの改修に自信を持つことができます。

### パフォーマンスチューニングの面白さ

パフォーマンスチューニングやデバッグの際には「ボトルネックを探す」ということが初手でできるか否かはとても重要です。

１つボトルネックを解消すると次のボトルネックが分かり、次へ次へとベンチマークの数値が上がっていくのはとても楽しい体験です。

ボトルネックを探すために、まずなにをするか、という思考はソフトウェア開発に限らず、多くのビジネスシーンで共通のスキルとして役に立つと思います。


## まとめ

private-isuに挑戦してみて、フロントエンドエンジニアの私にとって有用な気づきがたくさんありました。PHPやMySQLの知識が不足していることに気づいたり、topコマンドやパッケージマネージャーなど、普段使わないツールに触れたりしました。

最初は戸惑うことばかりでしたが、この経験を通じてISUCONそのものにも興味が湧きました。
ボトルネックを見つけて解消していく過程はパズルを解くような楽しさがあります。

この「ボトルネックを探す」という考え方は、フロントエンド開発はもちろん、他のビジネスシーンでも活かせると思います。

ISUCONのような経験は、フロントエンドエンジニアにとっても非常に有益です。ぜひ挑戦してみてください！
Ground Prompt Template with Data Graph



+ [Ground Prompt Template with Data Graph](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000OT7M0AW)

:::note
この機能はまもなくリリースされる予定です。引き続きお知らせします。プロンプトのオブジェクトにルートされている任意のデータ グラフからデータを追加できるようになります。
:::

+ [プロンプト付きデータグラフ](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000J5LW5)
（IDDDを読んで気になったことシリーズ）コレクション指向のリポジトリはSetを模倣、永続指向のリポジトリはMapを模倣？

実践ドメイン駆動設計を読んでいて気になる記載があった。どんな意味なのか考えてみた結果を残しておく。

# コレクション指向のリポジトリはSetを模倣したもの、の意味を考える。
Setは重複が無いように登録するコレクション。
⇒　登録するオブジェクトは同一視の判定をできる必要がある。つまりエンティティ。
⇒　エンティティの変更（＝ステータスの変更）があっても同じものに違いは無いので再登録する必要はない。
⇒　以上の考え方なので、コレクション指向のリポジトリではオブジェクトに変更があっても再登録の必要は無い。

# 永続指向のリポジトリはMapを模倣したもの、の意味を考える。
Mapはキーと値の組み合わせを登録するコレクション。
⇒　値は同一視の判定ができない。変更しても同じものだと主張できるなら識別子を含んでいるはずだが、Mapはキーと値を分離しているので値にはキーを含まない。
⇒　値を変更するときは完全に置き換える必要がある。
⇒　以上の考え方なので、永続指向のリポジトリではオブジェクトの変更時に明示的なputが必要。

以上。
sarコマンドのsysstat versionエラー対応方法

# 1. 概要
Linuxの`sar`コマンドで次のエラーが生じるときは、`sadf`コマンドでファイル・フォーマットを変換すると解消します。
```
Current sysstat version cannot read the format of this file (0x2171)
```

# 2. sarコマンドの説明
`sar`コマンドはCPU使用率などのパフォーマンス情報を表示するコマンドです。その情報は`sadc`コマンドによって収集されて、RHELでは`/var/log/sa`配下に`sa01 sa02 sa03 ...` のように日次で1ファイルずつ保存されます。これらをSAファイルと呼ぶことにします。SAファイルはバイナリ形式で、その内容を確認するために`sar`コマンドを使ってテキスト形式に変換します。

# 3. sysstat versionエラーと解消方法
リモート・サーバーのSAファイルをローカル環境にダウンロードして、その内容を確認することも可能です。しかしリモート・サーバーとローカル環境のLinuxバージョンが異なると、次のようなエラーが起きることがあります。
```
$ sar -f sa01
Invalid system activity file: sa01
File created by sar/sadc from sysstat version 10.1.5
Current sysstat version cannot read the format of this file (0x2171)
```
この場合は次のように`sadf`コマンドでフォーマット変換を行うと解消します。`-c`オプションによって古いシステムのデータを現環境の`sar`コマンド用に変換します。
```
$ sadf -c sa01 > sa01new
file_magic: OK
HZ: Using current value: 100
file_header: OK
file_activity: A_CPU A_PCSW A_SWAP A_PAGE A_IO A_MEMORY A_HUGE A_KTABLES A_QUEUE A_SERIAL A_DISK A_NET_DEV A_NET_EDEV A_NET_NFS A_NET_NFSD A_NET_SOCK OK
Statistics:
Hnuu...uuuununununu...Hnuu...uuuununununu...Hnuu...uuuununununu...Hnuu...uuuununununu...
...
File successfully converted to sysstat format version 12.5.2
```
これで`sar`コマンドのエラー無しで内容をテキスト表示できます。
```
$ sar -f sa01new
Linux 3.10.0-1160.11.1.el7.x86_64 (e1n1)        03/01/22        _x86_64_        (32 CPU)

00:00:01        CPU     %user     %nice   %system   %iowait    %steal     %idle
00:10:01        all      6.94      0.00      2.56      0.08      0.00     90.42
00:20:01        all      6.70      0.00      2.60      0.08      0.00     90.62
...
```

# 4. 関連情報：SAファイルからグラフを作成する方法
`sar`コマンドの出力テキストからグラフを作成する方法がいくつかあります。
#### SARChart
- https://sarchart.dotsuresh.com/
- https://github.com/sargraph/sargraph.github.io

#### sadfコマンド（svgファイル生成）
- https://qiita.com/ymiki0001/items/d5fe7d06c83d5f46957e
sarコマンドでLinuxのパフォーマンスデータを取得してCSV化する

#### kSar
- https://qiita.com/S-T/items/387635e90857e13832cc
sarファイル(sysstat) をグラフ化
- https://qiita.com/hogeo1234/items/ae9701a5d0fd52e73ccb
sar用のグラフ化ツール【ksar】を使ってみた

以上
Laravel環境構築を学んでみた

最近、自分の実力不足を感じることが多い。
そこで、改めてLaravelやPHPを勉強し直そうと思い立った。
https://readouble.com/laravel/11.x/ja/installation.html

DBやWebさーばーを開発環境からがんばるのはめんどい。
本番で頑張ればよい。
俺はXAMPPを使わせてもらう。

## 設定ファイル

まずやることとしては環境ファイルの設定
configの中にapp nameやtimezoneがある。
これはログを正確に出すために必要な設定だ。
是非やっておこう。
設定する値としてはこの辺り。

```
'name' => env('APP_NAME', 'Laravel'),
'timezone' => 'Asia/Tokyo',
'locale' => 'ja',
'fallback_locale' => 'en', 
'cipher' => 'AES-256-CBC', //　暗号化の方式　AESだから共通鍵か

```

.envも設定。
APPKEYがなければ生成する。
```
php artisan key:generate
```

## DB接続
```
DB_CONNECTION=mysql     # 使用するデータベースの種類（例: mysql, sqlite, pgsql）
DB_HOST=127.0.0.1       # データベースサーバーのホスト
DB_PORT=3306            # データベースポート（通常MySQLは3306）
DB_DATABASE=laravel     # データベース名
DB_USERNAME=root        # データベースのユーザー名
DB_PASSWORD=            # データベースのパスワード
```



## 今日分からなかったところメモ
php artisan config:cache
Facade？ファサードってなんだ？
【CSS】"appearance"を使ってデフォルトスタイルをリセット！

# はじめに
CSSの``appearance``プロパティは、HTML要素のデフォルトスタイルをそのままにするか、リセットして自由にカスタマイズできるようにするためのものです。例えばボタンなど、標準スタイルをリセットして見た目を調整したいときに便利です。
最近、初めてこのプロパティを使い、今後も使用頻度が増えそうだと感じたため、使う際の注意点についても調べてみました。この記事では、``appearance``の使い方や注意点について、初心者の方にも分かりやすく解説します。

# appearanceの使い方
#### 基本構文
```css:css
.element {
  appearance: none;
  }

.element {
  appearance: auto;
  }
```
**主な値**
・none：デフォルトのスタイルをリセット。要素が持つ標準のスタイルを無効化し、デザインをカスタムすることできます。
・auto：デフォルトのスタイルを適用します。

# appearanceの使用例

<p class="codepen" data-height="300" data-default-tab="html" data-slug-hash="VwoRdVX" data-pen-title="appearance" data-user="iwdulmiq-the-builder" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/iwdulmiq-the-builder/pen/VwoRdVX">
  appearance</a> by 丸山悠希 (<a href="https://codepen.io/iwdulmiq-the-builder">@iwdulmiq-the-builder</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
※ "Result"ボタンを押すとプレビューが表示されます。

こちらは、``appearance``プロパティの設定によるスタイルの変化やスタイルをリセットして、デザインをカスタマイズする例になります。
``auto``を指定すると、要素が持つデフォルトのスタイルが適用されます。一方で、``none``を指定するとデフォルトスタイルが解除されます。この際、``border``が太くなり、ホバーアクションが無効化されていることが分かります。
デフォルトスタイルが邪魔になる場合、余分なスタイル指定が増えてコードの可読性が低下することがあります。そのような時、``appearanace``でデフォルトスタイルをリセットすることで、自由にデザインしやすくなるというメリットがあります。

# appearanceの注意点
#### ブラウザ対応
主要なブラウザ(Chrome、Firefox、Safari、Edgeなど)では対応していますが、一部未対応のブラウザもあるため、確認してから使用するようにしましょう。

https://developer.mozilla.org/ja/docs/Web/CSS/appearance#%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%83%BC%E3%81%AE%E4%BA%92%E6%8F%9B%E6%80%A7

https://caniuse.com/?search=appearance



#### ベンダープレフィックス
古いブラウザや特定の環境での互換性を考慮する場合、ベンダープレフィックスを加えることでカバーできるケースがあります。
``appearance``プロパティを使用する際、ベンダープレフィックス（例: -webkit-）が必要だった時期があったようですが、最新のブラウザではほとんど不要かと思います。
しかし、互換性に配慮する場面や学習の一環として覚えておくと、将来的に役立つかもしれません。
・参考記事

https://qiita.com/xrxoxcxox/items/3e0e34003a45d3618b29

# まとめ
``appearance``プロパティを活用することで、ボタン要素やフォームなどのデフォルトスタイルをカスタマイズしやすくなります。ぜひ``appearance``プロパティを使って、自由にカスタマイズしてみてください！
オブジェクト型プログラミングと関数型プログラミングの違いと使い分け

**プログラミングを学び始めると「オブジェクト指向プログラミング（OOP）」と「関数型プログラミング（FP）」という言葉をよく耳にするでしょう。この二つのパラダイムは異なる考え方を持っていますが、それぞれに強みがあり、シチュエーションに応じて使い分けることが重要です。この記事では、オブジェクト指向と関数型プログラミングの違いについて、解説します。**

# オブジェクト指向プログラミング（OOP）とは？

オブジェクト指向プログラミング（Object-Oriented Programming）は、プログラムを「オブジェクト」の集合として考える方法です。**オブジェクトとは、データ（属性）とそれに関連する処理（メソッド）をひとまとめにしたものです。**

**主な特徴**

**カプセル化**: データとメソッドを一つのオブジェクトとしてまとめて管理します。これにより、データの保護と操作が簡単になります。

```Java
class Car {
    constructor(brand, model) {
        this.brand = brand;
        this.model = model;
    }

    describe() {
        return `${this.brand} ${this.model}`;
    }
}

const myCar = new Car("Toyota", "Corolla");
console.log(myCar.describe()); // Toyota Corolla
```

**継承**: 既存のクラスから新しいクラスを作ることで、コードの再利用が簡単になります。

```Java
class ElectricCar extends Car {
    constructor(brand, model, batteryLife) {
        super(brand, model);
        this.batteryLife = batteryLife;
    }

    describeBattery() {
        return `${this.describe()} with a battery life of ${this.batteryLife} hours`;
    }
}

const myElectricCar = new ElectricCar("Tesla", "Model S", 24);
console.log(myElectricCar.describeBattery());
// Tesla Model S with a battery life of 24 hours
```

**ポリモーフィズム（多態性）: 同じ操作でも、異なるクラスがそれぞれ異なる動作をすることが可能です。これにより、柔軟で拡張しやすい設計が可能です。**

**OOPの利点**

**リアルワールドとの対応**: 実世界のもの（車、ユーザーなど）をオブジェクトとして表現することで、プログラムの構造が理解しやすくなります。

**再利用性**: 継承を使うことで、既存のコードを再利用しやすくなります。

# 関数型プログラミング（FP）とは？

関数型プログラミング（Functional Programming）は、**プログラムを数学的な関数の集合とみなし**、状態の変更を最小限に抑えた設計を行う方法です。関数は副作用を持たず、入力に対して常に同じ出力を返すことが重要です。

**主な特徴**

**純粋関数**: 同じ入力に対して常に同じ結果を返し、副作用を持たない関数を使います。これにより、関数のテストやデバッグが容易になります。

```Javascript
const add = (a, b) => a + b;
console.log(add(2, 3)); // 5
```

**高階関数**: 関数を引数に取ったり、関数を戻り値として返すことができる関数です。これにより、抽象度の高いコードを書くことができます。

```Javascript
const applyFunction = (fn, value) => fn(value);
const double = (x) => x * 2;

console.log(applyFunction(double, 5)); // 10
```

**不変性（イミュータビリティ）**: データを変更するのではなく、新しいデータを作り出すことを重視します。これにより、予測可能なコードを書きやすくなります。

```Javascript
const numbers = [1, 2, 3];
const newNumbers = [...numbers, 4];
console.log(newNumbers); // [1, 2, 3, 4]
```

**FPの利点**

**予測可能性**: 純粋関数を使うことで、関数の動作が予測可能になります。

**テストの容易さ**: 副作用を持たないため、関数のテストが簡単です。

# オブジェクト指向と関数型の使い分け

**状態を持つ複雑なオブジェクトの管理が必要な場合には、オブジェクト指向が適しています**。例えば、ユーザー情報を管理するようなシステムでは、ユーザーごとにさまざまな属性を持つため、オブジェクト指向で実装するとわかりやすくなります。

**データ変換や計算が中心で、副作用を最小限にしたい場合には、関数型プログラミングが適しています**。例えば、リスト内のデータを変換したり、特定の条件でフィルタリングする場合には関数型のほうがコードが簡潔になります。

# まとめ

オブジェクト指向プログラミングと関数型プログラミングは、それぞれ異なる考え方に基づいています。

**オブジェクト指向は、データとその操作をまとめて管理し、状態を持つオブジェクトを扱うのに適しています。**

**関数型プログラミングは、純粋関数や不変性を重視し、状態を持たずに処理を行うことで予測可能性を高めるのに適しています。**

どちらのパラダイムも強力なツールであり、プロジェクトやタスクの性質に応じて適切に使い分けることが大切です。ぜひ、それぞれの特徴を理解して、自分のプロジェクトに最適な方法を選んでみてください！

**最後までよんでいただきありがとうございます。
@y-t0910をフォロー,いいねしていただけると嬉しいです！**
無料でBedrockについて技術問合せ出来る？有料だからと足踏みしているあなたへ ～AWS100本ノック～ 15/100

# はじめに

みなさんどの[AWSサポートプラン](https://aws.amazon.com/jp/premiumsupport/plans/)に加入していますか？

プランとしては
- `ベーシック(無料)`
- `デベロッパー`
- `ビジネス`
- `エンタープライズ On Ramp`
- `エンタープライズ`
の5つがあります。

システムの規模間などにもよりますが、だいたい以下のような感じになるかと思います。
- 個人利用だったら`ベーシック`
- 開発環境のアカウントなら`ベーシック`か`デベロッパー`
- 本番環境なら`ビジネス以上`

# ベーシックプランについて

ベーシックプランは無料なので余計なコストがかからず、とてもいいですよね :smile: 
ただ、`アカウントと請求`の問い合わせは出来ますが、`技術`の問合せが出来ないというデメリットがあります。

![スクリーンショット 2024-11-21 204811.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/28b8dbd7-8bf2-0414-528e-ed9ea28aa5ff.png)

:::note
現在、有料のビジネスプランに関して最大2か月のトライアルを行っているようです。
トライアル加入の条件があるようですが、まずはトライアルに加入してコストに見合うか検討するのが良さそうです。
トライアルの詳細については、[こちら](https://aws.amazon.com/jp/premiumsupport/plans/business/)をご確認下さい。
:::

# 実はベーシックプランでも技術問合せできる

Bedrockを触っていて公式サイトなどを見てもわからない疑問(今回はQuota周り)があったのですが、ビジネスプランに加入するのもな～と思っていたところ、Bedrockは[無料で問合せできる](https://aws.amazon.com/jp/blogs/news/generative-ai-amazon-bedrock-handling-quota-problems/)ということを知りました！

アカウントと請求で、
- `サービス`にAccount Activation
- `カテゴリー`にBedrock Allowlisting
- `緊急度`に一般的な質問
を選択し、聞きたいことを記入して質問すると、回答をもらうことが出来ました！

![スクリーンショット 2024-11-21 210125.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/976cac20-8df4-afc7-d28d-72a73220f666.png)

※こんな感じで聞きました
![スクリーンショット 2024-11-21 210622.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/1190fcb0-b890-8ab5-a17f-1946345564e6.png)

ただ、無料のベーシックプランだからか返信は早くなかったので、本当に急ぎの場合はデベロッパーやビジネスプランに加入することをおすすめします！！！

# おわりに

今回はベーシックプランのちょっとした豆知識を共有させて頂きました。
BedrockはAWSの中では話題になることが多いですし、新しいサービスなのでつまずくことは多いと思います。
そんな時に無料で問合せ出来るのはとてもいいですね！
Pythonチュートリアル #10 -学習を終えて-

※以下の企画です

https://qiita.com/tatataichi/private/56936a028e625e62af8e

11章まで進めてきて、よしじゃあ今回は12章だ！と思っていたのですが、実はこの本の12章以降は付録的な内容をぶつ切りで記載されているだけなので、あえてアウトプットするような内容ではなかった。（仮想環境の呼び出し方　など）
そのため、今回はここまで学んできたことで生じた自身の変化や、次にやろうとしていることをまとめようと思う。

# 学んできたことのまとめ
## そもそもの振り返り
そもそも今回の企画は、アドベントカレンダーの企画に乗じて「**Qiitaぬいぐるみもらうぞ！！**」というモチベでなにか始めようと思ったことがきっかけだった。
色々考えた結果、**最近はGPTを多用しすぎて、自分の力でコーディングできていないかも**という危機感を払拭するために、「**コーディングが楽しかった頃を思い出したい**」「**ゼロからコーディングする場をもっと積極的に作るべき**」と考えた。

https://qiita.com/tatataichi/private/56936a028e625e62af8e

至った結論としては、「**Pythonを学び直そう**」であり、今回のPythonチュートリアルをやりこむことにつながった。

## 自身に生じた変化
### **①圧倒的にGPTに頼らないことが増えた**
今までだと、「**一旦GPT先生の出力を見てみよう…**」としていたところが、「**ざっくり自分で作ってみるか**」となるようになった。
おそらくこの記事を読んでくださっている多くの方が「**そのレベルでエンジニア名乗らないほうがいいよ…**」とお思いだと思う。

ただ、言い訳をさせていただくと、「**自分で書こうと思えば書けるんだけど、効率化のためにGPTを頼っていた**」という状況だったので、本当はちょっとはできる子のはずなのだ僕は（クソダサい言い訳）

もちろんGPTを活用することが完全に悪なのではなく、「"自分の能力を超えたコード"を取り入れてしまう」ことが問題なのだと思う。事実、僕はそういったコーディングも発生していたこともあり危機感を感じていた。

例えば、「**内包**」の仕組みを活用したコードなどは、この企画でちゃんと勉強をしなおすまでは「**理解はできていないけど、GPT先生がそう言ってるなら信じます…**」と思いながらコードの中に組み込んでいたのが正直なところだ。やばいな普通に。

社内で独りエンジニアをやっていて、社内向けの生産性改善ツール開発で外に出すプロダクトではないからまだ問題になっていないだけで、普通のSEだったら首絞め案件だと思っている。情けない( ◠‿◠ ) 

話がやや変な方向に向かい始めているので、ここで一旦まとめると…

**1. "GPTスタートじゃないコーディング"に自分のマインドセットを修正できた**
**2. GPTに手伝ってもらったとしても、理解できる範囲が広がった**

というのが１つ目の変化だ。

### ②プログラミングがまた楽しくなった
GPTという麻薬に依存しだすことで、自分の存在価値がだんだんと薄れていて、「**僕がコーディングする意味ってほとんどないんじゃないか**」というモチベになっていた。
そうなると、コーディングにおける自己研鑽への意欲も薄れていき、**全然スキルアップしないおじさん**になっていくのを感じていた。

そもそもスキルの高い人が「コーディングはGPTにまかせて自分はもっと上流のことをやろう」という発想に至るのは、効率化という文脈でGPTを活用していると思うので問題ないのだと思う。
しかし自分はコーディングスキルが特別高いわけではないので、ただたんにGPTにお任せしいるだけだった。

そんな中で、自分の負をすべて認めてゼロから素直にPythonを学び直すことで、「**プロダクトが自分の手で完成していく楽しさ**」や「**GPTを一部使ったとしても、ちゃんと記述内容を理解できる**」という前向きな状態になることができている。

コントローラブルな範囲が増えている感覚もあるし、今までわからずになんとなく蓋を閉じていた部分も理解出来始めているので、「プログラミングって楽しい！」と思って没頭していた学生時代の気持ちを思い出してきている。

ネガティブな気持ちをズルズル引きずっていた自分を変えられたという意味で、本当にアドベントカレンダー企画に参加して良かったと感じる。

# 次にやること
**なんかこれで終わりみたいな雰囲気出していますが、あと14記事くらい投下します（笑）**

Pythonチュートリアルをこなすことで一旦自分の負をリセットできたので、ここからはスキルアップに向けての学習をしていく。
具体的には最初の記事でも宣言した通り、「**プロフェッショナルWebプログラミング　Django（エムディエヌコーポレーション）**」をコツコツとやっていく。

業務上、触れる頻度が高いものの理解しきれていない内容が多い部分なので、このタイミングでしっかり自分のモノにしていきたいと思う。

引き続き頑張ります！！！
Github PR の Resolved Comment ( 解決済みコメント ) を全て開く方法 ( Google Chrome の場合 )

# 手順

##  Github PR のページに 移動する

## Google Developer Tool を開く

![CleanShot 2024-11-22 at 06 58 18@2x](https://github.com/user-attachments/assets/ab77dafe-4b74-4084-a5ff-2559a372b491)

## ペーストの許可

Console に のタブに `allow pasting` と入力する ( コードのペーストを許可するため )

## Javascriptを直接実行

Console のタブに以下を入力して、実行する

`document.querySelectorAll('.js-resolvable-timeline-thread-container').forEach(e => { e.setAttribute('open', '') })()`



# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
Docker composeで、パブリックネットワークとプライベートネットワークを持つコンテナを作成する方法

# はじめに
　Docker composeで、パブリックネットワークとプライベートネットワークを持つコンテナを作成する方法を紹介する。インターネットアクセス可能なパブリックネットワークと、内部通信のみを行うプライベートネットワークを分けたい場合に有用。


# 方法

　コンテナ内の1つのサービスに、インターネット接続のあるパブリックネットワークと、インターネット接続のないプライベートネットワークを同時に割り当てる。また、コンテナ内の別のサービスには、プライベートネットワークを割り当てる。インターネット接続は、ブリッジを通じてホストネットワークからインターネットへ接続させる。設定例を以下に示す。

|項目|設定値|
|:-:|:-:|
|プライベートIPアドレス範囲|192.168.10.0/24|
|パブリックIPアドレス範囲|192.168.20.0/24|
|インターネット接続用ゲートウェイ|192.168.20.1|
|アプリケーションサーバ用パブリックIPアドレス|192.168.20.2|
|アプリケーションサーバ用プライベートIPアドレス|192.168.10.2|
|データベースサーバ用プライベートIPアドレス|192.168.10.3|

```plantuml
@startuml
!include <office/Concepts/globe_internet>
!include <office/Servers/application_server>
!include <office/Devices/device_laptop>
!include <office/Devices/router>

nwdiag {
   network internet {
        description = "ホストネットワーク (Wi-Fi / LTEなど)"
        internet [description = "インターネット", shape = cloud]
        Gateway [address = "x.x.x.x", description = "<$router>\n ゲートウェイ"];
   }

   network public_net {
       address = "192.168.20.0/24"
       description = " パブリックネットワーク"
       Gateway [address = "192.168.20.1", description = "<$router>\n ゲートウェイ"];
       AppServer [address = "192.168.20.2", description = "<$application_server>\n アプリケーションサーバ"];
   }


   network private_net {
       address = "192.168.10.0/24"
       description = "プライベートネットワーク"
       AppServer [address = "192.168.10.2", description = "<$application_server>\n アプリケーションサーバ"];
       DatabaseServer [address = "192.168.10.3", description = "<$application_server>\n DBサーバ"];
   }

}
@enduml
```



Docker composeファイルは以下のようにする。
* ポイント
  * プライベートネットワーク
    * ```internal: true```を設定する
    * ```gateway```を**設定しない**
  * パブリックネットワーク  
    * ```gateway```を**設定する**

```yaml:docker-compose.yml
version: "3"
services:
  app:
    image: ubuntu
    command: ["/.app"]  # 自身のアプリケーションに置き換える
    networks:
      internal_net:
        ipv4_address: 192.168.10.2
      external_net:
        ipv4_address: 192.168.20.2
  db:
    image: postgres
    networks:
      internal_net:
        ipv4_address: 192.168.10.3

networks:
  internal_net:
    driver: bridge
    internal: true  # プライベートネットワークの場合に設定
    ipam:
      driver: default
      config:
        - subnet: "192.168.10.0/24"
  external_net:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: "192.168.20.0/24"
          gateway: "192.168.20.1"  # インターネット接続のために設定
```

# まとめ

　Docker composeで、パブリックネットワークとプライベートネットワークを持つコンテナを作成する方法を紹介した。インターネットアクセス可能なパブリックネットワークと、内部通信のみを行うプライベートネットワークを分けたい場合に有用。

# 参考

https://docs.docker.jp/engine/reference/commandline/network_create.html#internal

https://forums.docker.com/t/internal-network-between-containers-without-external-network-access/41751/8
VoIPとSIPを通じてRustを勉強する：RTCP(APP)

# RTCPアプリケーション定義(APP:Application-Defined)  
アプリケーションで機能拡張を定義できるようにしている。

# パケットのフォーマット
~~~
    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |V=2|P| subtype |   PT=APP=204  |             length            |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                           SSRC/CSRC                           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          name (ASCII)                         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                   application-dependent data                ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
~~~

# パケットの説明
パケットタイプ204で識別される。  


# 引用
[RFC 3550](https://tex2e.github.io/rfc-translater/html/rfc3550.html)
VoIPとSIPを通じてRustを勉強する：RTCP(BYE)

# RTCPメンバシップ制御(BYE)  
一部の参加者がセッションから出たことを知らせる。
参加者がセッションから出たとき、あるいは自分のSSRCを変更したときに生成される。

# パケットのフォーマット
~~~
       0                   1                   2                   3
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |V=2|P|    SC   |   PT=BYE=203  |             length            |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                           SSRC/CSRC                           |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      :                              ...                              :
      +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
(opt) |     length    |               reason for leaving            ...
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
~~~

# パケットの説明
パケットタイプ203で識別される。  


# 引用
[RFC 3550](https://tex2e.github.io/rfc-translater/html/rfc3550.html)
VoIPとSIPを通じてRustを勉強する：RTCP(SDES)

# RTCPソース記述(SDES:Souce Description)  
参加者の識別を可能にすること、場所、電子メールアドレス、電話番号などの補足情報を提供する。

# パケットのフォーマット
~~~
        0                   1                   2                   3
        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
header |V=2|P|    SC   |  PT=SDES=202  |             length            |
       +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
chunk  |                          SSRC/CSRC_1                          |
  1    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                           SDES items                          |
       |                              ...                              |
       +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
chunk  |                          SSRC/CSRC_2                          |
  2    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                           SDES items                          |
       |                              ...                              |
       +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
~~~

# パケットの説明
パケットタイプ202で識別される。  


# 引用
[RFC 3550](https://tex2e.github.io/rfc-translater/html/rfc3550.html)
VoIPとSIPを通じてRustを勉強する：RTCP(RR)

# RTCP受信レポート(RR:Receiver Reports)  
受信品質のレポート。
データを受信する参加者は必ずこのRRパケットを送信する。

# パケットのフォーマット
~~~
        0                   1                   2                   3
        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
header |V=2|P|    RC   |   PT=RR=201   |             length            |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                     SSRC of packet sender                     |
       +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
report |                 SSRC_1 (SSRC of first source)                 |
block  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  1    | fraction lost |       cumulative number of packets lost       |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |           extended highest sequence number received           |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                      interarrival jitter                      |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                         last SR (LSR)                         |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                   delay since last SR (DLSR)                  |
       +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
report |                 SSRC_2 (SSRC of second source)                |
block  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  2    :                               ...                             :
       +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
       |                  profile-specific extensions                  |
~~~

# パケットの説明
パケットタイプ201で識別される。  


# 引用
[RFC 3550](https://tex2e.github.io/rfc-translater/html/rfc3550.html)
VoIPとSIPを通じてRustを勉強する：RTCP(SR)

# RTCP受信レポート(RR:Receiver Reports)  
受信品質のレポート。
データを受信する参加者は必ずこのRRパケットを送信する。

# パケットのフォーマット
~~~
        0                   1                   2                   3
        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
header |V=2|P|    RC   |   PT=SR=200   |             length            |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                         SSRC of sender                        |
       +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
sender |              NTP timestamp, most significant word             |
info   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |             NTP timestamp, least significant word             |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                         RTP timestamp                         |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                     sender's packet count                     |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                      sender's octet count                     |
       +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
report |                 SSRC_1 (SSRC of first source)                 |
block  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  1    | fraction lost |       cumulative number of packets lost       |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |           extended highest sequence number received           |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                      interarrival jitter                      |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                         last SR (LSR)                         |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                   delay since last SR (DLSR)                  |
       +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
report |                 SSRC_2 (SSRC of second source)                |
block  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  2    :                               ...                             :
       +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
       |                  profile-specific extensions                  |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
~~~

# パケットの説明
パケットタイプ201で識別される。  


# 引用
[RFC 3550](https://tex2e.github.io/rfc-translater/html/rfc3550.html)
VoIPとSIPを通じてRustを勉強する：RTCP概略

# RTCPとは
受信品質、参加者の識別、ソースについての情報、セッション内のメンバの変更通知、メディアストリームの同期に必要な情報を定期的にレポートするもの。

# パケット
パケットは5種類ある。  
・RTCP受信レポート(RR:Receiver Reports)  
・RTCP送信レポート(SR:Sender Reports)  
・RTCPソース受信(SDES:Source Description) 
・RTCPメンバシップ制御(BYE)
・RTCPアプリケーション定義(APP:Application-Defined)

# パケット転送
RTPセッションはネットワークアドレスと２つのポートで識別される。
RTPデータのポートは偶数、RTCPのポートは１を加えたものが使用される。

#RTCPパケットのフォーマット
パケットは以下の構成となっている。  
次回以降で説明する。

~~~
        0                   1                   2                   3
        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
header |V=2|P|    RC   |      PT       |             length            |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                         種類別情報                             |
       |                                                               |
       |                                                               |       
       +                                           +-+-+-+-+-+-+-+-+-+-+
       |                                   　　　　　|パディング(P=1の場合)|       
       +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
~~~

# 引用
[RFC 3550](https://tex2e.github.io/rfc-translater/html/rfc3550.html)
異なる型を返すメソッド

自分用のメモ．
しばらくPythonやJavaScriptを触ってた時期に書き殴って放置してたC++のコード．
仲間から問い合わせがあって，リモートで会話しながら，「ああ，それならこれで動くはず.. あっ，あれ？あれぇ？」て感じでバグ発見．

readメソッドを呼ぶときにrawが省かれてたらマイクロボルト値を，trueに指定されてたら整数値を返すつもりだったけど(^^;
そりゃぁ動かんわwww

ていうか見るからに簡潔さに欠けるコードだし，自分のアホさ加減に呆れる．
違う型は返せないし，delay指定を行える関数を別に作ってしまってる．
```cpp
class NAFE13388_Base : public SPI_for_AFE{
	virtual double read( int ch, float delay, bool raw = false );
	virtual double read( int ch, bool raw = false );
}
...
double NAFE13388_Base::read( int ch, float delay, bool raw )
{
	start( ch );
	wait( delay );
	
	return read( ch, raw );
};

double NAFE13388_Base::read( int ch, bool raw )
{
	if ( raw )
		return read_r24( 0x2040 + ch );
	else
		return read_r24( 0x2040 + ch ) * coeff_uV[ ch ];
}
```
ほんで書き直したのがコレ．
まぁまぁ簡潔．readメソッドを呼ぶ際には型を明示しなければならないのが面倒だけど.. たとえば`read<int32_t>( 0, 0.01 )`みたいに．
でもそれぞれ別の関数として定義しておくよりはずっと良いんではないかな．

```cpp
template<> 
int32_t NAFE13388_Base::read( int ch, float delay )
{
	start_and_delay( ch, delay );
	return read_r24( 0x2040 + ch );
};

template<>
double NAFE13388_Base::read( int ch, float delay )
{
	return read<int32_t>( ch, delay ) * coeff_uV[ ch ];
};

void NAFE13388_Base::start_and_delay( int ch, float delay )
{
	if ( delay >= 0.0 )
	{
		start( ch );
		wait( delay );
	}
}
```
これを使う`main()`の中身はこんな感じ．
実際のサンプルコードでは`raw`，`microvolt`のような型名を定義しといた．
```cpp
#include	"r01lib.h"
#include	"NAFE13388_UIM.h"

SPI				spi( D11, D12, D13, D10 );	//	MOSI, MISO, SCLK, CS
NAFE13388_UIM	afe( spi );

int main( void )
{
	printf( "***** Hello, NAFE13388 UIM board! *****\r\n" );

	spi.frequency( 1000 * 1000 );
	spi.mode( 1 );

	afe.begin();

	afe.logical_ch_config( 0, 0x1070, 0x0084, 0x2900, 0x0000 );
	afe.logical_ch_config( 1, 0x2070, 0x0084, 0x2900, 0x0000 );

	while ( true )
	{		
		printf( "microvolt: %11.2f, %11.2f\r\n", afe.read<double>(   0, 0.01 ), afe.read<double>(  1, 0.01 ) );
		printf( "raw:       %ld, %ld\r\n",       afe.read<int32_t>(  0, 0.01 ), afe.read<int32_t>( 1, 0.01 ) );

		wait( 0.05 );
	}
}

```
コードの置き場所：  
https://github.com/teddokano/UIM_NAFE13388_FRDM_MCX/

参考にした記事：  
https://qiita.com/SaitoAtsushi/items/d8ae623663878feeb181
新イベントルームの初イベントで初LTしてきたよ！

## はじめに

昨日、「クラメソさっぽろIT勉強会 (仮) #6:パフォーマンスチューニング」で、初LTしてきました。

https://classmethod.connpass.com/event/333630/

クラスメソッド札幌オフィスの新イベントルームでの初イベントで、初LTをさせて頂いたことに感謝しかありません。
貴重な体験をさせていただき、ありがとうございました！

私にとっては一つの記念日なので、感じたことを忘れないように、一つ記事にしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/20ab9d52-a580-d9bb-3c7e-bf0ddc758f70.png)

## LTの内容

今回はパフォーマンスチューニングがテーマだったので、自分の経験の中で一番お役に立ちそうなものを選びました。

AWSを主軸に頑張ろうと思っていたので、まさかの初回テーマがSQLServerになるとは意外でした。

https://www.docswell.com/s/moriyama/Z6VJ2L-2024-11-22-043809

## 楽しかった？

初LTかつ、前回から人数も倍増していたのでとっても緊張しました。

後半から声が震えてるなーって自分でも分かるくらいには緊張していましたが、結論は楽しかったな！って思ってます。

単純に技術でわいわい出来たのは楽しいし、勉強会に来ている人たちって、絶対私みたいな低レベルな人にも冷たくしたりしないんですよね。

絶対拍手もしてくれる。

Xの反応も家に帰るまで怖くて見ることができなかったのですが、否定的なコメントなんてありませんでした。
Qiitaの記事を紹介までして頂いた方もいて、感謝しかありません。

そういった意味で、「失敗しても怖くない」という心理的安全性がとっても高いんだと思います。

## 反省点はたくさん。

ただ、もっと改善できるなというところはあるので、これからもっと経験積んで成長していきたいです！

### みんなとLTする。

LTは登壇者が話すのは当たり前ですが、見て頂いている人を巻き込んだ話し方をするのが良いのかなと思いました。

ちょっと自分が一方的に話すだけ・・・みたいになったことは反省点です。

### 資料はもっと見やすく。

私は文書を書くのも、お話しするのも苦手なタイプなので、もっと要点を端的にわかりやすく、自身の言葉と資料の言葉を一致させるようにしたいな。と思いました。

### リアルタイムにアウトプット

登壇とは別内容ですが、感想をリアルタイムにポストしている方がいて、いつも驚いています。

私も感想をアウトプットしているのですが、後から考えをまとめてポストする感じになってしまうので、アウトプットの速さは見習いたいなって思ってます。

### 次のアクション

できれば、月に一度はLTしたいなって考えています。

まだ私が出来ることはわずかですが、一人でも良いので、何か影響を与えられる人になりたいです！

ということで、早速来週また登壇しようと思います！

はじめての方向けのイベントみたいなので、それに合わせた内容で発表しようかなって思います！

https://lets-go-study-meeting.connpass.com/event/333395/

## さいごに

9月末に初めて書いた記事から、２ヶ月くらいでやっと初LTまで辿り着きました！

Qiitaへの投稿や、イベントの登壇など、もっと早くやればよかったなーと後悔してるので、これからはもっと楽しんでいきます！

https://qiita.com/s_moriyama/items/ba11ae38632a28a3eaee
SQLパズル　29 最頻値を求める　解法メモその２

# 概要
p126 29 最頻値を求める　解法メモその２

Having句と極値関数を組み合わせて最頻値を求めています。
ALL述語使うよりもイメージしやすいかも



# 要件

支払い伝票に対して、金額の最頻値を求めたい。
※最頻値とは、母集団の中で最も多かった値


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/c8bb57a6-a938-84b8-20e1-0827e697caee.png)

# SQL

## DDL
```sql
drop table if EXISTS Payroll;
create table Payroll(
    check_nbr Integer NOT NULL Primary Key,
    check_amt DECIMAL(8,2) NOT NULL
);

INSERT INTO Payroll VALUES(1, 100);
INSERT INTO Payroll VALUES(2, 100);
INSERT INTO Payroll VALUES(3, 200);
INSERT INTO Payroll VALUES(4, 150);
INSERT INTO Payroll VALUES(5, 300);
INSERT INTO Payroll VALUES(6, 150);
INSERT INTO Payroll VALUES(7, 300);
INSERT INTO Payroll VALUES(8, 300);
INSERT INTO Payroll VALUES(9, 100);
```



## 答えのSQL
Having句のサブクエリの中にサブクエリがある…
そこが理解するのに時間かかりましたね

各々分解してレコードを確認すれば済む話ですね。

```sql
-- p126 29 最頻値を求める　その２
SELECT check_amt,COUNT(*) AS check_cnt
FROM Payroll
GROUP BY check_amt
Having COUNT(*) = (SELECT MAX(check_cnt)
                    FROM (SELECT COUNT(*) AS check_cnt
                        FROM Payroll
                        GROUP BY check_amt) AS P1);

-- サブクエリ１ 
SELECT check_amt,COUNT(*) AS check_cnt
FROM Payroll
GROUP BY check_amt;


-- サブクエリ２ 
SELECT MAX(check_cnt)
FROM (SELECT COUNT(*) AS check_cnt
        FROM Payroll
        GROUP BY check_amt
        ) AS P1;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/67fad6f5-d07e-0ba5-13ce-56f0f9f8e68b.png)

# 参考

SQLパズル　p126 29 最頻値を求める　その２

SQLパズル　サポートページ
https://mickindex.sakura.ne.jp/database/db_support_sqlpuzzle.html#LocalLink-p29

達人に学ぶSQL徹底指南書第２版 p113 Havingでサブクエリ　最頻値を求める　極値関数の利用

github

https://github.com/RYA234/SQL_Puzzle_Learning/commit/569f6d30b205e199c178c0ab1a203f2be79f008c
bokeh: `ColumnDataSource`に含まれている参照されていないデータもHTMLファイルに出力される

# 環境
* Python 3.12.4
* bokeh 3.6.1

# 内容

以下のサンプルデータを利用して、散布図をプロットしました。

https://docs.bokeh.org/en/latest/docs/reference/sampledata.html#module-bokeh.sampledata.degrees

```python:sample.py
from bokeh.sampledata.degrees import data
from bokeh.plotting import figure, output_file, save, ColumnDataSource

print(f"{len(data)=}")
print(data.dtypes)
x_column = "Agriculture"
y_column = "Architecture"
source = ColumnDataSource(data)
fig = figure(x_axis_label=x_column, y_axis_label=y_column)
fig.scatter(
    source=source,
    x=x_column,
    y=y_column,
)
output_file("sample.html")
save(fig)
```

```
$ python sample.py
len(data)=42
Year                               int64
Agriculture                      float64
Architecture                     float64
Art and Performance              float64
Biology                          float64
Business                         float64
Communications and Journalism    float64
Computer Science                 float64
Education                        float64
Engineering                      float64
English                          float64
Foreign Languages                float64
Health Professions               float64
Math and Statistics              float64
Physical Sciences                float64
Psychology                       float64
Public Administration            float64
Social Sciences and History      float64
dtype: object
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37903/d4de195b-6574-4b14-50d7-20254f227b78.png)

参照している列は`Agriculture`と`Architecture`だけですが、HTMLファイルには`ColumnDataSource`の全データが出力されます。


```sample.html
<script type="application/json" id="f88a2b14-1877-42ea-81ff-fedc7e181d63">
...
["Year",{"type":"ndarray","array":{"type":"bytes","data":"sgcAALMHAAC0BwAAtQcAALYHAAC3BwAAuAcAALkHAAC6BwAAuwcAALwHAAC9BwAAvgcAAL8HAADABwAAwQcAAMIHAADDBwAAxAcAAMUHAADGBwAAxwcAAMgHAADJBwAAygcAAMsHAADMBwAAzQcAAM4HAADPBwAA0AcAANEHAADSBwAA0wcAANQHAADVBwAA1gcAANcHAADYBwAA2QcAANoHAADbBwAA"}
...
</script>
```

HTMLファイルのサイズを縮小するために、必要最小限のデータのみを含む`ColumnDataSource`を生成して、HTMLファイルを出力しました。


```python:sample2.py
source = ColumnDataSource(data[[x_column, y_column]])

...

output_file("sample2.html")
```

ファイルサイズは約半分になりました。

```
$ ls *.html -l
-rw-r--r-- 1 yuji yuji  16519 Nov 22 02:22 sample.html
-rw-r--r-- 1 yuji yuji   7626 Nov 22 02:30 sample2.html
```

今回のデータは42件です。データ件数が1000件以上ならば、ファイルサイズ縮小の効果は大きいでしょう。
【UE5】ゲームのセーブ時にAIが行っているタスクを保存しロード時に再開させる方法

### はじめに

通称「極め本」完了後、シティビルダー系のシミュレーションゲームを作る際に躓いたので記録。
ビヘイビアツリーで複数の工程を含む労働等のNPCの行動を実装したところ、労働中にゲームをセーブするとロードした際に労働の進捗が失われてしまったため、この問題の解決策を調べた。
UEのバージョンは5.3.0

### 前提知識・技能
ビヘイビアツリーを用いたAIの作成
セーブとロードの実行

### 解決方法
#### 概要
ビヘイビアツリーはRootから順番にノードを実行するため、特定のタスクから再開するという機能は標準では実装されていない。
そこで、以下のようにセーブ時のタスクまでスキップするよう実装した。
- ゲームのセーブ時に再開するタスクの情報を保存する
- ゲームのロード時に再開するタスクの情報を読み込む
- NPCにboolean型の変数を追加し、タスクの開始時にロードが必要か判定する
- ロードが必要な場合、ロード時のタスクを確認し、実行中のタスクとクラスが一致する場合のみ労働を行う

#### 詳細
1. ##### 全体像
    多数のタスクで同様の処理を行うため、『BTTask_BlueprintBase』クラスを親とするオブジェクト『BTTask_BlueprintBase_WithSave』を作成し、行動内容を書くタスクはそれを継承するようにした。
    『BTTask_BlueprintBase_WithSave』のイベントグラフの全体像は以下のようになった。
![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3927318/0271bc7a-10ca-5132-c4e2-9ca6a0992f9d.png)
![func.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3927318/dddcccd6-192d-c407-39f1-2ec947b51653.png)
1つ目のBranchでロードが必要か判定し、必要であれば次の分岐に進む。キャラクター側でObjectのクラスを格納する変数『TaskToDo』が実行中のタスクのクラスと一致する場合のみDoTask関数でタスクを実行する。
タスクの処理内容は継承した子クラスでDoTask関数をオーバーライドして記述する。
&nbsp;

1. ##### ビヘイビアツリー内のMoveToやWaitなどのノードを自作のタスクに置き換える
    セーブ機能を使うためにMoveToなどのビヘイビアツリー内のノードを自作のタスクに置き換える必要がある。また1つのビヘイビアツリー内で同じタスクを複数回呼び出すとロード時に正しいタスクから再開できないので、Wait1、Wait2など同じ処理内容のものを複数作成する必要がある。後は普通にセーブとロードで変数を読み書きすれば完成。

### 結果
非ロード時に無駄な処理が増えるのが気になるが欲しい機能は得られた。もっと良い方法があれば後程改良したい。
AWSでIAM Identity Centerで許可セットが作れない問題を解決

## これは何?

おひとりさまOrganizationsをしようと思い，IAM Identity Centerをいじっていたのですが，グループに割り当てる許可セットを作る場所がなくて混乱したので解決方法を記載します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/aa293dbd-c3b9-21f9-638f-3feda5b637bf.png)
↑これがなかった。

---

## 解決方法

昔使った古いIAM Identity Centerが残っていたのが原因でした。

Dashboardの設定画面からIAM Identicy Centerのインスタンスを削除して再作成したら解決しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/2194aba4-e1ff-9b53-c2e8-cd7b0c3dd687.png)
[UE5]StateTreeを勉強する クイックスタートガイドを見る（3）

https://dev.epicgames.com/documentation/ja-jp/unreal-engine/statetree-quick-start-guide
前回（6項まで）は止まった的が壊せるだけだったが、周回するコースを設定して動く的に変えるのが今回の目的である。

# スプラインパスの準備と設置
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3934437/4d9ccada-6be5-8fc2-25b8-dc41364f453b.png)
書いてある通りにやればよく、補足するような内容もないので割愛する。ちなみに、地面や壁にめり込むようなパスも設定しても問題なく動くようだ。

# State Tree Evaluator
 Evaluatorは評価者の意。 State Tree Evaluatorはステートツリーで使うパラメータを登録する用途で使う。今回は設置したスプラインパスを探してStateTree側から参照できるようにする。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3934437/966586fe-ce19-9b6f-3ccf-1bedd951274d.png)
STE_GetSplineのOutputに探してきたSplineActorを置く。設定の仕方はContextと同じ。

ST_ShootingTargetのEvaluatorsに設定することでタスクでSplineActorを取得できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3934437/d76b7352-6dd2-e1fb-677d-4de49ab2ea24.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3934437/b5b2a327-3327-8e94-d752-295ca9d49a2f.png)
ここでセットしたStateTreeEvaluatorはStateTreeが動いている最中は常駐しているため、Tick処理に重い処理を書かないようにしたい。（このサンプルはStateTree起動時イベントのみ記述があるため問題ない）

# MoveAlongSplineタスクの内容
Evaluatorsから受け取ったスプラインパスに沿ってActorを動かすのがこのタスク。ガイドには何にも説明がないので補足しておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3934437/6370f597-efe5-6298-0ed2-04aa9bc58855.png)
Distanceはスプラインパスに沿って動いた距離、MovementSpeedは動かす速度を指定している。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3934437/daebf4bc-71b9-1144-fd92-3be52fad7683.png)
処理冒頭はスプラインパスの起点からDistance分進んだ座標にActorを移動している。Get Location at Distance Along SplineのCoodinate SpaceがLocalになっていると意図した動作にならないため注意。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3934437/726a1ac6-90f8-4f9c-632a-0d8c65098583.png)
この後はDistanceがスプラインパスの全長を超えていないかを確認。このタスクは1周すると完了扱いになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3934437/0548a06a-4ce9-4cf2-7817-b3e352d237dd.png)
完了しない場合はMovementSpeed分Distanceを加算する。よってMovementSpeedはフレームごとに進む距離を指す。fpsの変動があるとActorの動く速度に変動がでる。（つまり、あんまりいい作りではない）
完了する場合はDistanceをリセットしてタスクを終わらせる。

これでクイックスタートガイドは完了になる。今後も他の公式ガイドについても触れつつ、StateTreeを深堀していく。
【第４回 サーバーワークス 日高僚太さん】2024 Japan AWS Jr. Champions インタビュー企画

こんにちは！2024 Japan AWS Jr. Championsのtekutaです！
AWS Japanが6月に開催したAWS Summit Japanにて、2024 Japan AWS Jr. Championsが発表されました。Jr.Championsは、AWSを積極的に学び、アクションを起こし、周囲に影響を与えている若手エンジニア向けの表彰プログラムとなっております。Jr.Championsについて多くの方に知ってもらいたいため、表彰された方々にインタビューをしていきます。
第4回目は、サーバーワークスの日高僚太さんです！!
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3310014/40d8a38a-e435-ce4a-7ff7-0b87d98d336e.jpeg" width=85%>

https://aws.amazon.com/jp/blogs/psa/2024-japan-aws-jr-champions/

# 質問１：これまでの経歴、現在の業務、AWSを知った経緯を教えてください。
最初はIT業界で就職活動をしていませんでしたが、自信のキャリアを考える中で、ITコンサルタント職に興味を持ちました。ITコンサルタントを調べていくうちにAWSを知りました。
仕事は、プロジェクトマネージャー業務、AWSのコスト・運用・セキュリティ等のコンサルティング業務に従事しています。

# 質問２：Jr.Championsを目指した理由、選出につながったと考える活動があれば教えてください。
目指した理由は2つあります。1つ目は、レベルの高いエンジニアと交流することでAWS学習のモチベーションアップにつながると考えたためです。2つ目は、さまざまな企業の方と交流して、業務内容や働き方など情報交換することで、自身のキャリアに付加価値を付けていきたいと考えたためです。
選出につながった活動は、アウトプットと社内での案件活動です。ブログの投稿や社内での勉強会に加えて、クラウド五輪の国際大会出場などが評価につながったと考えています。

https://www.serverworks.co.jp/news/20231101_WorldSkills_Competition.html

# 質問３：Jr.Championsとして現在どのような活動をしていますか。
Jr.Championsのアウトプット促進チームの立ち上げ及び運用を行っています。「Jr.Championsの全員が悔いのないように活動できるようにする」というビジョンを掲げたチームです。それ以外にも15チームの運営を行っています。

# 質問４：Jr.Championsに選出されてよかったことはありますか。
社外のレベルの高いエンジニアと交流することができてよかったと思います。また、社外の方にJr.Championsの日高さんとして認知してもらえる機会が増えて嬉しかったです！

# 質問５：Jr.Championsに選出されて大変だったことはありますか。
1年間という任期で限られているので、活動する時間が足りないことです。また、業務もあるので活動と両立することは大変だと感じます。

# 質問６：Jr.Championsと併せてAll Certifications Engineersも受賞おめでとうございます！目指そうと思ったきっかけを教えてください。
自身のビジョンから逆算するとAWS認定を1年で12個取得する必要があったため、資格取得に取り組みました。その中で、学習の習慣化を意識しました。詳細は自身が執筆したブログにまとめているので、ご覧ください！

https://sabawaku.serverworks.co.jp/entry/hidaka.study

# 質問７：All Certifications Engineersに選出されてよかったことはありますか。
3つあります。1つ目は、AWSのサービスを広く浅く体系的に知ることができたことです。全体像を知ってから詳細を習得することが自身に合っているので、AWS認定をすべて取得してよかったと感じています。2つ目は、箔が付いたことです。IT未経験かつ若手だったため、表彰のおかげでお客様に信頼をもらうことができました。3つ目は、社内で最短の全認定取得者だったため、知名度が上がったことです。知名度が上がったおかげで、いろいろな方から業務の機会をもらえるようになりました。

# 質問８：今後の夢や目標はありますか。
多くの人がやりがいを持って働ける環境を作りたいと思っています！そのために、AWSを活用して様々な企業の方々がやりがいと持って働けるようにSI業務やコンサルティング業務で支援をしていきたいです。直近の目標はTop EngineersやAmbassadorsを目指して自身に箔をつけつつ、技術力や人間性を高めていきたいです。
加えて、私は4年後、10年後の目標があります。10年後の目標は売上数10億円規模のプロジェクトで通用する人材になることです。そのために4年後の目標は、AWSのことであればアーキテクトから実装まですべてできる人材になること、どの企業相手にもAWSについてコンサルティングできる人材になること、ITの知識を幅広く持つために「聞いたことはあるが、具体的に知らない技術」をなくしていくことです。

# 質問９：Jr.Championsを目指す若手に向けてメッセージをお願いします。
一言「なるしかない、頑張れ」です！
真面目なアドバイスをすると、各社から選出される人数に制限があるので、社内のライバルにいかに差をつけるかが大事だと考えています。

# 質問１０：全体を通しての質問
## 好きなAWSサービスはなんですか。
AWS OrganizationsとAmazon CodeCatalystです。
Organizationsは業務でよく触れており、OUやSCPの設計が大好きです。また、CodeCatalystはサービスだけでCICDができたりと触っていて面白いサービスでした。

## AWSで今後気になっている、触ってみたいサービスはありますか。
基本触ったことないサービスはすべて触りたいです。その中でも特にAmazon Qに触って、他のAIサービスとの違いを勉強したいです。

# 最後に
すでに社内外で多くの実績を残している日高さんは、今後のAWSコミュニティを大いに盛り上げていくのではないかと思います。AWSエンジニアとして見習っていくべきポイントはたくさんありますが、それだけでなくインタビュー中の受け答えも端的かつ丁寧で、技術力だけでなく人間性も高いと感じました。

次回もぜひご覧ください。

![pic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3310014/9bfee9a1-797b-dd29-7e8f-4e5693fbf8d1.png)
【Mac】brewコマンド実行時に「Error: Unexpected method 'appcast' called on Cask アプリ名」が発生

## 概要
MacOSでbrewコマンド実行時に表題のエラーが発生しました。私の場合は対象のアプリが「adoptopenjdk11」だったのですが、adoptopenjdk11以外でも発生するようです。対処方法などメモ書きしておきます。

## 対処方法
[Unexpected method 'appcast' called on Cask](https://github.com/Homebrew/homebrew-cask/issues/173201)のissueで、対処方法が挙げられています。原因としては、Cask経由でインストールされappcastがcallされるものがある場合に発生する模様です。
もし、対象のアプリが不要なら`/opt/homebrew/Caskroom/`配下で対象のものを削除すれば解消するでしょう。

なお、私が行った対処方法は[こちら](https://github.com/Homebrew/homebrew-cask/issues/173201#issuecomment-2143295354)のコメントを参考に以下で解消しました。adoptopenjdkで発生した場合は、おそらく8や11以外のバージョンでも、同じ対処方法でよいかなと思います。

```
1. brew edit --cask adoptopenjdk11
2. Remove or comment out the line containing appcast.
3. brew install --cask adoptopenjdk11 
```
負荷テストツールabコマンドの特徴と使用例

`ab`コマンド（Apache Benchmark）は、Webサーバーやアプリケーションの性能を簡易的に測定するためのツールです。主にHTTPリクエストの負荷テストを行い、サーバーがどの程度のリクエストを処理できるかを確認するのに使用されます。以下に特徴と使用例を挙げます。

---

## 特徴

1. **シンプルで軽量**
   - コマンドラインから利用でき、シンプルな構文で負荷テストを行えます。
2. **HTTP/HTTPSサポート**
   - HTTPだけでなくHTTPSにも対応しているため、セキュアなサイトの負荷テストも可能です。
3. **リクエストごとの統計を出力**
   - テストの結果として、平均応答時間、秒間リクエスト数（QPS: Requests per Second）、失敗したリクエスト数などを出力します。
4. **単純な負荷テスト**
   - 1台のクライアントからの単純な負荷テストを想定しています。複雑な分散型テストには適していません。
5. **高い利用率**
   - Apache HTTP Serverに付属しているため、幅広い環境で利用可能です。

---

## 主なオプション

- `-n [リクエスト数]`：総リクエスト数を指定。
- `-c [同時接続数]`：同時に発行するリクエスト数を指定。
- `-k`：HTTP Keep-Aliveを有効化。
- `-p [POSTデータファイル]`：POSTリクエストを送信する際のデータを指定。
- `-T [コンテンツタイプ]`：POSTリクエスト時の`Content-Type`を指定。
- `-H [ヘッダー]`：追加のHTTPヘッダーを送信。

---

## 使用例

### 基本的なリクエスト送信

Webサーバーに100回のリクエストを送信し、その結果を表示します。

```
ab -n 100 http://example.com/
```

### 同時接続数を指定した負荷テスト

10の同時接続で合計100回のリクエストを送信します。

```
ab -n 100 -c 10 http://example.com/
```

### HTTPSサイトへの負荷テスト

HTTPSサイトに対してテストを実行します。

```
ab -n 100 -c 10 https://example.com/
```

### POSTリクエストのテスト

POSTリクエストを100回送信します。

```
ab -n 100 -c 10 -p post_data.txt -T "application/x-www-form-urlencoded" http://example.com/login
```

`post_data.txt`にはPOSTするデータを記載します（例：`username=test&password=1234`）。

### Keep-Aliveを有効化したリクエスト

HTTP Keep-Aliveを有効にして、10の同時接続で100回リクエストを送信します。

```
ab -n 100 -c 10 -k http://example.com/
```

---

## 結果例の解釈

実行後、以下のような統計が表示されます。

```
Server Software: Apache/2.4.46
Server Hostname: example.com
Server Port: 80

Document Path: / Document Length: 1234 bytes
Concurrency Level: 10
Time taken for tests: 2.345 seconds
Complete requests: 100
Failed requests: 0
Requests per second: 42.65 [#/sec] (mean)
Time per request: 23.45 [ms] (mean)
Time per request: 2.35 [ms] (mean, across all concurrent requests)
Transfer rate: 51.23 [Kbytes/sec] received
```

コードをコピーする

‌

- **Requests per second**: 1秒間に処理できたリクエスト数（QPS）。
- **Time per request**: 1リクエストにかかった平均応答時間。
- **Failed requests**: 失敗したリクエスト数。
- **Transfer rate**: データ転送速度。

---

## 注意点

1. **負荷テストの倫理**:
   - 許可なく他者のサーバーに負荷をかける行為は法律や利用規約に違反する可能性があります。
   - テスト対象のサーバー管理者の同意を得てから実施してください。
2. **過負荷に注意**:
   - `ab`コマンド自体がクライアントマシンのリソースを消費するため、サーバー性能の限界を正確に測定できない場合があります。
3. **分散負荷テストは別ツールを検討**:
   - 分散環境での負荷テストには`Apache JMeter`や`Locust`、`k6`などのツールが適しています。

`ab`コマンドは軽量で素早く負荷テストを行える便利なツールですが、大規模テストには向いていない点を考慮してください。