OmniAICreator/Qiita-1.07M huggingface dataset:
【Streamlit】session_stateを使って削除・変数の保持をする

# はじめに
普段からPythonを使うことが多いです。
その中でもPython使用者にとって使いやすいフレームワーク、streamlitでアプリ開発するの楽しいですよね。

今回はsession_stateを使うことでテキストを削除したり、変数の値を残したりできる方法について書いていきます。
非常に便利ですが、わたしもすぐ使い方を忘れてしまうので備忘録として残しておきます。

# やりたいこと
* テキストエリアにテキストを入力できるようにする（空の状態で始まる）
* 削除ボタンを押したらテキストが消える
* 処理をしてもテキストの内容を残しておきたい場合（※必要に応じて）


# 初期値の設定
session_stateを使うときは、テキストエリアを空で始める初期値を設定しておきます。

```diff_python
if "text_input" not in st.session_state:
    st.session_state.text_input = ""
```


# テキストを削除する関数の定義
事前にテキストを削除できる関数を作成しておきます。今回削除したいのはsession_stateのtext_input_areaです。

```diff_python
def clear_text():
    st.session_state.text_input_area = ""  # session_stateをリセット
```

## テキストエリアの作成
ここではテキストを入力できるエリアを作成しています。valueでは最初に初期値の設定をしたtext_inputとすることで空の状態で始めることができます。またkeyではtext_input_areaとしておくことでテキストが入力された状態の値をこの後処理できるようになります。

```diff_python
text = st.text_area(
    "テキストを入力してください",
    value=st.session_state.text_input,  # 初期値として表示させるテキスト
    height=300,  # 高さを300pxに設定
    key="text_input_area"  # 一意なキーを指定する
)
```
# 削除ボタンの作成
ここでは事前に定義した関数clear_textを使います。on_click=clear_textとすることで先ほどkeyで定めたtext_input_areaの内容を削除することができるようになります。どのような場所でもこの処理を呼び出せるところがメリットです。

```diff_python
delete_button = st.button("削除", on_click=clear_text)
```

# テキストが変更された場合はsession_stateに保存する
このコードを追加しておくことで入力されたテキストの内容を保存することができます。これにより入力内容が保存された状況（テキストが消えない）になります。

```diff_python
if text != st.session_state.text_input_area:
    st.session_state.text_input_area = text
```

# 最後に
今回はsession_stateについてでした。
最初はこの機能の使い方がわからず、ボタンを押しても何も変わらない！という状況でした。使いこなせると非常に便利なのでたくさん使っていきたいですね。
RAGの精度を高めるためのデータクレンジングのコツ

RAG（Retriever-Augmented Generation）は、情報検索（Retriever）と情報生成（Generator）を組み合わせて質問に答えるAI技術です。その精度を向上させるためには、使用するデータのクレンジングが欠かせません。本記事では、RAGの精度向上に寄与するデータクレンジングの具体的なコツを紹介します。
※この記事は、ChatGPTの出力を基に作成しています。

https://t.co/woSkEWcRBH

---

### **1. データの整合性を保つ**
RAGの精度を高めるには、データの整合性が重要です。以下の方法で不正確なデータを排除し、一貫性を保ちましょう。

- **重複データの排除**：同じ内容のデータが複数存在すると混乱を招くため、重複データを検出して削除します。
- **不完全なデータの修正**：欠損値（NaNや空白）は適切に補完するか削除します。
- **最新データの保持**：データベースを定期的に更新し、古い情報を最新のものに置き換えます。

---

### **2. 信頼性を確保する**
RAGが正確な回答を生成するには、信頼性の高いデータが必要です。

- **信頼できるソースを選定**：公的機関や権威ある出版物からデータを収集しましょう。
- **ソースのスコアリング**：各データソースに信頼度スコアを設定し、一定以上のスコアを持つデータだけを使用します。

---

### **3. データの標準化**
データフォーマットを統一することで、情報の一貫性と検索の効率性を向上させます。

- **日付や数値の形式統一**：日付は「YYYY-MM-DD」形式にするなど、データ形式を統一。
- **言語の統一**：複数の言語が混在している場合は、ターゲット言語に翻訳するか分けて管理します。

---

### **4. ノイズを除去する**
不要な情報を削除することで、AIが正確に情報を処理できるようになります。

- **冗長な情報の削除**：広告やコメントなど、検索や生成に不要な要素を除去します。
- **データの簡素化**：複雑すぎるデータを適切に要約します。

---

### **5. 矛盾データの検出と修正**
矛盾するデータは、AIの混乱を招きます。これを防ぐには以下のステップが有効です。

- **矛盾の検出ルールを設定**：同じ質問に異なる回答が含まれる場合、それを検出するアルゴリズムを導入します。
- **信頼性に基づく修正**：矛盾が検出された場合、最も信頼性の高いソースを基準に修正します。

---

### **6. 自動化ツールの活用**
効率的なデータクレンジングにはツールやスクリプトの活用が欠かせません。

- **Pythonライブラリの利用**：`pandas`や`numpy`を使えば、データの欠損値補完やノイズ削除が効率化できます。
- **ETLツールの導入**：Apache AirflowやTalendなどのツールを用いることで、データパイプライン全体を自動化可能です。

---

### **7. バリデーションプロセスの導入**
クレンジング後のデータが実際に機能するか確認するプロセスを設けましょう。

- **結果のテスト**：クレンジング後のデータで検索と生成を試し、結果の精度を評価します。
- **ユーザーフィードバックの活用**：生成された回答がユーザーに役立つかどうかを確認し、クレンジングプロセスに反映します。

---

### **まとめ**
RAGに使用するデータのクレンジングは、「整合性」「信頼性」「ノイズ除去」「標準化」「自動化」の5つの視点が鍵です。これらを効率的に進めることで、RAGの検索精度と生成精度を大幅に向上させることができます。継続的な改善プロセスを取り入れ、常に最新かつ正確なデータを維持することが成功へのポイントです。

データクレンジングをしっかり行い、RAGの可能性を最大限引き出しましょう！
(小ネタ)3.3Vと5.0Vの電圧変換(マジックナンバー39.0625と15.625)


参考

https://qiita.com/caa45040/items/b1a6be97770ec964cdac

https://qiita.com/caa45040/items/c5df0d013f73f0fe8e63

x 過去ログを見よ!!!
x 主に8ビット系でintのサイズが16ビット


目的
ADCから電圧の変換を
●軽量
●高速
●読みやすさ重視
で行う

3.3V系
----

15.625 = 2.5 x 2.5 x 2.5

1024 * 3 = 3072

3072 * 15.625 = 48000

48000 / 16 = 3000

3000 /10 + 3000 = 3300

```c

  int s; //センサーの値
  unsigned int vo; //電圧

  s = 1024; //センサーの値を1024

  //センサーの値から電圧に変換(x3 x15.625/16 1/10)
  vo = s;
  vo = vo + vo + vo;
  vo = ((vo * 15U) + (vo >> 1) + (vo >> 3)) >> 4;
  vo = vo + (vo / 10);

```

5V系
----

39.0625 = 2.5 x 2.5 x 2.5 x 2.5

1024 * 39.0625 = 40000

40000 / 8 = 5000

```c++

  int s; //センサーの値
  unsigned int vo; //電圧

  s = 1024; //センサーの値を1024

  //センサーの値から電圧に変換(x39.0625/8)
  vo = s;
  vo = ((vo * 39U) + (vo >> 4)) >> 3;

```

・

・

・


おまけ
----

39.0625 * 256 = 10000

なぜかそうなる
circuitjsの作法 その25

# 概要
circuitjsを調査してみた。
練習問題やってみた。

# 練習問題
リレー回路で、フリップフロップ回路を作れ。
プッシュスイッチ、ONでaがON、OFFでｂがＯＮ、２回目ＯＮでＡがＯＦＦ、ＯＦＦでＢがＯＦＦとなる回路

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/3b6328fb-47f7-c61d-a102-89d9b8a242f1.png)


# ネットリスト

```
$ 1 0.000005 10.20027730826997 50 5 50 5e-11
178 464 272 464 432 6 2 0.2 0.16187936828046767 0.05 1000000 0.02 20 0.015 0.005 1
178 848 272 848 432 6 2 0.2 0.16718182311766377 0.05 1000000 0.02 20 0.015 0.005 1
g 336 432 336 448 0 0
g 432 432 432 448 0 0
g 688 432 688 448 0 0
R 144 112 80 112 0 0 40 5 0 0 0.5
s 336 144 336 208 0 1 true
w 144 112 336 112 0
w 336 112 336 144 0
w 336 112 368 112 0
162 944 240 944 304 2 default-led 1 0 0 0.01
g 944 304 944 336 0 0
178 368 272 368 432 6 1 0.2 0 0.05 1000000 0.02 20 0.015 0.005 0
178 720 272 720 432 6 1 0.2 0.0000046686337797361575 0.05 1000000 0.02 20 0.015 0.005 0
178 624 272 624 432 6 1 0.2 0.000009118427930878671 0.05 1000000 0.02 20 0.015 0.005 0
g 592 432 592 448 0 0
g 816 432 816 448 0 0
w 336 208 336 272 0
w 384 432 416 432 0
w 416 432 416 240 0
w 416 240 464 240 0
w 464 240 464 272 0
w 352 432 352 512 0
w 352 512 784 512 0
w 784 512 784 240 0
w 784 240 848 240 0
w 848 240 848 272 0
w 480 432 480 464 0
w 480 464 672 464 0
w 672 464 672 272 0
w 672 272 688 272 0
w 832 432 832 528 0
w 832 528 560 528 0
w 560 528 560 272 0
w 560 272 592 272 0
w 368 112 368 272 0
w 512 272 512 112 0
w 896 272 896 112 0
w 368 112 512 112 0
w 512 112 896 112 0
162 256 256 256 304 2 default-led 1 0 0 0.01
g 256 304 256 320 0 0
w 432 208 432 272 0
w 256 256 256 208 0
w 256 208 432 208 0
w 816 272 816 208 0
w 816 208 944 208 0
w 944 208 944 240 0
w 432 208 624 208 0
w 624 208 624 272 0
w 720 272 720 208 0
w 720 208 816 208 0
w 496 432 496 480 0
w 640 432 640 480 0
w 880 432 880 464 0
w 560 480 640 480 0
w 496 480 560 480 0
w 736 432 736 464 0
w 736 464 880 464 0
w 864 432 864 480 0
w 640 480 864 480 0
w 736 464 736 544 0
w 448 432 448 544 0
w 448 544 736 544 0

```

