OmniAICreator/Qiita-1.07M huggingface dataset:
【初心者向け】LightGBMの強みと弱みを分かりやすく解説！

機械学習の分野でよく名前が挙がる「LightGBM（ライトジービーエム）」ですが、その強みや弱みについて簡単に説明できるでしょうか？この記事では、中学生でも理解できるように、LightGBMの特徴を分かりやすくまとめました！これから使いたい方や、基本を知りたい方にぜひ読んでいただきたい内容です。
※この記事は、ChatGPTの出力を基に作成しています。

---

## **LightGBMとは？**
LightGBMは、データからルールを学び、それを使って結果を予測するための「機械学習アルゴリズム」の一種です。特に、大量のデータや高い精度が求められる場合に活躍するツールとして有名です。

---

## **LightGBMの強み**

まずはLightGBMの「ここがすごい！」というポイントを見てみましょう。

### 1. **計算が速い**
LightGBMはデータの処理がとても効率的なので、同じデータ量を扱う場合でも他のアルゴリズムより圧倒的に速く結果を出すことができます。特に、大きなデータを扱うときにその速さが際立ちます。

https://qiita.com/UKI_datascience/items/a163eff935c5c1fb54b7

---

### 2. **予測の精度が高い**
LightGBMは、データを細かく分析して「どんなルールが結果に影響するのか」を見つけるのが得意です。そのため、他のアルゴリズムと比べても、より正確な予測ができることが多いです。

---

### 3. **大量のデータに対応できる**
LightGBMは、大量のデータでもスムーズに動作します。たとえば、数百万件やそれ以上のデータがあっても、高速に処理してくれるので、大規模なプロジェクトでも活躍します。

---

### 4. **カテゴリデータをそのまま使える**
「りんご」「みかん」「ぶどう」などのカテゴリデータをそのまま扱えるのもLightGBMの強み。他のアルゴリズムだと、こうしたデータを数値に変換する必要がありますが、LightGBMはこの手間を減らしてくれます。

---

### 5. **柔軟な設定が可能**
LightGBMは、多くの「設定項目（パラメータ）」を持っています。これを調整することで、速さや精度を自分の目的に合わせてカスタマイズできます。

---

### 6. **欠けているデータにも対応可能**
データの中に空欄や欠けた部分があっても、LightGBMはそれを無視せず、工夫して処理できます。これにより、不完全なデータでも利用しやすいのです。

---

## **LightGBMの弱み**

一方で、LightGBMにはいくつかの欠点もあります。強みを活かすためには、これらの弱みを理解しておくことが大切です。

### 1. **少ないデータに弱い**
LightGBMは大量のデータを前提に設計されているため、データが少ない場合は正しいルールを学ぶのが難しく、精度が低くなることがあります。

---

### 2. **異常値（おかしなデータ）に弱い**
データの中に、極端に大きい値や小さい値が含まれていると、それに引っ張られて間違った判断をすることがあります。異常値を事前に取り除くなどの準備が必要です。

---

### 3. **データの前処理が少し難しい**
カテゴリデータはそのまま使えるとはいえ、正しい形式に整えておかないと結果が悪くなることがあります。また、データの前処理全般に少しコツが必要です。

---

### 4. **設定の調整が大変**
多くの設定があるのは強みですが、その分、最高の結果を得るためには調整が必要です。この調整が大変で、知識や時間が求められることもあります。

---

### 5. **メモリをたくさん使う場合がある**
データが非常に多い場合、計算を速くするためにパソコンのメモリを大量に使います。もしパソコンのスペックが低いと、処理が遅くなったり動かなくなったりすることも。

---

## **まとめ**

LightGBMの強みと弱みを表にまとめると、次のようになります：

| 強み                                     | 弱み                                     |
|------------------------------------------|------------------------------------------|
| 計算が速い                                | 少ないデータに弱い                        |
| 予測の精度が高い                          | 異常値に弱い                              |
| 大量のデータを扱える                      | データの前処理が少し難しい                |
| カテゴリデータをそのまま使える            | 設定の調整が大変                          |
| 柔軟な設定が可能                          | メモリをたくさん使う場合がある            |
| 欠けたデータにも対応できることがある      |                                          |

LightGBMは、計算の速さや高い精度が魅力的ですが、その力を引き出すにはデータの準備や設定の調整が必要です。「大量のデータを効率よく処理したい！」という場合にはとても頼りになるツールなので、ぜひ試してみてください！

---

**この記事が役に立ったらシェアお願いします！**  
これからも分かりやすい機械学習の解説をお届けします！
備忘録：nRF Connect SDK で起きたトラブル対応

# 記事の概要

Nordic の開発ツール nRF Connect SDK のバージョンを更新した際に起きたトラブルとその解決方法をメモしています。

新しい問題を見つける度に更新していきたいと思います

# SDK更新後、ビルドできなくなる

FIle -> Preferances -> Settings -> Extensions -> nRF Connect -> Boards Roots で SDKのバージョンに対応したboardsフォルダのあるパスを設定する。

例えば、v2.9.0ならばC:\ncs\v2.9.0\zephyr とするなど

# APPLICATIONSでAdd build Configuration を選択しても blankウィンドウが表示されるだけで設定できない

nRF Connect for DesktopかWELCOMのManage toolchainsを用いてSDKをアンインストールしてから、再びインストールする

# SDK更新後、nRF Connect のWELCOMとAPPLICATIONSのメニューに何も表示されない

右サイドバーからExploreを選択し、buildフォルダを削除すると回復する場合がある。
回復しない場合は新しいバージョンでアプリケーションを再作成してソースファイルや設定ファイルをコピーする


# SDK v2.8.0に更新後、v2.7.0 で動いていた全く同じプログラムが動作しなくなる

プログラムがmainまで到達しないのを確認した。
SDK v2.9.0 にアップデート後、同現象は発生しなくなった

# SDK v2.8.0に更新後、JLINK でデバッグできなくなる

開発ボードではデバッグできるので、JLINK側の問題と思われる。

SDKのバージョンの問題なのか、nRF53とnRF54の差異による問題なのか、ハード的なエラーかソフト的なエラーなのかを調査中

# prj.confが見つからない

APPLICATIONS -> "アプリケーション名" -> "ビルド名" -> "アプリケーション名+ボード名" を選択した状態で、Config files -> Kconfig を展開すると prj.confがある

# ビルドするとConfigurationがビルドされていないというエラーが表示される

APPLICATIONS -> "アプリケーション名" -> "ビルド名" を選択した状態でビルドしないといけない
【小ネタ】Win11のダークモードをPowerShellで切り替える

# 内容
- Win11のダークモードとライトモードをトグルするスクリプトとなります。
- 設定を開くのがめんどうだったため。

```.ps1
$currentTheme = Get-ItemPropertyValue -Path HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize -Name AppsUseLightTheme; Set-ItemProperty -Path HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize -Name AppsUseLightTheme -Value (1 - $currentTheme) -Type DWord -Force; Set-ItemProperty -Path HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize -Name SystemUsesLightTheme -Value (1 - $currentTheme) -Type DWord -Force; Write-Host ($(if($currentTheme -eq 1){"ダークモード"}else{"ライトモード"}) + "に切り替えました。") -ForegroundColor $(if($currentTheme -eq 1){"Green"}else{"Yellow"}); Stop-Process -Name explorer -Force; Start-Process explorer.exe
```
2025/2/2 ワンライナーに変更

# 実行イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/954892c7-ef93-eb01-e9e3-8bcb01693325.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/2ac2ccb9-3c49-89ec-5ed7-123573551e32.png)
【Rustのまほう2】#25 作ってるゲームを公開します

# ゲームの公開

ひとまずでも公開しておかないとなんとなくこの記事シリーズが締まらないので、この記事を読んでくれた人に向けて開発中のゲームをお見せしておきます。ブラウザ版の動作環境は **Desktop版Chromeのみ** なのでご注意ください。音が出ます。

https://magiaforge.app/

操作方法はゲーム内の床に書いてあります。ダンジョンの奥にいるボスを討伐すればひとまずゲームクリアっぽい画面が出るようになっていますので、それを目指してみてください。まだまだ開発途中なのですが、私がどんなゲームを作りたいのかくらいは伝わるのではないかと思います。以下は召喚魔法のみでボス討伐ができるかテストをしていて、敵も味方も召喚ばかりで乱戦になった図。

![スクリーンショット 2024-12-24 202702.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64695/7bdc0ab4-838e-0b79-1dad-3b8d546f90d0.png)

タブキーでインベントリを開き、呪文をインベントリから画面左下の呪文スロットにドラッグアンドドロップすると、スロットの呪文を組み替えられます。いろんな組み合わせを試してみてください。ちゃんと動かなかったらごめんなさい。セーブ機能はまだなくてブラウザをリロードすると最初からになってしまいますので注意してください。







# オンラインマルチプレイもあるよ

オンラインマルチプレイも試せるようになっています。最初の拠点からマルチプレイ用のフロアに進むと、他のプレイヤーがいれは相手のキャラクターが見えるはずです[^online]。ブラウザのタブを２つ開いて自分で試すこともできます。私もときどきマルチプレイ用のフロアでキャラクターを動かして開発やテストしているので、タイミングが合えば遭遇するかもしれません。

[^online]: 既知の問題で、たまにマルチプレイを開始しても他の人がまったく見えないことがあります。これはサーバーインスタンスが同時に複数起動し、他の人とは別のサーバーインスタンスに接続してしまっていることが原因のようです。もしその不具合が起きていたら、数分待ってから入り直してみてください。

マルチプレイについてはまだまだまったくテスト不足で、何人くらいまでまともにプレイできるのかもわかってません。また日時を決めてテストプレイに付き合ってくれる人を募集しようかなと思っています。以下は、自分でマルチプレイのテストを試みたものの、手があと二本足りなくてロクなスクリーンショットが撮れなかったときの画像。

![スクリーンショット 2024-12-24 201856.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64695/c2da0cd5-d7ff-c581-4ac0-eeceedc88bc5.png)




# アドベントカレンダーを完走した感想ですが

これにて今年のひとりアドベントカレンダーは完結です。Bevyについては書けるTipsがまだ無数にあるんですが、とても書ききれないのでひとまずここまでです。Rust/Bevyでゲームを作ることに興味をもった方がいればぜひやりましょう。

