OmniAICreator/Qiita-1.07M huggingface dataset:
ROS2でLOCALHOST_ONLYが動かないときの備忘録

# 前提
少し大きめのプロジェクトを作成していたらネットワークの汚染がひどくなってきたのでROS_LOCALHOST_ONLY=1にしたら謎のエラーが出てノードが起動しなくなった。にゃんこ


エラー内容(一部抜粋)
```
selected interface "lo" is not multicast-capable: disabling multicast
Failed to find a free participant index for domain 0multicast-capable: disabling multicast

[rmw_cyclonedds_cpp]: rmw_create_node: failed to create domain, error Error

[rcl]: Failed to fini publisher for node: 1
```

# 環境
OS: Ubuntu22.04
ROSバージョン：ROS2 Humble

# 解決策

どうやらcycloneddsの設定をいじると解決するらしい。自分自身も理解できていないので設定は自己責任で。
ネットの情報をもとに以下のファイルを作成した
```xml:~/CycloneDDS/config.xml
<CycloneDDS>
  <Domain>
    <General>
      <AllowMulticast>false</AllowMulticast>
    </General>
    <Discovery>
      <ParticipantIndex>auto</ParticipantIndex>
      <MaxAutoParticipantIndex>1000</MaxAutoParticipantIndex>
    </Discovery>
 </Domain>
</CycloneDDS>
```

これで先ほどのエラーは解消できたが面倒なのでaliasをbashrcに追記した。

```
alias localonly='export ROS_LOCALHOST_ONLY=1 && export CYCLONEDDS_URI="file://$HOME/CycloneDDS/config.xml"'
```

おわり
Spring 環境別設定ファイル管理をグループで改善する


- 機械翻訳を通じて作成しているため、誤字脱字があるかもしれません


# 改善前の様子
以前は各環境ごとに個別の設定ファイルを作成して使用しておりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3815412/efb88e00-8f5e-4133-ae5d-b662756cd7d2.png)

以下のように、個別のプロファイルファイルを活用して管理しておりました。

```yaml
application.yml
application-dev.yml
application.prod.yml
```
このようにオーバーライドを通じて管理した場合、以下のような問題がございました.

```yml
# application.yml
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
```
```yml
# application-dev.yml
spring:
  datasource:
    username: dev_user
    password: dev_pass
```
```yml
# application-prod.yml
spring:
  datasource:
    username: prod_user
    password: prod_pass
```

1. 新しい機能が追加されるたびにこのリストを修正する必要があり、そのために休眠エラーがしばしば発生しておりました
2. 各環境ごとに同一の設定値の場合、重複が発生し、後にその重複した値が修正される際、全てのファイルの設定値を探して変更しなければならないという不便がございました
3. また、prod、devの設定ファイルが、プロジェクトの成長に伴い非常に長くなってしまう問題がございました


# 改善方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3815412/15ba2338-65ac-4055-ae59-16f2ae661d17.png)

このような問題を解決するために、私は **設定グループ(group)** を活用する方式に切り替えました。

このように切り替えることにより、

1. 共通して使用される設定値を別のグループにまとめて管理することで、各環境ごとに重複した設定を繰り返し記述する必要がなくなりました
2. 設定値が変更された際、該当するグループのみを修正すればよいため、保守性が向上いたしました
3. すべての設定を一目で把握できるようになり、可読性が向上いたしました
オライリー学習プラットフォーム オライリー・ジャパン 2025年発行書籍有無（2/27時点）

<strong>3/7（42%）</strong>
<table style="border-collapse: collapse; width: 100%; height: 315px;" border="1">
<thead>
<tr style="height: 45px;">
<td style="width: 57.009%; height: 45px;">書籍名</td>
<td style="width: 25.8738%; height: 45px;">発行日</td>
<td style="width: 17.1171%; height: 45px;">Learning有無</td>
</tr>
</thead>
<tbody>
<tr>
<td style="width: 57.009%;">
<div>
<div>ダイナミックリチーミング 第2版</div>
</div></td>
<td style="width: 25.8738%;">2025/3/26</td>
<td style="width: 17.1171%;"></td>
</tr>
<tr style="height: 45px;">
<td style="width: 57.009%; height: 45px;">
<div>
<div>クラウドFinOps 第2版</div>
</div></td>
<td style="width: 25.8738%; height: 45px;">2025/3/19</td>
<td style="width: 17.1171%; height: 45px;"></td>
</tr>
<tr style="height: 45px;">
<td style="width: 57.009%; height: 45px;">
<div>
<div>Gitハンズオンラーニング</div>
</div></td>
<td style="width: 25.8738%; height: 45px;">2025/2/5</td>
<td style="width: 17.1171%; height: 45px;"></td>
</tr>
<tr style="height: 45px;">
<td style="width: 57.009%; height: 45px;">
<div>
<div>UXデザインの法則 第2版</div>
</div></td>
<td style="width: 25.8738%; height: 45px;">2025/1/29</td>
<td style="width: 17.1171%; height: 45px;"></td>
</tr>
<tr style="height: 45px;">
<td style="width: 57.009%; height: 45px;">
<div>
<div>入門 OpenTelemetry</div>
</div></td>
<td style="width: 25.8738%; height: 45px;">2025/1/23</td>
<td style="width: 17.1171%; height: 45px;">○</td>
</tr>
<tr style="height: 45px;">
<td style="width: 57.009%; height: 45px;">クリーンコードクックブック</td>
<td style="width: 25.8738%; height: 45px;">2025/1/18</td>
<td style="width: 17.1171%; height: 45px;">○</td>
</tr>
<tr style="height: 45px;">
<td style="width: 57.009%; height: 45px;">マルチテナントSaaSアーキテクチャの構築</td>
<td style="width: 25.8738%; height: 45px;">2025/1/17</td>
<td style="width: 17.1171%; height: 45px;">○</td>
</tr>
</tbody>
</table>
&nbsp;
rex0220 印刷屋プラグイン QRコード表示

