OmniAICreator/Qiita-1.07M huggingface dataset:
無線LANとは

# 無線LANとは
>一般的には、`IEEE 802.11シリーズの規格に準拠した機器で構成されるネットワーク`のことを言います。

https://gihyo.jp/book/2023/978-4-297-13865-3

>LANケーブルの代わりに`無線を使ってネットワークに接続`する技術です。
...
電波を使用することから、LANケーブルを使用する優先LANより、`安定性や速度の点で見劣り`します。
...
一般的に無線LANは有線LANよりもセキュリティが弱くなると言われています。これは物理的な接続なしに、`目に見えない電波によって接続ができてしまう`ためです。
この弱点をカバーするため、企業のネットワークなど部外者の接続を決して許してならない用途には、`IEEE(アイトリプルイー）802.1Xと呼ばれる厳密な認証を行う仕組み`を併用します。

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

認証することで接続が許可されるのか

# 無線LANの方式
>現在多く用いられているのが、IEEE 802.11g,802.11n,802.11acです。`第三者の盗聴備えて無線LANの通信内容は暗号化するのが一般的`です。過去に使われていたWEPと呼ばれるセキュリティ方式は、脆弱で無断接続される危険性が高いことから、`近年ではWPAもしくはWPA2`が使われます。これらには`AES`と呼ばれる強い暗号アルゴリズムを併用します。推奨されるのは`WPA2とAESの組み合わせ`です。

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

# IEEE 802.11とは
現在普及している主要な規格は次の６種類です。

https://www.elecom.co.jp/pickup/column/wifi_column/00081/

周波数帯や伝送速度など特徴があるみたいだ。

# IEEE802.11a/g/n/acで用いられる多重化方式
>`デジタルデータをアナログデータに変換する際には、搬送波と呼ばれる信号に変調を加えてデジタルデータを０と１に対応`させます。IEEE 802.11a/g/n/acでは、この変調方式に`OFDM`が用いられます。
OFDM(直交周波数分割多元通信)とは、`周波数の異なる複数の搬送波を使って、パケットを並列に送受信することで伝送効率を上げる技術`です。`変調速度を上げずにデータ通信を高速化`できます。

https://gihyo.jp/book/2023/978-4-297-13865-3

# 感想
セッションハイジャックに関して調べていたら無線LANが出てきたので調べた。

