OmniAICreator/Qiita-1.07M huggingface dataset:
クラウドネイティブなバックアップ　Cohesity編

# 本記事の位置づけ

オンプレのバックアップ前提での情報はちらほら見かけるが、
クラウドネイティブとして、クラウドリソースをバックアップする際のポイントについて、
ネット上にわかりやすい情報がなかったため、個人的な備忘録兼ねて作成する

以下の内容を中心に端的に解説

* クラウドリソースのバックアップ観点での製品概要
    * 各製品/機能/特徴


# 製品概要

## Cohesity Cloud Services

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875177/4148fa8c-35a9-444f-9ff2-3520e90ab087.png)

https://www.cohesity.com/jp/products/cloud-services/


* SaaSベースの統合管理プラットフォーム
*  Cohesity Heliosという名称と同義(Heliosが旧称?)
* 各管理機能やSaaS・セキュリティメニューを提供
    * 後述の各種製品と連携することが可能
    * MLドリブンなランサム検知機能有


### Cohesity CloudArchive
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875177/9d975b2f-f4e0-4791-9c51-08c367ca60d8.png)

https://licensecounter.jp/engineer-voice/blog/articles/20200227_cohesitycloud_-_1_cloudarchive.html

* Cohesity Data Cloud(クラスタ上)に保存したバックアップデータを、
S3準拠/NFSストレージへアーカイブとして吐き出すことが可能
* リストア時もS3準拠/NFSストレージから元の場所へ転送可能


## Cohesity Data Cloud

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875177/63ab4fb2-703c-4d1c-91ff-b050bb8a93ed.png)


https://www.cohesity.com/jp/products/data-cloud/

* 旧称はCohesity DataPlatform(クラウドブームで名称変更した経緯?)
* 提供モデルは以下の二種類存在
    * オンプレ/仮想環境/クラウドのいずれかの環境にアプライアンスとして、バックアップ機能/ストレージ機能を持つクラスタ実体をデプロイ(IaaSセルフマネージド)
    * CohesityがSaaSとしてバックアップ機能/ストレージ機能を提供するモデル(SaaS)
* 特徴
    * Nutanixライクなアーキテクチャ。NestedでCohesityのクラスタを展開するイメージ
    * 仮想マシン3台以上でクラスタ構成し、クラスタ内の仮想ディスクにオーバーレイする形で分散ファイルストレージを構成してストレージリソースをプールする
  

### SpanFS
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875177/cbfea83d-cc53-42d5-a920-a2a70f4cf387.png)

https://www.cohesity.com/jp/products/spanfs/

* クラスタで機能する分散ファイルストレージはSpanFSと呼ばれる
  * 書き込まれたデータはWORM状態を維持するため常にデータ保護される
  * 重複排除や圧縮が働きデータ領域を節約可



### Dataprotect Delivered as a service
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875177/5513ad85-de7d-478f-832a-a4cad10a79e4.png)

https://www.cohesity.com/jp/products/dataprotect-delivered-as-a-service/

* 旧称、BaaSと思われる
* Cohesity Data CloudのSaaS提供モデルのことを指す
* CohesityマネージドのAWS/Azure上に存在するクラスタへ直接データバックアップを取得可能

## Cohesity FortKnox
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875177/0fd7a6ab-a32e-4ae0-acee-9315adc81f8a.png)

https://www.cohesity.com/jp/products/fortknox/

+ Cohesityマネージドのエアギャップストレージをサービス提供
+ 二次バックアップ先として取りうる選択肢
+ 実体としては、AWS/Azureいずれかで動作する
【推論#02】AI推論でよく使われる代表的なモデルまとめ（YOLO / ResNet / BERT など）

