OmniAICreator/Qiita-1.07M huggingface dataset:
NAND型RAGは本当に必要か？DRAM型RAGとの比較、事例紹介、ファインチューニングとの徹底比較

## 📌 はじめに
近年、RAG（Retrieval-Augmented Generation）とファインチューニング（Fine-Tuning）の議論が盛り上がっています。「巨大な知識が必要ならファインチューニングすればいいのでは？」という声も多く聞かれますが、実はそう単純ではありません。特に「大規模知識ならファインチューニングで十分？」という疑問がよく出ますが、**NAND型RAG**や**DRAM型RAG**がファインチューニングを補完する重要な理由があります。

本記事では、DRAM型・NAND型RAGの違い、事例、そしてファインチューニングとの比較を徹底的に掘り下げます。



## 💡 ファインチューニングとRAGの基本

### ファインチューニング（Fine-Tuning）とは？
事前学習済みの大規模言語モデル（LLM）に対し、特定の知識やタスクを学習させるプロセスです。
- ✅ **強み**: 高速な応答、知識の統合性が高い。
- ⚠️ **弱み**: 学習コストが高い、最新情報の反映が遅い。

### RAG（Retrieval-Augmented Generation）とは？
大規模言語モデルに「外部知識ベース」から情報を検索・参照させる手法です。
- ✅ **強み**: 知識の即時更新が可能、出典が明示できる。
- ⚠️ **弱み**: 外部検索の分、応答が若干遅い可能性がある。

---

## 💾 NAND型RAGとは？DRAM型RAGとの違い

### DRAM型RAGの特徴
- 高速な検索が可能（低レイテンシ）。
- しかし、数百GB以上のデータはコストが爆発。

### NAND型RAGの特徴
- 数十TB〜PB級の大規模データを低コストで保持可能。
- DRAMより遅いが、最新のNAND最適化技術（例：KIOXIA AiSAQ）は高速な検索が可能。

### DRAM型とNAND型の使い分け
| 項目             | DRAM型RAG            | NAND型RAG             |
|------------------|---------------------|---------------------|
| **コスト**       | 高額（容量あたり） | 安価（大規模対応） |
| **速度**         | 非常に高速         | 高速（最適化次第）  |
| **スケール**     | 数百GBまで最適     | 数十TB以上に対応   |


## 🚀 それぞれのRAGが求められる事例

### 📰 1. ニュース速報や金融市場のリアルタイムAI
- **課題**: 最新ニュースや株価情報は毎秒更新。
- **解決**: NAND型RAGで巨大な過去データを保持しつつ、最新データはDRAMでキャッシュ。

### 🏥 2. 医療・製薬分野の論文検索AI
- **課題**: 最新の論文や臨床試験データは常に更新。
- **解決**: NANDにPB級の論文を保存、即座に検索して医師に提示。

### 💼 3. 企業向けナレッジベース検索
- **課題**: 社内文書は膨大かつ頻繁に更新。
- **解決**: DRAMにFAQ、NANDに過去の文書を保存し、ハイブリッドRAGで対応。

### **📰 4. DRAM型RAG事例：ニュース速報AI**
- **用途**: 最新ニュースのリアルタイム検索。
- **構成**: DRAM上に直近24時間分のニュースをキャッシュ。過去記事はNANDで保持。
- **利点**: ミリ秒単位で速報を提供。

### **🏥 5. NAND型RAG事例：医療研究AI**
- **用途**: 医療論文や臨床試験データの即時検索。
- **構成**: NANDにPB級の論文、DRAMに直近の研究を格納。
- **利点**: 大量の医学知識を即座に検索し、医師の意思決定を支援。

### **💼 6. ハイブリッド事例：企業ナレッジ検索AI**
- **用途**: 社内FAQおよび契約書検索AI。
- **構成**: DRAMにFAQ、NANDに数年分の過去契約書。
- **利点**: 高速検索と大規模アーカイブの両立。


## 💰 ファインチューニングとの比較：どちらを選ぶべきか？
| 項目                | ファインチューニング         | RAG（DRAM/NAND）     |
|---------------------|--------------------------|---------------------|
| **初期コスト**       | 高額（再学習必須）        | 中〜高（DB構築が必要）|
| **運用コスト**       | 高額（再学習が都度発生）   | 低額（DB更新だけ）   |
| **知識更新の柔軟性**   | 低い（再学習が必須）      | 高い（即座に反映）   |
| **対応知識の広さ**   | 学習範囲に限定される      | 大規模かつ即時対応  |


## 🔮 結論：DRAM型・NAND型RAGは「動的知識の時代」に不可欠
- **DRAM型RAG**は、即時性が求められる「ホットデータ」に対応。
- **NAND型RAG**は、広範な知識を低コストで保持する「ロングテール」対応。
- **ファインチューニングは静的知識を内蔵**する役割で、**RAGは動的知識の即時活用**を担う。

### 💡 将来展望
- ✅ **動的知識**: 金融、医療、法律分野での即時検索ニーズが加速。
- ✅ **コスト効率**: クラウド型RAGサービス（Pinecone, Milvus）がさらに普及。
- ✅ **NAND最適化技術**: KIOXIA AiSAQなどの登場により、レイテンシが大幅改善。


## 🚀 まとめ
- ファインチューニングは「**静的な知識の内製化**」。
- NAND型RAGは「**動的な知識の即時活用**」。
- 両者は「競合」ではなく「補完関係」にある。
【Vite】.envファイルから環境変数を設定する

# はじめに
supabaseのDB情報をViteで使用する際、環境変数設定方法について調べたことをまとめます。

# 実現したかったこと
supabaseのDB情報をViteで使用する。

# 解決方法
①dotenvとdotenv-expandをインストールする。

>Vite は、環境ディレクトリーにある以下のファイルから追加の環境変数を読み込むために dotenv を利用します。
>また、Vite は dotenv-expand を使って、設定不要で env ファイルに書かれた変数を展開できます。

```
npm init -y
npm i dotenv
npm i dotenv-expand
```

node_modules配下にインストールされていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3993509/4e783e5d-2d3f-4698-bfbd-3d51ea2f25fa.png)


①supabaseのドキュメントから、Initializingのソースをコピー

```javascript:spabase.js
import { createClient } from '@supabase/supabase-js'

// Create a single supabase client for interacting with your database
const supabase = createClient('https://xyzcompany.supabase.co', 'public-anon-key')
```

②外部環境変数ファイル(.env.local)を作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3993509/74b741d0-0e3d-4176-8e6d-7ad9b872d044.png)

>環境変数が誤ってクライアントに漏れてしまうことを防ぐために、VITE_ から始まる変数のみが Vite で処理されたコードに公開されます。
>>例えば、以下の環境変数だとVITE_SOME_KEY だけが import.meta.env.VITE_SOME_KEY としてクライアントソースコードに公開され、DB_PASSWORD は公開されません。
```.env
VITE_SOME_KEY=123
DB_PASSWORD=foobar
```
とのことなので、環境変数の最初にVITE_をつけました。
```.env.local
VITE_NEXT_PUBLIC_SUPABASE_URL=hogehoge
VITE_NEXT_PUBLIC_SUPABASE_ANON_KEY=hogehoge
```



③環境変数ファイルを読み込むように①のソースを修正


>Vite は特定の定数を特別な import.meta.env オブジェクトの下で公開します。

```javascript
import { createClient } from '@supabase/supabase-js'

// Create a single supabase client for interacting with your database
export const supabase = createClient(
  import.meta.env.VITE_NEXT_PUBLIC_SUPABASE_URL, import.meta.env.VITE_NEXT_PUBLIC_SUPABASE_ANON_KEY)
```


# おわりに
ドキュメントを見つつ、試行錯誤してできたときの喜びは癖になりそう。

# 参考
#### 環境変数とは、dotenv、dotenv-expandについて
こちらの記事を読みつつ試すだけで、環境変数の理解度がかなり上がったと感じています。

https://for.kobayashiii.dev/articles/nqbaxkkf8

#### supabaseドキュメント

https://supabase.com/docs/reference/javascript/initializing

#### Viteドキュメント

https://ja.vite.dev/guide/env-and-mode.html

#### supabaseの環境変数設定について具体的に実装されている動画です。

https://www.youtube.com/watch?v=CZlZgRo0bZ4
【Vite】.envと.env.localについて

# はじめに
ドキュメントを読んでいて下記の「gitには無視される」がよくわからなかったため、実験しました。
>.env               # 全ての場合に読み込まれる
.env.local          # 全ての場合に読み込まれ、gitには無視される

https://ja.vite.dev/guide/env-and-mode.html#env-files

# .envファイルの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3993509/74810ebf-eb68-42df-ba57-b487cf0b08ac.png)