Bevyはまだ新しいエンジンですが、コア部分の完成度は十分でかなり実用性は高いなと思いました。Entity Component Systemは面倒な部分もあるものの、慣れればそれなりに快適に書けます。オブジェクト指向的なフレームワークのほうが良かったかというとそんなこともないです。今回私が作っていたような2Dのゲームであれば、機能不足で困るようなことはあまりないでしょう。あるとしたら、[テキストにアウトラインを付ける機能がない](https://github.com/bevyengine/bevy/issues/7210)、背景にブラーをかける効果が欲しくて[bevy_blur_regions](https://github.com/atbentley/bevy_blur_regions)を試してみたのですがデスクトップでしか動かず断念、などの課題が残っています。

Bevyで特に未成熟なのは、UIやオーディオの部分のようです。Reactのように状態と外観を分けて書くのになれていると、BevyビルトインのUI機能はステートフル、古代のGUIプログラミングをしているようなつらいものを感じます。そのため[egui](https://github.com/emilk/egui)、[iced](https://github.com/tasgon/bevy_iced)などのUIツールキットが登場していますし、最近では [hui](https://github.com/Lommix/bevy_hui)というものも登場するなど、まだかなり混戦状態という感じです。オーディオも機能不足で、たとえばBGM切り替え時のボリュームのフェードアウトなんかも必須の処理ですが、そういう機能も自分でコーディングが必要です。そのため[bevy_kira_audio](https://github.com/NiklasEi/bevy_kira_audio)というプラグインがよく使われているようです。

Rustにありがちな所有権の問題は、Bevyの設計のおかげなのかほとんど気にならなかったです。ゲーム開発の特性もあって、非同期処理まわりもほとんど意識せずに書くことができたのですが、WebSocket関連のプラグインを作ったときだけがっつりと非同期処理に触れました。Rustの非同期処理はけっこう面食らいました……。Rustはまだ習熟したとは言いづらいですが、やりたいと思ったことはすべて自力で書けている、という感じです。

このゲームの開発はまだまだ続きますので、よかったら応援してやってください。完成したあかつきにはデスクトップ版をSteamで販売できたらいいですね。

![スクリーンショット 2024-12-24 201336.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64695/28624968-dbbb-3e9e-bf91-9078d828b0b5.png "タイトル画面")
mindの研究 その93

# 概要
mindが、謎なので調べてみた。
練習問題やってみた。

# 練習問題
文字列を連結せよ。

# サンプルコード

```
出力ファイルは　ファイル。
入力ファイルは　ファイル。

メインとは
　文字列1は　文字列
　文字列2は　文字列
　「data1」を　文字列2に　入れ
　「ren.txt」で　出力ファイルを　新規オープンし
　「"data0" "」を　出力ファイルに　書き込み
　文字列2を　出力ファイルに　書き込み
　「"」で　出力ファイルに　一行書き込み
　出力ファイルを　クローズし
　「ren.txt」で　入力ファイルを　オープンし
　入力ファイルから　一行読み出し　文字列1に　入れ
　入力ファイルを　クローズし
　文字列1を　一行表示し
。



```

# 実行結果

```
>ren0
"data0" "data1"
```

以上。
AgonLight2にFuzixが移植されたので早速起動した話

## はじめに
　8ビットCPUやマイクロコントローラで動作するUNIX風OSにFuzixがあります。

https://github.com/EtchedPixels/FUZIX

　Z80で動作するUNIX風OSのuziに起源をもつので、Z80とその派生CPUで動作するコンピュータに多数移植されています。

https://www.dougbraun.com/uzi.html

https://p112.sourceforge.net/uzidoc.html

　今回取り上げるAgonLight2には、eZ80のCPUが搭載されています。CPUを含む周辺機器の部品も現在製造されている部品で構成されているのが特徴です。

https://olimex.wordpress.com/2024/03/20/agonlight2-the-fastest-z80-retro-computer-development-is-remarkable/

https://github.com/OLIMEX/AgonLight2

FuzixのeZ80移植例として、EZ-Retroのボードが知られていますが、2024年12月現在、回路図掲載サイトが消失しており、実機での実証ができない状態でした。

FuzixのgithubサイトのISSUEで、eZ80搭載ボードへの移植が20223年中頃に話題になっていましたが、移植されたとの報告はありませんでした。

そのような状態の中、2024年12月にAgonLight2用Fuzixが公開されました。

https://github.com/tomm/FUZIX/tree/platform-agon-light/Kernel/platform/platform-agon-light

README.mdを読むと、EZ-Retroのポートを参考にしたことがわかります。
本稿では、AgonLight2での動作確認を速報いたします。

## AgonLight2用SDカードの準備
　使用したボードのBIOS（？）に相当する「Quark VDP」と「Quark MOS」のバージョンは、「1.03」です。
　使用するマイクロSDカードはFAT32フォーマットのものを使います。
　Fuzix起動するのに必要なファイルである「agon-fuzix-0.5-5.tar.gz」を、以下urlからダウンロードします。

https://github.com/tomm/FUZIX/releases/tag/v0.5-agon5

ダウンロードしたファイルを解凍すると「fuzix.bin」と「fuzix.rootfs」が得られます。
これらのファイルをSDカードにコピーします。

コピーが終わったらAgonLight2のSDカードスロットにSDカードを差し込んで起動します。
コマンドプロンプト「*」が表示されたら、fuzix.binをロードして、実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/f1cdbd94-916f-6d19-447d-6e4b8c63fb45.png)

```
* load fuzix.bin
* run
```
と入力すると、fuzix.binが実行され、Fuzixのカーネルが起動します。

「Enter new date:」と「Enter new time:」はエンターキーを押すだけにしています。
「login:」が表示されたら、「root」を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/f6bae131-533c-5e52-fa08-ff76e124fb17.png)
起動の記念に、「banner」コマンドを使いました。

## おわりに
　2024年も、Fuzixに大きな変化がありました。その中で、Raspberry pi pico2搭載CPUのRP2350への対応とAgonLight2への移植が、個人的には印象深い話題でした。
　2025年も、OSの機能拡張と新たな機種への移植のニュースが楽しみです。
【Unity】Maskを使ったアニメーション作成

## はじめに
UIデザインで欠かせない機能のひとつがMaskの活用です。

MaskとAnimationを組み合わせることで、UIの印象を大きく変える格好いいデザインが可能になります。

ただちょっと扱いが難しいところもあるので、覚書もかねての簡単なアニメーション作成手順をまとめました。



## さっそく作成！

まずは`Image`や`Text`を用意します。

![UI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327956/22f991d7-b93a-fb9e-05d0-8f670268977f.png)


<br><br><br>

親の`Image`に`Mask`コンポーネントを付けます。

![UI2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327956/7a10eead-3609-9cbc-63bd-b435cedd478b.png)

すると子に配置したオブジェクトが親の形にクリッピングされます。

でもテキストは表示したい…

<br>
そんな時は表示したいオブジェクトを選択し、インスペクターでMaskableのチェックを外します。

![UI3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327956/6c0f8c0c-0d34-a40e-3b5e-51f3d288ceb7.png)

表示された！

## アニメーション作成

次にアメーションの作成に入ります。
フォルダの適当な場所を右クリックし、`Create > Animation`を選択し、`Animation Clip`を作成します。

![UI4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327956/36338ede-57ba-b419-e98a-9a533dfa0556.png)

<br><br>
`Image`のオブジェクトを作成し、`Mask`と`Animation`コンポーネントを追加してアニメーションさせたいオブジェクトを子に入れます。

Animationコンポーネントに先ほど作ったAnimation Clipをアタッチします。

![UI5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327956/887a2c37-6e6a-0d97-129b-8ca8dcb46a58.png)

＊通常は`Animation Controller`の作成と`Animator`コンポーネントを使いますが、今回は単発アニメーションなので`Animation`コンポーネントの使用にしています。
もっと複数のアニメーション遷移やトリガーを使いたい場合は前者の方法を使いましょう。
<br><br><br>

`Animation Clip`をクリックし、Animationウィンドウを起動します。

Add Propertyで`Mask`の`Size.Delta`を選びます。
バーを0:00に合わせ、Xの値を0にします。

![UI6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327956/63d284e1-ce8f-2f72-d52f-5e89ef751c66.png)

<br>
Animationコンポーネントがついているオブジェクトを選択し、Animationウィンドウの再生ボタンを押すとテキストが左から現れるアニメーションができました。

![UI7-ezgif.com-video-to-gif-converter.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327956/52ff371c-159a-887a-93d8-1a992f42296b.gif)

＊Animationをループさせたい場合は`Animation Clip`のインスペクターにある`Loop Time`にチェックを入れます。

＊また、右から左へ現れるようにしたい場合は親の`Pivot`を1に、子の`Anchor Presets`を`right middle`にしてみてください。
今回は`Pivot`を0、`Anchor Presets`を`left middle`にしています。
<br><br>

***
<br><br>
実はMask、親のImageのアルファ値が0だと機能しなくなってしまいます。
親の画像の形に切り取るのには便利ですが、親を透明にしたい時には不便。

▼ このように子ごと消えてしまいます。

![UI8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327956/599b2ff2-6673-7cda-018e-e330ecd0fd12.png)
<br>

最低でも0.2くらいにしないといけませんが、うっすら下に色が見えて不格好…

そんな場合は`Rect Mask 2D`コンポーネントを使います。
こちらをMaskの代わりに入れるだけで画像のアルファ値を0にしても機能します。

![UI9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327956/3ff0360d-a081-7d28-a48a-ed4d7fdb348e.png)

## おわりに
今回はMaskを使用したアニメーションの作成手順をまとめてみました。

Maskは非常に便利ですが、アルファ値を0にできないといった落とし穴に気づかないこともあり、私自身躓いてしまった部分でもあります。

また、左から右へ現れるようにするアニメーションの作成も非常に悩んだ部分だったので忘れないうちにアウトプットできてよかったです。

今回の記事はほとんど覚書のような内容になってしまいましたが、自分が行き詰まったこの経験が、同じように悩む誰かの助けやヒントになれば嬉しいです。
<br><br>

### 使用サイト

