OmniAICreator/Qiita-1.07M huggingface dataset:
Gitメモ：GitのデフォルトエディタをVimからVSCodeへ

Gitでコミットメッセージなどを編集するとき、デフォルトだとVimが立ち上がります。
ターミナルかっこいいーふぉぉぉとかいうタイプだったので長らくそのままにしてましたが
いいかげん面倒になりVSCode(VisualStudioCode)へ変更。
その時のメモです。

変更方法
```
$ git config --global core.editor
```

戻し方
```
$ git config --global core.editor 'vim'
```

最近、結構経験あるエンジニアでも意外とGitの動きを正確に理解していないことに気づく。
トリビア的になると思いますが今後もちょこちょこ書き溜めようかと思います。
人の無意識の感情を読み取るWebサイトを作りたい

初投稿です。よろしくお願いいたします。
この度4月より未経験エンジニアで転職し、エンジニアキャリアがスタートしました。
せっかくなので、「自分でもサイト作りたい！」と個人でのサイト制作をスタート。

現在、「人の無意識の感情を読み取るWebアプリケーション」の開発に取り組んでいます。
カメラやマイクでユーザーの感情を読み取り、その感情に合わせてAIから質問が投げかけられるというWeb体験を目指しています。

本記事では、**現段階の進捗**・**現在の課題**・**今後実装したい機能**について記載しました。

---

## 🎯 このWebアプリでやりたいこと

- ユーザーの**表情**や**声**から感情を認識
- 感情に応じて、**サイトの見た目やAIの問いかけが変化**
- 生成AIが、**ユーザーに対して質問を投げかける**
- 回答の感情的な反応をもとに、**「楽しそうだった質問」をランキング化**

---

## 🛠️ 技術スタック

| 項目 | 使用技術 |
|------|----------|
| フロントエンド | HTML / CSS / JavaScript / Chart.js / face-api.js |
| バックエンド | ASP.NET Core (Razor Pages) |
| 感情認識 | face-api.js（リアルタイム表情認識） |
| 質問生成（予定） | OpenAI API（ChatGPTなど） |
| グラフ表示 | Chart.js（円グラフ） |
| その他 | Node.js + npm + Vite（導入準備中） |

---

## ✅ 現在の進捗状況

### 実装済み

- ✅ **Face-api.js** を使用したリアルタイムの表情認識
- ✅ 認識された感情（喜び・驚き・怒り・悲しみ）を数値化
- ✅ 各感情スコアを HTML の input 要素に反映
- ✅ **Chart.js による円グラフ描画**（感情スコアの可視化）

### 未実装

- 🔲 声をもとに感情を判定する機能（マイク音声解析）
- 🔲 生成AIによる質問機能
- 🔲 ユーザーの回答を分析・評価する機能


## 🎨 実際のUI構成（抜粋）

- カメラ映像のリアルタイム表示（WebRTC + face-api.js）
- 表情スコアを input に自動反映（JavaScript制御）
- 感情値を円グラフで可視化（Chart.js）

![スクリーンショット 2025-06-08 17.28.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3983750/fec098ea-965f-4f08-ade9-5364c6f7e033.png)

---


## 🔍 現在の課題

- ❓ **生成AI（ChatGPT等）からの質問をどう設計・実装するか**
- ❓ 音声からの感情推定をどの技術で実現するか  
　（候補：Web Audio API, TensorFlow.js, 音響特徴量分析など）
- ❓ Chart.js に代わる感情スコアの**より直感的な可視化方法**を模索中  
　（例：エモーションゲージ、アイコンアニメーション等）

---

## 🌱 将来的に実装したい機能

- [ ] **生成AI（OpenAI）を使った、感情に合わせた質問生成**
- [ ] 質問10件終了後、「**ユーザーが一番楽しそうに答えた順**」に並べ替え表示
- [ ] 音声入力・合成による**話しかけてくるAI体験**

---

## 🔚 まとめ

初心者ではありますが、将来的には「人の感情とAIの対話」を融合したWeb体験を作ってみたいです。  
今後は**生成AIとの連携**や**音声解析**など、さらにユーザー体験を深める実装に進んでいきます。
こっちの方がいい、といった改善案等ありましたら、コメントでお願いします！

引き続き、進捗があり次第Qiitaにもまとめていきますので、よろしくお願いします！

---
【Ruby】よくみるイディオム（nillガード、!!を使った真偽値の型変換）

## はじめに
記事でよくみるRuby定番の書き方を身に付けたい。という想いからよくみる慣用的な表現をまとめました。

## `|| =(nilガード)`
「変数にnil以外の方を入れておきたい」という目的でつかわれる。

```ruby
a = nil
a ||= 10  
a #=> 10

a = 5
a ||= 10  
a #=> 5
```
なぜ、aが`nil`の場合だけ10が代入されるのか。
実は、上の式は以下と同じ。

```ruby
a = nil
a || a = 10
a #=> 10

a = 5
a || a = 10  
a #=> 5
```

論理演算子`||`は、左側が真なら右側を評価せずに終了するという性質を持っている。
`a`が`nil（偽)`なら`a = 10`が実行され、`a`がすでに値を持っていれば、そのまま`a`を使う。

## `!!()`
Rubyは`nil`又は`false`であれば偽、それ以外は全て真。

`!!`を使うことで、値を確実に true または false に変換することができる。
1回目の`!`で値を`true`か`false`で変換し、２回目の`!`で純粋な真偽値を返す。

```ruby
!!nil     # => false
!!false   # => false
!!0       # => true
!!"text"  # => true
```

真偽値が欲しいときに、他の型の値を受け取る可能性がある場合は`!!`を使うことで明確な真偽値を返すことができる。

```ruby
def logged_in?
  !!session[:user_id]
end
```

## まとめ
- ||= は「nilだったら代入する」ための便利な書き方。初期化やキャッシュに使える。
- !! は「真偽値として扱いたい値を明確にtrue/falseに変換」できる。
- どちらもRubyらしい柔らかい構文で、短く・安全なコードを書くための基本的なイディオム。
自分の思考を洗練させるための10のチェックリスト

こんにちは。
<br>
数ある記事の中から、当記事に目を通していただき、ありがとうございます。
<br><br>
今回は、「イェール大学集中講義 思考の穴―わかっていても間違える全人類のための思考法-」を読んで、本書で紹介されている思考の穴パターンをチェックリストにしてまとめてみました。

それぞれのチェックリストの中身まで深堀することはしませんが、
チェックリスト内の質問を自分にしてみると自ずと自身の思考にどういった偏りがあるのかを
少しでも客観的に知るキッカケになるかなと思います。
<br>
特に、「考える」ことでメシを食ってる方にとっては
一つ大きな指針となることでしょう。

それでは、スタート。


# 思考の穴チェックリスト
## 1. 流暢性効果（Processing Fluency）
- 情報が頭の中でスムーズに処理できるだけで、その内容を過度に信じていないか？ 
- フォントや語呂の良さ、名称の覚えやすさに惑わされていないか？
---
## 2. 自己評価バイアス（Dunning–Kruger効果）
- 自分の能力を「平均以上」「他人より優れている」と過大評価していないか？ 
- 自分の無知に気づけず、正しい比較基準を知らないまま判断していないか？
---
## 3. 計画錯誤（Planning Fallacy）
- タスクの所要時間や労力を過小評価していないか？ 
- 見積もりに余裕を持たずに、締め切りを甘く設定していないか？
---
## 4. 確証バイアス（Confirmation Bias）
- 自分の仮説や信念を裏付ける情報ばかりを集めて、反証となる情報を無視していないか？ 
- 診断テストの結果や自己予言に振り回されて、“思い込み”通りに行動していないか？
---
## 5. 経験則や直感に大きく頼る因果推論
- **類似性**：結果と似た大きさ・性質の原因を当てはめすぎていないか？ 
- **十分性**：ひとつの要因だけで因果を断定し、他の原因を排除していないか？ 
- **必要性**：必要条件の存在を理由に因果と結びつけすぎていないか？ 
- **親近性**：直近に起きた出来事を原因扱いして、過去の要因を見落としていないか？ 
- **可制御性**：自分で制御できる部分だけを原因とみなし、外的要因を過小評価していないか？
---
## 6. エピソード依存（Anecdotal Bias）
- ひとつの具体例（エピソード）に引きずられて、全体を誤って判断していないか？ 
- 大数の法則(事例の数の効果は絶大)・平均への回帰(絶好調はずっと続かない)・ベイズ推論(AだからB、つまりBだからAではない)の視点を無視していないか？
---
## 7. 損失回避／保有効果（Loss Aversion & Endowment Effect）
- 現状を維持したいという本能が働きすぎて、新しい選択肢を試すのを躊躇していないか？ 
- 一度所有したものを手放す損失を過度に恐れていないか？
---
## 8. 解釈バイアス（Interpretation Bias／認知的不協和）
- 最初に得た印象や仮説に固執して、反証データを受け入れにくくなっていないか？ 
- トップダウン処理(自分の持っている知識)ばかりに頼り、事実認識を疎かにしていないか？
---
## 9. 知識の呪い（Curse of Knowledge／自己中心性バイアス）
- 自分が知っている前提で話を進め、相手の理解度を過大評価していないか？ 
- “相手も同じ情報を持っているはず” と決めつけていないか？
---
## 10. 確実性効果（Certainty Effect）
- 不確実な未来の判断を“ゼロか1%か”の差で大きく迷い、行動を先延ばししていないか？ 
- 未来の不確実性を下げるための情報収集や仮決めを怠っていないか？

# 最後に
以上、10のチェックリストでした。

残念ながら人間は心がある以上、この10のバイアスから逃れることは決してできません。
本書でも語られていますが、このバイアスは人間が自然を効率的に生き抜くために必要不可欠だったのです。

そして現代でも必要不可欠なのです。

つまり、このバイアスは生きていく上では一生向き合い続けるものになります。

だからこそ、このバイアスを知って、
「じゃあどうするか？」
を考え、

行動に移していくことが本書の伝えたかったことなのではないかなと私は思います。