ネットワークに接続にはIEEE(アイトリプルイー）802.1Xの認証が必要で、認証されたらIEEE 802.11シリーズの通信が使えるようになるのかな。
それで多重化方式を使って効率よく伝送できるのか。

どのように通信するのだろうか
次はwpaやAESといった無線LANのセキュリティついて調べてみようかな

https://www.fmworld.net/biz/fmv/support/fmvmanual/0610-0703/option/b5fj2581/chap34.html
App Store Connectで誤って作成したバージョンを削除する方法

App Store Connectでアプリの新規バージョンを作成中に、誤って準備中のバージョンを作成してしまった経験はありませんか？削除ボタンが見当たらず、焦ってしまう方もいるかもしれません。しかし、慌てずに行える対処法があります。

## カーソルを「提出準備中」に合わせてみよう


まず、誤って作成してしまったバージョンの項目にカーソルを合わせてみてください。
すると、右側に削除ボタンが表示されることがあります。
このボタンを押すことで、誤って作成したバージョンを削除できます。

### 削除ボタンが見つからない場合

削除ボタンが表示されない場合は、以下の方法を試してみてください。

・バージョン情報の修正: 誤って作成したバージョンの詳細ページを開き、「バージョン」の項目で正しいバージョン番号に修正します。
・新しいバージョン作成: 正しいバージョン番号で、改めて新規バージョンを作成します。誤って作成したバージョンは、後から削除するか、そのまま残しておくことも可能です。

## その他

App Store Connectのヘルプ: どうしても解決しない場合は、App Store Connectのヘルプページを参考にしたり、Appleのサポートに問い合わせることをおすすめします。

## エンジニアの成長には環境が大切って話
やっぱエンジニアが成長するには環境が大切ってのをつくづく感じる。
優秀なエンジニアの近くで開発してると学びも多いし、その人の考え方自体を取得できる。

今はエンジニア転職アプリ作っているからよかったらどうぞ。
エンジニア向けスカウトアプリ「LUIDA」
https://luida-japan.com/lp/2410?utm_source=qiita&utm_medium=referral&utm_campaign=article2
![スクリーンショット 2024-10-11 184523.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3807837/c68b1af4-876f-a270-704f-9b1f4e053091.png)
中１不登校がatcoderで入茶した話

# 中１不登校がatcoderで入茶した話
## プロフィール
中１不登校
長野県在住
夏暑く冬寒いです

プログラミング的なこと
小学二年生ぐらいでscratchを始めてpythonは小学5年生ぐらいから始めた
paiza Sランク 内部レート茶色になったから舐めてかかったらなんかSランクになった

数学知識
中１数学は全部やった
二次方程式をちょっと
関数わかるかわからないくらい

好きなゲーム(紹介しなくていい)
efootball
信長の野望

## 競プロを始めたきっかけ
親に勧められた　面白そう　一問解いてみたらすごく気持ちよかった

# やったこと
## レートが100ぐらいのとき
AtCoder Beginners Selectionの前半ぐらいを解く
灰色diffの問題を解く
ABCに出る(出なきゃ何もできない)

## レートが150~300ぐらいのとき
灰色diffの問題を50問集めたバチャを開く
灰色マラソン50問とか言う名前のバチャ作って
いろんな人が来て面白かった
パクリっぽいのが出ててきたのと飽きてやめた

neovimを始めるだが補完機能が弱くて
vscodevimを使っている　おすすめです

Rustを始めた Pythonでたまにカバーしきれないところをやる用
## 最近
鉄則本を読む
茶色前半の問題を解く精進を始める
[AtCoderJuniorLeague2024Winter](https://atcoder.jp/contests/ajl2024winter)に出る(~~名門校の人たちを倒したい~~)

# 覚えたアルゴリズム
* 二分探索
一番最初に覚えた 応用できないけど
* DFS BFS
これセットだろ ~~簡単なのはできると思う~~ (前DFS使う[問題](https://atcoder.jp/contests/abc373/tasks/abc373_d)でガッツリどうすればいいか迷ってただろ)
* imos法
なぜか累積和よりも先に覚えた 本当になんで(いや自分だろ)
* 累積和
ABC371のDで累積和を使うことがわからなくて悔しかったからやった
drkenさんの[記事](https://qiita.com/drken/items/56a6b68edef8fc605821)がわかりやすかった
* DP
部分和DPとナップザックDPの初歩的なやつだったらできる
鉄則本の解説がわかりやすかった

# 入茶したとき
![スクリーンショット 2024-10-15 164708.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889080/95b6d32f-0977-712b-7ed5-18b7465d5a88.png)
ABC375で入茶しました
いつも通りAB二完してCが難しかったからDを解くことにした
最初愚直な解法で見事にTLEしてまとめて処理する解法を思いついたのでそれで提出したらACした
ABC375で人生初の緑パフォ出したのも加わってすごい嬉しかった

# 最後に
早速灰色に戻りそうでソワソワしてます
年内に600ぐらいまでレートをためたいです
来年には入緑したいです

長々と見ていただいてありがとうございました
rails assets:precompileとは

# rails assets:precompileとは

```rails assets:precompile```
上記コマンドの役割は、本番環境向けにアセットをコンパイルし、最適化すること。
<br>

1. **アセットのコンパイル**
Rails アプリケーションでは、CSS、JavaScript、画像などのアセットは開発中に編集しやすい形で管理されている。
本番環境ではこれらを効率的に配信するためにコンパイル（結合、圧縮、最適化）する必要があります。
rails assets:precompile コマンドはこれを行い、アセットを単一ファイルに結合したり、余分なスペースやコメントを削除して圧縮したりします。
    <br>

2. **パフォーマンスの向上**
アセットをプリコンパイルすることで、本番環境でのページ読み込み速度が向上します。これには以下の理由があります。
    * アセットが圧縮されてサイズが小さくなるため、サーバーからクライアントに転送されるデータ量が減ります。
    * 複数のファイルが1つにまとめられるため、HTTPリクエストの数が減少し、ロードが高速化されます。
    <br>

3. **ダイジェスト付きファイルの生成**
プリコンパイルされたファイルには、ファイル名にハッシュ（ダイジェスト）が付与されます。これにより、アセットが変更された際に新しいファイル名が生成され、ブラウザがキャッシュされた古いファイルを読み込んでしまうことを防ぎます。
例：application.js → application-abc123.js
    <br>

4. **CDN やキャッシュの有効活用**
アセットがプリコンパイルされると、これらのファイルを Content Delivery Network（CDN）やキャッシュサーバーを通じて効率的に配信することが可能になります。これにより、ユーザーの地理的な場所に関わらず、アセットが高速に提供されるようになります。
    <br>

5. **サーバー負荷の軽減**
プリコンパイルによって、本番環境ではリクエストごとにアセットをオンザフライでコンパイルする必要がなくなり、サーバーへの負荷が軽減されます。事前にコンパイルされたアセットは静的ファイルとして配信されるため、リクエスト処理が高速化します。

    <br>

これらの理由から、
```rails assets:precompile```コマンドは、本番環境におけるアプリケーションのパフォーマンスとユーザー体験の向上に非常に重要な役割を果たしています。


[参考（類似）記事](https://qiita.com/shino365/items/4b72d15018291bc3b6ea)
ESP32: MicroPython のプログラムを書き込んで実行

Arch Linux で確認した方法です。

## ampy のインストール

```bash
yay -S adafruit-ampy
```

## プログラム
プログラム名は、main.py にして下さい。

```py:main.py
import time

icount = 1

while(1):
	print(icount)
	print("ex01")
	print("Oct/15/2024 PM 17:14")
	print("こんにちは")
	print("Good Afternoon")
	time.sleep(1)
	icount += 1
```

## 書き込み

```bash
ampy --port /dev/ttyUSB0 put main.py
```

## 実行結果

```text
$ cu -l /dev/ttyUSB0 -s 115200
Connected.
1
ex01
Oct/15/2024 PM 17:14
こんにちは
Good Afternoon
2
ex01
Oct/15/2024 PM 17:14
こんにちは
Good Afternoon
3
ex01
Oct/15/2024 PM 17:14
こんにちは
Good Afternoon
```
メディアクエリの(update: slow)では判定できないE-ink端末もあるようです

かなりニッチですし、業務でも扱うことはないと思いますが興味深かったので共有です。

今更ながら`window.matchMedia`の存在を知りまして、E-ink端末はメディアクエリで判定できるのかなって思い、自分のサイトにメディアクエリの判定結果一覧を確認できるページを作りました。
Webの情報を漁ると、E-ink端末のような電子ブックリーダーはメディア特性`(update: slow)`で判定できる、という情報がありましたが、実際にBOOX Note Air（初代）で調べたところ、ChromeとFirfoxでは

- `(update: none)` -> false
- `(update: slow)` -> false
- `(update: fast)` -> true

となり、通常のディスプレイで表示するときと何も変わらないことがわかりました。

::: note
この端末には「Neo Browser」というプリインストールされたブラウザがありますが、私のサイトは2023年または2024年になってからようやくメジャーなブラウザ全てでサポートしたcssとjsをかなり使っているせいか、何も確認できませんでした。
:::

他の環境も色々比較したところ「prefers-reduced-motion」の項目だけ、当該端末では「reduce」、他の端末の初期設定では「no-preference」と違いが出たので、こちらを使えばある程度判定はできるようです。
このメディア特性が使用される目的とは違いますが、E-ink端末でスタイルを分ける場合もアニメーションを抑止するために使用すると思いますので、問題ないかなと思います。

そもそもアニメーションを使わなければすべて解決する、という身も蓋もない手段もありますが。

## 余談

ちなみにこの端末ですがモノクロなのに、`(color-gamut: srgb)`、`(color)`、`(monochrome: 0)`がtrueになり、(monochrome)がfalseになります。
BOOXのモノクロの端末で画面キャプチャを撮影するとカラーになるのはその筋では有名ですが、ブラウザもカラー表示として処理しているようです。

## 参考情報
- [MDNの「update」の説明](https://developer.mozilla.org/ja/docs/Web/CSS/@media/update)
- [MDNの「prefers-reduced-motion」の説明](https://developer.mozilla.org/ja/docs/Web/CSS/@media/prefers-reduced-motion)
高度情報処理のPMを受験したので振り返り【IPA】

前回STを落ちたので、今回はPMを受験した
高度情報処理は春秋でシーズンが分かれていて、各区分がそれぞれ年1回開催
なので、秋期はPMを選択


![pkin3a0000007xdp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927880/3d0c95dc-b1ff-2fcf-e8f3-469a7dec3ba1.png)

参照元

https://www.ipa.go.jp/shiken/kubun/list.html

<h2>勉強</h2>
前回のSTの反省を生かした勉強方法を取り入れた

STの時は用語を覚えるのを徹底できてなかった
前回の午前Ⅱ問題も低空飛行でギリギリ合格状態

原因は、用語を覚える際の勉強方法が良くなかったからと考えた
そこで、普段と違う学習方法を実施することで用語を覚える施策を取った
アクティブリコールというやり方だった

アクティブリコールのやり方を知ったのは↓だった

https://www.youtube.com/watch?v=DDGVsAWgdYc&ab_channel=%E7%B1%B3%E5%9B%BD%E5%86%85%E7%A7%91%E5%B0%82%E9%96%80%E5%8C%BB%E5%AE%89%E5%B7%9D%E5%BA%B7%E4%BB%8B%E3%81%AE%E5%8C%BB%E5%AD%A6%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB

Qiitaでもいろんな記事が書かれていた
やり方については動画で解説されているので割愛
効果は抜群で、徹底して覚えることができ午前問の平均点は90超えるのをキープすることができた
ただ、進捗が思うように速度が出なかったのでざっくり立てたスケジュール通りに行かず、焦った

今回使ったテキスト↓(STのときと同じ会社のものを使用)

https://bookstore.tac-school.co.jp/book/detail/111065/

<b>・午前Ⅱ対策</b>
過去問道場を使用した

<b>・午後Ⅰ対策</b>
テキストの付録の物をやった
STで落ちた原因が、午後Ⅰ
国語力が足りないのかよく分からないが、勉強中も思うように点数が出なかった
時間が足りなかったので、ネットに上がっている問題は手を付けられていない

<b>・午後Ⅱ対策</b>
テキストの付録の物をやった
題材をあらかじめ決めておけば、楽にできた
午後問Ⅰの内容をそのまま使うこともできた

<h2>本番</h2>
午前問はできた

午後問は自分との闘いだった

時間に追い立てられるように問題を読むが、手ごたえが感じられない解答ばかり
焦って焦って視野が狭まり、もう文章まともに読めない状態だった

しかし、なんとか最後までやりきって時間がある程度余った
時間が余ってることで心に余裕が生まれた
冷静な状態で問題を見直し、回答を修正できた

<h2>良かった点</h2>
<b>・アクティブリコールを行ったこと</b>

用語を覚えることを徹底できたので、午前問は心配なくなった

<h2>悪かった点</h2>
<b>・スケジュールの見積もり不足</b>

用語覚えるのにめちゃくちゃ時間がかかってしまい、午後問対策に時間が掛けられなかった
想定を大幅に超える時間超過だったので、仕方ない面もあるもののやり方に関しては工夫が必要そうだ

<b>・実戦に近い状態での練習しなかったこと</b>

実際のテストで時間が気になって焦って仕方がなかった
焦りで解答もブレまくり
10分くらい余裕を残すくらいのペースでやれるくらいには、時間に慣れる練習すべきだった
事前準備不足

<b>・過去問をあまりやらなかったこと</b>
ゴールを意識して勉強してなかった
よく勉強系の動画でゴールを意識して書いてあるものの自分の中で内容を咀嚼できてない
ただ、テキストに時間かけすぎた

<b>・睡眠不足</b>

午後問対策が全然できていなかったので、深夜3時まで起きていた
翌日、頭が回ってないのか会場への道に迷って、遅刻しかけた

<h2>改善点</h2>
<b>・時間をちゃんと測った状態での練習をする</b>

慣れで焦りをなくす。自分との闘いを練習で終わらせておく

<b>・過去問を同時並行でやってみる</b>

ゴールを意識してやる。勉強系Youtuberが良く言っているが、自分の中でよくわからないので実際にやってみる

<b>・睡眠をとる</b>

生活習慣も乱れ気味だったので、生活習慣を普段からよくする

次回はSTを受験する予定

<h2>参考</h2>

https://www.ipa.go.jp/shiken/kubun/pm.html

https://www.youtube.com/watch?v=DDGVsAWgdYc&ab_channel=%E7%B1%B3%E5%9B%BD%E5%86%85%E7%A7%91%E5%B0%82%E9%96%80%E5%8C%BB%E5%AE%89%E5%B7%9D%E5%BA%B7%E4%BB%8B%E3%81%AE%E5%8C%BB%E5%AD%A6%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB

https://www.pm-siken.com/pmkakomon.php

https://bookstore.tac-school.co.jp/book/detail/111065/
New+ (Powertoys)の使い方

Powertoysの先のアップデートで追加されたNew+の使い方をメモ書き程度に残します。

## 使い道

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3530797/5187ff6e-07f9-051c-4763-8bb27b62f5c8.png)

オンにすると、事前に指定したフォルダやファイルを一括で配置できます。
従来は他のところからコピペする必要があった作業を、右クリックで管理できるのです。

テンプレートを置いている場所からコピーしているだけなので、扱えるのはPC上のファイルだけです。

### プログラマ的な使い道？

思いついた使い道

- ライブラリを入れたフォルダを追加しておく
- 様々な雛形を突っ込む

## 使い方

### 1.オンにする

機能をPowertoysでオンにします。そりゃそうだ

### 2.テンプレートを追加

ファイルやフォルダを追加します。
デフォルトだと`テンプレート`にフォルダとかを置きます。

今回は`python-3.9.5-embed-amd64`をおいてみました。`pip`インストール済み。
Python環境を作らなくても使えて便利だなあって思います。

### 3.エクスプローラーで右クリック

エクスプローラーで右クリックして、`新規+`から置きたいフォルダかファイルを選ぶとコピーが始まります。
あとはふつーに使ってください。

`新規+`メニューが右クリックにない場合は、一度再起動したら表示されるはずです。

## 注意点？

これ、Powertoys標準のバックアップではバックアップされないみたいです(2024年10月現在では)。
Onedriveとかに保存するようにするといいかも。
あんまり大きいファイルは向いてないってことですね。
lightbox2 cdnjs形式で使う

## ライブラリで簡単に
*参考YOUTUBEサイト*
https://www.youtube.com/watch?v=k1yULKWfO-s&t=86s

- index.htmlとstyle.cssとimagesを用意する。
- リンクからzipファイルをダウンロードしてその中にあるimagesをそのままフォルダに入れる。(imgはsmallとgibの２種類が用意されていた)
https://github.com/Shin-sibainu/image-gallery-with-lightbox/blob/main/style.css

![スクリーンショット 2024-10-15 16.23.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3870482/c9f711aa-2de5-0408-9ae4-bdc43206048e.png)


- htmlとcssともに雛形を作成
```
<!DOCTYPE html>
<html lang="jp">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="./style.css">
    <!-- lightbox2のcss -->
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/lightbox2/2.11.5/css/lightbox.css" integrity="sha512-DKdRaC0QGJ/kjx0U0TtJNCamKnN4l+wsMdION3GG0WVK6hIoJ1UPHRHeXNiGsXdrmq19JJxgIubb/Z7Og2qJww==" crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
<body>
    <h1>画像ギャラリー</h1>
        <div class="gallery">
        <a href="#">
                <img src="./images/cat1-small.jpg" alt="猫-small-1" />
            </a>

        </div>
</body>
</html>
```

```
body {
    background-color:burlywood;
}

h1 {
    text-align: center;
    font-size: 2.5rem;
    color: white;
    margin: 30px 0 50px;
}


.gallery {
    margin: 10px 50px;
    text-align: center;

}

.gallery img {
    width: 380px;
    height: 200px;
    padding: 10px;
    object-fit: cover;
    }

```

- lightbox2というライブラリをcdnjs形式で使う。
:::note warn
cdnjsでは、ネットに繋がった状態でのみ動作を可能にできる
:::

*lightbox2のためのcdn*
lightbox2 cdnjsをGoogle検索して
css(`head`内)とscript(`body`の閉じタグの直前)をそれぞれ挿入

![スクリーンショット 2024-10-15 16.29.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3870482/3b787089-9df2-4dc3-090d-b9ceebae4488.png)


*jqueryの挿入も忘れずに！*
![スクリーンショット 2024-10-15 16.30.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3870482/0024f360-ae03-4ed1-9106-4aa6818a9698.png)

- lightbox2のルール通りに記述

![スクリーンショット 2024-10-15 16.34.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3870482/93cf59e6-b1ae-0e99-e87c-0726f9cc9e56.png)


:::note info
`a`タグに`data-lightbox="cat" data-title="かわいい猫"`と追記するとライブラリが適用される
catと同一の名前のimgがグループ化されて矢印で次の画像に映ることができているみたいです。
:::
```
<a href="./images/cat1-big.jpg" data-lightbox="cat" data-title="かわいい猫">
<img src="./images/cat1-small.jpg" alt="猫-small-1" />
</a>


```

```

.gallery img {
<!--
追記部分
-->

    filter: grayscale(100%);  /* imgを白黒にする */
    transition: 0.7s;　 /* ゆっくり白黒からカラーに変える */
}

.gallery img:hover {
    filter: grayscale(0);/* imgがカラーに */
    transform: scale(1.1); /* 画像が1.1倍に大きくなる*/
}
```

## 完成図

![スクリーンショット 2024-10-15 16.42.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3870482/23ee7e18-a9c8-ac9f-bd00-9bef317331d4.png)

## お疲れ様でした！
応用情報技術者試験に約50時間で合格した勉強法

# 応用情報技術者令和6年秋季試験に合格しました

## 試験までの対策方法、勉強時間
基本情報技術者試験を4月に受けていたので、同じような勉強方法で挑みました。
午後試験が基本情報ほど癖が無さそうだったので、午前・午後ともに過去問道場を使用しました。
仕事との兼ね合いから1か月前に勉強を始めたのですが、基本情報の記憶がかなり残っており、最初に試験10回分の過去問題を解いた段階で正答率が6割くらいでした。合格さえできれば良いと考えていたので、正答率の低い分野と午後試験に使いそうな分野だけ2周目をやりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3741338/8609151b-d432-aa78-0972-d0b6253ebee1.png)
午前試験だけで20～30時間くらい勉強しました。

午後試験も同様に過去問道場で過去10年分の過去問を解きました。選択した分野は必須のセキュリティと経営戦略、組込みシステム開発、サービスマネジメント、システム監査のいわゆる文系セットです。
本当はデータベースやネットワークも予備で選択したかったのですが、時間が取れず断念しました。
10年分解いて正答率は6割ちょっとくらいだったのですが、時間がなかったのと、もう一周しても意味が無さそうだったのでこのまま試験に挑みました。
これも20～30時間くらいかかりました。

### 感想
試験の内容より、試験を受けるまでバタバタしました。
降りる駅を間違えて遅刻しそうになったり、筆箱の中身を見たらシャーペンが入ってなかったりしたんですが、一番問題だったのは時計を忘れたことです。試験会場に時計があると思っていました。
（試験会場に着くのが第一次試験）
午前試験は時間が余りそうだったので時計無しで受験しましたが、午後試験は必須だと思ったので、昼休みに往復一時間くらいかけて最寄りのニトリで置時計を買いました。
午前はともかく、午後は自分で時間配分を行うので時計が必須です。
### 午前試験について
午前試験は見たことのある問題がほとんどだったので、スムーズに解き進めることができました。
1時間ほど時間が余りましたが、時計を買いに行くため見直しをせず退出しました。
IPAの回答例と照らし合わせたところ7割正答していました。
### 午後試験について
午後試験はほぼ時間が余りませんでした。
解答速報と見比べると、正答率は6割くらいでした。組み込みシステム開発が難しい年だったように思いました。逆にサービスマネジメントとシステム監査はかなり簡単でした。セキュリティは例年通りで、経営戦略は簿記の知識が要らないものでした。

↓ 2024/12/26追記
合格していました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3741338/a5b1d143-fec8-a77f-49a8-1b7b21d880b2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3741338/8ec4dd26-fce9-a602-6b7c-b4bc2281b5c6.png)
セキュリティと組込みシステムが怪しかったですが、多分組込みシステムで調整があったのと、他で稼いだためどうにかなってました（セキュリティは勉強不足でした）。
仮にネットワークやデータベースを予備で準備しても、時間内に問題を見て、簡単なものを選択して、という余裕は無かったと思います。
個人的には、選択した5科目で何が来ても6割取れるように準備しておくほうがいいんじゃないかなと思います。難しすぎて6割取れない問題が来た場合は、たぶん得点調整があります。
久しぶりに書くC++

ChatGPTのたぐいが、だいぶ充実してきたことで、C++を久しぶりに書くのがだいぶ簡単になった。

以下は、久しぶりにC++を書こうとしている人の単なるメモ書きです。


## C++のコードに変換するのはわりと簡単
- pythonでのコードを書く。
- ChatGPTやGemini AIにC++に書き換えてもらう。
- コーディングスタイルを指定して書き換えてもらう。
    - using namespace は使わない。
    - smart pointer を使うように指定する。
## Ubuntuでの設定
### pkg-config の利用
##### pkg-configが必要になる理由
- C++のコードをビルドする際の問題点
- 例: OpenCV をリンクする際のiclude path, library の設定が、環境によって一定していないことの問題点
opencv.hpp　はどこにあるの？
/usr/include/opencv4/opencv2/opencv.hpp
他の環境では、別の場所にあるかもしれない。

##### pkg-configを用いた解決方法
pkg-config は、g++に渡すビルドオプションの文字列を生成してくれるコマンドだ。

実行例：
次のようにすると、opencvをリンクするためのビルドオプションの文字列を生成してくれる。

```
$ pkg-config --cflags --libs opencv
-I/usr/include/opencv4/opencv -I/usr/include/opencv4 -L/usr/local/lib -lopencv_dnn -lopencv_gapi -lopencv_highgui -lopencv_ml -lopencv_objdetect -lopencv_photo -lopencv_stitching -lopencv_video -lopencv_calib3d -lopencv_features2d -lopencv_flann -lopencv_videoio -lopencv_imgcodecs -lopencv_imgproc -lopencv_core
```

次のようにコマンドを入力すると
```
g++ sample.cpp -o sample $(pkg-config --cflags --libs opencv) -lstdc++
```

以下のコードを入力したと同じ結果になる。
$(pkg-config --cflags --libs opencv)　の部分がそのコマンドの実行結果に置き換わるためである。
```
g++ sample.cpp -o sample -I/usr/include/opencv4/opencv -I/usr/include/opencv4 -L/usr/local/lib -lopencv_dnn -lopencv_gapi -lopencv_highgui -lopencv_ml -lopencv_objdetect -lopencv_photo -lopencv_stitching -lopencv_video -lopencv_calib3d -lopencv_features2d -lopencv_flann -lopencv_videoio -lopencv_imgcodecs -lopencv_imgproc -lopencv_core -lstdc++
```

そのようにpkg-config を使うためには
/usr/local/lib/pkgconfig/opencv4.pc
に以下の記事にある内容を書き加える。そうすることで、pkg-configがopencv 用の文字列を生成できるようになる。

[pkg-configを使ってg++でコンパイルできるようになるまで](https://qiita.com/t13m082h/items/c0482b87712f1d78a0f9)

## using namespaceを使わない
- using namespace は名前空間を汚染するので（＝ある変数がいったいどこからきたのかわからなくなるので）、using namespace std; の例でさえ推奨されないことがある。
- 私も同意見なので、using namespaceを使わない。
- ChatGPTやGemini AI とかに、書き換えを依頼しよう。
「using namespace std; を使わないように書き換えてください。」


## メモリーリークを生じにくい書き方
#### スマートポインタを使って書く
ChatGPTやGemini AI とかに、書き換えを依頼しよう。
「C++14以降でスマートポインタを使って書き換えてください」 
`auto capture = std::make_unique<cv::VideoCapture>(0);`
などのように書いてくれる。

auto を使うと、型推論が働くので、宣言の書き方が簡単にできる。
std::make_uniqueを使うことで、スコープを抜けたときに自動的に解放されるようになる。


# 追記予定
- C++でのテストの自動化
    - Google Test
- CMakeによる設定
    - [CMakeの使い方（その１）](https://qiita.com/shohirose/items/45fb49c6b429e8b204ac)
MongoDBローカル構築・操作方法

## 参考
https://github.com/mongodb/homebrew-brew

## インストール

1. mongodbインストール確認
    ```bash
    $ mongod --version
    db version v5.0.7
    Build Info: {
        "version": "5.0.7",
         ...
        }
    }
    ```
    入ってなければ以下
    ```bash
    brew tap mongodb/brew
    brew install mongodb-community
    ```

## 起動
- 起動
    ```bash
    $ brew services start mongodb-community
    ==> Tapping homebrew/services
    (省略)
    ==> Successfully started `mongodb-community` (label: homebrew.mxcl.mongodb-community)
    ```
    止める
    ```bash
     $ brew services stop mongodb-community
    ==> Successfully stopped `mongodb-community` (label: homebrew.mxcl.mongodb-community)
    ```
    
- 操作

    ```bash
    # mongoコマンドを使えるようにインストールする
    $ brew install mongodb-community-shell
    ```
    ```bash
    #入る
    $ mongo
    >
    ```

## 操作
- DB操作
    ```bash
    #DB作成
    > use test_db
    switched to db test_db
    #DB一覧
    > shows dbs
    admin    0.000GB
    config   0.000GB
    local    0.000GB
    test_db  0.000GB
    #今いるDB
    > db
    test_db
    ```
- コレクション操作
    ```bash
    #コレクション作成
    > db.createCollection('messagePropertires')
    { "ok" : 1 }
    #コレクション一覧
    > show collections
    messagePropertires
    user
    ```
- INSERT
    ```bash
    #insert
    >db.messagePropertires.insertOne({
    ...     "_id" : ObjectId("aaa"),
    ...     "key" : "Top",
    ...     "locale" : "ja-JP",
    ...     "value" : "トップページ"
    ... }
    ... )
    ```
- SELECT
    ```bash
    #select的な
    > db.messagePropertires.find()
    { "_id" : ObjectId("aaa"), "key" : "Top", "locale" : "ja-JP", "value" : "トップページ" }
    #出る
    > exit
    ```

- UPDATE
    ```bash
    # 要素を既存の配列にプッシュ (`$push`)
    db.system.update(
   { _id: ObjectId("aaa") },
   {
     $push: { allParts: 
        {
            "partId" : NumberLong(2),
            "name" : "パーツ",
            "either" : false
        }
      }
   }
    )
    
    # フィールドを削除 (`$unset`)
    db.system.update({ \_id: ObjectId("aaa") },
    {
    $unset: { allParts:
    {}}})
    ```

## GUI
MongoDB Compassでは以下で接続
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2456624/c1e649e0-9244-158f-158a-3d862af66733.png)



## トラブルシューティング
mongoコマンドが使えない
```
$ mongo
zsh: command not found: mongo
```
参考
https://qiita.com/katao_eng/items/f39d7b863241c40517ba
> 以前はMongoDBのパッケージにはmongoコマンドの実行に必要なMongoシェルも含まれていたようですが、バージョンアップによりMongoDBサーバーとMongoシェルが別々のパッケージに分割されたようです。
そのため、brewコマンドでMongoDBをインストールした場合は、Mongoシェルは別でインストールする必要があります。

以下実行
```
$ brew install mongodb-community-shell
(省略)
$ mongo
MongoDB shell version v5.0.21
(省略)
> 
```
コマンドラインのsdkmanager Could not determine SDK root.

解決方法

任意の名前のディレクトリを作成し、そこにすべて移動させる

これを
cmdline-tools\bin
cmdline-tools\lib
cmdline-tools\source.properties

こうする
cmdline-tools\a\bin
cmdline-tools\a\lib
cmdline-tools\a\source.properties
ESP32: MicroPython で SSID をスキャン

次のページを参考にしました。
[ESP32とMicroPythonでNETサービスの利用](https://www.microfan.jp/2023/10/esp32-net-micropython/)

## プログラム

```py:wifi_scan.py
import network
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
aplist = wlan.scan()
llx = len(aplist)
print(llx)
for it in range(llx):
    print(aplist[it][0].decode())
```

## 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/1363d567-5891-1f8b-b803-d87f6749f1bb.png)
Spring Frameworkとは

# Spring Frameworkとは
Java開発におけるフレームワーク
以下全体像(一部)

 ## Spring Boot
Spring アプリケーションを煩雑な設定をせずに迅速に作成する機能

## Spring プロジェクト
- <font color="FireBrick">Spring MVC</font>
Webアプリケーションを簡単に作成する機能
	(詳細を記述)
- Spring Data
	データアクセスに対する機能
- Spring Batch
	バッチ処理機能
- Spring Batch
	認証/認可の機能
- Spring コア
- Spring DI
	依存性注入(Dependency Injection)の機能
- Spring AOP
	アスペクト指向プログラミング(Aspect Oriented Programming)の機能

#  Spring MVCとは
## まずMVCモデル
[概要は省略](https://qiita.com/tentom/items/de95f63bc9e2da2bd0bf)
#### 利点
- 役割分担することで効率的に開発が行われる
- 開発を行うエンジニアの分業が容易になる
- 仕様変更に柔軟に対応できる

#### 問題点
- 業務で扱うデータ要件が複雑になればなるほど、Model が肥大化していく
    解決方法→[レイヤアーキテクチャの導入](https://qiita.com/0w0-mi/items/ce0b206569926d167b03#%E3%83%AC%E3%82%A4%E3%83%A4%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E3%81%AE%E5%B0%8E%E5%85%A5)
- 入力に応じた出力要件が複雑になればなるほど、Controller と View の依存性が高くなる

## Spring MVC
### 概要
Webアプリケーションを簡単に作成する機能
デザインパターンの一つ「フロントコントローラ・パターン」で実装
全てのリクエストは「フロントコントローラ」が受け取り、その後適切な処理をするコントローラに割り振る設計

### 全体像
<img width="1000" alt="image.png (91.0 kB)" src="https://img.esa.io/uploads/production/attachments/20097/2023/02/10/140098/e0564bf0-f65b-4f19-8e6b-8c600dffad74.png">

### 構成要素
| オブジェクト | 機能概要 |
| -------- | -------- |
| Dispatcher Servlet  | 全てのリクエストを受信するフロントコントローラ |
| Model | 「Controller」から「View」に渡す「表示データ」など格納するオブジェクト |
| Controller | リクエストに応じた処理を行う |
| View | 画面表示処理を行う |
| Service | 「Controller」から渡されデータベースへアクセスしてデータを取得、データの加工するなど、開発者が設計実装する　※図にはないし、Spring MVCには関係ない |

#  レイヤアーキテクチャの導入
### MVCモデルの問題点
> 業務で扱うデータ要件が複雑になればなるほど、Model が肥大化していく

を解決するためにModelに役割分担を持たせより明確に分割する
考え方をレイヤ化という
（ここはSpring MVCのModelと違う）

### レイヤ化
レイヤ化にも色々な種類が存在するが
多分FS３では 実践ドメイン駆動設計(DDD)をもとにした 4 層でできている

| レイヤー | 機能概要 | 
| -------- | -------- |
| UI 層 (プレゼンテーション層)     | ユーザのリクエストを受付け、レスポンスを画面に表示する層　例：View |
| アプリケーション層 | 「クライアント」から受け取った「リクエスト」 を制御し、「ドメイン層」を使ってアプリケーションを制御する層　例：Controller |
| ドメイン層 | 「Domain Object」に対するアプリケーションの「サービス処理」を実行する層 |
| インフラストラクチャ層 | 「Domain Object」に対する「CRUD操作」を行い、データの永続化を担う層 |

### レイヤ化別コンポーネント
<img width="1000" alt="image.png (199.7 kB)" src="https://img.esa.io/uploads/production/attachments/20097/2023/02/10/140098/fa1868a5-edef-4b87-8ed5-4e0819dd976a.png">

### 構成要素
| レイヤー | コンポーネント| 機能概要 | 
| -------- | -------- | -------- |
| UI 層 (プレゼンテーション層)     | View | 見た目、画面 |
| アプリケーション層 | Controller | 「リクエスト」を処理にマッピングし、結果を「View」に渡すという制御を行う。主な処理は「Controller」内では行わず「ドメイン層」の「Service」を呼び出しを行う |
| ドメイン層 | Domain Object | 「サービス処理」を実行する上で必要な資源（Entityなど） |
|   | Service | アプリケーションの「サービス処理」そのもの |
|   | Repository | 「Repository」は「インターフェース」で、「データベースへのデータ操作」定義のみを記述（実装内容は記述しない） |
| インフラストラクチャ層 |  RepositoryImpl | 「ドメイン層」で定めた「Repository」の実装クラス、「O/R Mapper」が「Repository」の実装クラスを作成する場合もある |
|   | O/R Mapper | 「O：オブジェクト」「R：リレーショナルデータベース」とのデータをマッピングする |
.sshのconfigを分割して管理

## 背景
.ssh/config ファイルが長くなってきたので、分割して管理する

## フォルダ構成
```bash
[~/.ssh]
$ tree
.
├── conf.d
│   ├── config
│   └── server1.conf(自分で作成⭐︎)
├── config
├── id_rsa
├── id_rsa.pem
├── id_rsa.pub
├── ssh
└── sshKey
```

## 設定ファイル
`ssh server1`で接続できるように以下を追加
```server1.conf
Host server1
    HostName {IPアドレス}
    User {ユーザ指定}
    IdentityFile ~/.ssh/id_rsa
    Port 22
    TCPKeepAlive yes
```

## ファイルの結合

- ### .zshrcにsshの設定を結合する用のコマンドエイリアスを作成
```.zshrc
alias ssh-config-update="cat ~/.ssh/conf.d/config ~/.ssh/conf.d/*.conf > ~/.ssh/config"
```

- ### .zshrcを再読み込みして、~/.ssh/configを更新
```bash
$ source ~/.zshrc
$ ssh-config-update
```

- ### 今後追加したら以下を実行
```bash
$ ssh-config-update
```

## 参考
https://qiita.com/passol78/items/2ad123e39efeb1a5286b
Excel比較、Excel差分、WEBツール「XLSXTool」をローンチしました。

Excelを比較するツールはインストーラーやクライアントアプリではよく見かけるものの
WEBで手軽に試せるツールはあまり見たらないなと考え｡｡｡

### Excel差分を比較するWEBツール「XLSXTool」をローンチしました。

https://xlsxtool.com/



# 使い方

### １．比較したいExcelを２つ選択し、「比較開始」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3910458/3f57503d-ab2e-45c2-d206-215f78fd7e5b.png)
#### ※ファイル選択はドラック＆ドロップか「Excelを選択」押下から実行できます。
#### ※最大ファイルサイズは４メガバイトまでです。


### ２．利用規約に同意します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3910458/680dbe64-60f8-496c-1040-08ffd7b5132e.png)
#### ※利用規約への同意は一度していただければ出なくなります。

### ３．結果が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3910458/bc8c540e-cd79-ef59-5710-0cc9b025b9a2.png)

#### ・生Excelとほぼ同様の見た目で差分を表示します！
#### ・結果を文字差分まで詳細表示してくれるので分かり易いです！
#### ・セキュリティ対策はCISベンチマークに準拠しています。
#### ・アップロードファイルはストリームで扱い、物理ファイルとして保存しません。

 


# 注意点
#### ・画像やグラフは未対応（表示されない）です。
#### ・一部Excel関数が対応できていない部分があります。

### 今後、「こんな機能があれば便利だな」や「もう少し改良してほしい」等のご要望があればご指摘いただければと思います！
SvelteKit の "Streaming non-essential data" のレスポンスを見てみる (だけ)

SvelteKit の "[Streaming non-essential data](https://svelte.dev/docs/kit/load#Streaming-with-promises)" の実際のレスポンスをみてみるだけです。

（「むりにSSRで描画しなくてもいいデータは、HTTPのストリーミングレスポンスを使って遅延させて提供できる」という機能です。はじめの描画を早期に得ることができつつ、即時に提供したいデータと遅延させるデータを同一のHTTTPリクエスト内で返せるので無駄な負荷やコストを減らせたりもします。）

- https://svelte.dev/blog/streaming-snapshots-sveltekit
- https://kit.svelte.dev/docs/load#streaming-with-promises

## コード

1.5秒後にランダムな数字をResolveするPromiseを、load 関数の data として返します。

Svelte 4 + SvelteKit 2.7.1

```typescript:+page.server.ts
export const load = async () => {
  const promise = new Promise<number>((resolve) => {
    setTimeout(() => {
      resolve(Math.random());
    }, 1500);
  });
  return {
    stream: {
      promise,
    },
  };
};
```

```svelte:+page.svelte
<script lang="ts">
	export let data;
	$: ({
		stream: { promise },
	} = data);
</script>

{#await promise}
	<p>wait</p>
{:then data}
	<p>{data}</p>
{/await}
```


## HTTPレスポンスの様子

### SSR時のレスポンスをみる

cURL でページを取得してみます：

![3b0714bf0ca15d2aa01ec4f3a19c5b12.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95370/2965ebeb-baba-bcc3-45cf-834034e66a82.gif)

```html
		</div>
	</body>
</html>

<!--1.5秒ほど待つ-->

<script>__sveltekit_dev.resolve({id:1,data:.8175629793650785,error:void 0})</script>
```

HTMLが送信されたあと、1.5秒後に、遅延されたデータが追加の `<script>` として提供されている様子がわかります。

### ページ遷移時のレスポンスをみる

ルータによる遷移時は `/path/to/page/__data.json` から data が取得されます。同じく cURL で取得してみます。

![c0ecea055ce7b4c0921633e6ba68ce91.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95370/58fbaea8-35f3-df91-597a-7a44faade253.gif)

```ts
{"type":"data","nodes":[{"type":"data","data":[{"currentUser":-1}],"uses":{"dependencies":["auth:session"]}},{"type":"data","data":[{"stream":1},{"promise":2},["Promise",3],1],"uses":{}}]}
// 1.5秒ほど待つ
{"type":"chunk","id":1,"data":[0.511447670839192]}
```

SvelteKitのブログ記事 <https://svelte.dev/blog/streaming-snapshots-sveltekit#how-does-it-work> にも書かれている通り、遅延された内容が「改行で区切られたJSON」として送られている様子がわかります。

---

おわり。
効率的なコードレビューの実践方法



# 効率的なコードレビューの実践方法

## はじめに

My Site: https://www.teckum.com 

コードレビューは、品質の高いソフトウェアを開発するために欠かせないプロセスです。しかし、単にコードを読むだけでは効果は半減してしまいます。今回は、効率的で効果的なコードレビューの進め方をプロフェッショナルの視点からご紹介します。

## 1. コードレビューの目的を明確にする

コードレビューの第一の目的は、バグやセキュリティ上の脆弱性を発見することです。しかし、それだけに留まらず、チーム全体のコードの一貫性や可読性を保つことも重要な目的です。目的を明確にすることで、単なる形式的なレビューから脱却し、より価値のあるフィードバックを提供できます。

## 2. フォーカスポイントを絞る

コードレビューでは、すべての行を細かくチェックする必要はありません。以下のようなポイントにフォーカスしましょう：

- **ロジックの整合性**：アルゴリズムが正しく設計されているか？
- **コードの可読性**：他の開発者が理解しやすい構造になっているか？
- **セキュリティ**：潜在的なセキュリティリスクが存在しないか？
- **パフォーマンス**：効率の良いコードになっているか？

## 3. フレンドリーかつ具体的なフィードバックを心掛ける

レビューのフィードバックは、開発者にとって成長の機会です。批判的なトーンではなく、建設的で具体的なアドバイスを提供しましょう。

例：
- 悪い例：「このコードはダメです。」
- 良い例：「この部分は複雑に見えますね。`map()`関数を使うと、もう少しシンプルになるかもしれません。」

## 4. ツールを活用して効率化する

コードレビューの効率を上げるために、自動化ツールを活用するのも効果的です。例えば、**SonarQube**や**ESLint**などの静的解析ツールを使用することで、基本的なエラーやスタイルの問題を自動的に検出できます。これにより、レビューではより高度な部分に集中できるようになります。

## 5. フォローアップを忘れない

レビューで指摘された点がどのように修正されたかを確認することも重要です。フィードバックが適切に反映されているかどうかを確認し、必要であれば再レビューを行うことで、最終的なコードの品質が大幅に向上します。

## 結論

コードレビューは、プロジェクトの成功にとって不可欠なステップです。効率的かつ建設的なレビューを実践することで、チーム全体のスキルが向上し、より良いソフトウェアが生まれるでしょう。ぜひ、今回紹介したポイントを取り入れて、コードレビューをより効果的に進めてください。
【Ruby】初学者向け－言語基礎①

Stringについて学んだことを整理しました。
<h1>Stringに使用するメソッド一覧</h1>

**upcase**
…小文字の文字列を大文字にする
＜使用例＞
<pre>test = 'test'
test.upcase
    =>TEST</pre>
----------------------------
**downcase**
…大文字の文字列を小文字にする
＜使用例＞
<pre>test = 'TEST'
test.downcase
    =>test</pre>
----------------------------
**slice**
…文字の切り分けを行う
＜使用例＞
<pre>test = 'あいうえお'
　test.slice(1,2)
  => "いう"</pre>
----------------------------
**size**
…文字の大きさを確認する
＜使用例＞
<pre>test = 'あいうえお'
　test.size
  => "5"</pre>
----------------------------
**to_i**
…文字列となっている数字をintegerに変換する
 すると、数値として扱うことができ、計算式に組み込むことが可能になる
＜使用例＞
<pre>'100'.to_i
　=>100</pre>
----------------------------
**to_f**
…浮動小数点数に変換する
 すると、数値として扱うことができ、計算式に組み込むことが可能になる
＜使用例＞
<pre>'10.5'.to_f
　=>10.5</pre>
----------------------------
**methods**
…戻り値のオブジェクトが持つメソッドの表示ができる
 メソッド名を忘れてしまった場合や、どんなメソッドが実装されているかを確認する場合に用いる
＜使用例＞
<pre>'string',methods
=>:include?
　　:%
　　:*
　　:+
　　…
　　…
　　…（省略）</pre>

<h1>文字列の連結方法</h1>

**連結**
＜使用例＞
<pre>test1 = 'テスト１'
test2 = 'テスト２'
test1 + test2
    =>'テスト１テスト２'</pre>
----------------------------------------------
**追記して上書き**
＜使用例＞
<pre>test1 << test2
    =>'テスト１テスト２' 
</pre>
----------------------------------------------
**追記して上書き（自己代入）**
＜使用例＞
<pre>test1 += test2
    =>'テスト１テスト２</pre>
----------------------------------------------
**文字列の繰り返し**
＜使用例＞
<pre>'文字'.*10
=>"文字文字文字文字文字文字文字文字文字文字"</pre>
----------------------------------------------
**文字列の中で式を展開する方法**
＜使用例＞① 
<pre>two = 2
test = "1+1は #{two}"
     =>"1+1は 2"</pre>

＜使用例＞② 
<pre>"1+1は #{ 1 + 1 }"
       =>"1+1は 2"]
</pre>
Amazon CloudWatchについて

## Amazon CloudWatchとは
定期的にAWSリソースの状態を取得し、しきい値（境界値）を超える・下回るなどした場合に運用者に通知するサービスです。

## CloudWatch Metrics
CloudWatchが監視する様々なリソースの情報は「メトリクス」と呼ばれます。EC2インスタンスのCPU使用率やLambda関数ごとのエラー回数、ディスクの使用状況（読み取り・書き込みの量）など、AWSにあらかじめ定義されているメトリクスを標準メトリクスと呼びます。一方、利用者が定義した値をCloudWatchに渡すことで独自のメトリクスを作成することもできカスタムメトリクスと呼びます。
## CloudWatch Alarm
CloudWatch Alarmでは、設定したメトリクスに基づいてアラームを定義することができます。アラームの条件を満たした場合にAmazon Simple Notification Service (SNS)と連携して通知を送信したりLabmda関数を呼び出したりできます。

## CloudWatch Logs
CloudWatch LogsはAWSサービスやEC2インスタンスのOSやアプリケーションのログを収集し、モニタリングするサービスです。EC2インスタンス上のアプリケーションやOSのログを収集するには、対象のEC2インスタンスへ「CloudWatchエージェント」をインストールする必要があります。

### CloudWatch Logs Insights
CloudWatch Logsで収集したログの分析・可視化を行うことができます。

## ダッシュボードの共有
CloudWatchのダッシュボードは「ダッシュボードの共有」機能を使用することで、AWSアカウントを持たない相手と共有することが可能です。
共有方法は下記があります。
 * メールアドレスおよびパスワードで共有メンバーを設定
 * ダッシュボードへのリンクを知る全てのメンバーと共有
 * Amazon Cognito に統合されたシングルサインオン・プロバイダーのメンバーと共有

「ダッシュボードの共有」機能を使用した場合、共有を受けたメンバーにはそのダッシュボードの情報を参照するために必要な最小限の権限のみが自動的に付与されます。CloudWatchダッシュボード以外のリソース（ログやアラームの定義など）に対するアクセス権限は付与されないため、最小権限の原則に則った安全な共有を実現することができます。
パワポを使って１０分で作る「検索窓」

よく見かける「検索窓」を簡単にパワポで作成する方法です。
![検索窓最終形態.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3044655/35fa19c8-282c-54ca-3483-f7f07ff0a206.gif)


## 1. 検索ボックスの枠部分を作る
・「挿入」→「図形」→「角丸四角形」
・塗りつぶしはなし
![スライド2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3044655/9020e7da-b35d-6e8b-c651-1af62f50a97e.png)


## 2. 検索ボタンを作る
・「挿入」→「図形」→「片側の2つの角を丸めた四角形」
・枠分と同じ色にして、右端に配置
![スライド3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3044655/e14dd1f4-7fc0-3f76-20c3-266d9766c28c.png)


## 3. 虫眼鏡マークを作る
・円と線から
・線は、「図形の書式設定」から「線の先端」を「丸」にしておくと、かわいい
![スライド4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3044655/ab3ca71e-586b-b176-d9f9-1558edd18710.png)


## 4. 検索キーワードを作る
・好きなキーワードで
![スライド5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3044655/cec97ecc-8279-4a8f-dd3f-9d4456753dd8.png)


## 5. 矢印マークを配置する
・「アイコン」タブから、「クリック」で検索すると出てきます
![スライド6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3044655/522fafec-7389-b75f-5cec-2f7567b89f41.png)


## 6. アニメーションの設定
ここが一番のキモです
・まず、検索ボックス枠、ボタン、虫眼鏡は、まとめてグループ化しておく

**＜検索キーワード＞**
・「アニメーション」→「フェード」
・「効果のオプション」の「タイミング」は「開始」を「クリック時」、「継続時間」を「0.2秒」に設定
・その下の「テキスト　アニメーション」の「テキストの動作」を「文字単位で表示」に設定

**＜検索ボックス＞**
・「強調効果」で「パルス」を選ぶ
・「効果のオプション」の「タイミング」は「開始」を「直前の動作の後」、「継続時間」を「0.2秒」に設定

**＜矢印＞**
・「アニメーションの軌跡」で「線の描画」を指定し、開始位置と終了位置をいい感じにセットする
・タイミングは、「直前の動作の後」「0.5秒」

完成！！
Snowflakeの監査ログがほしい

# はじめに
Snowflakeのログに関して、監査対応するにはどうしたらよいか調査しました。

# Account_usageスキーマとInformation_schema
ログについて調べるとAccount_usageスキーマとInformation_schemaという似たような2種類のスキーマに出会います。私はこの二つを混同していたので違いをおさえておくのをおすすめします。

どちらもsnowflakeによってデフォルトで提供されており読み取り専用です。

### Account_usageスキーマ
・Snowflakeデータベース配下にある
・実行履歴が反映されるのに時差がある
・過去365日分の履歴を保持
・アカウントレベルの権限がないと触れない（要権限付与）
・ありとあらゆるデータをVIEWに保持しており、後述のInformation_schemaの完全版のようなイメージ（Snowflakeイベントに参加した際に聞きました）
・監査ログなど重要なデータを取得したい場合はこちらをselectするのがよい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635659/3e3a1474-b550-938a-94a6-12932e0eb377.png)


### Information_schema
・各DBに自動で作成される
・実行履歴が即時反映される
・過去14日分の履歴を保持
・Account_usageスキーマのVIEWの一部のようなイメージ
・開発作業中に実行履歴を確認する場合などはこちらをselectするのがよい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635659/b6fc6835-4def-0492-9a8c-56969b05826d.png)





→ 今回は監査ログ想定で調査をはじめたので、Account_usageスキーマを参照する方法を調べました。


# ログの保管方法
監査に対応するには既定の保管日数↑では足りない可能性があるので、別で保管しておく必要があります。

現時点で思いつくのは以下の2通り
・Account_usageスキーマから抽出→ファイルに出力
・Account_usageスキーマから抽出→個別のテーブルにinsert

上記をsnowflakeのtaskや外部ツールを使用して日次で保存する運用がシンプルで良い。

個人的には、snowflakeのストレージコストは安価ですし、大量のログがあってもSQLで検索ができるので個別のテーブルにinsertするのが良いなと思いました。

# 監査ログに使えそうなVIEW

Account_usageスキーマ内にはたくさんのVIEWがあるのでその中から監査ログに使用できそうなものをリストアップしてみました。

| No | VIEW名 | 内容 |
| ---- | ---- | ---- |
| 1 | login_history | ログインユーザーがどのipアドレスからアクセスしたか、ログイン成功/失敗時のエラー内容などがわかる。|
| 2 | query_history | 誰が、いつ、何のテーブルに、どのウェアハウスでどんなクエリしたかがわかる。どのカラムに対してかまではわからないがクエリのテキスト(SQL)から推測できそう。 |
| 3 | access_history | 誰が、いつ、何のテーブルの、どのカラムをクエリしたかわかる。配列型の項目があるので単にファイルとして見るにはわかりづらそう。 |
| 4 | task_history | taskの履歴。 taskがある場合に使用。|
| 5 | copy_history | copyの履歴。query_historyにもcopyの履歴は残るがより細かい情報が載っている。 |


query_historyとaccess_historyは内容が重複しているところがあるのでどちらかに絞ってもいいかもしれません。
もしくは、snowflakeのテーブルにinsertする場合であれば保管コストはそんなに気にならないと思うので、どっちもとっておいて後々必要かどうか判断するのもありです。


# Account_usageスキーマを参照するには
・Account_usageスキーマを参照できる権限を付与する

→参照方法を付与する方法は
　・IMPORTED PRIVILEDGEを付与する
　・Snowflakeデータベースロールを付与する

私の場合は、これまで経験してきた設計内容に近しかった「IMPORTED PRIVILEDGEを付与」を採用しました。

詳しくは↓
他のロールに対する SNOWFLAKE データベース使用の有効化：
https://docs.snowflake.com/ja/sql-reference/account-usage#enabling-the-snowflake-database-usage-for-other-roles

IMPORTED PRIVILEDGEとは：
https://docs.snowflake.com/ja/user-guide/security-access-control-privileges#database-privileges

# 注意事項
・Account_usageスキーマは、履歴が即時反映ではないのでselectするタイミングは考慮する
　例：前日23:59までの分のログを翌日の夜間に取得するなど



# まとめ
・監査ログなど重要なものはAccount_usageスキーマを、開発時の履歴の確認であればInformation_schemaを参照
・デフォルトのデータ保持期間が短いので監査対応の場合はファイルまたはテーブルに移しておくのが良い
・必要な内容や粒度によってログの種類を選択


調べてみてると、Account_usageスキーマには山ほどVIEWがあり、その中で山ほど項目があります汗
何が必要か/使えそうかは組織によっても異なると思いますし、こんなデータもあるんだ～という発見もあったので一度眺めてみることをおすすめします！


# 参考
・Account_usageスキーマ
https://docs.snowflake.com/ja/sql-reference/account-usage

・Information_schema
https://docs.snowflake.com/ja/sql-reference/info-schema

・Account_usageスキーマVIEW一覧
https://docs.snowflake.com/ja/sql-reference/account-usage#account-usage-views
UTC表記のわかりにくさを分解し、迷わないようにする。

# わかりにくいですよね。
awsのログを見ているときなどに出てくるこれ。
### 6:11 (UTC+09:00)
最初わからなくないでしょうか？UX悪くないですか？

・UTCだと+9必要で、15時なのか、
・これは、UTC表記ですでに＋9済なのか。
・これは、JST表記で、UTCからすでに9時間足された値なのか
・これは、プラス９しないと、JSTにならない。

つまり以下のどれでしょう？
・日本時間06:11で標準時が15:11
・日本時間21:11で標準時が06:11
・日本時間06:11で標準時が21:11
・日本時間15:11で標準時が06:11


### 一瞬迷ったあと、これだ、とはなりますが、慣れないうちは、あれ？となるのではないでしょうか。
本qiitaではこれを一撃でわかるようにします。
迷わない人はすみません。
一番下に関連知識があるので、そこだけでも見ていってください。


# 前提になっている知識を分解する

## ①JSTは、UTCプラス9時間で表記されている。
中１の社会で習った知識ですね。
みんなこれは知ってます。これは知ったうえで、何が何にプラスになってて表示されてるのはどこの時間なのかがわかりにくい。

## ②JSTはUTCより先だが、前の国もある。

### 西半球の国はUTCマイナスになります。
仮にJSTしか存在しない世界なら次のほうがわかりやすいと思います。

6:11 (UTC21:11)

こっちのほうがよくないですか？
ただこれだと問題があって、UTCよりどちらが進んでいるかわからないのです。

## ③仮説 日本人は標準時を暗記しているが、世界の人はそうではない？
違和感として、UTC+9とあるが、
### このプラス９は知ってるねん！！！

となるのではないのでしょうか。
ですが、計算が得意な東アジア人と違って、この+9などは所与の知識ではないので、
ここが強調されている可能性を考えてみました。
135÷15を瞬時に頭の中で計算しているのは、われわれだけかもしれません。
これはあくまで仮説で、ふつうに違うかもしれません。悪しからず。



# 結論

①はみんな知ってる。けど、②の認識があまりなく、この表記に違和感を感じやすい。③のように日本人向けではないUIとなっている可能性もある。
よって、
### マイナスになる場合の表記を見ておけば納得できる。

### これを本記事では提案したいです。

せっかくなので、AWS reinventの会場でもある、アメリカ西海岸ロサンゼルスの時間表記を見ておきましょう。

### 6:11 (UTC-08:00)


そのあと、最初の日本時間を見てください。
わかりやすい表記であると気づくのではないでしょうか？

### 6:11 (UTC+09:00)

以上

# そのほか知っておくとよいこと

・よくUTC表記のときZって記載されてるのは、RFC3339っていう形式。
つまりZ=UTC=Time zone +00:00で認識正しい。
デルタシグマADCのSimulink再現



```
function [PDM_output, DAC_output] = delta_sigma_adc_comparator(input_voltage, VDD, compare_voltage)
    % デルタシグマADC用のコンパレータとDAC統合関数
    % 初期設定はすべて0で開始し、入力電圧の変化に応じて更新する
    % 入力:
    %   input_voltage  - 入力電圧 (変更される)
    %   VDD            - フルスケール電源電圧
    %   compare_voltage - 比較対象電圧
    % 出力:
    %   PDM_output     - PDM出力電圧
    %   DAC_output     - DAC出力電圧
    
    % 初期設定
    PDM_output = 0;
    DAC_output = 0;

    % 入力電圧が更新された場合の処理
    if input_voltage > compare_voltage
        % 入力電圧が比較電圧より大きい場合
        PDM_output = VDD;      % PDM出力 = VDD
        DAC_output = VDD;       % DAC出力 = VDD
    else
        % 入力電圧が比較電圧より小さい場合
        PDM_output = 0;        % PDM出力 = 0
        DAC_output = -VDD;      % DAC出力 = -VDD
    end
end

```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/6514e0dc-c634-97db-cdd6-1bc555009bac.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/af59a14f-53e7-266e-17c3-7455902dd6aa.png)



その2


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/de15ca25-525b-ce81-24a3-49a56468cabb.png)
```

function output = SGN(input_signal)
    % SGNブロック
    % 入力信号が0以上なら1を出力
    % 入力信号が0より小さいなら-1を出力
    
    if input_signal >= 0
        output = 1;   % 入力信号が0以上のとき
    else
        output = -1;  % 入力信号が0より小さいとき
    end
end

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/b0aa4b49-93e4-9e7b-3686-5ff52de4be0e.png)


量子化誤差を使ったシミュレーション
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/0a4319ef-8b26-56de-c9f0-f217028bbaf9.png)

```
function output_voltage = voltage_update(input_voltage, sampling_clock)
    % 永続変数の宣言
    persistent last_sampling_clock;  % サンプリングクロックの状態保持
    persistent output_voltage_persist; % 出力電圧の永続変数
    
    % 初期化チェック
    if isempty(last_sampling_clock)
        last_sampling_clock = 0;  % サンプリングクロックの初期値
    end
    
    if isempty(output_voltage_persist)
        output_voltage_persist = 0;  % 出力電圧の初期値
    end
    
    % 出力変数の初期化
    output_voltage = output_voltage_persist;  % デフォルトで前の出力電圧を保持
    
    % サンプリングクロックが0から1に変わった場合、出力電圧を更新
    if last_sampling_clock == 0 && sampling_clock == 1
        output_voltage = input_voltage;  % 入力電圧で出力を更新
        output_voltage_persist = output_voltage;  % 更新された出力電圧を保存
    end
    
    % サンプリングクロックの状態を保存
    last_sampling_clock = sampling_clock;
end





```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/c18c45be-4e15-cca7-e3ed-217043c76164.png)


参考資料
https://kobaweb.ei.st.gunma-u.ac.jp/lecture/MCE2020_10.pdf
Podman環境構築(Mac)

## 概要
業務でPodmanを使用するため、公式を参考にMacで環境構築してみた(2024/10/15)

#### 公式
https://podman.io/docs/installation 

#### Podmanとは
Red Hat社を中心とするコミュニティが開発している、Docker互換のコンテナエンジン


## インストール（Mac）
```bash
[~/docker]
$ brew install podman
==> Auto-updating Homebrew..

[~/docker]
$ podman --version
podman version 5.2.2
```

## コンテナを立てる
#### Podman の仮想マシンを作成
```bash
# 初期化
$ podman machine init
Looking up Podman Machine image at quay.io/podman/machine-os:5.2 to create VM
Getting image source signatures
Copying blob 2effca170b12 done   |
Copying config 44136fa355 done   |
Writing manifest to image destination
2effca170b1286030a1a35a3a4b99e94cdefa06844dc9d940b59672bd950f60a
Extracting compressed file: podman-machine-default-arm64.raw: done
Machine init complete
To start your machine run:

	podman machine start
```

#### 仮想マシンstart
```bash
$ podman machine start
Starting machine "podman-machine-default"
...
Machine "podman-machine-default" started successfully
```

#### 確認
```bash
$ podman ps
CONTAINER ID  IMAGE       COMMAND     CREATED     STATUS      PORTS       NAMES
```

#### サンプルコンテナ(Nginx)を作成
```bash
$ podman run --name basic_httpd -dt -p 8080:80/tcp docker.io/nginx
Trying to pull docker.io/library/nginx:latest...
...

# できた
$ podman ps
CONTAINER ID  IMAGE                           COMMAND               CREATED             STATUS             PORTS                         NAMES
e4645207fc9c  docker.io/library/nginx:latest  nginx -g daemon o...  About a minute ago  Up About a minute  0.0.0.0:8080->80/tcp, 80/tcp  basic_httpd

```

| コマンド | 説明 | 
| -------- | -------- |
| run     | コンテナ作成     |
| --name | コンテナ名指定 |
| -d | デタッチモード |
| -t | ttyモード |
| -p | ポート番号指定 |
| docker.io/nginx | イメージを指定 （docker.ioリポジトリにあるnginxイメージでコンテナを作成） |

#### イメージ確認
```bash
# imageもインストールされてた
$ podman images
REPOSITORY               TAG         IMAGE ID      CREATED      SIZE
docker.io/library/nginx  latest      195245f0c792  6 weeks ago  197 MB
```

#### nginxが起動しているか確認
```bash
$ curl http://localhost:8080
<!DOCTYPE html>
<html>
<head>
...省略
```

#### ログ確認
```bash
$ podman logs basic_httpd
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
...
10.88.0.2 - - [24/Sep/2024:07:48:34 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/8.7.1" "-"
```

#### 止める
```bash
$ podman stop basic_httpd
basic_httpd

$ podman ps -a
CONTAINER ID  IMAGE                           COMMAND               CREATED        STATUS                    PORTS                         NAMES
e4645207fc9c  docker.io/library/nginx:latest  nginx -g daemon o...  5 minutes ago  Exited (0) 5 seconds ago  0.0.0.0:8080->80/tcp, 80/tcp  basic_httpd
```
タスクスケジューラーでdockerで動かしているwordPressのバックアップを定期的に取得する方法

## バッチファイルの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/4676a3bd-5927-5082-1686-c9e06c8cf5df.png)
```
@echo off
set timestamp=%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2%
set timestamp=%timestamp: =0%

docker run --rm ^
-v docker_wordpress_wordpress_data:/var/www/html ^
-v D:/Docker_app/docker_wordpress/backup/wordpress:/backup ^
busybox sh -c "tar -czf /backup/wordpress_backup_%timestamp%.tar.gz -C /var/www/html ."

docker run --rm ^
-v docker_wordpress_mysql_data:/var/lib/mysql ^
-v D:/Docker_app/docker_wordpress/backup/mysql:/backup ^
busybox sh -c "tar -czf /backup/mysql_backup_%timestamp%.tar.gz -C /var/lib/mysql ."

exit /b 0


```

## タスクスケジューラーの設定
トリガー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/840a2c2d-3428-69fd-2340-921342e19a71.png)
操作
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/95f7a582-11b6-2586-9dbe-3540e70a8455.png)
条件
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/23b17df3-a655-2c4c-bb71-be07b5275762.png)

## 試してみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/812bc67a-6166-1e33-264d-903918d6906b.png)


実行する。
期待通りの結果になればOK。
iOS App 「積分ますたー」


# アプリの使い方

![Simulator Screenshot - iPad Air 13-inch (M2) - 2024-10-15 at 10.53.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661763/967fd260-4c3f-c18c-385e-ae4413a95237.png)

![Simulator Screenshot - iPad Air 13-inch (M2) - 2024-10-15 at 10.54.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661763/58cff462-1310-c397-0aa6-5575b28c1de6.png)

## 設定

ホーム画面の左上の歯車アイコンを押下するとシャッフルする問題の設定ができます。

- 不定積分だけ
- 定積分だけ
- 両方

## 積分の問題を解く

ホーム画面で「スタート」を押下すると問題がシャッフルされ、「ストップ」を押下すると問題がとまります。
解きたい問題を解いたら、その問題が表示されている状態で「解答みる」を押下して、「○」「△」、「×」のいずれかの学習履歴を記録します。

![Simulator Screenshot - iPad Air 13-inch (M2) - 2024-10-15 at 10.54.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661763/148f7ec4-ac09-0a8f-a4fb-4e6803d27e7d.png)

## 学習履歴を確認する

ホーム画面で「学習履歴」を押下すると一覧形式で学習履歴を確認することができます。問題を押下すると、その問題が表示されるので、シャッフルではなく解きたい問題を直接選択したい場合は「学習履歴」から選択することができます。

![Simulator Screenshot - iPad Air 13-inch (M2) - 2024-10-15 at 10.53.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661763/485dacc7-05aa-206f-e6f8-668df03cd56c.png)

# プライバシーポリシー

## 利用者情報の取得

本アプリが利用者の個人情報を取得することはありません。

## 利用者情報の利用

本アプリが利用者の個人情報を利用することはありません。

## 利用者情報の第三者提供

本アプリが利用者の個人情報を第三者へ提供することはありません。

## 免責事項

本アプリ利用上の不具合・不都合に対して可能な限りサポートを行っておりますが、利用者が本アプリを利用して生じた損害に関して、開発元は責任を負わないものとします。

## お問い合わせ先

本記事にコメントしてくだされば、対応させていただきます。
VS Codeで自動保存する方法

## VS Codeで自動保存する


### 前提
デフォルトでは自動保存されない。
そのため変更を反映するには、「command + s」で変更を保存する必要がある。
これを、いちいち自分で保存しなくても自動保存されるように設定できる！


### 設定方法
1.上部メニューから「設定」を選ぶ（【Command】+【,】でもいける）
2.検索窓に「autosave」を入力
3.セレクトボックスから「afterDelay」を選ぶ
4.選択したら、再度VS Codeを再起動


### 補足
「afterDelay」が一番いいけど、他にも下記のようなものがある。
＊off：自動保存されない
＊afterDelay：一定時間操作がなかったら保存
＊onFocusChange：タブからカーソルが消えた時点で保存
＊onWindowChange：ウィンドウを切り替えた時点で保存
【Error】他のアプリが同じポートを使用していることで起こるエラー`Error response from daemon`

# はじめに

環境構築の過程で下記コマンドを実行したときに発生したエラーについて、同じことが起こった場合、わたわたしないためにも記事に残しておこうと思います。

## 環境
- Windows, WSL
- Docker
- Ruby 3.2.3
- Rails 7.1.3


## 1：入力コマンドとログ
```
docker compose run --rm web gem install rails

👇以下ログ
[+] Running 0/1
 ⠹ Container hogehoge_app-db-1  Starting                                                    0.2s 
Error response from daemon: driver failed programming external connectivity on endpoint hogehoge_app-db-1 (a1bc2877a2b5722de9e46717b1e2cce05ccb2679f6abf470bac3cebb3cce3744): Bind for 0.0.0.0:5432 failed: port is already allocated
```

## 2：エラー内容は？
`hogehoge_app-db-1`コンテナが使用しようとしているポート `5432` がすでに他のプロセスやコンテナによって使用されているため、起動に失敗しているそうです。**`5432` はPostgreSQLデータベースのデフォルトポート**で、他のPostgreSQLインスタンスや他のアプリケーションがこのポートを使っている可能性があるそうです。

・・・**データベースごとに、デフォルトのポートというものが存在していることすら知らなかったです**👇以下画像参照

[![Image from Gyazo](https://i.gyazo.com/bd1ec86051657d3f77d47bd57cf9fe44.png)](https://gyazo.com/bd1ec86051657d3f77d47bd57cf9fe44)


## 3：解決策
### 3-1：現在ポート5432を使用しているプロセスを確認・停止する
他のPostgreSQLや関連プロセスがポート `5432` を使用している場合、これを確認し、必要に応じて停止する
```bash
# ポートを使用しているプロセスを確認
sudo lsof -i :5432
```
上記コマンドはポート `5432` を使用しているプロセスを表示します。
出力に対して確認した後、そのプロセスを停止します。
プロセスIDは、`lsof`コマンドの結果から取得できます。
```bash
# プロセスを停止
sudo kill -9 <プロセスID>
```

### 3-2：Dockerコンテナの設定を変更して別のポートを使用する
PostgreSQLがすでに `5432` を使用している場合、別のポートに変更するのも一つの方法としてあげられます。`docker-compose.yml`で`5432`以外のポートを指定します。
```yaml
services:
  db:
    image: postgres
    ports:
      - "5433:5432"  # 5433に変更
```
これで、ホスト側のポート `5433` を使用し、コンテナ内のPostgreSQLは引き続き `5432` を使用します。

### 3-3：既存のDockerコンテナを停止・削除する
もし他のDockerコンテナがポート `5432` を使用している場合、そのコンテナを停止または削除することもできるそうです。
```bash
docker ps  # 実行中のコンテナを確認
docker stop <コンテナID>  # 該当するコンテナを停止
docker rm <コンテナID>  # 必要に応じて削除
```


# さいごにまとめ
私は解決方法3-3を実行しました。
最近はコマンドを実行するごとにログをちゃんと？確認できるようになったことが過去の私と比べ成長したなと感じています。
まだまだ読み解く力は微々たるものですが継続学習頑張ります。
今回の記事が何か参考になれば幸いです。