OmniAICreator/Qiita-1.07M huggingface dataset:
PythonでPowerPointから画像を抽出する

PowerPointドキュメントには通常、テキストの内容を説明するために多くの画像が含まれており、時には他の目的のためにこれらの画像を抽出する必要があるかもしれません。手動で画像を一つずつ保存する代わりに、この記事ではPythonを使ってプログラムでPowerPointプレゼンテーションから画像を抽出する方法を紹介します。
* [PythonでPowerPointファイルから画像を抽出する](#pythonでpowerpointファイルから画像を抽出する)
* [Pythonで特定のスライドから画像を抽出する](#pythonで特定のスライドから画像を抽出する)

## PowerPointファイルを処理するためのPythonライブラリ
PPT/PPTXファイルから画像を抽出するには、サードパーティライブラリ[**Spire.Presentation for Python**](https://www.e-iceblue.com/Introduce/presentation-for-python.html)が必要です。pipコマンドでインストールできます。

> `pip install Spire.Presentation`

## PythonでPowerPointファイルから画像を抽出する
PowerPointプレゼンテーションのすべての画像を抽出するには、すべての画像を反復処理し、指定されたファイルパスにそれぞれを保存する必要があります。以下はその手順である：
1.	`LoadFromFile()` メソッドを使用して PowerPoint ファイルをロードする。
2.	**`Presentation.Images`** プロパティを使用して、ファイル内のすべての画像を取得します。
3.	各画像を繰り返し処理し、指定したファイルパスに保存する。

> Pythonコード：
```python
from spire.presentation.common import *
from spire.presentation import *

# PowerPointドキュメントを読み込む
ppt = Presentation()
ppt.LoadFromFile("sampleR.pptx")

# ドキュメント内のすべての画像を反復処理する
for i, image in enumerate(ppt.Images):

    # 指定したファイルパスに画像を保存する
    ImageName = "ExtractImage/Images_"+str(i)+".png"
    image.Image.Save(ImageName)

ppt.Dispose()
```

![ExtractPPTimage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/d8ea2fc0-0f22-59a7-8ed3-f79f94d20fb1.png)



## Pythonで特定のスライドから画像を抽出する
特定のスライドから画像を抽出するには、スライド上のすべてのシェイプを繰り返し処理し、**`SlidePicture`** または **`PictureShape`** タイプのシェイプを見つけ、画像ファイルとして保存する必要があります。以下はその手順である：
1.	`LoadFromFile()` メソッドを使用して PowerPoint ファイルをロードする。
2.	**`Presentation.Slides[]`** プロパティで指定したスライドを取得します。
3.	スライド上のすべての図形をループします。
4.	図形が **`SlidePicture`** 型か **`PictureShape`** 型かを判定する。
5.	指定したファイルパスに画像を保存する。


> Pythonコード：
```python
from spire.presentation.common import *
from spire.presentation import *

# PowerPointドキュメントを読み込む
ppt = Presentation()
ppt.LoadFromFile("sampleR.pptx")

# 指定したスライドを取得する
slide = ppt.Slides[1]

i = 0
# スライド内のすべての形状をトラバースする
for s in slide.Shapes:

    # シェイプがSlidePictureタイプかどうかを判定する
    if isinstance(s, SlidePicture):

        # 画像を取り出す
        ps = s if isinstance(s, SlidePicture) else None
        ps.PictureFill.Picture.EmbedImage.Image.Save("Output/slide_"+str(i)+".png")
        i += 1

    # シェイプがPictureShapeタイプかどうかを判定する
    if isinstance(s, PictureShape):

        # 画像を取り出す
        ps = s if isinstance(s, PictureShape) else None
        ps.EmbedImage.Image.Save("Output/slide_"+str(i)+".png")
        i += 1

ppt.Dispose()
```
![ExtractSlideImage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/0cd44e37-302c-57d0-00d3-3ba0bf2a5224.png)
【Linux】LPIC101合格の最短ルート

## 使用した書籍やサイト
・あずき本
・ping-t

## 受験までの期間
・２週間程度

## 勉強の方法
１．あずき本をサーっと一周読む。（ちゃんとした理解は不要、(*￣-￣)ふ～ん）

２．ping-tの最強Web問題集を使用（10問形式で解く→解説を繰り返して全問行う。）

３．２を全問分２～３回分繰り返したら、模擬試験にチャレンジしてみる。

４．模擬試験でコンスタントに９割取れればPeasonVUEにて試験予約

５．コマ問もやってみる。（実際にコマンド手打ちでの解答により理解が深まる。）

６．試験

## 受験してみての感想
　正直、ping-tだけで十分だと感じています。（それだけ素晴らしいサイトです。）
　個人の経験値の差により、勉強期間の変動はありますが、コツコツ積み重ねていけば、必ず合格できる試験でした。
　是非、受験を考えてる方は参考にしてください。
【一夜漬け】Beta - AWS Certified AI Practitioner

## はじめに

AWS AIF-C01のベータ版に合格したので、これから勉強する方の参考になればと思います。
ベータ版は、2024-10-07までの受験となりますのでご注意ください。(2024/9/30)


### 筆者の情報

- 情報系学部卒の５年目エンジニア
- インフラエンジニア
- AIや生成AIの経験はなし
- IaaSがメイン
- 取得済みAWS認定資格
    - 現在6つ
        - CLF
        - SAA
        - DVA
        - SOA
        - ANS
        - SAP

## 勉強方法

勉強時間は、ほとんど前日の一夜漬けです。なんなら、3時間くらいしかやってないです。
そのため、AI/MLに関するサービスの概要について覚えることだけに注力しました。

他のAWS認定資格は、Udemyを活用することが多いですが、今回はベータ版ということもあり教材が多くありませんでした。そこで、AWS Skil Builderを活用しました。

https://skillbuilder.aws/jp

AIFのドキュメントは、英語しかないので注意です。
とりあえず、無料の模擬試験を受けてみて自分の実力を測ります。

機械学習の基礎的なことを振り返るのには、よく見るオライリーの本。

https://www.oreilly.co.jp/books/9784873117980/

生成AIに関しては、次の本がとても役に立ちました。

https://www.sbcr.jp/product/4815626440/

この２冊を読んでいる方なら、AWSのサービス概要を覚えることと、
Skill Builderの問題集を解いて傾向が見えてくれば余裕なのではないかなと思います。

## 参考資料


[AWS Certified AI Practitioner (AIF-C01) 試験ガイド(2024/9/30)](https://d1.awsstatic.com/ja_JP/training-and-certification/docs-ai-practitioner/AWS-Certified-AI-Practitioner_Exam-Guide.pdf)
OkHttp3の再認証処理でRetrofit2のCoroutine実装を使うと通信が詰まる

## 概要

OkHttp3のAuthenticatorを使って再認証処理を書いている場合に、Retrofit2のRx実装からCoroutine実装に変更すると認証処理が詰まってそれ以後のすべての通信ができなくなることがあります。

## 変更内容

### 変更前
```kotlin
interface Api {
    @Post("authorize")
    fun authorize(): Single<Token>
}

class TokenRefreshAuthenticator @Inject constructor(
    private val api: Api
): Authenticator {
    override fun authenticate(route: Route?, response: Response): Request?
        val token = api.authorize().blockingGet()

        // Tokenを使った処理
    }
}
```

### 変更後
```kotlin
interface Api {
    @Post("authorize")
    suspend fun authorize(): Token
}

class TokenRefreshAuthenticator @Inject constructor(
    private val api: Api
): Authenticator {
    override fun authenticate(route: Route?, response: Response): Request?
        val token = runBlocking { api.authorize() }

        // Tokenを使った処理
    }
}
```

## 対処法

単純なのはCoroutine実装を使うのをやめてCallで直接呼びましょう

```kotlin
interface Api {
    @Post("authorize")
    fun authorize(): Call<Token>
}

class TokenRefreshAuthenticator @Inject constructor(
    private val api: Api
): Authenticator {
    override fun authenticate(route: Route?, response: Response): Request?
        val token = api.authorize().execute().body()

        // Tokenを使った処理
    }
}
```

## 原因

Retrofit2のRx実装とCoroutine実装の違いにあります。Rx実装では同時呼び出しに上限がありませんが、Coroutine実装には同時実装の呼び出し上限があり、認証切れ時に大量のAPI呼び出しを行うと再認証処理が同時に走り再認証待ちとAPIの処理待ちのデッドロック状態になってしまいます。

ちょっとした変更なのに詰まるっていうのはどうかと思いますが、ハマると辛いので誰かの役に立つと嬉しいです。

## 参考

- https://stackoverflow.com/questions/62950438/using-coroutine-runblock-with-the-authenticator-to-handle-401-response-from-retr
- https://github.com/square/okhttp/issues/6747
ルートディレクトリ、ホームディレクトリ、トップレベルディレクトリの違い

## アジェンダ
基本的なルートディレクトリ、ホームディレクトリ、トップレベルディレクトリの意味の違いについて備忘録的にまとめます。

## ルートディレクトリ（`/`）
- **説明**: ファイルシステムの最上位階層にあり、全てのディレクトリやファイルはここから派生します。
- **例**: 家の住所に例えると「国」のようなものです。すべての住所はこの「国」から始まります。LinuxやUnix系OSでは`/`が国の役割を果たします。例えば、`/home/user`というパスがあるとき、これは「国の中にある市（`home`）の中にある家（`user`）」を意味します。

### 実際のパスの例
- **/bin**: システムの基本的なコマンド（プログラム）が格納されているディレクトリ。例: /bin/ls（lsコマンドの実行ファイル）。
- **/etc**: システム全体の設定ファイルが格納されているディレクトリ。例: /etc/passwd（ユーザー情報が保存されているファイル）。

### 実際の使用例
ルートディレクトリに移動する:
```
cd /
```
これは国全体を見渡す感覚に近いです。

## ホームディレクトリ
   - **説明**: 各ユーザー専用のディレクトリで、ユーザーの個人データや設定ファイルを管理します。
   - **例**: ホームディレクトリは、家の中の「自分の部屋」にあたります。例えば、`/home/alice`は、ユーザー「alice」の部屋です。Aliceがファイルを保存したり、設定を変更したりする場所はこの部屋（ホームディレクトリ）内になります。`/home/alice/Documents`は「Aliceの部屋の中のドキュメント用の引き出し」みたいなイメージです。

### 実際のパスの例:
- **/home/alice/Documents**: 
  ユーザーaliceのドキュメントフォルダ。例えば、/home/alice/Documents/report.txtはaliceのドキュメントフォルダ内に保存されたreport.txtというファイルを指します。
- **/home/alice/Pictures**:
  ユーザーaliceの画像フォルダ。例えば、/home/alice/Pictures/photo.jpgは、aliceの画像フォルダ内に保存された画像ファイル。

### 実際の使用例
自分のホームディレクトリに移動する:
```
cd ~
```
これは自分の部屋に戻る操作です。例えば、`/home/alice`がユーザーaliceのホームディレクトリです。

## トップレベルディレクトリ
   - **説明**: ルートディレクトリ直下に存在するディレクトリのことです。ルートディレクトリ直下にあるため、システムの重要な構成要素が含まれます。
   - **例**: トップレベルディレクトリは、都市の中にある主要な場所のようなものです。例えば、`/bin`は「都市にある食料品店」みたいなイメージです。このディレクトリにはシステム全体で利用される重要なプログラム（実行ファイル）が保存されています。また、`/etc`は「都市にある市役所」のように、システム全体の設定ファイルが含まれており、システム管理者が主に利用します。

### 実際のパスの例:
- **/bin/bash**:
Bashシェルの実行ファイル。bashは、ユーザーがシェル上で使うコマンドラインインターフェースです。

- **/usr/share**:
ユーザーが利用する共通リソースが格納されています。例えば、/usr/share/iconsにはシステムで使われるアイコンファイルが保存されています。

### 実際の使用例
トップレベルディレクトリの内容を表示する:
```
ls /
```
すると、`bin`, `etc`, `usr`など、システム全体に関わる重要な場所（ディレクトリ）が表示されます。
メモリ相性とGPU処理で意図せぬシャットダウン

# 技術メモというよりは備忘録に近いトラブルシュートです

## System unexpected shutdown due to memory combination


<details><summary>English brief comment</summary>


## Trouble shooting

:::note info
### System
- B550 / Ryzen5 3500
- RTX-3060
- 48MB memory DDR4 PC3200 similar brand
- Ubuntu 22.04LTS
:::

### Synptom
- Unexpected shutdown due to working AI script with GPU
- no log was recorded

### Failure cause
- replace other brand memory which is similar spec

## Resolution
- reinstall original memory set
- After GPU working is no problem




**If you cannot  find any error, plz remeber what you did!**


</details>

:::note info
### 環境概要
- B550 / Ryzen5 3500
- RTX-3060
- 48MB memory DDR4 PC3200 同一メーカ
:::

# トラブル発生
1. メモリを8GBから別メーカの16GBx2に差し替え(PC3200）
1. UEFIでの認識、Ubntu22.04起動は問題なし
1. とりあえずStable-diffusion実行
1. 画像生成が始まると予告なしのシャットダウン
1. Object Detectionでも突然シャットダウン

## ログは残っていない
- CPUのみ使用スクリプトでは問題なく完走
- nvidia-smiを叩いても表示上問題なし
- CUDAのバージョンも問題なさそう
- ログを残すよう負荷をかけるが何も残らず

## どうも少量のGPUメモリ使用なら問題なし
- 以前、GPUのVRAMの不良で負荷を2GB程度使うとコケたけどシャットダウンまではなかった
- 今回はちょっと雰囲気が違いますな。でも500MB程度の軽めのものなら動作しました

# 基本に立ち返る
- 現場100回ってことで、メモリをもとに戻す
**普通に動く！**

:::note info
# 結論
メインメモリの相性問題がGPU処理に影響出ることもあるのね
:::

### Appendix

https://github.com/mi-kaneyon/simple_stresschecker

- こんなもので切り分けしていました
- ツール作るまでもなかったというオチです
組込機器に無線インタフェースをつけるのって案外面倒？その2

## ～ WiFiの最大の課題はソフトウエア！？ ～

前回は、一言「組込機器の無線化」と言ってもいろいろ考えることがあって面倒です、というお話をしました。今回は「組込CPUにWiFiの無線デバイスを接続する」という具体的なケースで考えること・決めることをもう少し詳しく解説したいと思います。

## ■どのデバイスを使う？それは組込CPUとどうつながる？
各社から多くの無線デバイスが発売されていますが、まずターゲットとなる組込機器のCPU（以後ホストCPUと書きます）と物理的に繋がるものを選びましょう。現状、以下のようなものが一般的だと思います。

・SDIO
いわゆるSDカードのI/FをIO用途で利用するものです。ホストCPU側にSDIOドライバ（＊注）が別途必要になりますが、SDIOドライバだけで無線デバイス制御とデータの送受信の両方が実現できます。なお、ホストCPUでこのI/Fを使用する場合、SDアソシエーションへの加入が必要になります（ https://www.sdcard.org/ja/join-2/ ）。

:::note info
（＊注）この記事における「ドライバ」について

この記事において、「ドライバ」とはホストCPU上で動くデバイスを制御するためのソフトウエアのことを指します。例えばSDIOデバイスを制御するためのソフトウエアが「SDIOドライバ」、無線デバイスを制御するためのソフトウエアが「無線ドライバ」です。
:::

・USB
CPUがUSBホスト側、無線デバイスがUSBデバイス側として接続します。ホストCPU側にUSBホストコントローラドライバと、無線デバイスが使用するクラスに対応するホストクラスドライバが必要になります。たとえば無線デバイスを設定・制御するためにCOM（CDC-ACM）クラス、データの送受信を行うためにRNDISクラスを使用する、といった仕様の無線デバイスがあります。

・UART
シリアルI/Fのセンサデバイス自体はそのまま使いたい、といった用途にすぐ無線を採用できるよう、無線デバイスに無線ドライバ・TCP/IPプロトコルスタックまで入っているケースがあります。この場合ホストCPU側に必要なソフトウエアは無線デバイスにデータやコマンドを送るアプリケーションとUARTドライバのみです。新規に組込機器を開発し、シンプルなTCP通信のみで完結するのであれば、これが一番簡単です。逆に、ホストCPUにTCP/IPプロトコルスタックやアプリケーションを実装済みで、単にネットワークI/FをWiFiに変えたい場合は採用できません。この記事では取り上げないことにします。
（我々は他にもI/FがSPIの無線デバイスも実績がありますが、これもここでの説明は割愛します。）

ホストCPUの仕様に合わせて、SDIOかUSBで接続することになるかと思いますが、いずれの場合も専用のドライバが必要になります。CPUのマニュアルを参照して自力で実装することも可能ではありますが、難易度が高いため、CPUメーカが提供するドライバがあればそれを使ったり、我々Centeのようなミドルウエアメーカから入手することをお勧めします。「餅は餅屋に」です。

ここまで、ホストCPUと無線デバイスを接続して、ホストCPU上で動作するSDIOやUSBのドライバを用意するところまではそれほど障壁はありません。

## ■制御ソフトウエアはどうする？
何が面倒かというと、ホストCPU上で動作する、無線デバイスを設定したり制御するための「無線ドライバ」と呼ばれるソフトウエアの入手、が面倒なのです。今イメージしているホストCPUは、MMUが搭載されていない、メモリもそれほど多くない組込クラスのものなので、無線ドライバもOSなしまたはITRON(RTOS)上で動くものが必要になります。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032022/a35ac2e1-3829-639c-e085-52052c74c50c.png)
SDIO接続の場合にホストCPU側に必要なソフトウエア

ITRON(RTOS)用の無線ドライバソースコードが提供されていれば理想的、それがなくても制御コマンドの使い方、パラメータ詳細など、自分で無線ドライバを実装するために必要な情報が記載されたドキュメントがあればなんとかなります。しかし、実際には「Linux用の無線ドライバソースコードだけが提供されており、ドキュメントはない」というケースがほとんどなのです。それでも自力でITRON環境へ移植できる！という豪胆なエンジニアもいらっしゃるかもしれませんが、上手く動かなくてもメーカのサポートが受けられませんし、なんとなく動きそうだ、という状態に持って行けたとしても製品リリース後の保守運用を考えると製品としての採用はリスクが高すぎます。結局、このパターンの無線デバイスは（我々がターゲットとする規模の）組込機器の無線化には採用できない、ということです。

いかがでしょうか。無線ドライバというソフトウエアが解決すべき大きな課題の一つなのです。我々としても、この課題が解決できる無線デバイスの出現を待ち望んでいましたが、ついに組込CPU・ITRON環境で無線ドライバが動作する無線デバイスが発売になりました！次回はITRON環境で無線ドライバが動作するSDIO接続タイプ、次々回は無線ドライバが不要なUSB接続タイプを実際に使ってみた、という記事になります。お楽しみに！

Cente：
https://www.cente.jp/
お問合せはこちら：
https://www.cente.jp/otoiawase/

## ■今日の閑話
弊社にはベテランのスーパーエンジニアがいまして、制御方法が書かれたドキュメントと動作環境さえあれば、しっかりドライバを書いてくれます。多少デバイスの挙動に不明な点があっても、長年の勘と経験で（？）ちゃんと動くようにする様はいつ見ても見事です。しかし、そんな彼でも「GPLの問題はあるけど、技術的にLinux用の無線ドライバソースコードだけでITRON環境で動くようにできる？」とお願いしてみたときは「無理無理ぃ！」と即答されました。ある程度処理の流れやIOの様子はソースコードで読めるかもしれませんが、「なぜこのタイミングでこのコマンドを出すのか」「移植したらどのパラメータを変える必要があるのか」のエビデンスがないと何して良いかわからないでしょ！とのこと。おっしゃるとおりです…
dnfコマンド実行時のプロキシ指定

## はじめに
今回は`dnf`コマンド実行時のプロキシ設定方法について備忘も兼ねてまとめます。

## 結論
`/etc/dnf/dnf.conf`：設定ファイル にプロキシ設定を加える
※yumの場合は`/etc/yum.conf`

```
proxy=http://[プロキシhost]:[ポート]
```


```terminal:設定例
[cloudshell-user@ip-X-X-X-X ~]$ cat /etc/dnf/dnf.conf
# see `man dnf.conf` for defaults and possible options

[main]
gpgcheck=True
installonly_limit=3
clean_requirements_on_remove=True
best=False
skip_if_unavailable=True
timeout=10
proxy=http://proxy.jp:8080
```

以下の環境変数を使った設定では、dnfコマンド実行時にプロキシ設定が適用されません。
`export http_proxy=http://proxy:port/`
`export https_proxy=http://proxy:port/`
※`/etc/dnf/dnf.conf`の設定ファイルの内容で実行されるため

## 今回まとめようと思った経緯
AWSのCloudShellを使ってtracerouteを実行仕様としたところコマンドがインストールされておりませんでした。
```text:エラー
-bash: traceroute: command not found
```

インストールコマンドを実行しましたが、NWの経路が無かったりと前提条件を満たしていなかったのでプロキシを利用することに。
```text:インストールコマンド
sudo dnf install -y traceroute
```

「どこにプロキシ設定すれば良いんだよ！」と詰まってしまったので備忘も兼ねて以上です。

## 参考資料
https://repost.aws/knowledge-center/ec2-troubleshoot-yum-errors-al1-al2

https://qiita.com/mar-gitacount/items/1a91cbe64ee80185045e
Slack 開発者プログラムのSandboxを使ってEnterprise GridのSSO設定をする

## 1.はじめに
こんにちは。みなさんはSlackを普段使用していますか?
私の通っている学園では普段からSlackを使用しているのですが、業務で使用することも多くあると思います。
Slackには4つのプランがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522161/0ee3387e-3743-cda2-252b-448cdd74a7e9.png)
>引用:https://slack.com/intl/ja-jp/pricing

一番右側の **Enterprise Grid** は、大規模組織向けのプランなのですが、
**これ、使ってみてぇ！なんかロマンある！！**
と思いました。そこで色々調べていたら、開発者プログラムのSandbox機能があることを知り、早速登録しました。
Sandboxの登録方法はネットにたくさんあるので調べてください！

## 2.Auth0とGitHubを連携させよう！
#### 前提条件
Slack Enterprise Grid(Sandbox)を使用できる環境を持っている
Auth0のアカウント登録をしている


一人で使う場合、OrGオーナーは普通にメールアドレスとパスワードでログインできるのですが....暇だったのでやってみました。
OAuthにはGitHubを使用してOrganizationに所属している人がログインできる仕組みにしました。

これから設定に入っていきます。まずはAuth0とGitHubを連携します。
Auth0にログインし、Authentication→Socialと進んでいきます。
そしたらこのような画面になると思うので、**Create Connection**から登録していきます。
（私の場合すでにGitHubと連携させているので表示が違いますが気にしなくてOKです）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522161/48a37c05-5430-44e9-1c1a-ccd4a7252aa7.png)

そしたらこのような画面になると思います。ここからGitHubを選択します。
（Google WorkspaceやMicrosoftのアカウントと連携することも可能です）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522161/d81be134-2a9f-0cf0-38b2-13e24c4b4519.png)
これから先はチュートリアルがあるのでそれに沿って進めていってください。

GitHubとの連携テストも完了できたらいよいよSSO設定していきます

## 3.Slack Enterprise GridとSSO設定する
OrGの管理画面を開いて、セキュリティ→SSO設定と進んでいきます。
そしたら、SSO設定を始めましょう！的な画面が出るはず(うろ覚え)なのでクリックして進めていきます。

[SSO を一般的な ID プロバイダでセットアップする方法](https://slack.com/intl/ja-jp/help/articles/203772216-SAML-%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%AB%E3%82%B5%E3%82%A4%E3%83%B3%E3%82%AA%E3%83%B3)という文があると思うのでクリックしましょう。
そしたら別ページに飛ぶと思うのでスクロールして、Auth0をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522161/d31182ae-2cd7-08f8-af2c-75b6b827d228.png)

そしたら、Auth0のマーケットプレイスに飛ぶと思うので、Add Integrationをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522161/56769283-e35a-ea49-ba56-408a28fc2164.png)