良かったら読んでみてください。
事例がこれでもかと載っているので腑に落としやすいのかなと。
→[思考の穴はこちらからのぞけます](https://www.amazon.co.jp/%E3%82%A4%E3%82%A7%E3%83%BC%E3%83%AB%E5%A4%A7%E5%AD%A6%E9%9B%86%E4%B8%AD%E8%AC%9B%E7%BE%A9-%E6%80%9D%E8%80%83%E3%81%AE%E7%A9%B4%E2%94%80%E2%94%80%E3%82%8F%E3%81%8B%E3%81%A3%E3%81%A6%E3%81%84%E3%81%A6%E3%82%82%E9%96%93%E9%81%95%E3%81%88%E3%82%8B%E5%85%A8%E4%BA%BA%E9%A1%9E%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E6%80%9D%E8%80%83%E6%B3%95-%E3%82%A2%E3%83%B3%E3%83%BB%E3%82%A6%E3%83%BC%E3%82%AD%E3%83%A7%E3%83%B3/dp/4478115753)
Gemini Speech Generationを使って妹キャラの声を合成してみた

2025年5月に発表したGemini APIのSpeech Generation機能を使って妹キャラの声を合成してみました。本記事では音声合成に使用したGemini Speech Generationの紹介とどのような手順で合成したかをまとめてみました。

## Gemini Speech Generationとは
まずは音声合成に使用したGemini Speech Generationの紹介から。

### 概要
Google が2025年5月に発表したGemini APIのSpeech Generation機能は、従来のテキスト読み上げ技術の概念を根本的に変革する革新的な音声合成システムで、単純なテキスト読み上げを超え、複数話者による自然な会話、感情豊かな表現、そして細かなスタイル制御が実現できます。

### 利用可能なモデルと仕様

現在提供されているGemini TTSモデルは以下の2つです
- gemini-2.5-flash-preview-tts: 高速で効率的な音声合成に適したコスト重視モデル
- gemini-2.5-pro-preview-tts: より高度な表現力と制御性を提供する高性能モデル

### 音声オプションと技術仕様

システムでは30種類の音声オプションが用意されており、男性・女性の声に加え、年齢層や話し方の特徴も選択できます。TTSセッションのコンテキストウィンドウは32,000トークンに制限されており、出力音声は24kHzサンプルレート、16ビット深度のPCMフォーマットで生成されます。

## Gemini Speech Generationの使いかた

1. [Google AI Studio](https://aistudio.google.com/)にアクセスします
1. Generate Media から今回の音声合成のページに遷移します
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620986/93278b6f-43ca-4c51-b1ed-27f23866decd.png)

1. Gemini Speech Generation をクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620986/b8b6d5f9-37ad-4b4e-808b-9d52ace11b2e.png)

1. 複数人の会話を作りたい場合はそのままでもいいのですが、今回は一人がセリフを話しているシーンを作成したいので、 Single-speeker audit に切り替えます
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620986/bb5c455e-a4e7-4f6b-85ed-a38d579cdb15.png)

1. Model Settingから任意の音声を選択します<br />※今回はLedaを選択しています<br />※音声サンプルはすべて英語ですが、選択したモデルでも日本語は使えました
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620986/1874d4d1-602e-4129-88c9-ceb99ecfc832.png)

1. ここで、どんな感じで話してほしいのかのスタイルを指示します<br />※ここで指示した内容は後ほど記載します
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620986/4abeecf9-3c5c-462e-9ba1-8725fe51a7f0.png)

1. ここにAIにしゃべらせたい内容を書きます
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620986/4b00dc3b-fdc8-49bf-8b9e-8f2a172d7f8b.png)

1. 最後は忘れないように run ボタンをクリックして音声を生成しましょう
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620986/e25f2989-01f8-423b-a948-a7f5702aea3f.png)

## Gemini Speech Generationで出力されたもの

妹キャラということで、雑な内容ですが下記のように指示してみました。


:::note info
下記はサンプルの指示内容です
:::

**Style instructions**

```
声質は高くて、全体的に可愛く甘える感じで息遣いの感じる話し方
```

**Start witting or paste text here to generate speech**

```
ねぇねぇ、お兄ちゃん、お兄ちゃんってばぁ～、もっと私のこと見てよっ
```

:::note info
サンプル音声＋テキトーな画像
:::

サンプル画像はGeminiで作成して、ここで作成した音声と合成したものがこちらです。出力がWav形式だったので、いったん動画編集ソフトに画像付きでくわせたものをXに投稿したサンプルです。なお、動画加工はMicrosoft Clipchampを使用しています。

https://x.com/shioccii/status/1931618369499021690

## まとめ

お試しだったのでかなり雑に作ってみましたが、それでもそれなりの表現力があって今までの音声合成ソフトとは違うなという印象でした。特に抑揚をつけるなどの処理もしていませんので、このレベルのものが簡単に出力できると色々とはかどる人も多いのではないでしょうか。

余談な話ですが、Model Settingでは高めの声でしゃべる女性の音を意図的に選択しています。これはキャラクターのイメージから高めで甘ったるいしゃべり方をしてほしかったということを実現するための選択で、カスタム指示でもイメージの声をより強調するような指示の仕方をしています。なので、声質の選択と指示の仕方次第で、ある程度以上の表現力を実現できるのではないかと考えています。

この記事がどなたかのお役に立てれば幸いです。
Vercel AI SDKのtelemetryはOpenTelemeryで使うには工夫が必要

Vercel AI SDKのtelemetryはexperimentalです。
Open Telemetry対応となっていますが属性名が異なるのでマッピングが必要です

例えばAI SDKは頭が`ai`ですがOTelは`gen_ai`なので最初から異なります。

https://ai-sdk.dev/docs/ai-sdk-core/telemetry

https://opentelemetry.io/docs/specs/semconv/gen-ai/

https://ai-sdk.dev/providers/observability



Open Telemetryのほうもまだ固まっておらず流動的なようです
AI SDK v5で対応なのかもしれません
jquery テーブル表示練習

## 文字のみ表示

```php；
<input id="textInput">
<button id="btn">表示</button>
<p id="output"></p>

<!-- jQuery読み込み -->
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>

<!-- スクリプトを安全に実行 -->
<script>
  $(document).ready(function () {
    $('#btn').on('click', function () {
      let text = $('#textInput').val(); // 入力値を取得
      $('#output').text(text); // 文字だけ
    });
  });
</script>
```

## テーブル追加方法

```php:
 // やりやすかった書き方
 $('#studentTable tbody').append(
        `<tr><td>${name}</td><td>${age}</td><td>${email}</td><td>${phone}</td></tr>`
      );

 //基本形
  <td>' + name + '</td>

 // いつも基本形にある、端っこ
   append('<tr> </tr>')
 
 //表示したいもん一個
 append('<tr><td>' + name + '</td></tr>')

 //表示したいもん 2個
 .append('<tr><td>' + name + '</td><td>' + age + '</td></tr>')

 //表示したいもん 三個
 .append('<tr><td>' + name + '</td><td>' + age + '</td><td>' + phone + '</td></tr>')
```

### テーブル名前 追加

```php:
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8" />
  <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>

<input id="name">
<button id="add">追加</button>
<table id="table" border="1">
  <tr><th>名前</th></tr>
</table>


<!-- スクリプトを安全に実行 -->
<script>
  $(document).ready(function () {
    $('#add').on('click', function () {
      let name = $('#name').val(); // 入力値を取得
      $('#table').append('<tr><td>' + name + '</td></tr>'); // テーブル名前だけ
    });
  });
</script>
</body>
</html>
```

### テーブル名前 住所 追加

```php:
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8" />
  <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>

<input id="name">
<input id="age">
<button id="add">追加</button>
<table id="table" border="1">
  <tr><th>名前</th></tr>
</table>

<script>
  $(document).ready(function () {
    $('#add').on('click', function () {
      let name = $('#name').val(); 
      $('#table').append('<tr><td>' + name + '</td><td>' + age + '</td></tr>');
    });
  });
</script>
</body>
</html>
```
一冊目に買うべき量子力学の本(アプローチ別)




## はじめに

量子力学は大学で物理を学び始めた人にとって憧れの学問だと思います。物理の中でも量子力学は本によって進め方が**全く異なります**。本の選び方を間違ってしまうと、挫折しかねません。
この記事では、量子力学を学び始めたい初学者向けに一冊目おすすめの書籍を紹介します。

---

## 本書籍ガイドの前提
まず量子力学の本の構成は主に二種類に分かれます。

* **アプローチ１**
一つ目が波動関数・シュレディンガー方程式からのアプローチです。このアプローチでは井戸型ポテンシャルなどのさまざまなポテンシャルのもとでシュレディンガー方程式を解いて波動関数を求めるということから始めていくスタイルです。多くの大学の講義はこのスタイルです。このアプローチで展開する代表的な本は猪木・川合の「量子力学I・II」などです。

* **アプローチ２**
二つ目が、状態ケットという抽象的なベクトルを導入して、より数理的側面から展開していく方法です。エルミート演算子が物理量に対応して、ユニタリ演算子が物理操作に対応するなどの量子力学の公理的側面からスタートして線形代数などの数学を基礎に学んでいくことになります。このアプローチで展開する有名な本はJ.J.サクライの「現代の量子力学」などです。

この二つのアプローチはあくまで便宜的なものです。どちらも学ぶものの本質は同じです。学ぶ順番がことなるだけです。例えば、一つ目のアプローチではシュレディンガー方程式がすぐに登場しがち(以下で紹介する「猪木・川合」では初登場が２章)なのに対して、二つ目のアプローチではシュレディンガー方程式の登場は遅くなりがちです(以下で紹介する谷村さんの本では初登場が９章です)。


以下ではこの二つのアプローチに分けて１冊目としておすすめな本を紹介します。

---


### アプローチ１

前提知識：微分方程式、大学レベルの微分積分

---

#### **「量子力学I・II」（猪木・川合）**

