OmniAICreator/Qiita-1.07M huggingface dataset:
DeepSearchとDeepResearchの違いについて解説

今年のはじめごろ、GoogleがGemini上で「Deep Research」機能を先行公開し、Advancedプランのユーザー限定で利用できるようにしました。その後先月２月には、OpenAIとPerplexityも独自のDeep Researchをリリースしました。
では、そもそも**Deep Research**とは何なのか。どうして各AIサービスがこぞってこの機能を導入しているのか。そして、昨年末に一躍話題を集めた**Deep Search**とは何が違うのか。本記事では、これらの疑問に答えるために、両者の特徴や使い道を詳しく解説していきます。

# 1.Test-Time Compute (テストタイム計算)

DeepSearchやDeepResearchを理解する前に、まず知っておくべき概念が"**Test-Time Compute**"です。これらの機能はどれもTest-Time Computeを前提に設計されています。

Test-Time Computeという考え方が最初に提唱されたのは、昨年9月にOpenAIが「o1-preview」モデルを発表したときタイミングで、具体的には事前学習やファインチューニングに過度なリソースを投入するのではなく、推論段階（Resoning）で大きなリソースを使って高度な処理を行うという手法です。

たとえば、Chain-of-Thoughtのような「自分で考えながら推論する」プロセスをモデルが実行できるようにすることで、最終的な出力品質を大幅に向上させられることが分かっています。もちろん推論に時間はかかりますが、最近のLLMをよく使いますと、モデルの「thinking」プロセスをある程度待つことに慣れてきましたし、結果さえ良ければ、多少待ち時間が長くても受け入れられるという流れになりつつあるのです。

Test-Time Computeについてさらに詳しく知りたい方は、以下のHugging Faceのブログ記事を参照してください。

https://huggingface.co/blog/Kseniase/testtimecompute

# 2. Deep Searchとは何か

DeepSearchは、いわば「ハイレベルなWeb検索エージェント」と言える存在です。従来のWeb検索エージェントは、与えられた検索ツールを使って情報を集め、その情報をもとに回答を作るという仕組みでして、基本的に検索は一度のみ実施します。しかしDeepSearchでは、検索プロセスに「推論（reasoning）」を挟むステップが加わっています。

大まかに言えば、**「検索 → 推論 → 検索 → 推論…」という一連のサイクルを繰り返して、正解と思われる答えに到達するか、もしくはToken上限に達するまで動き続けるという仕組みです。** 
下記の図で、DeepSearchエージェントと従来のWeb検索エージェントの処理フローをまとめてみました。最大の特徴は複数回の検索と推論を行うことで、精度の高い回答を導き出せる点にあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/e8eec491-b6c3-4c18-b085-857e59faa9be.png)

なお、推論（reasoning）については、OpenAIが以下のページで詳しく解説しています。

https://openai.com/index/learning-to-reason-with-llms/

# 3. Deep Researchとは何か

一方で、**DeepResearchはDeepSearchを有効活用するうえでの代表的な事例と言えます。**　その主な目的は「研究レポートを自動生成する」ことです。ユーザーから与えられたテーマをもとにまず大まかな章立てを計画し、各章で必要となる情報をDeepSearchを使って検索・推論します。最後に、集めた情報をLLMで整理・統合して、最終的な研究レポートとして仕上げる流れです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/c050f6f8-9e3f-4fb0-b4c9-e49c83d41667.png)

# 4. DeepSearch vs DeepResearch
最後DeepSerachとDeepResearchの関係と違いについて、一言でまとめると、**DeepSearchはこれから主流となる新しいAI検索手法であり、DeepResearchはそのDeepSearchを使いこなした一つの応用例です。** 研究レポートの作成は本来、多くの時間がかかる作業ですが、各AIサービスがDeepResearch機能をリリースし始めたことで、今後は短時間で質の高いレポートを作ることが可能になると想定します。
DeepSearchの処理時間がやや長くても、徹底的な情報収集と推論によって高品質な結果を得られるなら、十分受け入れられるはずだと考えています。

またLangChainも先日、独自のDeepResearch実装をオープンソースとして公開していますので、興味がある方は以下をチェックしてみてください。

https://github.com/langchain-ai/open_deep_research?tab=readme-ov-file



**追記：** 
本日(3/15)からGeminiのDeep Researchは無料プランにも開放し、すべてのユーザーが利用可能になりました。

https://gemini.google/overview/deep-research/
【エラー対処】TypeError: Cannot convert a MPS Tensor to float64 dtype as the MPS framework doesn't support float64. Please use float32 instead.

## 開発環境

```
Python 3.10.16
pytorch 2.5.1 py3.10_0 pytorch

↓↓↓Visual Studio Code↓↓↓
バージョン: 1.98.2
コミット: ddc367ed5c8936efe395cffeec279b04ffd7db78
日付: 2025-03-12T13:32:45.399Z
Electron: 34.2.0
ElectronBuildId: 11161602
Chromium: 132.0.6834.196
Node.js: 20.18.2
V8: 13.2.152.36-electron.0
OS: Darwin arm64 24.2.0
```

## エラー内容
```
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[16], line 67
     65 imgs = imgs.to(device).float()
     66 # imgs = torch.squeeze(imgs)
---> 67 masks = masks.to(device).float()
     68 masks = masks.view(imgs.shape[0], -1, 256, 256)
     70 optimizer.zero_grad()

TypeError: Cannot convert a MPS Tensor to float64 dtype as the MPS framework doesn't support float64. Please use float32 instead.
```

## 対処法
```python

#Apple SiliconののGPUを使用する場合はmpsを指定する
device = torch.device("mps" if torch.mps.is_available() else "cpu")

masks.to(device).float() #これだとエラー

#↓

masks.float().to(device)
```
第19回 NATの技術② ダイナミックNAT