そしたらテナント選択画面が出ると思うのでテナントを選択します。
New Slack Single Sign On SSO Integrationという画面が出ると思いますが、Continueで続行しましょう。

そしたら、このような画面が出てくると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522161/5941e800-07c4-f3af-4ee8-902904fc39fa.png)
Team NameにはSlackのリンクの一部を入力します
`test.enterprise.slack.com`という場合は、`test.enterprise`と入力します。
そうしないと、後から接続テストをする際にリダイレクトURLが違うとエラーが出てめんどくさいです。
(出てもURLを訂正したらいいだけなのですが、、、)
そしたらTutorialが出てくるのでチュートリアルにそって、URLをコピペしたりしていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522161/07f411da-a633-b8c9-b250-a4f422763e5e.png)
基本的にはそのままです。書いている内容をコピペしていきます。
ですが、最後の **「レスポンスに署名する」** のチェックボックスは外したほうがいいかもしれません。私の環境だけかもしれませんがエラーが出て進みませんでした。
入力が完了したら、テスト設定をクリックして、テストしてみましょう！
エラーが出なかったら成功です！最後に「更新を確認する」ボタンを押して、確定させましょう。
お疲れ様でした！これでSSO設定は完了です！

## 4.終わり
お疲れ様でした！！！文章がぐちゃぐちゃになったかもしれませんが、最後まで読んでくださりありがとうございました！
私が書いていて楽しかったので大満足です。
DockerにてJenkinsをダウンロード ver.windows