[量子力学I・II（猪木・川合)](https://amzn.to/4jDSXZu)

* 「猪木・川合」としばしば呼ばれる本です。この本は量子力学を学ぶのであればどのアプローチで勉強を始めるにせよ、**絶対に買っておくべき本**です。
* Iの前半を読めば、大学の半年分の講義の内容をマスターできます。
* 一冊目の後半から二冊目の前半にかけて角運動量と対称性や摂動論などの中級レベルの内容を網羅しています。
* 二冊目の中盤くらいまで読めば、物理学科の大学院入試の量子力学も難なく解けます。
* **素晴らしいところ:**
    * 一冊目としておすすめできる平易なイントロから、上級レベルまでの圧倒的網羅性。
    * チャートのような演習書風の構成になっています。問題を解きながら理解を深めることができます。


### アプローチ２

前提知識：線形代数

#### **「量子力学10講」（谷村省吾）**
[量子力学10講（谷村省吾)](https://amzn.to/4jF6q3g)

* アプローチ２の一冊目としておすすめできる本です。
* 抽象的で物理的イメージが湧かず苦労しがちなアプローチ２ですが、この本の**第1講「量子力学の考え方」という章は本当に素晴らしい導入**で、物理的イメージをしっかりと持たせてくれます。
* 私がもっともお気に入りなのはこの本のまえがきです。素晴らしい文章なのでいくつか引用します。
  * > 本は買って読んだ方がよい。（中略） 一つの分野を理解しようと思ったら３冊くらいは本を読んだ方が良いと思う。
    > --- 引用元：谷村省吾『量子力学10講』まえがき(iii,iv)
* **まえがきだけで買う価値があります。**
* 量子もつれなど「猪木・川合」にはないような内容もあります。

---
### まとめ

この一冊目に買うべき本を二つのアプローチごとに紹介しました。一冊目にはおすすめできないが、量子力学を学ぶなら絶対に買っておくべき本はまだまだたくさんあります。J.J.サクライや、清水量子力学、堀田量子力学などなど。これらの本の魅力はまた別の記事で紹介したいと思います。
UTM × Kali Linux 2025で共有フォルダ設定に苦戦した話【完全解決版】


# はじめに

macOS の UTM で Kali Linux 2025 を動かしている方で、共有フォルダ設定でお困りの方はいらっしゃいませんか？

私は最近、UTM で Kali Linux 環境を構築する際に、ホスト側のフォルダを共有する設定で `special device … does not exist` エラーに遭遇し、解決まで時間を要しました。

同様の問題でお困りの方に向けて解決法をまとめました。

# 要約

**結論から申し上げると、UTM の VirtFS 共有ではタグ名が `share` で固定されています。**

この仕様を知らずに、任意の名前（`kali`、`shared` など）を設定すると、ゲスト側で認識されずエラーが発生します。

この記事では以下の内容について説明します：

- UTM × Kali Linux 2025 での共有フォルダ設定方法
- `special device … does not exist` エラーの原因と解決法
- 自動マウント設定の安全な方法
- 代替手段（VirtioFS、WebDAV）の選択肢

# 前提環境

検証環境は以下の通りです：

| 項目             | バージョン/設定          |
| ---------------- | ------------------------ |
| UTM              | 4.x（QEMU バックエンド） |
| ゲスト OS        | Kali Linux 2025.1        |
| 共有方式         | VirtFS (9p)              |
| ホスト側フォルダ | `~/任意`                 |
| UTM タグ名       | `share`（**これ重要**）  |
| マウント先       | `/media/share`           |

:::note warn
**重要なポイント**

- QEMU バックエンドの場合、VirtFS でタグ名は `share` 固定
- Apple Virtualization バックエンドの場合は後述の別解を参照
  :::

# 遭遇したエラーと原因

## 発生した症状

最初に以下のコマンドを実行したところ、エラーが発生しました：

```bash
sudo mount -t 9p -o trans=virtio,version=9p2000.L kali /media/kali
```

```
mount: /media/kali: special device kali does not exist.
```

ログを確認すると、以下のメッセージが出力されていました：

```bash
dmesg | grep 9p
# → 9pnet_virtio: no channels available for device kali
```

この `no channels available` が問題解決の重要な手がかりとなりました。

## 原因の特定

エラーの原因は以下の通りです：

1. **UTM の VirtFS 共有ではタグ名が `share` で固定されている**
2. ゲスト側はタグ名でデバイスを探索するため、一致しないと接続できない
3. 任意の名前（`kali`）を設定していたため、デバイスが見つからない

# 解決手順

## 1. UTM 側の設定

まず、Kali VM を停止します：

次に、UTM の設定を開いて以下の手順で設定します：

1. **設定 → 共有** を選択
2. 既存の共有エントリがあれば削除
3. 新しく追加する際の設定：
   - **ディレクトリ**: 任意
   - **モード**: `VirtFS`
4. 保存して VM 起動

## 2. ゲスト側での設定

VM が起動したら、以下のコマンドを実行します：

```bash
# マウントポイント作成(任意)
sudo mkdir -p /media/share

# マウント実行 (shareは固定)
sudo mount -t 9p -o trans=virtio,version=9p2000.L share /media/share

# 動作確認
ls /media/share
```

成功すると、ホスト側のファイルが表示されます。

# まとめ

UTM × Kali Linux 2025 での共有フォルダ設定において重要な点：

1. **タグ名は `share` 固定**が最重要
2. エラーが発生した場合は `dmesg | grep 9p` でログ確認
3. `/etc/fstab` で自動化する際は `_netdev,nofail` を付ける
4. 高速性を重視するなら Apple Silicon + VirtioFS も検討価値あり

最初はエラーの原因が分からずに苦労しましたが、タグ名の仕様を理解してからは問題なく設定できました。

同様の問題でお困りの方の参考になれば幸いです。
自分用C言語学習 ～ファイル分割 / マクロ～

# ヘッダーファイルとソースファイル
cには、拡張子が「.h」のヘッダファイルと拡張子が「.c」のソースファイルがある。大きなプログラムは多数の関数からなっているので、規模に応じて複数にファイルを分割する。

### ヘッダーファイル(.h)
設計図のようなもの。
プロトタイプ宣言や変数の定義が記述されているファイル。

### ソースファイル(.c)
設計図を基とした「中身」
関数の実際の処理を記述するファイル。

# 実際にファイル分割をしてみる
ファイル分割あり、なしを比較する
#### ファイル分割なし
```c:main.c
#include <stdio.h>

//	関数avgのプロトタイプ宣言
double avg(double,double);
    
int main(int argc, char** argv) {

    double d1,d2,d3;
    double a = 1.2,b = 3.4,c = 2.7;

    d1 = avg(a,b);
    d2 = avg(4.1,5.7);
    d3 = avg(c,2.8);

    printf("d1 = %lf,d2 = %lf,d3 = %lf\n",d1,d2,d3);
    
    return 0;
}

//	平均値を求める関数
double avg(double m,double n){

    double r = (m + n) / 2.0;
    return r;
}
```
#### ファイル分割あり
```c:calc.h
#ifndef _CALC_H_
#define _CALC_H_

//  関数avgのプロトタイプ宣言
double avg(double,double);

#endif // _CALC_H_
```
```c:calc.c
#include "calc.h"
                    
//  平均値を求める関数
double avg(double l,double m){

    //  引数l,mの平均値を求め、rに代入する。
    double r = (l + m) / 2.0;
    
    return r;
}
```
```c:main.c
#include <stdio.h>
#include "calc.h"

int main(int argc, char** argv) {

    double d1,d2,d3;
    double a = 1.2,b = 3.4,c = 2.7;
    
    d1 = avg(a,b);
    d2 = avg(4.1,5.7);
    d3 = avg(c,2.8);
    
    printf("d1 = %lf,d2 = %lf,d3 = %lf\n",d1,d2,d3);
    
    return 0;
}
```
それぞれを比較するとこんな感じ

# ヘッダファイルのインクルード ( .c )の記述
clac.hのインクルード
```c:calc.c, main.c
#include "calc.h" 
// calc.h ヘッダファイルをインクルード
```
今回は、clac.h というヘッダファイルをmain.c, clac.cでインクルードしている。

# ヘッダファイルの仕組み ～ヘッダファイルの一般的な書式～
ヘッダファイル clac.h の中身
```c.calc.h
#ifnfdef _（大文字で記述したファイル名)_H_
#define _（大文字で記述したファイル名)_H_

プロトタイプ宣言;
プロトタイプ宣言;
            ：


#endif //  _（大文字で記述したファイル名)_H_
```
#ifndef, #define, #endif は「マクロ」と言い、C言語そのものの文法等は無関係だけど、コンパイラに指令を与えるもの。これにより二重インクルードを防いでいる。
二重インクルードが防げる理由は後述。

# #defineマクロ
マクロの中で一番使用頻度が高いマクロ
テキスト痴漢を行るために使用される
#defineマクロの書式
```c
#define マクロ名 置換テキスト
```

# extern修飾子
extern修飾子を解説する前に、「複数のファイル分割」について見ていく
```c:main.c
#include <stdio.h>
#include "calc.h"
#include "showResult.h"

int main(int argc, char** argv) {

	int a = 2, b = 3;
    
	printf("%d + %d = ", a, b);
    
	add(a,b);
	showAnswer();
    
	printf("%d - %d = ", a, b);
    
	sub(a, b);
	showAnswer();
    
    return 0;
}
```
```c:calc.h
#ifndef _CALC_H_
#define _CALC_H_

void add(int, int);
void sub(int, int);

#endif // _CALC_H_
```
```c:showResult.h
#ifndef _SHOW_RESULT_H_
#define _SHOW_RESULT_H_

void showAnswer();

#endif // _SHOW_RESULT_H_
```
```c:calc.c
#include "calc.h"

int ans;

void add(int a, int b){
	ans = a + b;
}

void sub(int a, int b){
	ans = a - b;
}
```
```c:showResult.c
#include "showResult.h"
#include <stdio.h>

extern int ans;

void showAnswer(){

	printf("%d¥n", ans);
}
```
### グローバル変数の扱い
ヘッダいファイルがcalc.h, showResult.hの二つに分かれ、それぞれのヘッダファイルに対応する実装が、clac.c, showResult.cに記述されている

ここで問題になるのが、グローバル変数ansの対応方法。
プログラムが複数に分割された場合、宣言されているファイル以外の場所ではグローバル変数は使えなくなる。
今回の例だと、ans変数はclac.cにも、showResult.cにも両方で使用する。しかし、定義はどちらか一方にしかできない。ここで役立つのがextern修飾子

### extern修飾子
externは「ここではこの変数を使うけど、使うだけで定義は他にありますよ」という意味で使われる
extern修飾子の使用例
```c
extern データ型 変数名;
```
externによって異なるソースファイルの中で、共通のグローバル変数を利用しているということになる。

# おわりに
結局externはソースファイルかヘッダファイルか、どっちに書くのがいいのかよくわからない。
また明日勉強してまた学びがあれば追記する。
ロードバランサー解説　-サーバー冗長化

<h2>はじめに</h2>
<p>「アクセスが増えたらサーバーが落ちた…」<br>
そんな経験ありませんか？</p>

<p>実は、それ、<strong>ロードバランサー</strong>で解決できるかもしれません。</p>

<p>この記事では、</p>
<ul>
  <li>「そもそもロードバランサーって何？」</li>
  <li>「どんなときに使うの？」</li>
  <li>「具体的にどうやって構築するの？」</li>
</ul>
<p>を、図解・実例・わかりやすさ重視で解説していきます</p>

<h2> ロードバランサーとは？一言で説明すると…</h2>
<blockquote>
  <strong>複数のサーバーに処理をうまく振り分けてくれる “交通整理のお兄さん”</strong> です。
</blockquote>

<p>Webサービスは、アクセスが増えると1台のサーバーでは耐えきれなくなります。そこで、<strong>複数台のサーバーで処理を分担する</strong>必要が出てきます。</p>

<p>そのときに活躍するのが<strong>ロードバランサー（Load Balancer）</strong>です。</p>

<h2>なぜ必要？ロードバランサーが解決する3つのこと</h2>

<ul>
  <li><strong>✅ 1. 高負荷時の耐性強化（スケーラビリティ）</strong><br>
  複数サーバーにリクエストを分散することで、サーバー1台あたりの負荷を下げられます。</li>

  <li><strong>✅ 2. 障害時の自動切り替え（冗長性）</strong><br>
  あるサーバーが落ちても、ロードバランサーが別の生きてるサーバーに自動で振り分け。</li>

  <li><strong>✅ 3. 一貫したエンドポイントの提供</strong><br>
  ユーザーは「<code>https://my-app.com</code>」にアクセスするだけ。裏側でどのサーバーに処理が行くかは自動です。</li>
</ul>

<h2>🛠 ロードバランサーの種類</h2>

<table>
  <thead>
    <tr>
      <th>種類</th>
      <th>特徴</th>
      <th>代表例</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>L4ロードバランサー</td>
      <td>IP/ポート単位で振り分け</td>
      <td>Nginx（streamモード）, AWS ELB</td>
    </tr>
    <tr>
      <td>L7ロードバランサー</td>
      <td>HTTPの内容で振り分け</td>
      <td>Nginx（httpモード）, HAProxy</td>
    </tr>
  </tbody>
</table>

<h2> 実例で学ぶ：Nginxで簡単ロードバランサー構築</h2>

<h3>構成イメージ図</h3>
<pre>
[ Client ] 
    ↓
[ Nginx (LB) ]
    ↙      ↘
[ App1 ] [ App2 ]
</pre>

<h3> Nginxの設定</h3>

<pre><code>
http {
  upstream backend {
    server app1.local:3000;
    server app2.local:3000;
  }

  server {
    listen 80;

    location / {
      proxy_pass http://backend;
    }
  }
}
</code></pre>

<h3> 実行結果</h3>
<p>ブラウザからアクセスすると、App1, App2 に<strong>ラウンドロビン方式</strong>でリクエストが分散されます！</p>


<h2>まとめ</h2>
<ul>
  <li>ロードバランサーはサービスの<strong>安定運用に必須</strong></li>
  <li>高負荷・障害に<strong>強くなる</strong></li>
  <li>設定も<strong>意外と簡単！</strong></li>
</ul>
<p>導入するだけで、<strong>「落ちないサービス」への第一歩</strong>になります。</p>
WSLでGitを使う

#### Gitのインストール

```bash
# WSLには初めからGitがインストールされている
# 最新バージョンに更新する
sudo apt-get install git
```

#### Gitユーザ情報の設定

```bash
git config --global user.name "Your Name" 
git config --global user.email "youremail@domain.com"

#設定確認
git config --list
```

#### SSH認証設定

```bash
cd ~ 
# SSHキーを生成（Enterを3回押す）
ssh-keygen -t rsa

# rsaファイルの生成を確認
ls ~/.ssh/

#GitHubのSSHキー追加画面に入力するSSHキー情報をクリップボードにコピー
cat ~/.ssh/id_rsa.pub | clip.exe

#GitHubの下記リンクへアクセスし、作成したSSHキー（公開鍵）を登録
#https://github.com/settings/ssh

# Githubに対してSSHの接続確認（yesと入力）
ssh -T git@github.com

# 「You've successfully authenticated」というメッセージがでればOK
```

#### git cloneを試す

```bash
git clone git@github.com:dbarnett/python-helloworld.git
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213285/bd739dc4-616c-457b-a07f-0e3e1b10bef1.png)

#### 参考
https://learn.microsoft.com/ja-jp/windows/wsl/tutorials/wsl-git

https://continue-cloud.net/wsl2-03/
rpi-imager を使ったヘッドレスインストール

Ubuntu 25.04 上の rpi-imager を使って、Raspberry Pi 4 にヘッドレスインストールをしました。

コマンドの起動

```bash
rpi-imager
```

デバイス、OS、ストレージを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/ab03be8f-15ef-40f0-9f9e-c9528759b310.png)

「設定を編集する」をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/9d34063b-7c71-4ce1-ba1f-b1ad1ffebaa0.png)

ホスト名、ユーザー名、WiFi を設定する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/420eaef7-6844-4628-8d70-8392c2fd5ac2.png)

SSH を有効化

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/da6e210e-31fe-42b6-a6ae-326fde8f4948.png)

保存
実行

## インストールされたバージョン

```text
$ cat /etc/os-release 
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
```
AtCoder ABC409 振り返り #C++

# はじめに
ABC409に参加したので振り返ります。
結果は2完でした。
今回は本番で解けた2問＋C問題についてまとめます。

# [A - Conflict](https://atcoder.jp/contests/abc409/tasks/abc409_a)
### 解法
文字列の比較ですね。
本番では両方`x`（欲しがっていない）の場合でも出力が`Yes`となるようにしていたので1度`WA`が出ました（もったいない…）。

```cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
    int N;
    string T, A;
    cin >> N >> T >> A;

    for (int i = 0; i < N; i++) {
        if (T[i] == A[i] && T[i] != 'x') {
            cout << "Yes" << endl;
            return 0;
        }
    }
    cout << "No" << endl;
}
```

# [B - Citation](https://atcoder.jp/contests/abc409/tasks/abc409_b)
### 解法
まず、配列をソートして降順に直します。降順の理由は大きな数から探していくことで効率化を図るためです。
その後、配列の`X`番目の要素が`X`回以上現れるかを判別します。

```cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
    int N;
    cin >> N;

    vector<int> A(N);
    for (int i = 0; i < N; ++i) {
        cin >> A[i];
    }

    // 配列をソート（降順）
    sort(A.begin(), A.end(), greater<int>());

    for (int x = N; x >= 1; --x) {
        if (A[x - 1] >= x) {
            cout << x << endl;
            return 0;
        }
    }
    cout << 0 << endl;
}

