OmniAICreator/Qiita-1.07M huggingface dataset:
角が丸い□

# pygame角が丸い
角が丸い四角形を描写する
```python
def circle(rect, radius ,first_rad , end_rad, color ,screen, points = 30, width = 5):
    # 半円を描画
    center_x = rect.x
    center_y = rect.y

    # 半円の点を生成
    angle_range = np.linspace(first_rad, end_rad, points)
    points = [(int(center_x + radius * np.cos(angle)), int(center_y + radius * np.sin(angle))) for angle in angle_range]
    if width == 0:
        pg.draw.polygon(screen, color, points)
    else :
        # 点同士を線でつなぐ
        pg.draw.lines(screen, color, False, points, width)
def tetragon(rect, color, width, radius, screen):
    if width == 0:
        pg.draw.rect(screen, color, pg.Rect(rect.x, rect.y + radius, rect.w, rect.h - radius * 2), width) # 横
        pg.draw.rect(screen, color, pg.Rect(rect.x + radius, rect.y, rect.w - radius * 2, rect.h), width) # 横
        circle(pg.Rect(rect.x + radius,rect.y + radius,rect.w,rect.h), radius, 0,np.pi * 2,color, screen,100, width)
        circle(pg.Rect(rect.x - radius + rect.w + 1,rect.y + radius ,rect.w,rect.h), radius, 0,np.pi * 2,color, screen,100, width)
        circle(pg.Rect(rect.x - radius + rect.w + 1,rect.y + rect.h - radius + 1 ,rect.w,rect.h), radius, 0, np.pi * 2,color, screen,100, width)
        circle(pg.Rect(rect.x + radius,rect.y + rect.h - radius + 1 ,rect.w,rect.h), radius, 0, np.pi * 2,color, screen,100, width)
    else:
        pg.draw.line(screen, color, (rect.x + radius, rect.y), (rect.x + rect.w - radius, rect.y), width)
        pg.draw.line(screen, color, (rect.x + rect.w, rect.y + radius), (rect.x + rect.w, rect.y + rect.h - radius), width)
        pg.draw.line(screen, color, (rect.x + radius, rect.y + rect.h), (rect.x + rect.w - radius, rect.y + rect.h), width)
        pg.draw.line(screen, color, (rect.x, rect.y + radius), (rect.x, rect.y + rect.h - radius), width)
        circle(pg.Rect(rect.x + radius,rect.y + radius,rect.w,rect.h), radius, np.pi, np.pi + np.pi / 2,color, screen,100, width)
        circle(pg.Rect(rect.x - radius + rect.w + 1,rect.y + radius ,rect.w,rect.h), radius, np.pi + np.pi / 2,np.pi * 2,color, screen,100, width)
        circle(pg.Rect(rect.x - radius + rect.w + 1,rect.y + rect.h - radius + 1 ,rect.w,rect.h), radius, 0, np.pi / 2,color, screen,100, width)
        circle(pg.Rect(rect.x + radius,rect.y + rect.h - radius + 1 ,rect.w,rect.h), radius, np.pi / 2, np.pi,color, screen,100, width)
```
VisualStudio2019 開発に役立つ拡張機能のまとめ

# Visual Studioの拡張機能とは
Visual Stuidoにさまざまな機能を追加できるプラグインのこと。
例えば、デバッグ機能の拡張、ソースコードの整形補助、外観のカスタマイズなど、多くのことができる便利なツールが提供されている。

***
|オススメ度　　|ツール名|説明
|:--|:--|:-- 
|★★★★★|Solution Error Visualizer| ビルド時、ビルドエラーとなった原因のファイルや、ソリューションエクスプローラー上でエラーがあるファイルが所属するプロジェクトに赤線を引いてくれる機能<br>※プロジェクト数が多いソリューションほど便利<br><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533049/f04db0d2-61e8-10f5-6234-754c4ebe5fac.png" width="220">
|★★★★☆|Visual Studio Restart| Visual Studioのファイルメニューに再起動の項目を追加する機能<br>※VSを再起動したい場合、エクスプローラーからslnファイルを探しクリックする必要が無いので便利<br><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533049/6dccd57e-1d88-0206-fd1e-046ba3f653a6.png" width="270">
|★★★★☆|Open In Explorer| ソリューションエクスプローラー上のファイルを右クリックして表示されるメニューに、「エクスプローラーでファイルを開く」を追加する機能<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533049/d8e51d3d-a582-0e4e-fa6d-a9410766e5e2.png)
|★★★☆☆|VSColorOutput| 出力ウィンドウの警告・エラー・ビルド開始・ビルド終了など、出力の種類に応じてテキストに色を付けてくれる機能<br><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533049/b84fd36b-563a-10af-800a-33cba6c80438.png" width="470">
|★★★☆☆|Comment Remover| コメントを色々な方法で一括削除できる機能<br>※個人的には「#region」を全て削除してくれる「Remove #Regions」という機能を良く使用している<br><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533049/a8dce63d-6fa8-afd9-8563-27580c0a5598.png" width="200">
|★★☆☆☆|Code alignment| ソースコードを「=」「;」「//」など特定の記号や文字を基準に綺麗に揃えられる機能<br><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533049/24ae47c4-4a0e-4fa2-ce16-7b38f0970f07.png" width="200"><br>　　　　　　⇓<br><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533049/31629af3-ca03-1b4b-948f-f195390dfd84.png" width="200"><br>※揃えたい行の中に全角スペースが入っていたら綺麗に揃わない場合があるので要注意
|★★☆☆☆|Trailing Whitespace Visualizer| コード内の不要な空白を強調表示できる拡張機能
Java Spring Bootで作ったアプリをRenderで公開する

仕事の関係で今更ながらJavaの勉強しています。Spring Bootはとっつきやすいフレームワークなので参考書読みながらHello Worldから始めてるのですが、アプリの公開（Deploy）に関してはどうしたもんかと。
Railsは得意分野なのでRender（最近Herokuが有料化に伴い、こっち使う人が増えた）という選択肢が思い浮かんだのだけど情報が少ないようですね。2023年時点でお金かけずBootのアプリを公開する方法について書いたら価値あるかと思ってやってみました。Stackoverflowで聞きまくって、マイナス評価もらいながらも頑張って調べたので、この情報を還元します。

# TL;DR
Render.comにWebアプリケーションを作成して、GithubにBootのアプリをコミットしたものを用意して連動させる。
以下の **Dockerfile** をアプリケーションルート配下に配置する。
```Dockerfile:Dockerfile
FROM maven:3-eclipse-temurin-17 AS build
COPY . .
RUN mvn clean package -Dmaven.test.skip=true
FROM eclipse-temurin:17-alpine
COPY --from=build /target/[YOUR APP NAME & VERSION].jar demo.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "demo.jar"]
```
※[YOUR APP NAME & VERSION]には下図のArtifactとVersionをハイフンで繋いだものを入れてください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593/8d6c86c4-0849-dfa1-d039-ca8a87700be2.png)


# Spring Bootアプリケーションの開発
この辺とかにたくさん記述があるので参照すべし。
https://qiita.com/yasushi-jp/items/e6c6686f06c4390857ce
https://qiita.com/suema0331/items/cb13cf760792d81ee7ec
https://qiita.com/ist-a-ku/items/1d278619f241f4800bb2

# Render.comの操作
1. Renderを開く
https://render.com/
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593/1e8e91c2-336d-5ab5-07db-346a8bd5316f.png)

2. Github連携を行う
2. NewでWebアプリケーションを作成
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593/d1f7e1d1-19f5-461d-1941-8a9cc78641cd.png)
![スクリーンショット 2023-08-09 17.06.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593/aba25704-dec0-5031-46db-593b8547f74e.png)

2. 該当するGithubのリポジトリを指定する
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593/ba95aefa-5ed7-1912-295f-6c546aa6c529.png)

2. デプロイの経過観察＆完了後にURLチェック
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593/910e550e-71c7-73d9-7c5f-e4115e7e9afb.png)

2. 公開した画面
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593/3bb26866-2b30-966b-8312-ff33982c04de.png)

# Thanks to
回答してくれた皆さんに感謝！質問から回答がほぼ10分かかってないあたりすごすぎ。
https://stackoverflow.com/questions/76903843/how-to-write-dockerfile-for-render-com-deployment/
https://stackoverflow.com/questions/76904436/error-failed-to-solve-failed-to-compute-cache-key
https://stackoverflow.com/questions/76904613/why-i-dont-find-jar-file/
データベーススペシャリストに合格したのでご報告

# 報告
ちょっと前ですが、2022年秋のデータベーススペシャリスト試験に合格しました。
午後Ⅱは合ってるか不安な回答が多かったのですが、思ったより点数が高く良かったです。
受かったままにするのももったいないので、アウトプットとしてこちらに記録を残しておきます。

# スペック
- 神奈川県のSI企業でシステムエンジニアとして働いています。
- 特に目立った経歴もない、普通の会社員です。
- 大学は文系でした。プログラミングのプの字も知らずにIT界に飛び込みました。

# データベーススペシャリストを受けた理由
新卒でWebシステム開発会社に入社してその年に基本情報に合格、3年目に応用情報に合格しました。これらの勉強期間中に過去問を数年分解いたのですが、選択問題のDBだけは毎回満点近く取れていたため、「あ、自分ってDBが得意なのかな」と思い高度試験はDBを受けようと思った次第です。
(と、いいつつ4年目にデータベーススペシャリストを受けて午後Ⅱが58点で落ちました。。無念)