変更に表示される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3993509/387c2584-60bc-409b-85b5-10984ddfa10f.png)

# .env.localファイルの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3993509/567142d3-4b61-45ff-a993-44c78ca668fb.png)


変更に表示されない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3993509/0f06da81-0bd1-4ead-bc27-e3de2b90d2bc.png)

# .gitignoreファイルに記載することで、表示されない
```.gitignore
node_modules
dist
dist-ssr
*.local
.env
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3993509/42931385-b78b-4bba-8a0d-4f0468baa057.png)

.env.localが最初から無視されていたのは、.gitignoreファイルに*.localが定義されていたからでした。


# おわりに
なんとなく理解していたつもりでも、実験すると面白かったです。
Flutter の iOS 実機デバッグ中に接続が切断されると、アプリがクラッシュする

iOS の実機でデバッグする際、アプリは正常に起動しますが、USB ケーブルを抜くとアプリが閉じ、再度開こうとするとクラッシュします。  

これは、Flutter がデフォルトで 【Debug モード】 でコンパイルを行うためです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/26086389-5353-486c-995b-7118a41da8da.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/2f825a2b-1597-4694-b0f9-52b2c16ff961.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/3fe59314-6ad7-483f-a4de-b39f31797b6b.png)

# 参考サイト
https://blog.csdn.net/wq2323/article/details/132001610
[TIPS]SalesforceのデータローダーのExportで「Error creating data access object」が発生したときの対処法

# はじめに
この記事では、SalesforceのデータローダーのExport操作を行なった時に発生する「Error creating data access object」というエラーの対処法について記載します。

# エラー詳細
Salesforceのデータローダーで「Export」を選択しオブジェクトを選択した後で「Next>」をクリックした時に「Error creating data access object」というエラーが発生しました。

![スクリーンショット 2025-02-18 18.51.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268801/119fc442-38d2-4176-9151-6c9f23d7a9ee.png)

# 対処方法

このエラーは **エクスポートするファイルの場所を明示的に指定する** ことで解消できます。
![スクリーンショット_2025-02-18_18_53_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268801/c7a1fb94-9dde-4bc3-8017-de75a52fe928.png)

「Browse...」からファイルパスを指定します。
ダウロードフォルダや、書類フォルダなど馴染みの任意の場所を設定すればよいです。

![スクリーンショット_2025-02-18_18_56_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268801/9bc1392c-2225-419c-a918-09a641379322.png)


つまり、このエラーはSFへのアクセス権に関するエラーではなく、Macのファイルアクセス権に関するエラーだったというおちでした。

以上、参考になりましたら幸いです。


## 補足：実施環境
```
CPU: Apple M1 Pro (ARM)
OS: macOS Sequoia 15.3.1
App: Salesforce Data Loader 63.0.0
```
(wsl用(Ubuntu20.04))初期状態Ubuntuにcupy,pytorch,pytorchに対応したドライバーを入れるまでのアーカイブ

## Ubuntu20.04をインストールする
    wsl --install -d Ubuntu-20.04
アプリケーションとしてUbuntu20.04がインストールされているので、開く。

## 必須パッケージのインストール
    sudo apt update && sudo apt upgrade -y
    sudo apt install -y build-essential wget curl unzip zip git tmux htop

## Anacondaをインストール
    # 最新の Anaconda をダウンロード
    wget https://repo.anaconda.com/archive/Anaconda3-2024.02-1-Linux-x86_64.sh
    
    # インストール
    bash Anaconda3-2024.02-1-Linux-x86_64.sh
    
    # 環境を初期化
    eval "$(/home/$(whoami)/anaconda3/bin/conda shell.bash hook)"
    conda init

## 環境パスを設定（⭐「masarina」は私の名前！ここには自分の名前を入れてね！⭐）
    echo 'export PATH="/home/masarina/conda/bin:$PATH"' >> ~/.bashrc
    source ~/.bashrc

## CUDA Toolkit 12.0のインストール
```
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/12.0.0/local_installers/cuda-repo-ubuntu2004-12-0-local_12.0.0-525.60.13-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu2004-12-0-local_12.0.0-525.60.13-1_amd64.deb
sudo cp /var/cuda-repo-ubuntu2004-12-0-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda

```

windowsのターミナルに戻って
```
wsl --shutdown
```
を実行して閉じて、もう一度Ubuntu20.04アプリケーションを起動して、
以下を実行して確認
```
nvcc --version
nvidia-smi
```
ああ、、vnccのパスが通ってない、、
find コマンドで nvcc を検索
``` 
find / -name "nvcc" 2>/dev/null 
```
→ ルートから全部見ちゃえ。めちゃ時間かかるけど確実。
/usr/local/cuda-12.0/bin/nvcc　だったので
```
echo 'export PATH="/usr/local/cuda-12.0/bin:$PATH"' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH="/usr/local/cuda-12.0/lib64:$LD_LIBRARY_PATH"' >> ~/.bashrc
source ~/.bashrc
```
あとはー、
```
nvcc --version
```
を実行して確認して、、
```
(base) masarina@DESKTOP-H5AUO33:~$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2022 NVIDIA Corporation
Built on Mon_Oct_24_19:12:58_PDT_2022
Cuda compilation tools, release 12.0, V12.0.76
Build cuda_12.0.r12.0/compiler.31968024_0
(base) masarina@DESKTOP-H5AUO33:~$
```
って出てくればOKね。


そしたらanacondaで仮想環境を作ろう。
```
conda create --name 好きな名前 python=3.7.0
```
pythonは3.7.0でお願いね。
```
conda activate さっき設定した名前
```
で仮想環境に入って,,
cupyをインストール
```
conda install cupy=8.3.0
```
そしたら最後、pytorchをインストールするか、、
```
conda install pytorch==1.13.1 torchvision==0.14.1 torchaudio==0.13.1 pytorch-cuda=11.7 -c pytorch -c nvidia

```

## あとは細かい設定
```
sudo apt update
sudo apt install -y language-pack-ja
sudo locale-gen ja_JP.UTF-8
sudo update-locale LANG=ja_JP.UTF-8
locale -a | grep ja_JP

```
WordPress REST API レスポンス: (404) Not Found

「REST API は WordPress や他のアプリケーションがサーバーと通信する手段の1つです。たとえば、ブロックエディターの画面は投稿や固定ページの表示や保存のために REST API を使用しています。

REST API のテスト時に、予期しない結果が返されました:

REST API エンドポイント: ttp://xxxxxx/wordpress/wp-json/wp/v2/types/post?context=edit
REST API レスポンス: (404) Not Found」

これがサイトヘルスで出ていたら
↓↓↓↓

sudo a2enmod rewrite
sudo systemctl restart apache2
Unity6でTMProがない(TextMeshPro)とIDEが言い出したときの解決法

##  error CS0246: The type or namespace name 'TMPro' could not be found (are you missing a using directive or an assembly reference?)
TestRunnerを追加するとたいてい発生します。

## Scriptsフォルダー（自分のスクリプトフォルダー)からアセンブル定義
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54688/502223b3-c8f7-43c3-9d15-da705b424a2b.png)

## アセンブリ定義参照の所に、Unity.TextMeshProを追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54688/4dd82442-66cc-4d95-b0ac-2b63a658a9fb.png)


これで解決しない場合、以下も約立つかもしれない。

https://stackoverflow.com/questions/61102508/tmpro-not-found-in-visual-studio-code/69380029#69380029
FIWARE コンポーネントの使用技術・依存ミドルウェアを整理

# はじめに

FIWARE エコシステムの各コンポーネントは相互に関連しつつも独立して開発されているため、仕様技術や依存あるいは推奨されるミドルウェアがそれぞれ異なっています
そこで、それぞれのコンポネントの仕様技術や依存関係を整理し、以下にまとめました

# 主要コンポーネントの技術分析

| # | コンポーネント | 開発言語, 使用技術 | 永続化層（DB） | その他ミドルウェア |
| ---: | --- | --- | --- | --- |
| 1 | [Orion](https://github.com/telefonicaid/fiware-orion)<br>Context Broker | C++ | MongoDB |  |
| 2 | [Orion-LD](https://github.com/FIWARE/context.Orion-LD)<br>(Context Broker) | C++ | MongoDB |  |
| 3 | [Cygnus](https://github.com/telefonicaid/fiware-cygnus) | Apache Flume | ― NA ― | (Tomcat) |
| 4 | [QuantumLeap](https://github.com/FIWARE-GEs/quantum-leap) | Python | TimescaleDB /<br>CrateDB |  |
| 5 | [STH-Comet](https://github.com/telefonicaid/fiware-sth-comet) | Node.js | MongoDB |  |
| 6 | [IoT Agent](https://github.com/telefonicaid/iotagent-ul) | Node.js | MongoDB | (Mosquitto, RabbitMQ) |
| 7 | [Draco](https://github.com/ging/fiware-draco) | Java | RDBMS, NoSQL, 分散DB, <br>など多様なストレージに対応 | Apache NiFi, (Tomcat) |
| 8 | [Keyrock](https://github.com/ging/fiware-idm)<br>(Identity Manager) | Node.js | MySQL / PostgreSQL | (Express) |
| 9 | [Wilma](https://github.com/ging/fiware-pep-proxy)<br>(PEP Proxy) | Node.js | ― NA ― |  |
| 10 | [AuthzForce](https://github.com/authzforce/server) | Java | ― NA ― |  |
| 11 | [WireCloud](https://github.com/Wirecloud/wirecloud) | Python (Django), Node.js (Angular) | 各種 RDBMS | (Gunicorn) |

# 関連

- [FIWARE エコシステムについて](https://qiita.com/ot-mikami/items/0b91622f3f58d6271c79)
【Swift】基本構文まとめ（関数・条件分岐・ループ・配列・オプショナル）

## はじめに

Swiftを学習していく中で出てきた基本的な構文を、備忘録のためにまとめました。\
この記事では、**条件分岐・ループ・関数・オプショナル**について、サンプルコードを交えて解説しています。

---
## 1. 関数（function）

関数を使うと、処理をまとめて再利用できます。

### 関数の基本

```swift
func greet(name: String) {
    print("こんにちは、\(name) さん！")
}