[rex0220 印刷屋プラグイン](https://qiita.com/rex0220/items/9be2d9b20a3a1f016c76)で、QRコードを表示してみます。

# 概要

[rex0220 印刷屋プラグイン テーブル複数ページ](https://qiita.com/rex0220/items/f65825f7f6dc73ee321c)に、QRコードを追加しています。

今回の QRコードは、名称を google 検索する URL です。
URL("https","www.google.com/search?q="&名称)

#{&q()} で、囲んだテキストを QRコードに変換し、img として配置します。

\<img src="#{&q(abc)"}\>

![2025-02-27_21h07_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/47bb755c-5117-4ff4-9da6-4858d9738134.png)

- プレビューイメージ

![2025-02-27_21h16_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/4b33f1cb-2aca-484d-b4c3-1256e0fcd1cd.png)


# 印刷屋プラグイン設定

![2025-02-27_21h11_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/56643174-78dd-4cae-9f0b-c4ba57adfb59.png)

![2025-02-27_21h12_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/06d186d2-d744-483c-a60f-04d1a94be262.png)

```css:
.row-no,
.value-image {
  text-align: center;
}
.pcraft-table-td-value {
  max-width: 300px;
}
.pcraft-table-td-value img {
  width:150px;
}
```

```js:
TABLE_HTML(テーブル,
  OPT("title","時計","pagination","Y"),
  OPT("perPage","5"),
  ARRAY("#",ROWNO(テーブル)+1,"row-no"),
  名称,
  ARRAY("QR", "<img src='#{&q(" & URL("https","www.google.com/search?q="&名称) & ")}'>", "value-image"),
  ARRAY("画像", IMGSRC(添付ファイル,0,"img"), "value-image")
)
```
UbuntuサーバーにDockerをインストールする手順

# はじめに
- この記事では**UbuntuサーバーにDockerとDocker ComposeをインストールしてDocker Composeでコンテナを起動するところまでの設定方法**を記述します。

# 設定手順
- **システムのアップデートと必要パッケージのインストール**
Dockerのインストールに必要なパッケージをインストールします。
```bash
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg lsb-release
```

- **Docker公式のGPGキーを追加する**
Dockerリポジトリを安全に利用するため、公式GPGキーを取得して登録します。
```bash
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
```

- **Dockerのリポジトリを追加する**
安定版リポジトリをシステムに追加します。
```bash
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```

- **Docker Engine と Docker Composeプラグインのインストール**
リポジトリを追加した後、再度パッケージリストを更新し、必要なパッケージをインストールします。
```bash
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
```

- **現在のユーザーをdockerグループに追加する**
dockerコマンドをsudoなしで実行できるよう、ユーザーをdockerグループに追加します。
```bash
sudo usermod -aG docker $USER
```
:::note warn
**グループ変更を反映させるため、ログアウトして再度ログインする必要があります**。
:::

- **Docker Composeでコンテナを起動する**
作業ディレクトリ（どこであっても構いません）にdocker-compose.ymlファイルを配置して、以下のコマンドでバックグラウンド実行でコンテナを立ち上げます。
```bash
docker compose up -d
```

# まとめ
- 今回はUbuntuサーバーでのDockerのインストール手順をまとめました。
優秀な回答

# はじめに
DeepSeekに質問したら、予想以上に優秀な回答が帰ってきたので、共有しときます :P

**素晴らしい学習意欲を感じさせるプロンプト**を入力しました。

↓以下、すげーやつ

<details><summary>※「すげーやつ」とは！？</summary>
ひらくな
</details>


素晴らしい意欲ですね！JavaScript/TypeScriptを中心に、あなたのスキルアップに役立つGitHubリポジトリを厳選しました。プロジェクトタイプや学習ポイント別に分類しています。

### 1. **フロントエンド/Next.jsのベストプラクティス**
- **[vercel/next.js](https://github.com/vercel/next.js)**  
  Next.js本体のリポジトリ。公式サンプル集（examplesディレクトリ）が特に勉強になります。先進的なSSR/SSGパターンやAPIルートの実装を学べます。

- **[leerob/leerob.io](https://github.com/leerob/leerob.io)**  
  Vercelエンジニアの個人サイト。Next.js App Router、MDX、Contentlayerなどを活用したモダンな実装例。

- **[shadcn-ui/ui](https://github.com/shadcn-ui/ui)**  
  Radix UIとTailwind CSSを組み合わせたモダンなコンポーネントライブラリ。TypeScriptベースのエレガントな実装が参考になります。

### 2. **フルスタックアプリケーション**
- **[t3-oss/create-t3-app](https://github.com/t3-oss/create-t3-app)**  
  Next.js + Prisma + tRPCのT3スタックボイラープレート。モダンなフルスタック構成を学ぶのに最適。

- **[calcom/cal.com](https://github.com/calcom/cal.com)**  
  OSSの予約管理システム。複雑なカレンダー機能の実装（あなたのタスク管理アプリの参考に）、Next.js + Prisma + Tailwindの実践例。

### 3. **API連携 & ツール開発**
- **[googleapis/google-api-nodejs-client](https://github.com/googleapis/google-api-nodejs-client)**  
  Google API公式クライアント。あなたのGoogle Tasks連携アプリの改善に役立つ実装パターンが学べます。

- **[transitive-bullshit/nextjs-notion-starter-kit](https://github.com/transitive-bullshit/nextjs-notion-starter-kit)**  
  Notion API連携の優れたサンプル。CMS連携アプリの参考になります。

### 4. **テスト & 自動化**
- **[microsoft/playwright](https://github.com/microsoft/playwright)**  
  モダンなE2Eテストフレームワーク。Selenium経験者ならテスト自動化の新しいアプローチを学べます。

### 5. **UI/UXデザインシステム**
- **[mantinedev/mantine](https://github.com/mantinedev/mantine)**  
  モダンなReactコンポーネントライブラリ。アクセシブルなUI実装のベストプラクティスを学べます。

- **[radix-ui/primitives](https://github.com/radix-ui/primitives)**  
  Headless UIコンポーネントの実装。コンポーネント設計の深い理解に役立ちます。

### 6. **TypeScriptマスター**
- **[type-challenges/type-challenges](https://github.com/type-challenges/type-challenges)**  
  TypeScript型パズルで型システムを深く理解。上級者向け。

- **[total-typescript/typescript-generics-workshop](https://github.com/total-typescript/typescript-generics-workshop)**  
  ジェネリクスの実践的な活用方法を学習。

### 学習方法のアドバイス
1. **コードの読み方**  
   `src`ディレクトリから主要コンポーネントを追い、機能単位で分析。コミット履歴で実装プロセスを追跡。

2. **Issue/PRチェック**  
   バグ修正や新機能追加の議論から、実務的な問題解決手法を学べます。

3. **「Good First Issue」フィルタ**  
   コントリビューション経験を積むことで、実践的なスキルが身につきます。

### 検索テクニック
GitHubの検索で `language:TypeScript stars:>1000` のようなフィルタを使い、最近更新されている（activeな）リポジトリを探すのがおすすめです。

あなたのこれまでのプロジェクト経験を活かしつつ、これらのリポジトリからモダンな設計パターンやベストプラクティスを吸収してみてください。特に状態管理（Zustand/Jotai）やAPI設計（tRPC）、型安全な開発（Prisma）などのテーマに注目すると、スキルアップが加速すると思います！

# 最後に
すごいですねー（棒）

以上です。
最後まで読んでくれてありがとう！
JP1/Network Node Manager i ついて

## はじめに
私が案件先で、JP1/Network Node Manager iを使用しているので、JP1/Network Node Manager iがどういうものなのか、どんなことができるのかまとめてみました。


## JP1/Network Node Manager iとは
ネットワーク全体をマップ化して一元管理し、迅速な障害対応を実現できる製品となっております。


## 主にどんなことができるのか
主にJP1/Network Node Manager iにてできることについては登録されたネットワーク上のノードを自動で検出し、ネットワーク構成・状態を把握でき、ノード状態が変化した際には、アラートを上げることやネットワーク機器のリソース情報の確認などもできます。
そのためネットワークリソースの利用状況の推移をグラフ表示して、障害の予兆を把握することもできます。
また、ネットワーク製品はいろんな機器と接続しており、ネットワークの状態を確認する際には容易に確認できない状況があると思いますが、JP1/Network Node Manager iではネットワークノードの構成や状態をトポロジマップで表してくれて容易に把握ができるようになっております。そのため、ネットワーク障害が発生しても、障害起因の機器の検知のしやすさからスピーディに障害対応ができる製品になっております。

## おわりに
最後まで読んでいただきありがとうございました。
ネットワーク障害が発生するとネットワーク構成図を確認して、どの機器が原因なのか切り分けをするために、どこに何が繋がっているのか確認することがあり、いろんな箇所に線が引かれて重なったりしていることからわかりにくい時が多々ありますが、JP1/Network Node Manager iがあると登録されたネットワークのマップ化、ノードの状態確認、問題が発生した際のネットワークの確認のしやすさから障害起因の機器の切り分けや対応がスムーズに行えてとても便利なシステムだと思い今回説明させていただきました。
PyCharm ProfessionalでJupyter Notebookを触ってみよう

## はじめに
Pythonと言うと最近ではAIであったりWebサービスも開発出来たりと用途が多岐に渡るため難しい言語なんじゃないか？
と言った懸念ってありますよねー。
いやいや... **Jupyter Notebook**を使用すれば簡単に触れちゃうんですよねー。

## Jupyter Notebookとは？
Pythonを気軽に実行出来ちゃうSandboxみたいな感じです。

## と言っても
Jupyter Notebookが動作する迄の環境構築がハードルが高いのです...
しかしながら... **PyCharm Professional**を使用すれば簡単に環境が出来ちゃうのです。

## 環境
環境は以下の通り(今回はPyCharm Professionalを使用します)
Python：3.12.4(※)
PyCharm Professional：[2024.3.3](https://www.jetbrains.com/ja-jp/pycharm/)
OS：Windows10

※…前提条件としてPythonの新しめのバージョンをインストールしておきましょう。(今回はPython 3.12.4を使用しています。)

## 環境構築
1. 初期画面で「新規プロジェクト」(①)を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1117785/56438db0-4020-4813-87d4-6c1a9a4d93bc.png)
2. 左のタブは「pure Python」(①)を選択し場所は適当(JupyterNotebookとします)に入力(②)しインタープリターのタイプは「プロジェクトのvenv」(③)を入力しPythonバージョンは3.12(④)を選択し作成を押下(⑤)します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1117785/ad36b5d5-14a5-402b-8942-eddb47b04809.png)
3. Jupyter Notebookの環境が作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1117785/12151293-eda8-4cb1-a2a8-070808876bd4.png)
4. 一番上の階層(JupyterNotebook)でマウスを右クリックをし「新規」(①)→「Jupyterノートブック」(②)を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1117785/d4b6756b-baa5-4b7c-b5ac-5384423d1692.png)
5. 新規Jupyterノートブックには適当に名前(ここではtestとします)を入力(①)しenterを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1117785/5487bade-b2f4-46b4-9261-03e66165fdaf.png)
6. Jupyter Notebookの元ネタが出来ました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1117785/eb2d4739-afdb-4eed-889a-018fb3b30330.png)
7. セル(①)にPythonの以下ソースコードを記載してみましょう
```test.py
aaa = 1
aaa += 1
print(aaa)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1117785/38a7b5e9-a5e5-47b0-9a27-7defdb88fae5.png)
8. コードを実行する準備が出来ました。「▷」(①)を押下してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1117785/5fa07344-724d-438f-97d3-358ae2e1cc0f.png)
9. Jupyter Notebookがインストールされる迄暫しお待ち下さい...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1117785/be5bc60d-c06d-4f9b-bf82-ff0c0456bc91.png)
10. Jupyterサーバーが起動(①)されソースコードが実行された事(②)が分かります。結果についても表示(③)されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1117785/666413c0-42c1-4f03-a6a5-442983d599a0.png)

## さいごに
如何でしょうか？
PythonについてもJupyter NotebookとPyCharm Professionalを使う事により
驚く程の手軽さを味わえたと思います。

皆様もPythonを気軽に触ってみて下さいねー。
Electronの子プロセスで、Expressサーバーを起動する

## ◾️ はじめに
　現在、Electron + Vue + TypeScript を使ってアプリケーションを開発しています。
その中で、Electronの子プロセスで、Expressサーバーを起動する実装に苦戦したため、同じ問題で悩んでいる方の助けになればと思い、この記事を書きました。
参考になれば幸いです。
※今回は **Electronの概要についての説明は省略**します。

### 📂 ディレクトリ構造
```
electron
　|- server
　|　 |- server.ts
　|- main.ts
```

## ◾️ やりたかったこと
　Electronのメインプロセスとは別に子プロセスを作成し、サーバーを起動したい！

## ◾️ 問題点
　最初に、Node.jsの`child_process.spawn()`を使用して子プロセスを起動しようとしました。
しかし、`spawn()`**を使用した際、サーバーが正常に起動しない**という問題が発生しました。

### ❌ `spawn()`を使った場合の問題点
`child_process.spawn()`を使用すると、**Electronのメインプロセスとは完全に独立したプロセス**としてサーバーが起動してしまうため、以下の問題が発生しました。


**1.サーバーが起動しない**
`spawn()`でserver.tsを実行しようとすると、サーバーが正常に動作しませんでした。
`stdio: 'inherit'`を設定してもログが出力されず、原因の特定が難しかったです。

:::note info
**stdio: "inheritとは**
子プロセスの標準入出力（stdin, stdout, stderr）を親プロセスと共有する。
→ 子プロセスのログやエラーメッセージがそのまま親プロセスのコンソールに出力される。
:::

**2.メインプロセスと通信できない**
`spawn()`で起動したサーバープロセスは完全に独立したプロセスになるため、Electronのメインプロセスと IPC 通信ができず、状態管理が難しくなりました。

**3.Electronの終了時にサーバープロセスを制御しづらい**
`detached: true`を設定すると、Electronを終了してもサーバープロセスが生き続ける可能性があります。

:::note info
**detached: trueとは**
親プロセス(Electron)と子プロセス(サーバー)の紐付けを解除し、完全に独立したプロセスとして動作させることができる。
:::

## ◾️ 解決策
`child_process.fork()`を使用することで、期待通りの動作を実現できました✨

`child_process.fork()`は、**Node.jsのモジュールとして別プロセスを起動**するため、`spawn()`とは異なり、**Electronのメインプロセスと同じNode.js実行環境を引き継ぎます。**

その結果、`server.ts`の依存関係や環境の違いによる問題が発生せず、`fork()`を使用することで正常にサーバーを起動できました。

一方で、`spawn()`を使用すると、**完全に独立したプロセス**として起動されるため、**Electronの実行環境を継承できず、サーバーが正しく動作しなかった**のだと考えられます。


## ◾️ 実装方法
Express を使って、シンプルなローカルサーバーを作成します。
```server.ts
import express from 'express'
import log from 'electron-log'

const PORT = 9090
const server = express()

// サーバー起動
server.listen(PORT, () => {
  log.info(`Local server started at http://localhost:${PORT}`)
})
```

```main.ts
import { app, BrowserWindow } from 'electron'
import * as path from 'path'
import { fork } from 'child_process'

let mainWindow: BrowserWindow | null
let serverProcess: any

// アプリケーションが準備完了になった時に実行
app.on('ready', () => {
　// サーバースクリプトのパスを取得
  const serverPath = path.join(__dirname, 'server/server.js')
  // 子プロセスとしてサーバーを起動
  const serverProcess = fork(serverPath, [])

　// メインウィンドウの作成
  mainWindow = new BrowserWindow({
    'width': 800,
    'height': 600,
    'show': true
  })
})

// すべてのウィンドウが閉じられたときに実行
app.on('window-all-closed', () => {
  // サーバープロセスが存在していたら終了させる 
  if (serverProcess) {
    serverProcess.kill()
  }
  // アプリケーションを終了
  app.quit()
})
```

## ◾️ 最後に
最後まで読んでいただき、ありがとうございます！同じように悩んでいる方の助けになれば嬉しいです😊
optunaしくじり備忘録2

## はじめに
前回Optunaを使ってハイパーパラメータの最適化を行っていた時に遭遇した問題について[optunaしくじり備忘録](https://qiita.com/cnysntry/items/483801235e0f0b3b2500)でまとめましたが、またOptunaを使用していてやってしまったことが増えてきましたので、再度まとめてみたいと思います。

### dropoutの最適化について
Optunaを使って、畳み込み層の数、全結合層のユニット数、ドロップアウト率の最適化を行ってみました。
これを実行すると以下のエラーが発生しました。

```python:Errorが発生するコード
def objective(trial):
    #セッションのクリア
    clear_session()

    num_layer = trial.suggest_int("num_layer", 2, 8)
    mid_units = int(trial.suggest_float("mid_units", 128, 512, step=128))
for i in range(num_layer)]
    dropout_rate = trial.suggest_float('dropout_rate', 0.0, 1.0, step=0.1)

    model = create_model(num_layer, mid_units, dropout_rate)
    model.compile(optimizer="adam",
          loss="categorical_crossentropy",
          metrics=["accuracy"])
```

**Trial 4 failed with parameters: {'num_layer': 8, 'mid_units': 256.0, 'dropout_rate': 1.0} because of the following error: ValueError('Exception encountered when calling Dropout.call().\n\n\x1b[1m\`rate\` must be a scalar tensor or a float in the range [0, 1). Received: rate=1.0\x1b[0m\n\nArguments received by Dropout.call():\n   inputs=tf.Tensor(shape=(None, 50, 50, 16), dtype=float32)\n  • training=True').**

最初は何が問題なのかよくわからなかったのですが、よくよく考えてみるとドロップアウト率が1.0ということは、すべてのノードを不活性化することになるので学習できなくなりますね。以下のように修正しました。

```python:Errorが発生するコード
def objective(trial):
    #セッションのクリア
    clear_session()

    num_layer = trial.suggest_int("num_layer", 2, 8)
    mid_units = int(trial.suggest_float("mid_units", 128, 512, step=128))
for i in range(num_layer)]
    dropout_rate = trial.suggest_float('dropout_rate', 0.0, 0.9, step=0.1)

    model = create_model(num_layer, mid_units, dropout_rate)
    model.compile(optimizer="adam",
          loss="categorical_crossentropy",
          metrics=["accuracy"])
```

### repeat関数って？
Optunaを使ってハイパーパラメータの最適化を行っていると、以下のようなWarningが出ることがあります。

**/usr/local/lib/python3.11/dist-packages/keras/src/trainers/epoch_iterator.py:107: UserWarning: Your input ran out of data; interrupting training. Make sure that your dataset or generator can generate at least `steps_per_epoch * epochs` batches. You may need to use the `.repeat()` function when building your dataset.**

Warningなのでそのまま続行することができるのですが、そうすると以下のような結果になることがあります。

**Trial 0 finished with value: 0.0 and parameters: {'num_layer': 2, 'mid_units': 512.0,  'dropout_rate': 0.1}. Best is trial 0 with value: 0.0.**

最適化の結果が0.0？なんかおかしい。先ほどのWarningも入力データを使い果たしている？repeat()関数を使う？とよくわからないアドバイスが。
最初見たときはさっぱり原因がわからなかったけど、どうもこれらのWarningは入力データ数（Trainingデータ数やValidationデータ数）にばらつきがある場合に出ることがあるようです。
Trainingデータ数、Validationデータ数を一定にすることにより上記のWarningは出なくなりました！
ブロックチェーンのL1とL2の違い

# はじめに
今回は、Web3.0において重要な技術であるブロックチェーンの中でも、L1（レイヤー1）ブロックチェーンとL2（レイヤー2）ブロックチェーンの違いについて、アウトプットします。
この記事は、こちらのnoteの記事を参考にしています。

https://note.ambitiousai.co.jp/n/na77372cb6cd1

# L1（レイヤー1）ブロックチェーンとは？
ビットコインやイーサリアムのような**メインのブロックチェーン**のことを指します。L1はすべての取引を直接記録し、分散型ネットワークによって管理されています。

### 特徴
✅セキュリティが高い（不正が難しい）
✅分散性が高く、ネットワーク全体で管理
❌取引が混雑すると遅くなる
❌手数料（ガス代）が高くなりがち

### 用途
- 高額送金
- NFT購入 など

### 代表例
- **ビットコイン**（Bitcoin, BTC）：歴史が長く、安全性が高い反面、スマートコントラクトの機能が限定的。
- **イーサリアム**（Ethereum, ETH）：スマートコントラクトが動く世界最大のL1ブロックチェーン。DeFiやNFTの基盤として機能している。
- **BNBチェーン**（BNB Chain, BNB）：Binanceが開発したL1で、取引手数料が安く、処理速度が速い。
- **ソラナ**（Solana, SOL）：高速処理が特徴のL1ブロックチェーン。ただし、ダウンタイム（停止）が発生しやすい。
- **アバランチ**（Avalanche, AVAX）：サブネット技術で、スケーラビリティを解決しようとしているL1ブロックチェーン。
- **ポルカドット**（Polkadot, DOT）：異なるブロックチェーンを接続する「パラチェーン」の仕組みを持つ。

# L2（レイヤー2）ブロックチェーンとは？
L1ブロックチェーンの負担を減らすために作られた**補助的なネットワーク**です。L2ブロックチェーンを活用すると、取引速度が向上し、手数料が安くなります。

### 特徴
✅取引スピードが速い
✅手数料が低い（L1よりも安い）
✅L1のセキュリティを利用可能
❌L1に資金を移動（ブリッジ）する必要がある

### 用途
- 少額決済
- 頻繁な取引 など

### 代表例
- **Arbitrum**（アービトラム）：イーサリアムのL2ブロックチェーン。ガス代を抑えつつ、トランザクション速度を向上。
- **Optimism**（オプティミズム）：Arbitrumと同じく、イーサリアムの拡張を目的としたL2ブロックチェーン。
- **Polygon**（ポリゴン）：イーサリアムのL2ブロックチェーンだが、独自のL1ブロックチェーンのような側面も持つ。

# おわりに
今回は、L1ブロックチェーンとL2ブロックチェーンの違いについてアウトプットしました。L1とL2のどちらで送金するかは、基本的にユーザーが選ぶことができます。しかし、使っているブロックチェーンやウォレット、取引所、対応アプリによってことなりｍ
Web三層構造

## Web三層構造とは

クライアントサーバシステムを3階層に分割して構築するシステム形態のこと

* プレゼンテーション層
* アプリケーション層
* データ層

※ クライアントサーバシステム: クライアント（ユーザー側）とサーバ（サービス提供側）がネットワークを介して相互に通信するアーキテクチャ

## 各層ごとの役割

### プレゼンテーション層
ユーザーインターフェース（見た目）を担う。ブラウザから受け取った｢閲覧要求｣をもとに、ページ情報を返すという役割を持っている

### アプリケーション層
ビジネスロジックを処理する部分。プレゼンテーション層(画面)に入力された値をもとに、何かしらの処理を行う役割を担う

※ ビジネスロジック:アプリケーションが特定のビジネスルールや要件に基づいてデータを処理するためのルールや手順
※ ビジネスルール:特定のビジネスプロセスや業務において守るべき規則や条件

### データ層
データ管理を行う部分。ページ情報をはじめ、サイトの構造や画像、その他あらゆる情報が詰め込まれている層。データベースにアクセスし、データの取得や保存を担当する

## 開発言語の代表例
### プレゼンテーション層
HTML、CSS 、JavaScript

### アプリケーション層
Python、Java、Perl、PHP、Ruby

### データ層
- SQL系
  - SQL
  - PL/SQL
- NoSQL系
  - MongoDB Query Language（MQL）
  - CQL（Cassandra Query Language）
  - Gremlin（グラフ型データベース用）

## サーバ構成
| サーバ                             | サーバの役割                          | 層                 |
|----------------------|--------------------------------------------------|----------------------------------|
| **Webサーバ**      | ユーザーと直接やり取りを行うサーバ。ユーザーからのリクエストを受け取り、ウェブページのデータ（HTMLやCSS、画像など）を送り返す役割を持つ | プレゼンテーション層 |
| **Webアプリケーションサーバ** | Webサーバからリクエストを処理し、必要なデータや処理結果を返すサーバ | アプリケーション層 |
| **データベースサーバ**                    | Webアプリケーションサーバからのリクエストに応じて、データの管理や処理を行うサーバ | データ層 |

## サーバの代表例

### Webサーバ
* Apache HTTP Server
* nginx
* Microsoft Internet Information Services (IIS)

### Webアプリケーションサーバ
* Apache Tomcat
* JBoss
* uWSGI
* Gunicorn

### データベースサーバ
* Oracle
* SQL Server
* MySQL
* PostgreSQL

## リクエストの流れ
1. クライアント(Webブラウザ)がWebサーバにリクエストを送信
2. Webサーバがリクエストを受け取り、適切な処理をWebアプリケーションサーバに転送
3. Webアプリケーションサーバがビジネスロジックを処理し、必要ならデータベースサーバーにデータを要求
4. データベースサーバがWebアプリケーションサーバーにデータを返す
5. Webアプリケーションサーバが取得したデータをもとに処理し、Webサーバーにレスポンスを送信
6. Webサーバはクライアント(Webブラウザ)にレスポンス（ページ情報やデータ）を送信

## メリット&デメリット

### メリット
- 分離性
  - 各層が独立しているため、変更が容易
- 再利用性
  - ビジネスロジックやデータアクセスを他のアプリケーションでも再利用可能
- スケーラビリティ
  - 各層を個別にスケールできるため、パフォーマンス向上が可能
- 保守性
  - 問題の特定がしやすく、修正が迅速に行える

### デメリット
* サーバを分離させることからハードウェアを複数用意しなければならず、その分コストがかかってしまう


## まとめ

Web三層構造はクライアントサーバシステムをプレゼンテーション層、アプリケーション層、データ層の3つに分割して構築するシステム形態のことです。
この構造により、変更が容易になり、再利用性を高めるなどのメリットが大きく、データ変更にも柔軟に対応が可能になります。
PingPongの使い方に

## PingPongの引数

```c#
Mathf.PingPong(t, length);
```

tは往復速度を表して

lengthは往復させる範囲を表している

**例えばlengthが3の場合**

|length|
|---|
|1|
|2|
|3|
|2|
|1|

1,2,3,2,1がひたすら繰り返される動きになる

tにTime.time割り当てる事で秒数ごとに処理ができる

(Time.timeとは実行してから経過している時間)

```c#
Mathf.PingPong(Time.time, 3);
```
上のコードの場合以下のような結果になる

|length|Time.time|
|---|---|
|1|1秒後|
|2|2秒後|
|3|3秒後|
|2|4秒後|
|1|5秒後|

# 使用例

動く壁
![無題の動画 ‐ Clipchampで作成 (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3836524/d8590ee1-6479-41d9-b27f-5d5f3ce5ae1d.gif)




## 最後に
機械的な動きをさせたいときに使うといい感じになりそう
single quote を含む here-document の変数代入がエラーとなる（macOS の /bin/bash）

こんにちは。
single quote を含む here-document の変数代入（下記例内の```don't```）が macOS の /bin/bash ではエラーとなることに気がつきました。

apostrophe にすべきと思いました。もしくは一旦変数に格納する回避法しか思いつきませんでした（```SINGLEQUOTE="'"```）。

```console
$ /opt/homebrew/bin/bash ./dont.sh
don't
$
$ /bin/bash ./dont.sh
./dont.sh: line 5: unexpected EOF while looking for matching `"'
./dont.sh: line 5: syntax error: unexpected end of file
$
$ cat dont.sh
#!/bin/sh
echo "$(cat << EOF
don't
EOF
)"
$
$ echo "$(cat << EOF
> don't
> EOF
> )"
> 
> bash: unexpected EOF while looking for matching `''
bash: syntax error: unexpected end of file
$
$ uname -mopr
Darwin 24.3.0 arm64 arm
$ /bin/bash --version
/bin/bash --version
GNU bash, version 3.2.57(1)-release (arm64-apple-darwin24)
Copyright (C) 2007 Free Software Foundation, Inc.
```
Flutter開発におけるTextThemeエラー解消ガイド

Flutterでアプリをビルドしようとした際、下記のようなエラーが発生した経験はありませんか？
```sql
Error (Xcode): lib/main.dart:28:11: Error: No named parameter with the name 'bodyText1'.
```
この記事では、このエラーの原因と解決策、そしてコード修正例について解説します。

## エラーの背景
Flutterでは、アプリのテーマ設定に`ThemeData`を利用します。以前は`TextTheme`内で以下のようにテキストスタイルを定義していました。
```
textTheme: const TextTheme(
  bodyText1: TextStyle(color: Colors.white),
  bodyText2: TextStyle(color: Colors.white),
),
```
しかし、Flutterのアップデートに伴い、`TextTheme`の命名規則が変更されました。

- `bodyText1` → `bodyLarge`
- `bodyText2` → `bodyMedium`

など、より意味を明確にする名前にリネームされています。このため、最新バージョンのFlutterで`bodyText1`というプロパティを使おうとすると、存在しないパラメータとしてエラーとなります。

## エラー原因の詳細
### なぜエラーになるのか？

- **APIの変更**
Flutterのバージョンアップにより、`TextTheme`のプロパティ名が変更されました。
- **互換性の問題**
古いプロパティ名（`bodyText1`など）はもはや有効ではなく、新しい命名規則に従っていないため、コンパイルエラーが発生します。

```pgsql
Error: No named parameter with the name 'bodyText1'.
```
このエラーメッセージは、`TextTheme`コンストラクタに`bodyText1`という名前のパラメータが存在しないことを示しており、テーマ設定の記述が最新の仕様に沿っていないことを示唆しています。

## 解決策
### 新しいTextThemeの命名規則に合わせる

以下のように、古いbodyText1やbodyText2の記述を新しいプロパティに変更します。

```dart
textTheme: const TextTheme(
  bodyLarge: TextStyle(color: Colors.white), // bodyText1 の代替
  bodyMedium: TextStyle(color: Colors.white), // bodyText2 の代替
),
```
このように修正することで、Flutterの最新バージョンで正しくテーマが適用され、コンパイルエラーが解消されます。

## 修正後のコード例
元々のコードの該当箇所を以下のように更新します。

```dart
class App extends StatelessWidget {
  const App({Key? key}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'title',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        scaffoldBackgroundColor: Colors.black,
        appBarTheme: const AppBarTheme(
          backgroundColor: Colors.black,
        ),
        textTheme: const TextTheme(
          bodyLarge: TextStyle(color: Colors.white),  // 更新: bodyText1 -> bodyLarge
          bodyMedium: TextStyle(color: Colors.white), // 更新: bodyText2 -> bodyMedium
        ),
      ),
      home: const AuthWrapper(),
    );
  }
}
```

## まとめ
- **問題の概要**
Flutterのバージョンアップにより、`TextTheme`のプロパティ名が変更され、`bodyText1`が存在しなくなりました。

- **原因**
古いAPIの使用による互換性の問題。

- **解決策**
新しい命名規則に合わせ、`bodyText1` → `bodyLarge`、`bodyText2` → `bodyMedium`に置き換えます。

このように修正することで、ビルドエラーが解消され、最新のFlutter APIを活用した開発が可能になります。
今後もFlutterのアップデート情報をチェックし、APIの変更に柔軟に対応することが重要です。
【Laravel 開発入門】フォームリクエストのバリデーション

# Laravelでバリデーションを実装する

Laravelのバリデーション機能は、フォーム入力の検証を簡単に行うことができる強力なツールです。本記事では、Laravelでのバリデーションの基本から、カスタムバリデーション、Bladeテンプレートでのエラーメッセージの表示方法までを解説します。

## 1. バリデーションの基本

### 1.1 バリデーションはどのように設定するのか？
Laravelのコントローラー内でバリデーションを行うにはRequestクラスの`validate` メソッドを使用します。

```php
public function store(Request $request)
{
    $validated = $request->validate([
        'name' => 'required|max:255',
        'email' => 'required|email|unique:users',
        'password' => 'required|min:8',
    ]);
    
    // バリデーション通過後の処理
}
```

上記の例では、`name` は必須で最大255文字、`email` は必須かつ一意であること、`password` は最低8文字であることをチェックしています。

## 2. カスタムエラーメッセージ

### 2.1 デフォルトのエラーメッセージを変更したい場合は？
デフォルトのエラーメッセージをカスタマイズするには、第二引数でメッセージ配列を渡します。

```php
$validated = $request->validate([
    'name' => 'required',
    'email' => 'required|email',
], [
    'name.required' => '名前は必須項目です。',
    'email.required' => 'メールアドレスは必須です。',
    'email.email' => '有効なメールアドレスを入力してください。',
]);
```

## 3. FormRequestを利用したバリデーション

### 3.1 バリデーションを別ファイルに分離したい場合は？
バリデーションロジックをコントローラーから分離するために、`FormRequest` を使用する方法があります。

#### 3.1.1 FormRequestの作成

```sh
php artisan make:request StoreUserRequest
```

#### 3.1.2 ルールの定義
作成された `StoreUserRequest` クラス内で、`rules` メソッドを定義します。

```php
public function rules()
{
    return [
        'name' => 'required|max:255',
        'email' => 'required|email|unique:users',
        'password' => 'required|min:8',
    ];
}
```

#### 3.1.3 コントローラーでの適用
コントローラー内で `Request` を `StoreUserRequest` に置き換えます。

```php
public function store(StoreUserRequest $request)
{
    // バリデーション済みデータが取得できる
    $validated = $request->validated();
    
    // データ保存の処理
}
```

## 4. Bladeテンプレートでのエラーメッセージの表示

### 4.1 バリデーションエラーをビューに表示するには？
バリデーションエラーがある場合、Bladeテンプレートでエラーメッセージを表示できます。

```html
@if ($errors->any())
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif
```

### 4.2 特定の入力項目のエラーメッセージを表示するには？
個別のフィールドごとのエラーメッセージを表示する場合は以下のようにします。

```html
<input type="text" name="name" value="{{ old('name') }}">
@if ($errors->has('name'))
    <span class="text-danger">{{ $errors->first('name') }}</span>
@endif
```

## まとめ

Laravelのバリデーションは簡単に実装できるだけでなく、カスタムルールやエラーメッセージの定義も柔軟に対応できます。特に `FormRequest` を活用することで、コントローラーのコードを整理し、可読性を向上させることが可能です。ぜひプロジェクトで活用してみてください！
Cloud Run + Next.js 上で Basic 認証

こちらも情報が少なかったので書いてみました。
※ セキュリティのリスクがあるため、本番でのBasic認証は避けましょう...！

## 実装

src/middleware.tsを作成します

```typescript: middleware.ts
export { default } from "next-auth/middleware";
import basicAuth from 'basic-auth';
import type { NextRequest } from 'next/server';

// ここに認証したいページを定義します
export const config = {
  matcher: [
    '/((?!api|static|.*\\..*|_next).*)',
  ],
};

export function middleware(req: NextRequest) {
  const credentials = basicAuth({ headers: { authorization: req.headers.get('authorization') || '' } });
  const username = process.env.BASIC_AUTH_USERNAME;
  const password = process.env.BASIC_AUTH_PASSWORD;

  if (
    !credentials ||
    !username ||
    !password ||
    credentials.name !== username ||
    credentials.pass !== password
  ) {
    return new Response('認証が必要です', {
      status: 401,
      headers: {
        'WWW-Authenticate': 'Basic realm="Protected Area"',
      },
    });
  }
}
```

あとは.envに下記の環境変数を設定するだけ！
```bash
BASIC_AUTH_USERNAME=<ユーザー名>
BASIC_AUTH_PASSWORD=<パスワード>
```

### 最後に

Basic認証は、簡単で便利ですがセキュリティとしてはリスクがあるため
長期運用する場合にはDigest認証、GCP の I AM 認証などを使うのをおすすめします。
「AI Code Agents 祭り」~ 2025 Winter ~の参加メモ

現状が整理される、大変面白いイベントでした。
取り急ぎ、Notion AIでシュッとまとめてもらった内容にて失礼します。

#### AI開発の変革
- AIエージェントの登場により、MVPレベルのものを短期間で構築できるようになり、開発のルールが大きく変わりつつある
- レベル1. プログラミング = マニュアル運転（楽しいし、趣味）、レベル2. LLM = オートマ運転、レベル3. エージェント = テスラ、自動運転、レベル4. MCP = SKYNET接続
- 開発の分業モデルが終焉し、AIエージェント同士が会話することでさらに効率が向上する（BtoB, BtoC → BtoA, AtoC, AtoA, etc）

#### 主要AIコーディングツール
- 現在はCursor、Windsurf、GitHub Copilotなどのブリッジ型ツールが主流だが、Devinのような完全自律型エージェントが今後普及していく
- 各ツールには特性があり、要件定義→デザイン→フロント→バック→テスト→デプロイの各フェーズで最適なAIエージェントを組み合わせる開発手法が効果的

#### WindsurfとCursorの思想の違い
- Cursor → Project Rules でルールを記憶させる、シンボル機能（`@File` や `@Web` など）で検索のコンテキストを指定する。多機能になってきた
- Windsurf → 検索や記憶は、操作履歴やコードベースなどからAIが自動で勝手に判断する。LLMの性能向上によって精度に磨きがかかる

#### 有志によるAIエージェントのOSS化
- Devin → OpenHands（API料金だけで使える）
- bolt.new → bolt.diy

#### 導入のメリットと課題
- AIエディタやエージェントを使うことで開発生産性が2〜5倍になるが、日本企業は海外に比べて導入が遅れている
- 企業での導入には信頼性・セキュリティの確保が必須で、完全自動化よりも段階的に導入してROIを確認する方法が現実的

#### 実践例と今後の展望
- AIエージェントを活用した月1のプロダクトリリースや、MCPを活用した業務効率化、非エンジニアによる分析業務の効率化などの成功事例が増えている
- AIの進化は急速で、今後数年でエンタープライズでの普及が進むため、今AIリテラシーを高めることが重要
[Serverless Computing Service][Managed Service] サーバーレスコンピューティングサービスとマネージドサービスの違い

# まとめ
| 項目 | サーバーレスコンピューティング | マネージドサービス |
|------|------------------|------------------|
| **インフラ管理** | 完全に不要（クラウドが管理） | ほぼ不要（部分的に管理） |
| **スケーリング** | 完全自動 | 自動 or 設定次第 |
| **課金モデル** | 従量課金制（コードが実行された分だけ課金） | 定額（リソース使用量ベース） |
| **適用範囲** | 関数単位のコード実行 | DB、Kubernetes、アプリ全体の管理 |
| **開発者の作業範囲** | コードのみ | 設定や最適化が必要 |
| **代表的なサービス** | `Azure Functions`, `AWS Lambda` | `Azure SQL Database`, `Amazon RDS`<br> `Azure Kubernetes Service`, `Amazon EKS`|

# 詳細
## サーバーレスコンピューティングサービスとは
- サーバーレス（Serverless）: 開発者がサーバーの管理を気にせずにコードを実行できるクラウドコンピューティングのモデル
- クラウドプロバイダーがインフラの管理、スケーリング、メンテナンスをすべて自動で行う

### 特徴
- **従量課金制**（コードが実行された分だけ課金）
- **自動スケーリング**（トラフィックに応じてリソースを自動調整）
- **インフラ管理不要**（開発者はコードに集中できる）

### 代表的なサービス
- **AWS Lambda**（Amazon Web Services）
- **Azure Functions**（Microsoft Azure）
- **Google Cloud Functions**（Google Cloud Platform）

## マネージドサービスとは
- マネージドサービス（Managed Service）: クラウドプロバイダーが運用・管理を代行するクラウドサービス
- ユーザーは基盤となるインフラを気にせず、設定や運用を簡単に行うことができる

### 特徴
- **運用・管理の負担軽減**（セキュリティ、スケーリング、アップデートなどをプロバイダーが管理）
- **柔軟なスケーリング**（多くの場合、自動でスケールアップ/ダウンが可能）
- **一部の管理は必要**（設定や最適化の作業はユーザーが行う）

### 代表的なサービス
- **Amazon RDS**（マネージドデータベース）
- **Google Kubernetes Engine（GKE）**（Kubernetesの管理を簡素化）
- **Azure App Service**（アプリのデプロイ・運用を簡単に）

## 選定基準
### サーバーレスを選ぶべきケース
- 短時間の処理（ETL、画像変換、APIバックエンドなど）
- インフラ管理を完全になくしたい場合
- トラフィックが変動するワークロード

### マネージドサービスを選ぶべきケース
- データベースやKubernetesクラスタの運用を簡単にしたい
- 常時稼働が必要なアプリケーション（Webアプリ、エンタープライズシステムなど）
- ある程度の設定・最適化を行いたい場合

# 参考リンク
- [サーバーレスとフルマネージド: その違いとは？](https://cloud.google.com/blog/ja/topics/developers-practitioners/serverless-vs-fully-managed-whats-difference?utm_source=chatgpt.com)
- [AWS でのサーバーレス](https://aws.amazon.com/jp/serverless/?utm_source=chatgpt.com)
- [サーバレスってなに？Alibaba Cloud, AWS, Azure, Google Cloud のサーバレスサービスを比べてみました](https://www.softbank.jp/biz/blog/cloud-technology/articles/202206/cloud-serverless-comparison/?utm_source=chatgpt.com)
- [マネージドサービス、コンテナ、サーバレス](https://digital-gov.note.jp/n/n9e0354fadc2d?utm_source=chatgpt.com)
【Laravelメモ】Eloquent で JOIN したテーブルの同名カラムを取得する方法

# Laravel Eloquent で JOIN したテーブルの同名カラムを取得する方法

Laravel Eloquent で `JOIN` を使用する際、異なるテーブルに同じカラム名がある場合、そのまま取得すると競合が発生します。この問題を回避するために、`SELECT` 文でカラムに別名（エイリアス）を指定します。

## サンプル
`users` テーブルと `posts` テーブルを `JOIN` し、それぞれの `id` カラムを取得する場合のコード例です。

```php
use App\Models\User;

$users = User::join('posts', 'users.id', '=', 'posts.user_id')
             ->select('users.id as user_id', 'posts.id as post_id')
             ->get();

foreach ($users as $user) {
    echo $user->user_id;  // usersテーブルのid
    echo $user->post_id;  // postsテーブルのid
}
【Visual Studio 2019】プロジェクト/ソリューションファイルが削除できないときの対処方法

先日、Visual Studio 2019でプロジェクトを開いて作業した後にフォルダごと削除しようとしたところ、以下のダイアログが表示され削除できませんでした。


![削除ができない.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4014169/8ea78e42-3170-41b1-bb29-678278c2796b.png)
<br>
前々からこの症状に悩まされていたため、解決方法を残しておきます。


# 手順

<b>Step1</b>
Visual Studio 2019のメニューよりヘルプ→プライバシーを選択します。
<br>
![メニュー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4014169/49ba6962-3670-4fef-b932-509b02eae8a6.png)



<b>Step2</b>
プライバシー設定を選択します。
<br>
![2025-02-27_18h56_42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4014169/89ce4dc7-934b-43d6-91d3-49216085740d.png)



<b>Step3</b>
Visual Studio エクスペリエンス向上プログラムに参加しますか？という質問の記載がありますので、参加しないを選択し、OKをクリックします。
<br>
![VisualStudioエクスペリエンス向上プログラム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4014169/d6f57052-665e-454b-9580-4a43eed71f27.png)

<br>
以上で設定完了です。これで毎回PCを再起動しなくて済みそうです。
コードを回文にするプログラム作ってみた

コードを回文にするプログラムを作ってみました。
## もしそのままやったら
```js:before
console.log("hello, world!")
```
```js:after
console.log("hello, world!"))"!dlrow ,olleh"(gol.elosnoc
```
これじゃあまともに動きません。
## コードを保って回文にしたい
ならば、コメントを活用しましょう。
例えばこのようにすると...

```js:before
console.log("hello, world!")//
```
```js:after
console.log("hello, world!")////)"!dlrow ,olleh"(gol.elosnoc
```
とこのように回文の後半を無力化できます。
## 複数行の場合
```js
console.log("one!")//
console.log("two!")//
```
このように行ごとに//をつけると...
まず改行を`\n`にして
```js
console.log("one!")//\nconsole.log("two!")//
```
回文化して
```js
console.log("one!")//\nconsole.log("two!")////)"!owt"(gol.elosnocn\//)"!eno"(gol.elosnoc
```
`\n`を改行にすると...
```js
console.log("one!")//
console.log("two!")////)"!owt"(gol.elosnoc
//)"!eno"(gol.elosnoc
```
このように回文後半を完全に無力化できます。
## それを自動化するプログラムを
作りました！

https://github.com/TNTSuperMan/code2palindrome

npmからも使えます。
```bash
$ npm i -g code2palindrome
$ code2palindrome index.js index.pal.js
```
:::note alert
第一引数のみ指定すると上書きされます。
:::
## 使ってみてね！
文字化けはAIに聞けば直してくれる

## はじめに

日本語などのマルチバイト文字を扱っている時に、たまに出くわすことがある文字化け。大抵の場合は`UTF-8`の文字列を`Shift-JIS`で解釈、ないしその逆だと思います。

これがエラーメッセージやログなどに含まれている場合、元の内容が欲しいので復元したくなります。
よくある復元手段としては、テキストエディタの機能を使って文字コードを変えてみたり、コマンドやツール（`iconv`とか）を使ったり、というところでしょうか。

ただ、今はもう生成AIに聞けば一発で教えてくれますよという記事です。

## 早速聞いてみた

用意した文字化けはこちら

```
逋ｻ骭ｲ縺輔ｌ縺ｦ縺�縺ｪ縺�繝ｦ繝ｼ繧ｶ繝ｼ縺ｧ縺�
```

聞いた結果がこちら

![スクリーンショット 2025-02-24 22.49.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760224/1b372436-7080-4f61-9e8c-a5bf7add8c8e.png)

お見事。正解です。

ちなみにこの文字化けは↓のコード（Kotlin）で作っていました。

```kt: Kotlin
"登録されていないユーザーです".toByteArray(Charsets.UTF_8).let { String(it, Charset.forName("SJIS")) }
// 逋ｻ骭ｲ縺輔ｌ縺ｦ縺�縺ｪ縺�繝ｦ繝ｼ繧ｶ繝ｼ縺ｧ縺�
```

元通りに復元できていますね。

## おわりに

文字化けの復元って、失われている情報もあるので完全には復元できないこともあります。実際、文字化けを生成したコードをただ逆にしただけでは、キレイな復元は出来ませんでした。

```kt: Kotlin
"逋ｻ骭ｲ縺輔ｌ縺ｦ縺�縺ｪ縺�繝ｦ繝ｼ繧ｶ繝ｼ縺ｧ縺�".toByteArray(Charset.forName("SJIS")).let { String(it, Charsets.UTF_8) }
// 登録されて�?な�?ユーザーで�?
```

恐らくそのあたりも、より精度の高い方法を使っているのか、自然な文章になるように上手いこと補完してくれているのだと思います。
生成AI活用術！と言うにはあまりにも地味な使い方ですが、覚えておくといつか役に立つかもしれません。
【Shell】curlコマンドがバックグラウンドジョブとして実行されてしまう場合

# 概要
curlコマンドで以下のように実行しました。

> curl http://example.com/api?param1=value1&param2=value2

すると、結果は以下の通り。

> [1] 49325
[2] 49326
[3] 49327
[4] 49328
[5] 49329

あれ...これはバックグラウンドジョブの実行として認識されている模様。

# 原因と解決方法
原因は、シェルが`&`をバックグラウンドジョブの区切りとして解釈してしまっているため。

curlコマンドでURLを指定する際に、URL全体をダブルクォートまたはシングルクォートで囲むことで解決します。
以下の通りです。

> curl "http://example.com/api?param1=value1&param2=value2"

この結果、シェルはURL全体を一つの文字列として扱いますので、正常にAPIリクエストが送信できました。

ちなみに、今回は使っていませんでしたが、変数展開が必要な場合はシングルクォートを使います。シングルクォートで囲うと、すべての特殊文字がそのまま文字列として扱われるので、`$`や`\`なども文字列として認識してくれます。
【注意】your-s3-bucket-nameというS3Bucketについて

## 概要
最近X（旧Twitter）にてyour-s3-bucket-nameというBucketが話題になっています。
どうやらアップロードは可能だが、削除が出来ないというBucketとのこと。

## なにが問題なのか
[your-s3-bucket-name]とはQiitaや技術ブログなどで紹介されているサンプルコードに記載されがちなBucket名
サンプルコードをそのままコピペして使用するとこのBucket名が使用されることとなり、ファイルをアップロードするコードであればそのままそのBucketに対してアップロードが行われてしまう。
自宅で勉強しているだけでは大した問題にはならないが、業務データを誤ってアップロードしてしまった場合には取り返しのつかない事となる。
このBucketが悪意のあるものだと確定したわけではないが、同じようなsampleによく使われがちなBucket名がほかにも存在する可能性は十分にある。

## 対応策
サンプルコードをそのまま使用するのはやめましょう。
「Qiitaに書いてあったから」「AIに作ってもらったコードだから」とそのまま使用する人が増加していることを狙った可能性があるので、コードを全行読んで理解したうえで実行するようにしましょう。
Wi-Fiの認証方法についてまとめてみた

# はじめに
普段使ってるWi-Fiですが、その裏側ではどのような認証が使われているかを意識することはあまりないですよね。
業務でWi-Fiの認証方式について調べる機会があり、せっかくなので少し体系的にまとめて記事にしてみました！

詳細な解説は少なめですが、Wi-Fiの認証周りでよく出てくる用語をなんとなく理解したいなという方の参考になりましたら幸いです。

# そもそもWi-Fiって？
Wi-Fiとは、総務省の[国民のためのサイバーセキュリティサイト](https://www.soumu.go.jp/main_sosiki/cybersecurity/kokumin/glossary/en/#Wi-Fi（ワイ・ファイ）)によると以下のように説明されています。
> 無線通信の国際標準通信規格で、IEEE802.11シリーズ（IEEE802.11a / IEEE802.11b / IEEE802.11g / IEEE802.11n / IEEE802.11acなど)を利用した無線通信のこと。

ここでIEEE802.11シリーズとは無線LANの通信規格を指すため、ざっくり「会社内や家庭内などでパソコンやスマホなどを無線で通信するための通信規格」という理解で良さそうです。

以降はWi-Fiの認証関連の用語を箇条書きでまとめます。

# WPA

- Wi-Fi Protected Accessの略
- Wi-Fiの通信を暗号化するための規格
    - 具体的には、無線ルーターとPC間の通信を暗号化するための規格
- 昔はWEPという暗号化規格が使われていたが、破られやすいためWPAが登場した
- WEPにはなかったユーザー認証機能を備えている
- 認証方法は以下の2種類があり、認証方式によってWPAパーソナル(WPA-PSK)とWPAエンタープライズ(WPA-EAP)に分かれる
    - PSK(Pre-Shared Key)認証：WPAパーソナル
    - IEEE802.1X認証：WPAエンタープライズ

# WPAパーソナル

- 事前共有鍵（PSK）を使って認証する方式で、WPAまたはWPA2、WPA3の暗号化規格と組み合わせて使用される
  - PSKとはルーター機器の裏側に記載されている暗号化キーのこと
- 暗号化の規格がWPA2の場合、WPA2パーソナルと呼ばれる
- 個人使用のWi-Fiルータでよく使われる
    - 少数の機器に対して暗号鍵を設定する手間よりも、認証サーバを用意する負担の方が大きいため

# WPAエンタープライズ

- 認証サーバを使って認証する方式で、WPAまたはWPA2、WPA3の暗号化規格と組み合わせて使用される
- 暗号化の規格がWPA2の場合、WPA2エンタープライズと呼ばれる
- 大企業や大学などでよく使われる
    - 認証サーバを用意する負担よりも、たくさんの機器に対して暗号鍵を設定する手間の方が大きいため

# IEEE802.1X認証

- ネットワーク機器に接続された端末の認証やアクセス制を行うためのプロトコル規格
- 通常「802.1X認証」と略される

## 構成要素

- サプリカント(Supplicant)
    - スマホやPCなどのクライアント、またはそのクライアント側の認証プログラム
- 認証装置(Authenticator)
    - 無線LANアクセスポイントやスイッチなどのネットワーク機器
- 認証サーバー
    - ユーザー認証を行うサーバー

## 通信プロトコル

- EAPOL (Extensible Authentication Protocol over LAN)
    - 802.1X認証で使われる認証プロトコル
    - サプリカントと認証装置の間で認証情報をやり取りするためのプロトコル
    - EAPOL自体は暗号化されないが、TLSなどの暗号化プロトコルを組み合わせて安全性を確保する
    - 以下のような認証プロトコルがEAPOLの中で使われる
        - EAP-TLS
        - EAP-TTLS
        - PEAP
- RADUIS (Remote Authentication Dial-In User Service)
    - 認証サーバーと認証装置の間で認証情報をやり取りするためのプロトコル
    - 通信内容は暗号化される

### EAP-TLS

- TLS（Transport Layer Security）を用いて認証を行う
    - サーバー認証書だけでなくクライアント証明書の両方が必要

### EAP-TTLS

- TTLS ( Tunneled Transport Layer Security)
- TLSを用いて使用する暗号アルゴリズムのネゴシエーションとサーバ認証・鍵交換を行う
- 上記の後、ユーザ名とパスワードを用いてクライアント認証（内部認証）を実現すること目的としたプロトコル
    - 内部認証には、PAP、CHAP、MS-CHAP、MS-CHAPV2などが利用される
- 構成要素に、TTLSサーバーが追加される
    - ただしTTLSサーバーと認証サーバーが同一の場合もある
- クライアント証明書を利用する代わりにユーザー名，パスワードを使う
    - TLSのセッションを確立した後にユーザー名とパスワードを送信する
    - クライアント側に証明書をインストールする必要が無いのとクライアント証明の管理が不要であるため手軽

### PEAP

- Protected EAPの略
- ほとんどEAP-TTLSと同じ
- Microsoft, Cisco, RSA Securityが共同で開発
- TTLSサーバーと認証サーバーが分割されている場合は、トンネル化される区間がEAP-TTLSとPEAPで異なるが、現状では認証サーバーが双方の機能をサポートしているため差異が無いとも言える。

# 参考資料
https://www.soumu.go.jp/main_sosiki/cybersecurity/kokumin/basic/service/08/

https://crypto-protocol.nict.go.jp/AKE_zoo/EAP-TTLS/EAP-TTLS_Abstract.pdf

https://www.ruijie.co.jp/faq/what-is-8021x-authentication_442798201294815232.html

https://wa3.i-3-i.info/diff283security.html

https://xtech.nikkei.com/it/article/COLUMN/20060914/248050
Array(N).fill() .join(" ")で一発！ 簡単な問題ほど シンプルな解法を考えるクセ が大事！

今回解いた問題は、
「整数 N を受け取り、N 回 paiza を半角スペース区切りで出力せよ」
while でN回ループを書いたら、なぜかN-1回しか回らないバグ に遭遇した。
原因は `count = 1` で始めたせい。ループは `count < N` だから、1からN-1までの N-1回しか回らない ってオチだった。

NGコード（N-1回しか出力されない）
```js
let count = 1;  
while (count < N) {  
    process.stdout.write("paiza ");  
    count++;  
}  
process.stdout.write("paiza");  
```
OKコード（ちゃんとN回出力）
```js
let count = 0;  
while (count < N) {  
    process.stdout.write(count === N - 1 ? "paiza" : "paiza ");  
    count++;  
}  
console.log("");  
```
または、`count <= N`
さらに、Array(N).fill().join() を使うと超スマートかも。

```js
console.log(Array(N).fill("paiza").join(" "));  
```
こっちなら while ループなしで N回出力完了！

・`Array(N)` で N 個の空の要素を持つ配列を作成
・`.fill("paiza") `で全部 paiza にする
・`.join(" ")` で半角スペース区切りで結合


[僕の失敗談と解決話!](https://paizabeginner.wordpress.com/2025/02/27/paiza%e3%81%a7%e5%9f%ba%e6%9c%ac%e3%83%9e%e3%82%b9%e3%82%bf%e3%83%bcarrayn-fill-%e3%81%a7%e4%b8%80%e7%99%ba%ef%bc%81-%e7%b0%a1%e5%8d%98%e3%81%aa%e5%95%8f%e9%a1%8c%e3%81%bb%e3%81%a9-%e3%82%b7/)
【学習】docker imagesコマンドについて

## はじめに

あらためてDockerについての学習をすすめるなかで理解したコマンドなどについて共有したいと思います。今回は`docker images`コマンドについて。


## 環境
・PCにインストールしたDocke起動
・PC：Windows
・Vscodeターミナルで実行


## コマンドを実行した結果

```wsl
$ docker images
REPOSITORY      TAG       IMAGE ID       CREATED        SIZE
bi_app          latest    a39b802549a7   3 months ago   1.26GB
<none>          <none>    2357e26078bc   3 months ago   1.26GB
<none>          <none>    cf4aaf741d85   3 months ago   1.26GB
so_app          latest    f16601b5af05   3 months ago   1.26GB
<none>          <none>    97de8f235661   3 months ago   1.26GB
mysql           <none>    6c55ddbef969   4 months ago   591MB
postgres        latest    d57ed788c154   4 months ago   434MB
```

`docker images`このコマンドをどのディレクトリで実行しても同じ結果が返ってきます。つまりディレクトリは関係ないという事は分かるけど具体的にどいう仕組みなのか。
これを知りたかったので調べてみました。


## コマンドの意味
`docker images` のコマンドはディレクトリに関係なく同じ結果を返します。
これは、Dockerがホストマシン上の **Docker デーモン**（`dockerd`）と通信して、保存されているイメージの一覧を取得しているからです。



## どこから情報を取得しているのか？
`docker images` は、ローカルに保存されている **Docker イメージ** の一覧を表示するコマンドです。これらのイメージは **Docker が管理するストレージ** に保存されており、特定のディレクトリとは関係ありません。

Dockerのストレージの場所は、環境によって異なりますが、一般的には以下のディレクトリに保存されています。

- Linux: `/var/lib/docker`
- Windows（WSL2経由）: `\\wsl$\docker-desktop-data\`
- Mac: `/Users/<username>/Library/Containers/com.docker.docker/Data/`

## かってにDockerに接続している？

Dockerは **クライアント・サーバーモデル** になっていて、`docker` コマンドを実行すると、裏で動いている **Dockerデーモン**（`dockerd`）にリクエストを送ります。

そのため、`docker images` を実行すると、自動的にデーモンに接続し、イメージの一覧を取得します。これは **Dockerの仕様** です！
デーモンが動いていなければ、`docker images` を実行してもエラーになります（例: `Cannot connect to the Docker daemon`）。

👇エラー内容については下記サイトに一つ解決方法が記されています。

https://docs.redhat.com/ja/documentation/red_hat_3scale_api_management/2.6/html/administering_the_api_gateway/apicast-docker-advanced#_troubleshooting_apicast_on_the_docker_containerized_environment



## まとめ
- `docker images` は **ディレクトリに関係なく** ローカルのDockerデーモンから情報を取得する
- Dockerは **ストレージ領域** にイメージを保存している（`/var/lib/docker` など）
- `docker` コマンドを使うと **自動的にDockerデーモンに接続** して情報を取得する

**Dockerデーモン**というなんとも強そうな名前

公式ドキュメントもあるので、より詳しく知りたい方は下記サイトを見てみることをお勧めします。

https://docs.docker.jp/engine/reference/commandline/dockerd.html#id2

Dockerとはについての参考サイトも。

https://www.redhat.com/ja/topics/containers/what-is-docker
複数選択可能な検索ダイアログに「全て有効」「全て無効」ボタンを追加いたしました

# はじめに
2025年、1/14リリース(ver.1.4.12.0)において、当社で「全て有効」「全て無効」ボタンの実装をいたしました。簡単にこちらの機能のご紹介をさせていただきます。

# 何のために追加したか
これまでのプリザンターにも、フィルタ等には以下のような「全て選択」機能がありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935896/680db12c-a3da-4eef-8cf0-dda6efaa519c.png)
しかし以下のような複数選択可能検索ダイアログについては、全選択を行う機能がありませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935896/30724713-bc7c-4a61-8f2f-e79ee3bb76c6.png)
このため多数の検索ダイアログをすべて選択したい際は、スクロールで選択していくしかなくやや不便でした。

# 実装について
既存の複数選択可能な検索ダイアログに、「全て選択」「全て無効」のボタンを追加し、JavaScriptに該当ボタンを押下した際、押下したボタン配下の項目すべてにui-selectedクラスを付与(クリックして選択した時と同じ挙動)し、「有効化」ボタンを押下した際に動く関数をよびだｓ関数を追加いたしました。
ボタンを追加した検索ダイアログは以下の画像の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935896/5c3c81e0-d399-475b-ab06-661ef28198e3.png)
なお検索により候補を絞った後に押下した際は、検索後の項目を全選択・全無効化いたします。

# おわりに
こちらの機能、いくつかの項目を有効にしたが一度すべてリセットしたくなった、という際に「全て無効」するなどというケースにもご活用いただけるかと思います。
もちろん、普通にすべての項目を有効状態にしたい、無効にしたい、という際にもお使いいただけますので、ぜひ使ってみてください！
Eclipse を使いこなしたい新人備忘録

# はじめに
プログラマになり日々の仕事にあっぷあっぷですが
メモがてら書きます。

最近Eclipseなるものを入れました！
VSCodeなどしか利用したことがなく、操作が全然わからないので
調べたことをまとめます。

# 困ったこと
クラスが配置されたパスわからん…
結果圧縮(jar)ファイルにまとめられていたようで自力でわかるはずもなく…
ということで、検索方法を書いておきます。

おすすめのショートカットありましたら、是非教えてください！

# 試してダメだった検索方法
- Ctrl+H(検索ダイアログ) を押して
"クラス名" を指定し検索

- Ctrl+Shift+R (クイックリソース検索) を押して
検索ボックスに "クラス名" を入力して検索

# 成功した検索方法
Ctrl+Shift+Tを押してクラス名で検索

# さいごに
今までの苦労は一体…というくらいあっさり検索できました！
困って解決したことなど都度追加予定です。

# 参照記事
ありがとうございました！

https://www.casleydi.com/blog/engineer/292/
Skewness(歪度)とヒストグラム

Skewness(歪度)によって分布がどのように変わるかヒストグラムで見てみました。
その時のメモです。

- 負の値: 左に偏り
- 0: 左右に均衡
- 正の値: 右に偏り

結果のヒストグラム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/148ee169-78c6-467b-970c-37d22dc4eea9.png)

出力したPythonプログラムです。
AIにほとんど書いてもらっていて、内容あまり確認していないです。

```python
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import skewnorm

# Function to generate random numbers with specified skewness
def generate_skewed_data(size, skewness):
    return skewnorm.rvs(a=skewness, size=size)

# Parameters
size = 1000  # Number of random numbers
skewness_values = np.arange(-4, 5, 1)  # Skewness values from -4 to 4 with step of 1

# Create subplots
fig, axes = plt.subplots(3, 3, figsize=(15, 15))
axes = axes.flatten()

# Generate and plot histograms for each skewness value
for i, skewness in enumerate(skewness_values):
    data = generate_skewed_data(size, skewness)
    axes[i].hist(data, bins=30, edgecolor='k')
    axes[i].set_title(f'Skewness={skewness}')
    axes[i].set_xlabel('Value')
    axes[i].set_ylabel('Frequency')

# Adjust layout
plt.tight_layout()
plt.show()
```
PythonでUnicode block名とUnicode 文字名の一部から一覧を返す

LLMのlogit_biasのテストに必要になったけど情報少なかったので作ってみました。
```python
import unicodedata

# pip install unidata-blocks
from unidata_blocks import get_block_by_name

def in_unicode_char_name(char, unicode_name_subword):
	return not any(x in unicodedata.category(char) for x in ["Cc", "Cn"]) and unicode_name_subword in unicodedata.name(char)

def chars_from_unicodde_block_and_name(unicode_block_name, unicode_char_name_subword):
	uniblock = get_block_by_name(unicode_block_name)
	chars = [chr(i) for i in range(uniblock.code_start, uniblock.code_end+1) if in_unicode_char_name(chr(i), unicode_char_name_subword)]
	return chars

hiragana_list= chars_from_unicodde_block_and_name("Hiragana", "HIRAGANA")
katakana_list = chars_from_unicodde_block_and_name("Katakana", "KATAKANA")
kanji_list = chars_from_unicodde_block_and_name("CJK Unified Ideographs", "IDEOGRAPH")

print(hiragana_list)
print(katakana_list)
print(kanji_list)
```