Dockerを使ってJenkinsを立ち上げる。

## Jenkinsダウンロード
Dockerをインストールした状態から以下のコマンドをwslで実行する。
```
docker pull jenkins/jenkins
```

## Jenkinsの起動
以下のコマンドでJenkinsサーバのコンテナを作成する。
```
docker run -p 8080:8080 -p 50000:50000 jenkins/jenkins
```

初めにログインすると、トークンパスワードを聞かれるので、コンテナ作成時にコマンドプロンプトに表示されたパスワードを入力する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850581/2e511806-6a7c-aec8-d917-6b3dd5c0c5e6.png)

## 参考
https://www.jenkins.io/doc/book/installing/docker/#:~:text=continue%20accessing%20Jenkins.-,Unlocking%20Jenkins,the%20Unlock%20Jenkins%20page%20appears.
AZ-900資格試験に合格するためのおすすめコンテンツと半額で受験する方法


Azureの基本知識を問われる AZ-900 試験 に合格しましたので、実際に私が使用した教材や、最短で合格するための方法を、経験に基づいてご紹介します。

私の前提条件
IT未経験
文系出身
クラウド関連は初めて
基本情報技術者試験の勉強経験あり（ネットワーク基礎知識を持っています）
学習期間は、8月1日から始めて、9月上旬に合格したので 約1ヶ月 でした。平日は 2〜3時間 程度の学習を行いました。

実践した学習法
1. Microsoft Virtual Training Days（ウェビナー）に参加
まず、Microsoftが定期的に開催している 無料ウェビナー に参加することをおすすめします。このウェビナーでは、Azureの基礎を学ぶことができ、ITの専門知識がなくても理解できるような内容になっています。私も最初はこのウェビナーを利用しました。

メリット

マイクロソフトのエキスパートによる解説
2024年9月現在、対象のコースに参加すると 認定資格試験が50％割引 で受験できる特典あり
2. Microsoft Learnで学習
ウェビナーで基礎知識を得たら、次に Microsoft Learn を活用しました。無料のオンライン学習プラットフォームで、より詳細な学習ができるだけでなく、 サンドボックス環境 が提供されているため、実際にAzureの管理画面を操作して学ぶことができます。

おすすめコース
AZ-900T00-A: Microsoft Azure の基礎 - Training | Microsoft Learn

3. 評価試験を受ける
学習の進捗を確認するために、 評価試験 を受けるのも効果的です。この試験は本番よりも少し簡単な傾向がありますが、本番でも似たような問題が出題されます。私は評価試験で 90％以上 のスコアを3回繰り返し取ることで、十分な自信を持って本番に臨むことができました。

Microsoft Certified: Azure Fundamentals - Certifications | Microsoft Learn

4. Azureを実際に操作してみる
Microsoftアカウントさえあれば、 無料でAzure Portal にアクセスして、実際に操作することができます。特に、Azureのリソースを触ってみることで、学んだ知識が定着しやすくなりました。

ホーム - Microsoft Azure

半額で試験を受ける方法
前述したように、Microsoft Virtual Training Daysのウェビナーに参加すると、 認定資格試験を50％割引 で受験することができます。これにより、通常の半額で試験に挑戦できるため、非常にお得です。

最後まで読んでいただき、ありがとうございます！文法や誤字、脱字があるかもしれませんが、今後ともよろしくお願いいたします。
【OCI】hostsファイルが巻き戻ってしまう

# はじめに
OCI(Oracle Cloud Infrastructure)でComputeサーバ(OracleLinux)を立てていろいろと触っていたところ、
hostsファイル(/etc/hosts)に追記した内容が消えていることに気が付きました。
同じ現象でハマらないようメモを残しておきます。