```

# [C - Equilateral Triangle](https://atcoder.jp/contests/abc409/tasks/abc409_c)
### 解法
円周上にある点がつくる正三角形の個数を求める問題でした。円周の長さ`L`なので、各点の距離が`L/3`の場合をカウントしていきます

```cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
    long long N, L;
    cin >> N >> L;

    if (L % 3 != 0) {
        cout << 0 << endl;
        return 0;
    }

    vector<long long> d(N - 1);
    for (int i = 0; i < N - 1; ++i) {
        cin >> d[i];
    }

    vector<long long> P(N);
    P[0] = 0;
    for (int i = 0; i < N - 1; ++i) {
        P[i + 1] = (P[i] + d[i]) % L;
    }

    std::map<long long, int> counts;
    for (long long pos : P) {
        counts[pos]++;
    }

    std::vector<long long> unique_positions;
    for (auto const& [pos, count] : counts) {
        unique_positions.push_back(pos);
    }

    long long third_L = L / 3;
    long long two_thirds_L = 2 * L / 3;
    long long ans = 0;

    for (long long p_a : unique_positions) {
        long long p_b = (p_a + third_L) % L;
        long long p_c = (p_a + two_thirds_L) % L;

        if (counts.count(p_b) && counts.count(p_c)) {
            ans += (long long)counts[p_a] * counts[p_b] * counts[p_c];
        }
    }
    cout << ans / 3 << endl;
}
```

# おわりに
ソートの類似問題をたくさん解きたいです。
node -vは正しいのにnpm runでバージョンが違う？消したはずのvoltaが原因だった話

## はじめに

皆さんはこんな経験、ありませんか？  
nodebrewで最新の Node.js バージョンに設定し、ターミナルで `node -v` を叩けば確かに最新版が表示される。しかし、いざ `npm run dev` で開発サーバーを起動しようとすると、「Node.js のバージョンが古い」と怒られてしまう…。  
今回、まさにこの不可解な現象に遭遇しました。原因は、以前使っていて、もう完全に削除したと思い込んでいた別のバージョン管理ツール Volta の残骸でした。

本記事では、回り道だらけだったデバッグの全記録と、競合する環境を完全にクリーンアップする手順を共有します。同じように“消したはずの幽霊”に悩まされている方の助けになれば幸いです。

---

## 遭遇した問題：完璧なはずの環境と、矛盾するエラー

まず、私が直面した状況を整理します。

### 【症状1】アプリケーションからのエラー

> Node.js version v20.10.0 or higher is required to use @lazarv/react-server.  
> You are currently running Node.js v18.16.0.

### 【症状2】ターミナルでのバージョン確認

> $ node -v  
> v22.4.0  
>
> $ which node  
> /Users/ユーザー名/.nodebrew/current/bin/node

nodebrew によって要件を満たす v22.4.0 が正しく設定されていました。この矛盾が、すべての始まりでした。

---

## 犯人探しの長い旅路

私は、考えられる原因を一つずつ潰していきました。

1. **STEP 1: 競合するバージョンの捜索**  
   `which -a node` でシステム内の全ての node 実行ファイルを探しましたが、nodebrew 管理下のパスしか見つかりません。クリーンな環境に見えていました。

2. **STEP 2: 環境の完全リセット**  
   PC の再起動、`npm cache clean`、`node_modules` の削除などを試みましたが、“幽霊”は消えず…。

3. **STEP 3: `npm run` の実行プロセスを疑う**  
   `npm run` というコマンドの実行プロセスそのものに目を向け、OS に直接コマンドを実行させる start.sh というテストスクリプトを作成。すると、ついにサーバーが正常に起動！  
   これにより、問題は **npm run という特定の実行方法に起因する** と特定できました。

---

## 消したはずの幽霊：すべての元凶は Volta の残骸だった

- **Volta の強力な影響力**  
  本体を削除しても、シェル設定ファイル（`.zshrc` や `.bash_profile`）に残るパス設定や、npm の内部記憶が、`npm run` 時に影響を及ぼし続けます。

- **不完全なアンインストール**  
  設定の残骸がシステムに“幽霊”として残り、npm run のときだけ悪さをしていたのです。

- **sudo が残した権限問題**  
  過去に `sudo` で npm やファイル操作を行ったことで、`.npm` ディレクトリや設定ファイルの所有者が root に変わり、掃除しようとすると権限エラーが発生していました。

---

## 競合を解決し、環境を正常化する全手順

1. **不要なバージョン管理ツール（Volta）の完全撤去**  
   - `~/.volta` ディレクトリを削除  
   - シェル設定ファイル（`.zshrc`／`.bash_profile`）から Volta に関する記述を完全に削除

2. **ファイル所有権の修復**  
   過去に sudo で変更された設定ファイルを自分自身の所有に戻します。  
   例: ファイルの所有権をユーザーに戻す  
   `sudo chown ユーザー名:staff ~/.bash_profile`

3. **本命のバージョン管理ツール（nodebrew）設定の再確認**  
   `.bash_profile` に以下の一行が正しく記述されているか確認します。  
   `export PATH=$HOME/.nodebrew/current/bin:$PATH`

   > **補足:**  
   > macOS の標準シェルは Zsh のため、`.bash_profile` が自動読み込みされない場合は、  
   > `~/.zshrc` に次の一行を追記してください。  
   > `source ~/.bash_profile`

4. **プロジェクトと npm キャッシュのリセット**  
   - `node_modules` ディレクトリを削除  
   - `npm cache verify` によるキャッシュ検証  
   - `npm install` で再構築

5. **最終確認**  
   改めて `npm run dev` を実行し、nodebrew 管理下の v22.4.0 でサーバーが正常に起動することを確認。

---

## まとめ：今回の戦いから得られた教訓

- **バージョン管理ツールのアンインストールは慎重かつ完全に。**  
  設定ファイルの残骸が後々不可解な問題を引き起こします。

- **バージョン管理ツールは原則一つに絞る。**  
  複数ツールの共存や過去の共存環境は競合の温床となります。

- **sudo は影響を理解して慎重に。**  
  安易な sudo は将来の自分を苦しめる権限問題を生み出します。

この記事が、同じように“消したはずの幽霊”と戦っている誰かの助けになることを願っています。
LookerStudioのダッシュボードごとの閲覧数を可視化する

### ▼背景

過去に作られたLookerStudioのダッシュボードが大量にあったが、各ダッシュボードの利用状況が分からず棚卸をする際には使っている人がいないかどうかを都度ヒアリングなどにて確認する必要があった。
この手間を無くすため、LookerStudioダッシュボードの閲覧数を可視化することを試みた。

### ▼この記事で分かること

LookerStudioにて作成した各ダッシュボード閲覧数を可視化するやり方を解説する。  
使われていないダッシュボードと使われているダッシュボードを一目で分かるようにするなどの用途が考えられる。

実施する中でいくつか詰まったポイントや学びがあったためその点を補足する。

最終的には、**ダッシュボード名**、**ダッシュボード内のページ**ごとの閲覧数をLookerStudioにて可視化することを目指す


### ▼詰まったポイント・学びまとめ

- LookerStudioのダッシュボードはウェブページであるためGA4でアクセス解析が出来る
- GA4プロパティを作成する際に入力するドメインは`lookerstudio.google.com`
    - ※これ配下のパスは不要
- GA4のディメンション「ページ タイトル」には`ダッシュボード名 › ページ名`のように文字列が入る
    - 計算フィールドを作成する際、「>」と 「›」 の違いに注意
    - 「›」は欧州言語の引用符や区切りに使われるものらしく「>」とは違う

---

### ▼ダッシュボードごとの閲覧数を可視化する手順


#### 〇データの流れ

各LookerStudioダッシュボード → GA4 → 可視化用のLookerStudioダッシュボード

#### 〇閲覧数可視化の流れ全体像

1. 新たにGA4のプロパティを作成  
2. LookerStudioの各ダッシュボードにてGA4測定IDを設定する  
3. 新たなダッシュボードを作成し、LookerStudioにて計算フィールドを作成する
    - ダッシュボード名
    - ページ名  
4. グラフを作る


細かい手順については説明を省く。  
ここでは少し迷うポイントなどについて説明することに留める。

#### ① 新たにGA4のプロパティを作成

文字通りGA4のプロパティを新規で作成する。

この際にドメインを入力することを求められる。  
ここでどのドメインを入れればよいのか少し迷ったが、`lookerstudio.google.com`で問題なかった。

※特定のダッシュボードのURLを入力してしまうとそのダッシュボードしか閲覧数を取得できないため注意。

#### ② LookerStudioの各ダッシュボードにてGA4測定IDを設定する

閲覧数を計測したいLookerStudioのダッシュボード全てにてGA4測定IDを設定する必要がある。  
作成したプロパティ・データソースの測定IDを入力する。

操作箇所は以下↓
`ファイル > レポート設定 > LookerStudioの各ダッシュボードにてGA4測定IDを設定する`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2998651/cba467e5-1409-4d0a-89c0-d3a7c95839cf.png)


#### ③ LookerStudioにて新たなダッシュボードを作成し、計算フィールドを作成する

ダッシュボードの閲覧数を可視化するためのLookerStudioダッシュボードを作成する。

データソースには、先ほど作成したGA4プロパティを選択する。

ここで各LookerStudioダッシュボードの閲覧数をLookerStudioにて可視化する準備が整ったが1点問題があった。それは、ページタイトルディメンションに格納される値が以下の形式であることだ。

`ダッシュボード名 › ダッシュボード内ページ名`

この形式ではダッシュボードごとの閲覧数を可視化することが出来ない。そのため計算フィールドを作成することによりダッシュボード名とページ名を切り分ける必要がある。
以下計算フィールドを2つ作成する。

```sql
// ダッシュボード名
REGEXP_EXTRACT(ページ タイトル, '^(.*?)\\s*›')
// ページ名
REGEXP_EXTRACT(ページ タイトル, '›\\s*(.*)$')
```

ここで個人的に詰まったポイントがあった。それは「>」と 「›」の違いである。
ぱっと見た時に`ダッシュボード名 > ダッシュボード内ページ名`に見え、「>」と 「›」の違いに気が付かなかった。
「›」は欧州言語の引用符や区切りに使われるものらしく「>」とは違うらしい。
私はこれに気づかず正規表現にて「>」を基準に切り分けてしまっており苦戦した。

#### グラフ化する

作成した計算フィールドをディメンションに、指標を表示回数としてグラフを作成する。

これで完成である

※➀にてGA4プロパティを作成して当日すぐにデータが反映されるわけではない。1日待って結果を確認する必要がある
ハッカソン初参加

### はじめに
昨日敗者復活戦を終えて、今の心境を残しておきたく書いています。

### 参加に至った経緯
ハッカソン参加したことありますか？

私は、ハッカソンに興味はありつつ、つよつよエンジニアだけがでれるものであって、私には程遠いものだなとずっと思っていました。

そんな私が参加に至ったのは、
以前からお世話になっているエンジニアコミュニティの初のハッカソン開催で、女性も多く、そして挑戦を応援してくれる雰囲気を知っていたからです。この機会逃したら一生参加に手をあげれないかもと思いました。
　
実は、「ハッカソン出る私」になってみたかったんです。
　
ただ、本業、家事、育児にてんてこまいな毎日で、体力的にも精神的にもやりきれるのか不安もありましたが、やれるところまででも。
　
「やってみる」の選択をしました。
　
ハッカソンでは、個人参加とチーム参加ができましたが、
私はひとりで続けるのはモチベーションがなかなか続かないので、以前のアプリ開発の勉強仲間に声をかけて３名のチーム参加することに。

参加したのはこちらのハッカソンです↓↓

https://wake-career-socialai-hackathon-2025.studio.site/


### アプリ開発ができるようになってきた１年
ちょうど１年ほど前に書いた記事ですが、

https://qiita.com/nanchan/items/18bac5ed1151023a1650

私は、インフラエンジニアというほどでもなく、アプリエンジニアでもなく、アーキテクトでもなく、プロマネでもなく、でも何者かになりたいと思っていました。

この記事を書いた時期、気になるならもう少しアプリ開発をやってみようと決意して、半年間女性向けプログラミングスクールのMs.Engineerに入りプログラミングを学んで、Next.js、TypeScript、Python、Dockerなどを使って何度かアプリ開発をしてきました。こちらのプログラミングスクールでは最終的には作るものの企画から開発まで全ての一連をやります。

この経験を経て、何かしら動くアプリを作る技術を得ることができ、何か次の目標に向かって手を動かして開発をしたいと思えるようになっていたことも大きいです。

本業では非機能まわりのテスト推進であったり、プロジェクトマネジメントをやっていて、アプリ開発で手を動かすこともなく（やりようによってはアプリ改修などやれるはずですが、本業となるとコード量も多く複雑で理解が及ばずより手を出しづらい）、そこから何かに向かってアプリ開発する機会をどう得たらよいのか迷子でした。

そこで、ハッカソンへの挑戦というのは、自分にとってよいタイミングでの挑戦だったと思います。


### ハッカソンスケジュール
- 25/4/22 キックオフ　
- 25/5/24 中間発表、全34チームから最終ピッチの5チーム選ばれる
- 25/6/07 敗者復活戦、プラス１チームが選ばれる
- 25/6/21 最終ピッチ

1ヶ月で作りたいものの企画から、コーディングまでやるなかなかハードスケジュールです！
週2くらいで21時からチームメンバーと集まりつつ、子供が寝た後の時間や早朝、平日のお昼休みとかの時間、有休の日、休日の子供の習い事の合間の時間を使って取り組みました。

### 参加して振り返り
敗者復活戦にも参加して、結果は残念でしたが、

仲間と開発できたことに　⭕️
ハッカソンに参加したエンジニア仲間との繋がりが増えたことに　⭕️⭕️
挑戦した自分　⭕️⭕️⭕️

です！！！

多少の後悔としては、企画やプレゼン準備に多くの時間を割いてしまい、本来やりたかった開発への時間が少なくなってしまったことです。特に選ばれたチームのアプリは、細部まで練られたものがアプリとして動くものになっているものが多く、シンプルにすごいなぁという感想でした。


### 最後に
今回の機会に対して、一緒に開発してくれた仲間、一緒に取り組んだみなさん、運営のみなさんに本当に感謝しています。
アプリ開発にここ１年挑戦してみて、心境も変化してきました。また半年後、１年後に「ハッカソン初参加」というこの記事を読み返した自分の心境が気になるところです！
こんな少しずつの積み重ねが、また次の自分を作っていくと信じています。

最後まで読んでいただきありがとうございました！
MOSFET PWM(パルス幅変調)

子どもが興味あると言うのでFET遊びしてみました。

::: note
- CMOS FET (通称、モスフェット)
- Complementary Metal-Oxide-Semiconductor FieldEffectTransistorの略
- 日本語では金属酸化膜半導体電界効果トランジスタ
- Nチャネル型ではゲートに電圧を掛けると ドレイン、ソース間が開通してスイッチング。
- スマートフォン、LCDテレビの画素表示用、マイクロプロセッサ内に数千億個入ってます。

:::

- 8番ピンの電圧でモータ回せばと思うかも知れないが20mA位しか取れないので不可。小型のLEDなら直接光らせることは可能。
- 電圧も5V以上必要な場合は回路図通り12V等を外部から供給してスイッチングをFETで行う事になる。
- FETはFTA04N60D。抵抗器は動作安定用。
:::

<FONT COLOR="BLUE">

#### 1.誰が書いても似たような物になる一般的な回路

</FONT>

![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821882/13c7a67d-a057-440b-b65f-425ef384e3ac.jpeg)

<FONT COLOR="BLUE">

#### 2.Arduino R3 Duo マイコンボード

</FONT>



![P1450149.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821882/70266ccb-a4e8-4ec6-9f90-64cc442a2d61.jpeg)

<FONT COLOR="BLUE">

#### 3.C++

</FONT>


```
void setup() {
  pinMode(8, OUTPUT); 
}