それと、後付けの理由で、今後はBIツールやデータ分析、機械学習などのトレンドに合わせてアプリケーションで扱うデータ量も増えていくことが見込まれると思い、そこにDB設計はかなり密接にかかわってくるのでDB試験を受けるのはとても有意義だと感じたからです。


# 試験内容について
物理設計が全然わからなかったので、論理設計に絞りました。
過去問を10年分くらい解いて臨んだのですが、何か今回から出題傾向が変わった？気がします。今までは問題文を読み解き、ER図に線を引く「お絵描き」やテーブル構造の虫食いを埋める問題が主流で、正直脳死状態で問題文通りに書けば合格点は取れる状態だったのですが、今回からビジネス要件を元に現状の問題点・改善点を導き出し、それを適切に概念データモデルに落とし込むような問題になりかなり難化してました。
上記のような問題が出される想定で対策していたので、試験当日午後Ⅱ問題を開いて「思ったのと違う、、」とかなり焦ったのを覚えています。
しかし、しっかりと基礎は固まっていたので合格でき何よりです。

# 使った参考書・サイト
[データベーススペシャリスト ドットコム](https://www.db-siken.com/)
王道過ぎて説明不要ですね。

[徹底攻略 データベーススペシャリスト教科書 令和4年度](https://www.amazon.co.jp/%E5%85%A8%E6%96%87PDF%E3%83%BB%E5%8D%98%E8%AA%9E%E5%B8%B3%E3%82%A2%E3%83%97%E3%83%AA%E4%BB%98-%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5-%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%82%B9%E3%83%9A%E3%82%B7%E3%83%A3%E3%83%AA%E3%82%B9%E3%83%88%E6%95%99%E7%A7%91%E6%9B%B8-%E4%BB%A4%E5%92%8C4%E5%B9%B4%E5%BA%A6/dp/4295013587/ref=sr_1_4?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=O208DD78K2G4&keywords=DB%E3%82%B9%E3%83%9A%E3%82%B7%E3%83%A3%E3%83%AA%E3%82%B9%E3%83%88+2022&qid=1692145951&s=books&sprefix=db%E3%82%B9%E3%83%9A%E3%82%B7%E3%83%A3%E3%83%AA%E3%82%B9%E3%83%88+202%2Cstripbooks%2C228&sr=1-4)
私はこちらを使いましたが、正直過去問が付いていればどれでもいいと思います。最近の参考書はどれも品質が高く、どれを選ぶかよりも、どれだけ勉強するかだと思います。効率は後からついてくる理論で進めました。

# 勉強時間
業務前朝一時間、業務後1時間程度を半年続けたので、単純計算で2時間 x 30日 x 6ヶ月 = 360時間です。土日はもうちょっとやっていたので、400時間くらいは勉強したかと思います。
上にも記載しましたが、 効率は勉強していくうちについてくる理論で進めていたので、とにかく時間があれば勉強していました。（但し、学習の計画は立てた方が良いと思います）

勉強方法としてはとりあえず参考書をサラッと一周し、後はとにかく過去問を解きました。サラッと一周はホントに理解できてなくも大丈夫で、後で問題文で出てきたときに「あ、この単語見たことある」程度になればいいと思ってます。問題文でわからなかった部分を改めて参考書を読み、インプットするイメージです。

ちなみに、以下の本を参考に、アウトプット:インプットの割合を7:3くらいにして勉強してました。それが一番効率が良いみたいです。
[学びを結果に変えるアウトプット大全](https://www.amazon.co.jp/%E5%AD%A6%E3%81%B3%E3%82%92%E7%B5%90%E6%9E%9C%E3%81%AB%E5%A4%89%E3%81%88%E3%82%8B%E3%82%A2%E3%82%A6%E3%83%88%E3%83%97%E3%83%83%E3%83%88%E5%A4%A7%E5%85%A8-Sanctuary-books-%E6%A8%BA%E6%B2%A2%E7%B4%AB%E8%8B%91/dp/4801400558)

# 仕事にどう活きるか？（ここは今考え中です。他にあれば書き足します）
- めちゃムズイ午後Ⅱを突破できたので、今後業務で複雑な要件があっても対応できる自信が付いた
- 年齢的にもDB設計をレビューすることが増えてきているので、品質の高いレビューをするうえで必要な知識が身についた
- 自社は名刺に合格した高度試験が記載されるので、顧客相手に技術力の証明(といったも、飾り程度だが)ができる


# まとめ
ここまでまとめてみましたが、今思えばよく400時間も勉強できたな、と思います。(大学も自己推薦で入りほぼ勉強しないでここまできたので)
20代後半にも差し掛かり、仕事をしていくうえで自分の強みが何か、証明できるものは何か、等自分には何も手持ちがなかったのが危機感となり、勉強のモチベーションになったかと思います。
といいつつ、最近はさぼり気味で危機感が薄れてきていましたが、ここにまとめたことで再び危機感が舞い降りてきました。今度はオラクルのゴールド等を目指して勉強を進めてみようと思います。
Hyper-V WSL

## Hyper-V

#### Hyper-V有効化
https://learn.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v#enable-the-hyper-v-role-through-settings
#### エクスポートとインポート
https://learn.microsoft.com/ja-jp/windows-server/virtualization/hyper-v/deploy/export-and-import-virtual-machines

#### セキュアブート
https://i-think-it.net/windows10-hyper-v-1/
必要に応じて[設定]-[ハードウェア]-[セキュリティ]-[セキュアブートを有効にする]=OFF
ゲストOSがWindows10ならONで良いが、ゲストOSがUbuntuならOFFにする

#### 起動メッセージをシリアルポート出力
HyperVのUbuntu
https://msmania.wordpress.com/tag/grub/

## WSL2
https://learn.microsoft.com/ja-jp/windows/wsl/install
https://learn.microsoft.com/ja-jp/windows/wsl/setup/environment
powershell管理者
```
wsl --install
```
オプションの WSL および仮想マシン プラットフォームのコンポーネントを有効にする
最新の Linux カーネルをダウンロードしてインストールする
WSL 2 を既定値として設定する
Ubuntu Linux ディストリビューションをダウンロードしてインストールする (再起動が必要になる場合があります)

Windows再起動
[スタート]-[Ubuntu]
```bash
Enter new UNIX username:
```
Ubuntuファイルアクセス
```
\\wsl.localhost\Ubuntu\home\masumi
```
### telnetdを準備
```
sudo apt update
sudo apt -y upgrade
sudo apt -y install telnetd
sudo apt -y install inetutils-inetd
sudo /etc/init.d/inetutils-inetd start
```
## disk2vhd
https://learn.microsoft.com/en-us/sysinternals/downloads/disk2vhd
物理ディスク全てを対象に
![11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436333/10f7f028-7f45-1485-2707-f0560cc65476.jpeg)
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436333/7a1751d4-8301-1430-d7b4-ee59d9d93704.png)
モジュールについて理解したい２

おはようございます！
昨日の記事では、モジュールとは何か、名前空間の問題、そしてそれらを解決するためのモジュール化の重要性について調べてみました。CommonJS, AMD, ES6モジュールなどの規格があり、モジュールの概念をうまく使うことによって、コードの整理と管理が簡単になることが分かりました！

https://qiita.com/yangyooji1946/items/b8dfd322468d10e0cdef

今日はさらに具体的にモジュールがどう利用されてどん便利なのかを調べていきたいと思います！

### 野球的にモジュールを考えてみる
モジュールはコードを小さな部品に分割し、それぞれを独立して開発･テストができる概念です。

これを野球的に考えると、例えばピッチャーやキャッチャーなどの守備位置に喩えることができます。
チームとして捉えると、「守備」という1つの処理ですがその中でも各ポジションの選手がそれぞれ別の処理を行っているので、９通りの処理があります。
各ポジションのモジュールが用意されている状態なので、ピッチャーに指示を与えたいときはピッチャーモジュールの処理を変更し、ライトの守備位置をもっとライン寄りにしたいのであれば、ライトモジュールの処理を変更すれば良いのです。野球はポジションの区別を明確にすることで、モジュール化に成功していると言えるでしょう。つまり、コードが整理されていて管理がしやすい状態です。

対して、モジュールがない状態とは、9人の選手全員に対して指示を与えるようなものです。ポジションの概念がないことは想像しづらいですが、例えばライトの守備位置をライン寄りにするように指示したはずが、うっかり「ライトに」というのを言い忘れると全員がライン寄りを守っているというようなことが起きてしまいます。

また、9人分の指示を出すということはそれだけ指示も長くなります。指示の長さはコードを書く長さと同じなので、コードが膨大な長さになることを意味します。コードが膨大になってしまうと、処理の変更や追加の時にその場所を探すのが大変だったり、そのコードをいじることで他のコードにも影響が出てしまうということが起きてしまいます。この状態がコードが整理されておらず、管理が大変な状態です。

野球の試合中に指示が全くないことが無いように、1度書いたコードもその後の追加や修正の処理がないことはほとんどありません。なので、管理しやすいコードを書くことは非常に重要で、モジュールという概念はそこに不可欠なものなのです。

### 現代の開発とモジュール
モジュール化の考え方は、現代のソフトウェア開発において基盤となっています。特に、ウェブ開発のフレームワークでは、モジュールの概念が深く取り入れられています。

ReactやVueなどの人気のフレームワークでは、コンポーネントというモジュールの一種を用いて、UIの各部分を独立した単位で開発します。これにより、コードの再利用性が高まり、開発の効率が向上します。例えば、ボタンやナビゲーションバーなどの共通のUI部品をコンポーネントとして定義し、異なるページで再利用することが可能です。

また、モジュール化によって、コードのテストも容易になります。各モジュールが単一の責任を持つため、そのモジュールの挙動だけをテストすることができるのです。これにより、バグの特定と修正が迅速に行えるようになります。

モジュールの概念は、開発プロセスの標準化にも貢献しています。NPMやYarnなどのパッケージ管理システムを通じて、外部のモジュールをプロジェクトに組み込むことが一般的になりました。これにより、開発者は既存のモジュールを活用して、開発のスピードを上げることができます。

最後に、モジュール化はコラボレーションを促進します。チームメンバーが異なるモジュールに取り組むことで、並行して開発を進めることが可能となります。

要するに、モジュール化は現代の開発において中心的な役割を果たしており、その影響は広範にわたっています。野球のポジションのように、明確な役割分担と協調作業が求められる現代の開発において、モジュールの概念は欠かせないものとなっています。

### まとめ
今回の記事では、モジュールの概念とその実践、そして現代の開発におけるモジュールの影響について深く探りました。以下、要点を3つにまとめます。

**モジュールの重要性**: モジュール化はコードの整理と管理を容易にし、再利用性と保守性を向上させます。野球のポジションに例えると、各ポジションが独立したモジュールであり、役割が明確に分かれているため、指示が効率的に行えるのと同じです。

**現代のフレームワークとモジュール**: フレームワークは開発の標準化と効率化を促進し、多くはモジュール化の概念を採用しています。モジュール化はフレームワークの設計に影響を与え、開発者が効率的にコードを書けるようにしています。

**モジュールの実践**: モジュールの使用例とベストプラクティスを理解することで、より効率的な開発が可能になります。特に、役割を明確に分けることで、コードの再利用と保守が容易になります。

次回の記事では、モジュールと密接に関連する「パッケージ管理」についての記事を書く予定です！
パッケージ管理は、今回の記事の中でも少しだけ出てきましたが、モジュールのインストール、更新、依存関係の解決などを効率的に行うための重要な概念です。どうぞお楽しみに！

それでは今日も学習をスタートします！
prepareForReuse()内に書くべきこと

## はじめに

UIKitを利用する以上、 `UITableViewCell` はまだまだ現役と思います。
カスタムセルを作成した際に、初期化処理はとりあえず `prepareForReuse`内に書いておけば良いと思っていたのですが、改めてドキュメントを読むとそういうわけでもなさそうなので書き留めておこうと思った次第です。

## `prepareForReuse()` メソッドのドキュメントを読む

https://developer.apple.com/documentation/uikit/uitableviewcell/1623223-prepareforreuse

DeepLでそのまま日本語翻訳すると、

> UITableViewCellオブジェクトに再利用識別子がある場合、テーブル・ビューはUITableViewメソッドdequeueReusableCell(withIdentifier:)からオブジェクトを返す直前にこのメソッドを呼び出します。潜在的なパフォーマンスの問題を避けるために、セルの属性は、アルファ、編集、選択状態など、コンテンツに関係のないものだけをリセットする必要があります。tableView(_:cellForRowAt:)のテーブルビューのデリゲートは、セルを再利用するとき、常にすべてのコンテンツをリセットする必要があります。

これによると　`prepareForReuse()` 内で初期化すべきものはセル自体の属性に留めることが推奨されています。セル上に配置したコンポーネントなどの初期化は避けた方が良いということです。

## セルの初期化の実装例

色々な実装パターンがありそうですが、個人的にはセル自体の属性の初期化は `prepareForReuse()` 内で、それ以外は [tableView(_:cellForRowAt:)](https://developer.apple.com/documentation/uikit/uitableviewdatasource/1614861-tableview)内で書くことが多いです。
より適切な書き方とかあればぜひ教えてください🙇

```Swift
final class CustomCell: UITableViewCell {
  private let titleLabel = UILabel()
  private let subtitleLabel = UILabel()

  override func prepareForReuse() {
    super.prepareForReuse()
    backgroundColor = .systemBackground
    selectionStyle = .none
    accessoryType = .none
  }

  func initContents() {
    titleLabel.text = nil
    subtitleLabel.text = nil
  }
}
```
上記のように、２つの　`UILabel`コンポーネントを初期化する場合は、`initContents()` のようなinternalなメソッドを用意しておくと、`tableView(_:cellForRowAt:)` で呼び出せます。

```Swift
final class TableViewController: UITableViewController {

    // 省略

  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "customCell", for: indexPath) as! CustomCell

    // セルのコンテンツの初期化
    cell.initContents()

    return cell
}
```

## 終わりに

単にドキュメントに従おうという話ですが、`prepareForReuse()` 内に初期化処理をまとめて書かれていることをよく見るので、これを機に少し書き方を変えても良いかもしれません。 (どれくらいパフォーマンスに影響するかはわかっておらず)

## 参考文献

この記事は、以下の情報を参考に書きました。

https://developer.apple.com/documentation/uikit/uitableviewcell/1623223-prepareforreuse

https://developer.apple.com/documentation/uikit/uitableviewdatasource/1614861-tableview
djangoでstaticソース（jsやcss）が読めなくなった対応

## Djangoでstatic　ソースが見れなくなった
ローカル（開発環境）ではDEBUG = True & runserver で実行していたが、本番相当の環境を作成しようと、DEBUG = Falseにして、apacheサーバ（コンテナ）を構築して実行したら、cssが404（because its MIME type ('text/html') ~）となり、読めなくなった

## 前提
・　Docker を使用して、アプリ（python Django）のコンテナとweb（apache）のコンテナは別
　→ Djangoでstatic　が見れなくなった対応はネットで結構あったが、djangoとapacheは同じサーバ（コンテナ）内であることが多く、解消されなかった

## 対応
### よくある対応

```:settings.py
DEBUG = False # これがFalseなのが大前提。Trueだとstaticもdjangoが提供する
STATIC_URL = 'static/'
STATIC_ROOT = '/var/www/static/'
```

```:httpd.conf
<VirtualHost *:80>
    Alias /static/ /var/www/static/
    <Directory /var/www/static/>
        Require all granted
    </Directory>
</VirtualHost>
```

python3 manage.py collectstatic --noinput
これを実行することで、staticディレクトリにあるファイルが/var/www/static/に集められて、apacheは「/static/」のURLを「/var/www/static/」にして、static　ファイルにアクセスできるというもの

## 問題点１
python3 manage.py collectstatic を実行しても　djangoサーバ（コンテナ）の/var/www/static/にファイルが集まるだけなので、apacheサーバは見れない

docker Compose で/var/www/static/　を　djangoとapacheで共有する

```:docker-compose.yml
version: '3'

services:
  python-django:
    volumes:
      - static-data:/var/www/static/
    command: sh -c "python3 manage.py collectstatic --noinput & python3 manage.py process_tasks & uwsgi --http 0.0.0:8000 --module プロジェクト名.wsgi --master"

  apatch:
    volumes:
      - static-data:/var/www/static/

volumes:
    static-data:
```

## 問題点２
apacheにリクエストきた内容をdjangoに渡す必要があるため、Proxyの設定を追加
※ static以外！！

```:httpd.conf
<VirtualHost *:80>
    ProxyPreserveHost On
    ProxyPass /static/ !
    ProxyPass / http://djangoのコンテナ名:8000/
    ProxyPassReverse / http://djangoのコンテナ名:8000/
    Alias /static/ /var/www/static/
    <Directory /var/www/static/>
        Require all granted
    </Directory>
</VirtualHost>
```

実はここまでは普通に調べて実装できていた。ログを調べるとstatic(css)もapacheサーバにはリクエストがきて、djangoに渡していることがわかった。

staticはdjangoに渡さず、Apache側で処理をすべきなのに・・・
なので「ProxyPass /static/ !」を追加
「static」はdjangoに渡す対象外とする。

これで　staticが読めるようになった。

全体の構成やソースは時間があるときに記事にしようかな
みんなであいうえお作文！


「[みんなであいうえお作文！](https://min-saku.com/)」をリリースしました。
友人と２人での開発で、実質的な開発期間としては２か月ほどでしょうか。
（集中してやれば１～２週間ほどでいけた気はしますが、２人とも本業やプライベートが忙しく、時間の確保に苦労しました）
フロントとバックをそれぞれ担当する形で実装を進めましたが、うまく分業できてスムーズに進めることができたと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3236424/371d6e57-d5df-808b-cdb7-52e3f7d8a367.png)

# 何ができる？
- あいうえお作文をオンラインのみんなで作れる
- お題の投稿
- 他の人が投稿したお題に参加して作文を書く
- 作文を「いいね」できる
- 作文をブックマークできる
- いいね、ブックマーク、投稿、参加した作文、を絞って表示できる
- 作文をTwitterに共有できる

# 遊び方
1\.右下プラスボタンからお題を投稿！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3236424/e6ad5229-076d-d786-eb50-90de1bfe87d9.png)
2\.一文字目の作文を書いて、他の人が続きを書いてくれるのを待とう！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3236424/6dac0b17-7cdf-24c1-627e-c6c82ba75530.png)

# 技術スタック
Reactで作成したSPAをFirebase Hostingで公開しています。
作文の登録や更新などは、Cloud Functionsの関数をAPI経由でキックすることで処理しています。
また、作文の更新状況をリアルタイムで反映するためにFirestireのSDKを利用しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3236424/e7a37853-93bb-7d57-fe72-4a49e99dbe03.png)