# 現象
dummyserver01という名前のサーバを作成し、「dummyserver01.infomart.co.jp」という名前でも内部解決できるようhostsを設定しました。

+ 変更後のhosts
```
172.16.xx.2 他のエントリ
172.16.xx.3 他のエントリ

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.xx.1 dummyserver01.xxxxx.yyyyy.oraclevcn.com dummyserver01 dummyserver01.infomart.co.jp
```

+ しばらく放置した後のhosts
```
172.16.xx.2 他のエントリ
172.16.xx.3 他のエントリ

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.xx.1 dummyserver01.xxxxx.yyyyy.oraclevcn.com dummyserver01
```

上記のように、他サーバのエントリは変わっていないのですが、
自サーバのエントリに追記した「dummyserver01.infomart.co.jp」が消えてしまっています。
hostsの更新時刻も触った覚えのない時刻になっていました。

変更できないわけではなく、いったんは名前解決できるもののいつの間にか何らかのプロセスによって勝手にロールバックされてしまっているようです。

# 解決
```/etc/oci-hostname.conf``` の仕組みによりhostsファイルが上書きされるという仕様だからでした。

[DHCPオプションの処理](https://docs.public.oneportal.content.oci.oraclecloud.com/ja-jp/iaas/compute-cloud-at-customer/topics/network/working-with-dhcp-options.htm)
> /etc/hostsファイルに加えた変更は、DHCPリースの更新やインスタンスの再起動のたびに上書きされます。変更内容をLinuxまたはCentOSインスタンスの/etc/hostsファイルに永続化するには、/etc/oci-hostname.confに次の行を追加します: PRESERVE_HOSTINFO=2。/etc/oci-hostname.confファイルが存在しない場合は作成します。

では現状のoci-hostname.confを見てみましょう。

```/etc/oci-hostname.conf
# This configuration file controls the hostname persistence behavior for Oracle Linux
# compute instance on Oracle Cloud Infrastructure (formerly Baremetal Cloud Services)
# Set PRESERVE_HOSTINFO to one of the following values
#   0 -- default behavior to update hostname, /etc/hosts and /etc/resolv.conf to
#        reflect the hostname set during instance creation from the metadata service
#   1 -- preserve user configured hostname across reboots; update /etc/hosts and
#           /etc/resolv.conf from the metadata service
#   2 -- preserve user configured hostname across instance reboots; no custom
#        changes to /etc/hosts and /etc/resolv.conf from the metadata service,
#        but dhclient will still overwrite /etc/resolv.conf
#   3 -- preserve hostname and /etc/hosts entries across instance reboots;
#        update /etc/resolv.conf from instance metadata service
PRESERVE_HOSTINFO=0
```
ファイルを開くとコメントにPRESERVE_HOSTINFOの値の意味が書いてありました。
まとめると以下のことのようです。

| 値 | ホスト名 | /etc/hosts | /etc/resolv.conf | 備考 |
| -- | -- | -- | -- | -- |
| 0 | 上書き | 上書き | 上書き | デフォルト |
| 1 | **変更なし** | 上書き | 上書き | |
| 2 | **変更なし** | **変更なし** | **変更なし** [^1] | ドキュメントのおすすめ |
| 3 | **変更なし** | **変更なし** | 上書き | |   

[^1]:dhclientの働きによって上書きされることがある 

マニュアルの記載に従い、 ```/etc/oci-hostname.conf``` の ```PRESERVE_HOSTINFO=2``` にすると
hostsファイルが巻き戻る現象は治まりました。

設定変更後は再起動などは必要ありませんでした。
【Vue.js】読取専用の変数はv-modelには設定してはいけない

## 前提
- Vueに始めて触れたのは「Vue.js 3.x」から
- 一般的なHTMLは習得
- AngularやPHPはかじったことがある

## きっかけ
Vueのことを少しずつ習得しつつある中でろCmputedを覚えそのComputedをv-modelに設定して実装をしてしまいました。
そのときVueに精通してる方から「なぜComputedをここに設定しているの？」と問われ
「v-modelに決まりとかあったの？？？」となったことがきっかけです。

## v-modelとは
<a id=https://v2.ja.vuejs.org/v2/guide/components.html#%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%81%A7-v-model-%E3%82%92%E4%BD%BF%E3%81%86>公式リファレンス</a>にもあるようにv-modelとは「v-bind」と「v-on」の機能が合体したものです。

``` vue
<input
  v-bind:value="nameText"
  v-on:input="nameText = $event.target.value"
>
```
v-model
```vue
<input v-model="nameText">
```

## 間違っていたこと
きっかけとしてはComputedの扱っていたことで分かったことですが、このv-modelは前述にあるように**v-on:input**しているため、v-modelとして設定されているものに対して書き込みを行ってしまいます。
ここでは触れませんが、「Computed」は基本的に読取専用です。書き込みを想定するのであれば「Writable Computed」という書き込みも想定しているものを使用するのが適切です。
そのため、定数や画面操作によって値が書き換わる想定をしていない変数などはv-modelに設定してはいけません。

NG
```HTML
<script setup lang="ts">
    const firstName = ref('');
    const lastName = ref('');
    const nameText = computed(() => `${firstName.value} ${lastName.value}`);

</script>

<template>
    <!--入力用-->
    <input
      v-model:firstName
    >
    <input
      v-model:lastName
    >

    <!--表示用-->
    <input
      v-model:nameText
    >
</template>
```

OK
```vue
<script setup lang="ts">
    const firstName = ref('');
    const lastName = ref('');
    const nameText = ref('');
    const nameTextWrite = computed({
        get: () => nameText.value,
        set: (value) => {
         name.Text.value = `${firstName.value} ${lastName.value}`;
        }
    });

</script>

<template>
    <!--入力用-->
    <input
      v-model:firstName
    >
    <input
      v-model:lastName
    >

    <!--表示用-->
    <input
      v-model:nameText
    >
</template>
```

## まとめ
なんとなく便利だなぁ～ぐらいの気持ちでVueを使っていましたが、設定するものによってvueの機能も使い分けなくてはいけないのだと思い知りました。（当たり前だけど）
Unityで作成したゲームをweb上にデプロイしたら文字が消えた

# はじめに
https://qiita.com/fukaken5050/items/03e07ba3700f5be8c35f
この記事にしたがってweb上に作ったゲームをデプロイしてみたところ、デプロイ自体はできたのですが文字が表示されませんでした。色々調べて解決できたので解決方法をまとめていきます。

# 原因
Unityに標準で適用されているフォントだと表示されないらしいです。なので、フォントを変えます。

# フォントを変更
### フォントをダウンロード
https://fonts.google.com/specimen/Noto+Sans+JP
上のリンクからフォントをダウンロードして、解凍しておきます。

### フォントをUnityのプロジェクトに追加し適用
UnityのAssetsフォルダにFontsフォルダを作成し、そこにさっき解凍したファイルを追加します。追加したら適用したいTextのTextコンポーネントのFontに追加したファイルを適用します。
![スクリーンショット 2024-09-30 142922.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3896631/1203efb7-086f-cb49-3258-10b067f5a8a0.png)


もし新たにフォントを適用して文字が画面に映らなくなってしまった場合はだいたい文字のサイズが原因なので、TextコンポーネントのFont Sizeをいじってみてください。
![スクリーンショット 2024-09-30 143114.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3896631/3108b823-ebef-d968-9fca-a93edaa5ea9a.png)

これでweb上でも文字が表示されるようになりました。
【Ruby on Rails】なぜ非同期通信(deliver_later)で、メールの送信状況が不安定になる現象が発生するのか？

# メモ

### はじめに

Ruby on Railsを用いたアプリケーション開発をしていく中で、「**非同期通信でメール送信を行う場合、たまに送信されない現象が発生する**」という怪奇現象にぶち当たり、原因が判明したので本記事にて共有します。

# 同期通信と非同期通信のメール処理の違い

まず、メール送信処理に関わる同期通信と非同期通信の違いについて、表を用いて解説します。
||同期通信|非同期通信|
|:-:|:--|:--|
|内容|逐次処理でメールを通信する|並行処理でメールを通信する|
|メソッド|`deliver_now`|`deliver_later`|
|処理時間|大きい|小さい|
|特徴(メール受信)|確実にメールが届く|ジョブが中断されるとメールが届かない|
|特徴(トランザクション)|同じトランザクションで処理する|非同期通信用のトランザクションを立てて処理する|
|用途|1つ1つ確実に送る場合|メールを大量に送る場合|

同期通信と非同期通信の大きな違いは、処理手順が**逐次処理(順番に行う処理)なのか、もしくは並行処理なのか**ということです。逐次処理の場合は同じトランザクション内で処理し、プログラムを順番に実行するので、その分処理時間を要します。一方で、順番に実行するので、メールが確実に届くといったメリットがあります。並行処理の場合は、非同期通信する部分については裏側に非同期用のトランザクションを立てて処理を同時並行を行います。その分処理時間は短くなり、メールを大量送信する場合に向いています。しかし、**表側の処理が完了した場合、裏側でジョブが残っていても途中で中断されてしまう**といった特徴があります。

私の開発環境ではActiveJob(キュー操作を管理してくれるフレームワーク)を使ってメール送信をしているのですが、途中で中断されてしまう問題を解決するために、ActiveJob以外にも他のキューイングライブラリを使って解決する方法もあるみたいなので、気になる方は[こちらのサイト](https://railsguides.jp/active_job_basics.html#%E3%83%90%E3%83%83%E3%82%AF%E3%82%A8%E3%83%B3%E3%83%89%E3%82%92%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B)などを参考にしてみてください。

# メールの送信状況が不安定になる原因

今回の判明した不具合は、上記の表の「特徴(トランザクション)」で挙げた、同じトランザクション内で処理するか、別のトランザクションで処理するかの違いで発生していたものでした。私の環境では非同期通信でメールを送信する際に、メールが送られる場合と送られない場合がありました(大体20%くらいの確率で送られていなかったです)。

そこで、送信されなかったメールのログを解析したところ、下記のようなエラーが発生していました。
```
ActiveJob::DeserializationError (Error while trying to deserialize arguments: XXXXXXX）
```
このエラーの詳細は、DBからデータをオブジェクトとして再構成(デシリアライズ)しようと試みたものの失敗しているということを表します。個人的にはこのエラーの内容についてすぐには理解できなかったので、わかりやすいように、メール送信処理が上手くいっている場合と上手くいっていない場合とで、図で示します。

### メール送信処理がうまくいっている場合
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661690/e24ce00e-dc3a-62d5-408f-8415b6b9334a.png" width="700"> 

### メール送信処理がうまくいっていない場合
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661690/c3237fe2-1e3a-aeb2-cb59-6b37f9e7457b.png" width="700">

### 送信状況が不安定になる要因の分析
メール送信処理が上手くいっている場合は、メインのトランザクションでコミットが終了してからジョブを実行し、上手くいってない場合は、コミット終了前にジョブを実行していることが確認できます。
非同期通信のジョブの途中でDBアクセスが発生しない場合は特に問題がないのですが、下記条件が揃った時は、送信状況が不安定になる可能性があります。

* コミット前に非同期通信が行われている
* 非同期通信の処理中でDBにアクセスする処理を挟んでいる

比較的シンプルなアプリケーションであれば、このような問題は起きにくいと思うのですが、チーム開発などで大規模なアプリケーションを構築している場合に、起きると考えられます。

# 対応策
上記問題について、対応策は主に3つ程度あると考えられます。下記どちらかの施策を行うことで、安定的に非同期通信でもメールが送信できます。

### 1. 非同期通信内ではDBのアクセスは一切行わない
DBのアクセスが原因で不具合が発生しているので、メインのトランザクションの処理でDBのアクセス処理を済ませ、パラメータを渡してあげるのが1つかと思います。

### 2. 同期通信を使う
別々のトランザクションで行うことによりDBのアクセス不整合が発生しているので、同一のトランザクションで完結させるといった方法です。こちらは、メールの送信数が少ない場合にはお勧めできます。

### 3. トランザクション処理内で非同期通信は行わない(1番おすすめ)
個人的には一番おすすめでこちらで対処したのですが、トランザクション中に別のトランザクションを立てること自体あまり望ましくないので、トランザクションの外で非同期通信を実行する方法になります。

# 最後に
今回、非同期通信にてメールの送信状況が不安定になる現象について解説しました。もちろん同じ原因であっても、エラーの種類は何種類かある場合もありますので、一つ参考にしていただければと思います。


自分もこのエラーを通して、同期通信や非同期通信の違いにトランザクション処理について、深く学べた良い機会になったかなと思いました！
How I applied factory pattern to query prices

# What is factory pattern
Tying your code to a concrete class can make it more fragile and less flexible.

Head First book gives example like this.

```java
Duck duck;

if (picnic){
    duck = new MallardDuck();
} else if (hunting) {
    duck = new DecoyDuck();
} else if (inBathTub){
    duck = RubberDuck();
}
```

Here we have got several concrete classes being instantiated, and the decision of which to instantiate is made at runtime depending on some set of conditions.

When you see code like this, you know that when it comes time for changes or extensions, you'll have to reopen this code and examine what needs to be added (or deleted). Often this kind of code ends up in several parts of the application, making maintenance and updates more difficult and error-prone.

By coding to an interface, you know you can insulate yourself from many of the changes that might happen to a system down the road. Why? If your code is written to an interface, then it will work with any new classes implementing that interface through polymorphism. Howevere when you have code that makes use of lots of concrete classes, you are looking for trouble because that code may have to be changed as new concrete classes are added.

Whenever you are dealing with types of classes and having to instantiate different types of  classes based on some condition, we can extract that part and create a Factory Class. Factory Class is responsible to instantiate different types of classes based on input.

# How I applied Factory pattern to my use case
I often query prices for equities of FI securities. Equity prices are estored in ```eq_prices``` table and FI prices are stored in ```fi_prices``` table. You can see that depending on a condition, equity vs FI I will need to query different tables.

My factory class looks like below

```python
class PriceQueryFactory:
    def createPriceQuery(self, asset_type, dbh):
        if asset_type == PriceAssetType.eq:
            return EquityPriceQuery(dbh)
        elif asset_type == PriceAssetType.fi:
            return FIPriceQuery(dbh)
```

And this is how I use the factory class in action

```python
def get_cusip_prices_adate_with_px_hi(cusips, adate, dbh, con, px_hi='NAV', asset_type=PriceAssetType.eq, chunk_size=400):
    price_query_factory = PriceQueryFactory()
    price_query_obj = price_query_factory.createPriceQuery(asset_type, dbh)
    price_query_obj = PxHierPriceQuery(price_query_obj, px_hi)
    return get_db_records_in_chunks(cusips, price_query_obj.get_px_asof, con, chunk_size, adate)
```

This way I am decoupling the function ```get_cusip_prices_adate_with_px_hi``` from actual implementations of like ```EquityPriceQuery``` or ```FIPriceQuery```. I can easily swap ```EquityPriceQuery``` with ```EquityPriceQueryV2``` without impacting the function.
EC2とスマホをOpenVPNでつなげてみた。

<h2>はじめに</h2>
今回はEC2を立てるところから、スマホからOpenVPNを使って接続するところまでの解説です。といっても初学者なので、至らぬところがあればご指摘ください。

<h2>1.EC2を立てる</h2>
<h3>グローバルIPを固定させる必要がある</h3>
VPNをつかってクライアントからアクセスするときに、宛先グローバルアドレスIPアドレスが必要です。この宛先グローバルアドレスがコロコロ変わるとそのたびに設定を書き換えないといけません。それは面倒なので今回はグローバルIPを固定させます。固定IPを契約するか、EC2をつけっぱなしにするとグローバルIPを固定できます。今回は安い個人開発用の安いEC2なので、つけっぱなしにしてIPを固定させます。

<h3>EC2を立てる</h3>
下記記事で進めたらうまくいきました。

https://qiita.com/yu0224miao/items/e897fe50613a3d34a4e2


<h2>2.EC2側の設定。</h2>
<h3>easyrsaを使ってと証明書の生成。</h3>
・easyrsaを使って秘密鍵と証明書の生成。

https://docs.nifcloud.com/network/guide/cert_easy-rsa.htm
<h3>tlskeyを生成</h3>

```:bash
openvpn --genkey --secret ta.key
```


<h3>server側のconf作成</h3>
詳しくは調べてみてください。
以下は例です。基本的にこれで動きます。

```:server.conf
port 1194
proto udp
dev tun

ca /path/to/your/ca.crt
cert /path/to/your/server.crt
key /path/to/your/server.key
dh /path/to/your/dh.pem

server 10.0.31.0 255.255.255.0

keepalive 10 120

cipher AES-256-CBC
auth SHA256

topology subnet

persist-key
persist-tun

status /var/log/openvpn-status.log
log-append /var/log/openvpn.log
verb 3

tls-server
tls-auth /path/to/your/ta.key 0

push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
```

<h3>odooを起動する</h3>

```bash
sudo systemctl restart openvpn 
```

<h2>3.スマホ側の設定。</h2>
<h3>設定ファイル作成</h3>
.ovpnの拡張子をもつテキストファイルをつくる。
中身は下記参照。細かいvpnの設定は省きます。
気になる人は調べてみてください。

https://qiita.com/ghost-dog/items/aeb3467e41d58201abfd

```:client.ovpn
client
dev tun
proto udp
remote 外部固定IP 1194
resolv-retry infinite
persist-key
persist-tun
remote-cert-tls server
auth SHA256
cipher AES-256-CBC
verb 3

key-direction 1


<ca>
-----BEGIN CERTIFICATE-----
生成されたCA証明書
-----END CERTIFICATE-----
</ca>

<cert>
-----BEGIN CERTIFICATE-----
生成されたクライアント証明書
-----END CERTIFICATE-----
</cert>

<key>
-----BEGIN PRIVATE KEY-----
生成されたクライアントkey
-----END PRIVATE KEY-----
</key>

<tls-auth>
#
# 2048 bit OpenVPN static key
#
-----BEGIN OpenVPN Static key V1-----
生成されたtls用のkey
-----END OpenVPN Static key V1-----
</tls-auth>



```
<h3>スマホにopenVPNアプリを入れる</h3>
Android版

https://play.google.com/store/apps/details?id=net.openvpn.openvpn&hl=ja

IOS版

https://apps.apple.com/jp/app/openvpn-connect-openvpn-app/id590379981

<h3>スマホ側のVPN設定</h3>
下記手順で設定ファイルをインポートする。

https://www.iimc.kyoto-u.ac.jp/ja/services/network/vpn/setupandroidopenvpn.html

<h2>tips</h2>
OpenVPNにはVPNを経由するアプリを指定する機能があります。
今回の僕のケースでは非公開のWEBサイトにアクセスするようで使いたかったので、FirefoxだけをVPN経由させることにしました。

<h2>最後に</h2>
はじめてEC2立てるレベルの雑魚エンジニアなので、間違っているところがあればご指摘いただきたいです。

<h2>追記_20241004</h2>
EC2をRebootすると、グローバルIPアドレスがかわることがあります。
その時は、クライアント側で設定してある接続先グローバルIPアドレスを編集すると再度つながるようになります。これも固定IPアドレスを取得しないときのデメリットです。ただ、OpenVPNのアプリ内で簡単に接続先グローバルIPアドレスを編集できるので、私の場合はそこまで苦ではありませんでした。
AWS IAMについて

### AWSのセキュリティサービスメモ

---

#### はじめに
記事初投稿いたします。  
AWSを学んだばかりということで、AWSのセキュリティサービスについてメモ程度で書いていきたいと思います。

---

#### AWSにはRoot UserとIAM Userがあります

- **Root ユーザーとは...**  
  はじめに、登録したメールアドレスとパスワードでログインできるユーザーでAWSリソースに対してフル権限を持ちます

- **IAM ユーザーとは...**  
  Root ユーザーで作成された個別のユーザーを指す。通常はIAMユーザーでログインし運用・開発を行います

---

#### IAMの深堀り

IAMには、IAMユーザー、IAMロール、IAMポリシー、IAMグループがあります。一つずつ言葉の定義を抑えていきます。

- **IAMユーザーとIAMポリシー**  
  ルートユーザーと違い、IAMユーザーにはIAMポリシーをアタッチしてできることを制限できます。そのため、IAMユーザーには最小権限の原則に基づいて、余計な権限を与えずに必要な権限のみを与えることがポイントになります

IAMポリシーには以下の3種類があります

1. **AWS管理ポリシー**  
   AWSが作成、管理しているポリシーで、AWSアカウントに初めから用意されています

2. **カスタマー管理ポリシー**  
   ユーザーが作成管理しているポリシーです。どちらのポリシーも複数のIAMユーザーにアタッチできます

3. **インラインポリシー**  
   特定のユーザーにだけ直接設定するのがインラインポリシーになります

---


- **IAMポリシーのアタッチ**  
   例えばIAMユーザーが100人いたと仮定します。一人一人にIAMポリシーを個別にアタッチすることもできますが、それでは管理が煩雑になります。そこで利用するのがIAMグループになります

- **IAMグループとは...**  
   複数のIAMユーザーの集まりであり、権限の管理をよりシンプルにするメリットがあります。複数のIAMユーザーに一度に同じ権限を付与することが可能です

- **IAMロールとは...**  
   一時的な権限を与える役割として作成しておきます。IAMロールを使用すれば、EC2などのAWSサービスや他のアカウントに対してAWSの操作権限を付与するための仕組みです。さらには、IAMユーザーに一時的なアクセス権限を与えることも可能です。AWSの外部で認証されたユーザーに対してアクセス権限を当てることでフェデレーションを実現できます

---

#### さいごに

今回はAWSのセキュリティサービスについてまとめました。生成AIやクラウドサービスがトレンドになっており、移り変わりが早く情報のキャッチアップが大変ですが、今後も、内容を小分けにして簡単にまとめていこうと思います！！

---
raspiでtp-link AC600

いくつかのサイトでAC600がLinuxで動くみたいな記事を見つけたので
試してみたがどうもまともに動かない。

こちらで試した手順を以下に記載

# 環境
raspi 4 
ubuntu 22.04

## AC600
AC600のベンダIDとかは以下
```shell
Bus 001 Device 005: ID 0bda:c820 Realtek Semiconductor Corp. 802.11ac NIC
```

# 履歴



## aircrack-ng
コード中に`C820`が存在しないので動くわけ無い
https://github.com/aircrack-ng/rtl8812au

b44d288f423ede0fc7cdbf92d07a7772cd727de4

## jeremyb31
無事プロダクトIDが見つかったので動きそうと思ったが、、、
https://github.com/jeremyb31/rtl8812au-1.git

577abb0e5688420bb73363f44a2506a8fbb8b563


まともにビルド通らない。
`CONFIG_RTL8821C`を定義しないといけないが
これを定義すると`rtl8821c`ディレクトリを読みに行く。
そんなディレクトリ無い。
これも動くわけ無い。

## lwfinger

結局動いたのはこれ。
https://github.com/lwfinger/rtw88

764a1ee307d7e5720a93b8139c94d76737eced91

以下のコマンドでbuildとinstallまで一括でやってくれる。
```
ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- make install
```

以下が作成されるが不要な(動かなくなる)ので削除した。
`/etc/modprobe.d/blacklist-rtw88.conf`


# 動作状況
hostapdでAPにして動かした。クライアント(fedora及びiPhone)から接続できることも確認。
```
3: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether e4:5f:01:bc:3b:38 brd ff:ff:ff:ff:ff:ff
4: wlxa86e8470fc82: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether a8:6e:84:70:fc:82 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.1/24 brd 192.168.100.255 scope global wlxa86e8470fc82
       valid_lft forever preferred_lft forever
    inet6 fe80::aa6e:84ff:fe70:fc82/64 scope link 
       valid_lft forever preferred_lft forever
```

```
# lsmod | grep rtw
rtw_8821cu             16384  0
rtw_usb                28672  1 rtw_8821cu
rtw_8821c              94208  1 rtw_8821cu
rtw_core              290816  2 rtw_usb,rtw_8821c
mac80211             1228800  2 rtw_usb,rtw_core
cfg80211              966656  3 rtw_core,brcmfmac,mac80211
```
E資格 2024#2 に受かったので所感

　2024/9/1に受験したE資格の結果が帰ってきて、無事合格したので所感です。
　今後E資格を受ける人が情報を漁る際の、一つのデータになればいいなーと思ってます。

 ![Screenshot 2024-09-30 at 14.02.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681434/75bb12d6-45dd-e6fc-eecb-c3fc1332c680.png)
![Screenshot 2024-09-30 at 14.02.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681434/b47b0a8d-389b-f7c7-45e8-03b257361c72.png)


# 要約(伝えたいこと
　「8割の問題の意味をちゃんと理解した上で、実感を伴って試験問題が解ける」のレベル ＝ 各種論文を読んで概要を理解できるレベル
　「3割の問題の意味はわかって解けるけど、残りは部分的な単語とか、推測、雰囲気で解くしかない」のレベル = 半年くらいふわふわと機械学習系の勉強をしてきたレベル
　後者のレベルでも合格はできる

## 僕が受験対策始める前の状況
- 東京大学松尾研究所の公開授業をいくつかとっていた
- プログラミング2年くらい触っていた
- G検定を2024年1月に受験、合格済
 

## 僕がやった対策
　2ヶ月前くらいから対策しようとしてはいたのですが、ずるずる何もやらずに実際は半月前くらいから追い込んだ勉強で済ませました。
　もっと言えば、直近三日間位が勉強の8割を占めてたと思います。前日の夜に、「え、そんなことも範囲なの！？」がありました。

　具体的には、以下のことをやりました。
- 『徹底攻略ディープラーニングE資格エンジニア問題集 第2版』(いわゆる黒本？)の19章の総合演習をやって、わからなかった問題について前半の個別章に戻って確認
- シラバスを印刷し、知らない単語を全部調べて説明を読む (シラバスは、「編みかけの部分は出題範囲ではない」みたいなややこしい記述になっているので注意

　基本的にはこれだけです。


# おわりに
　受験中、難しい問題が多すぎてびっくりしました。「あー今回の受験料はドブになったなぁ」と本気で思っていましたが、問題文の端の単語から推測して答えたり、いろんな周辺知識を引っ張り出して当てずっぽうで答えたりしました。すると運よく受かってしまった、という形なので、問題が難しすぎてもビビる必要はないと思います。
　今後は、あの難しい問題たちをちゃんと理解した上で確信を持って回答できるレベル感になるべく、ちゃんと論文も読めるように努力したいと思います。
WebP拡張子に変換して画像ファイルを圧縮しよう


# WebP（ウェッピー）ってなに

まず、これウェッピーって読むらしいです。（私はウェブピーと読んでました笑）

2010 年に Google が開発した画像の形式らしいです。普段利用する画像の形式である、`jpg`や`png`などよりも圧縮率が高く、さらに特に画質が劣化する印象もないらしい！！

WebP に変換するツールとして、Google が開発した、<strong>Squoosh(スクワッシュ)</strong>というものがあり、プレビューなどをみながら変換することができるので、圧縮しすぎると粗くなってしまいますが、適度に圧縮すると特に見た感じ影響はなさそうです。

https://squoosh.app/

ただ、こちらは画像を一枚ずつしか変換することができないようなので、こちらのサイトもおすすめです。

https://saruwakakun.com/tools/png-jpeg-to-webp/

ぜひご活用ください。
Box上で不正な操作をされていないか監視する（情シス目線）

#### はじめに  
企業内でのファイル共有サービスとして利用されている「Box」は、非常に高い利便性を提供する一方で、その管理やセキュリティリスクも無視できません。特に、Box上のファイルが不正アクセスされたり、セキュリティ設定が意図せず変更されたりするリスクは、企業の情報システム部門にとって大きな懸念事項です。

こうしたリスクに対処するためには、Boxの提供する「レポート機能」を活用してみましょう。

<br>
<br>

#### Boxのレポート機能を活用した監視
Boxのレポート機能は、運用部門や情シスがセキュリティ管理を行う際に非常に強力なツールです。特に、以下のポイントを意識することで、より効果的な監視体制を構築できます。

<br>

● **レポートの定期的な出力**
Boxの管理者向けダッシュボードから、定期的にレポートを出力することが重要です。これにより、過去の使用状況やユーザーアクティビティを時系列で確認し、問題がないかチェックすることができます。レポートの出力は、月次や週次など企業の運用ポリシーに合わせて実施します。

<br>

● **ユーザーアクティビティの監視**
レポートには、各ユーザーがどのファイルにアクセスしたか、誰に共有したか、ファイルに対してどのような操作を行ったかといった詳細な情報が含まれます。不正にファイルが共有された場合や、不審な時間帯にアクセスがあった場合、迅速な対応が求められます。

<br>

● **セキュリティ設定の変更履歴のチェック**
セキュリティ設定が不正に変更されていないかも確認すべき重要なポイントです。レポート機能を使うことで、設定の変更履歴や誰がどのような変更を行ったかを迅速に確認できるため、セキュリティの一環として欠かせません。

<br>
<br>

#### 実際に使用してみた
実際に、Boxのレポート機能を使用して監視作業を行ってみました。以下はその具体的な操作手順と感想についてです。

<br>

● **レポート作成の手順**
   Boxの管理者ダッシュボードから「レポート機能」を選択し、ユーザーアクティビティやアクセス履歴をレポートとして出力します。
   
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799749/75ef3ff3-205a-cb19-62a4-9d18470ae54a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799749/9812d7d0-d432-1584-7689-4b164ab23e96.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799749/581e8720-abc2-c216-3945-48ba91a474a7.png)

操作画面も分かりやすく、特定のユーザーやファイルに絞ったデータ抽出がスムーズに行えました。たとえば、指定期間内に特定のフォルダへアクセスしたユーザーの一覧や、共有されたファイルの詳細情報も容易に取得でき、監視業務に大いに役立ちました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799749/4d4e8a2c-690a-64d9-7720-0ef4f27192a6.png)

※「実行」でレポートをファイル出力した際、当日の操作ログが反映されていないことがあり、レポートに操作が記録されていないことがあります。
また、他社のBoxテナントでもレポート出力が頻繁に行われる場合、自社で出力するログの期間に関わらず、レポート出力までに時間がかかることがあります。

<br>

● **監視結果の精度と効率**
   優れていると感じた点は、レポートの精度です。アクセス履歴やファイル操作の詳細なログが記録されているため、不正な操作やアクセスの兆候を素早く把握できます。異常な時間帯にアクセスがあった場合や、通常では行われない設定変更があった場合、アラートとして通知される機能も非常に便利です。レポートをチェックすることで、何か問題が起きた際にも、早期に是正措置を取ることができます。

<br>

● **気になった点**
   一方で、レポートの出力頻度や形式に関してもう少し柔軟な設定ができるとさらに使いやすくなると感じました。現状では一部はレポートの定期実行ができますが手動でレポートを出力する必要がある場面も多いため、将来的には全てのレポートが定期実行できるようになるほかカスタマイズ可能なアラートの設定が追加されれば、さらに効率的な監視体制が整うと思います。

<br>
<br>

#### まとめ
Boxのレポート機能は、会社の情報セキュリティ管理においてとても便利です。定期的にレポートを作成し、ユーザーの動きやファイルアクセスの履歴をチェックすることで、不正な操作や意図しないファイル共有をいち早く見つけることができます。加えて会社のデータセキュリティを守り、安心して運用ができます。ぜひ試してみてください！
Google Play Consoleの「com.example」は制限されているため、別のパッケージ名を使用する必要があります。を解決する

# エラーが起きた
Android StudioでAndroidアプリを開発したので、Google Playに公開しようと思って準備を進めていましたが、
以下の画像の通り「内部テスト版リリースの作成」のApp Bundleのアップロードでエラーが出たので解決方法をご紹介します。
僕みたいに悩んで2,3時間かかるひとをなくしたい！！

変なことになっても嫌なので、バックアップしてくださいね。
あと自己責任でお願いします。

# エラー画面
![スクリーンショット 2024-09-26 144149.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624480/e0b4e2f2-3858-c0e2-31d7-f9c5e11771a9.png)

# 環境
- Android Studio Koala | 2024.1.1 Patch 2
- Android Studioにあるテンプレートから作成

# 状況
ChatGPTに聞いてみたところ、テンプレートにあるパッケージ名「com.example.〇〇（アプリ名）」のままだとアップロードできず、変更する必要があるらしい。

「パッケージ名をリファクタリング（一括変更）しろ」と言うけど、
「com.example.〇〇（アプリ名）」を右クリックして、「リファクタリング」を押しても〇〇の部分しか変更できない。「example」を変更したいのに！！

ChatGPTに、「Android Studioの設定を変更したらいける」と言われたけど、提示された設定はなかった。なんで？？

# こんな感じ
Android Studioで見たときのパスは以下の通り
プロジェクト名/app/src/main/java/com.example.nekokami

com.example.nekokamiは、本来
「com」の中に「example」の中に「nekokami」があるけど
コンパクト表示されているから個別でリファクタリングできない！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624480/a362d508-0803-7df8-f3cf-b5176e275241.png)