greet(name: "太郎") // こんにちは、太郎 さん！
```

☝️ `func` を使って関数を定義し、`name` のような引数を受け取ることができる。

### 戻り値のある関数

```swift
func add(a: Int, b: Int) -> Int {
    return a + b
}

let result = add(a: 3, b: 5)
print(result) // 8
```

☝️ `-> Int` のように書くことで、関数が値を返すことができる。

---

## 2. 条件分岐（if文, switch文）

### if文

条件に応じて処理を分岐するために `if` を使います。

```swift
let temperature = 25

if temperature >= 30 {
    print("暑いですね！")
} else if temperature >= 20 {
    print("過ごしやすい気温です。")
} else {
    print("少し寒いですね。")
}
```

☝️ `if-else` を使うと、条件に応じた処理を実装できる。

### switch文

`switch` を使うと、複数の条件をシンプルに書くことができます。

```swift
let weather = "rainy"

switch weather {
case "sunny":
    print("今日は晴れです！")
case "rainy":
    print("雨が降っています☔️")
case "cloudy":
    print("曇りですね。")
default:
    print("天気がわかりません。")
}
```

☝️ `switch` は `default` を使って、どの条件にも当てはまらない場合の処理を追加できる。

---

## 3. ループ（for文, while文）

### for文

`for` ループを使うと、指定した範囲の処理を繰り返せます。

```swift
for i in 1...3 {
    print("ループ \(i) 回目")
}
```

☝️ `1...3` は **1から3まで** の範囲を表す。

配列の要素を順番に処理することもできます。

```swift
let fruits = ["🍎", "🍌", "🍊"]

for fruit in fruits {
    print(fruit)
}
```

### while文

`while`文は、条件を満たしている間処理を繰り返します。

```swift
var count = 3

while count > 0 {
    print("カウントダウン: \(count)")
    count -= 1
}
```

☝️ `while` は条件を満たさなくなるまで繰り返すので、無限ループにならないように注意！

---



## 4. オプショナル（Optional）

Swiftでは、値が **あるかもしれないし、ないかもしれない** 状態を表すために **オプショナル型** を使います。

### オプショナルの基本

```swift
var name: String? = "Swift"
print(name) // Optional("Swift")

name = nil // nil（値なし）を代入できる
```

☝️ `?` をつけると、その変数は **値が入ることもあれば、nil になることもある** という意味になる。

### オプショナルのアンラップ（値を取り出す方法）

オプショナル型から値を取り出すには、`if let` や `guard let` を使います。

```swift
var number: Int? = 10

if let unwrappedNumber = number {
    print("値は \(unwrappedNumber) です。")
} else {
    print("値がありません。")
}
```

☝️ `if let` を使うと、安全にオプショナルの値を取り出せる。

---

## まとめ

- **関数** → `func` を使ってコードを整理
- **条件分岐** → `if-else` や `switch` で分岐処理を実装
- **ループ処理** → `for` や `while` で繰り返し処理を実装
- **オプショナル** → `?` を使って **値がある/ない** 状態を表現
待ち行列のChannel<T>クラス

## 参考
この記事は、以下の動画を参考にしています。
詳しくは、動画をご覧ください。

<iframe width="560" height="315" src="https://www.youtube.com/embed/lHC38t1w9Nc?si=dHMmXNQU-60nmotm" 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>

リファレンス

https://learn.microsoft.com/ja-jp/dotnet/api/system.threading.channels.channel-1

## 概要
`System.Threading.Channels.Channel<T>`クラスは、待ち行列である。

`Channel<T>`クラスは、書き込みと読み出しを非同期に実行する。

`Channel<T>`クラスは、コレクション（`System.Collections.Generic.IEnumerable<T>`を実装したクラス）ではない。

### 容量の指定
- 無制限
```cs
var channel = Channel.CreateUnbounded<SomeData>();
```
- 制限付き
```cs
var options = new BoundedChannelOptions(capacity: 10) // 容量
{
     FullMode = BoundedChannelFullMode.Wait, // 容量一杯の場合の動作
    // BoundedChannelFullModeには他に、DropNewest, DropOldest, DropWriteがある
};
var channel = Channel.CreateBounded<SomeData>(options: options);
```

### 書き込み
```cs
await channel.Writer.WriteAsync(item: data, cancellationToken: ct);
```

### 読み出し
```cs
SomeData data = await channel.Reader.ReadAsync(cancellationToken: ct);
```
WindowsとUbuntuのデュアルブートに設定したPCの起動時にGNU GRUBのシェルが出てくるときの対処法

## はじめに

WindowsとUbuntuのデュアルブート化したPCを起動時に以下の画像のようにGNU GRUBのシェルが起動し、OSのブートに進めなくなった場合の対処法です．
現状，ここで紹介する手順により，インストールメディア等を使わず3回は復帰させることができています．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794319/e78ff5ab-16ce-4a58-8c5f-a22afc59845d.png)
画像出典: https://docs.oracle.com/cd/E56342_01/html/E53741/gkvii.html

## 前提

grub他，詳しい知識はなく，自分がうまくいった対処法を共有しているのみとなります．
用語等間違っている可能性が高いです．

### 発生状況等

PC: Dell XPS13 2-in-1 9310
WindowsとUbuntuのデュアルブート化済み
普段はWindows Boot Managerを最優先にして使用

PCのバッテリ切れによりPCが強制シャットダウンした後に再度PCを起動すると，上記画像のような画面となる．
この状態でexitすると再度起動し，同じ画面が現れる．
また，(おそらく)UEFIを開いてbootの優先度を変更する等もできない．

## 復旧手順

### 1. WindowsのEFIファイルを探す

GNU GRUBのシェル(以下，シェル)でも`ls`のようなコマンドが使えます．
そこでまず，`ls`して表示される`(hd0,gpt1)`等の中から，`/EFI/Microsoft/Boot/bootmgfw.efi`を探します．

具体的な手順は以下のとおりです．
コマンド実行時，タブ補完も効きます．

1. `ls`コマンドを実行し`(hd0) (hd0,gpt1) (hd0,gpt2) ...`等の出力を確認する
1. `ls (hd0,gpt1)`等とし，EFIディレクトリがあるか確認する
    1. EFIが見つかれば，`ls (hd0,gpt1)/EFI/Microsoft/Boot/`等と打って，bootmgfw.efiを見つける
    1. ここで(hd0,gpt1)は順次切り替えて探索する

### 2. chainloaderにbootmgfw.efiを設定し，再起動する

手順1-2で見つけたefiファイルのパスを覚えて，以下の通り順に実行します．

1. `set root=(hd0,gpt1)` ※ここで(hd0,gpt1)には各自の環境においてefiファイルが存在するパーティションを指定
1. `chainloader /EFI/Microsoft/Boot/bootmgfw.efi`
1. `boot`

bootを実行した時点でシェルが終了し，別の画面に移行すると思います．

### 3. その他

この手順で修復後，Bitlockerの回復キーを求められることがあります．
その場合，別の端末等でMicrosoftアカウントにログインし，回復キーを取得して入力する必要があります．
詳しい内容は下記リンクを確認してください．

https://support.microsoft.com/ja-jp/windows/bitlocker-%E5%9B%9E%E5%BE%A9%E3%82%AD%E3%83%BC%E3%82%92%E8%A6%8B%E3%81%A4%E3%81%91%E3%82%8B-6b71ad27-0b89-ea08-f143-056f5ab347d6

## おわりに

今回の手順は対症療法です．本質的な解決にはなっていない可能性があります．
実際，PCがバッテリ切れで強制終了した際に繰り返しこの症状が発生しています．

## 参考元

https://askubuntu.com/questions/833006/how-can-i-manually-boot-windows-from-the-grub2-terminal
ゴスパー曲線(Gosper curve)

# はじめに
フラクタル曲線の定番といえばコッホ曲線、ドラゴン曲線、ヒルベルト曲線などですが、
ここでは、ゴスパー曲線のプログラムを残しておきたいと思います。

# ゴスパー曲線
https://en.wikipedia.org/wiki/Gosper_curve

wikiに習って、Lシステムで描画します。

# 環境
Processing 4

# プログラム
ChatGPTが、簡潔に書いてくれたのを、少し修正しました。
HashMap(連想配列)を始めて見ました。便利ですね。
PDFで書き出せば、イラレなどに持っていけます。

```java:Processing
int order = 3;  // フラクタルの階層（大きくするほど細かくなる）
float length = 10 * pow(0.4, order-4);  // 初期の線の長さ(1,150)(2,60)(3,25)(4,10)(5,4)(6,1.5)
String axiom = "A";  // 初期のルール
String sentence = axiom;
HashMap<Character, String> rules = new HashMap<Character, String>();