* GIF変換サイト：[Ezgif](https://ezgif.com/video-to-gif)
VoIPとSIPを通じてRustを勉強する：SIP/SDP

今回の記事ではIP電話のプロトコルであるSIP/SDPについて記載してみたいと思います。

# SIPとは
## 概要
ネットワーク上で音声などのセッションを確立、変更、終了のためのプロトコル。
#　主な機能
- セッションの確立
- セッションの管理
- セッションの終了
# メッセージの種類
- INVITE
- BYE
- REGISTER
- ACK
- OPTIONS

# SDPとは
## 概要
通信セッションにおけるメディア情報の内容や条件を記述するプロトコル。
## 役割
- 通信に使用するメディアの種類やフォーマット、ネットワークパラメータを相手に伝える
## 主な情報
- セッション情報
- ネットワーク情報
- タイミング情報方法
[AWS IAM] AWSリソース間のIAMロール接続権限設計 ～セキュリティと効率を両立する設計の極意～

～IAMロールの使いこなしで、セキュリティと効率の両立を目指す～

AWSリソース間の接続権限を設計する際、IAMロールはまさに舞台の主役。彼らが持つ「ポリシー」という衣装を上手に選び、セキュリティというオーケストラを奏でましょう。今回の記事では、ポリシーの衣装選びからダンスの振り付けまで、AWSセキュリティのパーティーに欠かせない基礎を解説します。

---

<a id="basic-principle"></a>  
### 1. 基本原則：リクエスト元が主役  

AWSでは、「リクエストを発信するリソース」が舞踏会の主役。彼らに適切な権限（IAMロール）を与え、接続先リソース（舞台）で自由に動けるようにします。  
- **理由**: AWSでは権限はリクエスト発信者に付与されるルールです。誰が何をするのか、これが全ての始まり。

#### **例え話**  
Lambda関数はパーティーの来客。DynamoDBが提供するケータリングサービスを利用するには、Lambdaに「GetItem」「PutItem」というメニュー（ポリシー）を渡しておきます。

---

<a id="least-privilege"></a>  
### 2. 最小権限の原則：派手すぎない衣装を選ぼう  

舞踏会でのルール：派手すぎる衣装は目立つだけでなく、トラブルを招きます。同様に、IAMポリシーには必要最低限の権限だけを記載します。

#### **最小権限のメリット**  
1. **セキュリティ向上**: 不要な権限を付与しないことで、悪意ある操作を防止。  
2. **管理の容易さ**: ポリシーがシンプルだと、トラブル時も迅速に対応可能。

#### **派手すぎないポリシーの例**  
```json
{
  "Effect": "Allow",
  "Action": "s3:GetObject",
  "Resource": "arn:aws:s3:::example-bucket/*"
}
```
- シンプルで美しい。「GetObject」だけを許可し、リソースを特定のバケットに限定。

---

<a id="iam-policy"></a>  
### 3. IAMロールとポリシー：誰がどんな役割で踊るのか  

#### **IAMロールの役割**  
IAMロールはリクエスト元リソースの衣装係。適切なポリシー（権限）を用意して、主役が舞台でスムーズに踊れるよう手配します。

#### **ポリシーの構成要素**  
- **Effect**: 許可するか、拒否するか。AWSの白黒ハッキリな性格が光る部分。  
- **Action**: 許可する操作（例：`dynamodb:GetItem`）。  
- **Resource**: 操作対象の具体的なリソース（例：ARNで指定）。

---

<a id="practical-examples"></a>  
### 4. 実践例：AWSリソース間のパートナーダンス  

#### **接続元と接続先のカップル一覧**  
| 接続元          | 接続先        | 必要なポリシー                                                |
|-----------------|--------------|------------------------------------------------------------|
| **Lambda**      | DynamoDB     | GetItem, PutItem操作を許可。対象テーブルをARNで限定。        |
| **EC2**         | S3           | バケットへのPutObject操作を許可。対象バケットを指定。        |
| **ECSタスク**   | RDS          | RDSインスタンスへの接続を許可（IAM認証を使用）。              |
| **CloudWatch**  | SNSトピック  | SNSトピックへのPublish操作を許可。                          |

#### **ポイント**  
1. **リクエスト元に権限を付与**: 主役は常にリクエストを送信する側。  
2. **ARNでリソースを特定**: 具体的なリソースに絞ることで、不要な権限を防止。  
3. **操作ごとに分離**: 読み取り専用や書き込み専用など、ポリシーを用途別に分ける。

---

<a id="conclusion"></a>  
### 5. まとめ：エンディングの一礼  

AWSリソース間の接続権限設計は、舞踏会のようなものです。  
- 主役（リクエスト元）が輝けるよう、適切な衣装（IAMロール）を選びましょう。  
- 派手すぎず、シンプルな衣装（最小権限）を心がけることが成功の秘訣です。  
- 正しいポリシー設計が、セキュリティというオーケストラを成功に導きます。

AWSの舞踏会で、安全かつ華麗に踊りましょう！  
> **余談**: ポリシーを見直すのは定期的な衣装チェックと同じ。安全なシステム運用のために、怠らないように！
今年のふりかえり

メリークリスマス！
早いものでもうクリスマスですね。
無職だった去年と異なりバリバリ仕事しながらアドベントカレンダー書いたので本当書いてるものの室が悪くなってしまいました。。。
登録してくれた方申し訳ないです。。。
来年はがんばります。

## アドベントカレンダー
当初はIP電話関連の会社に就職したこともありSIP/RTPなど仕事と関係のある記事を書いてソースコードも書きたいなあと思っていました。
しかしながら時間が取れず中途半端に終わってしまいました。
仕事しながらアドベントカレンダー書いてる方すごいなあ。

# 来年の仕事について
SIPの理解もそうですが、前の記事にもあったとおり今の電話は音声認識、自然言語処理をはじめとした人工知能も使っていきます。
今後はそういう分野にも取り組んでいきたいです。すでに偉い人にはアピール済みです。
顧客満足度を上げていきたいです。

# まとめ
あと当方のアドベントカレンダーを読んでくれた方、購読してくれた方ありがとうございました。
来年もよろしくおねがいします。よいクリスマス、よいお年を。
それでは。
【Rustのまほう2】#24 物理エンジン　衝突グループ

物理エンジンの設定項目で、密度や摩擦、外力などはまあイメージしやすいと思います。比較的わかりにくい項目に衝突グループの設定があります。現実世界の再現という意味ではあまり使う必要がないのですが、ゲームではこの衝突グループの設定は非常に重要なので解説しておきます。


# 衝突グループとは

**衝突グループ** とは、どの物体がどの物体と衝突し干渉するかを制御するものです。え？どの物体どうしでも衝突者するでしょ？と思うかもしれませんが、それは現実世界の話であって、ゲーム世界では少し事情が異なります。

たとえば、敵キャラクターが発射した弾丸が別の敵キャラクターに衝突してしまうと、あっさり同士討ちが始まってしまってゲームになりません。またプレイヤーキャラクターが自分の撃った弾丸に自分が当たって自傷ダメージを受けたりしかねません。さらに、弾丸が地面に散らばっている金塊にまで衝突したら、敵に当たる前に地面の金塊に当たって弾丸が消滅してしまいます。

このように、ゲームでは物理法則を無視してある種の物体同士が衝突せずにすり抜ける設定ができたほうがいいです。この設定が衝突グループです。

# 衝突グループの設定

Rapierでは衝突グループはあらかじめ32個用意されていて、これらを各物体に割り当てていきます。`Group::GROUP_1`などの数字ではわかりづらいので、先にエイリアスを用意しておきます。

```rust
pub const ENTITY_GROUP: Group = Group::GROUP_1;

pub const WALL_GROUP: Group = Group::GROUP_3;

pub const WITCH_GROUP: Group = Group::GROUP_5;

pub const WITCH_BULLET_GROUP: Group = Group::GROUP_6;

pub const ENEMY_GROUP: Group = Group::GROUP_6;

pub const ENEMY_BULLET_GROUP: Group = Group::GROUP_7;

pub const MAGIC_CIRCLE_GROUP: Group = Group::GROUP_8;

pub const SENSOR_GROUP: Group = Group::GROUP_9;

pub const DOOR_GROUP: Group = Group::GROUP_10;

pub const RABBIT_GROUP: Group = Group::GROUP_11;
```

それから、各剛体に`CollisionGroups`コンポーネントとして割り当てます。最初の引数`memberships`は自分が所属する衝突グループ、2つ目の引数`filters`が自分がどの衝突グループと衝突するかです。衝突グループどうしはビット演算のOR `|` で複数のグループを指定できます。

```rust
CollisionGroups::new(
    match actor_group {
        ActorGroup::Enemy => ENEMY_GROUP,
        ActorGroup::Player => WITCH_GROUP,
    },
    match actor_group {
        ActorGroup::Enemy => WITCH_BULLET_GROUP,
        ActorGroup::Player => ENEMY_BULLET_GROUP,
    } | ENTITY_GROUP
        | WALL_GROUP
        | WITCH_GROUP
        | ENEMY_GROUP
        | RABBIT_GROUP,
),
```

私が作っているゲームでは、各キャラクターはプレイヤーと敵側に分類されます。味方のプレイヤー側として召喚されることもあるので、スライムなどのモンスターも味方の衝突グループ`WITCH_GROUP`と条件分岐で切り替わるようになっています。また、そのキャラクターが味方側の場合は味方の弾丸の衝突グループ`WITCH_BULLET_GROUP`には衝突しないし、その逆もまた然り、と条件分岐で切り替えています。どのキャラクター同士も身体はぶつかりますし、壁にもぶつかるので、`ENTITY_GROUP | WALL_GROUP | WITCH_GROUP | ENEMY_GROUP | RABBIT_GROUP`とそのほかの衝突グループを列挙しています。

同様に弾丸にも衝突グループを設定します。弾丸を発射したキャラクターの種別に応じて、次のように`memberships`と`filters`を設定しわけています。

```rust
memberships: match actor.actor_group {
    ActorGroup::Player => WITCH_BULLET_GROUP,
    ActorGroup::Enemy => ENEMY_BULLET_GROUP,
},
filters: match actor.actor_group {
    ActorGroup::Player => ENEMY_GROUP,
    ActorGroup::Enemy => WITCH_GROUP,
} | ENTITY_GROUP
    | WALL_GROUP
    | RABBIT_GROUP,

```

さらに設定を工夫するなら、たとえば`filters`から`WALL_GROUP`を取り除けば、壁をすりぬけて移動できる幽霊型モンスターも作れるでしょう。

またショップの店員は、ショップの外に押し出そうとしても見えない壁に阻まれて外に行かないようになっています。というのも、プレイヤーが未精算の商品を持っているとショップの扉が開かなくなり万引きができないようになっているのですが、その際に店員が扉の外にいると会計ができなくなって詰んでしまうからです。こういう制御も衝突グループで行っています。



# 参考資料

Rapierの公式ドキュメントを隅々まで目を通しましょう。見落としがあるとハマって死にます。

https://rapier.rs/docs/user_guides/bevy_plugin/getting_started_bevy

少し古いですが、以下の資料も参考になります。

https://taintedcoders.com/bevy/physics/rapier
Power Automate for desktopのOffice 365 Outlook「メールを取得する（V3）」アクションを使ってみた

## はじめに
業務改善の一環として、デスクトップの自動化を図るためにPower Automate for desktopを活用しています。

デスクトップ上の処理を自動化するための便利なアクションがたくさんあり、一部にはクラウドコネクタも存在します。そのなかには「Office365 Outlook」コネクタもあります。

今回はWEBシステムへログインする際に、IDとパスワードでログインした後にメールで送られてくる確認コードを入力する場面で「メールを取得する（V3）」アクション使用してみました。

簡単な記事ですが、現場からお届けします🤖

![スクリーンショット 2024-12-19 141943.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953195/09ccb0fb-468c-085f-e33d-9339febb8d37.png)

## 注意点
- **Office 365 OutlookアクションはPower Automate Premiumライセンスが必要です**。
- **RPAで操作してはいけないウェブサイトもあります。利用規約等にご注意ください**。
- **IDやパスワードは大切な情報です。第三者に知られないよう適切に管理しましょう**。

## 使用した場面
このアクションを使ったシナリオとして、WEBシステムのログイン画面でIDとパスワードでログインした後、さらにメールで送られてくる確認コードを入力してログインするものです。

![スクリーンショット 2024-12-19 163236.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953195/f11d6e7b-e9c9-e875-b754-87a77f602fba.png)


Power Automate for desktopにはOutlookアプリのアクションがありますが、Outlookアプリを起動した直後に送受信の同期に時間がかかる場合や、うまくアプリが立ち上がらないなどフローがつまずくことがありました。

そこでより安定した処理を実現するために、「Office365 Outlook」アクションにある「メールを取得する（V3）」を使い、メール本文から確認コードを取得する流れを作りました。

「メールを取得する（V3）」アクションを使うことで、指定した条件に合うメールを効率的に取得し、その後の処理に利用できます。

## アクションの設定
以下のアクション構成で実装しました（ID・パスワードによる1回目のログイン後）

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953195/6beb6bb7-c948-05b4-7e81-de383a525a8d.png)