以上。
MineRLの環境構築

Minecraftの強化学習環境を提供するプラグインのインストール方法備忘録です。
# 参考
このサイトと同じです．サンプルコードもこちらからお借りしました．
https://minerl.readthedocs.io/en/latest/tutorials/index.html
# 検証環境

以下の環境で検証しました。OSについてはJavaが入る環境であれば大丈夫そうです。

- OS: Ubuntu 24.04 LTS
- Python: 3.10.16 (Anaconda)

# インストール方法
## 1. Java8をインストールする
```bash
sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get install openjdk-8-jdk
```
インストール後，以下のコマンドでバージョンを確認する．
```bash
java -version
```
以下のような表示が出ていればOK（openjdk versionが1.8になっていることを確認）
```bash
openjdk version "1.8.0_432"
OpenJDK Runtime Environment (build 1.8.0_432-8u432-ga~us1-0ubuntu2~24.04-ga)
OpenJDK 64-Bit Server VM (build 25.432-bga, mixed mode)
```
## 2. MineRLのインストール
以下のコマンドを入力して，MineRLをインストール（結構時間がかかるので，焦らず待つ）
```bash
pip install git+https://github.com/minerllabs/minerl
```

インストールできたら，以下のプログラムを実行してインストールできたか確認
```python
import gym
import minerl

env = gym.make("MineRLBasaltBuildVillageHouse-v0")
obs = env.reset()

done = False
while not done:
    ac = env.action_space.noop()
    # Spin around to see what is around us
    ac["camera"] = [1, 3]
    obs, reward, done, info = env.step(ac)
    env.render()
env.close()
```

成功すると、以下のような画面でプレイヤーがぐるぐる回る様子が確認できます。

:::note warn
必ずしも動画と同じワールド（場所）にスポーンするわけではないようです．
:::
![MineRLのプイレビュー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2676391/ab75282a-a02a-dce9-4f93-b4fad7689df1.gif)
UbuntuでTFTPサーバを設定する

#### 使用環境
・Ubuntu 20.04
・Linux Kernel 5.15.0

#### TFTPサーバのインストール
```
sudo apt install tftpd-hpa
```

設定ファイル：/etc/default/tftpd-hpa

(デフォルトの内容)
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure"

※ TFTPクライアントがアクセスするのはTFTP_DIRECTORYで指定したフォルダになります。

#### TFTPサーバの起動
```
sudo systemctl start tftpd-hpa
```
自動起動の設定はせず、必要時に起動しようと思います...。

#### TFTPサーバの再起動（設定ファイルを書き換えた場合等）
```
sudo systemctl restart tftpd-hpa
```

#### TFTPサーバの停止
```
sudo systemctl stop tftpd-hpa
```
【ServiceNow】Xanaduリリース　Platform Analyticsへのレポート・ダッシュボードの移行

## はじめに
みなさんこんにちは、三井情報株式会社です。

Xanaduバージョンのリリースノートにて、WashingtonDCバージョン以前のレポート機能およびダッシュボード機能がPlatform Analyticsに統合されることが発表されました。
今回は、Platform Analyticsへのレポートおよびダッシュボードの移行について検証を行いましたので、ご紹介いたします。

## 検証概要
・レポートとダッシュボードをPlatform Analyticsに移行し、移行方法および移行による表示や機能への影響を検証しました。
・Employee Center Proに追加したレポートウィジェットの表示や機能が、Platform Analyticsへの移行によりどのような影響を受けるのかを確認しました。

## 移行前の準備
### 1．レポートおよびダッシュボードの作成
[All] > [Reports] > [Create New] からレポートを作成しました。
[All] > [Self-Service] > [Dashboards] からダッシュボードを作成しました。

### 2．Employee Center ProのHomepageにレポートウィジェットを追加
Service Portal Designerで、Employee Center ProのHomepageにレポートをウィジェットとして配置しました。
![レポートウィジェット配置.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773072/f79b53f5-3445-abae-43fd-da1085506b9c.jpeg)

## Platform Analyticsへの移行
### 1．移行方法の選択
[All] > [Performance Analytics] > [Migration Center] から移行オプションを選択します。
今回は「Try your content」を使用して移行を実施しました。
![Try with selected content.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773072/29aaac34-a182-e514-5e21-305f7db2ff9e.jpeg)

:::note info
Move all your content：
完全移行オプション。「Start moving」をクリックするとすぐにダッシュボードの移行が実行されます。

Try with selected content：
コンテンツ検証オプション。移行したいダッシュボードのみを移行することができます。移行に問題ないか検証を行うことができます。
:::

### 2．移行対象の選択と移行の実行
移行するダッシュボードを選択し、「Action on selected rows…」 から「Migrate Dashboard」をクリックします。
![Migrate dashboard.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773072/0abfa8c8-7c46-384c-89dd-68536e07dcda.jpeg)

## 移行後の画面表示
### ダッシュボード
カウント型レポートの数字が左端に配置されてしまいましたが、レポートの表示内容は移行前と相違ありませんでした。
![ダッシュボード①.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773072/275d8a25-10d9-03e7-b497-a9687c9e4857.jpeg)

### Employee Center Proのレポートウィジェット
レポートウィジェットの表示内容は移行前と相違ありませんでした。
ServiceNowに問い合わせたところ、ポータルで利用しているレポートについては移行の影響はないとのことでした。
![移行後のECP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773072/f4bff2a1-1923-d1fb-01cc-cf6297341db2.jpeg)

## 参考資料

https://www.servicenow.com/docs/ja-JP/bundle/xanadu-now-intelligence/page/use/par-for-workspace/task/data-migration-perform-partial.html

## おわりに
本記事では、Platform Analyticsへのレポートおよびダッシュボード機能移行についてご紹介させていただきました。
最後までお読みいただきありがとうございました。
今更聞けない個人的用語集

### ソリューション
問題解決

### DDC
Dynamic Device Cnfiguration
動的デバイス構成
ネットワークやデバイスの構成を動的に変更・管理するための技術や手法


### アイデンティティ
オンライン上で個人や組織を識別するための情報
（ユーザー名、パスワード、電子証明など）


### アクセス制御
システムやネットワークにおける情報やリソースへのアクセスを制限・管理する仕組み
認証・認可・監視という要素を含む


### クラウドネイティブ
アプリケーションやサービスをクラウド環境を最大限に活用できるように設計・開発・運用するアプローチや技術の総評


### A/ML
Artificial Intelligence/Machine Learning
（人工機能/機械学習）



### プロアクティブ
問題が発生する前に自ら進んで行動を起こす事
状況を予測して先回りして対処する姿勢



### シグナルサインオン（SSO）
複数のシステム間で1度のログインでアクセス可能


### セキュア
安全性、信頼性、保護性


### アウトオブボックス
そのまますぐに使える状態


### IGAソリューション
Identity Governance and Administration
アイデンティティガバナンスおよび管理
組織におけるユーザーにアクセス制御を適切に管理しガバナンスを強化するためのソリューション



### プロビジョニング
必要なリソースやアカウントを迅速かつ効率的に準備し利用可能な状態にするプロセス



### CSV
Comma-Separated Values
データをカンマ（,）で区切った形式で保存したテキストファイルフォーマットのこと。シンプルで軽量なフォーマット。



### API
アプリケーションとアプリケーションが通信するためのインターフェイス（窓口）のこと


### ガバナンス
統制・管理
ルールやプロセスを定めて管理・監督する仕組み
【Go】Goのジェネリックメソッドについて

## Goのジェネリクス

Goには、ジェネリクスという概念があります。関数か構造体を定義する際に、一部の型を変数として扱い、コードの再利用性の向上させます。

```go
// generic function
// ok
func UseOrElse[T any](cond bool, first, second T) T {
	if cond {
		return first
	}
	return second
}
```

```go
// generic struct
// ok
type NullValue[T any] struct {
	Value T
	Valid bool
}
```

が、ジェネリックメソッドはまだ未対応です。

```go
type Helper struct {}

// generic method
// error!
func (h Helper) UseOrElse[T any](cond bool, first, second T) T {
	if cond {
		return first
	}
	return second
}
```

こう書くと、`[T any]`の部分に波線が出て、IDEから`Method cannot have type parameters`（メソッドには型変数を指定できません）と表示されます。

## 回避策

ラッパー構造体を作り、**型変数を構造体のところに移す**。　
便宜上、元の構造体を本構造体と呼びます。
本構造体とラッパー構造体を同じパッケージに定義することによって、本構造体のプライベートフィールドもラッパー構造体からアクセス可能です。