void setup() {
  size(1000, 800);
  background(255);
  rules.put('A', "A-B--B+A++AA+B-");
  rules.put('B', "+A-BB--B-A++A+B");

  for (int i = 0; i < order; i++) {
    sentence = generate(sentence);
  }

  translate(width *0.6, height *0.8);
  drawLSystem(sentence, length);
}

String generate(String input) {
  StringBuilder next = new StringBuilder();
  for (char c : input.toCharArray()) {
    if (rules.containsKey(c)) {
      next.append(rules.get(c));
    } else {
      next.append(c);
    }
  }
  return next.toString();
}

void drawLSystem(String instructions, float len) {
  float angle = radians(60);
  for (char c : instructions.toCharArray()) {
    switch (c) {
      case 'A': case 'B':
        stroke(0);
        line(0, 0, len, 0);
        translate(len, 0);
        break;
      case '+':
        rotate(angle);
        break;
      case '-':
        rotate(-angle);
        break;
    }
  }
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/945525f5-007d-4fb5-8a9e-a69be9b41a28.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/e0d5474e-079f-4849-a417-dfc08bd07045.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/144e2ef4-2a13-4533-8a5f-5fd0d45510a9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/4fb1f5ff-34a5-4d6e-b1ad-28390c57b141.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/a0e5a032-8dd7-4540-9451-1ebb308b56d9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/b4c19715-cf58-46c2-acd9-be534d8fcd66.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/0db9b024-3e50-4a57-9549-97995841d41f.png)
Macのターミナルを使って、サブフォルダ内を含むファイル名を一括リネームする方法

クラウドストレージやバージョン管理システムを使用していると、ファイル名に自動的に追加される文字列（例：`[conflicted]`、`copy`、`(1)`など）に悩まされることがあります。特に多数のファイルが複数のサブフォルダに散らばっている場合、手動でのリネームは非常に手間がかかります。

この記事では、Macのターミナルを使って、サブフォルダを含む複数のファイル名を一括でリネームする方法を紹介します。

## 解決方法：シェルスクリプトを使用

以下のシェルスクリプトを使用することで、指定したディレクトリ内のすべてのサブフォルダを含めて、特定のパターンを含むファイル名を一括で変更することができます。

```bash
#!/bin/bash

if [ -z "$1" ]; then
    echo "使用方法: $0 /path/to/directory"
    exit 1
fi

# 指定されたディレクトリが存在するか確認
if [ ! -d "$1" ]; then
    echo "エラー: 指定されたディレクトリが存在しません: $1"
    exit 1
fi

# 変更対象のファイルを表示
echo "以下のファイルが変更対象です:"
find "$1" -type f -name '*[conflicted]*' | while IFS= read -r file; do
    echo "$file"
done

# 確認を求める
read -p "これらのファイル名から '[conflicted]' を削除しますか？ (y/n): " confirm
if [ "$confirm" != "y" ]; then
    echo "処理を中止しました"
    exit 0
fi

# ファイル名の変更を実行
find "$1" -type f -name '*[conflicted]*' | while IFS= read -r file; do
    newname="${file//" [conflicted]"}"
    if [ "$file" != "$newname" ]; then
        mv "$file" "$newname"
        echo "リネーム: $file -> $newname"
    fi
done

echo "処理が完了しました"
```

## 使用方法

1. スクリプトの保存
   - 上記のスクリプトを任意の場所（例：`rename_script.sh`）に保存します。
   - ファイル名に日本語やスペースが含まれていない方が安全です。

2. 実行権限の付与
   ```bash
   chmod +x "/path/to/rename_script.sh"
   ```
   - パスに角括弧（`[]`）やスペースが含まれる場合は、必ずダブルクォート（`"`）で囲みます。

3. スクリプトの実行
   ```bash
   "/path/to/rename_script.sh" "/path/to/target/directory"
   ```
   - 対象とするディレクトリのパスを指定して実行します。
   - スクリプトは実行前に変更対象のファイル一覧を表示し、確認を求めます。

## スクリプトの動作説明

1. 引数チェック
   - ディレクトリパスが指定されているか確認
   - 指定されたディレクトリが存在するか確認

2. 対象ファイルの検索
   - `find`コマンドで指定パターンに一致するファイルを検索
   - サブフォルダも含めて再帰的に検索

3. 確認プロンプト
   - 変更対象のファイル一覧を表示
   - ユーザーに確認を求める（y/nで回答）

4. リネーム処理
   - `sed`コマンドでファイル名から指定パターンを削除
   - `mv`コマンドで実際のリネームを実行
   - 各ファイルの処理結果を表示

## カスタマイズ方法

異なるパターンのファイル名を変更したい場合は、以下の2箇所を編集します：

1. findコマンドの検索パターン
   ```bash
   find "$1" -type f -name '*[conflicted]*'
   ```
   - `*[conflicted]*`の部分を目的のパターンに変更

2. パラメータ展開の置換パターン
   ```bash
   newname="${file//" [conflicted]"}"
   ```
   - `[conflicted]`の部分を削除したい文字列に変更
   - スペースも含めて削除する場合は、スペースもパターンに含める

## 注意点

- 実行前に必ずバックアップを取ることをお勧めします
- パスに特殊文字（スペース、角括弧など）が含まれる場合は、必ずダブルクォートで囲む
- テスト用の小さなディレクトリで動作確認してから本番環境で使用する
- ファイルシステムの権限設定により、一部のファイルがリネームできない場合があります

## まとめ

このシェルスクリプトを使用することで、多数のファイルの名前を安全かつ効率的に一括変更することができます。特に、クラウドストレージやバージョン管理システムを使用している場合に発生する、不要な文字列の削除に役立ちます。

スクリプトは実行前に変更対象を表示し、確認を求めるため、安全に使用することができます。また、必要に応じてパターンを変更することで、様々なケースに対応できます。
個人的備忘録：Golang の Dockerfile をテスト用と本番用で比較し、構成の違いを紐解いてみた

## **はじめに**
Docker は開発・本番環境の構築を効率化するために広く使われていますが、テスト環境と本番環境で適切な構成を選ぶことが重要です。

本記事では、Golang を使ったテスト用・本番用の Dockerfile の違いを解説し、それぞれの用途や最適な活用方法について紹介します。

## **書こうと思ったきっかけ**
Golang で開発を進める中で、テスト環境ではコード変更を即時反映できるホットリロードが便利ですが、本番環境では軽量でセキュアなコンテナが求められます。

:::note warn
**そのため、異なる Dockerfile を用意することが一般的です。**
:::

しかし、初心者にとっては「**どのような構成が適切なのか**」「*なぜ分けるのか**」がわかりにくいことがあります。

そこで、テスト用と本番用の Dockerfile を比較し、それぞれの役割を明確にする記事を書こうと思いました。

## **テスト用と本番用の Dockerfile の違い**

### **テスト用 Dockerfile**
```dockerfile
FROM golang:1.23.5-alpine3.21  # Golang 1.23.5 + Alpine Linux 3.21の軽量なイメージをベースにする
WORKDIR /usr/src/app            # コンテナ内の作業ディレクトリを設定

COPY go.mod go.sum ./           # 依存関係の管理ファイル (go.mod, go.sum) をコンテナにコピー
RUN go mod download             # 依存関係をダウンロード

COPY . .                        # アプリケーションのソースコードをすべてコンテナにコピー

RUN go install github.com/air-verse/air@latest  # Air（ホットリロードツール）をインストール
```