１. **待機**
１回目のログインボタンを押下後、システムからメールが送信されるまでの待機時間として10秒待機させています。

２. **メールを取得する（V3）**
このアクションで、システムから送信されたメールを取得します。「宛先」や「差出人」、「件名」等でフィルタリングし、該当するメールを取得します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953195/a14d2b7d-3846-956a-9df0-454b45711c7e.png" width=50%>

取得したメールはフロー変数「GetEmailsV3Response」に格納されます。

３. **テキストのトリミング**
取得したメールの本文から不要な部分を取り除きます。これにより、特定のキーワードを基準に確認コード部分だけを切り出します。

今回は、メール本文内の鍵括弧の中に確認コードが記載されているため、鍵括弧を前後のフラグとして設定し、確認コードを取得しました。

![スクリーンショット 2024-12-22 110155.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953195/ca8510cd-4494-61cc-3159-5814c15ea020.png)

４. **Webページ内のテキストフィールドに入力する**
トリミングで取得した確認コードをWEBシステムのログイン画面の確認コードフィールドに入力します。

５. **Webページのボタンを押す**
ログインボタンを押して、ログインプロセスを完了させます。

ログインが無事に完了したことを確認するために、「Webページのコンテンツを待機」など特定のテキストや要素が表示されているかをチェックするアクションを加えたり、また、メールが届かない場合や、メールのフォーマットが変わった場合に備えて、エラー処理を組み込んでおくと安心です。

## 最後に
もっと良い方法がたくさんあると思いますが、今のところフローがつまずくこともなく、安定して稼働しているのでとても助かっています。

その他にも「Office365 Outlook」コネクタを使うことで、メールに記載された情報をExcelに入力するなど、様々な業務に活用できそうです。

クラウドフローで完結できるなら無理に使わなくても良いかと思いますが、市民開発者としては取れる手段が増えることで助けられることは多くあると思います。

簡単ですが、現場からは以上となります🤖
LaunchCharacterでキャラクターを移動させるときのメモ

# 地面に接地している時と、していない時
LaunchCharacterで移動させるときに地面に接地しているときとしていない時で吹っ飛ぶ距離が違う
地面に接地している場合は摩擦の影響を受けるため

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/de1457a6-c3fe-8493-dd5e-b8a3244ff074.png)

# 対応メモ

どちらの場合も同じぐらいにしたかったのでJumpで少し浮かせてから
LaunchCharacterで吹っ飛ばすことで対応
インターネットの基礎知識：IPv4とIPv6を徹底比較

インターネットプロトコル (IP) は、インターネット上でデバイス間の通信を可能にする基本的な技術です。現在、IPv4 (Internet Protocol version 4) と IPv6 (Internet Protocol version 6) の2つの主要なバージョンが使用されています。本記事では、それぞれの違いと使い方について解説します。

## IPv4とIPv6の基本的な違い

### 1. アドレスの形式
- **IPv4**: 32ビット長のアドレスで構成され、約43億 (2^32) 個のユニークなアドレスを提供します。形式は「192.168.1.1」のようにドットで区切られた4つの10進数で表されます。
- **IPv6**: 128ビット長のアドレスで構成され、理論上340澗 (2^128) 個のアドレスを提供します。形式は「2001:0db8:85a3:0000:0000:8a2e:0370:7334」のようにコロンで区切られた16進数で表されます。

### 2. アドレスの枯渇問題
IPv4は利用可能なアドレス数が限られているため、すでに多くの地域でアドレスが不足しています。一方、IPv6は膨大なアドレス空間を持つため、この問題を解決します。

### 3. ネットワーク構成の簡素化
IPv6は以下の点でIPv4より効率的です:
- **自動設定**: IPv6では、デバイスが自動的にIPアドレスを設定できる「ステートレスアドレス自動設定 (SLAAC)」をサポート。
- **ルーティングの効率化**: よりシンプルでスケーラブルなルーティング設計。

### 4. セキュリティの強化
IPv6は、IPsec (IP Security) を標準でサポートし、通信の暗号化と認証を提供します。一方、IPv4ではIPsecはオプションとして実装されます。

### 5. その他の違い
- **ヘッダの構造**: IPv6のヘッダはIPv4より簡素化されており、処理効率が向上。
- **ブロードキャストの廃止**: IPv6ではブロードキャストが削除され、代わりにマルチキャストやユニキャストが使用されます。

## IPv4とIPv6の共存
現在、IPv4とIPv6は並行して利用されています。この移行期には、以下の技術が使用されます:
- **デュアルスタック**: デバイスが同時にIPv4とIPv6の両方をサポート。
- **トンネリング**: IPv6パケットをIPv4ネットワーク上でカプセル化して送信。
- **NAT64**: IPv6デバイスがIPv4と通信するための変換技術。

## IPv6への移行のメリット
1. アドレス不足の解消。
2. ネットワークの効率化と管理の簡略化。
3. セキュリティ機能の強化。

## 使い方の具体例

### IPv6を有効にする手順 (Windowsの場合)
1. **ネットワーク設定を開く**: 「ネットワークと共有センター」を開きます。
2. **アダプターの設定を変更**: 使用中のネットワークアダプターを右クリックし、「プロパティ」を選択。
3. **IPv6を有効化**: 「Internet Protocol Version 6 (TCP/IPv6)」にチェックを入れます。
4. **適用する**: 設定を保存して再起動。

### IPv6対応サイトへの接続
IPv6を有効にした後、IPv6対応のウェブサイトやサービスに接続してみましょう。例えば、GoogleやFacebookはIPv6をサポートしています。

## 結論
IPv4とIPv6にはそれぞれ異なる特徴と用途がありますが、将来的にはIPv6が主流となると考えられています。現時点での最善策は、IPv4とIPv6を併用しながらIPv6への移行を進めることです。ぜひ本記事を参考に、IPv6の利用を検討してみてください。
【自習】AWS CloudWatch

PMする上で必要になってきたのでおさらい

https://docs.aws.amazon.com/cloudwatch/?icmpid=docs_homepage_mgmtgov

## **AWS CloudWatchとは？**

AWSが提供する**モニタリングと管理のためのサービス**。  
AWSリソースやアプリケーションの動作状況をリアルタイムで監視し、ログデータを収集・分析してシステムの安定性を維持。

## **CloudWatchの主な機能**

1. **メトリクスの監視**
   - AWSリソース（例: EC2、RDS、Lambda）のパフォーマンス指標を可視化。
   - 例: CPU使用率、ディスクI/O、メモリ使用量。

2. **ログの収集と分析**
   - アプリケーションログ、システムログを集約。
   - CloudWatch Logsを利用してログを検索、フィルタリング、分析可能。

3. **アラームの設定**
   - 定義した条件（例: CPU使用率が80%を超えた場合）でアラートを送信。
   - Amazon SNSでメールやSMS通知を設定可能。

4. **ダッシュボードの作成**
   - リアルタイムでメトリクスを可視化するカスタムダッシュボードを作成。

5. **イベントのトリガー**
   - 特定の条件でAWSリソースを自動起動・停止。
   - 例: EC2インスタンスのスケジュール起動/停止。

6. **トレースとトラブルシューティング**
   - CloudWatch ServiceLensを利用してアプリケーション全体のトラブルシューティングを実施。

## **CloudWatchの主な用途**

#### **1. リソースの監視**
- **シナリオ**: EC2インスタンスのCPU使用率を監視。
- **方法**:
  - メトリクスをCloudWatchで収集。
  - 使用率が80%を超えた場合にアラームを送信。

#### **2. アプリケーションログの管理**
- **シナリオ**: Lambda関数のログを収集し、エラー発生時に通知。
- **方法**:
  - CloudWatch LogsにLambdaのログを送信。
  - エラーログをトリガーにしてSNSで通知。

#### **3. コスト管理**
- **シナリオ**: AWSのリソース使用状況をモニタリングし、不要なリソースを削減。
- **方法**:
  - スケジュールイベントで、非稼働時間にEC2を停止。

#### **4. SLAの監視**
- **シナリオ**: Webアプリケーションの応答時間を監視。
- **方法**:
  - CloudWatch Syntheticsを利用してエンドポイントのヘルスチェックを自動化。

#### **5. トラブルシューティング**
- **シナリオ**: RDSのパフォーマンス低下の原因を特定。
- **方法**:
  - CloudWatch Logs Insightsを使い、クエリパフォーマンスを分析。

## **CloudWatchの料金**

CloudWatchは利用する機能ごとに料金が発生します。

1. **メトリクス**
   - 標準メトリクス: 無料（AWSリソースごとに提供）。
   - カスタムメトリクス: `$0.30/メトリクス/月`。

2. **ログ**
   - データの取り込み: `$0.50/GB`。
   - データの保存: `$0.03/GB/月`。

3. **アラーム**
   - 標準アラーム: `$0.10/アラーム/月`。
   - 高度なアラーム: `$0.30/アラーム/月`。

4. **ダッシュボード**
   - 最初の3ダッシュボードは無料。
   - 以降、`$3.00/ダッシュボード/月`。

## **CloudWatchの導入手順**

#### **1. メトリクスの監視**
1. AWSコンソールで「CloudWatch」を開く。
2. 「メトリクス」を選択し、監視対象リソースを選ぶ（例: EC2インスタンス）。
3. メトリクスグラフを確認。