```go
// ok
type Helper struct {
	PublicFlag  string
	privateFlag string
}

type Wrapper[T any] struct {
	h Helper
}

func (c Wrapper[T]) UseOrElse(cond bool, first, second T) T {
	fmt.Println(c.h.PublicFlag)
	fmt.Printf(c.h.privateFlag) // ok!
	if cond {
		return first
	}
	return second
}
```

呼び出す方法：

```go
var h Helper
_ = Wrapper[int]{h}.UseOrElse(false, 1, 2)
_ = Wrapper[string]{h}.UseOrElse(true, "hello", "world")
```
暗記しておくと強いやつ

# 木
- **各頂点を中心として隣り合う頂点を見たとき、全体での計算量は(2N-2)** ABC385-E
- **葉以外の頂点は必ず次数2以上であるという前提があるとき、「葉以外の頂点数<葉の頂点数」が成り立つ** ABC386-E(次数が1である葉以外の頂点をショートカットしてTLEを防ぐ)

#  Functional Graph
- **各連結成分にちょうど1つの閉路が存在していて、閉路外の頂点は必ず閉路に向かって辺を生やしてる(つまり必ず閉路に行きつく)** ABC387-F

# 移動
- **幅a,a+1の二択の移動ができるとき、あるスタート地点から「a(a-1)マス目以上」は全て到達可能である(隣り合う数字が選択できることが大事なので3通り以上の移動種類でも隣り合っていればOK)** ABC388-F

# 貪欲
- **「選んだ個数^2」みたいなのは、一個ずつ貪欲に選んでOKで、増える係数がk^2-(k-1)^2」で求められる** ABC359-F ABC373-F

# 区間
- 長さnの区間から抜き出せる長さ1以上の連続部分列の通りは(n+1)C2通り。[l,r)の半開区間で、l,rをそれぞれ選ぶと思えばいい。長さ2以上だとnC2になる。[l,r]と
Azure Logic Apps のSQL Server アクションで、パラメータクエリを使用する

よく忘れるので個人的な備忘録

![Screenshot 2025-01-09 at 10.03.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43829/7c89a58d-eb71-50c8-7262-a618231df7c1.png)
Next.jsのバージョン15の開発環境でメディアクエリが効かなくなった

# 対処方法
どうやらturbopackが悪さをしているらしい。
turbopackをつかわなければどうということはないので
package.jsonのdevを書き換えればよさげ
```diff:package.json
- "dev": "next dev --turbopack",
+ "dev": "next dev,
```

# 起きたこと
```
npx create-next-app
cd [projectfolder]
npm run dev
```
でNextアプリを作成して開発環境を立ち上げた。
そうしてしばらくコードを書いていて**メディアクエリがきかない**ことに気づいた。

# 意味なかったこと
- CSS modulesのメディアクエリを書いてみる（書き方間違ってる？？？）
- tailwind CSSのメディアクエリを書いてみる（間違えようがない）
- メタデータにビューポートを記載する
```typescript:layout.tsx
import type { Viewport } from 'next'
 
export const viewport: Viewport = {
  width: 'device-width',
  initialScale: 1,
}
```
- Reactのバージョンを下げてみる
- 開発者ツールでコンパイル後のソースコードを眺めてみる
  （どうやらそもそもメディアクエリの部分がコンパイルされてないっぽいぞ...？）
###### 結果
何の成果も得られませんでした。

# 意味があったこと
- Next.jsのバージョンをさげてみる
##### 結果
きくようになった。どうやらNextのどっかが悪さしているらしい

# 一晩あけて...
package.jsonを開いたら冒頭のコードを発見
確かv14ではオプションだったよな...から試して原因特定して解決しました。
Groupbyの使い方

## 内容
グループごとで平均、最大値、最小値が算出できるgroupby関数の使い方について、備忘録として記録します。

まずは仮のデータを作成します。
```py
import nampy as np
import pandas as pd

# データフレームを作成
num = np.array([["A", 4], ["B", 5], ["A", 6], ["A", 7], ["B", 8], ["B", 9]] , dtype=object)
data = pd.DataFrame(data=num, columns=["data", "result"])
```
出力結果
```py
   data result
0    A      4
1    B      5
2    A      6
3    A      7
4    B      8
5    B      9
```

データを元にグループ分けをする列を指定します。

```python
group = data.groupby('data')
```
ここでは"data"列に対して、A,Bグループに分けます。
分けたデータを元に平均値、最大値、最小値をえます。

```python
group_mean = group['result'].mean() #平均
group_max = group['result'].max() #最大
group_min = group['result'].min() #最小
```
上の内容を元にグラフ描写をします。

```py
# グラフに描写
# ラベルをつくる
labels = ["A", "B"]

# 横幅を指定
width = 0.3

# 横軸の幅を指定
left = np.arange(len(labels)) 

plt.bar(left , group_mean , width = width , label = "mean" , color = "coral")
plt.bar(left + width, group_max, width = width , label = "max" , color = "steelblue")
plt.bar(left + width + width , group_min, width = width , label = "min" , color = "forestgreen")
plt.xticks(left + width , labels)
plt.legend()
plt.show()
```

出力結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569853/ac070628-1e5c-eef1-08c0-1f4d1eefe203.png)


上記の方法でグループごとの平均、最大値、最小値の可視化が可能です。
deepseekをコマンドラインで使う方法

jqはJSONを整形するツールです。

```bash
#!/bin/bash

API_KEY="YOUR_API_KEY"
ENDPOINT="https://api.deepseek.com/v1/chat/completions"

echo "DeepSeek CLI (Ctrl+C to exit)"
while true; do
    read -p "> " input
    REQUEST_BODY='{
      "model": "deepseek-chat",
      "messages": [
        {"role": "user", "content": "'"$input"'"}
      ]
    }'
    RESPONSE=$(curl -s -X POST "$ENDPOINT" \
        -H "Authorization: Bearer $API_KEY" \
        -H "Content-Type: application/json" \
        -d "$REQUEST_BODY")
        echo $RESPONSE | jq -r '.choices[0].message.content'
done
```
以上。
#0009（2024/01/09）ファンアウト構成とは？

# モチベーション
- AWS SAAの勉強中、SQSとSNSを使ったファンアウト構成が出てきた

# ファンアウト構成とは
- 「ファンアウト（Fan-out）」は、コンピューティングの分野で一般的に使用される用語
- 具体例
    1.	メッセージングシステム:
        - メッセージを1つの送信元から複数の宛先に配信する構成
	1.	プロセスの分岐:
    	- 1つのタスクを複数の小タスクに分割して実行する
    	- 例: マルチスレッドや分散処理
	1.	回路設計:
    	- 信号が1つの出力から複数の入力に分岐する
    	- 例: デジタル回路でのファンアウト

# SQSとSNSを使ったファンアウト構成

## 構成
1. SNSトピックを作成
    - SNSは1つのトピックを介して複数のサブスクライバーに通知を配信する
1. 複数のSQSキューをSNSトピックにサブスクライブさせる
    - SNSはトピックに送信されたメッセージを、サブスクライブされた各SQSキューにコピーして送信する
1. 受信側（消費者）はSQSからメッセージを取得
    - 各SQSキューに格納されたメッセージを、それぞれのシステムやサービスが独立して処理できる

## ユースケース
- 分散システムでの通知配信:
    - SNSを使って、複数のアプリケーション（ログ処理、分析システムなど）に同時にメッセージを送る
- マイクロサービス間の通信:
    - SNSでイベントを発行し、各マイクロサービスが自分専用のSQSキューから必要なメッセージを受け取る
- リアルタイムアラートとバッチ処理の同時実行:
    - SNSでアラートを配信し、リアルタイムアラートはLambda関数が処理、バッチ処理はSQSで溜めて後で処理


## イメージ
```
[ Producer ]
     |
     v
[ SNS Topic ]
     |         |         |
     v         v         v
[ SQS Queue1 ] [ SQS Queue2 ] [ SQS Queue3 ]
     |         |         |
     v         v         v
[ Consumer1 ] [ Consumer2 ] [ Consumer3 ]
```

# 参考
- chatgptの回答を元に作成
生成AI多すぎるから厳選してみる②（画像生成編）

生成AIの進化に伴い、画像生成や音声生成、スライド生成といった多様な分野で利用可能なツールが次々と登場しています。しかし、選択肢が多すぎるため、どのツールが自分の用途に最適か判断が難しいことも。

今回は、画像生成、音声生成、スライド生成の分野に焦点を当て、自分用にも活用できるおすすめの生成AIを厳選して紹介します。

これを参考に、用途に合ったツール選びの助けになれば幸いです！

## 画像生成
### ①DALL·E 3
DALL·E 3 は、OpenAIが開発した画像生成AIです。

これはChatGPTの有料バージョンだとChatGPTのプラットフォーム上でそのまま使用することができます。
テキストを入力するだけでクオリティの高い画像生成が可能です。

まとめると以下のような特徴があります。

・ChatGPTに課金していれば無料で利用することが可能なため使用しやすい
・配色や雰囲気をプロンプトとして送ることで独自のサムネイルやロゴを簡単に作成することができる
・何度も画像を生成することができるた

### ②MidJourney
MidJourneyは、Discordプラットフォーム上で利用できる画像生成AIで、特にアートやビジュアルデザイン分野で高い評価を得ています。

無料で使用することはできず、月に<b>$10</b>から利用できます。

画像生成AIの中には商用利用を禁止されているものもありますが、Midjourneyで作成した画像は商用利用が可能です。（生成した画像を営利目的で利用することが可能）

例えばこのような画像を生成することができます。