#### **特徴・ポイント:**
- **開発・テスト向けの構成**  
  - Goの公式イメージを利用し、ソースコードをそのままコンテナに取り込む  
  - `go mod download` で依存関係を解決  
  - `air` をインストールすることで、コード変更時に自動リロードできるようにしている  

#### **用途:**
- ローカル開発環境やテスト実行用（`air` を使ってコード変更のたびに即時反映可能）

### **本番用 Dockerfile**
```dockerfile
# === ビルド用ステージ ===
FROM golang:1.23.5-alpine3.21 AS builder  # ビルド専用のステージ
WORKDIR /usr/src/app

COPY go.mod go.sum ./  # 依存関係の管理ファイルをコピー
RUN go mod download    # 依存関係をダウンロード

COPY . .               # アプリケーションのソースコードをコピー

RUN CGO_ENABLED=0 GOOS=linux go build -o server .  # 静的バイナリを作成（軽量化）

# === 実行用ステージ ===
FROM alpine:3.21  # 実行時の軽量な Alpine Linux イメージ
COPY --from=builder /usr/src/app/server .  # ビルド済みバイナリのみをコピー
CMD ["./server"]  # アプリケーションを起動
```

#### **特徴・ポイント:**
- **マルチステージビルドを使用**  
  - `golang:1.23.5-alpine3.21` を使ってアプリケーションをビルド（`builder` ステージ）  
  - 実行時は `alpine:3.21` のみを使用し、最小限のサイズに抑える  

- **静的リンクバイナリを作成**  
  - `CGO_ENABLED=0 GOOS=linux go build -o server .` により、Cライブラリ依存をなくし、どこでも動く軽量なバイナリを生成  
  - ビルド後は `server` バイナリのみをコピーし、余計なツールやライブラリを排除（セキュリティ向上＆コンテナサイズ削減）  

- **実行環境の最適化**  
  - `Alpine Linux` は軽量でセキュリティが高いため、本番運用に適している  
  - `CMD ["./server"]` でシンプルにアプリを起動  

#### **用途:**
- **本番環境向けの最適化されたコンテナ**  
  - 不要な開発ツールを含めず、軽量なバイナリを実行するだけの構成  

## **まとめ**

| **項目** | **テスト用** | **本番用** |
|----------|-------------|-------------|
| **目的** | 開発・テスト用 (ホットリロード) | 本番運用用（軽量＆最適化） |
| **ベースイメージ** | `golang:1.23.5-alpine3.21` | `golang:1.23.5-alpine3.21` → `alpine:3.21` |
| **コード変更の反映** | `air` によりリアルタイムで反映 | 一度ビルドしたバイナリのみ使用 |
| **サイズ** | Goツール類を含むため重い | マルチステージビルドで最小限に |
| **セキュリティ** | 開発ツールを含むためややリスクあり | 実行に不要なツールを排除し安全 |

開発環境ではテスト用の Dockerfile を使い、動作確認が取れたら本番用の Dockerfile で最適化されたコンテナをデプロイする流れとなります。

***改めて記事として体系的にまとめたことで、自分自身の理解も深まりました！***
PHPで「数値リテラルを作成する」の動作を確認してみた。

# 概要

PHPで「数値リテラルを作成する」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/php/num/index1.html

# 実装

以下のファイルを作成しました。

```sample.php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>PHPテスト</title>
</head>
<body>

<p>PHPのテストです。</p>

<p>
<?php
print 18;
print '<br />';
echo -3.14E-2;
?>
</p>

</body>
</html>
```

以下のコマンドを実行しました。

```
$ php sample.php 
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>PHPテスト</title>
</head>
<body>

<p>PHPのテストです。</p>

<p>
18<br />-0.0314</p>

</body>
</html>
```

# まとめ

何かの役に立てばと。
【windows】 windows11 ActiveDirectory 表示手順

### やりたいこと
　　PCをwindows11にしたところ、ActiveDirectoryの表示の仕方が分からず調べた備忘録

--------------------------------------------------------
### 環境
　　windows11
  
--------------------------------------------------------
### ActiveDirectory 表示手順
　　Ⅰ．タスクバーの「windowsマーク」を選択

　　Ⅱ．右上に表示されている「すべてのアプリ」を選択

　　Ⅲ．「windowsツール」を選択

　　Ⅳ．左の一覧から「ネットワーク」を選択

　　Ⅴ．「ネットワーク」リボン上にある「ActiveDirectoryの検索」を選択
  
 --------------------------------------------------------
【初心者向け】PowerApps から Azure Blob Storage へ画像を追加する方法

# はじめに
Azure Blob StorageへPower Appsを使用した画像の追加方法について解説します。

:::note warn
Azure Blob Storageのコネクタを利用するにはプレミアムライセンスが必要です。
標準のライセンスでは利用できないため、必ず先にライセンスを確認しておいてください。
:::

## Azure Blob Storage とは？
Microsoft社が提供するクラウド用オブジェクトストレージソリューションです。
> テキストデータやバイナリデータなどの大量の非構造化データを格納するために最適化されています。

https://learn.microsoft.com/ja-jp/azure/storage/blobs/storage-blobs-introduction

## 方法
**1\.準備**
+ Microsoft Azureに画像を格納するためのストレージアカウントとコンテナーを用意します。
+ 作成したコンテナーとPower Appsを接続させてください。

こちらの準備方法については以下の記事で解説を行っていますので、ぜひご参考にしてみてください。

https://qiita.com/Sanwa_Paint/items/ee3fc7072b206ad795f4


**2\.Power Apps側で画像を追加するボタンを作成**
+ Power Appsを起動し、`画像の追加`プロパティと`ボタン`を追加。
+ `OnSelect` に以下を記入。

```ruby:書き方
AzureBlobStorage.CreateFile('フォルダーパス','ファイル名','ファイル')
```

+ `フォルダーパス` ... コンテナ名から書き出してください。`/`毎にフォルダーが作成されます。
+ `ファイル名` ... 保存時のファイル名です。拡張子つきで記載してください。(○○.jpgなど)
+ `ファイル` ... 追加するファイルを選択してください。
実際の書き方は以下の通りになります。
グレーで隠している部分がコンテナー名になります。


**`画像の追加`に設定された画像を`jpg形式`で `00TEST20250218`のフォルダに格納します。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/b188cf59-5fb7-4b3f-9930-fd4ecebd5716.png)

## 実行してみる
それでは実際に`保存`ボタンを押してみましょう。
ボタンを押したあとにAzure Blob Storageを確認しに行きます。
コンテナー内に `00TEST20250218` というフォルダが作成されその中に `スマホ.jpg` というファイル名で画像が保存されていることを確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/05d08acc-af9e-4348-a50c-081535873f76.png)

では中身は問題なく保存できているでしょうか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/9b1fb552-46f9-4496-8e01-5dc89f3b0500.png)

問題なく保存できていることが確認できました。

## まとめ
今回ははじめての方でも分かりやすいPower AppsからAzure Blob Storageへの画像の保存方法について解説させていただきました。
他にも方法はありますが、こちらが比較的簡単かなと思います。

また、こちらの記事ではPower Automateと組み合わせた画像の削除方法についても記事を作成しておりますので、よければあわせてお読みください！！！

https://qiita.com/Sanwa_Paint/items/c4cd31e01418adf8c4ff
Goのdefer（遅延実行）入門：解説と活用方法

## はじめに

Go（Golang）には便利な機能としてdefer（遅延実行）があります。
deferを使うことで、関数の終了時に特定の処理を実行することができ、コードの可読性やメンテナンス性を向上させることができます。

---

## deferとは？

deferは、関数の実行が終了する直前に、指定した処理を遅延実行するためのキーワードです。


**deferの基本構文**
```go
func main() {
    defer fmt.Println("This will be printed last")
    fmt.Println("This will be printed first")
}
```

**実行結果**
```
This will be printed first
This will be printed last
```

- defer fmt.Println("This will be printed last") は main() 関数の終了直前に実行される。
- deferを使うと、関数の終了時に確実に実行したい処理を記述できる。

---

## deferの主な活用方法

**1. ファイルのクローズ処理**

ファイルを開いた後、クローズ処理を忘れるとリソースリークにつながる可能性があります。
deferを使うことで、関数の終了時に確実にCloseを呼び出すことができます。

```go
package main

import (
    "fmt"
    "os"
)

func main() {
    file, err := os.Open("example.txt")
    if err != nil {
        fmt.Println("Error opening file:", err)
        return
    }
    defer file.Close() // 関数終了時にファイルを閉じる
    
    fmt.Println("File opened successfully")
}
```