# 手順
1. プロジェクトを開いている状態で、ディレクトリの上の部分を右クリック
2. 「ツリーの外観」から「中間パッケージを収縮」のチェックを外す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624480/8e42858f-7d83-6495-7ed8-5056c1e6086d.png)

3. こんな感じで、短縮表示されなくなる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624480/711f3b7e-6ea9-6024-ae63-716e90586fa2.png)

4. 今回の場合は、「Example」を右クリックし、「リファクタリング」→「名前を変更」を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624480/e1698a3a-b65b-8273-2248-2bced650dd1e.png)

5. 「全てのディレクトリ」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624480/b0891158-a6bc-e10c-ed07-5d0c800305ec.png)

6.「入力欄（初期値：example）」を変更。「リファクタリング」をクリック
僕の場合は、自分の名前にしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624480/afd4893a-ef5b-1bdd-e707-78a02f3d90f3.png)
↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624480/d00be49e-a2b2-6ad7-10cf-b4f1ee79fa80.png)

7. 処理が終わるまで待つ。
8. これでパッケージ名変更完了。

# これで終わりじゃない
さて、ここまでやった方は、何かエラーが出てビルドができなくなったことに気づいていると思います。
エラーは人によって違うかも知れませんが、私の対処法を明記します。

1. 「app/build.gradle.kts」を開く
        注意！　build.gradle.ktsはプロジェクトフォルダ内に２つありますが、「app」フォルダ内に入っているものを開いてください！
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624480/60e53f68-9343-87fe-cbbb-2a70a224671b.png)