void loop() {
  while (1){
	digitalWrite(8, HIGH);
	delay (200);

	digitalWrite(8, LOW);
	delay (200);
  }
}
```

<FONT COLOR="BLUE">

#### 4.パラメータ変えて回転具合を観察している動画

</FONT>

<iframe width="560" height="315" src="https://www.youtube.com/embed/KTuoG-m698c?si=f9N4MbXxIvnQ0aUE" 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>



- 0:30,1:00,2:35辺りは休止時間が長めになっていて電流計が下がっているのが分かる。



::: note
   FTA04N60D 諸元 データシート抜粋
   Type of Transistor: MOSFET
   Type of Control Channel: N -Channel
   Pd ⓘ - Maximum Power Dissipation: 28 W
   |Vds|ⓘ - Maximum Drain-Source Voltage: 600 V
   |Vgs|ⓘ - Maximum Gate-Source Voltage: 30 V
   |Vgs(th)|ⓘ - Maximum Gate-Threshold Voltage: 4 V
   |Id| ⓘ - Maximum Drain Current: 4 A
   Tj ⓘ - Maximum Junction Temperature: 150 °C
   tr ⓘ - Rise Time: 9.8 nS
:::
貯金9000円。僕の人生、詰んでる？それでもReact Nativeエンジニアを諦めない理由

## 【絶望からの再起】貯金9000円、それでもReact Nativeエンジニアを目指す私の現在地

はじめまして。現在、就職活動の渦中にいる **渡邊** です。正直、今、人生で最も厳しい局面に立たされています。手元にあるのはわずか9000円の貯金。それでも、私が諦められない夢と、プログラミングへの狂おしいほどの情熱について、包み隠さずお話ししたいと思います。

## １．これまでの軌跡：挫折と学びの連続

私のキャリアは、決して華々しいものではありません。高校卒業程度認定試験に合格後、ゲーム開発の専門学校に入学したものの、半年で退学。その後、IT企業のサポートデスクで1年半勤めましたが、新しい挑戦を求めて辞職しました。

次に目指したのは起業です。Webサービスの開発に没頭しましたが、資金不足で断念。短期間ではありましたが、不動産営業にも身を置きました。そして今、再び就職活動の真っただ中にいます。

「なぜ、そんなにコロコロと職を変えているんだ？」と思われるかもしれません。確かに、短期間での離職だけを見れば、そう捉えられても仕方がないでしょう。しかし、私の根底には**「将来、自分のサービスを作り、世に送り出したい」**という強い想いがありました。

## ２．React Nativeへの揺るぎない信念と、私の強み

そんな私ですが、この4年間、**「プログラミング」**だけはどんな時も諦めませんでした。文字通り、狂ったようにコードを書き、新しい技術を学び続けてきました。そして、今、私の情熱が最も注がれているのが**React Native**です。

React Nativeは、Webとアプリを同時に開発できる革新的な技術であり、私は**Reactが将来的にWebとアプリ開発の基盤となるライブラリになる**と確信しています。世界でも日本でも、その技術はさらに広がりを見せるでしょう。だからこそ、私は**React Nativeエンジニア**として働くことを最大の目標にしています。

先日、これまでの集大成として、**自分のアプリを開発し、ポートフォリオとしてまとめることができました。**これは、私の技術力と、React Nativeへの熱意を示す最大の武器だと信じています。実務経験がない私にとって、このポートフォリオこそが、ポテンシャル採用のチャンスを掴むための唯一の道だと思っています。

## ３．現実と理想の狭間で：通勤時間と希望技術

私の場合、就職活動は簡単ではありません。高望みをしている部分もあると自覚しています。

まず、**通勤時間**です。現在、横浜市青葉区に住んでいる私にとって、通勤に片道1時間を要することは大きな負担です。往復2時間は、体力的にも精神的にも厳しいと感じています。横浜駅周辺や渋谷にはIT企業が多いですが、田園都市線沿線には希望するReact Nativeを扱っている企業が少なく、通勤時間と希望技術の両方を満たす企業を見つけるのは至難の業です。できれば、通勤時間40分以内、欲を言えば30分以内、それ以下を希望しています。

次に、**React Nativeの実務経験がない**ことです。アプリ開発の企業は数多く存在しますが、React Nativeをメインで扱っている企業はまだ限られています。その中で、実務経験がない人間が希望の職を得るのは、非常に高い壁です。

今回の就職活動では、**1年や2年といった短期間で辞めるのではなく、もっと長く、腰を据えて働ける企業を見つけたい**という強い思いがあります。だからこそ、すぐに辞めてしまうような企業ではなく、**ちゃんとした経歴と経験、そして実績を積むことのできる企業**を探しており、それが今の就職難に繋がっているのかもしれません。

## ４．今、そしてこれから：諦めない決意

手元にあるのは9000円。貯金もなく、生活は困窮しています。正直、不安で押しつぶされそうになる夜もあります。しかし、私には**「この4年間、いつもプログラミングのことを考え、狂ったようにプログラミングをしてきた」**という、誰にも負けない経験と熱意があります。

願わくば、**今月中になんとしても就職先を見つけたい。**

このブログ記事が、私の技術と情熱に共感し、ポテンシャル採用のチャンスをくださる企業との出会いのきっかけになることを心から願っています。

**もし、私のスキルや熱意に興味を持っていただける企業の方がいらっしゃいましたら、または何かアドバイスをいただける方がいらっしゃいましたら、ぜひお声がけいただけますと幸いです。**
マイクロサービスアーキテクチャの検討

# 起源

マイクロサービスアーキテクチャの起源は？を調べた。
→　ネットで調べた感じ、このあたりが期限と思われる


## Micro Services – Java the Unix way
2012年3月20日, James Lewis
> http://2012.33degree.org/pdf/JamesLewisMicroServices.pdf

ある高トラフィックなシステムをマイクロサービスアーキテクチャで構築したときの経緯が記載されている。マイクロサービス自体の


### チャプター

1. 分割して制圧せよ。外側から始めてビジネス機能をモデリングする
2. コンウェイの法則を使ってチーム構成を決める
3. 最後の責任ある瞬間（Last Responsible Moment）を意識し、最も情報が少ない時点で全てを決めない
4. ウェブの一部であれ、ウェブの裏側に隠れるな
5. 重要なことは設計の明示的な要素にしなさい
6. サービスのオーケストレーションよりもコレオグラフィー（振付）を優先する
7. ハイパーメディアコントロールを使ってサービス間の結合を緩める

## Microservices

2014年3月25日James Lewis, Martin Fowler
> https://martinfowler.com/articles/microservices.html

Microserviceを定義した記事。とりあえず最低限の共通認識として、これを読んでおけばよい。

### チャプター
- マイクロサービスアーキテクチャの特徴
    1. サービスによるコンポーネント化
    1. ビジネス機能に基づく構成
    1. プロジェクトではなくプロダクトとして捉える
    1. スマートなエンドポイントとシンプルなパイプ
    1. 分散型ガバナンス
    1. 分散型データ管理
    1. インフラの自動化
    1. 障害を前提とした設計
    1. 進化的設計
- マイクロサービスは未来なのか？

### キーワード
|用語|概要|影響|
|-|-|-|
| [Component](https://martinfowler.com/bliki/SoftwareComponent.html)|この記事では独立して交換およびアップグレード可能なものとして定義されている|
|Dumb pipe|ロジックを持たないメッセージを受け渡すだけの役割で、文中ではRabbitMQやZeroMQなどが該当する。一般的にはPub/Subのブローカーなどが該当する。|
|[Consumer-Driven Contracts](https://martinfowler.com/articles/consumerDrivenContracts.html)|「CDCテスト」という単語で使われることが多い。簡単にいうと、APIの仕様を呼び出す側が決めること|あるシステムの仕様の一部が呼び出し先に依存する。|
|[Bounded Context](https://martinfowler.com/bliki/BoundedContext.html)|ドメイン駆動設計(DDD)で用いられる、ある用語が通用する領域。マイクロサービスの分割単位の指標として用いることがある。|
|eventual consistency|結果整合性。RDBでいうところのトランザクションを張らずにデータ更新を行い、処理途中に整合性が取れていない状態を許容すること||
|circuit breaker|別のマイクロサービスとの連携が必要な機能において、連携先に障害が発生したことをマイクロサービス内で共有して、リクエストすることなくエラーとして扱う仕組み。|
統計初心者が統計検定２級とPythonデータ分析試験を同時受験するよ


統計ほぼゼロの社会人が **統計検定２級** と  
**Python 3 エンジニア認定データ分析試験** を  
“ついでに” 同時合格を目指す記録です。

　認定テキストや、AIに聞いた内容をまとめる勉強ノート代わりの備忘録になります。
　今回は環境構築とヒストグラムの作成まで。

## 🪼 現在地
- 統計 = 教養１単位分の記憶のみ
- PC = MacBook Air (M1), Excel は期限切れ
- 資格 = 基本情報技術者をこの４月に取得済み
- プログラミング = MATLAB,Pythonをほんの少し

## 🎯 ゴール
| 試験 | 予定 | 合格ライン |
|------|------|-----------|
| 統計検定２級 | 2025年8月 | 60点/100 |
| Pythonデータ分析 | 同上 | 70% |

## ⛺ 環境構築
　Anacondaは公式サイトからインストール済みという前提で進みます。Pythonのバージョンは3.12でした。
　Anaconda Navigator（GUI）ではなく、Macのターミナルから起動してみます。仮想環境を構築するので、ターミナルを開いて、以下のコマンドを入れます。
```
conda create -n stats312
```
　環境構築ができたら、仮想環境を有効化！
```
conda activate stats312
```

　これで仮想環境を有効化できたので、必要そうなライブラリを入れていきます。今回入れるのは、以下の５つのライブラリ+jupyterlabです。
- numpy
- pandas
- scipy
- matplotlib
- seaborn
- jupyterlab

```
conda install numpy pandas scipy matplotlib seaborn jupyterlab
```
　ライブラリが入ったら、```jupyter lab```でJupyterLabを開きます。

## 📊 ヒストグラムの作成
環境構築ができたので、とりあえずヒストグラムの作成をやってみます。
統計検定２級認定テキスト「統計学基礎」P7の表1.4を元に、度数分布表とヒストグラムを作成します。

- 度数分布表の作成
pandasのDataFrameを使います！
```
import pandas as pd