[前回](https://qiita.com/infra-blog/items/0930f6809d031848c1c5)の記事で1対1のNAT変換に関して記事を作成しました。
ただ現実の通信では、**複数**のプライベートアドレスとグローバルアドレスが同時にNAT変換されて通信が行われています。
このような通信を実現する技術が**ダイナミックNAT、またはPAT**と呼ばれる技術です。

## ダイナミックNAT

### 全体構成図
![①.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559536/196437e6-5a5f-4d6b-b7d1-97f15623227e.png)

[前回](https://qiita.com/infra-blog/items/0930f6809d031848c1c5)の1:1のNATと違い、今回の構成図では東京支店で使用されている**3台のPC**がアメリカ支店のPCと通信を行う際、**172.16.170.217-172.16.170.222**の範囲でアドレス変換を行います。

```ruby:ルーター設定(ダイナミックNAT)
interface GigabitEthernet0/0
 ip address 10.1.1.254 255.255.255.0
 ip nat outside
!
interface GigabitEthernet0/1
 ip address 192.168.1.254 255.255.255.0
 ip nat inside
!
ip nat pool 11 172.16.170.217 172.16.170.222 netmask 255.255.255.248
ip nat inside source list NAT_ACL_test1 pool 11
!
ip access-list extended NAT_ACL_test1
 permit ip 192.168.1.0 0.0.0.255 any
!
```

## PAT
複数のアドレス同士を変換するダイナミックNATですが、現在IPv4のグローバルアドレスは枯渇し始めており、例えば数百人規模のプライベートアドレスを数十個のグローバルアドレスに変換するため、都度プロバイダーがアドレスを払い出していたら、すぐにグローバルアドレスの底がついてしまいます。
そこで**複数のプライベートアドレスを一つのグローバルアドレスに変換する技術**、これが**PAT**です。
*全体構成図はダイナミックNATと同じなので省略

```ruby:ルーター設定(PAT)
interface GigabitEthernet0/0
 ip address 10.1.1.254 255.255.255.0
 ip nat outside
!
interface GigabitEthernet0/1
 ip address 192.168.1.254 255.255.255.0
 ip nat inside
!
ip nat pool 11 172.16.170.217 172.16.170.217 netmask 255.255.255.248
ip nat inside source list NAT_ACL_test1 pool 11 overload
!
ip access-list extended NAT_ACL_test1
 permit ip 192.168.1.0 0.0.0.255 any
!
```
この検証では、NAT変換のアドレスを**プールで指定**しています。
PATのもう一つのやり方としてNAT変換後のアドレスは**インターフェースを指定した設定**もできますが
その場合、検証構成のアドレス割り当てが変わってくるので今回は割愛させていただきます。

### 検証後のダイナミックNATとPATの通信内容の差分比較
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559536/52bac27d-faa8-4eaa-bd51-29a196e7e16d.png)



上記画像は、**上がダイナミックNAT**、**下がPAT**の結果です。
ダイナミックNATでは**192.168.1.10~192.168.1.12**のプライベートアドレスが、**172.16.170.219~172.16.170.221**に変換されています。
一方のPATでは192.168.1.10~192.168.1.12のプライベートアドレスが、**172.16.170.217のアドレスのみ**に変換されています。

## ダイナミックNAT設定とPAT設定のコンフィグ違い
ダイナミックNAT設定とPAT設定では以下**2つ**の違いがあります。

①プールアドレスの範囲
ダイナミックNATでは複数のアドレス同士をNAT変換するため**変換したいアドレスの範囲を指定**します。
なおNAT変換時に割り当てられるアドレスは**若番から順に払い出し**が行われます。
**参考として差分比較のダイナミックNATの検証結果では172.16.170.219から順に変換が行われています。**

②overload設定の有無
PAT設定を行う際、**overload**の設定を行わないと通常のダイナミックNATと同じ変換が行われてしまいます。
PATの通信を実現したい場合、**絶対にoverloadを設定する。**
**これは忘れないで下さい。**

### ダイナミックNATとPAT設定の違い まとめ
![④.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559536/822f325b-03d6-48e1-887a-d96f6b4178b8.png)

## 参考
[Dynamic NAT](https://www.infraexpert.com/study/ip11.html)
[NAPT](https://www.infraexpert.com/study/ip11.5.html)
Azure Cosmos DB の無料枠を活用する方法

# 
## はじめに
Azure Cosmos DB は、グローバル分散型の NoSQL データベースサービスで、高い可用性とスケーラビリティを備えています。そんな Cosmos DB には「Free Tier（無料枠）」があり、特定の条件内であれば無料で利用できます。本記事では、Cosmos DB の無料枠を活用する方法や注意点を解説します。

## 無料枠の設定方法
無料枠を適用するには、Azure Portal で Cosmos DB を作成する際に Free Tier を有効にする必要があります。手順は以下の通りです。

1. **Azure Portal にサインイン**  
   [Azure Portal](https://portal.azure.com/) にアクセスし、Microsoft アカウントでサインインします。  

2. **「リソースの作成」から「Azure Cosmos DB」を選択**  
   左側のメニューから **「リソースの作成」** をクリックし、検索ボックスに **「Azure Cosmos DB」** と入力して選択します。  

3. **「作成」ボタンを押して、必要な情報を入力**  
   以下の項目を設定します。  

   - **サブスクリプション**: Cosmos DB を作成する Azure サブスクリプションを選択  
   - **リソースグループ**: 既存のリソースグループを選択するか、新規作成  
   - **アカウント名**: 一意のアカウント名を設定（例: `mycosmosdb123`）  
   - **API の選択**: 使用する API を選択（一般的には **Core (SQL)** が推奨）  
   - **リージョン**: データベースを配置するリージョンを選択  
   - **容量モード**: 「プロビジョニング済みスループット」を選択  
   - **Free Tier 割引を適用**: **チェックを入れる**（これにより無料枠が適用）  

4. **残りの設定を完了し、データベースを作成**  
   「確認および作成」をクリックし、問題がなければ「作成」を押してデータベースをデプロイします。  

無料枠の適用は **1 つのサブスクリプションにつき 1 つの Cosmos DB アカウントに限定** されるため、適用するアカウントを慎重に選びましょう。

## 無料枠の活用例
無料枠の主な活用方法としては、以下のようなケースが考えられます。

- **小規模アプリのデータストアとして活用**  
- **開発・検証環境のデータベースとして利用**  
- **サーバーレスアーキテクチャと組み合わせたコスト削減**  

特に、無料枠では **400 RU/s** のスループットが利用できるため、軽量なワークロードには十分対応可能です。

## 無料枠の制約と注意点
無料枠にはいくつかの制約があるため、以下のポイントに注意してください。

- **400 RU/s までのスループットが無料**  
- **最大 25GB までのストレージが無料**  
- **1 つの Azure サブスクリプションで 1 つの Cosmos DB アカウントにのみ適用可能**  
- **Free Tier を適用後に解除することは不可**  

もし 400 RU/s を超えるワークロードが必要になった場合は、従量課金プランへの移行を検討する必要があります。

## まとめ
Azure Cosmos DB の無料枠を活用すれば、開発や小規模アプリの運用コストを抑えることができます。ただし、適用は **1 つのアカウントに限定** されるため、事前に利用計画を立てることが重要です。無料枠の範囲を超えそうな場合は、従量課金プランとのコスト比較も行いながら運用しましょう。
Windows１０から１１へのアップグレードで色々やらかした件

<br>
※このメモが新たな被害者の助けになる事を信じてここに記す
<br>
<p>病気療養後に勤めだした会社(情シス)でWindows11 PCを使わせて頂いているので、<br>
こりゃ家のボロPCもアップグレードせにゃと思い至ったわけです。</p>

最初は1、2時間くらいで終わるだろう…
そう思っていた…
これは40のおっさんがWindowsのアップグレードに奔走する汗と涙の物語りである…

ーーとりあえずやった事を書いてみたーー

今年の秋にwin10のサポートが終わる…
↓
win11にしよう
↓
win10の時はWindowsUpdateから行けた気が…
↓
『設定』⇒『WindowsUpdate』みたけどUpgrade出来ないなんで？
↓
たしかマイクロソフトHPからも行けたような
↓
公式『Windows 11 のアップグレードの準備』に行く
↓
『PC 正常性チェック』をダウンロードしろと書いてある
※この辺からなんか怪しいぞと思い始める
↓
PC 正常性チェックしたからOKだろ
↓
チェックに引っかかってるのもよく見ずに公式へ　⇐馬鹿
↓
win11のDLが出てこない
↓
もう一度チェック
↓
引っかかってるのによく見ないまま公式の説明を読み　⇐馬鹿の極み
『最小システム要件』を読む
↓
CPU、メモリ、ストレージ等はクリアしている？？？
↓
もう一度チェック
↓
ここでBIOS設定がひっかかっていと気がつく
↓
設定を見直す事に
↓
ASUSマザーボードを使用しているがBIOSが出てこない
↓
F2、F12、ESCを連打しても出てこない
↓
『Fast Boot』になっているのに気がつく
※win10にアップグレードした時あまり良くわかってないのにイジった
↓
電源入れた後にF2押しっぱなしでBIOS起動
↓
とりあえずFast Bootは切る
※win10の時に他にも怪しい設定をしたのを思い出しつつとりあえずクリア
↓
7から10にする際にHDも新しくしたれと思い7をクリーンインストールし、
当時のMBのドライバーなど(ここ伏線)を入れた後10にアップグレードしていた
と思い出したのはまだ先の話
↓
もう一度『PC 正常性チェック』でチェック何が引っかかってるのかを確認
『BIOS設定がUEFIじゃないと無理ですよ』と言われる
↓
UEFI設定にしたけど今度はOSが起動しない…
↓
レガシーに戻し調べる
↓
ディスクをGPTにしないとUEFIでは立ち上がりませんとの事
↓
それってフォーマットしないとダメやんけ
フォーマットでデータ消えるからシステムディスクは出来ないやんけ詰んだ…
※大昔使ってたiPhoneのクラウド認証に使用してないiPhoneのメールアドレスを登録してクラウド認証したい⇒クラウド『メールで認証確認送ったよ』⇒クラウドに入れないからメール見られないみたいな事あったのを思い出す
↓
7→10→11でやってきているので製品版7のOSを入れたとしてもサポート終わっているので
10にアップグレードできるかわからん
↓
クリーンインストールすらムリポ
↓
絶望先生
↓
色々記事を読むうちに同じような事象でMicrosoft側が救済措置を取っているらしい
↓
一筋の光明
↓
PowerShellを管理者モードで起動して「MBR2GPT」ってコマンドを使うっぽ
https://shop.applied-net.co.jp/blog/cate_news/23507/
※よくわからんアプリケーションインストールしてよくわからん操作させるような記事が結構あるがよくわからんけど止めておいた方が良いpowershellでいけますん
↓
でけた
↓
BIOSをUEFIに切り替え『PC 正常性チェック』
↓
公式からこのPCなら大丈夫というお墨付きをいただいてUSBにWIN11の.isoデータをいれることに成功
※もう一つBIOS設定『Ultraなんちゃら』で引っかかってたけど切り替えただけだったし無かったことにする
↓
休みを1日潰し、みごとWIN11にアップデート
※このあと更に痛い目を見るがそれはまた別のお話…


ーー今回の要約ーー
・『Windows 11 のアップグレード』はPCのスペックでOSが入れられない事が有る※結構シビア
・Windows10ではシステムを入れているディスクのパーティションスタイルはMBRでもいけたけどWindows11では入らないよというかチャックでひかっかる(GPTじゃないと無理)
・よくわからんアプリケーションを入れてGPTにするよりもPowerShellでいけるよ
・よくわからん設定をよくわからんままONにするとのちのち困るよ
[TS] 命名規則のまとめ

## はじめに
TypeScriptを利用する上での命名規則について、  
私的に利用している取り決めを簡単にまとめました。

## コード内
### マジックナンバーを定義する際の定数名
設定ファイル内にマジックナンバーを定義する際の定数については  
「アッパースネークケース」を利用する。

```ts
	const MAGIC_NUMBER: string = "マジックナンバー"
```

### ローカル変数としての定数名
メソッド内などでローカル変数として定義し  
再代入を行わない変数として使う定数の命名には  
「ローワーキャメルケース」を利用する。

```ts
    const fixedValue: string = "固定値";
```

### 変数名
変数の命名には「ローワーキャメルケース」を利用する。

```ts
	let variableValue: string = "初期値"

	value = "新しい値"
```

### プロパティ名
プロパティ名には「ローワーキャメルケース」を利用する。

```ts
	const userInfo = {
		userName: "Taro",
		userAge: 20,
	};
```

### interface名
interface名には「アッパーキャメルケース」を利用する。

```ts
	interface UserInfo {
    	id: number;
		userName: string;
		userAge: number;
	}
```


### 型エイリアスの名称
型エイリアスの名称には「アッパーキャメルケース」を利用する。

```ts
	type UserInfo = {
		id: number;
		userName: string;
		userAge: number;
	};
```

### 関数名
関数名には「ローワーキャメルケース」を利用する。

```ts
	const getUseInfo = (): string => {
		return `名前はTaroで、年齢は20歳です。`;
	}
```

### クラス名
クラス名には「アッパーキャメルケース」を利用する。

```ts
	class UserInfo {
		constructor(public userName: string, public userAge: number) {}
	
        getUserInfo (): string {
            return `名前は${this.userName}で、年齢は${this.userAge}歳です。`;
        }
	}
```

### 関数コンポーネント名
関数コンポーネント名には「アッパーキャメルケース」を利用する

```ts
	export const UserForm = () => {
		///
	}
```

## コード外
### ファイル名
ファイル名は「ローワーキャメルケース」を利用する
```plaintext
	getUserInfo.ts
```

### ディレクトリ名
ディレクトリ名は「ケバブケース」を利用する。  
「ローワーキャメルケース」を利用しないのは、ファイル名と区別するため。
```plaintext
	user-form
```

### コンポーネントファイル名
コンポーネントファイル名は「アッパーキャメルケース」を利用する

```plaintext
	UserForm.tsx
```

## 参考
- 変数宣言: letとconst
	- https://typescriptbook.jp/reference/values-types-variables/let-and-const
- スタイルガイド（コーディング規約）
	- https://typescript-jp.gitbook.io/deep-dive/styleguide
- TypeScriptコーディング規約のきほん
	- https://maasaablog.com/blog/jdyz5d9vk/
- React / TypeScript の設計前に、改めて命名規則について把握する
	- https://qiita.com/shuhosaka/items/4a11158b3e9060d3b612
Substance 3D Painter にツールバーを追加する

## 環境
* Windows
* Adobe Substance 3D Painter 10.1.2

## ツールバーの追加

「[Substance 3D Painterにメニューを追加する](https://qiita.com/scixarts/items/e5fdc54358ea0a8fb85d)」に関連する内容です。
Substance 3D Painter ではメニューだけでなくツールバーも追加可能です。

### 参考イメージ
![toolbar_00.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3965005/6a2eea90-182c-4f6d-b526-d9d123a5e03a.jpeg)

### サンプルコード
以下のコードは説明のわかりやすさを重視したものです。コーディングのベストプラクティスを示したものではありませんのでご注意ください。

```python
from functools import partial

from PySide6 import QtGui

import substance_painter as sp

plugin_widgets = []


def start_plugin():
    toolbar = sp.ui.add_toolbar("Sample", "Sample", sp.ui.UIMode.Edition)

    action1 = toolbar.addAction(QtGui.QIcon("red.png"), "red")
    action1.triggered.connect(partial(echo, "red"))
    action2 = toolbar.addAction(QtGui.QIcon("green.png"), "green")
    action2.triggered.connect(partial(echo, "green"))
    action3 = toolbar.addAction(QtGui.QIcon("blue.png"), "blue")
    action3.triggered.connect(partial(echo, "blue"))

    plugin_widgets.append(toolbar)


def close_plugin():
    for widget in plugin_widgets:
        sp.ui.delete_ui_element(widget)
    plugin_widgets.clear()


def echo(s):
    print(s)


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

### 説明

プラグインの基本的な記述方法は「 [Substance 3D Painterにメニューを追加する](https://qiita.com/scixarts/items/e5fdc54358ea0a8fb85d)」 をご覧ください。
Substance 3D Painter でツールバーを追加するのには [ui module](https://helpx.adobe.com/substance-3d-painter-python/api/substance-painter/ui.html) の ```add_toolbar``` 関数を使用することが重要です。こちらを使用すると、Substance 3D Painter のメインウインドウにツールバーを追加してくれます。返り値として ``` QToolBar``` が返ってくるので、後はこれに Qt for Python と同じ方法で QToolBar にボタンを追加するコードを書けば問題ありません。


## 参考
* [Substance 3D Painter Python API](https://helpx.adobe.com/substance-3d-painter-python.html)
* [ui module](https://helpx.adobe.com/substance-3d-painter-python/api/substance-painter/ui.html)
* [PySide6.QtWidgets.QToolBar](https://doc.qt.io/qtforpython-6/PySide6/QtWidgets/QToolBar.html)
WSLでローカルLLMを動かす

Windows環境でWSL（Ubuntuなど）を利用してOllamaをセットアップし、curlでAPIリクエストを送るまでの手順を記載します。

---

### 1. WSLの準備

- **WSL2の有効化**  
  Windows PowerShellで次のコマンドを実行してWSL2とUbuntuをインストールします。

  ```bash
  wsl --install
  ```

- **Ubuntuのアップデート**  
  インストール後、Ubuntuターミナルを開いてアップデートを実施します。

  ```bash
  sudo apt update && sudo apt upgrade -y
  ```

---

### 2. Ollamaのインストール

- **Ollamaの一括インストール**  
  Ubuntu（WSL内）で以下のコマンドを実行します。  
  ※ インストールスクリプトは公式のものを使用しています。

  ```bash
  curl -fsSL https://ollama.com/install.sh | sh
  ```

---

### 3. モデルの取得と起動

- **モデルのダウンロード**  
  例として、`gemma:2b`を使用する場合、以下のコマンドでモデルをダウンロードします。

  ```bash
  ollama pull gemma:2b
  ```

- **モデルの実行**  
  ダウンロード後、次のコマンドでモデルを起動できます。

  ```bash
  ollama run gemma:2b
  ```

  ※ 初回実行時はモデルのロードに時間がかかることがあります。

---

### 4. WSLからcurlでAPI呼び出し

- **APIリクエスト例**  
  OllamaサーバはREST API（デフォルト：`http://localhost:11434`）を提供しているので、curlコマンドでリクエストを送信します。例えば、generateエンドポイントに対して日本語のプロンプトを送る場合：

  ```bash
  curl -X POST http://localhost:11434/api/generate -d '{
    "model": "gemma:2b",
    "prompt": "こんにちは、Ollama！日本語で返答してください。"
  }'
  ```

  また、チャット形式の場合は以下のようにリクエストします。

  ```bash
  curl http://localhost:11434/api/chat -d '{
    "model": "gemma:2b",
    "messages": [
      { "role": "user", "content": "こんにちは、調子はどうですか？" }
    ]
  }'
  ```

  APIの詳細やSwagger UIは、ブラウザで `http://localhost:11434/docs` にアクセスすると確認できます citeturn0search4

---

### 6. 注意点

- **ネットワーク設定**  
  WSLとWindowsホスト間では、通常 `localhost` が共有されていますが、環境によってはWSLのIPアドレスを利用する必要がある場合もあります。

- **サービスの自動起動**  
  SystemdがWSLで有効になっていない場合は、手動で `ollama serve` をバックグラウンド実行するなどの対策を検討してください。

- **モデルごとの起動時間**  
  モデルによっては初回ロードが重いので、必要に応じて `ollama pull` であらかじめダウンロードしておくとスムーズです。

---

以上の手順により、Windows上のWSL環境でOllamaを立ち上げ、curlからLLMモデルを呼び出すことが可能になります。
ABC396Dを解いた【DFS】


筆者はレート800前後の茶～緑コーダ

ABC396当日にACできなかったD問題を解いていく
    
https://atcoder.jp/contests/abc396/tasks/abc396_d

# 実装コード

重さを乗せたグラフをつくって深さ優先探索する。

```python:main.py
from bisect import bisect_left, bisect_right, insort_left, insort_right
from collections import defaultdict, Counter, deque
from functools import reduce, lru_cache
from itertools import product, accumulate, groupby, combinations
import sys
import os
def rI(): return int(sys.stdin.readline().rstrip())
def rLI(): return list(map(int,sys.stdin.readline().rstrip().split()))
def rI1(): return (int(sys.stdin.readline().rstrip())-1)
def rLI1(): return list(map(lambda a:int(a)-1,sys.stdin.readline().rstrip().split()))
def rS(): return sys.stdin.readline().rstrip()
def rLS(): return list(sys.stdin.readline().rstrip().split())
IS_LOCAL = int(os.getenv("ATCODER", "0"))==0
err = (lambda *args, **kwargs: print(*args, **kwargs, file=sys.stderr)) if IS_LOCAL else (lambda *args, **kwargs: None)

import pypyjit
pypyjit.set_param('max_unroll_recursion=-1')


def main():
    N, M = rLI()
    
    G = {i+1:[] for i in range(N)}
    
    for _ in range(M):
        u,v,w = rLI()
        G[u].append((v,w))
        G[v].append((u,w))
    
    visited = set()
    def dfs(v, x, ans):
        visited.add(v)
        if v == N:
            ans = min(ans, x)
        for u, w in G[v]:
            if u not in visited:
                ans = dfs(u, x ^ w, ans)
        visited.remove(v)
        return ans
    
    ans = dfs(1, 0, float('inf'))
    
    print(ans)
    
if __name__ == '__main__':
    main()

```

# まとめ

シンプルな深さ優先探索の問題だけど
メソッドが確立できていない状態で当日を迎えて解けなかったので。
ライブラリ化して素早く実装できるようにしたい。
UniGoal: ゼロショットでの汎用目標指向ナビゲーションの革新

# **UniGoal: ゼロショット目標指向ナビゲーションの新たなアプローチ**

人工知能（AI）を活用したナビゲーション技術が急速に進化しています。しかし、従来の手法では、ナビゲーションの目標（オブジェクト、画像、テキスト）ごとに異なるモデル設計が必要でした。

今回紹介する「**UniGoal: Towards Universal Zero-shot Goal-oriented Navigation**」は、すべての目標を **統一的なグラフ表現** に変換することで、異なる種類のナビゲーションを **単一のゼロショットモデル** で実行可能にする画期的な研究です。

---

## **論文情報**
- **タイトル**: UniGoal: Towards Universal Zero-shot Goal-oriented Navigation
- **リンク**: [arXiv:2503.10630](https://arxiv.org/abs/2503.10630)
- **発表日**: 2025年3月13日
- **著者**: Hang Yin, Xiuwei Xu, Linqing Zhao, Ziwei Wang, Jie Zhou, Jiwen Lu
- **所属**: 清華大学, 南洋理工大学
- **DOI**: 記載なし（arXivプレプリント）

---

## **背景と目的**
### **目標指向ナビゲーションの課題**
従来のゼロショットナビゲーション手法には、以下のような課題がありました。
- **目標ごとに異なる手法が必要**（オブジェクト、画像、テキストで別設計）。
- **LLMを利用するが、視覚情報との統一が難しい**。
- **ゼロショット適用が困難**（環境ごとに再学習が必要）。

### **UniGoalの目的**
UniGoalは、**すべての目標を統一的な「グラフ」として表現** することで、単一のフレームワークでナビゲーションを可能にすることを目的としています。

---

## **研究の焦点**
UniGoalでは、以下の **3種類の目標ナビゲーション** に対応可能です。

| ナビゲーションタイプ | 目標の形式 | 例 |
|----------------|----------------------|----------------------|
| **オブジェクトナビゲーション（ON）** | テキスト | 「ベッドのある部屋へ移動せよ」 |
| **インスタンス画像ナビゲーション（IIN）** | 画像 | 家具の写真を与え、その場所へ移動 |
| **テキスト記述ナビゲーション（TN）** | 自然言語 | 「窓の前に赤い椅子がある」→ 椅子を探して移動 |

これらの目標を **統一的なグラフ表現** に変換し、一貫した推論を行います。

---

## **提案手法: UniGoal**
### **1. グラフ表現**
UniGoalの最大の特徴は、**目標（ゴール）と環境（シーン）を統一的なグラフで表現** することです。

- **シーングラフ**: 3D空間内のオブジェクト間の関係を表すグラフ。
- **ゴールグラフ**: 目標をノード（オブジェクト）とエッジ（関係性）で表現。

例えば、「椅子がテーブルの横にある」という目標を与えられた場合：
$$
ノード: [椅子, テーブル] エッジ: [椅子 - 右 - テーブル]
$$

のようなゴールグラフが作成されます。

このグラフを **シーングラフと照合（グラフマッチング）** することで、目標がどこにあるかを推論します。

### **2. グラフマッチング**
UniGoalでは、以下のマッチング手法を用います。

- **ノードマッチング**（オブジェクトレベルの対応関係）
- **エッジマッチング**（オブジェクト間の関係性）
- **トポロジーマッチング**（グラフ全体の構造類似度）

マッチングスコア $S$ は以下のように定義されます：
$$
S = \frac{1}{3} (S_N + S_E + S_T)
$$
ここで、$S_N$ はノードの類似度、$S_E$ はエッジの類似度、$S_T$ はグラフのトポロジー類似度を表します。

### **3. ブラックリスト機構**
探索の最適化のために、**ブラックリスト機構** を導入しました。
- **失敗したマッチング情報を記録** し、再探索を避ける。
- これにより、探索の効率を大幅に向上。

---

## **実験結果と考察**
UniGoalは、**Matterport3D (MP3D), Habitat-Matterport3D (HM3D), RoboTHOR** で評価されました。

| 方法 | ON (HM3D) | IIN (HM3D) | TN (HM3D) |
|------|------------|------------|------------|
| **UniGoal (Ours)** | **54.5 / 25.1** | **60.2 / 23.7** | **20.2 / 11.4** |
| GOAT (Supervised) | 50.6 / 24.1 | 37.4 / 16.1 | 17.0 / 8.8 |
| PSL (Supervised) | 42.4 / 19.2 | 23.0 / 11.4 | 16.5 / 7.5 |

特にIIN（画像ナビゲーション）で **4.1% の成功率向上** を達成しました。

---

## **今後の展望**
- **実環境での適用**（自律ロボット、ドローン、自動運転）
- **計算コストの最適化**（リアルタイム処理の負荷低減）

---

## **まとめ**
UniGoalは、目標を **グラフ表現で統一し、ゼロショットで処理できる汎用ナビゲーション手法** です。  
今後のロボティクスや自動運転の発展に大きく貢献する可能性があります！

**この記事が役立ったら、ぜひコメントしてください！**
Amplify Gen2なにもしてないのにデプロイできんくなった

Amplify Gen2でホスティングしていた際に発生したエラーについての備忘録です。

## Amplify Gen2でホスティング中に遭遇したエラー
開発中に突然、以下のようなエラーでデプロイに失敗するようになりました。


```
> build
> remix vite:build

 node:internal/errors:496
 ErrorCaptureStackTrace(err);
 ^
 Error: ENOSPC: System limit for number of file watchers reached, watch

```

使用環境
- Amplify Gen2
- Remix:2.15.1 (SPA Mode)
- Node.js: v18


## 原因
このエラー「ENOSPC: System limit for number of file watchers reached, watch」は、Linuxシステムでinotifyウォッチャーの数が上限に達した場合に発生します。ビルドプロセス中（特にViteを使用したRemixのフロントエンドビルド時）に、システムが監視できるファイル数の上限を超えてしまったことが原因のようです。


## 解決策
[Github記事](https://github.com/aws-amplify/amplify-hosting/issues/629)のように、以下の環境変数を設定することで解決しました。
```
CHOKIDAR_USEPOLLING=true
```

https://github.com/aws-amplify/amplify-hosting/issues/629

Amplifyコンソール上の設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415206/25c447c2-7076-4ff4-83a1-6775d07914ae.png)


この環境変数を設定したところ、無事にビルドが通るようになりました！

## CHOKIDAR_USEPOLLINGの影響
`CHOKIDAR_USEPOLLING`はファイル監視ライブラリである「Chokidar」の動作を制御する環境変数です。
trueに設定すると、ファイルの変更を検出するためにポーリング方式（定期的にファイルの状態をチェックする方式）を使用するようになります。

RemixやViteではホットリロード（コード修正後即座に画面をリロード）をサポートしており、デフォルトではファイルシステムのイベント通知(fs.watch)を使用しています。

ビルドプロセスにおいてポーリングに切り替えても問題はないと思うので、しばらくはこの設定で運用してみようと思いますが、ご自身の環境に合わせて適切に設定を行ってください。

## さいごに
今回は、Amplify Gen2ホスティング時に発生したエラー
`Error: ENOSPC: System limit for number of file watchers reached, watch`
に対する備忘録を書かせていただきました。

どなたかのお役に立てると幸いです。
Gitについてまとめてみた

# 概要
バージョン管理システムのひとつであるGitについてまとめてみました。

# 目次
- [歴史](#歴史)
- [名前の由来](#名前の由来)
- [濱野 純氏について](#濱野-純氏について)
- [Gitの操作方法](#gitの操作方法)
- [CUI vs GUI](#cui-vs-gui)
- [Forkとは](#forkとは)

# 歴史
Gitは、[Linuxカーネル](https://wa3.i-3-i.info/word18305.html)の開発において生まれました。
Linuxカーネルの開発では、世界中の多くの開発者のコードを統合する必要がありました。
最初は[BitKeeper](https://ja.wikipedia.org/wiki/BitKeeper)というバージョン管理システムを使用していましたが、以下のような問題がありました。
- 商用ソフトウェアのため、制限があった
- サーバー側が有料だった (クライアント側は無料)

2005年7月、Linuxの作成者であるリーナス・トーパルズはこれらの問題を解決するためにGitの開発を開始しました。そして同年の12月に、最初のバージョンをリリースしました。

# 名前の由来
Gitは英語で「バカ」や「間抜け」という意味らしいです。
また、「Global Information Tracker」からきている、という解釈もあります。

:::note
リーナス・トーパルズが「僕は自己中心的な奴だから、自分のプロジェクトには自分にちなんだ名前を付けるようにしているんだ。最初はLinuxで、今度はGitだ。」と発言したらしいです。
:::

# 濱野 純氏について
現在Gitのメンテナーは日本人の[濱野 純](https://ja.wikipedia.org/wiki/%E6%BF%B1%E9%87%8E%E7%B4%94)氏がつとめています。
リーナス・トーパルズはGitが成功した要因として濱野氏の貢献があったと認識しており、メンテナーとして指名したらしいです。

参考：
- [Linus君がボクを後継者に指名した理由 - Gitメンテナー 濱野 純氏](https://xtech.nikkei.com/it/article/COLUMN/20130418/471890/)
- [Gitメンテナ　濱野 純](https://gihyo.jp/dev/serial/01/alpha-geek/0040)

# Gitの操作方法
Gitの操作方法は色々なサイトに纏められています。
以下の動画がとても参考になりました。

- [【Git入門】Git + Github使い方入門講座🐒Gitの仕組みや使い方を完全解説！パーフェクトGit入門！](https://www.youtube.com/watch?v=LDOR5HfI_sQ)
- [【わかりやすい！Git操作】初心者向けのGitの基本 〜 30分で入門！](https://www.youtube.com/watch?v=6SLMB7BPG9E)
- [【GitHub入門】初心者向け！GitHubでチーム開発するための基本操作を解説！](https://www.youtube.com/watch?v=Dz95iUNt-fg)

# CUI vs GUI
GitはCUIで操作する設計となっています。
元々Linuxカーネルのバージョン管理システムとして開発されたので、Linuxの開発者は既にCUIに親しんでいたり、GUIより軽量で高速、かつリソース消費も最小限に抑えられるメリットもあってCUIで開発されたのかと思います。ただ現在は、GUIを使用してマウスを使用しグラフィカルにGitを使用できるツールも多く登場しています。
そのため、Git操作をCUI/GUIどっちで行った方がよいかの議論 (？) もあります。

- [【Git】コマンドライン操作は今習得するべきなの？](https://futureys.tokyo/should-i-learn-command-line-operations-on-git-now/)
- [Git初心者にはGUIとCUIどちらを勧めるべきか](http://yuni.co/2015/05/31/git-cui-or-gui.html)
- [ポエム: gitはGUIでなくCUIをオススメする理由](https://blog.sin-tanaka.com/posts/190613/)

個人的には、自身の勉強にはCUIを使用して、業務ではGUIを使用していました。
業務で急にGitを使用することになりましたが、過去に使用経験がなかったこともあり、操作ミスを防ぐといった意味でGUIを使用していました。そのため、業務上でGit操作が起因するミスは発生したことはありませんでした。
GUIを使用してイメージが掴めて来くると、CUIで勉強するとなるほどと思ったりします。
知識がついてCUIでも全然問題無い方はCUIで大丈夫かと思いますが、Gitをあまり知らなく業務で触ることになった場合はまずはミスを防ぐという意味でGUIも良さそうかと思いました。
ただ検索して出てくるのはCUIでの操作の方が多いと思うので、やはりGUIを使用する場合でも最低限のCUIでの操作は把握しておいた方が良さそうと感じました。

# Forkとは
私が使用していたGitクライアントツールの一つです。GUIでGitの操作ができます。

- プル
- フェッチ
- コミット
- ブランチの作成
- リベース
- チェリーピック

など、Gitの基本的な操作を行うことが出来ます。

### インストール方法
以下のサイトからインストールできます。

https://fork.dev/

:::note
Forkは無料でダウンロードすることができますが、長期間使用するにはライセンスを購入する必要があります。
参考：[フォークライセンス](https://git-fork.com/license)
:::

### 使用方法
使用方法は下記に記載されています。

- [Windows での Fork を使用した Git 開発](https://www.presslabs.com/docs/managed-wordpress/development/git/fork-windows/)
- [動作が軽いGitクライアントアプリ「Fork」の特徴と基本的な使い方について](https://kazupon.org/light-weight-git-client-fork/)

# 終わりに
個人的にもCUI操作はまだ知らないことが多くあるので、勉強を続けていきたいです。
Amazon EC2

## EC2(Amazon Elastic Compute Cloud)とは
仮想サーバーを提供するプラットフォーム

## EC2インスタンスとは
仮想サーバー
### インスタンス操作
- Start
  - 停止したインスタンスを再起動します。データは保持されます
- Stop
  - インスタンスを一時的に停止しますが、データは保持されます
- reboot
  - 実行中のインスタンスを再起動します。データは保持されます
- Terminate
  - インスタンスを完全に削除します。データは失われます

### インスタンスの種類
#### 汎用
##### 使用場面
汎用的な用途（Webサーバー、アプリケーションサーバー、データベース、開発環境など）に適しています
##### 特徴
バランスの取れたCPU、メモリ、ストレージのリソース
##### 代表的なインスタンスタイプ
t3、t3a、t2、m5、m5a、m5n

#### コンピューティング最適化
##### 使用場面
高いCPUパフォーマンスが求められるワークロード（例えば、高性能なWebサーバー、ゲームサーバー、バッチ処理など）に適しています
##### 特徴
高性能なプロセッサを提供し、CPUリソースを多く必要とするワークロードに最適化されています
##### 代表的なインスタンスタイプ
c5、c5a、c5n

#### メモリ最適化
##### 使用場面
メモリ集約型のワークロード（例えば、データベース、高性能コンピューティング、大規模キャッシュシステムなど）に最適化されています
##### 特徴
高メモリ容量を提供し、メモリ使用量が多いアプリケーションに適しています
##### 代表的なインスタンスタイプ
r5、r5a、r5n、x1e、u-6tb1.metal

#### ストレージ最適化
##### 使用場面
高速ストレージと大容量ディスクが必要なワークロード（例えば、NoSQLデータベース、Hadoopなど）に最適化されています
##### 特徴
高性能のローカルストレージや大容量のEBSを持つインスタンスです
##### 代表的なインスタンスタイプ
i3、d2

#### 高速コンピューティング
##### 使用場面
機械学習、科学技術計算、シミュレーションなどの大規模な並列計算を必要とするワークロードに適しています
##### 特徴
高いネットワーク帯域幅と並列処理能力を提供
##### 代表的なインスタンスタイプ
hpc6id、p5、p4

## 関連サービス
### イメージ（AMI）
EC2インスタンスの設定やソフトウェアのインストール状態を保存します
#### 目的
インスタンスの起動テンプレート

#### 保存内容
- OS（オペレーティングシステム）
  - インスタンスが動作するための基本的なOS（例: Amazon Linux、Ubuntu、Windows Serverなど）
- インストールされているソフトウェア
  - インスタンスに事前にインストールされたアプリケーションやパッケージ
- ファイルシステムの内容
  - ルートボリューム（EBS）に格納されているデータ
- 設定
  - セキュリティグループやIAMロールなど、インスタンスに関連する設定

#### 保存しないもの
- メモリ内容
  - インスタンスのRAM（ランダムアクセスメモリ）に保持されているデータ（例えば、実行中のアプリケーションの状態や変数）
- インスタンスの動的な状態
  - 実行中のプロセスや、ネットワーク接続、セッションの状態
- 一時的なデータ
  - インスタンスストレージ（Ephemeral storage）など、一時的に保存されるデータ

### EBS（Elastic Block Store）
データを永続的に保存するためのストレージを提供するサービス

#### 目的
永続的なデータストレージ

#### 保存内容
- ファイルシステムデータ
- データベースのデータ
- ログファイル
- 設定ファイルやシステムの設定

#### 注意点
EC2を停止させても課金が止まらない点
対処法：terminate(インスタンスを完全削除)する

## 料金プラン
- オンデマンドインスタンス
- スポットインスタンス
- リザーブドインスタンス
- Saving Plan
など

### 自分で検証する際のおすすめプラン
- スポットインスタンス
  - サーバー稼働中に急遽ストップする可能性があるサーバー。その分低価格です


## まとめ
EC2は柔軟でスケーラブルな仮想サーバーサービスで、さまざまなワークロードに対応でき、インスタンスを必要に応じて開始、停止、削除できます。料金プランにはオンデマンドインスタンスやスポットインスタンスなどがあり、用途に応じて最適な選択が可能です
プログラム入門：変数・シェル変数・環境変数の違いについてコードを書きながらまとめてみた

## はじめに
プログラミングやシステム管理を行う上で「変数」「シェル変数」「環境変数」という言葉を目にすることがあります。それぞれの概念と違いを理解することで、より効果的にシステムを操作できるようになります。

## 変数とは？

一般的に「変数」とは、プログラム内で値を一時的に格納するための記号のことを指します。変数を利用することで、プログラムの動作を柔軟に制御できます。

例えば、プログラミング言語のPythonでは、次のように変数を定義します。

```python
name = "Alice"
age = 25
print(name, age)
```

この場合、`name` と `age` は変数です。シェルスクリプトでも変数を使用できます。

```sh
name="Alice"
echo $name
```

ここで `name` は変数として定義されており、`$name` でその値を参照できます。

## シェル変数とは？

シェル変数は、シェル（bash, zsh など）が内部で管理する変数であり、特定のシェルのプロセス内でのみ有効です。他のプロセスや子プロセスには影響しません。

例えば、以下のように変数を設定できます。

```sh
myvar="Hello, World!"
echo $myvar
```

この `myvar` は現在のシェルプロセス内でのみ利用できます。新しく開いたターミナルや別のシェルプロセスでは `myvar` の値は保持されません。

## 環境変数とは？

環境変数（Environment Variable）は、シェル変数とは異なり、システムのさまざまなプロセス間で共有される変数です。通常、システムやプログラムが動作する際の設定情報を保持するために使われます。

環境変数を設定するには `export` コマンドを使用します。

```sh
export PATH="$PATH:/usr/local/bin"
echo $PATH
```

ここで `PATH` は環境変数であり、プログラムが実行ファイルを検索するディレクトリのリストを保持しています。

環境変数を一覧表示するには `env` や `printenv` コマンドを使用します。

```sh
env  # または printenv
```

## 4. シェル変数と環境変数の違い

| 項目          | シェル変数 | 環境変数 |
|--------------|---------|---------|
| 影響範囲      | 現在のシェルプロセス内のみ | 子プロセスにも引き継がれる |
| 設定方法      | `var=value` | `export var=value` |
| 確認方法      | `echo $var` | `printenv` や `env` |
| 用途          | 一時的な値の保存 | システム全体やプログラムの設定 |

例えば、次のようなスクリプトを考えてみます。

```sh
#!/bin/bash
myvar="This is a shell variable"
export myenv="This is an environment variable"
./check.sh
```

そして `check.sh` に以下のように記述した場合：

```sh
#!/bin/bash
echo "myvar: $myvar"
echo "myenv: $myenv"
```

このスクリプトを実行すると、`myvar` の値は `check.sh` では空になりますが、`myenv` の値は正しく表示されます。これは `export` しないと変数が子プロセスに引き継がれないためです。

## まとめ

- **変数** は、一般的に値を格納するための記号。
- **シェル変数** は、現在のシェルプロセス内でのみ有効な変数。
- **環境変数** は、システムのプロセス間で共有される変数で、子プロセスにも引き継がれる。
- シェル変数を環境変数として使いたい場合は `export` する必要がある。

シェルスクリプトやLinuxの設定を扱う際には、シェル変数と環境変数の違いを理解し、適切に使い分けることが重要です！
【C#】Parallelを用いた並列処理の方法


ループ内で時間がかかる処理を行う必要があり、処理の高速化を行いました。その時の知見を残します。

## 概要

並列処理を実装するためには大きく分けて２つの方法が存在します。

- `Thread`を使用して別スレッドに分ける。
- `Parallel`を使用してループを並列で実行する。

前者はより細かく制御できますが設定が煩雑です。後者は処理が重いループのみ並列化が可能なためとても手軽です。

今回は`Parallel`を使用した方法で確認します。

## 確認方法

### 対象処理

並列化の対象関数は以下のような処理とします。

```mermaid
flowchart TB
  node_1(["開始"])
  node_2[/"Loop A : 10回ループ"\]
  node_3[\"Loop A : 10回ループ"/]
  node_4[/"Loop B : 10000回ループ"\]
  node_5[\"Loop B : 10000回ループ"/]
  node_6["計算処理"]
  node_7(["終了"])
  node_1 --> node_2
  node_2 --> node_4
  node_5 --> node_3
  node_4 --> node_6
  node_6 --> node_5
  node_3 --> node_7
```

ループ処理がネストしており、それぞれ 10 回と 1000000000 回と回数に大きく差があります。
想定としては「地区に小学校が 10 校存在し、それぞれ 2000 人ずつ生徒が在籍している」みたいな感じです。

並列処理の効果は以下の 4 パターンで確認します。

|    Loop A    |    Loop B    |
| :----------: | :----------: |
|     for      |     for      |
|     for      | Parallel.For |
| Parallel.For |     for      |
| Parallel.For | Parallel.For |

### 測定方法

測定用のメソッドを作成しました。対象のメソッドと測定回数を渡すと処理の平均時間を出力してくれます。

```Csharp
// 引数で渡されたメソッドの実行時間を計測する
static void MeasureTime(Action action, int times)
{
    int time = 0;
    for (int i = 0; i < times; i++)
    {
        time += MeasureTime(action);
    }

    Console.WriteLine("Average Time taken: {0}ms", time / times);
    Console.WriteLine();

    static int MeasureTime(Action action)
    {
        var sw = new Stopwatch();
        sw.Start();
        action();
        sw.Stop();
        Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds);
        return (int)sw.Elapsed.TotalMilliseconds;
    }
}
```

## 結果

|    Loop A    |    Loop B    | 処理時間 |
| :----------: | :----------: | -------- |
|     for      |     for      | 13076ms  |
|     for      | Parallel.For | 3948ms   |
| Parallel.For |     for      | 9237ms   |
| Parallel.For | Parallel.For | 27253ms  |

上記のような結果になりました。基本的にはループ回数が多いところを並列化すると効果が出るような結果になりました。

また、2 つのループを両方並列化した場合の結果を見ると速度が向上していないことも興味深いです。処理時間を見ると最短では 9000ms ほどで完了しているケースもあり、ばらつきが大きいようにも見えました。集計回数を３で実行しましたが、もっと大きくするともう少し小さい値に収束しそうな感じがします。

実際に両方とも並列化したケースで回数を 15 回で実行したところ処理時間の平均は 17481ms になりました。タスクマネージャーを見ると CPU、メモリともに 100%近い値になっており分割しすぎてリソースが枯渇して逆に遅くなっていたようです。

また、同じような機能の`Foreach`も同じような結果になるかは要検証です。

## おわりに

今回の実験から、並列処理が必ずしも処理速度の向上に繋がるわけではないことがわかりました。特に、リソースが限られている環境では、並列化が逆効果になることもあります。並列処理を導入する際には、実際の環境でのパフォーマンスをしっかりと測定し、最適な方法を選択することが重要です。

次回は、Foreach を使った並列処理のパフォーマンスについても検証してみたいと思います。お楽しみに！

## 参考

https://learn.microsoft.com/ja-jp/dotnet/standard/parallel-programming/how-to-write-a-simple-parallel-for-loop

実行したコードは下記です。

https://github.com/KM5075/ParallelForLoop
AWS CDK Study-3 ~共通タグの付与~

チームや組織のルールで *「全リソースに同じタグを付与する」* のようなことがあると思います。現在所属している開発チームも`cdk`で構築したリソースに共通タグをつけるルールがあります。
とはいえ、個々のリソースにちまちまとタグをつけるのは~~めんどくさい~~大変なので、一括で付与する方法を探してみたところ、ありましたので、残しておきます。

# 環境

```
% sw_vers
ProductName:		macOS
ProductVersion:		14.7.3
BuildVersion:		23H417
% aws --version
aws-cli/2.9.10 Python/3.9.11 Darwin/23.6.0 exe/x86_64 prompt/off
% cdk --version
2.178.2 (build 89c49cc)
% npm --version
11.1.0
% node --version
v20.17.0
```

# 一括で共通タグを付与

``` bin/infrastructure.ts
#!/usr/bin/env node
import * as cdk from 'aws-cdk-lib';
import { TestStack } from '../lib/test-stack';

const tagKey: string = 'foo';
const tagValue: string = 'bar';

const app = new cdk.App();

const testStackId: string = 'sample-test-stack';
const testStack = new TestStack(app, testStackId);

// 一括で共通タグを付与
cdk.Tags.of(app).add(tagKey, tagValue);

// Stack毎に共通タグを付与する場合
cdk.Tags.of(testStack).add(tagKey, tagValue);
```

# Next

API Gateway+Lambdaを構築する予定です。
【勉強記録】systemctlコマンド

## はじめに

こんにちは。アメリカ在住で独学でエンジニアを目指している taira です。

今回は Linux 環境でシステムサービスを管理するためのコマンドである systemctl を取り上げて、基本的な使い方やよく使うオプションなどについて解説していきます。

---

## systemctl とは？

systemctl は、systemd を採用している Linux システムでサービスやユニット (unit) を制御するためのコマンドです。systemd は、Linux のブートプロセスやサービスの管理を行う仕組みで、従来の SysVinit よりも機能が豊富かつモダンな設計を持っています。systemctl を使うことで、**サービスの起動・停止・再起動はもちろん、サービスのステータス確認、起動時に自動で開始するかどうかの設定 (enable/disable)** などを簡単に行えます。

---

## ユニット (unit) について

systemd におけるユニットは大きく分けると以下の種類があります。

- **service**：特定のサービス (デーモン) を表すユニット
- **target**：サービスやユニットのグループ化や起動順序を設定するためのユニット
- **socket**：ソケットファイルに関するユニット
- **device**：ハードウェアデバイスに関するユニット
- **mount**：ファイルシステムのマウントに関するユニット
- **timer**：特定の時間や間隔でサービスを起動するためのユニット

これらを一括りにして管理できるのが systemctl というイメージです。

---

## よく使う systemctl コマンド

以下、主にサービス (service) の制御に関する使い方を紹介します。

### ステータスを確認する

```bash
systemctl status <サービス名>
```

指定したサービスの現在のステータスが表示されます。サービスが動作中かどうか、エラーを出していないかなどが確認できます。

### サービスを起動する

```bash
sudo systemctl start <サービス名>
```

指定したサービスを起動します。sudo 権限が必要な場合があります。

### サービスを停止する

```bash
sudo systemctl stop <サービス名>
```

指定したサービスを停止します。

### サービスを再起動する

```bash
sudo systemctl restart <サービス名>
```

サービスを一度停止してから再度起動します。

### サービスをリロードする

```bash
sudo systemctl reload <サービス名>
```

設定ファイルのみを再読み込み (リロード) します。再起動するほどのダウンタイムを発生させたくない場合などに便利です。

### 自動起動を有効化する

```bash
sudo systemctl enable <サービス名>
```

システムが起動する際に自動でサービスが開始されるように設定します。

### 自動起動を無効化する

```bash
sudo systemctl disable <サービス名>
```

システム起動時に自動でサービスを開始しないように設定します。

### 自動起動のステータスを確認する

```bash
systemctl is-enabled <サービス名>
```

このサービスが enable されているか、disable されているかをチェックします。

### 一覧を表示する

```bash
systemctl list-units --type=service
```

systemd で管理されているサービスの一覧が確認できます。`--all` オプションを加えると、実行中ではないサービスも含めて表示されます。

---

## systemctl を使う際の注意点

- 多くのコマンドでは、システムのサービス設定を変更するために管理者権限 (sudo) が必要です。
- 古い Linux ディストリビューションでは systemd を採用していない場合があり、その場合は systemctl が使えない可能性があります。SysVinit 系の場合は `service` コマンドや `/etc/init.d/` 以下のスクリプトで管理する形になります。
- 何か問題が起こった場合は、`systemctl status <サービス名>` でエラーログを確認する、あるいは `journalctl -xe` コマンドなどでサービスに関するログを詳細にチェックする方法があります。

---

## まとめ

systemctl を使うことで、Linux 上でのサービス管理がとてもスムーズになります。サービスの起動・停止やステータス確認、自動起動の設定などの操作をまとめて制御できるのが大きな利点です。
AIと協業するポイントについて思いを馳せてみた

こんにちは、座禅いぬです。

今回は<strong>「生成AIやエージェントのことはなんとなくわかったよ。ではどう使う？」</strong>ということを考えた自分メモです。想定外にたくさんの人に見ていただいた後なので、ちょっと間をあけてからゆるめの記事を投稿したいなと。

### Roo Codeを導入してからの生活
普段は朝に3時間、経営や学びに関する小論文やコードを書くなどの頭脳労働を集約させています。「[1日3時間だけ働いておだやかに暮らすための思考法](https://www.amazon.co.jp/dp/4833423138)」という本を読んでからずっと習慣にしていることです（[関連記事](https://president.jp/articles/-/28033?page=1)）。

<strong>プログラミングをすることは、非常に抽象的かつ本質的な作業だと思います。</strong>コロナ禍が始まって、40を過ぎてから不安とともに始めましたが、やってよかったと思っています。「巣ごもりDXステップ講座情報ナビ」（現「[マナビDX](https://manabi-dx.ipa.go.jp/)」）などで経産省が無料で勉強できる環境をまとめてくれたのは大変ありがたかったです。

ですが、反復するコードを書く作業は全く本質的ではないわけですね。コードを書くことで学べること、考えられることは膨大だと思いますが、ある時から作業になっていくように感じています。AIエージェントはその作業を大きく短縮してくれます。

結果として、毎週業務アプリの機能アップデートを目指していながらもなかなか進んでいなかったのが、毎週複数の機能を追加・修正することができるようになりました。そのうえで、<strong>毎日30分</strong>ほどの<strong>時短効果</strong>も得られています。結果、<strong>より本質的なことを考える時間が得られています。</strong>

### WebUIとの対話は管理職・経営者には効果的。でも仕事増えますよね

やはり職業エンジニアではなく別に本業があるため、有利なのは「自分の作ったアプリに合わせたマニュアル作成」ができることです。業務についての課題はChatGPTやClaudeと協業しています。

具体的には、
1. <strong>視点の外注とイシューの探索</strong>
2. <strong>業務マニュアルの下書き作成</strong>
3. <strong>業務フローをmermaidで壁打ち</strong>
4. <strong>顧客・競合の立場での反応をシミュレーション</strong>
5. <strong>説明資料の作成</strong>
6. <strong>新規事業案の提案</strong>

などにつかっています。

できることが増え、<strong>生産性も高くなったなと感じる一方、仕事量は増えてしまっている</strong>と感じます。具体的には、一つの課題に対して解決策が早く決まり、じゃあ実装しましょうというところまでが月単位→週単位に短縮される。PDCAのサイクル、早くなりますよね。

一方で本質的な問題がなにかをよく考えないと、後で無駄だったなと思うような取り組みが増えそう。生成AIと協業で作ったものは詳細な部分への理解が浅いことがありますので、修正する際にはしっかり理解していないと「<strong>修正が大変だからかえって時間がかかった</strong>」ということになりかねません。

そこで、加速するビジネス展開に甘えず、<strong>いかに本質的な問題をとらえるか（イシューの探索）</strong>は今後さらに重要になると思われます。そもそも、デジタルの力を借りるまでもなくやるべき仕事をちゃんと見定めればやることは100分の1になる、というのは有名な[イシューから始めよ](https://www.amazon.co.jp/dp/4862760856)という本にも書かれている通りです。

### Deep Researchの役目

上記に挙げた協業項目の中でも、特に<strong>説明資料の作成や新規事業案などは事業に大きな貢献をしてくれる</strong>と感じています。そして、Deep Researchが力を発揮してくれる部分でもあります。

短いスパンで新しいアイディアやプレゼンテーションを毎週投下しないといけない環境で、Deep Researchで調査した結果と引用資料および考察から、良いアイディアや比較対象などの資料を引き出していくのは必須の作業になりました。この時短効果は質的向上も伴っており正確に行いにくいのですが、少なく見積もっても<strong>アウトプット量は2倍以上になった</strong>と感じています。

この時提言には必ず<strong>「数字」「ファクト」「ロジック」</strong>の要素を入れるようにしています。「[早く正しく決める技術](https://www.njg.co.jp/book/9784534051837/)」という本を読んでから必ず気を付けている部分なのですが、「1スライド1メッセージ」+「数字、ファクト、ロジック」を実現するにはかなり調査に負荷がかかりますので、これらを一貫して調査してくれるツールとしてはDeep Researchはもう手放せない。

### 課題:APIはまだ使いこなせていない
今後の課題ですが、APIを使った業務の自動化は一部実行しているものの、まだ進んでいません。昨年あたりから挑戦しているのですが、自動化したい情報を得るためのデジタイゼーションがまだできてない部分を多数発見する結果になりました（あるある）。

Dify含め、このあたりの業務フローにどのようにLLMのAPIを効かせていくかが今年の課題の一つかなと思います。さらに、より高度なAI駆動開発の勉強をすることで、AI駆動経営の見通しも立つのではないか？と考えています。

## まとめ
あくまで「現段階での自分がどのように生成AIと協業しているかを言語化しなおしてみた」というメモではありますが、おそらく多くの方が同じように試行錯誤されていると思いますので、自分の事例も何かの参考になれば…と思っています。

### 余談
先日投稿した「人間はもうなんちゃらDeep Researchの方法」ですが、想像の100倍ぐらいの反応があって大変驚いております。内容としては、自分のやり方を知人に共有するためにまとめたメモ程度の物でしたが、Xなどで有名な方が何人か紹介してくださったおかげで広まったものだと思います。

Qiitaは昔から見ていて、先端技術の勉強になりつつもそれを使った遊びが時折話題になる素敵な場所だと認識しております。そんな場所で評価をいただくのは想像もしておらず恐縮です。<strong>コミュニティに貢献できる記事を心がけて今後も投稿していこうと思います。</strong>
GitHub Copilot Agent mode 入れてみた🙌

## はじめに

今回、GitHub Copilot Agent modeを入れてみたので、

そのセットアップ手順をまとめてみたいと思います。

## セットアップ

### 手順1: vscode Insidersをインストール

現状、Agent modeはInsiders verのvscodeにしか入れられないので、

まずはこのeditorをインストールする必要があります。

とはいえ、[この公式リンク](https://code.visualstudio.com/insiders/)に進み、

ローカルPCの環境に応じてインストールをするだけなので、

とても簡単です☺️

### 手順2: Github Copilotをインストール

手順1でインストールしたeditorに「GitHub Copilot」拡張機能を

インストールします。

「preference」から入ったり、「settings」の検索欄で検索すれば、

簡単に飛ぶことができますので、これも簡単です☺️

この時、有料プランで契約されている人で、

普段は通常のvscodeで作業をされている方は、

このInsiders verのeditorとgithubを繋ぐ必要が出てくるので、

editorに表示されている指示に従って、繋いであげましょう。

### 手順3: Copilot Agentを有効化

先述の「settings」にて検索欄で

* copilot agent

と入力すると、

（**小文字**で入力しないと表示されなかった記憶なので、小文字の方が良いかもしれません🤔）

チェック欄がありますので、そこにチェックマークを入れましょう。

（defaultで既にチェックが入っている可能性もあります）

### 手順3の代わりに...

手順3以外の方法に「コマンドパレットからの有効化」もあります。

こちらは、`Cmd+Shift+P`(Windowsの場合は`Ctrl+Shift+P`)を押して

コマンドパレットを開き、

検索欄で「GitHub Copilot: Toggle Agent Mode」

と入力してタップすることで有効化することも出来ます。



### 手順4: Copilot Edits欄のAgent modeを有効化

Copilot Edits欄のchat枠に「Edit」とあるので、

ここをクリックして「Agent」をクリックします。

[公式ブログ](https://github.blog/jp/2025-02-07-github-copilot-the-agent-awakens/)に動画で手順を載せいただいているので、

詰まった際は、ここを見てみると良いですよ☺️

## 追記(2025/05/06)

Insidersではない方のvscodeでもAgent modeが使えるようになったので、

以下の記事でそのセットアップ方法をまとめています。

https://qiita.com/fujihara_hideyuki/items/2d23a173e07ddeceeccb

## 参照

https://github.blog/jp/2025-02-07-github-copilot-the-agent-awakens/

https://code.visualstudio.com/insiders/

https://qiita.com/kei1-dev/items/e6b0ead5f24de35e30ed

https://zenn.dev/aimasaou/articles/74c89b843832b3

https://note.com/yusukexz777/n/n3a008d76f2c7
音声認識モデルのデプロイはリアルタイム処理なのか？*


## **1. 音声認識の処理フロー**
音声認識のMLOpsを分解すると、以下のプロセスが含まれます：

### **(1) 音声データの取得（リアルタイム or バッチ）**
- **リアルタイムのケース**: スマホアプリやWebアプリで音声をストリーミング入力する（例: Google Speech-to-Text）。
- **バッチのケース**: 事前に録音された音声ファイルを定期的に処理する（例: コールセンターの音声データ解析）。

### **(2) 推論（リアルタイム）**
- **この部分はリアルタイム処理が必要**  
- 音声をテキストに変換する処理は、ユーザーが即時結果を求めるため、**低レイテンシーでの推論が求められる**。

### **(3) 推論結果のストリーム処理（リアルタイム or バッチ）**
- **リアルタイムのケース**: テキスト解析を行い、即時フィードバックを返す（例: リアルタイム字幕生成）。
- **バッチのケース**: テキストログを蓄積し、後で分析する（例: 音声ログの感情解析）。

### **(4) モデルの学習（バッチ処理）**
- **新しいデータが蓄積された後に、一定の間隔で学習する**（通常は1日〜1週間ごと）。
- モデルの更新頻度は、用途による（音声認識の精度を上げるための学習は頻繁にやる必要がない場合が多い）。
- **Kubernetesなどのバッチ処理に適した環境で行うことが多い**。

---

## **2. Kubernetesはどの部分を担当するのか？**
音声認識のMLOpsでは、以下のような形でKubernetesが使われることが多い。

✅ **向いている部分（Kubernetesの得意領域）**
| 処理内容 | Kubernetesの役割 |
|----------|----------------|
| **モデルのトレーニング** | 定期的に学習を行うバッチ処理 (`CronJob`) |
| **データの収集・ETL処理** | KafkaやAirflowを組み合わせたデータパイプライン |
| **モデルのデプロイ（スケーリング）** | `TensorFlow Serving` や `FastAPI` を `Kubernetes Deployment` で運用 |

❌ **向いていない部分（Kubernetesだけでは厳しい）**
| 処理内容 | Kubernetesの課題 | 解決策 |
|----------|-----------------|------|
| **リアルタイム推論** | レイテンシーが発生しやすい | Knative / KEDA を併用 |
| **ストリーミングデータの処理** | Kafka, Flinkが必要 | Kafka Operator（Strimzi）を利用 |
| **大規模なオーディオ処理** | Podスケールの遅延 | GPUインスタンスを活用 |

---

## **3. 音声認識のリアルタイム性の確保**
音声認識をリアルタイムで運用する場合、**以下の技術を組み合わせることで、スムーズにデプロイできる**。

### **(1) 推論APIをリアルタイム対応にする**
- `FastAPI` や `TensorFlow Serving` を使って、**常時起動する軽量な推論API**をKubernetesにデプロイ。
- WebSocketを使えば、**リアルタイムのストリーミング音声処理も可能**。

**例：FastAPIでリアルタイム音声認識を提供**
```python
from fastapi import FastAPI, UploadFile
import whisper

app = FastAPI()
model = whisper.load_model("base")

@app.post("/transcribe")
async def transcribe(audio: UploadFile):
    audio_data = await audio.read()
    result = model.transcribe(audio_data)
    return {"text": result["text"]}
```

Kubernetes上でこのAPIを**永続的に動かす**ことで、**リアルタイム推論環境を構築可能**。

---

### **(2) Kubernetesでのリアルタイムスケール戦略**
Kubernetesはデフォルトではリアルタイムスケーリングに向いていないが、以下の技術を活用すれば解決可能。

✅ **KEDA + Kafkaでイベント駆動スケーリング**
- 音声の入力データが増えたときに、Kafkaのキューを監視し、自動スケール。

✅ **Knativeでリクエストに応じてゼロスケール**
- 音声リクエストがないときにリソースを節約し、リクエストが来たらPodを起動。

**例：Knativeを使ったスケール戦略**
```yaml
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: speech-to-text
spec:
  template:
    spec:
      containers:
      - image: my-whisper-model:latest
        ports:
        - containerPort: 8080
  traffic:
  - percent: 100
```

---

## **4. まとめ**
### **✅ リアルタイム推論とバッチ処理の組み合わせ**
音声認識のMLOpsでは、以下のような構造になっている：
- **推論はリアルタイム（FastAPI, TensorFlow Serving, Knative）**
- **データ収集・学習はバッチ（Airflow, Kubeflow, Kubernetes CronJob）**
- **ストリーミング処理が必要ならKafkaやKEDAを併用**

### **✅ Kubernetesは「リアルタイム推論を常駐させる」用途には適している**
- **「リアルタイム処理 = ストリーミング処理」ではない**
- **Kubernetesはリアルタイム推論には使えるが、低遅延の工夫が必要**
- **リアルタイムデータ処理（Kafka, Flink）は追加の仕組みが必要**

つまり、**音声認識は「リアルタイム推論」と「バッチ学習」の組み合わせでMLOpsを運用するのが最適**ということですね！
【応用情報】WAFのホワイトリストとブラックリスト

## はじめに
応用情報技術者試験で出てくるWAFのホワイトリストとブラックリストついてまとめてみました。

## WAFのホワイトリストとブラックリスト
WAFは、ホワイトリスト方式とブラックリスト方式の二つの方式に分類できます。

### ホワイトリスト方式
ホワイトリストとは、問題のない通信パターン、すなわち怪しくない（正常な）通信パターンの一覧です。ホワイトリスト方式では、原則として通信を遮断し、ホワイトリストと一致した通信のみ通過させます。

### ブラックリスト方式
ブラックリストとは、怪しい（不正な）通信パターンの一覧です。ブラックリスト方式では、原則として通信を許可し、ブラックリストと一致した通信は遮断するか、あるいは無害化します。

## おわりに
ここまで読んでいただきありがとうございます！

## 参考文献
令和06-07年 応用情報技術者 試験によくでる問題集【午後】 単行本（ソフトカバー） – 2024/3/22
大滝 みや子 (著)
p.31
jotaiを初めて使う

# jotaiとは

https://jotai.org/

まだあまりわかっていないのでざっくり、
**状態管理めっちゃいい感じにしてくれるやつ**

状態管理のライブラリは他にも下記がある

https://zustand-demo.pmnd.rs/

# 使い方
## atomを作る
### フォルダ構成
atoms
┣ index
┣ user
┗ team
### 書き方
①すべてファイル分けし、indexでまとめる方法
```
//index
export { userAtom } from './user'
export { teamAtom } from './team'
```

それぞれのファイルは初期値を記載
```
//user
import { atom } from 'jotai'

export const userAtom = atom({
    userData: [],
    userLoading: false,
    userError: {}
})
```

②すべて同一のファイルに記載
```
//index
import { atom } from 'jotai'

export const userAtom = atom({
    userData: [],
    userLoading: false,
    userError: {}
})

export const teamAtom = atom({
    teamData: [],
    teamLoading: false,
    teamError: {}
})
```

※下記のような書き方があるらしいがまだよくわかってない
- 読み取り専用アトム
- 書き込み専用アトム
- 読み書き可能なアトム
```
const readOnlyAtom = atom((get) => get(priceAtom) * 2)
const writeOnlyAtom = atom(
  null, // it's a convention to pass `null` for the first argument
  (get, set, update) => {
    // `update` is any single value we receive for updating this atom
    set(priceAtom, get(priceAtom) - update.discount)
    // or we can pass a function as the second parameter
    // the function will be invoked,
    //  receiving the atom's current value as its first parameter
    set(priceAtom, (price) => price - update.discount)
  },
)
const readWriteAtom = atom(
  (get) => get(priceAtom) * 2,
  (get, set, newPrice) => {
    set(priceAtom, newPrice / 2)
    // you can set as many atoms as you want at the same time
  },
)
```
これなんか便利そうだから理解したい

## hooksやページ側で使う
```
import { useAtom } from 'jotai'
import { userAtom } from '@/atoms'

export function useUser() {
const [user,setUser] = useAtom(userAtom)

//他の状態は変更せずuserLoadingのみ変更する
setUser(prev => ({...prev, userLoading:true}))

//使用する
if(user.userLoading)
```
cscの作法 その574

# 概要
cscの作法、調べてみた。
悩んだので、copilotに、聞いてみた。

# プロンプト

c#で、書いたプログラムが、コンパイルするとWindows Defenderにウィルス判定され隔離される。除外するには、どうすればいいのか。

# 回答

Windows Defenderで特定のプログラムやファイルをウイルススキャンの対象から除外するには、以下の手順を試してみてください：

1. **Windowsセキュリティを開く**  
   - スタートメニューから「設定」を開き、「プライバシーとセキュリティ」を選択します。
   - 「Windowsセキュリティ」をクリックし、「Windowsセキュリティを開く」を選択します。

2. **ウイルスと脅威の防止を選択**  
   - 「ウイルスと脅威の防止」をクリックし、「設定の管理」を選択します。

3. **除外設定を追加**  
   - 「除外の追加または削除」をクリックします。
   - 「除外の追加」を選択し、以下のいずれかを指定します：
     - ファイル（特定のプログラムファイルを指定）
     - フォルダ（フォルダ全体を除外）
     - ファイルの種類（特定の拡張子を除外）
     - プロセス（実行ファイル名を指定）

4. **除外対象を選択**  
   - 除外したいプログラムやフォルダを選択し、「保存」をクリックします。

これで、指定したプログラムやファイルがWindows Defenderのスキャン対象から除外されます。ただし、除外設定を行う際は、セキュリティリスクを十分に考慮してください。

さらに詳しい手順は[こちら](https://www.pasoble.jp/windows/10/defender-data-exclusion.html)や[こちら](https://aprico-media.com/posts/10700)で確認できます。何か他にお手伝いできることがあれば教えてください！

以上。
同じ名前のブランチを差し替える

# 概要

productionブランチを更新するのではなく、
他のブランチを今後productionとして扱う、
ということをしたい。

# 付随要件

本番環境は旧productionの最新→新productionの最新へと切り替え、常にproduction最新を保つ

# 方法概要

本番機以外で、
旧productionを他の名前にリネームしてそれをリモートに反映し、
新productionをつくってそれをリモートに反映する

本番機で、
旧productionをリネームし、
新productionをリモートから取得する

# 詳細

前提
ここではブランチ名を以下とします。
いずれも必ずしも残す必要のないものですが、
節目をわかりやすくするためにしばらく残す方針としました。
- 新たにproductionとするブランチは `production_20250315_open`
- リモートに残す旧productionは `production_20250315_closed`
- 本番機のローカルリポジトリに残る旧productionは `production_20250315_closed_localonly`
    - これは切り替え後に不具合があった場合は切り戻し対象



```shell: 本番機以外で実施

# ---
# 新productionの元となるブランチを取得・最新化
# ---
b=production_20250315_open
git fetch origin $b
git switch $b
git pull origin $b

# ---
# 旧productionを取得・最新化
# ---
b=production
git fetch origin $b
git switch $b
git pull origin $b

# ---
# 旧productionをリネーム
# ---
# ブランチ名設定
b1=production
b2=production_20250315_closed
# 切り替え
git switch $b1
# ローカルの$b1を$b2に変更
git branch -m $b1 $b2
# リモートに$b2をプッシュ
git push origin $b2
# リモートの$b1を削除
git push origin --delete $b1

# ---
# 新productionを作成
# ---
b1=production_20250315_open
b2=production
# 切り替え
git switch $b1
# ローカルの$b1から$b2をチェックアウト
git checkout -b $b2
# リモートに$b2をプッシュ
git push origin $b2
```

```shell:本番機で実施
# productionであることを念のため確認
git status
# productionをリネームする
git branch -m production production_20250315_closed_localonly
# ローカルにproductionブランチがないことを確認
git branch | grep production
# 新productionを取得する
git fetch origin production
git switch production
git pull origin production
# 念のためログを見て新productionであることを判断する
git log -n 1
```

おわったあと
ローカルリポジトリにproductionを持ってる人は一旦消す。
社内ネットワーク L2スイッチのトラブル

# 何があったか
- 会社に出社したら、L2への死活監視が頻繁に反応する
- Pingが通らなくなり、クライアントPCがネットワークを利用できなくなった

# どうしてそうなったのか
- Windowsは昔の名残でマスターブラウザをセグメント内で選出する
- ActiveDirectoryのDHCPプール外の端末がマスターブラウザになってしまっていた
- DHCP内の端末はそれを知らないため、マスターブラウザになろうとするPCとケンカしてしまった。

# どうしたか
- マスターブラウザになっているPCとなりたいと思っているPCのLANケーブルを物理的に抜いた
- マスターブラウザになっているPCはマスターブラウザにならないように設定した
- マスターブラウザになろうとしていたPCは、認証なしのセグメントに切り替えた
- ActiveDirectoryサーバの再起動、L2スイッチをスタンバイへ切り替え（LANケーブルの物理的な差し替え）、L3スイッチのarp cacheのクリアを実施した

# 結果
- マスターブラウザになっていたPCとなろうとしていたPCのLANケーブルを抜いたあと、少し安定したが、死活監視は反応していた。しかし、ユーザへの影響はなかった
- ActiveDirectoryサーバの再起動、L2スイッチをスタンバイへ切り替え（LANケーブルの物理的な差し替え）、L3スイッチのarp cacheのクリアを行ったあとは安定稼働した

# 考察
- クライアントPCのログを確認すると、今までもマスターブラウザの競合発生していたようにみえる
- このタイミングでL2スイッチが重くなった原因を完全に特定することは難しいが、マスターブラウザの選出が関わっている可能性はあると思う
- それは、2台のPCのLANケーブルを抜くとL2スイッチが安定しケーブルを接続すると不安定になったからである
- ではなぜマスターブラウザに問題ある2台をネットワークから除外しても不安定な状態が再発したのか
- ActiveDirectoryサーバの再起動、L2スイッチをスタンバイへ切り替え（LANケーブルの物理的な差し替え）、L3スイッのarp cacheのクリアを実施して安定したため、 マスターブラウザの情報やネットワーク上にあるARPテーブルなどの情報の整合性が崩れいた可能性がる

# 今後の対応
- マスターブラウザの選出に影響を与えないようにDHCPプール内で固定IPアドレスは設定していく
- L2スイッチに接続されている不要なLANケーブルは順次抜いていく
- L2スイッチの各ポートを監視して、トラフィック量に異常がないか確認していく
- L2スイッチのログレベルを引き上げて、詳細なログを蓄積し解析できるようにする

# 1週間様子をみて
- あの障害はなんだったのかと思うほど安定している
- マスターブラウザになろうとしたPCも元のセグメントに戻して正常に繋がっている
- 実は翌日に構築ベンダーから連絡があり、1/0/3のポートがMACアドレスの学習を繰り返していてループまではいかないでも何かおかしいと連絡をもらった
- 確かに処理が追いつかず1秒ごとに学習を辞めては再開しての繰り返しをしているのはログでも確認できた
- ログを確認した当日は1秒内の話なのでそのまま放置していた
- 1/0/3のLANケーブルを抜いてみた
- 利用していない社内サーバからDOWN通知が飛んできた
- 週明け再度確認したところ、ネットワークに繋がっていないはずのサーバのLANポートがグリーンに光っている
- コンソールから確認してもインターネットへ接続できる
- 通知は間違いなくこのサーバであるが、監視サーバからpingは飛ばないのにインターネットへ出ているというか、このサーバのLANケーブルと繋がっているL2スイッチのポートのケーブルを抜いたわけではないのに、なぜネットワークにつながるのか
- とりあえずサーバのLANケーブルは抜いて、L2スイッチからも抜いた
- 再度、1/0/3のポートに接続されていたLANケーブルを確認すると、島HUBへ配線されているLANケーブルだった（どこの島かは不明）
- おそらく、どこかの島HUBからUターンしてL2に戻ってきた可能性がある（そうでないとサーバへ通信できなくなる理由がわからない）
- たまたま島HUBの電源が入ったか誰かが何かを繋いだか

# 今後の対応
- フロアの半分は新しくLANケーブルを新設したため、こちらはどこの島からL2スイッチのどこのポートに繋がっているかかわかる
- もう半分の方は、デスクトップも含めて無線化しようという話だったのでデスクトップの無線化を進める
- 準備ができたタイミングでL2スイッチに接続されている不要なLANケーブルを抜いていく
GISなら、QFILEDが便利で軽いよ～～～

事業監理業務のアウトカムとして、個人的な目標に職員の方がGISを使えることを挙げているのですが、なかなか敷居が高く、QFILEDで少しでも敷居を低くできないかと、QGISのランチャーをQFiledにも対応できるようにもしました。

　これによりペーパレス会議に導入したタブレットに事前にQFILEDをインストールしておけば、利用シーンも増えるかも？？？

　ちょっと期待です。
　それに、PC+ANDROID+IPADで同じ画面というのもよいかも？

　https://github.com/yamamoto-ryuzo/yr-qgis-launcher
　
QFILEDポータブル版はこちら（動くはず・・・💦）
　https://1drv.ms/u/c/cbbfeab49e70546f/EUv4Xt-05ihEiJgXjchBc9UB7Fyjwk6Y7eJKwbiPRkcYEw?e=AMnNSe
数学における関数の入力(引数)について思い込んでいたこと

そういえば数学を考える時、関数の入力(引数)のデータ型って無意識のうちに"1つの実数値"として思い込んでいたかも。

"1つの実数値"を入力に使う関数なんてほんの一例なんだ。

データ加工の実装で関数の設計を自分でやるようになって(引数のデータ型,その要素数とデータ型ﾅﾄﾞﾅﾄﾞ)腑に落ちた感。