#### フロントエンド
- React
    - Recoil(状態管理)
    - Emotion(Style)
- Firebase Hosting
- Cloud Firestore SDK
- Cloud DNS (GCP)
- Cloud Domains (GCP)

#### バックエンド
- API Gateway (GCP)
- Cloud Functions (GCP)
- Firestore (Firebase)

# サイト内広告について（AdinPlay）

個人開発する動機といえば、みなさんほぼ間違いなくお金儲けですよね。
今回のような~~しょぼい~~素朴なWEBゲームの場合、流石に課金は見込めないので広告に頼ることにしました。
広告といえば Google AdSense ですが、あちらは審査が厳しいらしくゲームサイトではほぼ確実に審査が突破出来ないようです。
どうしようかと悩んでいたところ、アドセンス公認パートナーの [AdinPlay](https://adinplay.com/) なるものを知りました。これを利用すると、マージンを取られるかわりに、めちゃくちゃ緩い審査でアドセンスを利用することが出来るようです。
ただし、英語でメールのやり取りが必要だったりと導入までが中々面倒だったので、手順についてメモを残しておきます。
1. 公式ページの Sign up ボタンから申請する。
    - My monthly pageviews → 適当に 100 とかにしてみた
    - Message → 何を書けば良いのかよく分からず、空欄にしてみたが特に問題はなかった
1. 数日後、グーグルアドマネージャーのアカウントを作成して AdinPlay からのリクエストを承認するよう依頼のメールが送られて来る。
1. 上記処理完了後、完了した旨をメールで返信する。
1. 添付ファイル (ads_XXX.txt) を WEB サイトに配置するよう返信が来る。同時に、必要な広告種別とサイズを聞かれる。
1. コンテキストルート直下にリネーム (ads.txt) して配置する。
1. 完了した旨と必要な広告種別、サイズを返信する。
1. 広告の ID や導入手順が送られてくる。
1. 手順に従い広告を配置し、完了した旨を返信する。
    - ローカルで動作確認した際は広告が表示されなかった
    - 申請時に指定したドメインじゃないと広告が表示されないのかもしれない
1. AdinPlay からアカウント作成完了のメールが届くので、メールのボタンをクリックしてパスワードを変更する
    - 自分の場合は迷惑メール扱いになっていた
    - パスワードを変更すると、サインインページからサインイン出来る
    - username は登録したメールアドレス

# 振り返り
- Cloud Functionsを使うメリットがあまりないかもしれない
    - 更新処理もフロントから直でFirestoreを編集しちゃってよかったかも
    - フロントとバックできれいに領域が分かれるので作業分担はしやすかった
- Twitter(X)連携がネック
    - 自動投稿とかやろうとするとAPIの制限を気にしないといけないのでつらみがある
    - 画像投稿は一旦アップロードを挟まないといけないし、どうしたものか……
- 比較的短期間でリリースまでできたのはよかった
    - Firebaseの楽さに助けられた
    - GitLabでリリースのPipelineを回してFirebase Hostingにデプロイする設定をしていたので、修正反映も楽にできた

# これからの課題
あいうえお作文をみんなで遊べるという基本的な機能は満たしているものの、あったら便利な機能も追加していければと考えています。
具体的には下記のような機能です。
- ユーザー登録機能
    - Lineとの連携で作文の完成が通知される
    - ユーザー毎のいいねランキングなんかも表示できたらよい
- 新しいお題が投稿されたら、あいうえお作文のTwitter(X)アカウントに自動投稿される
    - これはTwitter(X)のAPI制限上、お金をかけずに実装するのが難しいかもしれませんが……
- Twitter(X)に共有した作文のプレビューをツイート内に表示する
    - 作文ページのプレビュー、もしくは作文の画像が表示できたらSNSで共有しやすいなと思っています
[sh] 任意のディレクトリ以下にあるファイルをリストアップする

任意のディレクトリ以下にあるファイルをリストアップする。
「任意のディレクトリ」に移動して、以下を実行する。

```sh
python -c "import glob; print('\n'.join(glob.glob('*/**')))"
```
データ分析で使えそうな公開データ一覧

データビジュアライゼーションやサンプルデータ、参考データとして使えそうなdataのリンク先です。
使用上の規定は各サイトに記載がありますので、利用前に事前にご確認のうえ、ルールを守った利用をお願いします。

## 政府他

### e-stat 政府統計の総合窓口
https://www.e-stat.go.jp/

### RESAS地域経済分析システム
https://resas.go.jp/#/13/13101

### 日本銀行 時系列統計データ検索サービス
https://www.stat-search.boj.or.jp/index.html

### 統計Dashboard
https://dashboard.e-stat.go.jp/

### e-Govデータポータル
https://data.e-gov.go.jp/info/ja

### 東京とオープンデータカタログサイト
https://portal.data.metro.tokyo.lg.jp/

### 総務省統計局ホームページ/消費者物価指数
https://www.stat.go.jp/data/cpi/index.html

### 厚生労働省
https://www.mhlw.go.jp/stf/covid-19/open-data.html

### 国土交通省 気象庁
https://www.data.jma.go.jp/gmd/risk/obsdl/

### BODIK ODCSオープンデータカタログサイト
https://odcs.bodik.jp/

### 日本の観光統計データ
https://statistics.jnto.go.jp/

### 国立国会図書館
https://www.ndl.go.jp/jp/dlib/standards/opendataset/index.html

### 公共交通オープンデータセンター
https://ckan.odpt.org/dataset

## 自治体

### 草津市
https://data.bodik.jp/organization/252069

### 横浜市
https://data.city.yokohama.lg.jp/dataset

### 港区
https://opendata.city.minato.tokyo.jp/dataset

## その他
## ROIS-DS人文学オープンデータ共同利用センター
http://codh.rois.ac.jp/

## AI・機械学習で使えそう
https://ainow.ai/2020/03/02/183280/
paiza.ioでelixir その246

# 概要
paiza.ioでelixirやってみた。
マップのリストにプッシュしたい。

# サンプルコード

```

defmodule M do
    def push(a, o, i) do
        l = Map.get(a, o)
        l = l ++  [i]
        Map.replace(a, o, l)
    end
end

ore = %{"age"=> 44, "name"=> "Steve Irwin", "users"=> [%{"id"=> 1, "name"=> "koi"}, %{"id"=> 2, "name"=> "aoi"}]}
M.push(ore, "users", %{"id"=> 3, "name" => "oto"})
|> IO.inspect



```

# 実行結果

```
%{
  "age" => 44,
  "name" => "Steve Irwin",
  "users" => [
    %{"id" => 1, "name" => "koi"},
    %{"id" => 2, "name" => "aoi"},
    %{"id" => 3, "name" => "oto"}
  ]
}
```
# 成果物

https://paiza.io/projects/Yu9BPKbBahOHv_hg9a0Nyw

以上。
スワップ領域の追加

スワップ領域のサイズが足りなくなった場合等にサイズを追加する方法です。

### swap用領域の作成 

1M * 2048 = 2GB 

```sh
  $ cd /tmp
  $ dd if=/dev/zero of=swapfile.img bs=1M count=2048
```

### swap用ファイルに変換

```sh
  $ mkswap swapfile.img
  $ chmod 600 swapfile.img
```

### swap領域の追加

```sh
  $ swapon swapfile.img
```

swap領域追加の確認

```sh
  $ free -m
```

```
              total        used        free      shared  buff/cache   available
Mem:           3741         239         186          16        3315        3216
Swap:          2047           0        2047
```

### 追加したswap領域の無効化

```sh
  $ swapoff swapfile.img
```
【Ruby】ハッシュの値でreduceする

HashのValueをreduceしたい際に迷ったためメモ。

# 結論

```ruby
hash = {
  hoge1: 10,
  hoge2: 20,
  hoge3: 30
}

# 第二引数を (key, value) で渡す
hash.reduce(0) do |acc, (_, number)|
  acc + number
end
# => 60
```

# 第二引数に一つだけ渡してみた場合
key → value → key → ... と交互に繰り返し処理が行われる
```ruby
hash.reduce([]) do |acc, item|
  acc + item
end
# => [:hoge1, 10, :hoge2, 20, :hoge3, 30] keyとvalueが交互に配列に格納された
```

https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/inject.html
Batocera linuxをラズパイ4+HyperPixel4 squareで動かすメモ

# はじめに

　HyperPixel4 squareという正方形のラズパイ向け液晶ディスプレイを友人から譲り受け、縦横どちらでも行けそうなので、久々にレトロゲームプレイヤーを作ってみることにしました。昔はretroPie一択だったように思うのですが、Batocera linuxというのがあることを知り、使ってみようとしたところ大ハマりしたので、メモを兼ねて記事にしました。（解決するとどってことないのですが・・・）なぜはまったかというと、公式でraspberry pi osなどに組み込まれているdtoverlay（vc4-kms-dpi-hyperpixel4sq）がバグっているらしくて、表示が出ないことによります。下記の記事によると、他の方でも表示できなかったようです。

https://akkiesoft.hatenablog.jp/entry/20220302/1646231514

ちなみに今回はBatocera linux上でのHyperPixel4 squareの表示が出るまでの記事です。ゲームのプレイ方法は、大量に他に記事があるので、そちらを参照してください。

# 準備するもの

- ラズパイ４
- HyperPixel4 Square
- micro SDカード　お試しだけなら16GBでも可能ですが入れられるゲーム数が少なくなる
- ゲームコントローラ or キーボード
- スピーカー（表示お試しだけならいりません）

# 手順

## 動作するドライバの作成
　Batocera linuxはユーザに中身をいじらせないような思想で作られているらしく、基礎的なパッケージが欠損しており、パッケージ管理のpacmanもarch linuxのレポジトリを追加するなどのことがうまくできませんでした（実力のある方はできるのでしょうが）。なので、まずはraspberry pi os 64bit上でHyperPixel4 squareのドライバを作成し、ついでにテストをいたします。
　raspberry pi os imagerでRaspberry Pi OS(64bit)を選択してインストールしてください。liteでもいいのですが、GUI立ち上がるテストをしたいので、desktop版をインストールしています。インストール後、ラズパイ４にSDカードを挿し起動して初期設定をします。その後、以下のコマンドでgitからドライバインストーラをダウンロードして実行、ドライバのインストールしてください。

```
git clone https://github.com/pimoroni/hyperpixel4 -b square-pi4
cd hyperpixel4
sudo ./install.sh
```
ドライバファイルは以下のように確認できます。

```
ls /boot/overlay/hyperpixel4.dtbo
```

次にテストのために、/boot/config.txtを編集します。
まず、今のドライバをコメントアウトします。
before
```
dtoverlay=vc4-kms-v3d-pi4
```
after
```
#dtoverlay=vc4-kms-v3d-pi4
```

次にファイルの最後に以下の行を追加します。
```
dtoverlay=vc4-fkms-v3d-pi4
dtoverlay=hyperpixel4
enable_dpi_lcd=1
dpi_group=2
dpi_mode=87
dpi_output_format=0x7f226
dpi_timings=720 0 15 15 15 720 0 10 10 10 0 0 0 60 0 35113500 6
```

これで再起動すると、HyperPixel4 squareのスクリーンにraspberry pi OSのGUIが表示されます。

![IMG20230816070715.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575990/f269c2ca-8ed6-9814-9ad9-b3903434db6e.jpeg)

ドライバはPCなどへscpするか、一度シャットダウンしてmicro SDカードをPCに挿し、bootドライブ内の \overlay\hyperpixel4.dtboをPCに保存してください。

## Batocera linuxへのインストール

　ラズパイに慣れている方であれば、あとは、Batocera linuxにも同じ環境を作ればいいといえばわかると思います。以下繰り返し臭が強くなりますが、手順を示します。
　まずは、Batocera linuxのラズパイ版を入手し、micro SDカードにインストールします。ダウンロードは以下から行います。

https://batocera.org/download

ダウンロードしたら、balenaEtcherなどでmicro SDカードにインストールしてください。インストールが終了したら、出来上がったBATOCERAドライブ内の\ovelay\ディレクトリに先ほどPCに保存したhyperpixel4.dtboをコピーしてください。
次にBATOCERRAドライブ内のconfig.txtをメモ帳などで編集します。
以下のラインをコメントアウトします。
before
```
dtoverlay=vc4-kms-v3d-pi4
```
after
```
#dtoverlay=vc4-kms-v3d-pi4
```

次にファイル最後に以下を追加します。
```
dtoverlay=vc4-fkms-v3d-pi4
dtoverlay=hyperpixel4
enable_dpi_lcd=1
dpi_group=2
dpi_mode=87
dpi_output_format=0x7f226
dpi_timings=720 0 15 15 15 720 0 10 10 10 0 0 0 60 0 35113500 6
```

これを保存し、ラズパイ４に挿して起動し、Batcera linuxのロゴと本体GUIが立ち上がれば成功です。お疲れさまでした。

![IMG20230816081237.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575990/2d720888-1857-3d3c-2b0a-b9ed58701d58.jpeg)

# 最後に
　久々にレトロゲームを小さな画面でやってみるとたまには楽しいものです。ラズパイの方もなかなかいじる機会が減っているので、何とか時間確保してやっていきたいと思います。今回かなり久しぶりの投稿となりましたが、時間ができ次第、いろいろと実験やって、知見が得られたら投稿して以降と思います。

# おまけ
　上記方法は方法を探る過程で、一度Batocera linuxをあきらめて、retroPieでの動作確認をしていた時に、retorPieでうまくいった方法をBatocera linuxに適用したらうまくいったものです。趣味とはいえ、やり方に詰まったときは、思い切ってほかのことをやっていると、解決策が見つかるという体験ができたのでした。
Rubyでgemを使わずにSlackにメッセージを送信する

# 目的
gemを使わないでSlackにメッセージを送ります。

# コード
```ruby:main.rb
require 'net/http'
require 'uri'

uri = URI.parse('https://slack.com/api/chat.postMessage')
params = {
  channel: '#random',
  icon_emoji: ':robot_face:',
  username: 'bot',
  token: ENV['SLACK_API_TOKEN'],
  text: "予定表～①💖ﾊﾝｶｸだ",
}
res = Net::HTTP.post_form(uri, params)
pp res
pp res.body
```
PyTorchのインストールから始めてLINE社が公開した36億パラメータのjapanese-large-lmを動かしてみた

## 環境
* Windows11
* Intel Corei9-11900K
* メモリ32GB（実行には15GB程度の余剰が必要）
* NVIDIA GeForce RTX 3070
* Anaconda3がインストール済み

## CUDAのインストール
* [こちら](https://self-development.info/tensorflow-1%e7%b3%bbgpu%e7%89%88%e3%81%ae%e3%81%9f%e3%82%81%e3%81%abcuda-10-0%e3%82%92%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab/)を参考に、CUDA11.8をインストールした

## PyTorchのインストール
* anacondaで「pytorch」という環境を作成した（pythonのバージョンは3.11.4）。
* [こちら](https://self-development.info/pytorch%E3%81%AE%E7%B0%A1%E5%8D%98%E9%81%8E%E3%81%8E%E3%82%8B%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%80%90python%E3%81%A7%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%80%91/)を参考に、以下の手順でPyTorchをインストールした。
```bash
$ conda activate pytorch
$ pip install --upgrade pip setuptools
$ pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
```

## 必要なPythonライブラリのインストール
* 以下の手順で必要なPythonライブラリをインストールした。下の２つはなくても動いたが、Warningが発生したのでインストールした。
```bash
$ pip install transformers
$ pip install sentencepiece
$ pip install xformers
```

## japanese-large-lmによるGeneration
* [公式ブログ](https://engineering.linecorp.com/ja/blog/3.6-billion-parameter-japanese-language-model)を参考に、下記のPythonスクリプトを実行した。結果として、5つの文章が生成された。
```python
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline, set_seed

print("Preparing model...")
model = AutoModelForCausalLM.from_pretrained("line-corporation/japanese-large-lm-3.6b", torch_dtype=torch.float16)

print("Preparing tokenizer...")
tokenizer = AutoTokenizer.from_pretrained("line-corporation/japanese-large-lm-3.6b", use_fast=False)

print("Preparing generator...")
generator = pipeline("text-generation", model=model, tokenizer=tokenizer, device=0)
set_seed(101)

print("Generating text...") 
text = generator(
    "おはようございます、今日の天気は",
    max_length=30,
    do_sample=True,
    pad_token_id=tokenizer.pad_token_id,
    num_return_sequences=5,
)

for t in text:
    print(t)
```
将棋評価値バーを作る（第１回）

将棋評価値バーを使ってみたい方はコチラをご覧ください。

https://qiita.com/TETSURO1999/items/baf82b5af7e8c97c8903

# 将棋評価値バーの開発目的

評価値バーは将棋 GUI と将棋エンジンの間に介在し，両者の間でやり取りされる USI ロトコルを盗み読んで評価値を勝率に換算して分かり易く表示するプログラムです。正しくは勝率バーと呼ぶべきかもしれません。近年では NHK 杯やアベマ TV などでも独自プログラムによる勝率バー表示が行われるようになりました。水匠開発者でもあるたややん氏がソースコード付きで公開しているものもあります。

たややん氏の公開した評価値バー (YouTube)

https://www.youtube.com/watch?app=desktop&v=32WBQUs4u-U

たややん氏のものは Pythonで作られており，フォントや色など自分の好みに合わせてカスタマイズすることも可能です。ただ Python プログラムの EXE 化が必要なので，Python を使ったことがない人がゼロから始めようとすると少し苦労するかもしれません。（自分にとって）最大の問題は AVX2 未対応の古い CPU では動かないということです。たややん氏の評価値バーは内部で cshogi というライブラリを使用しているのですが，この cshogi が標準では AVX2 未対応 の古い CPU には対応していないためです。当時，自分のメイン機が Ivy Bridge，サブ機が Sandy Bridge とともに AVX2 未対応世代だったこともあり，AVX2 未対応は致命的でした。なお cshogi も github で公開されているので AVX2 指定を外してビルドするだけで良いはずですが，これが何故かうまくいかない。一方，たややん氏の Python スクリプトを眺めてみると 200 行足らずの小さなプログラムなので，この程度ならフルスクラッチで書き直しても何とかなるんじゃね？と思ったのが苦労の始まりでした。

開発目的を整理すると以下のようになります。
1. AVX2 未対応の古い CPU でも動くようにすること。
2. Visual Studio などの開発環境を新たにインストールする必要なく，Windows 内蔵の C# コンパイラだけでビルドできること。
3. 使用する将棋エンジンをコンパイル無しで切り替えられるようにすること。たややん氏の評価値バーはソースコード内に使用する将棋エンジン「水匠5」の実行パスが直に書き込まれており，これを変更するためにはソースコードを変更した後にコンパイル，いわゆる EXE 化が必要なため。
4. 対局するプレイヤー名を表示できるようにしたい。これは同時に複数対局の評価値バーを表示すると，どの対局の評価値なのか区別つかなくなるためである。
5. 評価値バーを常に最前面で表示できるようにしたい。これは自分のPC画面がちっさいからである。

# 一般的な将棋ソフトの構造と評価値バーの仕組み
一般的な将棋ソフトの構造は以下のようになっています。近年の将棋ソフトでは，人間が駒を動かしたりして操作する将棋GUIと指し手を考えてくれる将棋エンジンはプログラム自体が分離されています。両者の間でやり取りする情報はUSIプロトコルとして規格化され，標準入出力を用いて情報のやり取りを行うようにしています。

[USI プロトコルの定義（将棋所）](http://shogidokoro.starfree.jp/usi.html)

```mermaid
---
title: 将棋 GUI と将棋エンジンの関係
---
sequenceDiagram
loop
将棋 GUI ->> 将棋エンジン:局面情報
将棋エンジン ->> 将棋 GUI:評価値，最善手
end
```

評価値バーはこの構造の間に介在します。まず将棋 GUI から評価値バーが呼び出されます。評価値バーは内部で将棋エンジンを起動します。将棋 GUI から局面情報が送られてくるので，そのまま将棋エンジンに引き渡します。一方，将棋エンジンから評価値や最善手などの情報が送られてくるので，これらもそのまま将棋 GUI に戻してやります。評価値バーは基本的な処理を全て将棋エンジンに丸投げしているだけで，相互にやり取りされる情報の中から必要な情報を盗み取って勝率バー表示を行います。

```mermaid
---
title: 評価値バーが介在した場合
---
sequenceDiagram
loop
将棋 GUI ->> 評価値バー:局面情報
評価値バー ->> 将棋エンジン:局面情報
将棋エンジン ->> 評価値バー:評価値，最善手
評価値バー ->> 将棋 GUI:評価値，最善手
end
```

長くなり過ぎたので次回に続きます。

https://qiita.com/TETSURO1999/items/5843c4ace822def25795
NetBSDのgpio

NetBSDでは/etc/gpio.confに設定を書いて/etc/rc.confでgpio=YESにすることによりledなどがgpioctlで制御できるようになります。

gpioctlはrootと_gpioのグループに入っているユーザが使えます。

セキュリティのため/etc/gpio.confでsetしてないピンの制御はできません。

FreeBSDでは一律制御できるのですが、NetBSDのこの仕様はいいです。

というのもc2kのモジュールではgpioの制御でcpuをリセットしたりethernet switchをリセットする事ができるためです。これらの操作は致命的で、操作できなくなく出来るのは非常に有効です。

[去年試した時](https://qiita.com/yamori813/items/2b9c0a367b2d6c212aaf)はシングルユーザだったので、設定は必要ありませんでした。

c1kのgpio.conf

```
gpio0 2 set out
gpio0 7 set out
gpio0 7 off
gpio0 20 set out
gpio0 20 off
gpio0 21 set out
gpio0 21 off
gpio0 22 set out
gpio0 22 off
gpio0 23 set out
gpio0 23 off
```

c2kのgpio.conf

```
# Internet LED
gpio0 4 set out
gpio0 4 on
gpio0 6 set out
gpio0 6 on
# Warning (RED)
gpio0 16 set out
gpio0 16 off
```
ChatGPTを活用した理解力を高める学習方法

## はじめに

この記事では、ChatGPTを活用した新しい学習方法をご紹介いたします。

自然とやってる方もいるとは思いますが、初めて見る方はこの機会に是非やってみてください！


## 対象

この記事では以下の人を対象にしています。

- GPT4が使える人
- ついつい「分かった気になってしまう」人
- 新しい勉強方法知りたい人

## どんな方法？

今回紹介する方法は「大本」をベースに、ChatGPTを使ってクイズを作成してもらいます。

これを解くことで、本当に記事を理解してるかを確認することが可能になります。


## プラグインを登録

まずは準備のためにプラグインを登録します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551316/2c1f3331-df4f-d92e-ac99-ba6e58d119d1.png)

Pluginsを選択してください。
また、そのままPlugin storeに入ってください。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551316/a30fadf3-c7b6-16f8-e357-1a68f4e07b71.png)

検索にて「Web Pilot」と入れて、出てきたプラグインをインストールしてください。

これで準備は完了です。


## 利用するプロンプト

次に利用するプロンプトを確認しましょう。

- 質問フェーズ
- 採点フェーズ

この二つのフェーズに分けて利用していきます。

### 質問フェーズ

```md
# タスク
- 対象のURLを元に理解度クイズを作成してください。

# ルール
- 理解度クイズのみ記載してください。
- 問題は3つ作成してください。
- 正解は書かないでください。
- 日本語で書いてください。

# 対象
[URL]
```


### 採点フェーズ

```md
# タスク
- 対象のURLを元に、回答を採点してください。

# ルール
- 問題は前回の会話を参照してください。
- 判断基準は対象のURLをベースにしてください。

# 対象
[URL]


# 回答
[回答を書く]
```




## 実践してみる

では、実際にやってみましょう。

今回は、Rustと呼ばれるプログラミング言語を学習すると仮定します。
以下のURLを勉強するとします。

https://doc.rust-lang.org/reference/items/extern-crates.html

一つ目のポイントとしては、対象言語は何でもいいです。
また、実際に学習する際はDeepLなどで翻訳すれば十分学習可能かと思われます。


### 問題

実際に問題を作成してもらいましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551316/ad1d86c8-a552-cbd3-b2b6-f1623c26ef3c.png)

良い感じに問題を作成してくれました。


### 回答

次に、回答してみます。
正解、分からない、不正解のパターンを見ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551316/c25edb02-a378-4aba-3071-bd53403c4363.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551316/27900886-1225-ffec-3aba-d2d836fd597b.png)

良い感じに採点してくれました！


## ポイント

この学習のポイントとしては、リソースを宣言することです。

単純にChatGPTを活用した学習ですと、憶測ベースなどで回答されてしまいます。

ではなく、あくまでも「このURLを正解」という指定をすることで、情報の正確性を上げています。


## まとめ

今回はChatGPTを利用した新しい学習方法を見ました。

ついつい「読んで終了」ということもあるかと思いますが、この学習方法を利用すればちゃんと理解度を確かめられます。

是非、利用してみてください！


## お知らせ

以下のような記事を作成しています。

もしよろしければ、一緒に見ていってください！

https://qiita.com/Gamari0009/items/37a5b7b69ce9dfdb670e

https://qiita.com/Gamari0009/items/a7de53514504ea99db7d

https://note.com/gamari_/n/n7f452cb488ac
「RustとWebAssemblyによるゲーム開発」の写経をするためのDev Containerを作った

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

やったことは表題の通りです。

頭の数章を読み進めていくと、RustとNode.jsのバージョンを最新にするのは問題があることがわかりました。どのバージョンが最適かは試行錯誤が必要そうでしたが、手元にRustやNodeのバージョンを管理する仕組みを持っていませんでした。そこで、Dockerを使用することを考えました。

同書では、コードはRustの1.57.0とNode.jsの16.13.0でテストされています。Rustは1.57.0のままでは依存するモジュールのビルドに失敗したため、バージョンを最新に更新しました。Node.jsはwebpack 4との互換性を考慮して、16系を使用する、とざっくりとですが決めました。

```dockerfile:.devcontainer/Dockerfile
FROM docker.io/node:16-alpine

ARG DEV_USER=node
ENV RUSTUP_HOME=/usr/local/rustup \
    CARGO_HOME=/usr/local/cargo \
    PATH=/usr/local/cargo/bin:$PATH \
    RUST_VERSION=1.71.0

RUN set -eux; \
    apkArch="$(apk --print-arch)"; \
    case "$apkArch" in \
        x86_64) rustArch='x86_64-unknown-linux-musl'; rustupSha256='7aa9e2a380a9958fc1fc426a3323209b2c86181c6816640979580f62ff7d48d4' ;; \
        aarch64) rustArch='aarch64-unknown-linux-musl'; rustupSha256='b1962dfc18e1fd47d01341e6897cace67cddfabf547ef394e8883939bd6e002e' ;; \
        *) echo >&2 "unsupported architecture: $apkArch"; exit 1 ;; \
    esac; \
    url="https://static.rust-lang.org/rustup/archive/1.26.0/${rustArch}/rustup-init"; \
    wget "$url"; \
    echo "${rustupSha256} *rustup-init" | sha256sum -c -; \
    chmod +x rustup-init; \
    ./rustup-init -y --no-modify-path --profile minimal --default-toolchain $RUST_VERSION --default-host ${rustArch}; \
    rm rustup-init; \
    chmod -R a+w $RUSTUP_HOME $CARGO_HOME
RUN set -eux; \
    apk add --no-cache bash git gcc musl-dev; \
    npm install -g wasm-pack; \
    rustup component add rustfmt

USER $DEV_USER
```

RUNディレクティブが2つに分かれていますが、これは1つにまとめられるはずです。
1つ目のRUNは[Rust公式](https://hub.docker.com/_/rust)のDockerfileから引き写した記述で、これ以上の変更は不要でした。2つ目のRUNは、読み進めていく中で、プロジェクトが依存するコマンドやモジュールを追加、削除しながら試行錯誤していた部分で、1つ目とは異なるレイヤーとして扱っていました。

```json:.devcontainer/devcontainer.json
{
  "name": "game-dev-with-rust-and-wasm",
  "build": {
    "dockerfile": "Dockerfile",
    "args": {
      "DEV_USER": "node"
    }
  },
  "customizations": {
    "vscode": {
      "settings": {
        "terminal.integrated.defaultProfile.linux": "bash"
      },
      "extensions": [
        "rust-lang.rust-analyzer"
      ]
    }
  },
  "remoteUser": "node",
  "updateRemoteUserUID": true
}
```
Nuxt3における hydrationとは？

Nuxt 3 における "hydration" は、サーバーサイドレンダリング（SSR）で生成された HTML マークアップに対して、クライアントサイドでインタラクティブな動作や状態を復元するプロセスを指します。これは、初めてページを読み込んだときにサーバーサイドでレンダリングされたコンテンツを、クライアントサイドで「活性化」することを意味します。このプロセスによって、ウェブアプリケーションのユーザーエクスペリエンスが向上し、動的なコンポーネントの振る舞いがクライアントサイドで実行されます。

具体的には、hydration のプロセスは次のように進行します：

1. **サーバーサイドレンダリング（SSR）**: 初めてページをリクエストしたとき、サーバーサイドでコンポーネントのレンダリングが行われ、HTML マークアップが生成されます。この際には、動的なデータや状態を含む部分も含まれます。
2. **クライアントサイドへのアプリケーションのダウンロード**: サーバーサイドで生成された HTML マークアップがクライアントに送信され、ユーザーのブラウザでアプリケーションが再生成される前に、まず初期状態がセットアップされます。この段階では、動的な動作や状態はまだアクティブではありません。
3. **Hydration プロセス**: クライアントサイドでアプリケーションが起動すると、HTML マークアップに含まれているデータや状態を基に、コンポーネントやインタラクティブな部分がクライアントサイドで再生成されます。これにより、初めてページを開いたときの状態が再現され、ユーザーがクライアントサイドでの操作やアクションを行うことが可能になります。

Nuxt 3 では、hydration プロセスは自動的に行われ、クライアントサイドでのインタラクティブな体験をサーバーサイドレンダリングと組み合わせて提供します。これにより、初回のページ読み込み時にもスムーズなユーザーエクスペリエンスが実現されます。
SSH connection


# SSH connection

## how to connect

```
ssh username@remote_host
```

You should replace "username" with your remote username.
Also, you should replace "remote_host" with your remote hostname.
 
After that, you only need to enter the password and success connection!


## How to skip the entering password 
you should do the following settings if you want to skip entering password.

* First

```
ssh-keygen
```

When type this command, id_rsa(secret key) and id_rsa.pub(public key) are generated in ~/.ssh in local PC.

* next 
register the public key in ~/.ssh/authorized_keys in remote PC.
please enter the following command.

```
ssh-copy-id -i id_rsa.pub username@remote_host
```

You should replace "username" with your remote username.
Also, you should replace "username" and "remote_host" of your own.


You can copy the contents of your local ~/.ssh/id_rsa.pub and write it directly to ~/.ssh/authorized_keys on your host.


## Two step SSH 
You should copy ~/.ssh/id_rsa.pub into ~/.ssh/authorized_keys of first and second PC.

And make following config file in ~/.ssh 
 
```
Host [name2]
        User username
        HostName remote_host2
        ProxyCommand ssh username@remote_host1 -W %h:%p

Host [name1]
        User username
        HostName remote_host1
```

You can set name1 and name2 freely and also replace the username and hostname of your own. 

When you login into the remote PC, you will enter the following command

```
  ssh name2 
```
  

## remoteSSH
By using this, you can open the remotePC's file in local PC's vscode.

You should only install the extension (remote-SSH) to your PC.
Nuxt 3 における ISR (Incremental Static Regeneration) とは？

Nuxt 3 における ISR (Incremental Static Regeneration) は、静的サイト生成（SSG）の一種であり、動的なコンテンツを持つページを事前に生成し、必要に応じて部分的に再生成する仕組みです。ISR は、静的サイトのパフォーマンスと最新情報の提供をバランスさせるために使用されます。

以下は ISR の主な特徴と仕組みです：

1. **動的コンテンツの静的生成**: ISR は、動的なデータを含むページを静的に生成します。これにより、ユーザーがページにアクセスした際にサーバーがデータを再計算することなく、事前に生成された静的なコンテンツを提供できます。
2. **再生成とキャッシュの管理**: ISR では、ページごとに再生成の間隔を設定できます。ページが再生成されると、新しいデータを反映させることができます。同時に、キャッシュを使用してユーザーエクスペリエンスを向上させます。
3. **部分的な再生成**: ISR では、必要なページだけを再生成することができます。つまり、全体のサイトを再生成するのではなく、特定のページのみを効率的に更新できます。
4. **自動リフレッシュ**: ISR を使用すると、ユーザーがページを閲覧する際に自動的に再生成がトリガーされる場合があります。これにより、最新の情報がユーザーに提供されます。
5. **パフォーマンスと最新情報のバランス**: ISR は、静的サイトの高速な読み込みと、動的なデータの最新情報を提供するバランスを取るための手段です。定期的な再生成により、データの鮮度を保ちながら、ページの読み込み速度を維持できます。

Nuxt 3 では、ISR はデフォルトで組み込まれており、設定やコンフィギュレーションによって ISR を利用するページや再生成間隔を調整することができます。これにより、ウェブアプリケーションのパフォーマンスとユーザーエクスペリエンスを向上させることができます。
Ubuntu 22.04でNICのMACアドレスを変更する

この令和の時代にMACアドレスを変更することになるとは…  
DHCPサーバから払い出すIPを固定するためにMACアドレスの識別を利用していたのですが、NICを交換するときに諸事情でDHCPサーバの設定を変更できなかったので、MACアドレスを変更するしかなかった、というお話です。  

Ubuntu 22.04のネットワーク設定は```netplan```を使います。  
[Ubuntu Manpage](https://manpages.ubuntu.com/manpages/jammy/man5/netplan.5.html)に設定項目が詳しく書かれています。  

> macaddress (scalar)
> Set the device’s MAC address. The MAC address must be in the form "XX:XX:XX:XX:XX:XX".

## 一時的な変更

まずはNICの確認。  
以降の _(interface)_ は例えば```eth0```みたいなNIC名です。

```sh
# すべて列挙
sudo ip link show
# 対象のNICだけを表示
sudo ip link show (interface)
```

NICをダウンして、MACアドレスを書き換えて、アップします。  

```sh
sudo ip link set dev (interface) down
sudo ip link set dev (interface) address XX:XX:XX:XX:XX:XX
sudo ip link set dev (interface) up
```

## 永続的な変更

```netplan```の追加設定ファイル```/etc/netplan/99_config.yaml```を編集していきます。  
追加設定ファイルがない場合は新規作成します。  
今回設定するOSはUbuntu Desktopなので、```renderer```の項目は```NetworkManager```になります。  
Ubuntu Serverだと、```renderer```の項目は```networkd```になるそうです。  

```yaml:99_config.yaml
network:
  version: 2
  renderer: NetworkManager
  ethernets:
    (interface):
      dhcp4: yes
      dhcp-identifier: mac
      macaddress: XX:XX:XX:XX:XX:XX
      optional: true
```

設定ファイルの編集が終わったら```netplan```に適用します。  

```sh
sudo netplan apply
```

最後に再起動して、再起動後もMACアドレスの変更が反映されたままになっていればOK。
multiprocessingの進捗を表示する備忘録

# multipocessingの進捗を表示する
初めに、プログラム全体を以下に示す。
```
import os
import time
import random
from tqdm import tqdm
from multiprocessing import Process,cpu_count,Pool

def hoge(a,b,c):
    """
    並列化したい処理が書かれている関数
    """
    time.sleep(random.random()*5)
    with open("tmp.txt","a") as f:
        f.write("{}を{}個{}で購入した\n".format(a,b,c))

def wrap_hoge(params):
    """
    imap_unorderedの引数で指定する関数オブジェクトは1引数しか取れないため、hogeをラップする
    """
    hoge(*params)

params = []
param1s = ["リンゴ","ミカン","メロン"]
param2s = [1,2,3]
param3s = ["A店","B店","C店"]
for param1 in param1s:
    for param2 in param2s:
        for param3 in param3s:
            params.append((param1,param2,param3))

t = tqdm(total=len(params))
with Pool(int(os.cpu_count()*0.75)) as pool:
    process_iterable = pool.imap_unordered(wrap_hoge,params)
    for i in process_iterable:
        t.update()
```
tqdmは以下のように書くことで、最大数を指定することができる。そして、1つの処理が終了するごとにt.update()を呼び出すことでプログレスバーが進んでいき、totalで指定した回数だけt.update()を呼び出した時にプログラスバーが100パーセントになる。
```
t = tqdm(total=len(params))
```
pool.imap_unorderedに実行したい関数と引数のリストを与えると、イテレータが返ってくる。
このイテレータはどれか1つのプロセスが終わると, for文が1回実行される。そのため、プロセスが終了した個数だけ、for文を進めることができる。今回は、それぞれのプロセスの終了順は気にしないのでimap_unorderedを使用した。終了順を気にする場合は、imapを使用すればよい。
```
process_iterable = pool.imap_unordered(wrap_hoge,params)
    for i in process_iterable:
```
pool.imap_unorderedに与える関数は引数が1つという制限がある。そのため、複数の引数を指定可能にするためにtupleを受け取って、その中身をunpackして関数に与える関数(wrap_hoge)でラップすることで、複数の引数の関数の呼び出しを可能にする。
```
def wrap_hoge(params):
    """
    imap_unorderedの引数で指定する関数オブジェクトは1引数しか取れないため、hogeをラップする
    """
    hoge(*params)
```
実行結果は以下のようになる。
```tmp.txt
リンゴを2個C店で購入した
リンゴを2個B店で購入した
リンゴを1個B店で購入した
リンゴを1個C店で購入した
ミカンを1個C店で購入した
リンゴを2個A店で購入した
ミカンを1個B店で購入した
ミカンを2個A店で購入した
ミカンを2個C店で購入した
リンゴを3個C店で購入した
リンゴを1個A店で購入した
ミカンを3個B店で購入した
ミカンを1個A店で購入した
ミカンを3個A店で購入した
リンゴを3個A店で購入した
リンゴを3個B店で購入した
メロンを2個B店で購入した
ミカンを2個B店で購入した
ミカンを3個C店で購入した
メロンを2個A店で購入した
メロンを1個C店で購入した
メロンを1個A店で購入した
メロンを2個C店で購入した
メロンを1個B店で購入した
メロンを3個B店で購入した
メロンを3個A店で購入した
メロンを3個C店で購入した
```
Nuxt 3 における SWR (Stale-While-Revalidate)とは？

Nuxt 3 における SWR (Stale-While-Revalidate) は、データ取得とキャッシュ管理を容易にするためのライブラリです。SWR は、特にウェブアプリケーションのパフォーマンスとユーザーエクスペリエンスを向上させるために設計されています。このライブラリは、リモートデータ（API からのデータなど）をフェッチして、ローカルキャッシュを使用して返す際に便益をもたらします。

SWR ライブラリの主な特徴は以下の通りです：

1. **キャッシュとデータ取得の最適化**: SWR は、データの取得とキャッシュの管理を自動的に行い、必要な場合にはキャッシュからデータを提供します。このことにより、ユーザーが最新のデータを即座に取得することができ、同時にネットワークトラフィックも削減されます。
2. **ステートマネジメントのシンプル化**: SWR は、ウェブアプリケーションの状態管理をシンプルにする役割も果たします。データのフェッチと更新は、コンポーネント内で非常に容易に行えます。
3. **エラーハンドリングとリトライ機能**: データ取得中にエラーが発生した場合でも、SWR はリトライ機能を提供し、ユーザーエクスペリエンスの向上をサポートします。
4. **キャッシュの自動更新**: 古いデータ（ステールなデータ）を返しながら、新しいデータを非同期に取得するため、アプリケーションのレスポンス性が向上します。
5. **コンフィギュレーションオプション**: SWR ライブラリは、キャッシュの有効期間や再取得間隔など、異なる設定オプションを提供し、アプリケーションのニーズに合わせて調整できます。

Nuxt 3 では、SWR はデフォルトで統合されており、Vue コンポーネント内で容易に使用できます。SWR ライブラリを使用することで、ウェブアプリケーションのデータ管理やパフォーマンスの向上が簡単に実現できます。
【Fortigate_設定】FortiGateの再起動をスケジュールするコマンド

「システム」→「ダッシュボード」→「status」の右ペイン下方にある「CLIコンソール」から入力

【スケジュール設定】

config system global(global) # set daily-restart enable

(global) # set restart-time hh:mm
(global) # end

【スケジュール解除】

config system global (global) # unset daily-restart

(global) # end
【Fortigate_設定】Fortigateでtrunkポートを追加

物理的に接続するポートに対して作成したVLANを付与する。　　　　　　　　　　　　　　　　　　　　　　
物理インターフェイスはnative VLANとなるので必要に応じてIPを設定する。　　　　　　　　　　　　　　　　　　デフォルトのinternelから物理ポートを分離してもVLANを付与できる。　　　　　　　　　　　　　　　　　　　　　その場合、分離した物理ポートは、ハードウェアスイッチにする必要がある。　　　　　　　　　　　　　　　　　　　設定ができたら、対向SWにも同様のtrunk設定をすると通信が可能となる。　　　　　　　　　　　　　　　　　　　　作成したVLANをインターネットに接続する場合は、ポリシーで設定する。

下記に物理ポート・VLAN2・対向SWの設定を載せておきます。

interface GigabitEthernet0/10
description Fortigate-GW
switchport trunk encapsulation dot1q
switchport trunk allowed vlan 1,2
switchport mode trunk
media-type rj45
end
RDS for PostgreSQL のクラスターパラメータグループを作成する

こんにちは。インサイトテクノロジーの松尾です！

さて、本記事では RDS for PostgreSQL でクラスターパラメータグループを作成する方法についてご紹介します。

※実際、AWS コンソールからは変更できないため、私の方でも少しはまりました・・・。本記事が何かのお役に立てば幸いです。

※2024/4/7に確認したところ、現在は画面から「DB Cluster Parameter Group」が表示できていましたので、本記事の状況に遭遇することはないと思います。

## はじめに

クラスターパラメータグループの作成なんて AWS コンソールから指定して作成するだけでは？ と思われる方も多いかもしれません。
実際、Aurora などでクラスターパラメータグループを作成/修正された経験がある方も多いと思います。

ところで RDS for PostgreSQL でクラスターパラメータグループが必要になるのはどういったときでしょうか？

それは、マルチ AZ DB クラスターを使用するときです。

> マルチ AZ DB クラスターでは、DB クラスターパラメータグループが使用されます。

参考：https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_WorkingWithDBClusterParamGroups.html

さて、話を本題に戻すと、クラスターパラメータグループの作成について、RDS for PostgreSQL については「AWS コンソールから指定して作成するだけ」ではない場合があったので、今回メモ書きとして残すことにしました。(2023/8/16時点)

## RDS for PostgreSQL 13 には存在する選択が RDS for PostgreSQL 14 と 15 には存在しない

実はよくよく調べると RDS for PostgreSQL 13 では、パラメータグループか、クラスターパラメータグループかを選択する項目がありました。そのため、AWS コンソールから RDS for PostgreSQL 13 のクラスターパラメータグループを作成することができました。

![RDS for PostgreSQL 13 でのパラメータグループの作成画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480312/811af5ee-bad5-93b0-acd9-1254ea28c486.png)

※項目のタイトル「グループ名」も正しくないですがここでは言及しません。

一方、RDS for PostgreSQL 14 や 15 ではそれを選択する項目がありません。

![RDS for PostgreSQL 14 でのパラメータグループの作成画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480312/fef8e68a-9b91-2ca5-60c2-8ae80be5330a.png)

もちろん RDS for PostgreSQL 14 や 15 でもマルチ AZ DB クラスターはサポートされているのにも関わらずです・・・。

マルチ AZ DB クラスターでも、pgaudit の有効化などクラスターパラメータグループで設定を変更したいケースはそれなりにあると思いますが、現時点では画面から RDS for PostgreSQL 14 のクラスターパラメータグループを作成することができません。

## AWS CLI から作成しよう

画面からは作成できないのですが、実は AWS CLI からであれば作成できるようです。`create-db-cluster-parameter-group` を使ってまずは CLI からクラスターパラメータグループを作成しましょう。

```bash
aws rds create-db-cluster-parameter-group --db-cluster-parameter-group-name mydbclusterparametergroup --db-parameter-group-family postgres15 --description "My new cluster parameter group"
```

参考：https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-cluster-parameter-group.html

一度作成してしまえば、AWS コンソールから参照や修正が可能です。

![CLI から作成した RDS for PostgreSQL 15 のクラスターパラメータグループ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480312/fe93943d-3015-4b78-dc41-4954729321f8.png)

## おわりに

本記事では RDS for PostgreSQL 15 のクラスターパラメータグループを作成する方法を紹介しました。

本件については、おそらく何らかの画面の不具合と思われますのでいずれ改善はすると思われます。画面からの作成が対応されるまで、本記事のようにまず CLI からの作成で乗り切っていただければ幸いです。

## 追記

2024/4/7に確認したところ、現在は画面から「DB Cluster Parameter Group」が表示できていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480312/20a79027-59b2-c367-f251-ca0990964c93.png)
【Fortigate_ログ】Fortigateからping疎通ログ内容

【成功例】　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　FGT2 # exec ping 192.0.2.1　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　PING 192.0.2.1 (192.0.2.1): 56 data bytes
64 bytes from 192.0.2.1: icmp_seq=0 ttl=255 time=0.1 ms

【失敗例】
●ルーティングテーブルに宛先へのルートがない場合
FGT60D4615052962 # execute ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
Warning: Got ICMP 3 (Destination Unreachable)
--- 8.8.8.8 ping statistics ---
5 packets transmitted, 0 packets received, 100% packet loss　
パケットロスの表示がされているので、失敗とわかる。
【Cisco_設定】ASA5506-Xの初回起動時

工場出荷時の場合は、コンソールケーブルを接続した状態で起動させる。
接続せずに起動させるとモードの設定から開始することになる。　　　　　　　　　　　　　　　　　　　　対話形式でない場合は、下記のような状態になる。

Pre-configure Firewall now through interactive prompts [yes]? no

Type help or '?' for a list of available commands.
ciscoasa>
ciscoasa> en
Password:
ciscoasa#
ciscoasa# conf t
ciscoasa(config)#

* NOTICE *

Help to improve the ASA platform by enabling anonymous reporting,
which allows Cisco to securely receive minimal error and health
information from the device. To learn more about this feature,
please visit: http://www.cisco.com/go/smartcall

Would you like to enable anonymous error reporting to help improve
the product? [Y]es, [N]o, [A]sk later: no

In the future, if you would like to enable this feature,
issue the command "call-home reporting anonymous".

Please remember to save your configuration.

ciscoasa(config)#
【Cisco_障害】APのOSが破損して再起動を繰り返す(AIR-AP2800シリーズ)

APのOSが何らかの理由で破損してしまい再起動を繰り返す場合の対処法

AIR-AP2800シリーズでOSバージョンアップ後に実際に発生しました。

その際の対処法としては、u-boot>>(いわゆるrommon)にログインしバックアップOSから起動させる

sethenv BOOT part2

saveshenv

printenvで設定されたことを確認後にbootを実施すると正常に起動しました。