![Screenshot 2025-01-06 at 13.39.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982961/43d56a67-49e2-46d9-7b56-c4e3308cefe6.png)

画像だと思えないくらいリアルです。

### ③Stable Diffusion
Stable Diffusionは、Stability AI が開発した画像生成AIであり、オープンソースとして公開されています。

このため、Webアプリケーション上で簡単に試す方法と、自分のローカル環境にインストールして使う方法の2通りがあります。

Webアプリケーションではブラウザからプロンプトを打ち込むことで簡単に高品質な画像生成を試すことができます。

一方、ローカル環境で利用する場合は、GitHubで公開されているコードを使い、自分のPCやGoogle Colaboratory上でモデルを動かすことが可能です。

ローカル環境では高度なカスタマイズや自由な操作ができ、技術的な知識がある方にはおすすめです。

Stable Diffusionは基本的には無料で利用可能ですが、Stable Diffusionを提供しているWebサイトやインストールするクラウド環境次第では料金が発生することもあります。

他の画像生成AIとの違いは、以下の2つです。
<b>①オープンソースで提供されている点
②ローカル環境でも動作可能な点</b>
Power Apps Premium 試用版を使って個別環境を作成する

# はじめに
Power Appsで環境を作成したい方向けの記事です。
Power Apps Premium試用版を使った環境作成の手順を残します

# 手順
1. [Make.powerapps.com](https://make.powerapps.com/)へアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579825/eccdbf42-fc96-ab52-34f7-1650326c515b.png)

1. [Power Platform管理センター](https://admin.powerplatform.microsoft.com/home)へアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579825/8a7915f0-174f-2156-ff7f-7624c9f3991d.png)

:::note info
環境を作成したいユーザでログインできているか念為チェックください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579825/f5bb80f0-119c-d1ec-2d7d-d8f50bb50fce.png)
:::
 
　3. 「環境」、「＋新規」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579825/406b7afb-6df8-e9ec-532f-3f2bbcf6bdc0.png)

　4. 新しい環境の設定
種類+：試用版
Dataverseデータストアを追加しますか？：はい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579825/8b4383ff-ac1c-f3b7-86ed-1e48ac0ad1b6.png)

　5. セキュリティグループをセットします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579825/437dde13-7e47-e548-1060-7e5e3157c419.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579825/cfb163c9-af9e-778e-ef60-96872e789d42.png)

　6. 保存を選択
サンプルアプリおよびデータの展開：Yes
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579825/8de9194d-c8b2-a691-5929-0c336e364fd2.png)

　7. 環境のセットアップ完了
環境「状態：準備中」から「状態：準備完了」になれば完了です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579825/26b13bce-639b-5f90-20dc-9e5e9f01c7ba.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579825/5e2d058e-e5c2-d54b-a0c0-2e1f22799cbe.png)

　8. make.powerapps.comの画面に戻り、作成した環境に切り替えられる事を確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579825/acfcac61-36b2-481d-bc31-41fc901314c0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579825/eb18c268-a01f-9e7d-c1b4-52e84612b74f.png)
reach hook form useFieldArrayについて

※react hook form ver7を使用しています。