data = {
    "階級下限" : [60001, 70001, 80001, 90001, 100001, 110001, 120001, 130001, 140001],
    "階級上限" : [70000, 80000, 90000, 100000, 110000, 120000, 130000, 140000, 150000],
    "度数" : [4,10,35,35,16,14,11,8,7]
}

df = pd.DataFrame (data)
df["階級値"] = (df["階級下限"] + df["階級上限"])/2 

print(df)
```
　度数分布表ができました。

- ヒストグラムの作成
matplotlibを使ってデータの可視化をしてみます。
度数集計済みなので```plt.bar()```で棒グラフにしてみます。

```
import matplotlib.pyplot as plt
import japanize_matplotlib 

plt.bar(df["階級値"],df["度数"],width=10000,edgecolor='blue',align='center')
plt.xlabel("家賃（円）")
plt.ylabel("度数")
plt.grid(axis = 'y')
plt.show()
```

※matplotlibで日本語表示がされなかったので、日本語フォントが出るように設定し直しています。
一回JupyterLabを閉じて、ターミナル上で Ctrl+Cを押してJupyterを終了させてから、```pip install japanize-matplotlib```でインストールしました。

- 出力されたヒストグラム

![作成したヒストグラム（家賃と度数）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4090855/b8a5f7e4-823a-40b3-8db7-3009b0622259.png)
　できました！

- 気づき
度数分布表をDataFrameで作ってるので、階級幅を変えたりできないのが気になりました。もし生データがある場合は、```plt.hist()```の方が階級幅を自由に指定できて、柔軟なグラフが作れるみたいです。

## 🐙 まとめ
　プログラミングと統計、どちらもほぼ初心者なので、とにかく手を動かしたのがよくて、頭に入ったなと思いました。
　Pythonでグラフが作れそうなので、お高いExcelを買わなくて済みそうです。やった〜。

 　今日はここまで。週１くらいで更新していければと思っています。
slice(start,end)で、end - 1までっていうのがちょっと思い出しにくかったのを解決した

 ## なにこれ

よく、「あれ、範囲って第二引数の一個前までだっけ」ってなってたけど、あるとき、「あ、これだったら、久しぶりに使う時もイメージできそーだなー」と思ったので備忘録。

## 区切りのインデックスって考えた

文字や要素自体を数えるんじゃなくて、各区切りをゼロスタートのインデックスって考えたら、個人的に覚えやすかった。

### 正の整数の場合

```typescript
const array = [ "one", "two", "three", "four", "five" ];
//             ↑     ↑      ↑        ↑
//             0     1      2        3