**前置き**
- この記事は[こちら](https://qiita.com/Reotech/items/c66ed30fe0756f5eb94f)の記事の続きです
- 専門家ではないので、誤った情報を書いている可能性があります
- 本稿では、AI推論で使用される代表的なモデルをまとめます

## まず「AIモデル」とは何か？
要点をざっくり復習
- モデルとは、ざっくり言えば「AIにおける頭脳・判断ロジック」
- 学習によって「猫の特徴」「人の顔のパターン」などを記憶し、
**入力（例：画像）から出力（例：ラベル）を導く仕組み**
- モデルごとに得意なことや構造が違う

## 知っておくと便利な代表的なモデルとその特徴

### １．YOLO（You Only Look Once）
**目的：物体検出（画像内の「どこに何があるか」）**

| バージョン | 特徴 |
|------------|------|
| YOLOv1〜v3 | 初期のリアルタイム物体検出。Darknetという独自フレームワークで実装 |
| YOLOv4 | パフォーマンス向上。TensorFlowなどでも使いやすく |
| **YOLOv5** | UltralyticsがPyTorchで実装。ONNXに変換しやすく、使い勝手◎ |
| YOLOv6〜v8 | 軽量化や精度改善が進化。YOLOv8は物体検出だけでなく、セグメンテーションや分類も対応可能 |

**おすすめ用途**：リアルタイムに画像内の物体を見つけたいケース（監視カメラ、交通監視など）

---

### ２．ResNet（Residual Network）
**目的：画像分類（画像に何が写っているか）**

| バージョン | 特徴 |
|------------|------|
| ResNet-18/34/50/101 | 数字が大きいほど層が深くて高精度（でも重い） |

- 残差接続（スキップ接続）により、**深くても学習しやすい**という革命的構造

**おすすめ用途**：画像に写っているモノを分類する（猫？犬？など）

---

### ３．MobileNet / EfficientNet
**目的：軽量・高速な画像分類や検出（スマホや組込機器向け）**

- **MobileNet**：軽いモデルで、Raspberry Piやスマホでも動く
- **EfficientNet**：精度も高くて効率が良い設計（"Efficient"）

**おすすめ用途**：デバイスに制限があるとき、低消費電力で使いたいとき

---
### ４．BERT（自然言語処理系）
**目的：テキストの理解・分類・質問応答など**

- Googleが開発した自然言語処理モデル
- 入力が文章、出力が「文の意味」や「分類結果」など
- ChatGPTも内部ではこれに似たTransformer構造を使ってる

**おすすめ用途**：文章の分類、要約、チャットボット、検索強化など

---

### ５．CLIP（画像＋テキストのマルチモーダル）
**目的：画像とテキストを同じ空間で理解する**

- 「この画像に写っているのは"犬が走ってる"というテキストに近いか？」みたいな判断ができる
- OpenAIが開発しており、DALL·Eや類似検索などにも応用

**おすすめ用途**：画像検索・類似画像検出・マルチモーダルAI

---

## モデルを選ぶときのポイント

| 目的 | モデル例 |
|------|----------|
| 画像に何が写ってるか知りたい | ResNet / EfficientNet |
| 画像の中に「どこに何があるか」知りたい | YOLO / Faster R-CNN |
| 軽くて高速にしたい | MobileNet / YOLOv5n（Nano） |
| 文章を分類したい | BERT / DistilBERT |
| 画像とテキストを組み合わせたい | CLIP / BLIP |

---

## これだけは覚えておきたい代表モデル（まとめ）

| モデル名 | 用途 | 特徴 |
|----------|------|------|
| **YOLOv5** | 物体検出 | 高速・ONNX変換しやすい・人気 |
| **ResNet50** | 画像分類 | 安定・高精度・基本中の基本 |
| **MobileNetV2** | 軽量分類 | スマホ・組み込み向け |
| **BERT** | 自然言語 | 文脈理解がすごい |
| **CLIP** | 画像＋テキスト | OpenAI製、画像検索にも強い |

---
## 補足情報
※ 各モデルのONNX形式は以下のような場所から入手できます(2025.3現在)
- [ONNX公式モデル集](https://github.com/onnx/models)
- [Ultralytics YOLOv5 GitHub](https://github.com/ultralytics/yolov5)
- [HuggingFace Model Hub](https://huggingface.co/models)

---

次回([推論#03](https://qiita.com/Reotech/items/c6a9a9e235e86b76c3a5))は推論する環境の構築方法について記事を書こうと思います
EasyIstr-202501 + FrontIstr-202502 on WSL2 ディストロ (ready to use)

# 狙い
### 体感速度の改善
Windows用のEasyIstrは、MSYS2 - MinGW64の環境です。しかし、ext4のLinuxの仮想ドライブで作業をしたWSL2と比べて、メッシュなどの変換が2倍くらい遅く感じます。「シェルスクリプトを爆速で動かしたい」場合は、WSL2が良いとの情報があり、この指摘通りだと感じています。
[...MSYS2,...mingw-w64...WSL2 の違い](https://gist.github.com/rz7d/4e699498d339a5837f016b3108631a2b "Cygwin, MSYS, MSYS2, MinGW, mingw-w64, WSL, WSL2 の違い")
### MKLを組み込んだFrontIstrをビルドスクリプト付きで提供する
Intel-MKL、intel-MPIの組み込みに調査を要するので、あらかじめ環境を作っておけば簡単に使用できます。
ビルドスクリプトも含まれているので、ソースコードが更新されたときのアップデートも簡単にできます。
### EasyIstrアップデートの手間の削減
Dドライブにインストールしているので、アップデート時に毎回修正が必要です。
debファイル版であれば、１コマンドで完了します。
```
sudo dpkg -i easyistr_3.49.250124_all.deb # インストールするバージョンに名前を変更お願いします
```
# ベース環境
### Debian 12
#### 以下の２点から特別な理由がなければ、Debianを使用するようにしています。
#### VirtualBoxのElmer Virtual Machineでアップデートすると、リポジトリのParaviewが壊れました。Elmerのforumにおいても、管理者が以下のようにコメントしていました。
Paraview has been broken by automated update of "expat" library on some platforms. Really annoying.
[Unable to open .vtu file after Electrostatics tutorial]（https://www.elmerfem.org/forum/viewtopic.php?t=8259）

#### 個人使用は無料であるものの、Ubuntu Proを勧めてくる。
### Intel oneAPI
```
echo $MKLROOT
        /opt/intel/oneapi/mkl/2025.0
echo $I_MPI_ROOT
        /opt/intel/oneapi/mpi/2021.14
```
### FrontIstr
```
fistr1
version:      5.6
git_hash:     4414d87c6f35b2fb24698e952b7db5d2c3348117
build:
  date:       2025-03-18T17:49:55%z
  MPI:       "3.1, Intel MPI 2021.14.2"
  OpenMP:     201511
  option:    "-p --with-tools --with-refiner --with-metis --with-mumps --with-lapack --with-ml --with-parmetis --with-mkl "
  HECMW_METIS_VER: 5
```
### EasyIstr
Ver. 3.49-250124
![EasyIstr-SShot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4014034/66f3c6fc-dc9f-4c0b-8dd6-ad8ff800bc8b.png)
# 設定
### Frontistrのコンパイル
以下URLのautofistrの自動スクリプトにより、最新のgitバージョンをコンパイルした
https://github.com/kazuya-goto/autofistr
GCC、Intel MPI、Intel MKL、REVOCAP_Refiner付き
Intelのライブラリは、2025年3月時点で最新のoneAPIのものとした
MUMPSとDirectMKL（Cluster Pardiso）の動作を確認した
### WSL全般の設定（/etc/wsl.conf）

```
[user]
default=easy
# Do not look up Path setting of Windows.
[interop]
appendWindowsPath = false
```
### oneAPIのレジストリを無効化
/etc/apt/sources.list.d/oneAPI.list
oneAPIのリポジトリをコメントアウト
### ~/.bashrc
```
source /opt/intel/oneapi/setvars.sh # oneAPIの環境の読み込み
export PATH=$PATH:$HOME/autofistr/GCC_IMPI/FrontISTR/bin # PATHの追加
alias easyistr=/opt/easyIstr/easyistr # easyIstrのalias, PATH追加でもよい
xrdb ~/.Xresources # マウスポインターの大きさ設定
```
# 導入方法
### 以下のURL（私のOneDrive）からzipファイル（20250318-EasyIstrWSL.zip）をダウンロードする。
(https://1drv.ms/u/c/ca3fad7a4b4217c1/EfVfaDdwqRpGhq4_lC5kFZsB-hP2x6PS3M-ntJf8v9toUA?e=LLl0lZ)
### zipファイルを解凍する。
easyIstr_wsl_debian12.tar.gzと簡単な説明資料が得られる。
### インポートする
```
wsl --import [EasyDeb12：本WSLの名称] [C:\EIstr2025：仮想ext4ストレージの保存先」 C:\path\to\downloaded\file\easyIstr_wsl_debian12.tar.gz
```
### 注意事項
#### ユーザー名： easy
#### パスワード： istr
#### 非常に脆弱なパスワードですので、passwdコマンドにより速やかに変更をお願いします。
新人育成のために何をするべきなのか



## はじめに
OJT（On-the-Job Training）を担当したり、新人教育・新規参画者サポートをする機会が増えてきたため、これまでの経験をもとに「新人育成」についての所感と、今後どのように行動すべきかをまとめます。

## 新人にしてあげること、期待すること
### 1\. 適切なエスカレーションと進捗報告
進捗報告は「全体の〇％」という具体的な数字で行い、全体像の把握ができていることを確認します。この報告形式は進捗を視覚的に理解しやすくします。

### 2\. 自分の言葉で説明してもらう
新人は「わかりました」と言っても実際には理解していないことが多いです。そのため、単に聞いた内容を伝えるのではなく、理解したことを自分の言葉で説明させることで理解を深めてもらいます。

### 3\. 新人の迷いを拾い上げる
新人が迷っている場合、早期にその迷いを察知してサポートします。「できない」と決めつけず、早期にチェックを行い、迷いを解消できるようにサポートします。

### 4\. 悩みを気軽に相談できる環境作り
新人が悩みを相談できる雰囲気を普段から作ることが大切です。相談の瞬間だけでなく、継続的に信頼関係を築くことが求められます。

### 5\. 効果的な報告の仕方
単なる現状報告ではなく、「背景」「現在の状況」「今後どうしたいのか」を伝えることが重要です。目的とゴールを事前に共有し、報告時には「緊急度」の観点を含めて順番を整理します。

### 6\. 言葉の定義と情報レベルの一致
使用する言葉の意味や情報レベルを確認し、相手と齟齬がないようにします。また、論点が曖昧にならないように、ホワイトボードやメモを活用して理解を深めます。

## 具体的にどう進めていくか
### 1\. 1on1の実施
プレッシャーを与えないように、1on1ミーティングを実施します。進捗確認は頻繁に行わず、週1回程度のチェックに留めます。質問しやすい雰囲気を作り、何度聞き返してもOKという環境を整えます。

### 2\. 学びを促進する方法
汎用的な知識を身につけてもらうようにし、期待以上の成果があれば素直に褒めます。また、次の作業は常に用意し、仕事が無くならないようにします。

### 3\. 意見を持つことの重要性
新人には「自分の意見」を持つことを奨励します。「わからない場合はわからないでOK」と伝え、自己開示を促す際は先輩から率先して開示します。

### 4\. 評価とフィードバック
評価は「良い点」と「改善点」をセットで伝えます。具体的なフィードバックを通して成長をサポートします。

### 5\. 責任感と確認の大切さ
「自分勝手にやらない」「確認をしっかり取る」ことを教えます。責任を一人で背負うのではなく、積極的に上司や先輩に確認を取りながら進めていきます。

### 6\. 手が空いた時にやるべきこと
空いている時間には次にやるべきことをすぐに伝え、効率的に作業を進められるようにサポートします。

### 7. 効果的なインプット・アウトプット
インプットはアウトプットを前提に行い、知識は「誰かに伝えること」を意識してまとめてもらいます。得意不得意を見極めて、その人に最適な方法で成長をサポートします。

### 8\. 理由のわからないことは見直す
従来のやり方が効果がないと感じたら、その理由を明確にし、納得できる形に改善します。

### 9\. 楽しむことの重要性
作業はどうせやるなら楽しんで取り組むことが大切です。最初は難しいかもしれませんが、時間が経つと理解が深まり、楽しさを感じられるようになります。

### 10\. 心理的ハードルの低減
新人が安心して学べる環境を提供することで、心理的なハードルを下げ、スムーズに成長できるようにします。
MacOSでFortiClientの起動ができなかった

# 問題
Mac OS (15.0)へFortiClient VPN 7.2
をインストールして起動する際に、以下のように権限の問題で起動ができない状態になりました

![スクリーンショット 2024-09-26 16.47.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1640807/aa17a0be-6da3-4a86-a64f-38926e55de55.png)

# 試したこと
1. インストール後に以下の確認画面が出るので許可をするも変わらず
![スクリーンショット 2025-03-16 15.38.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1640807/18b0f461-c7c4-41b3-a4c9-0385833b13d7.png)

2. `Open Security & Privacy Settings`開くがFortiTrayの許可ボタンが見当たらない
（そもそも`一般`の項目が見当たらない）
![スクリーンショット 2024-09-26 16.47.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1640807/9a88e731-55a8-4c58-afa8-e86067778f5b.png)

こちらでも同じような問題が挙げられていました
* https://community.fortinet.com/t5/Support-Forum/Problems-using-Forticlient-with-MAC-OSX-Monterey/td-p/210837
* https://community.fortinet.com/t5/Support-Forum/Unable-to-allow-Fortitray-in-Mac-OS-Ventura-13-3-1-Forticlient/m-p/252922

## 解決策
`システム設定` > `一般` > `ログイン項目と拡張機能` > `ネットワーク拡張機能`の右側iマークをクリック > `FortiTray`の項目があるのでオンにすることで起動できるようになりました。
![スクリーンショット 2025-03-16 16.15.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1640807/976fd6e1-38fa-404b-b1ce-218b7a611fb2.png)
https://community.fortinet.com/t5/Support-Forum/FortiClient-VPN-permission-error-on-MacOS/m-p/309276

## 補足
最初にForti Client VPN 7.4をインストールして試していましたが、何度試しても起動時にクラッシュしてしてしまう現象が起きたため、過去にダウンロードしていた7.2を使うことにしました。（公式からダウンロードすると有料になってしまいます）
https://community.fortinet.com/t5/Support-Forum/Can-t-open-console-Forticlient-VPN-7-4-In-Sonoma/td-p/321785
Ruby on RailsでWeb開発を始めよう！


こんにちは、韓国在住 sanaです！

今日はRuby on Rails関連の講義を紹介します:point_up_tone1:

Ruby on Railsは、初心者でも扱いやすいWebアプリケーション開発のフレームワークで効率的かつスピーディに開発を進めることができます。


Railsはシンプルさと豊富な機能で、多くの開発者に支持されています。プログラミング初心者の方にも、経験者の方にも適しており、実際に動作するWebアプリを手軽に作成する力が身につきます。この講座で、Web開発の基礎をしっかりと学び、次のステップへと進んでいきましょう！　

ファイティン～:raised_hands_tone1:




:star:Ruby on Railsおすすめ講義:star:

https://u.inf.run/4imdLVJ
https://u.inf.run/4iwPv3g
https://u.inf.run/3FB8afL
ElectronはJSとChromiumで作らえれているというが本当？

Electronってブラウザ以上のGUIの機能をもってるなぁ、どうやってるんだろうと思ってソースみたら、ガッツリC++で記述されていたしIS_WINみたいなOSごとのフラグで分岐されていた。
https://github.com/electron/electron/blob/main/shell/browser/native_window_views.cc

```native_window_views.cc
// Copyright (c) 2014 GitHub, Inc.
// Use of this source code is governed by the MIT license that can be
// found in the LICENSE file.

// FIXME(ckerr) this incorrect #include order is a temporary
// fix to unblock the roll. Will fix in an upgrade followup.
#include "ui/base/ozone_buildflags.h"
#if BUILDFLAG(IS_OZONE_X11)
#include "ui/base/x/x11_util.h"
#endif

#include "shell/browser/native_window_views.h"

#if BUILDFLAG(IS_WIN)
#include <dwmapi.h>
#include <wrl/client.h>
#endif
...
```

Chromiumの基本機能でGUIの大半は作れるが、ウィンドウそのものを透明にするにはOSごとのC++のロジックを書かねばならない。

そりゃぁそうか、ということで、Elecronよくできてる。
Route 53 DNSフェイルオーバー(CloudWatch Alarm)の切り替え時間を測定する

Route 53のヘルスチェック機能を使用してDNSフェイルオーバー(アクティブ/パッシブ)が出来ることは知っていましたが、実際にどの程度の時間で切り替えられるかを知らなかったので実際に測定したほうが早いと思い検証してみました。


前提
================
そこそこ厳しめのRPO/RTOが要求されるシステムでの採用を検討しているため、最短での切り替えを目指します。
以下のような構成で切り替え時間を計測します。

![スクリーンショット 2025-03-11 18.04.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193020/5dae53cb-907e-443f-9d6e-a85b4c84ae67.png)

### EC2
非機能要件の制約でRDSを利用できないと仮定して、Mariadb on EC2を2台でレプリケーションを構成します。

### 監視方法
CloudWatch AgentのProcstatプラグインでmariadbのプロセスを監視します。
メトリクスのインターバルは60秒とします。

### CloudWatch Alarm
Procstatプラグイン収集したメトリクスに対してCloudWatch Alarmを設定します。
Route 53ヘルスチェック側で高解像度メトリクスに対応していないため、メトリクスの期間はAgentのインターバルと同様に60秒とします。
このアラームがmariadbの異常を検知し、Route 53のヘルスチェックに反映させるためのトリガーとして機能します。

### Route 53 ヘルスチェック
上記で作成したCloudWatch AlarmをモニタリングするRoute 53 ヘルスチェックを作成します。

![スクリーンショット 2025-03-11 19.23.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193020/f215e0ba-8428-489b-94d1-321263066b85.png)


### フェイルオーバーレコード
Route 53 プライベートホストゾーンを作成してプライマリ/セカンダリのフェイルオーバーレコードを作成します。
キャッシュによる影響を極力減らすためにTTLは0秒としておきます。
ただし、TTLを極端に短く設定するとRoute 53の料金が高額になる可能性があるため注意です。

![スクリーンショット 2025-03-11 19.18.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193020/2234e2e0-3133-4956-869a-0c3eeb283a3e.png)


切り替え検証
================
EC2のmariadbを手動停止したタイミングでタイマーをスタートします。
同一VPC内のEC2からRoute 53 Resolver経由でdigを叩いて切り替え時間を計測します。
ログやアラーム等から確認を試みましたが、秒単位の精度で計測が難しそうだったため、人力による原始的な方法で計測することにしました。

検証結果
==============
10回ほど計測した結果はこちらです。


|切り替え時間(秒)|
|--:|
2:03
2:39
1:58
<font color="Red">4:56</font>
1:39
1:51
1:55
1:42
<font color="Blue">1:30</font>
1:57


最も早い切り替え時間が1:30
最も遅い切り替え時間は4:56という結果となりました。
上振れて遅かった4:56秒については、CloudWatch Alarm側ですぐに異常を検知していましたが、ヘルスチェック側の反応が遅れているような挙動でした。
このような原因不明の外れ値を除けば、プロセス停止から概ね1:30~:2:30で切り替わる傾向が見られました。切り替え時間のばらつきもCloudWatchインターバル(60秒)内で収まっているようです。


まとめ
==============
今回の検証で、1:30〜2:30程度で切り替えが行われることを確認できました。
ただし、再現性と原因も不明ですが、まれに切り替え時間が遅くなることもあるため、厳密なRPO/RTOが求められるようなシステムでの採用は慎重に検討したほうが良さそうです。
また、TTLを短くしすぎるとRoute 53の料金が高額になるリスクもある点はご注意ください。今回の検証ではTTLを0秒に設定しましたが、本番環境では60秒以下で適切な値を設定することをお勧めします。
とはいえ、DNSフェイルオーバー設定自体も容易ですし、CloudWatchをトリガーにすることができるため採用の幅はとても広いのかなと思いました。AWSが提供しているCloudWatch推奨アラーム等を参考にするのも良さそうですね。


参考
==============
TTL
https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/resource-record-sets-values-shared.html#rrsets-values-common-ttl

CloudWatch 推奨アラーム
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html
【React】デジタル名刺アプリを開発しての気づき

# はじめに
今回、デジタル名刺アプリを開発しました。
開発中の気づきや躓いたことについて共有させていただきます。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/0d14305b-1bf7-4fcd-874b-88092b2d176d.png" width=50%>



# 技術やバージョン
react: 19.0.0
react-router: 7.3.0
jest: 29.7.0
chakra ui v2
supabase
Firebase
GigHub


# 気づきや躓いたポイント
これまでの開発で行っていた環境構築や、Firebase・supabaseの設定、CI/CD構築は忘れている部分もありましたが調べれば実装は問題ありませんでした。
JISOUに入学するまでCI/CDというものを知らなかったしやったこともなかった自分としてはこれが当たり前の設定である感覚になっている点も成長を感じる部分でした。

今回初めてsupabaseで中間テーブルを作成しました。少々時間がかかりましたが、こちらも調べれば設定することができました。Ruby on Railsのコードで設定した経験はありましたが、SupabaseのようなBaasでの設定は初めてで、お手軽に設定できることを知ることができたこともよかったです。

そしてアプリ開発中childrenやpropsの理解が不十分だと感じたため、再度Udemyハンズオンを一通り行う、インプットに戻りました。
最初にインプットした時は何となくの理解で終わっていた状態でしたが、children、propsに対する理解が確かなものになりました。そのほかのハンズオンでの実装も前回のインプットの時には、あいまいな理解で終了していた箇所が、より理解できていることを感じました。また、ハンズオンしながらドキュメントと照らし合わせ、動画通りの実装だけではなく、自分で様々試しながらハンズオンを行ったお陰で時間が掛かりましたが、更に実のある内容になり、ただ真似るだけのハンズオンよりも達成感のあるインプットになることも体感できました。
個人的に苦手としている同じ名称の変数名シリーズ。プロパティ名と変数名が同じことで、この変数名はどこからきてるのかわからなくなり、いつも「同じ名称やめてほしいなぁ」という状況だったものも、どこからきている変数なのか予測・理解ができるようになっている感覚も今までなかったことです。
今回の経験で、<font color="#1e90ff">**インプットする場合のインプット量、その後のアウトプットの必要性、そして理解不十分な箇所の再度のインプットでより理解が深まることを学びました。**</font>
臣さんの投稿でも言っていることですが、私たちは普段の生活の中でアウトプット主義で生活していることが多く、やりたいことがあったらまず行動してみて分からなかったら調べ（インプット）、実行し、検証、また分からなかったら調べ（インプット）、実行・検証の繰り返しを行って学んできたことを<font color="#1e90ff">**プログラミングで体験できたことは大きな収穫でした。**</font>
今回クラス、インスタンス、コンストラクター、オブジェクトについても再度復習し以前より理解することができ、より理解が深まりました。
<font color="#1e90ff">**インプットとアウトプットの繰り返しを継続することで理解が深まると実感できました。**</font>

今回もjestのテストで詰まりました。
前回のアプリ開発の時も同じくここで時間がかかりました。
過去の先輩方の投稿やAIに助けてもらいました。ドキュメントと投稿内容・AIの回答を照らし合わせ理解を深めながら進めました。

初めてルーティングのテストを行いました。ボタンの遷移テストは問題ありませんでしたが、Linkのテストで躓きmemoryRouterを活用できることを学べたのも収穫でした。

今回、AIは臣さんお勧めのperplexityを使用してみました。無料でもヒントをもらうには十分の性能でした。
chatGPT解約しようかな。

最初はチェックボックスもChakra uiのコンポーネントを使用して実装しました。しかし、Jestのテストでエラー。こちら解決できず、また見た目も大きく変わらないことから、inputタグに切り替えて対応しました。
今回の経験で、テストとの相性も考えてcssライブラリは選定した方がよい気がしました。

最後にstyleですが、優先順位を意識して文字は見やすく、違和感のない上下のフォームの隙間も意識しました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/75f9fc19-d8e5-4395-96dd-0c298b9ed944.png" width=50%>

# おわりに
今回は大なり小なり沢山の躓きポイントがあり、そのたびに学びがありました。逆に躓かないと学びがありませんので、そういうポイントに出会ったらチャンス到来の感覚でアプリ開発できました。
これからも新しい技術に積極的にチャレンジしてインプットとアウトプットを繰り返しながら、よりスキルアップを図り自分の作りたいアプリの完成までの道筋が予測できるレベルになれるように、これからも続けていきます。

<br>

[<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/8bfacf61-7d8d-6d27-cb07-98d1f8f27fcd.png"  width=100%>](https://projisou.jp)
【Windows】Datadog AgentをインストールしてDatadogへログ収集する方法

WindowsのDatadog Agentからログ収集方法

## ▼Datadog Agentとは
監視プラットフォームの中核をなすソフトウェアエージェント。
サーバー、仮想マシン、コンテナなどのホストにインストールされ、システムやアプリケーションのメトリクス、ログ、トレースなどのデータを収集し、Datadogプラットフォームに送信します。

## ▼簡単にやること
Datadogで監視したいサーバーにDatadog Agentをインストール、
Agent側から転送したいファイルをさくせい指定、Datadogコンソール上へ反映させる。

## ▼[Windows]Datadog Agentからログ収集手順詳細
### ①ログ収集したいホスト(サーバ等)からDatadog Agentを下記サイトからインストール
https://docs.datadoghq.com/ja/agent/?tab=Linux

### ②ログ収集を「有効」にする
Datadog Agent では、ログの収集はデフォルトで無効のため、ログ収集を有効。
Agent のメインコンフィギュレーションファイル (datadog.yaml) で logs_enabled: false を logs_enabled: true に変更する

#### [②-1].下記ファイルパスを開く
C:\ProgramData\Datadog\datadog.yaml
#### [②-2].datadog.yamlファイルを変更する

datadog.yamlファイルを一部抜粋
・デフォルト(無効)
```php
logs_enabled: false
```

・変更後(有効)
```php
logs_enabled: true
```

▼各のOSメインコンフィギュレーション
https://docs.datadoghq.com/ja/agent/configuration/agent-configuration-files/

### ③sample.d\conf.yamlを作成
※sample.dはフォルダ
※conf.yamlはファイル
```php
▼作成前
C:\ProgramData\Datadog\conf.d
▼作成後
C:\ProgramData\Datadog\conf.d\sample.d\conf.yaml
```

▼conf.yamlファイルの中身
```php
logs:
  - type: file
    path: C:\Users\admin\Desktop\sample.json
    source: sample
    service: sample
```

※他必要なパラメータあれば適宜追加していく

▼パラメータリストは下記参照
https://docs.datadoghq.com/ja/agent/logs/?tab=tailfiles

### ④サービスでDatadogAgent再起動
#### [④-1].Windowsキー + Rキーを押して「ファイル名を指定して実行」ダイアログを開く
#### [④-2].「services.msc」と入力して「OK」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3501557/98ec0e12-079d-4fd0-a27d-024fe57aebbb.png)
#### [④-3].「Datadog Agent」選択して右クリック、再起動実行。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3501557/dc1daebe-775f-46c9-86ad-b3af552afb46.png)


### ⑤Datadogコンソール上でPipelineを作成
#### [⑤-1].Datadogコンソールへログイン
#### [⑤-2].左メニューの「Logs」にカーソル合わせ、Log Configurationの「Pipelines」を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3501557/b8e2b333-059e-4896-8552-10b5e2579d0f.png)

#### [⑤-3].右上の「+New Pipeline」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3501557/e5ade8b5-5ac7-4d7b-87bd-35c88f86529f.png)

#### [⑤-4].Filterに「source:sample」を入力する。その他は適宜記入
※③で設定したconf.yamlファイルを認識して取得しています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3501557/4682454d-593d-4296-aaba-49361116fbab.png)
【NocoBase 小ネタ】ログインをメールアドレスだけにする

## はじめに
NocoBaseを使っていると、**ログイン方法を「メールアドレスのみ」にしたい** と思うことはありませんか？  

NocoBaseの標準パスワード認証プラグインでは、「ユーザー名 or メールアドレス」での認証が求められます。  
ですが、業務アプリでは「ユーザー名不要」「メールアドレスだけで管理したい」というケースもあるでしょう。  

そこで今回は、**NocoBaseのログインをメールアドレスのみにする方法**を紹介します！  


## 注意点
:::note warn
厳密には「ユーザー名でのログインを完全に無効化する」のではなく、「ランダムな文字列をユーザー名にすることで、実質的にメールアドレスだけの運用にする」方法です。
:::

:::note alert
- **現在のユーザー名が完全に上書きされる** ため、必要なら `users` テーブルのバックアップを取ってください。
- **初期構築時に行うのがベスト** ですが、運用途中でも可能です。
- **非公式のやり方** なので、今後のNocoBaseのバージョンアップで使えなくなる可能性があります。
:::


## 設定手順
:::note alert
作業の途中で **ログアウトしないように注意** してください！  
ログアウトすると再ログインできなくなる可能性があります。  
もしログアウトしてしまった場合は、**DBに直接アクセスし、`users` テーブルの `username` に適当な値を入れてください**。
:::

### 1. ユーザー名の削除＆再設定
1. `設定` > `データソース` へ移動
2. ユーザーデータの入ったデータソースの `設定` を開く
3. ユーザーの `フィールドの設定` へ進む
4. `一般フィールド` > ユーザー名を `削除`
5. 新しいフィールドを追加
    - **フィールド表示名**: `{{t("Username")}}`
    - **フィールド識別子**: `username`
    - **アルファベット**: そのまま or 好きな文字列
    - **長さ**: `64`（適当でOK）
    - **デフォルト値**: ✅（有効にする）
    - **インデックス**: ✅（重複を許可しない）
    
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1160967/4e1b0ad9-674a-436a-aa49-3c516900f580.png)
    
6. **保存**

### 2. 既存ユーザーの更新
1. `設定` > `ユーザーと権限` へ移動
2. rootユーザーの `プロフィール` を開く
3. ユーザー名にNano ID（ランダムな文字列）が入力されているのを確認する
4. そのまま保存
    
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1160967/3f7f0940-90e2-40ef-b059-984a4ab665fd.png)

5. ログアウトして、メールアドレスでログインできるか確認
6. 他のユーザーも同様に更新


## ちなみに
もちろん、**ユーザー名（Nano ID）でもログイン可能** です。  
しかし、ユーザーにユーザー名を知らせなければ、**実質的に「メールアドレスのみ」での運用が可能** になります。  

**NocoBaseを使った業務アプリでは、この方法でシンプルなログイン管理が実現できます！**  


## まとめ
今回は、**NocoBaseのログインをメールアドレスのみにする方法** を紹介しました。  

✅ **ユーザー名をランダムな文字列にする**  
✅ **ログイン方法をメールアドレスに統一する**  
✅ **シンプルな認証フローで業務アプリ向けに最適化！**  

良いNocoBaseライフを！ 🚀
OpenPages with WatsonでのワークフローTips - 複数人での承認

OpenPages with Watsonでワークフローを構築する際の要件として、よく次のような要件をいただきます。
・複数のユーザーで承認したい。

この時の「複数」の形態として、直列と並列の2つの形態がありえます。

## 直列
### 複数のユーザーA、B、Cが承認する。Aさんがまず承認し、その後でBさんが承認する。最後にCさんが承認して完了となる。
### BさんはAさんが承認するまで承認行為はできない。CさんはBさんが承認するまで承認行為はできない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4035689/fff2399e-ac88-43af-a23e-7c8ffead1d27.png)


## 並列
### 複数のユーザーA、B、Cが承認する。承認する順番は問わないが、3人全員が承認しなければ完了しない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4035689/87b63ce5-ffc7-4a48-84c3-a4553ed93e1a.png)

このうち、「直列」についてはOpenPagesの標準機能で実現ができます。
しかし、「並列」の図のようにOpenPagesで実装しようとすると上記記載の要件は満たせません。Aさん、Bさん、Cさんのどなたかが承認行為を行うとこの承認フローは完了してしまいます。
そのため、順不同に複数名の承認が必要、という場合には多少の工夫が必要になります。

## ソリューション
以下のように、複数のステージとアクション、それに付随した適用性を利用する事で疑似的な並列承認を実現する事ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4035689/69a10525-e715-49d2-888f-576ecffdcd4e.png)


この方式のポイントは、3人の承認者の場合に考えられる全ての承認経路を用意しておく、という点です。
最初の「承認１」のステージでは、担当者として3人すべてを登録しておきます。
承認1から承認する経路を3つ用意しておきます。それぞれの経路は各ユーザー向けの物ですので、Aさんの承認経路とBさんの承認経路の実態は異なるものとなります。Aさん向けの承認経路は、BさんとCさんには表示されませんし、Bさん向け、Cさん向けの承認経路についても同様です。

この例では、Aさんが承認したとします。この場合、承認１から承認2-1に向かう赤い矢印の経路を進みます。
承認2-1の担当者はBさんとCさんに設定します。こうする事で、Aさんが承認した後に、まだBさんとCさんに承認を求める事ができます。
ここでBさんが承認するものとします。この場合、承認2-1から承認3-3に向かう赤い矢印の経路を進みます。
承認3-3の担当者はCさんに設定します。こうする事で、Bさんが承認した後に、Cさんに承認を求める事ができます。
Cさんが承認してはじめてこのフローが完了します。

今の説明は、A→B→Cの順で承認しましたが、B→A→Cの順で承認した場合でもこれとは別の経路をたどって「End」まで至ります。

これにより、承認者の並列かつ順不同の要件を満たすことができるようになります。

## まとめ
お客様からよく伺うワークフローの要件を提示しました。
OpenPagesの標準機能では実現ができない並列かつ順不同の承認、という要件をOpenPagesで実現するための工夫について記載しました。
gRPCとは？

## gRPCとは
+ サービス間でHTTP/2を利用してやり取りするための技術
+ gRPCとはRPCを実現するためのGoogleが開発したプロトコルの１つ。オープンソースのRPCのフレームワーク
+ サーバ上に登録されている関数を、クライアントに応じて呼び出す
→RPC(Remote Procedure Call)
<br>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3942091/e677977d-a937-4b90-bf96-71b31faaa53d.png)


## gRPCの特徴
+ 特定の言語やプラットフォームに依存しない
+ クライアント-サーバ間の通信にはデフォルトではHTTP/2を使用、データシリアライズにはProtocol Buffersを使用して、高速通信を実現している
→Protocol Buffersはやり取りするデータの型や構造を事前に定義する仕組みが用意されている（protoファイル）
これを利用して各言語に対応する、サーバ/クライアント用ソースコードのコード自動生成が可能に

+ 通信規格がHTTP/2ということは、対応していないブラウザやロードバランサはリクエストを受けることが出来ない
<br>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3942091/78fc3e32-3528-4bbe-9f5e-d238878e9436.png)


## メリット
・Request/Response はバイナリデータの形で、送信データサイズは普段利用しているHTTP/1.x JSON/XMLより小さい 
・HTTP/2の双方向通信活用して、4パターンの通信方法ある
・Restfulのようなパスを定義することが必要ない、ローカルメソッドとほぼ同じの方法で使う
・開発言語の制限なし(GoogleからgRPC自動作成ツールを提供する、いくつの言語をサポートしている)
<br>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3942091/fcd7810a-1576-4a34-b2d5-26ea5c3e9767.png)


## デメリット
+ Restfulのような明確に定義したリクエストメソッドがない（CRUD）
+ HTTP/1.Xのサポートしていない
+ 事前にメソッドの名前、Request/Response内容を定義するが必要
+ Request/Responseの定義を変更する場合、もう一度compileが必要
<br>

## protocol buffersとは？
+ 言語やプラットフォームに依存しない、構造化されたデータをシリアライズする拡張可能なインターフェース記述言語(IDL)
+ protoという拡張子のファイルで定義して、それをもとにgRPCと通信するclientを作成する。主流はversion3
+ Request/Responseのフォーマットを指定できる
<br>

![スクリーンショット 2025-04-10 093239.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3942091/12cd95e9-5463-46a0-86a9-58a5be03d840.png)


## protoファイルのサンプル
```
syntax = "proto3";
 
option go_package = "./hello";
package hello;
 
service Hello {
  rpc GetHelloWorld (StringRequest) returns (StringResponse) {}
}
 
message StringRequest {
  string RequestMassage = 1;
}
 
message StringResponse {
  string ResponseMassage = 1;
}
```
<br>

## protoファイルの説明
<table>
  <thead>
    <tr>
      <th>Ta</th> <th>Description</th>　<th>Remarks</th>
    </tr>
  </thead>
  <tr>
    <td> syntax </td> <td>バージョン定義</td> <td>執筆時点ではproto3 が最新？</td>
  </tr>
  <tr>
    <td> package </td> <td>パッケージの定義</td> <td>複数の.protoファイルを利用するケースなどで、名前の衝突を避けるためにパッケージ名を設定できます</td>
  </tr>
  <tr>
    <td> service </td> <td>gRPCに登録するサービス名を指定</td> <td>class みたいなもの？</td>
  </tr>
  <tr>
    <td> rpc </td> <td>関数の定義</td> <td>今回の例では、GetHelloWorldという関数を作成し、StringRequest という引数を受け取り、StringResponse という返り値を定義しています。</td>
  </tr>
  <tr>
    <td> message </td> <td>型の定義左から順に型 型の名前 = タグナンバー</td> <td>1つのmessageに複数定義する事もできます</td>
  </tr>
  <tr>
    <td> import </td> <td>他の.protoファイルで定義したメッセージ型を使いたい場合にインポートして利用することができます</td> <td>今回は使用していません</td>
  </tr>
</table>
notes

Sub MergeAllExcelFiles()
    Dim excelApp As Variant
    Dim workBook As Variant
    Dim workSheet As Variant
    Dim sourceWorkbook As Variant
    Dim sourceSheet As Variant
    Dim fileSystem As Variant
    Dim baseFolder As Variant
    Dim folder As Variant
    Dim file As Variant
    Dim basePath As String
    Dim targetPath As String
    Dim lastRow As Integer
    Dim folderName As String
    Dim fileName As String

    ' Excelアプリケーションを起動
    Set excelApp = CreateObject("Excel.Application")
    excelApp.Visible = True ' デバッグ用（不要なら False）

    ' Work.xlsx を開く（なければ作成）
    targetPath = "C:\temp\Work.xlsx"
    On Error Resume Next
    Set workBook = excelApp.Workbooks.Open(targetPath)
    If Err.Number <> 0 Then
        Err.Clear
        Set workBook = excelApp.Workbooks.Add
        workBook.SaveAs targetPath
    End If
    On Error GoTo 0
    Set workSheet = workBook.Sheets(1) ' メインのシートを選択

    ' ファイルシステムオブジェクトを作成
    Set fileSystem = CreateObject("Scripting.FileSystemObject")
    Set baseFolder = fileSystem.GetFolder("C:\temp") ' C:\temp フォルダのオブジェクト取得

    ' `C:\temp` 内のすべてのフォルダを取得
    For Each folder In baseFolder.SubFolders
        folderName = folder.Name

        ' フォルダ名が「20XX年」の形式であることを確認
        If folderName Like "20??年" Then
            ' フォルダ内のファイルを取得
            For Each file In folder.Files
                fileName = file.Name
                ' Excel ファイルのみ処理
                If LCase(Right(fileName, 5)) = ".xlsx" Then
                    ' Excel ファイルを開く
                    Set sourceWorkbook = excelApp.Workbooks.Open(folder.Path & "\" & fileName)
                    Set sourceSheet = sourceWorkbook.Sheets(1) ' 1つ目のシートをコピー

                    ' Work.xlsx の次の空いている行を探す
                    lastRow = workSheet.Cells(workSheet.Rows.Count, 1).End(-4162).Row + 1 ' xlUp の定数: -4162

                    ' シートの内容をコピー＆ペースト
                    sourceSheet.UsedRange.Copy
                    workSheet.Cells(lastRow, 1).PasteSpecial -4163 ' xlPasteValues の定数

                    ' ファイルを閉じる
                    sourceWorkbook.Close False
                    Set sourceSheet = Nothing
                    Set sourceWorkbook = Nothing
                End If
            Next
        End If
    Next

    ' 保存して終了
    workBook.Save
    workBook.Close
    excelApp.Quit

    ' オブジェクト解放
    Set workSheet = Nothing
    Set workBook = Nothing
    Set excelApp = Nothing
    Set fileSystem = Nothing
    Set baseFolder = Nothing
End Sub
Binary was compiled with 'CGO_ENABLED=0', go-sqlite3 requires cgo to work. This is a stubというエラーが出る

## 環境
* OS: Windows 10
* 言語: Golang

## 試したこと
* ```$ go env -w CGO_ENABLED=1```を実行
* MinGWをインストール
→ 解決せず

## 解決した
[tdm64-gcc-5.1.0-2.exe](https://sourceforge.net/projects/tdm-gcc/files/TDM-GCC%20Installer/tdm64-gcc-5.1.0-2.exe/download)をダウンロード
add to PATH envにチェック入れる


https://github.com/mattn/go-sqlite3/issues/855#issuecomment-2267489894
PoEの相性について


■PoEとは

PoEは「Power over Ethernet」の略。
有線LANケーブルで給電ができる機能。

参考
https://www.imrcry.jp/blog/poe/414/

大きく3つに分けて
PoE（IEEE802.3af）、
PoE＋（IEEE802.3at）、
PoE＋＋（IEEE802.3bt）という規格が存在します。

■組み合わせの相性

ざっくりいうと給電側が弱いと動作しません。

　　　PoE	PoE＋	PoE＋＋
PoE 　　○	×	×
PoE＋　	○	○	×
PoE＋＋	○	○	○

※左：PSE（給電） 
　右：PD（受電）

■所感
「PoE」というワードががPoE（機能やシリーズ）を指しているのか、PoE（無印、IEEE802.3af）を指しているのかに注意すること。
制約付きのfizzbuzz(javascript)

最近以下の2つの記事を読みました。
[参考サイト1](https://qiita.com/Sei2423/items/449f71d80b904f6e090f)
[参考サイト2](https://qiita.com/mikecat_mixc/items/afc029e24009293e284b)

自分はあまり制約をつけたプログラミングをやらないので新鮮でした
参考サイト2を読んだときにふと思いついたことがあります。
それは参考サイト1、参考サイト2の制約を両方同時に満たすプログラムをかけるのではないかということです。
そこで両方のサイトに書かれているプログラムを参考に自分なりに両方の制約を満たすプログラムを書いてみました。
もしも制約違反を見つけたら教えてください。
```javascript
function s(cond, whenTrue, whenFalse) {
  return { true: whenTrue, false: whenFalse }[cond];
}
function mod(i,x) {
  with(Number(i)) {
    with(toString(x)) {
      return s(Boolean(parseInt(at(indexOf()), x)),false,true);
    }
  }
}
function genarate(n){
  with(Array){
    with(from(Array(n))){
      with(map((d,i)=>i)){
        push(length)
        return slice(1,length);
      }
    }
  }
}
function FizzBuzz(n,
  patterns = [{ pred: (v)=>mod(v,3), str: "Fizz" },
              { pred: (v)=>mod(v,5), str: "Buzz" }]
) {
  with(Array){
    with(genarate(n)){
      return reduce((a,c)=>{
        with(patterns){
          with(`${a}${"\n"}${s(
            some(({pred,str})=>pred(c)),
            reduce((a,{pred,str})=>`${a}${s(pred(c),str,"")}`,""),
            c
          )}`){
            return slice(1,length);
          }
        }
      },"")
    }
  }
}
with(console) {
  log(FizzBuzz(100));
}

```
反応次第でさらに制約を追加してみようと考えています。
今頭で考えているのは文字列、数字禁止の追加です。ちょっとずるい方法ですがすでに方針は決まっています。
追記(2025/3/20)
@mikecat_mixcさんがコメントで制約違反を指摘してくれました。修正を行いました。ありがとうございました。また、制約の回避用の関数が多かったので仕組みを見直して使わないようにしました。
Chain of Thoughtの最新動向


## Chain of Thought（CoT）の概要

- LLM（大規模言語モデル）の推論性能向上を目的とした技術
- 複雑な問題を複数の小さな論理的ステップに分割し、内部の推論プロセスを明示的に表現することで、推論の正確性と解釈性を向上させる

## 基本概念と背景

- 2022年に発表された「Chain-of-Thought Prompting Elicits Reasoning in Large Language Models」などの論文を起点に発展
- 従来のZero-ShotやFew-Shotプロンプティングと比較して、CoTは中間推論過程を明示する点が特徴
- 人間の問題解決プロセスにヒントを得たアプローチで、タスクの分解と段階的解決により、複雑な問いに対応可能

## 主要なCoT手法

- **Zero-Shot CoT**
	- トリガーフレーズ（例：「Let's think step by step」）を用いて、例示なしで段階的推論を促す
	- シンプルながらも、一定の推論精度向上が期待できる
- **Few-Shot CoT**
	- プロンプト内に少数の具体例を提示し、モデルが推論の流れを学習するよう促す
	- 複雑な問題や構造化された回答が求められるタスクに適用しやすい
- **Auto-CoT**
	- 推論プロンプトの生成を自動化することで、手動での例示作業を省略
		- これにより、多様な問題に対応するための効率的なプロンプト作成が可能になる
	- クラスタリングやサンプリングを活用し、一貫性のある推論パスを生成する
- **Algorithm of Thoughts（AoT）**
	- 問題の定義、情報収集、分析、仮説構築、検証、結論という明確なサブステップに分解
	- 特定のタスク（例：論理パズルやゲーム）で高い効果を発揮する
- **Tree of Thoughts（ToT）**
	- 複数の推論パスを分岐的に生成し、探索して最適解を見つける手法
	- 計算コストが高くなる一方、非常に複雑な問題に対しては柔軟な解決策を提供可能
		- 特に、正解への道筋が複数存在するような探索的な問題に適している

## CoTの利点と応用事例

- **利点**
	- **推論精度の向上:**
		- 複雑なタスクに対して、段階的な推論により正確な回答が得られる
	- **出力の透明性:**
		- モデルの内部推論過程が明示されることで、デバッグや結果の検証が容易
	- **ハルシネーションの低減:**
		- 推論プロセスを追うことで、モデルが根拠のない情報を生成する（ハルシネーション）のを特定・修正しやすくなる
- **応用事例**
	- 数学や論理問題、記号推論タスク
	- マルチモーダルデータの解析（画像、音声、テキストの統合分析）
	- 複雑な科学的問題や技術的解析の支援
	- ユーザーへの説明や意思決定支援システムの開発

## CoTの課題と限界

- **計算コスト・応答時間の増加:**
	- 複数の中間ステップを生成するため、計算負荷が高くなる可能性がある
- **推論過程の正確性:**
	- 中間のステップが誤っている場合、最終結果に悪影響を及ぼすリスクがある
- **プロンプトの依存性:**
	- プロンプトの表現方法により、生成される推論チェーンの質が大きく変動する
- **モデルサイズとの関係:**
	- 一部の技術は非常に大規模なモデルでなければ効果が十分に発揮されない場合がある

## 実践的な実装戦略

- **問題定義とユースケースの特定:**
	- どのタスクにCoTが適用可能か、明確に目標を定める
- **具体例の提示とプロンプト設計:**
	- フューショットCoTなどを活用し、望ましい推論パターンの例をプロンプト内に含める
		- 例の質と量が重要
- **プロンプトの反復的改善:**
	- 推論プロセスを分析し、エラーや矛盾を洗い出しながらプロンプトを調整
- **モデル選定と最適化:**
	- 使用するLLMのサイズや能力に応じた最適な手法を選び、パフォーマンスを評価
- **最新の研究動向のフォロー:**
	- 新たな手法や改良点を取り入れるため、定期的に文献や事例を参照する

## まとめ

- Chain of Thoughtは、LLMの推論能力を高め、複雑なタスクへの対応を可能にする革新的な技術
- 各手法にはそれぞれのメリット・デメリットがあり、利用する際はタスクの特性に合わせた選択と工夫が必要
spring-bootのconstructor-injectionで@Valueを使用


# 環境
```gradle:build.gradle
plugins {
	id 'java'
	id 'org.springframework.boot' version '3.4.3'
	id 'io.spring.dependency-management' version '1.1.7'
}


group = 'com.example'
version = '0.0.1-SNAPSHOT'

java {
	toolchain {
		languageVersion = JavaLanguageVersion.of(17)
	}
}

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testImplementation 'io.projectreactor:reactor-test'
	testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}


tasks.named('test') {
	useJUnitPlatform()
}
```

# ソースコードなど
## コンストラクタ引数にValueを付与
あるプロパティを初期化時にのみ使用する、などの場合は以下のように自前のコンストラクタで十分と思われる。

```java
@Component
public class Valueconstrucor {
  public Valueconstrucor(@Value("${prop.sample}") String value) {
    System.out.println(value);
  }
}

```

## lombokのRequiredArgsConstructorと併用
lombokでコンストラクタを自動生成しつつプロパティも必要な場合は以下にならざるを得ない。constructor-injectionとfield-injectionをするのは不格好というか、出来れば前者にまとめたい。以降でこれの解決方法について述べる。

```java
@Component
@RequiredArgsConstructor
public class Valueconstrucor2 {
  final SampleService1 service1;

  @Value("${prop.sample}")
  String value;
  // 以下省略
```

これの解決には、lombok設定でフィールドのアノテーションをコンストラクタ引数にコピーする機能があるのでこれを使用する。詳細は https://projectlombok.org/features/constructor の`lombok.copyableAnnotations`を参照。

`src\main\java\lombok.config` を作成して以下のようにする。これで`@Value`がコピーされるようになる。

```config:lombok.config
lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Value
```

上記設定により、以下は意図通りのコンストラクタが生成される。

```java
@Component
@RequiredArgsConstructor
public class Valueconstrucor3 {

  final SampleService1 service1;

  @Value("${prop.sample}")
  final String value;
  // 以下省略
```

自動生成されるコードは以下の通り。

```java
@Component
public class Valueconstrucor3 {
  final SampleService1 service1;
  @Value("${prop.sample}")
  final String value;

  public void execute() {
    System.out.println(this.value);
  }

  @Generated
  public Valueconstrucor3(final SampleService1 service1, @Value("${prop.sample}") final String value) {
    this.service1 = service1;
    this.value = value;
  }
}
```

# 感想
個人的には、あまりlombokに頼りすぎず手動でコンストラクタを書いちゃっても良いかな……と思わないでもない。依存先が2,3つなら大してソースコードも膨らまないし。もしそれ以上になって自動生成に頼りたくなるのならクラス間の依存関係に別の問題があるんじゃなかろうか。

# 参考
- https://projectlombok.org/features/constructor
- https://keyboardplaying.org/blog/2022/04/spring-constructor-dependency-injection-lombok/
[ABC397] ABC 397(Atcoder Beginner Contest)のA~D(A,B,C,D)問題をPythonで解説(復習)

# [ABC397] ABC 397(Atcoder Beginner Contest)のA~D(A,B,C,D)問題をPythonで解説(復習)

# A問題
- `float` で受け取る。
```A.py
"""
<方針>
- `float` で受け取る。
"""
# 入力
X = float(input())

if(38.0<=X):
  print(1)
if(37.5<=X<38.0):
  print(2)
if(X<37.5):
  print(3)
```

# B問題
- 連続しているところの間に文字を挿入して調整してあげれば良い。
- 最初と最後に番兵を入れることで、最初と最後の条件を気にしない方針にする。
```B.py
"""
<方針>
- 連続しているところの間に文字を挿入して調整してあげれば良い。
- 最初と最後に番兵を入れることで、最初と最後の条件を気にしない方針にする。
"""
# 入力
S = list(input())

# 番兵
S = ["o"] + S + ["i", "o"]

# 答え
ans = 0

# 間に入れる文字
cnt = 0

# 今までiかどうか
isI = True

# 順番に見ていく
for s in S:
  # 今までiかどうかと現在iかどうか
  if(isI == (s == "i")):
    # 連続した回数を増やす
    cnt += 1
  else:
    # 間に文字を入れる数を増やす
    ans += cnt
    # 今までの文字を反転する
    isI = not isI
    # 間に入れる文字を初期化する
    cnt = 0

# 出力
print(ans)
```

# C問題
## 方針
- 分割ごと `O(N)` に、それぞれの種類数を数えて `O(N)` いては、`O(N^2)` かかってしまう。
- 分割を変えるごとに、移動する数字は一つなので、うまく種類数を管理できれば、`O(N)` でいけそう。
  - それぞれの分割がそれぞれの数値をいくつ持つかを保持し種類数も管理する。
  - `0-1` の変動をしたときだけ、それぞれの種類数を変動させる。
## 前提
- `C`問題あたりで，`TLE`になる人は，制約条件を見る癖をつけよう．
- `A`と`B`問題では，基本的に制約条件を見ずにやっても解ける．
- しかし，`C`問題以降では，制約条件を見ないと必ず`TLE`すると思っても良い．
- 詳しい話は私の[352回の記事](https://qiita.com/mattsunkun/items/837444254f03e6105922) の`C`問題の解説に記したので，是非参照してほしい．
```C.py
"""
<方針>
- 分割ごと `O(N)` に、それぞれの種類数を数えて `O(N)` いては、`O(N^2)` かかってしまう。
- 分割を変えるごとに、移動する数字は一つなので、うまく種類数を管理できれば、`O(N)` でいけそう。
  - それぞれの分割がそれぞれの数値をいくつ持つかを保持し種類数も管理する。
  - `0-1` の変動をしたときだけ、それぞれの種類数を変動させる。
"""
# 入力
N = int(input())
A = list(map(int, input().split()))

# 左の数値を管理
cntL = 0
L = [0]*(N+1)

# 右の数値を管理
cntR = 0
R = [0]*(N+1)


# 最初は全て右側に値を入れる
for a in A:
  R[a] += 1
  # aという数値がRに現れたとき
  if(R[a] == 1):
    cntR += 1

# 答え
ans = -1

# 左から順番に左側に寄せる
for a in A:
  R[a] -= 1
  # aという数値がRから消えたとき
  if(R[a] == 0):
    cntR -= 1
  
  # aという数値がLに現れたとき
  L[a] += 1
  if(L[a] == 1):
    cntL += 1
  
  # 更新
  ans = max(ans, cntR+cntL)

# 出力
print(ans)
```

# D問題
- 公式解説と一緒です。
```D.py
"""
<方針>
- 公式解説と一緒です。
"""
N = int(input())

# 二分探索を用いた二次方程式の解
def sol(a, b, c):
  l = 0
  r = N
  while abs(l-r)>1:
    mid = (l+r)//2
    if(a*mid**(2) + b*mid**(1) + c*mid**(0) <= 0):
      l = mid
    else:
      r = mid
  
  if(a*l**(2) + b*l**(1) + c*l**(0) == 0):
    return l
  else:
    return -1

for d in range(1, int(N**(1/3)) + 1):
  if(N%d != 0):
    continue
  
  m = N//d
  k = sol(3, 3*d, d**2 - m)
  if(k>0):
    
    print(k+d, k)
    exit()

print(-1)
```

# 補足
### 関係するリンク(参考文献など)
- [今回のコンテスト](https://atcoder.jp/contests/abc397)
- [D問題の公式解説](https://atcoder.jp/contests/abc397/editorial/12454)
### 筆者について
- [Atcoderアカウント](https://atcoder.jp/users/mattsunkun)
- *今回も不参加のため，成績なし．*
- [解説で示したA問題の提出](https://atcoder.jp/contests/abc397/submissions/63946455)
- [解説で示したB問題の提出](https://atcoder.jp/contests/abc397/submissions/63947477)
- [解説で示したC問題の提出](https://atcoder.jp/contests/abc397/submissions/63947835)
- [解説で示したD問題の提出](https://atcoder.jp/contests/abc397/submissions/63948147)
### その他
- **間違いを含んでいる可能性があります．**
- 方針と言いつつ，方針ではない感想などを書いている可能性があります．
- A問題から解説がだんだん省略されます．
- コードに書かれている解説の文言と，その上に書いてある解説の文言を変えている場合があります．
### 最後に一言
- 完璧なんてないよな。。。
- あ。あと就活頑張ります。
【ChatGPT】問診票と患者からさらに詳しい情報を引き出すためのPromptです。


　どうも、カーブミラーです。

　今回は、問診票と患者から、さらに詳しい情報を引き出すためのPromptです。

:::note info
本記事は、ChatGPT（Plus版）
で行なっております。
画像はありません。あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)
***
　こちらも載せますね。
　　[ChatGPTが使えない？ログインできない・反応しない原因やエラー時の対処法を解説](https://aismiley.co.jp/ai_news/chatgpt-error-resolution-explanation/)
***
　まずは、ニュースです。

　「小説家になろう」サイトで
　　DDoS攻撃が発生していることが
　　　確認されていました。
　　　　[小説家になろう公式ポスト](https://x.com/syosetu/status/1901977450655215859?t=A7Ff0180AeBVT76z7mrwrw&s=19)

　昨夜、22:20ごろ
　　復旧した、とのことです。
　　　[小説家になろう公式ポスト](https://x.com/syosetu/status/1902004809299067375?t=DuyVlQEkQ-J4dOYveyzVZA&s=19)

　2024年6月にも
　　同様のDDoS攻撃が発生し、
　　　6月17日には一次対処が
　　　　完了したものの、
　　　　　一部サービスが不安定な
　　　　　　状態となり、
　　　　　　　緊急メンテナンスが
　　　　　　　　実施されました。
　
　先日も
　　X-Twitterが
　　　攻撃を受けていましたね。

　みなさんのご利用のサービスの
　　データは､バックアップ済みですか❓
***
　次に

　ギャラップの世論調査によると、
　　米国人の35％余りが
　　　少なくとも週に１回、
　　　　ＡＩを搭載した製品を
　　　　　使用していると回答。
　　　　　　料金を支払うのを
　　　　　　　いとわない人も多い。

　[月３万円料金もいとわず－ChatGPTなどＡＩツール、米の一般人に浸透](https://www.bloomberg.co.jp/news/articles/2025-03-17/ST8MQ6T0AFB400)
***
　次に

　[生成AIに頼り過ぎるとバカになる…！米カーネギーメロン大学などが明らかにした「衝撃の調査結果」](https://news.yahoo.co.jp/articles/21fee9dc66abd3858289fc824cff57a674d7b3fd)

　この記事によると、
　　カーネギーメロン大学と
　　　マイクロソフト研究所の
　　　　共同チームが調査した結果、
　　　　　その傾向はある、そうだ。

　　6種類の知的能力について
　　　調査対象の知識労働者から
　　　　オンラインで回答を得た。

　　すると、
　　　全体の72パーセントが
　　　　「生成AIツールを使うことで
　　　　　(各種の知的能力を
　　　　　　発揮しようとする)
　　　　　　　努力(effort)が減少した」
　　　　　　　　と回答した。

　　つまり、
　　　生成AIに仕事を
　　　　任せることによって、
　　　　　調査対象者の多くは
　　　　　　これらの知的能力を
　　　　　　　発揮する努力を
　　　　　　　　しなくなってしまった｡
　　　
　　だが、ここでは
　　　評価する能力を
　　　　発揮する努力が
　　　　　増加した、との結果もある。

　　これは、
　　　生成AIが優れたツールだとしても
　　　　その出力にハルシネーションが
　　　　　含まれる可能性があり、
　　　　　　当然ながら、出力を
　　　　　　　評価しなければならない｡

　　その評価する努力が
　　　増加したのだ。

　　つまり、
　　　従来の「知識力」や
　　　　「分析力」などから、
　　　　　生成AIが出力する情報を
　　　　　　「評価」することへと
　　　　　　　仕事の比率が
　　　　　　　　傾いているのだ。

　記事を読んで、
　　生成AIを使う我々は、
　　　従来の能力を
　　　　新しい能力へと
　　　　　昇華する時代に
　　　　　　立っているのだ、と
　　　　　　　思いました。

***
　では、【本題】です。

　今回は、
　　問診票と患者から
　　　さらに詳しい情報を
　　　　引き出すためのPromptです。

　昨日（2025/03/18）は、
　　病院の問診票の内容の記入を
　　　事前に準備するための
　　　　Promptでした。

　[【ChatGPT】病院を訪ねた際に記入する問診票に書き写すために、事前にインタビュー形式で質問してもらうためのPromptです。](https://qiita.com/kabumira/items/449b6a9a96d9a7fde388)

　今回は、
　　出来た問診票をもとにして
　　　患者（ユーザー）から
　　　　必要な情報を引き出すための
　　　　　Promptになります。

　＊＊＊に問診票を入力・送信すれば、
　　医師からの質問として
　　　ChatGPTがやり取りしてくれます｡
```Text:問診票からさらに詳しい情報を引き出すためのPrompt
医師として、問診票をもとにして、ユーザーから必要な情報を引き出してください。
できれば、大きな項目ごとに質疑応答してください。まとめての質問は避けてください。多くの質問には答えられません。

下記は問診票です。  
＊＊＊
```

　これは、
　　昨日のような一問一答ではなく、
　　　大きな項目ごとに
　　　　尋ねてきますので、
　　　　　答えてください。

　終わりましたら
　　下記Promptで
　　　まとめてください。
```Text:医師への伝達まとめPrompt
医師に伝えるために、まとめてください。
```

　また、出力された内容は
　　必ず確認してください。
　　　間違いがあったり、
　　　　情報が足りないことも
　　　　　あります。

　その上で、
　　印刷するなり
　　　メモするなりして、
　　　　医師との診察に臨んでください｡

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
家計簿アプリを作る＃１８

![スクリーンショット 2025-03-19 154625.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/cc3a6d9d-9f14-4dfb-8722-e6d60147c01d.png)
PC用のDrawerでは、variant="permanent"とすることで、表示非表示は切り替わらず、常に固定で表示されます。

![スクリーンショット 2025-03-19 154815.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/789529f5-f1d0-4e76-bcd3-5594dfb0c742.png)
パソコン用のsxでは、モバイル用の逆にしている。


![スクリーンショット 2025-03-19 154952.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/507fcc86-2c19-49d2-8ff7-d5fa4cdc8a8a.png)
パソコン用とモバイル用には、Drawerの中に、｛drawer｝がありますが、それは、
const drawerの中の、Listを表してる↓
![スクリーンショット 2025-03-20 092356.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/b77544bb-3860-49a6-8e3d-7efccca7ebf9.png)
FTPエラー「425 Failed to establish connection.」


## 事象
コマンドプロンプトまたはPowerShellを使用してFTPコマンドで対象サーバーには接続できるが、```ls``` や ```get``` コマンドの応答がないという状況が発生しました。

表示されたメッセージは以下の通りです：

>200 PORT command successful. Consider using PASV.
>425 Failed to establish connection.

端末のOSはWindows 11でしたが、調査の結果、00年代や10年代の記事も多く見つかり、どうやらこのエラーは以前からWindows環境でよく見られる問題のようです。


## 解決策

- 「セキュリティが強化されたWindows Defenderファイアウォール」を開く
- 「受信の規則」セクションで、FTPコマンドがブロック（拒否）されている規則がないかを確認
- FTPコマンドがブロックされている規則があった場合、それを削除

私のケースでは、知らないうちにFTPコマンドをブロックする規則が追加されていました。特に心当たりはありませんでしたが、その規則を削除することで問題が解決しました。

逆に、FTPコマンドを許可する規則を新たに作成することで解決できる場合もあるようです。

https://nestblog.blog.fc2.com/blog-entry-53.html
【イベントレポート】はじめてでもわかる！web3の基礎講座＆簡単ワークショップ

![LiON_20250318.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810512/eb08c401-7c68-46a6-a9ef-a978a020b1da.png)


## はじめに
こんにちは、エンジニアコミュニティ LinuC Open Network （LiON）の運営事務局に参加させていただいております伊藤です！

今回は、3月18日に開催したLiON主催のイベント「はじめてでもわかる！web3の基礎講座＆簡単ワークショップ」について、その様子をレポートします。

connpassのイベントページはこちら。
https://lion.connpass.com/event/345978/

## イベント概要
今回のイベントは、ITエンジニアの成長と活躍を促すコミュニティ「LinuC Open Network（LiON）」が主催するイベントで、どなたでもご参加いただけるものです。講演を聴くだけではなく、ワークショップや懇親会も組み合わせた全員参加型イベントとなっております。LiONでは、こうした交流イベントをリアルとオンラインを交互に毎月開催しています。

今回のイベントは、「はじめてでもわかる！web3の基礎講座＆簡単ワークショップ」と題し、ゲストにTIS株式会社　Web3ビジネス企画部　倉持健史 氏を迎えてお届けしました。


## イベントの様子
当日の様子をご紹介します。
年度末のせいか、あるいはweb3というテーマが敷居が高かったせいか、、今回は少人数での開催となりました。

![LiON_20250318_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810512/9bfde977-8627-40eb-b843-561bb803eddb.jpeg)


### web3活用分科会の紹介
まずは、この度LiONで新たに立ち上げられた、「web3活用分科会」についての紹介がなされました。

web3のコア技術であるブロックチェーンは複数のオープンソース技術の複合体と言えます。これからのITエンジニアにとって、この新しい技術のキャッチアップが益々重要になっていきます。そこで、ITエンジニアがweb3に関する最新の技術動向を学び、具体的なユースケースを共有する場として、「web3活用分科会」の活動をスタートするとのことです。

これからweb3についてもしっかりキャッチアップしていきたいというライトな方にも、大変ありがたい場になりそうですね。

### Web3 基礎講座
web3基礎講座として、web3の背景や概要、基本的なキーワードや考え方について、説明していただきました。

私自身は多少勉強したこともあったので、なんとなく知っていたような感じではありましたが、これを機に改めて整理して理解することができました。また、最新の状況などもキャッチアップでき、短い時間ではありましたが非常に良いインプットの機会となりました。

### Web3 ワークショップ
続いてワークショップでは、実際にウォレットを作成し、トークンの受け取りや、NFTの獲得、そしてNFTを保有していることで特定の情報やアプリケーションにアクセスできるようになるというユースケース体験をさせていただきました。

理屈ではわかっていたことも、実際に体験してみると改めて感動があります。どのような用途に活用できるだろうかというアイデアの議論もより楽しくなるのを感じました。

### 交流会
勉強のあとは、LiON恒例の交流会へ突入。疑問に感じたことを直接質問したり、分科会の今後の活動について意見交換したり。あとは暗号資産の運用に関する裏話なんかも聞くことができ、いろいろな意味で視野が広がりますね。


## おわりに
エンジニアコミュニティ LiONが開催した3月のイベントについてレポートさせていただきました。LiONでは毎月このようなイベントを開催していますし、slackでエンジニア同士の交流が可能です。そして、エンジニアならどなたでも無料でご参加いただけます。興味を持っていただいた方は、ぜひLiONに参加してみてください。

LinuC Open Network で皆様とお会いできるのを楽しみにしております。


https://linuc.community/
Terraform を使った Kubernetes クラスタの構築


## はじめに

Kubernetes（K8s）を複数台のクラスタ構成で運用する際、インフラのコード化は欠かせません。本記事では、Terraform を使用して Kubernetes クラスタを構築する方法を紹介します。

Terraform は、クラウドプロバイダ（AWS, GCP, Azure など）を問わず、一貫した IaC（Infrastructure as Code）管理を可能にします。これにより、Kubernetes のマスターとワーカーノードを含むクラスタを簡単に作成し、運用することができます。

---

## 1. クラウド環境の選定

Terraform では、クラウドごとに異なる Provider を利用できます。以下に代表的なクラウドプロバイダを示します。

- **AWS**（Amazon Web Services）：EKS（Elastic Kubernetes Service）
- **GCP**（Google Cloud Platform）：GKE（Google Kubernetes Engine）
- **Azure**（Microsoft Azure）：AKS（Azure Kubernetes Service）

本記事では、AWS を例に Kubernetes クラスタを構築する Terraform の設定を紹介します。

---

## 2. AWS 上で Kubernetes クラスタを構築する Terraform コード

### 2.1 事前準備

Terraform の実行には以下のものが必要です。

- AWS CLI（認証情報の設定）
- Terraform CLI
- IAM ロール & ポリシー（EKS の操作に必要）

まず、Terraform のプロバイダ設定を行います。

```hcl
provider "aws" {
  region = "us-west-2"
}
```

### 2.2 VPC の作成

Kubernetes クラスタをデプロイするための VPC とサブネットを定義します。

```hcl
resource "aws_vpc" "k8s_vpc" {
  cidr_block = "10.0.0.0/16"
  enable_dns_support = true
  enable_dns_hostnames = true
  tags = { Name = "k8s-vpc" }
}

resource "aws_subnet" "k8s_subnet" {
  vpc_id     = aws_vpc.k8s_vpc.id
  cidr_block = "10.0.1.0/24"
  availability_zone = "us-west-2a"
}
```

### 2.3 EKS クラスタの作成

EKS クラスタのリソースを作成します。

```hcl
resource "aws_eks_cluster" "k8s_cluster" {
  name     = "k8s-cluster"
  role_arn = aws_iam_role.eks_role.arn
  vpc_config {
    subnet_ids = [aws_subnet.k8s_subnet.id]
  }
}
```

### 2.4 ワーカーノードの作成

EKS クラスタにワーカーノードを追加するためのノードグループを作成します。

```hcl
resource "aws_eks_node_group" "worker_nodes" {
  cluster_name    = aws_eks_cluster.k8s_cluster.name
  node_group_name = "k8s-workers"
  node_role_arn   = aws_iam_role.worker_role.arn
  subnet_ids      = [aws_subnet.k8s_subnet.id]

  scaling_config {
    desired_size = 2
    min_size     = 1
    max_size     = 3
  }
}
```

---

## 3. Terraform の適用

設定が完了したら、以下の手順で Terraform を適用します。

```sh
terraform init
terraform plan
terraform apply -auto-approve
```

Terraform が完了すると、EKS クラスタとワーカーノードが作成されます。

---

## 4. Kubernetes クラスタの確認

作成した Kubernetes クラスタに接続するには、`aws eks` コマンドを使用して kubeconfig を更新します。

```sh
aws eks update-kubeconfig --name k8s-cluster --region us-west-2
kubectl get nodes
```

このコマンドでノードが表示されれば、EKS クラスタのデプロイが成功しています。

---

## 5. 運用のポイント

- **Terraform の状態管理**：リモートバックエンド（S3 + DynamoDB）を利用する
- **ノードのスケーリング**：`aws_eks_node_group` の `scaling_config` を適切に設定
- **セキュリティ**：IAM ロールを適切に管理し、必要なポリシーを付与
- **監視**：CloudWatch や Prometheus でメトリクスを監視

---

## 6. まとめ

本記事では、Terraform を使用して AWS 上に Kubernetes クラスタを構築する方法を紹介しました。

- Terraform を使えば Kubernetes クラスタをコード化して管理できる
- VPC、EKS クラスタ、ワーカーノードを Terraform で定義
- `terraform apply` でクラスタをデプロイし、`kubectl` で管理可能

マルチクラウド環境やオンプレミスでの Kubernetes 運用も、Terraform を使えばスムーズに管理できます。ぜひ試してみてください！
サンプルホールド回路と遅れ要素のシミュレーション


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/ca9831a6-cb4d-44b8-a243-39168201f8c2.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/b2421f77-d6c4-4b95-b8c6-339e02d4f36b.png)
IntelliJ IDEAでlombokが生成したソースコードを見る

# version
- IntelliJ IDEA 2024.1
- Lombok plugin 241.14494.240

# 方法
## コンパイルしたclassファイルを開く
`build\classes\java\main` あたりにclassファイルがあるのでそれを開く。

![hogehogehoge.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31934/e97f29a4-389e-4dbe-940e-7552c55b66bd.jpeg)

## Refactorを使う
Refactor -> Delombokで生成されるソースコードに書き換えられる。注意点として、Refactorなのでソースコードを書き換えてしまうので、単に参照したいだけの場合は注意が必要。

![hasfde.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31934/89d87848-24e3-4822-9da5-bdc37cd3e9d4.jpeg)

# 参考
- https://stackoverflow.com/questions/36526286/view-lombok-generated-code-in-intellij-idea
フリートマネージャを経由したRDP接続では日本語入力ができない仕様

# 前置き
WindowsサーバにRDP（リモートデスクトップ）接続するのにAWSではSystems Managerの機能の一部であるフリートマネージャが便利。

フリートマネージャ経由で接続する際には、対象サーバのセキュリティグループのインバウンドルールにポート番号3389の許可は必要がなく、アウトバウンドルールでHTTPS通信ができればOK。

# 問題発生

しかしながら、Windowsサーバ上で日本語入力ができないという事態に直面した。

# 結論
以下の公式ドキュメントに記載があるようにフリートマネージャ経由でのRDP接続では、英語入力のみがサポートされている仕様のようだ。
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/fleet-manager-remote-desktop-connections.html

便利なフリートマネージャだが、欠点もあるんですね。