# useFieldArrayについて
入力ボックスを動的に増やしたり減らしたりするときに使う。
[公式](https://react-hook-form.com/docs/usefieldarray)

これを知るまでは、入力ボックスを配列としてuseStateで管理して、どうのこうのしていました・・・

googleで検索するとたくさん記事があると思います。
それらを参考にしたとき、useFieldArrayの型で少し苦戦したのでメモ程度に書いておきます。

## コード
```
 import React from "react";
import { useForm, useFieldArray } from "react-hook-form";

//エラーになる型
// type FormValues = {
//   inputs: string[]; // 配列データの型を定義
// };

//エラーにならない型
type FormValues = {
  inputs: { input: string }[]; // 配列データの型を定義
};

export default function FieldArrayExample() {
  const { control, register, handleSubmit } = useForm<FormValues>({
    defaultValues: {
      inputs: [{ input: "" }], // 初期値を設定
    },
  });

  const { fields, append, remove } = useFieldArray({
    control,
    name: "inputs",
  });

  const onSubmit = (data: FormValues) => {
    console.log(data);
  };

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      {fields.map((field, index) => (
        <div key={field.id}>
          <input {...register(`inputs.${index}`)} />
          <button type="button" onClick={() => remove(index)}>
            Remove
          </button>
        </div>
      ))}
      <button type="button" onClick={() => append({ input: "" })}>
        Add
      </button>
      <button type="submit">Submit</button>
    </form>
  );
}

```
## ポイント
useFormで定義するtypeは、オブジェクト配列にする必要がある。
非オブジェクト型の配列だとエラーになる。
js初心者がgitからnpm packageを社内に配布する準備をしてみた

# はじめに
社内向けにOutsystemsのE2E（codeceptjs）のライブラリを作成している。
他チームに展開するにあたり、簡単な導入法がないかを考えている。
社外へ公開せず、社内から簡単にアクセスできる方法がよい。
ZIPの共有、gitのsubmodule、ローカルファイルpackageのnpm installなどを検討したが、それぞれ難点があり採用に至らなかった。
npmについて調べていくと、gitリポジトリからnpm installできることが分かった。
jsやnodeは既存システムの改修をしたことがある程度の知識のため、調べたことを備忘録代わりに書き留めていこうと思う。

# 環境
node:v21.5.0
npm:10.2.4

# 前提
ライブラリは作成中で、package.jsonやリポジトリは作成されている状態である。
リポジトリは社内からのみアクセス可能になっている。
package名は**mylibrary**、バージョンは**0.1.0**とする。
リポジトリのURLは**myRepository**、ターゲットのブランチは**targetBranch**とする。

# インストール
## npm install
gitからのインストールには以下のコマンドを使う。
```
$ npm install git+{myRepository}#{targetBranch}
```
**myRepository**は```git clone```する際のURLを指定する。今回は**http**のプロトコルでインストールできることを確認した。
**targetBranch**はインストールするソースをどのブランチから取得するかを指定する。今回は確認していないがtagを指定することもできるようだ。

## インストールされたものを確認する
```npm list```でインストール状況を確認した。
```
mylibrary@0.1.0 (git+{myRepository}#{commitId})
```

利用側のプロジェクト側で上記コマンドを実行して、ファイルがどのように配置されたかを確認する。
```node_module```配下にライブラリ側の```pakage.json```の```name```に指定した名称でフォルダが作成されている。
さらに、ライブラリ側で依存関係のあるパッケージがインストールされていることが確認できた。

適当な名前にしてしまうと、他のパッケージと被る可能性があるため注意しなければならない。

## アンインストール
下記コマンドを実行した。アンインストールに関しては他と同じようにパッケージ名を指定する。
```
$ npm uninstall mylibrary
```

```npm list```でインストール状況を確認したところ、正しく削除されていることが確認できた。

# 利用のための設定
クラスをexportして利用側でrequireしたい。
ライブラリの内部のフォルダ・ファイル構造を意識させず、すべてのクラスを以下のように利用できるようにしたい。
```js
  const { Hogehoge } = require("mylibrary");
```

## index.jsでexports
```/src/index.js```に各クラスのexportsを記載

```js
module.exports = {
    Hogehoge: require("./hoge/Hogehoge"),
    Fugafuga: require("./fuga/Fugafuga"),
};
```

## package.jsonのexportsを設定
ライブラリ側の```package.json```にexportsを追記。
```json
    "exports": {
        ".": "./src/index.js"
    }
```

# 終わりに
突貫ではあるが、目標であった自作ライブラリの簡単な配布が実現できた。
このライブラリをチーム全体で育てていくための開発規約や運用サイクルについてはまたきちんと考えていきたい。
そのために、gitを用いたnpm installでのバージョン管理方法など技術的な課題も残っているので調査していきたい。
ローカルLLM構築を(真似して)やってみた

ほぼ下記を参考にさせていただき構築。ちょっと素人向け情報を補足。
https://qiita.com/kansou/items/58aff8b89ee999306141

一時間もかからず構築できます。

:::note info
Python3.11系をインストールしておく。

Windowsなら
https://www.python.org/downloads/windows/
の
https://www.python.org/ftp/python/3.11.9/python-3.11.9-amd64.exe

本記事の内容は3.13系でも動いたが、3.13はGIL仕様が変わっており、LLM関係のライブラリが未対応のものが多い模様。Embedding等やっていく場合3.13だと躓く可能性がある。
:::

### Microsoft C++ Build Toolsのインストール(llama-cpp-pythonのコンパイルに必要)
https://visualstudio.microsoft.com/ja/visual-cpp-build-tools/

### 依存パッケージのインストール
```
pip install cmake scikit-build-core wheel
```
### 「llama-cpp-python」のインストール(ビルドします)
```
pip install llama-cpp-python --extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cpu
```

LLMモデルllamaをダウンロード
https://huggingface.co/mmnga/Llama-3-ELYZA-JP-8B-gguf/tree/main
Llama-3-ELYZA-JP-8B-q4_k_m.gguf
をダウンロードして、pyファイルと同じフォルダにmodelsフォルダを作り配置。

2/5追記：n_gpu_layersを指定すればIntel系GPUでもアクセラレーションしてくれます！

```LocalLLM.py
from llama_cpp import Llama

llm = Llama(
    model_path="models/Llama-3-ELYZA-JP-8B-q4_k_m.gguf",
    chat_format="llama-3",
    n_ctx=1024,
    n_gpu_layers=30,　# GPUやモデルに応じて調整してください
)

response = llm.create_chat_completion(
    messages=[
        {
            "role": "system",
            "content": "あなたはバイクに詳しいショップ販売員です。特に指示が無い場合は、常に日本語で回答してください。",
        },
        {
            "role": "user",
            "content": "ヤマハのバイクが欲しいです。近くをツーリングしようと考えていますがどれが良いですか？",
        },
    ],
    max_tokens=1024,
)

print(response["choices"][0]["message"]["content"])
```

# 実行
```
python LocalLLM.py
```
※Corei5 Gen8で数十秒かかった

![cpu_localllm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283529/318e1932-c43a-c4d1-15da-a01565c506a2.png)


# 結果
```
ヤマハのバイクは、性能、デザイン、機能性のどれをとっても非常に優れています。近くをツーリングするには、以下の点を考慮して選ぶと良いでしょう。

1.排気量: ツーリングには、250ccから400ccの排気量が適しています。小排気量は燃費が良く、維持費も安いです。400cc以上はパワーがありますが、高速道路を中心に走る方が向いています。
2.エンジンタイプ: ツーリングには、水冷エンジンが向いています。水冷エンジンは、空冷エンジンに比べて高回転域でのパワーが向上し、高速走行や長距離走行に 適しています。
3.車体のサイズ: ツーリングには、車体のサイズが小さい方が、取り回しや駐車がしやすいです。小排気量のバイクは、車体のサイズが小さい傾向にあります。     
4.足つき性: ツーリングには、足つき性が良く、低いシート高のバイクが向いています。低いシート高は、足つき性が良く、長距離走行や高速走行に適しています。 

以上の点を考慮して、ヤマハのバイクを選ぶと良いでしょう。
```
おお、ナイス

（追記）
ユーザー入力可能にして、リアルタイムで応答を出すように改造。

```LocalLLM.py
import sys
from llama_cpp import Llama

llm = Llama(
    model_path="models/Llama-3-ELYZA-JP-8B-q4_k_m.gguf",
    chat_format="llama-3",
    n_ctx=1024,
)

# 初期設定のシステムメッセージ
system_message = {
    "role": "system",
    "content": "あなたはバイクに詳しいショップ販売員です。特に指示が無い場合は、常に日本語で回答してください。",
}

def main():
    # 標準入力からユーザー入力を取得
    user_input = input("ユーザー: ")

    # ユーザーの入力をメッセージに追加
    messages = [
        system_message,
        {
            "role": "user",
            "content": user_input,
        },
    ]

    # LLM による応答のリアルタイム生成
    response_stream = llm.create_chat_completion(
        messages=messages,
        max_tokens=1024,
        stream=True,  # ストリーミングモードを有効化
    )

    # 応答内容をリアルタイムで出力
    print("応答: ", end="", flush=True)
    for chunk in response_stream:
        # トークンを取り出してリアルタイム表示
        token = chunk["choices"][0]["delta"].get("content", "")
        print(token, end="", flush=True)
    print()  # 応答終了後に改行

if __name__ == "__main__":
    main()
```
PGスタイルシリーズ：変数を初期化するタイミング

## スタイルを選ぶ理由

以下の事項を重視しての選択

* ミスが起きにくい
* インデントが深くならない（読みやすさに寄与）

----
## 基本姿勢：宣言的に書く

* 宣言的に書く：どうやるか、ではなく何をやるか
* 関数型に倣う：関数（値をもらって値を返す、副作用を極力減らす）の組み合わせで実装する

以降、便宜上C#を例にして話を進めます。

----
## 変数の扱い

* 大原則：**再代入しない**
* 宣言即初期化
* インスタンス変数はreadonlyを付ける
* そもそも、変数は少ない方がいい！


----
## サンプル

```C#
public class MessageDisplayer
{
    string name;

    public Hoge(string name)
    {
        this.name = name;
    }

    public void DisplayMessage()
    {
        Console.WriteLine(GetProcessedMessage());
    }

    string GetProccessedMessage()
    {
        string ret = null;
        if (DateTime.Now.Minutes % 2 == 0)
        {
            ret = "Hello, " + this.name;
        }
        else
        {
            ret = "Hello, " + this.name + "!!";
        }
        return ret;
    }
}
```


----
## 改善版

```C#
public class MessageDisplayer
{
    readonly string name;

    public Hoge(string name)
    {
        this.name = name;
    }

    public void DisplayMessage()
    {
        Console.WriteLine(GetProcessedMessage());
    }

    string GetProccessedMessage()
    {
        string ret;
        if (DateTime.Now.Minutes % 2 == 0)
        {
            ret = "Hello, " + this.name;
        }
        else
        {
            ret = "Hello, " + this.name + "!!";
        }
        return ret;
    }
}
```


----
## 妥協なき改善版

```C#
public class MessageDisplayer
{
    readonly string name;

    public Hoge(string name)
    {
        this.name = name;
    }

    public void DisplayMessage()
    {
        Console.WriteLine(GetProcessedMessage());
    }

    string GetProccessedMessage()
    {
        return
            DateTime.Now.Minutes % 2 == 0
            ? "Hello, " + this.name
            : "Hello, " + this.name + "!!"
            ;
    }
}
```
Amazonに注文した商品が届いてないのに「お届け済み」になっている場合の対処方法（解決済）

# Amazonに注文した商品が届いてないのに「お届け済み」になっている場合の対処方法（解決済）

Amazonに注文した商品が届いてないのに「お届け済み」になっている場合の対処方法（解決済）を解説します。  

## 「お届け済み」だが届いてない

<img src="https://websa12.z11.web.core.windows.net/image-data/202501/20250108/1736322881509.png" alt="image" width="70%"/>

👆こんな状況でした。配送状況は「お届け済み」になっているのに、宅配ボックスを探しても、郵便受けを探しても、同居人に聞いても、玄関周辺を探しても絶対に届いてない！！

## カスタマーサポートへの連絡方法

<img src="https://websa12.z11.web.core.windows.net/image-data/202501/20250108/1736323447129.png" alt="image" width="70%"/>

👆アカウントサービスを表示します。  

<img src="https://websa12.z11.web.core.windows.net/image-data/202501/20250108/1736323618084.png" alt="image" width="70%"/>

👆カスタマーサービスに連絡を選択します。  

<img src="https://websa12.z11.web.core.windows.net/image-data/202501/20250108/1736323803405.png" alt="image" width="70%"/>

👆届いてない商品を選択します。  

<img src="https://websa12.z11.web.core.windows.net/image-data/202501/20250108/1736323948860.png" alt="image" width="70%"/>

👆配送についてを選択します。  

<img src="https://websa12.z11.web.core.windows.net/image-data/202501/20250108/1736324023603.png" alt="image" width="70%"/>

👆「配送完了となっているが届いてない」まさにその状況です！  

<img src="https://websa12.z11.web.core.windows.net/image-data/202501/20250108/1736324168772.png" alt="image" width="70%"/>

👆カスタマーサービスへ連絡  

<img src="https://websa12.z11.web.core.windows.net/image-data/202501/20250108/1736324274781.png" alt="image" width="70%"/>

👆今すぐ電話をリクエストする。  

<img src="https://websa12.z11.web.core.windows.net/image-data/202501/20250108/1736324376842.png" alt="image" width="70%"/>

👆電話番号を入力し、今すぐ電話を受けるを選択します。

すると、直後に電話がかかってきます。  

## 原因と対処内容（私の場合）

- 中国の方と思われるオペレータの方と繋がりました。（日本語は流暢でした。）  
- 数分待たされた結果、配送途中で問題が発生したことが判明したと説明がありました。  
- なぜ配送途中で問題が発生したのに「お届け済み」なのか聞きましたが、「すみません、よく分かりません・・」とのこと・・
- 全額返金します。と言われたので、じゃぁそれで！と回答して本件終了。  
- 数年Amazon利用してますが、こんなこと初めてでした。でも、カスタマーサポートの対応にはまぁまぁ満足。  
- ただし、こっちから連絡しなかったらこの件どうなったんだ？たぶん、うやむや？  

## 本記事へのリンク

[<img src="https://websa12.z11.web.core.windows.net/image-data/202501/20250108/1736320532251.png" alt="image" width="30%"/>](https://docs.saurus12.com/tips/amazon_support)

### [https://docs.saurus12.com/tips/amazon_support](https://docs.saurus12.com/tips/amazon_support)

[keywords]  
Amazon お届け済み 届いてない 対処方法 カスタマーサポート

[Amazonに注文した商品が届いてないのに「お届け済み」になっている場合の対処方法（解決済）](https://docs.saurus12.com/tips/amazon_support)

更新日:2025年01月08日
CPUとは

## はじめに
こんにちは
名古屋で3年ほどエンジニアをしている片田と申します
[プログラムはなぜ動くのか](https://amzn.asia/d/iQ43aZs)をいまさらながらに読んだので理解したことをアウトプットしたいと思います
(高次元の理解はしていないのでご了承ください)

## 概要
今回はCPU編です
- レジスタ

- 命令の種類

### レジスタ
処理対象となる命令やデータを格納する領域

|レジスタの種類|役割|
|---|---|
|アキュムレーター|演算に利用するデータ or 演算後のデータを格納する|
|フラグレジスタ|CPUの演算状態を格納する|
|プログラムカウンタ|次に実行する命令が格納されたメモリのアドレスを格納する|
|ベースレジスタ|データ用のメモリ領域の先頭アドレスや基準値を格納する|
|インデックスレジスタ|ベースレジスタの増殖値を格納する|
|汎用レジスタ|任意のデータを格納する|
|スタックレジスタ|スタック領域の先頭アドレスを格納する

### 命令の種類

|命令の種類|内容|
|---|-|
|ジャンプ命令|直前に行われた演算の結果を参照して、ジャンプするか判断する<br>直前の演算結果はフラグレジスタに格納されている</br>|
|コール命令|関数を呼び出す命令<br>呼び出し元のアドレスをスタック領域に保存し、関数が定義してある先頭アドレスをプログラムカウンタに設定する</br>|
|リターン命令|スタック領域に保存された呼び出し元のアドレスをプログラムカウンタに設定する|
circuitjsの作法 その24

# 概要
circuitjsを調査してみた。
練習問題やってみた。

# 練習問題
リレー回路で、
ラッチ(Latch)回路、
出力反転(inversion)回路、
オルタネート(Alternate)回路、
ラチェット(ratchet)回路、
プッシュオン・プッシュオフ(Push On Push Off )回路
を作れ。
プッシュスイッチ、ONでON、2回目のONでOFFとなる回路


# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/d1939a17-f5cb-93b9-29b1-ccd22b1c84f8.png)


# ネットリスト

```
$ 1 0.000005 10.20027730826997 50 5 50 5e-11
178 368 272 368 432 6 3 0.2 0 0.05 1000000 0.02 20 0.015 0.005 0
178 560 272 560 432 6 2 0.2 0.16171423527461437 0.05 1000000 0.02 20 0.015 0.005 1
178 720 272 720 432 6 2 0.2 0.20534375786886408 0.05 1000000 0.02 20 0.015 0.005 1
g 336 432 336 448 0 0
g 528 432 528 448 0 0
g 688 432 688 448 0 0
R 144 112 80 112 0 0 40 5 0 0 0.5
s 336 144 336 208 0 1 true
w 144 112 336 112 0
w 336 208 336 272 0
w 336 112 336 144 0
w 336 112 368 112 0
w 368 112 368 272 0
w 352 432 352 464 0
w 432 432 432 464 0
w 352 464 432 464 0
w 416 272 416 240 0
w 416 240 528 240 0
w 528 240 528 272 0
w 560 272 560 112 0
w 560 112 368 112 0
w 544 432 544 464 0
w 688 272 720 272 0
w 704 432 704 464 0
w 544 464 704 464 0
w 480 464 544 464 0
w 464 272 688 272 0
w 528 240 768 240 0
w 768 240 768 272 0
w 784 432 784 464 0
w 704 464 784 464 0
162 944 240 944 304 2 default-led 1 0 0 0.01
g 944 304 944 336 0 0
w 768 240 944 240 0
w 432 464 448 464 0
w 448 464 480 464 0
w 480 432 480 464 0

```

以上。
GinでCORS設定を簡単に導入！corsミドルウェアの基本と実践的な使い方

## はじめに
API開発をしていると、クライアント（ブラウザ）とサーバー間でクロスオリジンリクエスト（CORS: Cross-Origin Resource Sharing）に遭遇することがあります。CORSを適切に設定しないと、フロントエンドからAPIを呼び出す際に「Access-Control-Allow-Origin」エラーが発生します。

本記事では、Ginフレームワークを使ったCORSの基本設定から、以下のコードを解説します。

```go
"github.com/gin-contrib/cors"

func corsMiddleware(allowOrigins []string) gin.HandlerFunc {
	config := cors.DefaultConfig()
	config.AllowOrigins = allowOrigins
	return cors.New(config)
}

router.Use(corsMiddleware(configs.Config.APICorsAllowOrigins))
```
初心者にもわかりやすく、実践的な内容に仕上げています。

## CORSとは？
### 基本的な仕組み
CORSは、ブラウザが異なるオリジン（ドメイン、プロトコル、ポートが異なるリソース）間のリクエストを制御するための仕組みです。

例：
- **フロントエンド:** `http://localhost:3000`
- **バックエンド:** `http://localhost:8080`

上記のように、ポートが異なる場合も「異なるオリジン」と見なされ、CORS設定が必要になります。


## CORSを設定しない場合のエラー例
フロントエンドからバックエンドAPIを呼び出すと、以下のようなエラーが発生することがあります。

```
Access to XMLHttpRequest at 'http://localhost:8080/api' from origin 'http://localhost:3000' has been blocked by CORS policy
```

これは、バックエンドが特定のオリジンからのリクエストを許可していないためです。

## GinでCORSを設定する方法

### 必要なパッケージ
Ginフレームワークでは、公式のCORS対応ライブラリ`github.com/gin-contrib/cors`を利用できます。このライブラリを使うと、簡単にCORS設定ができます。

以下のコマンドでパッケージをインストールします：

```bash
go get -u github.com/gin-contrib/cors
```

### コードの詳細な解説
以下のコードを見ていきます。

### CORSミドルウェアの定義
```go
func corsMiddleware(allowOrigins []string) gin.HandlerFunc {
	config := cors.DefaultConfig() // デフォルト設定を作成
	config.AllowOrigins = allowOrigins // 許可するオリジンを設定
	return cors.New(config) // 設定を元にCORSミドルウェアを生成
}
```

- ``cors.DefaultConfig()``
  - デフォルトのCORS設定を作成します。
  - デフォルトではすべてのオリジンが拒否されるため、明示的に許可するオリジンを設定する必要があります。
- ``config.AllowOrigins = allowOrigins``
  - 許可するオリジンのリストを設定します。
  - ``allowOrigins``はスライス形式（``[]string``）で渡され、例えば以下のように設定できます：

```go
allowOrigins := []string{"http://localhost:3000", "https://example.com"}
```
- ``cors.New(config)``
  - 上記で作成した設定を使い、新しいCORSミドルウェアを生成します。
  - これがGinのミドルウェアとして使用可能な形式（``gin.HandlerFunc``）を返します。

### ``router.Use``でミドルウェアを適用
```go
router.Use(corsMiddleware(configs.Config.APICorsAllowOrigins))
```
- GinのルーターにCORSミドルウェアを適用します。
- ``configs.Config.APICorsAllowOrigins``は、許可するオリジンを定義したアプリケーションの設定値です。このように外部設定から動的に許可リストを管理するのが一般的です。

ちなみに以下のように設定しています。
```go
Config = ConfigList{
	APICorsAllowOrigins: []string{"http://0.0.0.0:8001"},
}
```

## まとめ
この記事では、Ginを使ったCORS設定の基本と、その実装方法を解説しました。

### この記事のポイント
- CORSの基本的な仕組みを理解する。
- GinでCORSミドルウェアを簡単に導入する方法を学ぶ。
- 外部設定（動的なオリジン許可リスト）の活用例を知る。

CORSエラーで悩んでいる方は、ぜひこの記事を参考にしてみてください。これでスムーズにAPIをフロントエンドから利用できるようになるはずです！
DynamoDBがポイントインタイムリカバリ (PITR)をサポート！

## はじめに

AWS Whats'newのうち、サーバレスに関するものは極力追いかけたいと思います！

今回はこの記事を紹介します。

https://aws.amazon.com/jp/about-aws/whats-new/2025/01/amazon-dynamodb-configurable-point-in-time-recovery-periods/

DynamoDBが、PITRをサポートしたという内容です。
全てのリージョンですでに利用可能とのことです。

## 試してみた！

### PITR有効化

マネコン上でみてみると、バックアップのタブのところに項目がありました。

![スクリーンショット 2025-01-09 4.08.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/5eee7ce1-5b63-95dd-5f12-e3b221447f3e.png)

期間は１〜３５日で設定可能です。
料金のところでも書いてますが、ここで対象とする期間によって課金対象額が変わるのかな？

![スクリーンショット 2025-01-09 4.10.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/99dc20be-4eba-0469-cdf5-689ed8f31718.png)

### データ書き込みしてみる。

まずは、８項目データがある状況から２件ほどデータを追記します。

![スクリーンショット 2025-01-09 4.15.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/89851656-0dc6-cc00-d693-96c5799aa6eb.png)

```
aws dynamodb put-item \
    --table-name stream_test \
    --item '{"id":{"S":"100"},"name":{"S":"PITR TEST1"}}'

aws dynamodb put-item \
    --table-name stream_test \
    --item '{"id":{"S":"101"},"name":{"S":"PITR TEST2"}}'
```

これで10件になりました。

![スクリーンショット 2025-01-09 4.24.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/0aa4c507-109b-a7ea-7b36-c9637acadd49.png)

### 戻してみる。

またバックアップタブのところから、`復元`を選択してみます。

![スクリーンショット 2025-01-09 4.26.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/8d2e6d13-e465-fd4c-9a2e-9952b45d9874.png)

Auroraのバックトラックのような使い方ができるかな？と思ってましたが、復元先は別テーブルみたいです。

![スクリーンショット 2025-01-09 4.28.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/844442af-25ae-ff33-7d82-5bc3f401d2f2.png)

復旧時点が、最遅または指定のタイミングで戻せます。
日時指定の場合は、指定可能な最も最古な時間ピッタリだとエラーが出ます。

![スクリーンショット 2025-01-09 4.39.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/26b6f325-34a0-9085-383d-43d94889ceb0.png)

復旧開始後は以下のような感じで、５分程度待たされます。

小さなテーブルですが、結構時間かかるなぁといった感覚です。

![スクリーンショット 2025-01-09 4.31.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/d4c93659-552a-764b-2ed0-289271d0ce8f.png)

復旧後のテーブル見てみると、戻ってました。

![スクリーンショット 2025-01-09 4.46.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/7e4667a2-df83-3591-c9e3-b4e65e1c4038.png)

なお、復元されたテーブルには元のテーブルの指定してあったSteamの設定は引き継がれていません。

## 料金

料金はUSD 0.228/GB-月です。

> DynamoDB の PITR に対して発生する料金は、PITR が有効になっている各 DynamoDB テーブル (テーブルデータおよびローカルセカンダリインデックス) のサイズに基づいて決まります。DynamoDB では、PITR が有効なテーブルのサイズが毎月継続的にモニタリングされ、バックアップ料金が決定されます。課金は、各テーブルの PITR が無効になるまで続きます。

https://aws.amazon.com/jp/dynamodb/pricing/on-demand/

この説明だと、PITRが有効になっているテーブルそのものが課金対象のような感じがしますので、PITRの対象期間（１〜３５日）は課金には影響しないのでしょうか？

## まとめ

誤ったデータを書き換えちゃった！みたいなケースで使えそうですかね。
エネルギー分野での革新: 新しい未来を創るためのビジョン

最近、私は日本を訪問し、その高度な技術、文化、そしてイノベーションへの姿勢に深く感銘を受けました。この経験は、私の視野を広げると同時に、カザフスタンで新たな未来を築くための決意をさらに強固なものにしました。

私のキャリアはエネルギー業界を中心に展開しており、風力エネルギー、太陽光エネルギー、高電圧システムなど、さまざまな分野で技術的な課題を解決してきました。この多様な経験を通じて、私はエネルギー分野における効率性、安全性、持続可能性を向上させるための新しい方法を模索してきました。

私の経験からの学び
私のプロフェッショナルな道のりでは、次のような貴重なスキルと知識を培いました:

風力エネルギー: 風力タービンの性能最適化、機械・電気系統の診断と修理に携わり、現場での効率性向上を実現しました。
太陽光エネルギー: 太陽光発電システムの設計、テスト、運用を行い、性能向上のためのデータ分析を実施しました。
高電圧システム: 高電圧設備の保守およびトラブルシューティングに熟練しており、緊急時の対応も迅速に行っています。
これらの経験は、エネルギー分野における技術革新と現場での実践的なソリューション開発の重要性を深く理解する土台となりました。

ビジョン: エネルギー分野での新たなイノベーション
私の目標は、エネルギー業界における最新技術、特にバーチャルリアリティ（VR）や人工知能（AI）を活用して、安全性と効率性を向上させるプラットフォームを構築することです。このプラットフォームは以下を目的とします:

効率的な学習環境の提供

現場作業のシミュレーションを通じて、作業員が危険を冒さずにスキルを向上させる。
データ駆動型の意思決定支援

システムのパフォーマンスをリアルタイムで監視し、AIを活用して潜在的な問題を予測。
持続可能なエネルギー管理

再生可能エネルギーを最大限に活用するための最適なソリューションを提案。
仲間を求めて
このビジョンを実現するためには、技術だけでなく、同じ志を持つ仲間との協力が不可欠です。私は、日本のエンジニアや研究者との協働を通じて、新しい価値を創出する可能性を信じています。

もしこのアイデアに共感し、共に未来のエネルギー分野を変革していきたいと考える方がいれば、ぜひご連絡ください。私たちが持つ多様な知識と情熱を結集し、世界に影響を与えるプロジェクトを共に作り上げていきましょう。
13章 DALL-E 2の内部モデルの解説


---

# 13章 DALL-E 2の内部モデルの解説

## 目標

- テキストから画像を生成するOpenAIの大規模言語モデル「DALL-E 2」の内部構造を調べる
- マルチモーダル学習の仕組みを理解する

---

## 13.1 マルチモーダル学習とは？

**マルチモーダル学習**とは、異なる種類のデータ（例：テキストと画像）の間で変換を行う生成モデルを訓練する手法です。

### テキストからの画像生成

テキストプロンプトから画像を生成するタスクでは、与えられた文章を高品質な画像へ変換することが目的です。モデルは以下の課題に取り組む必要があります：

- **テキストと画像の橋渡し**  
  2つの領域間の共有表現を学習し、情報の欠落なく変換を行う。
- **新しい概念とスタイルの理解**  
  見たことのない概念やスタイルを適切に結びつける。
- **文脈の理解**  
  単語が文脈で持つ意味を学び、それを画像に正確に反映する。

---

## 13.2 DALL-E 2の内部構造

DALL-Eは、2021年2月にリリースされ、進化版のDALL-E 2は2022年4月に登場しました。以下では、そのアーキテクチャを解説します。

### 13.2.1 アーキテクチャの概要

![download.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2571787/406373b4-d307-abcc-adb5-6205b16e5b65.jpeg)

DALL-E 2の処理フローは以下の通りです：

1. **テキストエンコーダ**  
   テキストプロンプトを埋め込みベクトルに変換します
2. **ブライア（Prior）**  
   テキスト埋め込みを画像埋め込みに変換します
3. **デコーダ**  
   画像埋め込みを条件として画像を生成します

---

### 13.2.2 テキストエンコーダ

**目的：** テキストプロンプトを潜在空間の埋め込みベクトルに変換する。  
これにより、ベクトルを基にさらなる操作が可能になります。

DALL-E 2では、**CLIP**(Contrastive Language-Image Pre-training)というモデルを使用しています。

CLIPの特徴：
- テキスト埋め込みを、対応する画像埋め込みにできるだけ近づけるように訓練
- テキストが持つ豊富な概念を理解可能

---

### 13.2.3 ブライア（Prior）

**目的：** テキスト埋め込みを、対応する画像埋め込みに変換する。

ブライアの実装には2つのアプローチが試されました：

1. **自己回帰モデル**  
   - CLIPの埋め込みペアを逐次的に変換
   - 欠点：計算効率が悪い

2. **拡散モデル**（採用）  
   - ノイズ除去過程を利用して、効率的に画像埋め込みを生成

#### 拡散ブライアの仕組み

1. **訓練プロセス**
   - CLIPで生成したテキストと画像の埋め込みを結合
   - 画像埋め込みにランダムノイズを付加
   - 拡散モデルがノイズを取り除き、元の画像埋め込みを予測

2. **生成プロセス**
   - ランダムノイズを徐々に除去して画像埋め込みを生成。

---

### 13.2.4 デコーダ

**目的：** ブライアが出力した画像埋め込みを基に、最終的な画像を生成します。

DALL-E 2のデコーダ部分では、**GLIDE**という技術が活用されています。

GLIDEの特徴：
- テキストプロンプトを基に、写実的な画像を生成可能
- CLIPを使用せず、生のテキストプロンプトから学習

---

### 13.2.5 DALL-E 2のユースケース

1. **画像のバリエーション生成**  
   ランダムノイズを変えることで、多様な画像バリエーションが得られる


2. **ブライアの重要性**  
   - ブライアがないと、情報が欠落した画像しか生成されない
   - ブライアを使うことで、正確で詳細な画像が得られる

---

### 13.2.6 制限

- モデルが訓練されたデータ範囲外の概念やスタイルを扱う場合、生成精度が低下する可能性があります

---

## まとめ

DALL-E 2は、テキストから画像を生成する際に以下の手法を駆使しています：

1. 訓練済みのCLIPモデルを使用し、テキスト埋め込みを生成
2. 拡散モデル（ブライア）を使い、画像埋め込みに変換
3. GLIDEスタイルのデコーダを用いて、最終的な画像を生成

DALL-E 2は、テキストからの画像生成だけでなく、画像バリエーション生成やその他の応用にも対応可能です。

---

## 参考文献
https://ainow.ai/2022/07/04/266033/
267日目 SAA試験 ゲートウェイまとめ 社畜♀

SAA試験勉強で似てて間違えやすいサービスの相違点をまとめました。

## ゲートウェイまとめ

### `仮想プライベートゲートウェイ(Virtual Private Gateway)`

**目的**
VPC(Virtual Private Cloud)をオンプレミス環境に接続するためのゲートウェイ

**特徴**
・VPN接続やAWS Direct Connectを介してオンプレミスネットワークとAWS間の通信を行うもの
・VPC側に配置され、オンプレミス側のカスタマーゲートウェイ(Customer Gateway)と接続


### `インターネットゲートウェイ(Internet Gateway)`

**目的**
VPC内のインスタンスをインターネットに接続させるためのゲートウェイ

**特徴**
・外部からの接続も許可される
・`パブリックIPアドレス`を持つインスタンスのみがインターネットアクセス可能

Webサーバーなど、`インターネットに公開`する必要があるアプリケーション


### `NATインスタンス(NAT Instance)`

**目的**
プライベートサブネットから外部インターネットに接続できるようにする

**特徴**
・特定のAMI (Amazon Machine Image) を利用して起動されるEC2インスタンス
・IPv4トラフィックのみをサポート
　IPv6アドレスを持つEC2インスタンスのインターネット通信を処理できない
・パブリックサブネットに存在してプライベートサブネット内のEC2インスタンスに接続する

古い環境や費用を抑えたい場合に使用。通常はNATゲートウェイの方が推奨。


### `NATゲートウェイ(NAT Gateway)`

**目的**
プライベートサブネットのインスタンスがインターネットに接続するためのマネージドサービス

**特徴**
・セキュリティを高めつつ、運用のオーバーヘッドを最小限に抑える。
・外部から直接されるリスクを回避する。
・AWSが管理するため、`高可用性`

プライベートサブネットのインスタンスが、`ソフトウェアの更新`や`外部APIの利用`のためにインターネットに接続する必要がある場合


### `Egress-Onlyインターネットゲートウェイ`

**目的**
IPv6環境で、`アウトバウンド通信のみ`を許可するゲートウェイ

**特徴**
・インターネットからの受信接続を拒否しつつ、外部サービスへの通信を許可できる。
・外部からの受信通信をブロックし、アウトバウンド通信のみを許可するため、セキュリティーポリシーを満たしながら、インスタンスから外部のアプリケーションと通信を開始することができる
・IPv6でのみ使用される。
　IPv4経由での送信専用のインターネット通信を可能にするには、代わりにNATゲートウェイを使用する。

IPv6対応のシステムで、インバウンド通信を避けたい場合


### `AWS Transit Gateway`

**目的**
`複数`のAmazonVPCやオンプレミスネットワーク間のトラフィックを１つのゲートウェイで一元的に管理およびルーティングするためのサービス

**特徴**
・各リージョンのVPC間の通信を簡単かつ効率的に管理
・大規模なネットワークアーキテクチャを簡素化

企業内で、複数のVPCやオンプレミス環境を統合的に接続する必要がある場合

<br>

## まとめ

|  サービス名  |  主な用途 |  双方向通信  |  AWS管理？  |  スケーラブル？  |
|  ----  |  ----  |  ----  |  ----  |  ---- | 
|  仮想プライベートゲートウェイ  |  オンプレミスとVPC間のVPN接続  |  双方向  |  手動管理  |  あり  |
|  インターネットゲートウェイ  |  VPCとインターネット間の通信  |  双方向  |  AWS管理  |  あり  |
|  NATインスタンス  |  プライベートサブネットのインターネット接続  |  一方向  |  手動管理  |  スケーリングが必要  |
|  NATゲートウェイ  |  プライベートサブネットからのインターネット接続  |  一方向  |  AWS管理  |  あり  |
|  Egress-Onlyインターネットゲートウェイ  |  IPv6環境でのアウトバウンド通信のみを許可  |  一方向  |  AWS管理  |  あり  |
|  AWS Transit Gateway  |  複数のVPCやオンプレ間の接続を簡素化  |  双方向  |  AWS管理  |  あり  |

<br>

## 選択のポイント

|  要件  |  選択すべきサービス  |
|  ----  |  ----  |
|  オンプレ接続が必要  |  仮想プライベートゲートウェイ  |
|  パブリックサーバーが必要  |  インターネットゲートウェイ  |
|  プライベートインスタンスのインターネットアクセス  |  NATゲートウェイ  |
|  IPv6環境でアウトバウンド通信のみ  |  Egress-Onlyインターネットゲートウェイ  |
|  複数のVPC/オンプレ接続を統合  |  AWS Transit Gateway  |

<br>

## これが出たらこれ！

・`NATインスタンス`よりも`NATゲートウェイ`を選ぶのが推奨

#### NATインスタンス vs NATゲートウェイ
|  特徴  |  NATインスタンス  |  NATゲートウェイ  |
|  ----  |  ----  |  ----  |
|  管理  |  手動管理  |  AWSが管理  |
|  冗長性  |  冗長化なし（手動で冗長化可）  |  自動的に冗長化  |
|  スケーリング  |  手動  |  自動  |
|  コスト  |  小規模環境で安価  |  大規模環境に向いている  |
|  カスタム設定  |  可能  |  不可  |
|  一時利用  |  起動・停止可能  |  常時課金  |

**ざっと覚えやすい方法**
`NATインスタンス`：金はかからないが不便
`NATゲートウェイ`：金はかかるが便利


・`Egress-Onlyインターネットゲートウェイ`は、IPv6環境が登場したら注意
・`AWS Transit Gateway`は、複雑なネットワーク構成をシンプルにするための選択肢


**TO BE CONTINUED**
Next.jsでfirebaseにデプロイできない

# はじめに
next.jsをfirebaseにデプロイしようとしていたのですが、うまくデプロイできずコードがページ上に反映されませんでした。
いくつか試して解決できたので、まとめようと思います。

# 事象
以下コマンドを実行し、firebaseの設定を行いました。
```bash
$ npm install -g firebase-tools
$ firebase login
```
firebase initで初期ファイルを作成します。
```bash
$ firebase init

You're about to initialize a Firebase project in this directory:

  /home/ryosuke_shida/nextjs-dev/tech-blog

Before we get started, keep in mind:

  * You are initializing within an existing Firebase project directory


=== Project Setup

First, let's associate this project directory with a Firebase project.
You can create multiple project aliases by running firebase use --add, 
but for now we'll just set up a default project.

i  Using project next-js-study-1ba58 (next-js-study)

=== Hosting Setup

Your public directory is the folder (relative to your project directory) that
will contain Hosting assets to be uploaded with firebase deploy. If you
have a build process for your assets, use your build's output directory.

? What do you want to use as your public directory? .next
? Configure as a single-page app (rewrite all urls to /index.html)? No
? Set up automatic builds and deploys with GitHub? No
✔  Wrote .next/404.html
✔  Wrote .next/index.html

i  Writing configuration info to firebase.json...
i  Writing project information to .firebaserc...

✔  Firebase initialization complete!
```

## この際に作成されたファイル
```.firebaserc
{
  "projects": {
    "default": "xxxxxxxxx"
  }
}
```

frameworksBackendだけ、作成後に追記しました。
インスタンス数の最小、最大を設定しています。
```firebase.json
## firebase.json

{
  "hosting": {
    "site": "xxxxxxxxx",
    "public": ".next", ## nextjsのbuildファイルが生成されるディレクトリを指定
    "ignore": ["firebase.json", "**/.*", "**/node_modules/**"]
  },
  "frameworksBackend": {
    "region": "asia-east1",
    "minInstances": 0,
    "maxInstances": 1
  }
}
```

この状態でデプロイすると以下のようにデフォルトページのままでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/802f0420-e63c-3fe0-bcf1-b38040bcf932.png)

# 解決策
以下の記事を参考に、firebase.jsonの設定を変更しました。

https://qiita.com/Sicut_study/items/4dcff2f23f32f0a47917

具体的には`public:".next"`の部分を`source:'.'`としました。

そして、この状態でデプロイしようとすると別のエラーが発生しました。
```bash
$ firebase deploy

Error: Cannot deploy a web framework from source because the experiment webframeworks is not enabled. To enable webframeworks run firebase experiments:enable webframeworks
```

翻訳すると以下のような文言です。

>エラー: 実験の Web フレームワークが有効になっていないため、ソースから Web フレームワークをデプロイできません。
>
>Web フレームワークを有効にするには、firebase experiments:enable webframeworks を実行します。

サジェストされているコマンドを実行します。
```bash
$ firebase experiments:enable webframeworks
Enabled experiment webframeworks
```

**この状態でデプロイすると、実際の編集したコードが反映されていました！**

# まとめ
firebase initだけだと、nextjsはうまくデプロイできないのでfirebase.jsonの中身を修正する必要があるようです。
また、以前まではwebframeworksの有効化も初期設定時に設定できていたみたいですが、今はできなくなっているようでした。
データのハッシュ化＆マッシュ化による強固なセキュア通信

## はじめに
今回は、セキュリティー通信についての私なりのアイデアを披露・共有させていただきます。
よろしければ、最後までお付き合いください。


## 本題
「ハッシュ, Hash」については、みなさんご存じの通り、データのダイジェストを生成する技術のことですが、この記事の中で、私が提案したいのは「マッシュ, Mash」のほうです。では、マッシュとはどのような手法・技術なのかについて説明したいと思います。

ここで、その概要について説明します。まずは、所与の元データをランダムに加工・変換する手順を決定します。これを「レシピ」と呼びます。そのレシピを受け取り側に送信します。ついで、送り手側が元データをレシピ通りに加工・変換します。これを「マッシュ化」と呼びます。
※マッシュ化とは、具体的には、元データの並びを入れ替えたり、元データにダミーのデータを混ぜ込んだりすること。

マッシュ化されたデータを複数のパケットに分割してランダムな時刻に送信します。最後に、受け取り側でパケットを合体させた上で、レシピとは逆の手順でデータを加工・変換します。すると、元通りのデータが得られます。ちなみに、加工・変換されたデータを「マッシュ」と呼びます。

以下に、手順をわかりやすく、かつ詳細に整理してみました。

1. レシピの決定: 元データをチャンクに分解してランダムに加工・変換する手順(=レシピ)を決定します
2. レシピの送信: レシピを受け取り側に送信します
3. マッシュ化: 送り手側が元データをレシピ通りに加工・変換します
4. ブロックの作成: マッシュ化されたチャンクをブロックにまとめます
5. パケットの作成: それぞれのブロックをパケットに収納します
6. ランダムな送信: それぞれのパケットをランダムな時刻に送信(=時間差送信)します
7. 受信パケットの解体: それぞれのパケットから各ブロックを取り出します
8. ブロックの解体: それぞれのブロックを取り出して各チャンクを取り出します
9. 逆マッシュ化: レシピとは逆の手順で各チャンクを逆加工・逆変換します
10. チャンクの合体: 受け取り側でチャンクを合体させます

さらに、セキュリティーを強化するために、分割後の各ブロックに「相互ハッシュ」をつけるということも考えられます。たとえば、ブロックが全部で「A, B, C」の3つあった場合、ブロックAに、B, Cのハッシュを付加して、ブロックBに、A, Cのハッシュを付加するという具合にです。これにより、通信途上での窃視を防ぎつつ、データの改竄を検出しやすくなります。


## おわりに
この手法・技術が実際にリファレンス実装されて、世の中に普及するかどうかはわかりません。しかし、単純に面白いと思ったので、記事にして共有させていただければと思いました。
また、なにか面白いアイデアが思いついたら、記事にして投稿したいと思います。
それでは、また～。