#### **2. アラームの設定**
1. CloudWatchコンソールで「アラーム」を選択。
2. 新しいアラームを作成。
   - メトリクス: 例) CPU使用率。
   - 条件: 80%以上。
3. 通知先としてSNSトピックを設定（メールやSMS）。

#### **3. ログの収集**
1. CloudWatch Logsに対象サービス（例: Lambda）のロググループを作成。
2. サービス設定でCloudWatch Logsへの出力を有効化。

#### **4. ダッシュボードの作成**
1. CloudWatchコンソールで「ダッシュボード」を選択。
2. カスタムダッシュボードを作成。
3. メトリクスやロググラフを追加。

## **CloudWatchのメリットとデメリット**

#### **メリット**
1. **AWSリソースと統合**
   - AWSリソースのメトリクスやログが簡単に取得可能。
2. **リアルタイム監視**
   - システムの状態をリアルタイムで可視化。
3. **自動化のトリガー**
   - 特定のイベント発生時に自動でアクションを実行可能。

#### **デメリット**
1. **コストの上昇**
   - 大量のメトリクスやログを扱う場合、コストが増加する。
2. **複雑な設定**
   - 初心者には設定が複雑に感じる場合がある。

## **CloudWatchのベストプラクティス**

1. **不要なログデータの削除**
   - 必要のないロググループや古いデータを定期的に削除。

2. **アラームの最適化**
   - 過剰なアラームを避け、重要なものだけを設定。

3. **メトリクスフィルタリング**
   - 必要なメトリクスだけをダッシュボードに追加し、見やすくする。

4. **コスト管理**
   - 保存期間やデータ量を定期的に確認してコストを最適化。

## 感想
AWS基本セットの定番なイメージ。導入ハードル低そうなので今度試す。
ＱＣ７つ道具の活用（特性要因図）