- defer file.Closeにより、関数の終了時にファイルを確実に閉じる。
- deferを使わない場合、エラーハンドリングによってCloseを呼び忘れるリスクがある。

---

### **2. データベース接続の管理**

データベース接続も適切にCloseする必要があります。

```go
package main

import (
    "database/sql"
    "fmt"
    _ "github.com/lib/pq" // PostgreSQLのドライバ
)

func main() {
    db, err := sql.Open("postgres", "user=username dbname=mydb sslmode=disable")
    if err != nil {
        fmt.Println("Error connecting to database:", err)
        return
    }
    defer db.Close() // 関数終了時に接続を閉じる
    
    fmt.Println("Connected to database")
}
```

- defer db.Closeにより、関数終了時に確実にデータベース接続を閉じる。
- クリーンアップ処理を一箇所にまとめられるため、コードが簡潔になる。

---

### **3. Mutexのロック解除**

Goのsync.Mutexを使用する場合、ロックを解除し忘れるとデッドロックが発生する可能性があります。
deferを使えば、確実にロックを解除できます。

```go
package main

import (
    "fmt"
    "sync"
)

var mu sync.Mutex

func criticalSection() {
    mu.Lock()
    defer mu.Unlock() // 関数終了時にロックを解除
    fmt.Println("Critical section")
}

func main() {
    criticalSection()
}
```

- defer mu.Unlock を使うことで、関数終了時にロックが解除されるため、デッドロックを防げる。
- deferを使わない場合、関数内の条件分岐などによって Unlock()の呼び忘れが発生する可能性がある。

---

### **4. 複数のdeferを使う場合（LIFO順）**

Goのdeferは **LIFO（Last In, First Out）** の順序で実行されます。

```go
package main

import "fmt"

func main() {
    defer fmt.Println("Third")
    defer fmt.Println("Second")
    defer fmt.Println("First")
}
```

### **実行結果**
```
First
Second
Third
```

- deferはスタックのように積み重なり、最後に追加されたものから実行される。
- クリーンアップ処理を順番に実行する場合に役立つ。

---

## まとめ

| 概念 | 説明 |
|------|------|
| **deferとは？** | 関数の終了直前に実行される処理を登録するキーワード |
| **活用例** | ファイルクローズ、データベース接続管理、Mutexロック解除など |
| **複数のdefer** | LIFO（Last In, First Out）の順序で実行される |
IC555による電子ピアノ作成

先日、8Ωのスピーカーを発掘しまして、何かできないかと模索していたところ、秋月で50個入り300円で売っていたIC555を思い出したので、ピアノを作ります。

### 原理
555の発信回路で音階を作り、オペアンプで信号を合成し、スピーカーで出力します。
そのためには555の発信回路を複数個作らなくてはいけないので、回路の設計が重要になります。
できるだけコンパクトに、できるだけ安く作りたいですね。

### 設計
ひとまずブレッドボード上で設計します。
↓このサイトには回路図と、抵抗、コンデンサ、周期の一覧表が載っていたので、こちらを参考にします。

https://kimudiary.com/craft/%E3%82%BF%E3%82%A4%E3%83%9E%E3%83%BCic555%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F/

大体0.1uFでRa=1kΩ、Rb=1~100kΩあたりを使えば、目的の周波数帯が得られます。

↓試作1号機です。
![PXL_20250123_011931198.RAW-01.COVER.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3922522/80285b3a-70f9-4381-bf00-e570c20da23f.jpeg)![スクリーンショット 2025-02-16 092935.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3922522/3c914ce9-26e3-46e9-8b8c-5575a65847cd.png)

555で発信し、C4,R11,C5,R9で直流成分をカットし、OPampの加算回路に印加しています。
ちゃんと動作したのでユニバーサル基板に実装していきます。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3922522/0b8fcfc6-4cec-44c4-8509-c5db20535f31.jpeg" width="300">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3922522/e8abd601-069a-468d-99e9-7bef9fdcaf1d.jpeg" width="300">

25x15穴のユニバーサル基板に555発信回路を6個詰め込むことができました。
ピアノを作るうえでこのようなものを量産する形になると思うので、いったん価格を計算します。

<details><summary>部品表</summary>