1. 以下の画像のように「namespace」と「applicationID」の「com.example.〇〇（アプリ名）」を、変更後のものに書き換える

    注意！　画像はGitHubの画面です。赤色のところを緑色に変えたという意味です。同じものを追加しないでください。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624480/3e3ca95b-301b-aeeb-2721-497b61dfbc8e.png)

1. 上に青色で「Sync」というボタンが出てくると思うので、Syncしてください。
    Syncボタンが出てこない場合は、上の「ハンバーガーメニュー」→「ファイル」→「Sync Project with Gradle Files」をクリック
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624480/c122789c-4558-339e-73e7-49622a71e03f.png)

1. できたらエラーは解消されたはずです。
    念の為、上の「ハンバーガーメニュー」→「ビルド」→「Clean project」と「Rebuild Project」をやっておきましょう。
1. これで、aabファイルを出力し、アップロードすれば解消されます！
（aabファイルの出力方法は、別の方のやり方を見てください！）

# 終わりに
これで、初めてAndroidアプリ開発に挑むような人たちが挫折しなくなれば良いなと思います！以上です！
エンジニア組織の業務改善活動について

株式会社ダイアログの技術開発本部では、エンジニア一人ひとりが主体的に業務の改善活動（タスクフォース）に参加し、組織全体の成長と技術力の向上を目指しています。