const newArray = array.slice(0, 3);
console.log(newArray); // ["one", "two", "three"]
```

```typescript
const string = "onetwothreefourfive"; // 矢印ずれるけど伝われ！
//              ↑          ↑
//              0          11

const newString = string.slice(0, 11);
console.log(newString); // "onetwothree"
```

### 負の整数の場合

```typescript
const array = [ "one", "two", "three", "four", "five" ];
//                          ↑        ↑       ↑       ↑
//                          -3       -2      -1      0
//                                                   第二引数に0入れない
//                                                   指定したい場合は省略

const newArray = array.slice(-3, -1);
console.log(newArray); // [ 'three', 'four' ]
```

```typescript
const string = "onetwothreefourfive"; // 矢印ずれるけど伝われ！
//                    ↑        ↑   ↑
//                    -13      -4  0
//                                 第二引数に0入れない
//                                 指定したい場合は省略

const newString = string.slice(-13, -4);
console.log(newString); // "threefour"
```

## まとめ
よく忘れることを自分なりに覚えやすくしたって話。
生成AIとTransformerの理解まとめ

## はじめに
本レポートは、生成AIの中核技術であるTransformerと、その基盤となった論文「Attention Is All You Need」の理解を目的として理解したことをまとめたものです。過去のRNN/LSTMからTransformerへの技術的飛躍、その仕組みや利点、構造の全体像について。

---

## 背景：生成AIと深層学習の変遷

### RNN（Recurrent Neural Network）とは？
- 時系列データを処理するためのニューラルネットワーク。
- 各時点の出力が次の入力に影響する再帰的構造。
- 問題点：長い文章になると「長期依存関係」を保持しづらく、勾配消失問題も生じやすい。

### LSTM（Long Short-Term Memory）とは？
- RNNの改良版で、"ゲート機構" により重要な情報を保持／忘却を制御。
- より長期の依存関係を保持できる。
- それでも並列処理ができず、処理速度のボトルネックが存在。

---

## Attention

### Attentionとは？
- 各単語（トークン）が他のすべての単語に対して「どれだけ注目すべきか」を計算する仕組み。
- `Query`, `Key`, `Value` のベクトルを用いて重み付けされた出力を生成。

### Self-Attention
- 文章内の各単語が、同じ文章内の他の単語全体を見て意味を理解する仕組み。
- 並列計算が可能なため、処理速度が飛躍的に向上。

---

## 「Attention is All You Need」論文概要

### 論文の革新点
- 2017年にgoogleにより発表
- 再帰処理（RNN）を完全に排除し、**Attention層のみで学習と生成を行う構造（= Transformer）** を提案。
- 並列化が可能なため、学習と推論が高速。
- 長距離依存関係も効率的に学習。

---

## Transformerとは何か？
![スクリーンショット 2025-06-08 15.46.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4053921/151c04ac-625d-4745-9081-d90c4c4756fd.png)

### 一言で言うと
> Self-Attentionを中核とし、並列処理が可能な深層学習モデル構造。

### 構造（Encoder-Decoder型）




```
【入力】→[埋め込み+位置情報]→Encoder（N層）→文脈表現![uploading...0]()

                                              ↓