JRC555D *6
6円/1個
[1.5uF *12](https://akizukidenshi.com/catalog/g/g102803/)
10円/1個
[0.1uF *6](https://akizukidenshi.com/catalog/g/g100090/)
10円/1個
[1kΩ *12](https://akizukidenshi.com/catalog/g/g116102/)
1.2円/1個
[100kΩ *6](https://akizukidenshi.com/catalog/g/g116104/)
1円/1個
[半固定抵抗100kΩ *6](https://akizukidenshi.com/catalog/g/g100117/)
50円/1個
[タクトスイッチ *6](https://akizukidenshi.com/catalog/g/g103649/)
10円/1個
[ソケット *12](https://akizukidenshi.com/catalog/g/g100241/)
4円/1個
[ユニバーサル基板](https://akizukidenshi.com/catalog/g/g103229/)
60円/1個
配線材

</details>

合計で720.4円でした。
1オクターブ作るのに1440円と考えるとだいぶ厳しいですね。
まず、半固定抵抗が合計300円と半分程度を占めているので何とかしましょう。
安い半固定抵抗では多回転でなくなるので、微調整が聞かなくなるので困ります。そこで、15kΩの半固定抵抗と炭素被膜抵抗を組み合わせることによって、抵抗値を変化させます。

価格は上昇するのですが組み立て簡略化と技術力向上のために、切削基板を使用したいと思います。
設計したものが下です
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3922522/5fe391b5-4850-4921-82c2-47630cb9f660.png" width="200">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3922522/b4c2d7a8-ac40-4486-9062-f2da889bfb77.png" width="300"> 

切削機の都合で実際に作るのは1月以上先なので、その間に改善案を練りたいと思います。

今週はここまでです
PostgreSQLにおける認証方式の比較



PostgreSQLでは、データベースへのアクセスを制御するためにさまざまな認証方式が提供されています。本記事では、代表的な3つの認証方式「Peer認証」「MD5認証」「SCRAM-SHA-256認証」について、それぞれの特徴やセキュリティ面の考慮点を詳しく解説します。

## 1. Peer認証
### 概要
Peer認証は、PostgreSQLがローカル接続を処理する際に使用できる認証方式の一つです。これは、カーネルを通じてOSのユーザー名を取得し、それをデータベースのユーザー名として使用する仕組みになっています。

### 特徴
- **動作原理**: OSのユーザー名をそのままデータベースのユーザー名として利用。
- **適用範囲**: Unixドメインソケット経由のローカル接続のみ。
- **認証プロセス**: PostgreSQLのユーザー名とOSのユーザー名が一致する場合にのみ接続を許可。
- **設定方法**: `pg_hba.conf` の `METHOD` を `peer` に設定。

### セキュリティ面
- **メリット**: シンプルでパスワード不要のため、ローカルの開発環境などで便利。
- **デメリット**: OSのユーザー名管理が必要であり、不適切な管理が行われると不正アクセスのリスクがある。
- **制限**: PostgreSQLのロールに対応するOSユーザーを作成する必要がある。

## 2. MD5認証
### 概要
MD5認証は、従来のPostgreSQLで広く使用されていたパスワードベースの認証方式です。クライアント側でMD5ハッシュ化されたパスワードを送信し、サーバー側で照合を行います。

### 特徴
- **暗号アルゴリズム**: MD5ハッシュ関数を使用（128ビットのハッシュ値を生成）。
- **認証プロセス**: クライアントがMD5ハッシュ化したパスワードを送信し、サーバー側で検証。
- **設定方法**: `pg_hba.conf` の `METHOD` を `md5` に設定。
- **メリット**: 平文のパスワードを送信しないため、より安全な認証が可能。

### セキュリティ面
- **メリット**: パスワードを直接送信しないため、盗聴のリスクを軽減。
- **デメリット**: MD5の暗号強度は現在では脆弱とされており、レインボーテーブル攻撃の対象になりやすい。
- **推奨される代替手段**: 最新のPostgreSQLでは `SCRAM-SHA-256` の使用が推奨されている。

## 3. SCRAM-SHA-256認証
### 概要
SCRAM-SHA-256（Salted Challenge Response Authentication Mechanism）は、最新のPostgreSQLで推奨されている強力な認証方式であり、MD5認証の代替として使用されます。

### 特徴
- **暗号アルゴリズム**: SHA-256を使用。
- **認証プロセス**: クライアントとサーバー間でチャレンジ・レスポンスを行い、パスワードを直接送信しない。
- **設定方法**: `password_encryption` を `scram-sha-256` に設定し、`pg_hba.conf` の `METHOD` を `scram-sha-256` に変更。
- **メリット**: レインボーテーブル攻撃や中間者攻撃への耐性が向上。

### セキュリティ面
- **メリット**: 強力な暗号化方式により、パスワード漏洩リスクを低減。
- **DDoS攻撃対策**: 認証負荷の一部をクライアント側に分散することで、サーバーの負荷軽減。
- **推奨設定**: 最新のPostgreSQLバージョンでは、デフォルトで `SCRAM-SHA-256` が採用される傾向にある。

## 4. 認証方式の比較表

| 認証方式        | 方式                        | セキュリティレベル | 使用環境         | 設定ファイル |
|-----------------|----------------------------|-----------------|----------------|------------|
| Peer           | OSのユーザー名を使用         | 低               | ローカル開発環境 | `pg_hba.conf` |
| MD5            | MD5ハッシュ化パスワード      | 中               | レガシー環境     | `pg_hba.conf` |
| SCRAM-SHA-256  | SHA-256ハッシュ化パスワード  | 高               | 本番環境         | `pg_hba.conf` |

## 5. まとめ　

PostgreSQL の認証方式にはそれぞれの利点と適用シナリオがあります。

- **開発環境で簡単に使うなら** → Peer認証
- **従来の方式を使いたい場合** → MD5認証（ただし非推奨）
- **本番環境やセキュリティを強化したいなら** → SCRAM-SHA-256認証

最新の PostgreSQL では **SCRAM-SHA-256** が推奨されているため、可能であればこの方式に移行するのが望ましいです。特にセキュリティ要件が厳しい場合は、適切な認証方式を選択することが重要です。

本記事が PostgreSQL の認証設定を見直す際の参考になれば幸いです。
elm327の研究 その12

# 概要
elm327の研究やってみた。
練習問題やってみた。

# 練習問題
説明文からDTCコードを選択表示せよ。

# 成果物

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

以上。
個人的によく使うけど毎回調べがちなGitコマンド忘備録

# この記事を書いた理由
add, commit, push, rebase, pull, merge, checkout 等、業務内でGit操作に関することでは割と不安が無くなってきて、ブランチ運用の話などを割とできるようになったかなぁと思うのですが、ちょくちょく使うコマンドを毎回覚えきれずに簡単に調べてみるのが面倒になってきたので、忘備録としてまとめてみたいと思います。
アウトプットが記憶の定着への近道！！

# コマンド

## カレントコミットを解除してステージング状態に戻す
```
git reset --soft HEAD~
```

## カレントコミットのメッセージを変更する
```
git commit --amend -m "変更したいメッセージ"
```

## カレントブランチの名称を変更する
```
git branch -m "新しいブランチ名"
```

## 強制push(リベース実施後など)
```
git push -f
```

# 最後に
他にも何かあった気がするのですが、いざこうやって記事を書いてみると思い出せないもので....
業務中にでも思い出したら書いてみます。
ありがとうございました。
Cloud Pub/Sub→Splunkの連携をpull型で行う時に、特定のSubscriptionだけを読み取る権限を与える方法

Cloud Pub/SubからSplunkにデータを連携するとき、基本的にはDataflowを使ったpush型の連携方法が推奨されていますが、データ量が少ない場合などはpull型のほうが簡単に構築できます。

具体的な手順は以下に書かれていますが、この方法ですとSplunkが全てのPub/Sub Subscriptionからデータを読み出すことができてしまいます。
それは権限が過剰で特定のSubscriptionだけにしたい場合の権限設定方法を紹介します。

https://cloud.google.com/architecture/stream-logs-from-google-cloud-to-splunk?hl=en#design-alternatives

以下のterraformのような設定をすると、特定のSubscriptionだけの読み出し権限を付与できます。


```terraform
# Splunkに登録するService Account
resource "google_service_account" "splunk-integration" {
  account_id   = "splunk-integration"
  display_name = "Service Account for Splunk Integration"
}

# Splunkに連携したいSubscription
resource "google_pubsub_subscription" "splunk-integration" {
  name  = "splunk-integration-subscription"
  topic = <topic ID>
}

resource "google_pubsub_subscription_iam_member" "splunk-integration" {
  subscription = google_pubsub_subscription.splunk-integration.name
  role         = "roles/pubsub.subscriber"
  member       = google_service_account.splunk-integration.member
}

resource "google_project_iam_member" "splunk-integration" {
  project = <Project ID>
  role    = "roles/pubsub.viewer"
  member  = google_service_account.splunk-integration.member
}
```

`pubsub/subscriber` ロールはSubscriptionレベルで付与している一方で、 `pubsub/viewer` ロールはプロジェクトレベルで付与していることに注意が必要です。
一見すると後者もSubscriptionレベルで十分な気もしますが、そうしてしまうと `projects.get` パーミッションが付与されないため、Splunkがエラーを出してしまいます。
ChatGPTにログインできない！

事象：ChatGPTにメールアドレスでログインするため、gmailアドレスを使ってアカウントを作ったが、翌日以降にgmailアドレスとパスワードを入力してもエラーが発生しログインができない。
対処：gmailアドレスが問題の模様。ChatGPTに聞いても埒が開かないので、別のメールアドレスを使ってアカウントを新規作成することで解決した。
【検証】スタバの会員専用Wi-Fi「espresso_STARBUCKS」をPCで使う方法

# スタバの会員専用Wi-Fi「espresso_STARBUCKS」をPCで使う方法

## はじめに

こんにちは、しゅんです。今回はスターバックスの会員専用Wi-Fi「espresso_STARBUCKS」をPCで利用できるのかを検証しました。

スターバックスでは無料Wi-Fiとして「at_STARBUCKS_Wi2」と「espresso_STARBUCKS」が利用できます。「at_STARBUCKS_Wi2」はオープンなフリーWi-Fiですが、「espresso_STARBUCKS」は**WPA2-EAP対応のセキュアなWi-Fi** であり、公式には**スマホ専用でPCでは利用できない**とされています。

しかし、**スマホで設定すればPCでも使えるのでは？** という疑問を持ち、実際に検証してみました。

公式Q&Aはこちら：[スターバックス公式Wi-Fi Q&A](https://starbucks.wi2.co.jp/secure-wireless/faq/)

---

## 1. 公式情報ではPC非対応

スターバックス ジャパンの公式Q&Aでは、以下のように「PCでは利用できない」と記載されています。

> **PCやタブレット端末でも利用できますか**  
> → 申し訳ございません、PCではご利用いただけません。

「espresso_STARBUCKS」を利用するには、**スターバックス公式アプリ** から「会員専用Wi-Fi設定」を行う必要があり、PCからは設定できません。

---

## 2. 検証：スマホで設定し、PCで接続できるか？

「スマホで設定すればPCでも使えるのでは？」という仮説を立てて、以下の手順で検証しました。

### **手順**
1. **スマホでWi-Fi設定を行う**
   - スターバックス公式アプリから **「会員専用Wi-Fi設定」** を行い、自動でWi−Fi接続する設定を行います。
   - その後「espresso_STARBUCKS」にあるスタバに近づく度に自動接続するようになります。
   - そして、スマホでWi-Fi情報を見て、アカウントとパスワードがあります。

2. **PCでWi-Fi設定を手動で入力**
   - スマホで確認できたアカウントとパスワードをを使い、PCのWi-Fi設定に手動で入力。
   入力設定は下に書いています。

3. **PCでWi-Fiに接続**
   - 設定を保存して「espresso_STARBUCKS」に接続できるかを確認。

---

## 3. 検証結果

結論として、**PCでも「espresso_STARBUCKS」に接続できました！** 🎉

PCのWi-Fi設定では、以下のように入力しました。

- **セキュリティ方式**：WPA & WPA2 Enterprise  
- **認証方式**：トンネル化TLS  
- **CA証明書**：なし（または「CA証明書は必要ありません」にチェック）  
- **内部認証方式**：MSCHAPv2  
- **ユーザー名**：スマホで設定した「C〇〇〇@secure」形式のID  
- **パスワード**：スマホで設定したパスワード  

この設定で、**PCからも正常にWi-Fiに接続できる**ことが確認しました。

**以下証拠画像**

![Screenshot from 2025-02-18 16-20-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3506235/f6372fd0-7790-4091-8dd7-f40a558eb4bf.png)

---

## 4. 一時間経過しても切断されない！

通常、スターバックスのフリーWi-Fi **「at_STARBUCKS_Wi2」** は **1時間ごとに自動切断** されます。しかし、今回の検証では、**「espresso_STARBUCKS」では1時間経過しても切断されない** ことが確認できました。

実際にPCで接続したまま作業を続けてみたところ、**1時間を超えても接続は維持されたまま** でした。これは、公式アプリで事前に認証を済ませているため、Wi-Fiがスマホと同じように **「会員専用Wi-Fi」** として動作しているからだと考えられます。

### **📌 ポイント**

✅ **「espresso_STARBUCKS」は1時間ごとに切断されない**  
✅ **スマホで事前に設定すれば、PCでも継続利用可能**  
✅ **オープンWi-Fiと違い、安全なWPA2-EAP認証が使える**  

スターバックスでPC作業をする際、**「espresso_STARBUCKS」なら1時間ごとにWi-Fiが切れるストレスなしで快適に使える** ので、長時間作業する人には特におすすめです！

---

## 5. まとめ

公式には **「PCでは利用できない」** となっていますが、
**実際にはスマホで設定すればPCでも使える** ことが判明しました。

### **重要ポイント**
✅ **事前にスマホで設定が必要**  
✅ **PCのWi-Fi設定を手動で入力すれば接続可能**  
✅ **セキュリティは WPA2-EAP なので、フリーWi-Fiより安全**  
✅ **1時間ごとに切断されることなく、長時間の作業が可能**  

「at_STARBUCKS_Wi2」はパスワードなしのオープンWi-Fiですが、「espresso_STARBUCKS」は **WPA2-EAP対応** でより安全です。スタバでPC作業をする人にとって、セキュリティの高いWi-Fiが使えるのは大きなメリットですね。

PCでスタバWi-Fiを快適に使いたい方は、ぜひ試してみてください！
Excel VBAで文字列の西暦から和暦に変換したい



# 1. はじめに
* Excel VBAで文字列の西暦を和暦に変換したい
* 元号が変更になっても対応できるようにしたい

# 2. 開発環境
* VBA
* Excel 2021

# 3. サンプルソース
* Formatで形式を```ggge年m月```を指定する
```vb:Module1
Public Sub EditGGGGEM()

    ' 西暦→和暦を編集
    With ThisWorkbook.Sheets("Sheet1")
        .Cells(2, 2).Value = Format(Left(.Cells(2, 1).Value, 4) & "/" & Mid(.Cells(2, 1).Value, 5), "ggge年m月")  ' 西暦→和暦
    End With

End Sub
```

# 4. 実行結果
* 令和の場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/ae23e3b0-75d8-4d78-a92f-6aac6e1b07a8.png)

* 平成の場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/faaad11a-9966-4b9b-9f9b-b131cfaf6b55.png)

* 昭和の場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/d1604cd5-ae6a-496b-aaeb-7a07ad7d2a6f.png)


# 5. 参考文献

https://www.ganasys.com/blog/programming/3184/
C#のコンソールアプリの画面を表示しないようにしたい

# 1. はじめに
* C#のコンソールアプリの画面を非表示にして起動したい

# 2. 開発環境
* C#
* .NET8
* Visual Studio 2022 (コンソールアプリ)

# 3. アプリケーションの設定
* アプリケーション > 全般 > 出力の種類を「Windowsアプリケーション」に変更する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/fb98e724-3fef-4bd0-ae1f-34f517ab520e.png)

# 4. 参考文献

https://www.ipentec.com/document/csharp/csharp-console-application-no-console-window
【資格取得】Python 3 エンジニア認定データ分析試験に合格しました！

# 【資格取得】Python 3 エンジニア認定データ分析試験に合格しました！

先日転職を機に「Python 3 エンジニア認定データ分析試験」に挑戦しまして、無事に合格しました！  
本記事では、取得の背景や学習方法、試験の感想についてまとめます。  

## 📌 資格取得の背景  
転職活動中に学んだPythonの基礎（構文／機械学習）を、何か形に残したいと考え、資格取得を目指しました。  

## 📚 学習方法  
主に以下の学習教材を活用しました。  

- **転職活動中の既存知識**（基礎の復習）  
- **Dpro EXAM**（実際の試験レベル）  
- **ExamApp**（実際の試験よりやや難しい）  
- **PRIME STUDY**（実際の試験より難しく、選択肢が5つある）  

基本的には **Dpro EXAM・ExamApp・PRIME STUDY** をメインに試験対策を行いました。  
特に **ExamApp と PRIME STUDY の内容が難しかった** ため、すべての選択肢について説明できるように対策を実施。  
時間のある時は実際にコードを書き、間違った選択肢を **「どのように修正すれば正解になるか」** を考察しました。  

### 📆 学習スケジュール  
- **試験1週間前** に **Dpro EXAM のサブスク** を開始し、無料期間内で学習を完了  
- **平日：1時間 × 3日**  
- **通勤時間（往復2時間）：2日**  
- **合計：約7時間の学習**  

## 📝 試験の感想  
Python初学者で「自信をつけたい！」という方には **とてもおすすめの試験** です。  
基礎的な構文やデータ分析の考え方をしっかり学べるので、試験対策自体がスキルアップにつながると感じました。  

…しかし、 **試験時間を間違えて受験できず、再受験になりました…！** 😇  
データ分析の資格に合格したものの、「日付データの確認ミス」はまだまだ課題ですね（笑）  

### 🔗 関連リンク  
試験の詳細については、公式サイトをご確認ください👇  
[Python 3 エンジニア認定データ分析試験](https://www.pythonic-exam.com/)
Laravel ReverbをEC2(Nginx)で使ってみた。

## 概要
Laravel Reverbを使ってAWS EC2（Ubuntu:Nginx）で立ち上げてみました。
ドメイン名が無い段階、https未対応の段階、https対応済みの段階でReverbが動作するのを確認できました。

## 前提
・Laravelバージョン：11
・AWS EC2（Ubuntu）
・Nginx

## 設定
### .env
```shell:一部の変数のみ記載
APP_URL=https://公開しているサイトのIPアドレスかドメイン名
BROADCAST_CONNECTION=reverb
QUEUE_CONNECTION=database
REVERB_APP_ID=＊＊＊＊＊
REVERB_APP_KEY=＊＊＊＊＊＊＊＊＊
REVERB_APP_SECRET=＊＊＊＊＊＊＊＊
REVERB_HOST=公開しているサイトのIPアドレスかドメイン名
REVERB_SERVER_HOST=127.0.0.1 # 設定せずにデフォルトのままでも良い。 
REVERB_SERVER_PORT=8080 # 設定せずにデフォルトのままでも良い
REVERB_PORT=443
REVERB_SCHEME=https

VITE_REVERB_APP_KEY="${REVERB_APP_KEY}"
VITE_REVERB_HOST="${REVERB_HOST}"
VITE_REVERB_PORT="${REVERB_PORT}"
VITE_REVERB_SCHEME="${REVERB_SCHEME}"
```

### Nginxのconf設定
```shell:
server {
    listen 80;
    listen [::]:80;

  　一部省略

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location /app/ {
        proxy_http_version 1.1;
        proxy_set_header Host $http_host;
        proxy_set_header Scheme $scheme;
        proxy_set_header SERVER_PORT $server_port;
        proxy_set_header REMOTE_ADDR $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";

        # どちらかを設定
        # .envのREVERB_SERVER_HOST/REVERB_SERVER_PORTを設定していない場合
        proxy_pass http://0.0.0.0:8080;
        # .envのREVERB_SERVER_HOST/REVERB_SERVER_PORTを設定した場合
        proxy_pass http://127.0.0.1:8080; # .envのREVERB_SERVER_HOST/REVERB_SERVER_PORTの値を設定

    }

    location /apps/ {
        上の/app/の設定と同じ設定
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

　　以下省略
}
```
### Reverbの起動
supervisorで実行
```shell:/etc/supervisor/conf.d/laravel-reverb.conf
[program:laravel-reverb]
process_name=%(program_name)s
command=php /home/ubuntu/***/artisan reverb:start
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
numprocs=1
minfds=10000
user=reverbを起動させるアカウント名
redirect_stderr=true
stdout_logfile=/home/ubuntu/***/storage/logs/reverb.log
stopwaitsecs=3600
stdout_logfile_maxbytes=5MB
```

## https未対応の場合の設定
この設定を本番運用で使うのは駄目だと思います。ご注意ください。
### .env
```shell:上記の設定と異なる部分のみ記載
APP_URL=http://公開しているサイトのIPアドレスかドメイン名
REVERB_PORT=80
REVERB_SCHEME=http
```
### Nginxのconf設定
上記の設定と同じ

## その他
Nginxの設定や.envの設定を変えた時にリフレッシュさせる必要があったけど、それをやらずに苦労してました。
Nginxの再起動とかartisanコマンドを実行しました。artisanコマンドはどれを行うべきかは自信がありません。
```shell:
php artisan config:clear
php artisan event:clear
php artisan route:clear
php artisan view:clear
php artisan config:cache
php artisan event:cache
php artisan route:cache
php artisan view:cache
npm run build
```
開発環境はsailを使ったもので、Nginxを使わなかったのですが、開発環境でもNginxを使って動作確認しておけばよかったかもと思いました。