## タスクフォースとは？

タスクフォースは、特定の目標や課題解決に取り組む少人数のプロジェクトチームです。各タスクフォースでは、週に1時間程度のミーティングを行い、業務に支障がない範囲で個人作業を進めています。メンバーは4〜10人程度で構成され、中には複数のタスクフォースを掛け持ちしている社員もいます（筆者もその一人です！）。

社内プロジェクトであるため、チャレンジングな試みにも積極的に取り組むことができ、たとえ失敗してもOKというオープンな文化があります。新卒のメンバーや入社して間もない中途採用者も、リーダーとして動き、意欲があればどんどん手を挙げて改善活動に参加しています。

タスクフォース活動を通じて、メンバー間のコミュニケーションが活発になり、知識やスキルの共有が促進されています。エンジニア組織としての一体感と成長意欲を高める取り組みとして、ぜひ皆さんの参考になればと思います！

## 各タスクフォースの詳細

以下に、現在活動中/予定のタスクフォースの詳細をご紹介します。

### AIタスクフォース

**目標：** 「AI活用によるリソース最適化」を実現し、エンジニアの稼働を削減する

**活動内容：**

- AIコンサル会社との共同プロジェクト
- 最新のAI技術のリサーチ、学習
- プロダクトや社内システムへのAI適用可能性の検証
- AIを活用したプロトタイプの開発と効果測定
- AI活用に関する知見の社内共有（勉強会・ワークショップの開催）

**活動事例/案：**

- 自然言語処理を用いた顧客対応の自動化ツール開発
- 生成AIを用いたコードレビューツールの利用
- 画像からソースコードの生成
- 設計書の生成補助/レビュー
- バックログデータをもとにwikiの出力

---

### ドキュメントタスクフォース

**目標：** 「誰でも開発できる環境」を実現するためのドキュメント化

**活動内容：**

- 開発手順やコーディング規約、設計指針などのドキュメント作成・更新
- サンプルコードの作成
- 過去成果物の整理

**活動事例/案：**

- 社内フレームワーク使用方法の解説動画
- バッチ開発手順のドキュメント作成
- 工数見積もり算出シート
- リリース注意事項のまとめ

---

### 勉強会タスクフォース

**目標：** メンバー間のナレッジ共有を促進するアウトプットの場を提供

**活動内容：**

- 定期的な技術勉強会の企画・運営
- 外部講師を招いたセミナーや社内LT大会の開催
- 最新技術や開発ノウハウの共有

**活動事例/案：**

- 当番制LT会
- 読書会
---

### 新卒研修タスクフォース

**目標：** エンジニア業務を好きになってもらう環境の提供

**活動内容：**

- 新卒向けカリキュラムの作成・改善
- メンター制度の運営とサポート
- 実践的なプロジェクト体験の提供

**活動事例/案：**