Decoder（N層）→出力トークンの生成（自分より前のトークンのみ参照）
```

### 各構成要素の役割
| 構成要素 | 説明 |
|----------|------|
| Positional Encoding | 順序情報をベクトルに追加 |
| Multi-Head Attention | 複数の視点で関係性を同時に学習 |
| Feed Forward Layer | 各位置ごとの意味変換 |
| Residual Connection | 学習の安定化 |
| Layer Normalization | 出力の正規化 |

---

## Transformerの特徴

### 強み
- **並列処理が可能**：GPUによる高速処理が可能。
- **長期依存性が強い**：単語間の距離に依存しない。
- **高精度な生成能力**：複数視点から学習（マルチヘッド）することで、複雑な関係も表現可能。

### 注意点
- Attentionは強力だが、計算コストは高い（O(n^2)）。

---

## 用語補足

### パラメータとは？
- 学習される重みやバイアス値など、モデル内部の可変要素。
- パラメータ数が多いほど表現力は高いが、過学習や計算コストが増加する。

---

## まとめ
- Transformerは、Attentionを基盤とする構造で、従来のRNN/LSTMに代わる画期的なモデル。
- 「Attention is All You Need」論文は、その可能性を実証し、現在のChatGPT、GPT-4、BERTなどの原型となった。
- 計算資源の進化（GPU）とアルゴリズムの工夫が、生成AIの大規模化・高精度化を支えている。

---

## 参考文献・資料一覧

### 主要論文
- Vaswani, A., Shazeer, N., Parmar, N., Uszkoreit, J., Jones, L., Gomez, A. N., Kaiser, Ł., & Polosukhin, I. (2017).  
  **Attention Is All You Need.**  
  https://arxiv.org/abs/1706.03762

### 公式ブログ・記事
- Google AI Blog: The Transformer model  
  https://ai.googleblog.com/2017/08/transformer-novel-neural-network.html
- 

### 解説記事・図解
- Jay Alammar, *The Illustrated Transformer*  
  http://jalammar.github.io/illustrated-transformer/

- Qiita記事（複数）  
  https://qiita.com/tags/transformer

- Zenn記事（複数）  
  https://zenn.dev/topics/transformer

### 基礎用語の理解に役立つ資料
- 「深層学習」 岡谷貴之 著（技術評論社）
- 「自然言語処理の基礎」 日本ディープラーニング協会（JDLA）

### ハードウェアと並列処理
- NVIDIA Developer Blog: GPUと深層学習の基礎  
  https://developer.nvidia.com/blog/

---
【Recursion】コーディング問題でアウトプット

# はじめに
私は現在Recursionという学習サービスでコンピュータサイエンスの勉強をしています。
Recursionは随時学んだことをアウトプットできるように様々なコーディング問題が用意されています。
# コーディング問題を解く上で心掛けていたこと
問題の解き方は複数ありますが、これまでなるべく学んだ中での最適なコードで解くように心がけてきました。
例えば、計算量について学んだカリキュラムでは計算量を意識して問題を解いたり、紙にプログラムの動きを書いて問題を解いたりもしました！
### 例（再帰と末尾再帰）
````javascript
// 再帰
function simpleSummation(n) {
    if (n <= 0) {
        return 0;
    }
    return simpleSummation(n-1) + n;
}

-----------------------------------------------------------------

// 末尾再帰
function simpleSummationTail(n) {
    return simpleSummationTailHelper(n,0);
}

//ヘルパー関数
function simpleSummationTailHelper(count,total) {
    //ベースケースに達したら、計算結果を返す
    if (count <= 0) {
        return total;
    }

    //total + count　として、計算結果を足していく。
    return simpleSummationTailHelper(count-1,total+count);
}

-----------------------------------------------------------------

console.log(simpleSummation(5)); //---15

console.log(simpleSummationTail(5));  //---15
````
この二つの関数は同じ出力結果ですが、計算量が違います。
これはJavascriptを含む一部の言語で末尾呼び出し最適化というものです。この技術は、スタックの消費を抑えるために、コンパイラが最適化を行います。
つまり、空間計算量がO(n)からO(1)になり、圧倒的に削減できます！！

# さいごに
カリキュラム一周目では生成AIにもたくさん頼ってしまって、まったくコーディング問題が解けなかったのですが、二周目はAIに頼らず、地道に問題を解いていったらプログラムの動きを正しく追えるようになって様々なコードを思いつけるようになりました！！
第三話　民法の神樹：枝葉の広がりと他法との交錯


---

> 本シリーズ「神樹で読み解く法の構造」は、民法の神樹を三日連続で探求してまいりました。
第三話では、民法の枝葉がどのように展開し、他の法分野と交錯しているのかを掘り下げていきます。


---

📝 民法の神樹 第三話：枝葉の広がりと他法との交錯


---

民法の神樹、全体の調和へ

前回、私たちは民法という神樹の「幹」にあたる基本構造を見てきました。今回は、そこから広がる「枝葉」の展開と、他の神樹とのつながりに目を向けていきます。枝葉が伸びれば、隣の木々とも絡み合い、互いに影響を及ぼし合うのは自然の摂理。それは法の世界でも同様です。


---

契約法・物権法・家族法 ── 枝葉の広がり

民法の中でも特に主要な「枝」にあたるのが、以下の三つの分野です。

🌿 契約法（債権関係）

人と人との約束や取引を定める領域です。売買契約、請負契約、賃貸借など、日常に最も身近な民法の枝葉といえるでしょう。
契約自由の原則のもとに成り立ちつつも、公序良俗や強行規定といった「剪定バサミ」も存在します。

🌿 物権法（所有と使用）

土地や建物、モノの所有とその利用・処分に関わるルールを定めています。
誰が何をどのように持っているか──この分野は、社会の経済活動の安定的基盤を支える「太枝」に相当します。

🌿 親族・相続法（人のつながり）

家族関係や相続など、「人」と「人」との血縁的・社会的関係に関する規定です。
契約や所有とは異なり、制度的・倫理的背景が色濃く影響する枝です。


---

隣り合う神樹との交錯

枝葉は広がる中で、他の神樹の枝葉と重なり合い、境界を曖昧にします。ここでは、民法と他法分野の交錯点を簡単に見ていきます。

📘 民法 × 憲法

憲法は法体系の根幹です。たとえば「契約自由の原則」は、憲法上の「経済的自由」に裏打ちされています。
また、家族法の領域では、憲法24条の「個人の尊厳と両性の本質的平等」がその基盤にあります。

📘 民法 × 行政法

民法上の所有権が、公的な制限（都市計画や収用など）を受ける場合、行政法との関係が現れます。
行政行為が私人の権利義務に影響する点では、私法と公法の「境界線」が問われる場面です。

📘 民法 × 商法

商法は、商人間の取引を中心とする「特別法」です。民法の契約ルールが基本形である一方、商法では迅速・効率性を重視した独自のルールが適用されます。


---

次なる神樹へ ── 憲法の扉を開く前に

こうして、民法の神樹がどれだけ他の神樹と複雑に絡み合っているかを垣間見ることができました。
それは、法が「体系」であり、「孤立したルールの集まりではない」ことの証明です。

次回は、法の森の中で最も高くそびえ、すべての神樹に日を当てる――「憲法の神樹」に足を踏み入れます。
民法を基盤としながら、法の全体を照らすその構造を、次なる物語としてお届けします。


---





> これにて、民法の神樹の探求は一区切りとなります。
次回からは、法体系の根幹をなす「憲法の神樹」へと進んでまいります。
本シリーズは、今後週末に1話ずつの更新を予定しております。引き続きご覧いただければ幸いです。




---
[VRChat] Blackbody Shader(アバターの裏側という概念を抹消したいVRC民に捧げるシェーダー)を導入する

## ⭐️目的

相手の頭が身体に接触したときに身体の中身が見えないようにする

## ⭐️参考

https://wataame89.booth.pm/items/3698935

https://docs.google.com/document/d/1GWajL8uhZnvT6cny1jqwzaThIbqmHbxl3WpHNlR-1gU/edit?tab=t.0#heading=h.5vfappnwh0nh

### ☂️公式

https://wataame89.booth.pm/items/3698935

https://docs.google.com/document/d/1GWajL8uhZnvT6cny1jqwzaThIbqmHbxl3WpHNlR-1gU/edit?tab=t.0#heading=h.5vfappnwh0nh


## ⭐️インストール

https://wataame89.booth.pm/items/3698935

![スクリーンショット 2025-06-08 15.13.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/6191c136-cfd5-49f2-959a-d1513c41a8a9.png)


- 購入してファイルをクリック


## ⭐️使い方

https://www.youtube.com/watch?v=QJOt0cawR1o&ab_channel=%E7%B6%BF%E9%A3%B4%E5%B1%8BWataameya

![スクリーンショット 2025-06-08 15.15.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/a5ca871a-1a2c-48db-a85f-d450af35f897.png)

- この状態にならないようにする

### ☂️機能を設置する

![スクリーンショット 2025-06-08 15.19.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/2fe4cd00-b738-4a1e-85c0-0e8c9b8c8657.png)

- body_baseを選択する(アバターによっては名前が違うの身体が囲まえれてるところを探す)

![スクリーンショット 2025-06-08 15.17.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/ac341bbf-81c5-4dd8-a782-ccfd06065124.png)

- blackbodyを選択する

![スクリーンショット 2025-06-08 15.22.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/78cd0bac-5581-4034-bc1d-adde5a675f4f.png)

- 右上のロックをする(使い終わったら外す)

![スクリーンショット 2025-06-08 15.17.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/28102996-46f6-4a62-831c-269c4babbaf4.png)

- assetsの中から画像の場所を探してblackbodyを次の場所にドラッグアンドドロップする

![スクリーンショット 2025-06-08 15.23.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/a5e28d75-f7e2-42bd-8e52-5d687452f13c.png)

- bodyのコンポーネントのskennd mesh renderのmaterialsを開く
- プラスボタンを押して要素1を増やす
- ここにblackbodyをドラッグアンドドロップする

### ☂️コンポーネントが追加されているのを確認する

![スクリーンショット 2025-06-08 15.27.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/4db5d77e-74e5-416a-a53f-6da3d206d6f4.png)

- body_baseのコンポーネントにblackbodyが追加されいるのを確認する


### ☂️近づいてで中身が見えるか確認

![スクリーンショット 2025-06-08 15.34.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/b4ea9d51-7590-4cf3-abdb-3b6efa5430c8.png)


- 左上のアイコンのお手々を選択してマウスのスクロール機能で近づいたり遠ざけたりする
- 右上の回転する機能を使って横からチェックする

### ☂️うまく反映されていないときの設定

::: note info
着せ替えのprefabがうまくいかなったときにこれで中身が黒くなった
:::

![スクリーンショット 2025-06-08 15.35.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/4b9c2dd9-aa77-4a84-95d0-e05857bfa1df.png)

- 中身が黒くなっていない

![スクリーンショット 2025-06-08 15.37.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/b731dbb1-163f-4b63-a6c3-4d7207c3f1ba.png)

- メッシュの裏面を黒くするをチェックで着せ替えのprefabのアバター中身が黒くn