## QC７つ道具とは
私がこれらを習ったのは、かれこれ３０年ほど前になりますが、今でも使われている方法、というくらい実績のある手法です。なかには、グラフやチェックシートなど、当たり前に使われるものもあります。パレート分析は、別の回で書きましたが、今回は特性要因図の実践の話をしたいと思います。なお、詳しい使い方は検索できますので、そちらをご参照ください。一応リンクを貼っておきます。
[[QC7つ道具ってどう使うの？いまさら聞けない品質改善の基礎]](https://www.keyence.co.jp/ss/general/manufacture-tips/7qc-tools.jsp)

#### ＜QC7つ道具＞
- パレート図
- 特性要因図
- グラフ
- ヒストグラム
- 散布図
- 管理図
- チェックシート

パレート図の話は別の回でしましたので、ここでは特性要因図を具体的にどう扱うのかの話をしていきます。

## 特性要因図とは
通称「魚の骨」、との通り、魚の骨を書くように因果関係をモデリングしていく手法です。別名、石川ダイアグラムとも言います。


#### ＜特性要因図イメージ＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156898/4550f751-9750-975b-178e-e5cca5dbe596.png)



### 特性要因図の使いどころ

- 不具合が起こった時
- 完成品ができるまでの要素を洗い出す
- クリティカルパスを探す
- ゴールシーク


### 不具合が起こった時
ハインリッヒの法則というのがあります。「1件の重大事故の背後には、29件の軽傷事故と、300件の無傷害事故が隠れている」いわゆる、ヒヤリ・ハットの法則のことですが、このヒヤリ・ハットを特性要因図を使って表現できたとしたら、どこで障害が起こるのを防げたか、という図を可視化できます。

### 完成品ができるまでの要素を洗い出す
例えば、お子さんの誕生日のお祝いを考えるとしましょう。
- ケーキ
- 料理
- 飾り付け
- セレモニー
の、準備が必要だったとして、段取りを特性要因図にすると、上記のようになります。
あくまでも一例ですが、時系列を意識して書けるので、対応がしやすくなります。


### クリティカルパスを探す
上記の、お子さんの誕生日のお祝いの例で考えてみましょう。
飾り付けの例でいうと、輪っかを作るために、材料や制作の時間が必要であることが分かります。バナーにしても、プリンターで出力するために、事前のデータや、印刷のインクなどが必要なことが分かります。こうして、準備のために、あらかじめ行っておくことを整理できます。


### ゴールシーク
これも、お誕生日の例でいうと、お誕生会を成功させる、という目的のために、魚の「骨」に当たる部分（枝とも言います）が、用意するもの、ということになります。新しい製品を開発するための全体工数を見積もる場合などに使います。


## まとめ
特性要因図が活躍するシーンは多く、使いこなすと開発の助けになるでしょう。ただ、特性要因図を知らない人には、これだけ見てもわからないので、事前のチーム内での共有などが必要になります。


### 用語解説

#### クリティカルパス
工程をこれ以上縮められない、最低限時間がかかる工程の期間や繋ぎを指します。例えば、出勤経路がたくさんあるとして、最低でも、ある駅に行かないといけないのであれば、その駅に最短時間で行ける経路がクリティカルパスになります。
ネットワーク解析の基本：パケットキャプチャツール『Wireshark』の魅力と使い方

## はじめに
Wiresharkは、ネットワークのパケットをキャプチャし、詳細な解析を行えるオープンソースのツールです。

:::note
***ネットワークエンジニアやセキュリティ専門家にとって欠かせないツールでありながら、無料で利用できるのが大きな魅力です。***
:::

この記事では、Wiresharkの基本的な使い方から、実際の活用例までを紹介します。

## そもそもWiresharkとは？

Wireshark（ワイヤーシャーク）は、オープンソースで開発された誰でも自由に使用できるパケットキャプチャツールです。

***EthernetフレームからHTTPメッセージまで、LAN上を流れるデータをキャプチャし、詳細な情報を解析できます（とにかくすごいツール）！***

![スクリーンショット 2024-12-22 10.32.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/cc942b1d-6594-05a4-ca8a-04f85f04a17d.png)
引用画像：https://unit42.paloaltonetworks.jp/using-wireshark-identifying-hosts-and-users/

Wiresharkの主な特徴を以下にまとめます。

:::note warn
- **オープンソース:**
誰でも無料で利用可能。

- **多様なプロトコルに対応:** 
HTTP、DNS、TCP/IP、UDPなど、広範囲なプロトコルを解析可能。

- **リアルタイムキャプチャ:**
ネットワークのトラフィックをリアルタイムで監視。

- **視覚的な解析:**
パケットのデータを視覚的に表示し、解析が簡単。
- **クロスプラットフォーム:**
Windows、macOS、Linuxなど、主要OSに対応。
:::

興味のある方は以下のリンクも参考にしてみてください。

https://forest.watch.impress.co.jp/library/software/wireshark/

## 注意点
***Wiresharkを利用する際は、以下の点は必ず注意してください。***

:::note alert
- **自分のネットワークでのみ使用すること**
他人のネットワークを無断でキャプチャすることは法律で禁止されています。
:::

また、キャプチャデータの量が膨大になることがあるため、適切なフィルタリングが重要です（この後のセクションで解説します）。

## Wiresharkのインストール手順

公式サイトにアクセスし、利用しているOSに適したインストーラーをダウンロードします。

https://www.wireshark.org/

ダウンロードしたインストーラーを実行し、画面の指示に従ってインストールを進めます。

***インストール手順については、以下のQiita記事が分かりやすいので、参考にしてみてください！***

https://qiita.com/mmake/items/01e5c1a9162b2d53286c

インストールが正常に完了すると、スタートメニューにWiresharkが表示されます。

![スクリーンショット 2024-12-22 10.28.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/3f453736-0399-ad64-af4e-f85a15683fec.png)

## Wiresharkの基本的な使い方

### キャプチャの開始

Wiresharkを起動し、キャプチャしたいネットワークインターフェースを選択します。

![スクリーンショット 2024-12-22 10.59.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/c8459cfa-8ea5-a335-067d-91acdb26330a.png)

ネットワークインターフェースをクリックすると、パケットキャプチャが開始されます。

![スクリーンショット 2024-12-22 11.00.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/a9d06718-3817-a920-f11d-9327278f3b12.png)

### フィルタリング
キャプチャしたデータが多い場合は、フィルタを使用して必要な情報に絞り込むことができます。

***例えば、「dns」でフィルタリングを行うと、DNSトラフィックに絞って表示されます。***

![スクリーンショット 2024-12-22 11.01.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/a8c8e056-631a-11ae-c25a-d971231b4131.png)

この例では、自宅のWindows PC（```192.168.1.9```）がGoogleの優先DNSサーバー（```8.8.8.8```）に対して名前解決を行っていることが確認できます。

### パケットの解析

キャプチャしたパケットをダブルクリックすると、詳細情報が表示されます。

:::note warn
***正直なところ、すべての詳細情報を理解するのは難しいですが、ステータスコードや基本的な内容を眺めるだけでも役立ちます（笑）。***
:::

![スクリーンショット 2024-12-22 11.08.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/4150bf2f-1318-e4ef-f69e-b292772cbd78.png)

詳細ビューでは、パケット内のプロトコル階層を解析できますが、これを完全に理解するにはネットワークの深い知識が必要です。

***普段は、送信元や宛先、簡単なプロトコル情報を確認する程度で十分役立ちます！***

## まとめ
Wiresharkは、ネットワークの状態を可視化し、詳細な解析を行える強力なツールです。

:::note
***初心者から上級者まで幅広く利用できるため、ネットワーク関連の知識を深めたい方には特におすすめです。***
:::

この記事が、どなたかの技術的な支えになれば幸いです！

## 参考記事

https://forest.watch.impress.co.jp/library/software/wireshark/

https://udemy.benesse.co.jp/development/wireshark.html

https://qiita.com/OtsukaTomoaki/items/eb22bc2b8869fcd81600
ヘッダに明細をJSONB形式で結合【PostgreSQL】

## 説明

1.　`注文ヘッダ`、`注文明細`のテーブル定義。
```sql
-- 注文ヘッダ
CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    order_date DATE NOT NULL,
    customer_id INT NOT NULL,
    shipping_address VARCHAR(255),
    status VARCHAR(50)
);

-- 注文明細
CREATE TABLE order_items (
    order_item_id SERIAL PRIMARY KEY,
    order_id INT NOT NULL,
    product_id INT NOT NULL,
    product_name VARCHAR(255),
    quantity INT NOT NULL,
    unit_price INT
);
```
2.　`WITH`で`order_items`テーブルから各注文に対応する明細をJSONB形式でまとめるサブクエリを作成。
3.　注文ヘッダの情報とサブクエリで作成した注文明細のJSONBを結合して取得。
```sql
-- 各注文に対応する明細をJSONBとしてまとめるサブクエリ
WITH order_items_json AS (
    SELECT
        order_id,
        jsonb_agg(jsonb_build_object(
            'order_item_id', order_item_id,
            'product_id', product_id,
            'product_name', product_name,
            'quantity', quantity,
            'unit_price', unit_price
        )) AS order_items
    FROM
        order_items
    GROUP BY
        order_id
)

-- メインクエリでLEFT JOINを使用してサブクエリと結合
SELECT
    o.order_id,
    o.order_date,
    o.customer_id,
    o.shipping_address,
    o.status,
    oij.order_items
FROM
    orders o
LEFT JOIN
    order_items_json oij ON o.order_id = oij.order_id;

```
ChromeOS FlexをUTM上でエミュレートしてみた

# はじめに

この記事は、Qiita Advent Calendar 19日目の記事です。
以下の記事より、すべての記事をご覧になれます。

https://qiita.com/0_terarin_0/items/2b60d47a2d0e64a273c3

# 本編

今回は以下のサイトを参考にしました。

https://mac-windows-pc.com/m1-mac-chromeos-flex

## ISOイメージをダウンロード

以下のサイトからイメージをダウンロードしましょう。

https://chromiumdash.appspot.com/serving-builds?deviceCategory=ChromeOS%20Flex

右の方からダウンロードしたら、ダウンロードしたZipを解凍してbinファイルを生成します。

## UTMの設定

基本的にはエミュレートの設定をしてbinファイルをインポートしてそっから起動してインストールを進めていくっていう感じです。まずは、Emulate＞Otherで次に起動メディアはNoneを選択。

![Screenshot 2024-12-22 at 11.08.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583428/70c0c051-eebb-afe4-0a2d-11af4779cabd.png)

次に、一応４コアメモリ4096MBで設定しましょう。

![Screenshot 2024-12-22 at 11.08.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583428/782a88c0-f52b-fb3f-898e-3ff9c0e50ade.png)

あとはそのまま進めるだけです。全て設定した後にメニューを開きましょ。そして、解凍したbinファイルを新しいDriveを追加して、そのDriveにはbinファイルをインポートします。

![Screenshot 2024-12-22 at 11.09.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583428/fc16639f-bb12-7f4a-10c5-c00cf15b53c6.png)

起動したらウィザードに従ってインストールしていくだけです！

## 使った所感

やっぱりエミュレートは使い物にならないですね。これを普段使いしていくのには無茶があります。昨日のRisc-Vのdebianよりも無茶です。ChromeOS FlexのArmイメージとか欲しいですね。

# 最後に

やっぱり、x86-64がメインなんですね。僕とはあんまり縁がない世界なのでもう少し研究していかなければ…。
【転職活動】リーダー経験がないなら経験すればいいじゃない

# はじめに
転職活動中に、リーダー経験はあるかと聞かれることがしばしばありました。
職種経験年数が増えるにつれてリーダー的な動きを求められると思いますが、そんな経験ないぞ...さて困った。

となったとき、私がとった緊急行動についてまとめてみました。

# 前提
- 付け焼き刃なのでその旨は面接官に伝える
リーダー経験長いですアピールをしてもおそらくバレます。バレなくても入社後に期待値ミスマッチが発生するので無理な背伸びはしない。

# 取った行動

- メンバーとして経験したことを他の人に教える

チームで取り組んだことを他のチームに布教する活動を行いました。
もちろん闇雲に布教するのではなく、背景やメリデメを踏まえた上です。

https://qiita.com/does_not_exist/items/7277556f9e44f106d27a

# 結果
面接時の話題として活躍してくれました！
中にはこの話題で面接時間の半分を占めたこともあります。

# おわりに
転職活動中に自分に足りないなと思ったものがあればやれるだけのことはやってみましょう。
あとは再現性を意識して、入社後も同じことができるように。
AIが返す文字列の中のJSONとして抽出可能な部分をデコードして返す関数、が意外と便利

# はじめに
生成AIが返すテキストで「JSON形式で こういう 感じで返して」と指示をしたときに、JSON部分はあっているんだけど ` ```json` ~ ` ``` ` とかコードフェンスで囲ったり、`はい` とか余計な一言を付けたりすることがよくあります。もちろん、response_format などを指定すればそういう心配はないですが、Modelによっては対応していない場合があったり。
JSONの中身自体は意図通りなので惜しいなぁ、、、と思うこともあるんじゃないでしょうか。

それの対策として、文字列中にあるJSONっぽい部分をよしなに抽出する関数、を作ったのですが思いの外便利に使えることも多いので共有します。

## 文字列の中のJSONとして抽出可能な部分をデコードして返す関数
シンプルにこんな感じで、想定される応答が `dict` か `list` かを指定して、一番大きくJSONとして解釈できる部分を解釈して返す、というものです。

```python
import json
from typing import Union, Dict, List

def extract_json_segment(data: str, target: str = "dict") -> Union[Dict, List]:
    """文字列の中のJSONとして抽出可能な部分をデコードして返す。
    target が "dict" の場合は `{` で始まり `}` で終わる辞書を、
    target が "list" の場合は `[` で始まり `]` で終わる配列を対象とする。
    
    Args:
        data: パース対象の文字列
        target: "dict" または "list" を指定。デフォルトは "dict"
    
    Returns:
        デコードされたJSONオブジェクト。失敗時は空の辞書または空の配列
    """
    if target not in ["dict", "list"]:
        raise ValueError("target must be either 'dict' or 'list'")
    
    start_char = "{" if target == "dict" else "["
    end_char = "}" if target == "dict" else "]"
    default_value = {} if target == "dict" else []
    
    start = 0
    while start < len(data):
        if data[start] == start_char:
            end = len(data)
            while end > start:
                if data[end - 1] == end_char:
                    try:
                        return json.loads(data[start:end])
                    except json.JSONDecodeError:
                        pass
                end -= 1
        start += 1
    return default_value
```

生成AIとのやりとり時間と比較すれば無視できる実行時間ですし、大抵そんな複雑な話ではないので 問題なくこれで抽出できます。

# さいごに

一つ悩みが減りました。
PostgreSQLのSQL実行環境【PostgreSQL】

## 説明

1.　仮想マシン プラットフォームの有効化（Docker利用のため）
 - スタート > Windowsの機能 > `仮想マシン プラットフォーム`に チェック
 - PC再起動

2.　Docker Desktop インストール

3.　Docker に PostgreSQL コンテナ追加
 - コマンド プロンプト > 以下のコマンドを実行
 - `docker run --name my_postgres -e POSTGRES_PASSWORD=1234 -d -p 5432:5432 postgres`

4.　A5 のインストール

5.　A5 に データベースの追加
 - `A5M2.exe`と同じフォルダ内に`Portable`フォルダを作成
 - `A5M2.exe`でA5を起動
 - ワークスペースの起動と管理画面でワークスペース情報の保存先が`設定ファイル (ポータブルモード)`になっていることを確認する
 - データベース > データベースの追加を削除 > 追加 > PostgreSQL (直接接続)
DB種類：`PostgreSQL`
サーバー名：`localhost`
ポート番号：`5432`
ユーザーID：`postgres`
パスワード：`1234`
Raspberry Pi Pico - Python SDK のドキュメントを読む②

# 第２章 REPL

今回は第２章を読んでいく。

ところで `REPL` のことを「レプル」と読んでいたのですが、このドキュメントによると「リップル」(ripple)が正しいらしい。

## 2.1 USB経由でのREPL利用

定番のUSB経由でのREPL利用について記載されている。

このドキュメントでは minicom というシリアル通信ソフトウェアで REPL を使います。

今となってはMiroPythonが提供している mpremote を使うほうが楽だろうなという気がする。シリアルポートも自動で探してくれるし。

mpremote のインストールは PyPI から pip でインストールできる。

```bash
$ pip install mpremote
```

REPLに繋ぐには、たいていは `mpremote` を打つだけで、シリアルポートも自動で探して繋いでくれる。

```bash
$ mpremote
```

何らかの理由で mpremote がシリアルポートを探せないときは明示することもできる。

```bash
$ mpremote connect シリアルポート
```

mpremote でのREPL接続から抜けるには　`Ctrl-]` とする。

## 2.2 UARTピン経由でのREPL利用

USB経由ではなくて、UART のピンを使って REPL に繋ぐ方法について記載されている。

ダウンロードできるビルド済ファームウェアでは無効になっているので、もし使う必要があるなら、github からソースコードをもってきて、`ports/rp2/mpconfigport.h` の中の `MICROPY_HW_ENABLE_UART_REPL` を 1 に変更して、ビルドしなければならない。

ラズパイから使う場合は、ラズパイ側の UART も `raspi-congig` で有効にしておくことを忘れずに。

やや敷居の高いところではなるが、Pico 自体を USB デバイスとしてプログラミングするのでなければ、ほとんど使うことはないであろう。

## 2.3 Mac での接続方法

なぜか、Mac だけ特別に接続を説明した章がある。たぶん、シリアルポートの名前が一意に示せないせいだとは思うが、それにしては説明が不足している。どちらにしても `mpremote` を使う限りはシリアルポートで悩むことはほとんどない。

あと、Mac よりも特殊と思われる Windows の章がないのはなぜだろう。

## 2.4 Hello World

REPL の手始めとして `Hello, Pico` を表示する方法が記載されている。

print()関数を使うだけ。

## 2.5 LED の点灯と消灯

続いて、内蔵 LED の点灯と消灯について。

Pico や Pico 2 で内蔵 LED はピン 25 番に接続されているので、すなおに25番のPinオプジェクトを作れば LED にアクセスできる。

```python
>>> from machine import Pin
>>> led = Pin(25, Pin.OUT)
>>> led.value(1)  # 点灯
>>> led.value(0)  # 消灯
```

Pico W では LED　が無線チップ経由で接続されているので、25番ピンは使えない。なので、このドキュメントではよりPicoシリーズ間で互換性の高い `"LED"` 文字列の使用を推奨している。

```python
>>> from machine import Pin
>>> led = Pin("LED", Pin.OUT)
>>> led.value(1)  # 点灯
>>> led.value(0)  # 消灯
```

ちなみに、`value()` 以外にも `on()`、`off()` が使える。

```python
>>> from machine import Pin
>>> led = Pin("LED", Pin.OUT)
>>> led.on()  # 点灯
>>> led.off()  # 消灯
```

ついでに言及しておくと、Pin は予め LED の Pin オブジェクトを持っている。

```python
Pin.board.LED
```

## 2.6 次章予告

第３章でプログラミングを扱うことが示されている。

このドキュメントは作成したスクリプトをPicoに転送する方法についてはIDEまかせのようである。初期にはよくあったことだが、スクリプトをPico本体に置いてスタンドアローンで動かすことができないと勘違いされていたことがある。

IDEについては第４章で扱ってはいるのだが、順序を逆にしたほうがよいように思える。ついでに `mpremote` も扱ってほしい。
PHPカンファレンス2024オンライン視聴の感想

## はじめに
今年もPHPカンファレンスの時期になりました。
オンライン視聴するライトユーザーですが、毎年楽しみにしております。
2024年はTrack1,2のみオンライン視聴できたので、レポートしていこうと思います。
(オンライン参加が朝イチの段階で60人くらい...少なくないか？)

## 対象者
この記事は下記のような人を対象にしています。

- PHPカンファレンス2024に参加したいが出来なかった方
- アーカイブ動画を見たいが、どれから見るか迷ってる方

:::note warn
・あくまで個人のメモのため、実際の内容と異なる場合があります
・興味のある部分しかメモしていないので、網羅的でない点、ご了承ください
・Track1,2のみオンライン視聴可能だったので、その範囲のレポートです
:::

## [PHPの今とこれから2024](https://fortee.jp/phpcon-2024/proposal/785c0984-90b3-4c98-93c2-0665d1874b74)
- PHP8.4のリリースマネージャに日本人が起用
- Nikita氏がPHP開発から離脱→PHP Foundation設立(2021)
- セキュリティ修正が4年に延長
- とはいえ8.0までEOL
- 8.4の変更ポイント
    - JIT強化(新CPUサポートが容易に)
    - プロパティフック(set/getが簡易に)
    - 非対称プロパティ可視性(readonlyよりも自由度高くpublic/protectedが設定できる)
    - 遅延オブジェクト(状態が参照/変更されるまで初期化を遅延)
    - HTML5対応
    - array_find系関数追加
    - 廃止：暗黙のnullable型宣言
    - 廃止：GET/POSTでsession利用
- FrankenPHP
    - Goを利用したWEBサーバ
    - apache / nginxより高速

## [PHP RMは何をする？コア開発者と兼任するメリット/裏話](https://fortee.jp/phpcon-2024/proposal/c3636ff3-268f-46ac-9bef-6b84636f78ff)
- マイナーバージョンごとにRMを3人(ベテラン1人+ルーキー2人)置く
- 立候補社が多い場合は選挙で選定
- 前ver.のルーキーが次ver.のベテランに昇格
- Slackでマイナーバージョンごとの部屋がある
- 毎週木曜にリリース
- マージ許可/却下の判断
- セキュリティ修正の手動マージ
- コア開発者は月1回MTGあり
- コミュニケーションは英語(googleMeetでリアルタイム翻訳字幕も活用)

## [PHPで学ぶプログラミングの教訓／PHPで学ぶバックエンドソフトウェアアーキテクチャ選定の勘所](https://fortee.jp/phpcon-2024/proposal/6567eb24-ac3e-4ce6-aefe-db33fdf61643)
### 教訓

- 再代入を避ける
- システムハンガリアンを避ける
    - アプリケーションハンガリアンはOK
- ド・モルガンで読みやすくしよう
- デットコードを葬る
- DRY
- OAOO(Once And Only Once)
- ループ処理で入力・処理・出力を分けると読みやすい
- 相互参照を避ける(Mediatirパターンを利用する)
- Tell, Don't ask
- KISS
- Secure by Default
- 継承よりコンポジション
- 単一責務の原則
    - クラスの変更を要求する主体が一つであるべき
- 開放閉鎖の原則
- 読めないコードはない
- 予測するな、計測せよ
- 書く努力をせよ
- ボーイスカウト原則
- ルールよりレール

### アーキテクチャ選定

- ヘキサゴナルアーキテクチャ
    - ポートとアダプタ
    - ビジネスロジックをアプリケーション内に留める
- レイヤードアーキテクチャ
- クリーンアーキテクチャ
- どう選ぶべきか
    - チームの成長段階次第
        - 自走できるなら：ヘキサゴナルアーキテクチャ
        - 成長途中：コード自動生成ツール導入＋クリーンアーキテクチャ

## [そーだいさんに聞く！コミュニティとともに在るエンジニアの良いキャリアの歩み方](https://fortee.jp/phpcon-2024/proposal/956fe21e-3be3-4187-a41f-e2025a5995b0)
- そーだいさんも自分と同じく他業種からエンジニアになったとのことで、励みになった
- 自分の軸を見つけること
    - 色々経験してみて、楽しいなーと思ったものを残す、でOK
    - 自分が好きな動詞に注目すべき
    - ゴールを決めるのは大事だが、ライフステージで変わるので、固定しすぎも良くない
- マネージャーとプレーヤーを行ったり来たりするキャリアもいいよね
- バッターボックスに立つ回数を増やせばヒットも増える
- エンジニアにおける技術力とは「ソフトウェアを通じて問題解決する力」

## [ある日突然あなたが管理しているサーバーにDDoSが来たらどうなるでしょう？知ってるようで何も知らなかったDDoS攻撃と対策](https://fortee.jp/phpcon-2024/proposal/5e7a3fc0-62b6-4cdc-9a99-f237007c7dae)
- アクセス数が多いだけではDDosとは言えない
- 対策方法
    - モニタリング
    - Rate Limit設定(サーバーのリソースを使う)
    - リバースプロキシ
        - CDN…第3,4層
        - WAF…第7層
- EDos攻撃：AutoScalingなどで大量のリクエストを捌いてしまうが、高額請求されてしまう
- 攻撃側よりも防御側の方が圧倒的に不利

## [情報漏洩させないための設計](https://fortee.jp/phpcon-2024/proposal/b3559ef3-9738-4452-ae8f-1590687161ca)
- DDDのコンテキストの分離の実例紹介
- アクターによって、必要な情報だけ出し分けたい
- PHP StanのNarrowing Typesを活用
- [deptrac](https://github.com/qossmic/deptrac?ref=bestofphp.com)で依存して良いレイヤーを設定することで、事故を防ぐ

## [責務を分離するための例外設計](https://fortee.jp/phpcon-2024/proposal/ac2fa6f2-588f-4faa-a0e2-35e4d8d9f808)
- Error
- Exception
    - LogicException
    - RuntimeException
    - CustomException
- 問題がある場合は早く中断する
- 解決できない例外は呼出側に任せる

## おわりに
カンファレンスは楽しい！
また来年も参加しようっと。



## 参考記事
[PHPカンファレンス2024](https://phpcon.php.gr.jp/2024/)
【自習】AWS VPC

PMする上で必要になってきたのでおさらい

https://docs.aws.amazon.com/vpc/?icmpid=docs_homepage_networking

## **AWS VPCとは？**

AWSが提供する**仮想ネットワーク環境**。  
AWSリソース（EC2、RDS、Lambdaなど）を、ユーザー専用のネットワーク内で安全に運用できるようになる。

## **VPCの主な特徴**

1. **分離されたネットワーク環境**
   - 他のAWSユーザーから完全に分離されたプライベートネットワークを提供。

2. **カスタマイズ可能なネットワーク設定**
   - サブネット（小規模ネットワーク）、IPアドレス範囲、ゲートウェイ、ルートテーブルを自由に設計可能。

3. **ハイブリッドクラウドを実現**
   - オンプレミス環境とVPCをVPNやDirect Connectで接続し、シームレスに連携。

4. **セキュリティの強化**
   - セキュリティグループやネットワークACLを利用して、細かいアクセス制御が可能。

5. **スケーラブルな設計**
   - 必要に応じてリソースを動的に追加・削除可能。

## **VPCの基本構成要素**

1. **CIDR（Classless Inter-Domain Routing）**
   - VPC全体のIPアドレス範囲を設定。
   - 例: `10.0.0.0/16`（最大65,536個のIPアドレス）。

2. **サブネット**
   - VPC内の小さなネットワーク。
   - **パブリックサブネット**: インターネットに接続するリソースを配置（例: Webサーバー）。
   - **プライベートサブネット**: 内部でのみ通信するリソースを配置（例: データベース）。

3. **インターネットゲートウェイ**
   - VPCをインターネットに接続するための出口。

4. **NATゲートウェイ/NATインスタンス**
   - プライベートサブネット内のリソースがインターネットにアクセスする際に使用。

5. **ルートテーブル**
   - ネットワークトラフィックのルートを定義。
   - 例: `10.0.1.0/24`はインターネットゲートウェイへ、`10.0.2.0/24`はVPN接続へ。

6. **セキュリティグループ**
   - インスタンス単位でトラフィックを制御するファイアウォール。

7. **ネットワークACL**
   - サブネット単位でトラフィックを制御するファイアウォール。

## **VPCの主なユースケース**

#### **1. ウェブアプリケーションのホスティング**
- **シナリオ**:
  - EC2インスタンスでWebサーバーを運用。
  - データベースサーバー（RDS）はプライベートサブネットで保護。
- **構成例**:
  - パブリックサブネット: Webサーバー（EC2）。
  - プライベートサブネット: データベース（RDS）。

#### **2. VPNを使ったオンプレミスとの接続**
- **シナリオ**:
  - オンプレミスの社内ネットワークをAWSリソースに接続。
- **構成例**:
  - VPC内にVPNゲートウェイを設置。
  - オンプレミスからVPCへのセキュアなアクセスを実現。

#### **3. ハイブリッドクラウド環境**
- **シナリオ**:
  - 一部のシステムをオンプレミス、他をAWS上で運用。
- **構成例**:
  - Direct Connectを利用して低遅延でAWSリソースと接続。

#### **4. サーバーレス環境**
- **シナリオ**:
  - Lambda関数でデータベース操作を実行。
- **構成例**:
  - Lambdaをプライベートサブネットに配置し、VPC内のRDSにアクセス。

### **VPCの料金**

AWS VPC自体は無料で利用できますが、以下の関連リソースに対して料金が発生します：

1. **NATゲートウェイ**
   - 作成料金: `$0.045/時間`。
   - データ転送料金: `$0.045/GB`。

2. **VPNゲートウェイ**
   - VPN接続: `$0.05/時間`。

3. **データ転送**
   - **VPC内**の通信は無料。
   - インターネットへのデータ転送は `$0.09/GB`。

## **VPCの設計手順**

#### **1. VPCを作成**
1. AWSコンソールで「VPC」を選択。
2. 新しいVPCを作成し、CIDRブロック（例: `10.0.0.0/16`）を設定。

#### **2. サブネットを作成**
1. パブリックサブネットとプライベートサブネットを作成。
   - パブリックサブネット: `10.0.1.0/24`。
   - プライベートサブネット: `10.0.2.0/24`。

#### **3. ルートテーブルを設定**
1. パブリックサブネット用ルートテーブル:
   - インターネットゲートウェイをデフォルトルートに設定。
2. プライベートサブネット用ルートテーブル:
   - NATゲートウェイを設定。

#### **4. セキュリティ設定**
1. セキュリティグループを作成し、必要なポートを開放。
   - Webサーバー: TCPポート80, 443。
   - データベース: TCPポート3306（MySQL）。

2. ネットワークACLでサブネット全体の通信を制御。

## **VPCのメリットとデメリット**

#### **メリット**
1. **高いセキュリティ**
   - 他のAWSユーザーから完全に分離されたネットワーク。
   - セキュリティグループやACLで細かいアクセス制御が可能。

2. **柔軟なカスタマイズ**
   - IPアドレス範囲やルートテーブルを自由に設計できる。

3. **スケーラビリティ**
   - 必要に応じてリソースを追加可能。

4. **ハイブリッド環境との統合**
   - オンプレミスとの連携が簡単。

#### **デメリット**
1. **設定の複雑さ**
   - 初心者にはCIDRやルートテーブルの設定が難しい。
2. **コスト**
   - NATゲートウェイやVPNゲートウェイの使用でコストが増加する場合がある。

## **VPCのベストプラクティス**

1. **最小権限のアクセス**
   - セキュリティグループとネットワークACLで必要最低限の通信だけを許可。

2. **サブネットの分離**
   - 公開が必要なリソース（Webサーバー）はパブリックサブネットに、重要なデータ（DB）はプライベートサブネットに配置。

3. **監視の強化**
   - VPCフローログを有効化して、トラフィックをモニタリング。

4. **バックアップの確保**
   - 必要に応じてマルチリージョン構成で冗長性を持たせる。

## 感想
ネットワークの知識が足りなくて理解が不十分。どこかでじっく基礎を学習しないといけない。
転職活動での気づきを得てチャレンジしたこと



# はじめに

下記投稿の後日談になります。
結論としてAzureの道を進みたいと考えるまでのプロセスについてまとめました。

https://qiita.com/yuyanz/items/51baf6e755198b07f49e

# 3年目時点での仕事

・あるシステムの保守運用
・技術的な知識は全く頭に入っておらず、故障時の対応フローのみ習得
・それとは別にハードの更改案件が大量にあるのでそのスケジューリング
・チームタスク管理

# 自分の「したいこと」に向き合う

下記でも話しましたが、このまま同じ仕事をするのは非常にリスキーだと思っていました。かといってしたいことがあるわけじゃない。という状態です。

https://qiita.com/yuyanz/items/51baf6e755198b07f49e

それでもこのまま何もしないと市場価値が下がると思っていたので、何か行動しなければなりません。
しかし、「したいこと」がないのです。

考えてみても下記のように「やらない理由」がたくさん出てきます。
・新しい技術に触れたい？⇒楽しそうだけど、その道を行って大丈夫？
・マネジメント頑張りたい？⇒いつか淘汰されない？大丈夫？
・AIの仕事は？⇒どうやって金にするの？大丈夫？

自己分析的なサービスもいくつかやってみました。
しかし、じゃあ仕事として何がしたいの？という答えは出てきませんでした。

そこで、もういっそのこと
「今の仕事をしたくない」ことを「したいこと」に定義してみました。

# 今の仕事をしないためには？

今の仕事をしないためには何が必要かを考えました。

当時私の業務の7割くらいは「人から振られるタスク」でした。
この「人から振られるタスク」をどうにかしたいと考えました。

チーム内の人間が私に対してタスクを振る心理として、考えられたのは
「この人は暇そう」「この人はまだまだ成長していない」等と思われた時です。
職場で最年少ということもあり、「下」だと思われているという感覚もありました。

ではそう思われないためにどうしたらよいか？

当時頭で具体的に言語化できていた訳ではないのですが
「自分にしかできない仕事の割合を増やし、自分のポジションを獲得する」
これが最適ではないかと思いました。

では何ができるか？

私は俯瞰して物事を捉えるのが得意です。
職場全体で、「何に取り組むべきか」が感覚的にわかっていました。

# 取り組んだこと

### 問題点

私のチームは保守担当です。
チームとは別に営業担当がいました。

営業担当が何人かいるのですが、それぞれが好きなように案件を受注していました。結果、繁忙期と閑散期の差が激しくなっていました。
顧客の都合に全て合わせて案件を取るのでみんな似たような時期に案件を放り込んでくるようになっていたのです。

### 行動開始

「案件の時期を分散させる」ことを目標として行動することにしました。

まずは営業が「バラバラに受注してくるのをやめてもらえないか」と言ってみました。全員先輩です。なんやかんや言って聞いてくれません。残念。

と、諦めるわけにもいかなかったので誰にでもわかるように私が感じている「問題」を認知してもらう作戦をたてました。

今年受注予定の案件のスケジュールを可視化することにしました。
当時営業の頭の中にしか正確な情報はなかったので、ヒアリングしまくりました。
時期が未定のもの、顧客が強く要望しているもの、会社都合でいつにしないといけないという制約があるもの。

ひととおりスケジュールに落とし込むと一目瞭然。
ある月は全く案件がない。しかし、ある月は繁忙期（人が絶対に足りないことが見てわかるレベル）。誰が見ても「これ捌けるわけないじゃん」状態になりました。

ここまできてやっと営業に話を聞いてもらえるようになりました。

### 次の壁

営業は話を聞いて前向きに検討してくれるようになりましたが、
それでも営業力やこれまでの営業スタイルまでいきなり変えられません。

「繁忙期の案件を少しだけズラす」ことはできましたが、「繁忙期をなくす」ことはできませんでした。

そこで「繁忙期にやっている仕事」に着目しました。
わざわざ繁忙期にしなくても閑散期に事前準備できるのでは？と考えたのです。

すると「設定表」みたいなものを作る作業があるんですが、
チームメンバはこれをいつもは繫忙期にしていました。

ある程度要件がブレそうにない案件から、閑散期にやってしまう作戦をたてました。
スケジュールで可視化した内容を保守チームに見せました。
暇な今しないとまずいことを訴え、その通りやることになりました。

# 行動した後の自分のポジション

ここまで「取り組んだこと」の章でしてきたことは
今までの通常業務をこなした上、＋α自分でやると決めてしたことでした。
かなり残業しました。

その頑張りと、「チームタスクを別担当と調整してコントロールする」ことをしたおかげでタスクを振られる側ではなく、チームタスクのコントロールをする側になりました。

これによって「人から振られるタスク」は激減しました。
今ではほぼありません。

# 余裕から生まれたチャンス

ここまで行動してきてチャンスが訪れました。

私はもともとAWSの資格を会社の指示で取らされていたのですが、あまり気が進みませんでした。
それでも新しいことができるならと、「クラウドしたい」と上司に相談していました。
するとある日、Azure案件の話が舞い込んできました。

・Azureの有識者というのは会社でもほぼいないこと
・今クラウドの中でもかなり伸びていること（当時AWSは横ばいだった）

のでAzureであればやりがいのある仕事ではないかと思えました。

昔の私なら前向きに捉えることができなかったかもしれません。
しかし「今の仕事をしたくない」という動機で行動し、ある程度結果を
出せた自分に自信が持てるようになりました。

何か行動をすると、普段目の前に見えているはずのチャンスをチャンスだと認識できる能力があがるのかもしれません。

こうして、私はAzureの道を歩みたいと思えるようになりました。

# 最後に

おそらく今の会社の今のポジションではいつか限界が来ます。
ご紹介した記事の中に
> Azureの有識者というのは会社でもほぼいないこと
と書きましたがこれが成長の壁になると予想しています。

また次の壁が現れたら、会社にとらわれず転職の道も視野に入れて乗り越えたいと思っています。

ここまで長文をご覧いただきありがとうございました。
Streamlitを活用して博士過程での研究を効率化した話

# 背景
博士後期課程で，数理最適化の事例研究を行っていた．実社会問題の要求条件を数理モデルとして定式化し，その数理モデルの最適化計算を行うアルゴリズムを考え，最終的にそれらから得られる解を出力する．出力された解の良し悪し（目的関数値の良し悪しではなく，その解が現場で求められている解となっているかという意味での良し悪し）は現場の人に判断してもらう．このとき，現場の人とのコミュニケーションを取るために，入力データから出力結果をその場でインタラクティブに確認してもらうツールとして，Streamlitを活用した．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880471/5c8d0717-9705-1aa9-4651-f530179fe6b1.png)

# 取り扱った数理最適化の問題の簡単な説明
立会する工事の集合と立会者の集合等が与えられたとき，各立会者を各工事に割り当て，それに対する最適な割当結果を得ることを考える問題である．詳細は博士論文（[工事立会者手配業務に対する数理モデルと実践的解法](https://nagoya.repo.nii.ac.jp/record/2005628/files/k14380_thesis.pdf)）を参照いただきたい．
本研究の本質は，実用的な数理モデルの構築とそれに対する最適解を求めるアルゴリズムを考案することとなり，いかに現場の人とのコミュニケーションを取りやすくするかではないため，Streamlitの活用事態は研究要素とは関係ないが，現場の人とのコミュニケーションを取りやすくするために，Streamlitを活用することで実用的な数理モデルを構築する上で役立った．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880471/4a4b8eba-c846-8113-fc7e-da6799c26989.png)

# Streamlitの活用
数理モデルは入力データの違いを吸収できるようにパラメータを設定できる作りにしており，このパラメータを設定する部位と入力データを入力する部位をStreamlitにて実装した．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880471/15f46aa4-9227-4fd7-7c32-1fe61da8d4d5.png)

入力データをアップロードしたあとは，いよいよ最適化計算を行う．入力データや数理モデルのパラメータの違いにより，効率的な最適解を探索する過程が異なるため，博士後期課程では大きく3種類のアルゴリズムを考案した．この3種類のアルゴリズムを選択し，最適化ボタンを押すことで，最適化計算を行う．最適化計算を行う部分は，バックエンドで考案したアルゴリズムのプログラムのAPIを叩いており，Streamlitで処理しているわけではない．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880471/fdf360ec-f4e5-629e-9ff4-06852850ba6d.png)

事例研究で難しいのは，学術的な価値をどのようにして実社会で使える状態にするか，つまりユーザビリティとどのように担保するかという点にある．現場の人は数理モデルやその最適解の探索のアルゴリズムについて知りたいわけではなく，実用的な解がほしいのだが，研究者は数理モデルやその最適解の探索のアルゴリズムが重要であり，解の見せ方については，学術的な価値の外にあるため，両者が協力関係を築くためには，ここをつなぐユーザビリティが必要である．Streamlitはこのユーザビリティを担保する，両者の架け橋となるために，非常に有効的なツールである．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880471/e8b28511-eeae-c15d-9fbf-33ccc7b4259c.png)