- アルゴリズム、Linux、Gitなどエンジニア基礎の研修
- 開発実践研修

---

### 中途研修タスクフォース

**目標：** 即戦力として活躍してもらうための環境づくり

**活動内容：**

- 中途入社者向けオンボーディングプログラムの設計・実施
- 社内システムや開発環境の導入支援
- キャリアパスやスキルアップに関する相談会の実施

**活動事例/案：**

- 社内システムのアーキテクチャ説明会
- オンボーディングシートの追加/改善
- 目標の立て方などのフォロー

---

### イベントタスクフォース

**目標：** 社内交流を深めるイベントの企画・運営

**活動内容：**

- 歓迎会、送別会など社内交流イベントの開催
- 季節ごとの懇親会やレクリエーションの企画
- リモートワークでも楽しめるオンラインイベントの実施

**活動事例/案：**

- 新入社員歓迎会や忘年会
- オンラインゲーム大会の開催

---

## タスクフォースの成果と今後の展望

これらのタスクフォース活動を通じて、技術力の向上、業務効率化、社員間のコミュニケーション促進など、多くの成果を上げていく見込みです。

今後は、これらの活動をさらに発展させ、オープンイノベーションの推進や社外エンジニアコミュニティとの連携強化にも取り組んでいきます。継続的な改善活動を通じて、最先端の技術と創造性あふれる職場環境を提供し、エンジニアが成長し活躍できる理想的な組織を目指しています。

---

### 毎月恒例の採用イベント開催中！
**私たちと一緒に、テクノロジーの未来を創造していきませんか？**

エンジニアとしてスキルを磨きたい方、自分のアイデアを形にしたい方、組織の成長に貢献したい方、皆さんのご参加をお待ちしています！


■日時
2024/10/16 (水) 19:30 ～ 21:00  ※途中参加・退室自由
2024/11/20 (水) 19:30 ～ 21:00  ※途中参加・退室自由
■参加フォーム
https://forms.gle/PpxhaLHk15ehsiWo9
個人開発で会計アプリを再度開発しました！

## 各種リンク
アプリケーション
https://accounting-app-six.vercel.app/login

Github
https://github.com/nobu0605/accounting-app

## 開発した理由
自分はエンジニアになる前に3年半バックオフィスの仕事をしていました。
今でも会計に興味があるので、今回開発しました。

4年前にも同様のアプリを開発しました。現在は動いていなく、今回新規で改めて開発しました。
https://qiita.com/nobu0605/items/14320342f66bc718e2a5

## 機能
・収益と費用
![画像の説明](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vav0qjyv7voemgivi64s.png)

・仕訳入力
![画像の説明](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/36g75qec7wxb58qtij49.png)

・財務レポート
![画像の説明](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/20r982necwsotr2tucai.png)

・仕訳一覧
![画像の説明](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r8h3zzp7l0pbltvq5po9.png)

## 使った技術
Next.js
TypeScript
Jest

フロントエンド
・react-hook-form
・styled-components
・swr
・highcharts

バックエンド
・prisma
・bcrypt
・JWT

・サーバー
Vercel

・DB
Supabase

・ER 図
https://dbdiagram.io/d/66e777896dde7f41492fd7d4
Azure Solutions Architect Expert が AWS SAP 取得を目指してクラウド同士比較してみた

私はこれまで 6 年ほど主に Azure を利用しており、2023 年 11 月に Azure Solutions Architect Expert を取得しました。
2024 年 6 月から業務で主に使用するクラウドが AWS に変わったため、AWS について一定の技術を身に付けることを決意しました。
その結果、2024 年 6 月に AWS Certified Solutions Architect – Associate (AWS SAA)、そして 2024 年 9 月に AWS Certified Solutions Architect - Professional (AWS SAP) を取得することができました。

AWS の学習の際に Azure と AWS の違いを理解することが重要と考え、いくつか比較記事を作成していました。
こちらはこれらの記事のリンク集となります。
(一部、AWS の仕様がほとんどの記事も含みます)
サービスの網羅性がない点はご容赦ください。

下記のような方の参考になるのではないかと思います。

- 私と同様、Azure エンジニアから AWS エンジニアに転向する方
- 逆に、AWS エンジニアから Azure エンジニアに転向する方
- Azure と AWS の両クラウドを利用する構成を検討する方

## コンテナ関連

https://qiita.com/pokapu/items/722c9a0fdf20aecf7e4d

https://qiita.com/pokapu/items/a825015ab59c5fbd058f

## コンピューティング

https://qiita.com/pokapu/items/2ddff74ebbcfdd34fc6e

https://qiita.com/pokapu/items/706d9530ae578a70ccdb

## 権限制御

https://qiita.com/pokapu/items/12eeb020366ea26680ac

https://qiita.com/pokapu/items/8ae1c581b17e866543e8

https://qiita.com/pokapu/items/d673686693291463c91d

## DNS

https://qiita.com/pokapu/items/38c6526dc8b6b782b546

## CDN

https://qiita.com/pokapu/items/dd840c962c3c5c881215

## 負荷分散

https://qiita.com/pokapu/items/944de8ee3a51cb748152

https://qiita.com/pokapu/items/a9756dac35a0c6d33487

## ネットワーク

https://qiita.com/pokapu/items/886a9b317038d6eaabe9

https://qiita.com/pokapu/items/4548e5ce8bce7c01b584

## オブジェクトストレージ

https://qiita.com/pokapu/items/7a402eb8d177a2cb2f4d
よわよわエンジニア、UI・UX修行を始める ~有名企業のガイドラインを見てみよう~

## はじめに
本記事では、UI・UXデザイン方面でつよつよになりたい筆者が、UI・UXデザインに取り組んでいくなかで身に染みて感じたことを書いています。

## 一般的なデザインを学びたい

これまでの記事で幾度となく「変なオリジナリティを出すな！」「ベンチマーク大事！」ということを述べてきました。
しかし、いざやってみると難しいと感じます。

たとえば、「一般的な」トグルスイッチをUIに配置するとします。
すると、まず以下のようなことを考えることになります。
- トグルスイッチの色
- トグルスイッチの大きさ(クリック/タップできる領域)
- ラベルの位置(トグルスイッチの右？左？)　
- ラベルに示す内容

もしかすると「そもそもその要素をトグルスイッチで選択させることは一般的であるか」自体も、考える必要があるかもしれません。

デザインに絶対的な正しさは無いと思いますが、「どういうデザインが一般的で良いとされているのか」は、知識として知っておきたいです。
そういった場合の参考先として、筆者はGoogleやApple等の有名企業の「**デザインガイドライン**」をまず見てみることが多いです。

デザインガイドラインとは、製品やwebサイト等のUI/UXの一貫性を確保する目的でデザインのルールをまとめた文書です。
企業によってはデザインガイドラインを公開しているため、web上で見てみることができます。

## 有名企業のガイドラインを見てみよう

有名企業のガイドラインとしては以下の3つが挙げられるかと思います。

### Google Material Design

https://m3.material.io/

Googleが2014年に発表したデザインガイドラインです。
その名の通り物理的な世界からインスピレーションを受けた、美しく使いやすいUI/UXを追求したデザインスタイルです。
Figmaのデザインキットが公開されていたりもします。
https://www.figma.com/community/file/1035203688168086460/material-3-design-kit

例えばスイッチのガイドラインは以下のような感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1062427/4ef3e282-f801-bce3-a8c4-0d61da9845f4.png)
(出典：[Google](https://m3.material.io/components/switch/specs#a4d74dd1-731a-40b3-9516-6dacd407e3f7))
色やサイズ、使い方(どのような場合でスイッチを使うか、逆にどのような場合でスイッチではないUIを使うべきか)、インタラクションなどが詳細に決められています。

### Human Interface Guidelines (Apple)

Appleのデザインガイドラインです。
直感的で自然なUXとシンプルで美しいデザインが特長のデザインスタイルです。

スイッチのガイドラインは以下のような感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1062427/0f78162e-fcb4-3a0c-fd1f-536686ea63a0.png)
(出典：[Apple](https://developer.apple.com/jp/design/human-interface-guidelines/toggles#Platform-considerations))
iOSやMacOS等複数のプラットフォームがあるためか、それぞれのプラットフォームごとの考慮事項なども書かれています。
また、ベストプラクティスの記載がわかりやすく、読むだけでも勉強になりそうです。

### Fluent2 Design System (Microsoft)
https://fluent2.microsoft.design/

最近存在を知りました(もっと早く知りたかった……)。
複数のプラットフォームで使いやすく、ユーザーの邪魔をせず、「Microsoftらしい」ことをデザインの設計原則としています。
これもFigmaのデザインキットが存在します。
https://www.figma.com/community/file/836828295772957889/microsoft-fluent-2-web

スイッチのガイドラインは以下のような感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1062427/f0031df8-28b3-1109-2f14-6f2b5646e51f.png)

(出典：[Microsoft](https://fluent2.microsoft.design/components/web/react/switch/usage))

触ると動きます。ライトテーマ・ダークテーマでの見た目も確認できます。
また、ユーザーにとってわかりやすい(=認知負荷を低くする)ことを重視しているのか、スイッチのラベルの文言などの言葉の使い方にも「名詞または短い名詞句を使用する、分かりにくい場合は動詞を追加する」、「質問にしない」などの指定が入っています。

## さいごに

今回は「一般的に良いとされているデザイン」の学習の目的で有名企業のデザインガイドラインを紹介しました。
しかし、デザインガイドラインは本来、企業や製品のデザインのルールを決めておくことによってデザイン業務の効率化を図ったり、デザインコンセプトの認識を関係者間で共通化したりすることを目的として作成するものです。
お勤めの企業やお使いの製品などにも、探してみるとロゴやwebサイト等にデザインガイドラインが存在すると思いますので、機会があれば見てみると良いかもしれません。