import numpy as np
# 3単語 4次元ベクトル
X = np.array([
[1, 0, 1, 0],
[0, 2, 0, 2],
[1, 1, 1, 1]
])
W_q = np.random.rand(4, 2)
W_k = np.random.rand(4, 2)
W_v = np.random.rand(4, 2)
Q = X @ W_q
K = X @ W_k
V = X @ W_v
attention_scores = Q @ K.T
dk = Q.shape[-1]
attention_scores = attention_scores / np.sqrt(dk)
def softmax(x):
e_x = np.exp(x - np.max(x, axis=-1, keepdims=True))
return e_x / e_x.sum(axis=-1, keepdims=True)
attention_weights = softmax(attention_scores)
output = attention_weights @ V
print("Input X:\n", X)
print("\nAttention Weights:\n", attention_weights)
print("\nOutput:\n", output)
Cisco Packet Tracerで演習を行う_1
Cisco Packet Tracerにsign upして、以下のページからinstallします。
https://www.netacad.com/resources/lab-downloads?courseLang=ja-JP
Packet Tracer 8.2.2 MacOS 64bit
### PC2台をクロスケーブルで接続してPing確認
① PCを2台配置する
下部の【End Devices】→【PC】をクリック
作業エリアに2台ドラッグ&ドロップ
② ケーブルで接続する
下部の【Connections】を選択
黄色の【クロスケーブル(Copper Cross-Over)】を選ぶ
PC0 → FastEthernet0 をクリック
PC1 → FastEthernet0 をクリック
③ IPアドレスを設定する
PC0 をクリック →【Desktop】タブ →【IP Configuration】
IP address: 192.168.1.1
Subnet mask: 自動で 255.255.255.0 に設定される
PC1 も同様に設定
IP address: 192.168.1.2
Subnet mask: 同じく 255.255.255.0
④ Pingを実行して確認
PC0 をクリック →【Desktop】タブ →【Command Prompt】
ping 192.168.1.2 と入力して送信
Cisco Packet Tracer PC Command Line 1.0
C:\>ping 192.168.1.2
Pinging 192.168.1.2 with 32 bytes of data:
Reply from 192.168.1.2: bytes=32 time=1ms TTL=128
Reply from 192.168.1.2: bytes=32 time=1ms TTL=128
Reply from 192.168.1.2: bytes=32 time<1ms TTL=128
Reply from 192.168.1.2: bytes=32 time<1ms TTL=128
Ping statistics for 192.168.1.2:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 1ms, Average = 0ms
おおおおおお、本の勉強とは違って、なかなか面白い
### スイッチ2960を入れる場合
ステップ1:デバイスの配置
Packet Tracer の下部「End Devices」→「PC-PT」を選んで作業エリアに2台配置(PC0、PC1)
「Switching」→「2960」を選んで中央に1台配置(SW1)
🔹 ステップ2:ケーブル接続
左下の「Connections(雷アイコン)」をクリック
[ストレートケーブル](Copper Straight-Through) を選択
以下のように接続:
PC0 の FastEthernet0 → SW1 の FastEthernet0/1
PC1 の FastEthernet0 → SW1 の FastEthernet0/2
✅ ヒント: ポート番号(0/1、0/2)で使っているポートを確認できます。ケーブルをつなぐとLEDが緑に変わればリンクアップ成功。
🔹 ステップ3:IPアドレスの設定
PC0 をクリック → 【Desktop】タブ → 【IP Configuration】
IP Address: 192.168.1.1
Subnet Mask: 255.255.255.0(自動で入力されます)
PC1 も同様に設定
IP Address: 192.168.1.2
Subnet Mask: 255.255.255.0
💡 デフォルトゲートウェイは未設定でOK(同一セグメント内なので)
🔹 ステップ4:Pingで通信確認
PC0 をクリック → 【Desktop】 → 【Command Prompt】
以下のコマンドを入力:ping 192.168.1.2
C:\>ping 192.168.1.2
Pinging 192.168.1.2 with 32 bytes of data:
Reply from 192.168.1.2: bytes=32 time=1ms TTL=128
Reply from 192.168.1.2: bytes=32 time<1ms TTL=128
Reply from 192.168.1.2: bytes=32 time<1ms TTL=128
Reply from 192.168.1.2: bytes=32 time<1ms TTL=128
Ping statistics for 192.168.1.2:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 1ms, Average = 0ms
Azureにアプリケーションをデプロイしてみる
こちらのjs, DockerベースのPlaygroundをAzureにデプロイすることを第一目標とする。
https://github.com/cmc-labo/ares
Azureに慣れていないため、storage, gateway, lb, container, function, sql database, active directoryなど各種機能は使わず、Azure Virtual Machinesのみ
### 全体の流れ
1. Azureポータル(https://portal.azure.com/)にログインする
2. 仮想マシン(vm)を作成
3. ネットワークからインバウンドルールで3000ポートの開通
4. ターミナルからsshログイン
5. git, dockerなどをインストールしてgit cloneした後にdeploy
### 仮想マシンの作成
サブスクリプション: 自分のAzureアカウントに紐づく課金形態
リソースグループ: 作成済みの選択か新規作成
仮想マシン名: VMの名前
リージョン: 東日本(Japan East)など
可用性オプション: 単一インスタンス
イメージ: OSの種類 Ubuntu 22.04 LTSなど
サイズ: B1s(1vCPU, 1GB RAM)
認証タイプ: SSH公開キー
ユーザ名: azureuserなど
SSH公開キー
インバウンドポートの規則: 22, 80
※AWSでいうVPCやセキュリティグループの作成は不要
### インバウンドルールで3000ポートの開通
作成したvmの「ネットワーク」→「ネットワーク設定」
ソース: any
ソースポート範囲: *
宛先: Any
サービス: Custom
宛先ポート範囲: 3000
プロトコル: TCP
アクション: 許可
優先度: 1000
名前: AllowAnyCustom3000Inbound
### SSH接続
vm作成時に生成したpemファイルを使用する
$ ssh -i ~/hoge/azureuser.pem azureuser@${ip}
あとはアプリを動かすのに必要なもの(git, node, npm, Dockerなど)をインストールして起動
sudo apt update sudo apt install git git clone https://github.com/cmc-labo/playground.git cd playground sudo apt install nodejs npm npm install sudo apt install dos2unix dos2unix rust-runner.sh chmod +x rust-runner.sh sudo docker build -t rust-runner . node server.js
### Azure CLI の SSH接続 と mac の SSH接続の違いについて
Azure CLI のコマンド az vm ssh -n
mac やLinux端末があるなら、直接 ssh コマンドを使うのが確実
### AzureのVPC, SecurityGroupの概念
AzureでもVNet(仮想ネットワーク)の中に作られる(自走生成される)
subnetはVNetの中に複数作ることができる
SecurityGroupはAzureではNSG(ネットワークセキュリティグループ)で、自動的に割り当てられる
Internet Gateway はAzureは自動
Elastic IPは静的 or 動的の選択が可能
Route Table 明示的に作る場合は別途設定が必要
Azureは最小入力でVMをすぐ作れるという思想
AWSとの違いを意識しながら学ぶと整理しやすい
azure-dall-e-3を使う
Azure Open AIからdall-e-3をデプロイする

これは凄い!
生成AIの画像作成はazure-dall-e以外にも stability ai などのサービスがある。


基本的にはAPIキーを取得して実行、という流れになる。
AI生成ツールの比較
1. Copilot Chat: Microsoft(+openAI) コーディング補助
2. Claude: Anthropic 長文補助
3. Gemini: Google 汎用AI・検索統合
4. Cursor: AI搭載のIDE、コーディングに特化
5. Devin: AIソフトウェアエンジニア, 自律型のコード開発
GeminiはChatGTPに比べてレスポンスの文章量が少ない印象。ChatGTPの方が丁寧で参考になりそう。
Devinは色々触って試してみたい。
ChatGTPとGithub Copilotの違い
### Chat GTP
– ブラウザやアプリでチャット形式
– モデル: GPT-4(Pro版)または GPT-3.5(無料)
– 補完のタイミング: 会話でまとめて質問・回答
– 用途: 質問・学習・エラー解析・仕様理解など広範囲
– 自然言語で深く対話可能
– 会話履歴を踏まえて提案
### GitHub Copilot
– Visual Studio Code / JetBrains / Neovim などで直接使う
– Codex(GPT-3系列)または Copilot専用モデル
– コードを書く「途中」でリアルタイム補完
– 手を動かしてコードを書くときの補助
– コメントやコードの一部を見て予測
– 開いているファイルや周辺コードだけで判断
Copilotでコードを書きながら、ChatGPTで「このコードの意味は?」「エラーの原因は?」と調べるのが効率的とのこと。
オンプレサーバの構成
[オンプレサーバの構成イメージ]
オンプレサーバ
↓
スイッチ
↓
ルータ or ファイヤウォール
↓
ONU(回線終端装置)
↓
光回線
### スイッチ: 社内機器を相互に接続する
中小企業向け: Cisco(Catalyst 1000 シリーズ), YAMAHA(SWX2200 シリーズ), NETGEAR(GS110TP, GS752TP)
中大企業向け: Cisco(Catalyst 9300, 9500シリーズ), Juniper(EX3400, EX4300), HPE Aruba(Aruba 2930F)
—
LAN内の通信を中継・管理
MACアドレスをもとに、必要なポートにだけデータを転送
**VLAN(仮想LAN)**によるセグメント分けも可能(セキュリティ・パフォーマンス向上)
L3スイッチなら、**セグメント間ルーティング(簡易ルータ機能)**も持つ
### ルータ/ファイヤフォール
中小企業向け: Cisco(Catalyst 1000 シリーズ), YAMAHA(SWX2200 シリーズ), NETGEAR(GS110TP, GS752TP)
中大企業向け: Palo Alto Networks, Fortinet, Cisco
—
ルータ:異なるネットワーク間(例:社内LAN ↔ インターネット)を中継
ファイアウォール:通信のフィルタリング・遮断で、社内ネットワークを保護
ルータの主な機能:
パケットの転送(ルーティング)
NAT変換(社内のプライベートIP ⇄ インターネットのグローバルIP)
DHCPやDNSリレー機能など
🟥 ファイアウォールの主な機能:
ポート制御/IP制限/アクセス制御(ACL)
外部からの不正アクセスをブロック
次世代型ではアンチウイルスやアプリ制御も(UTM機能)
### ONU(光回線終端装置)
NTT東西: PR-500KI、RT-500MI、RV-440NEなど
KDDI(auひかり): BL1000HW など
ソフトバンク光: HGW(型番非公開が多い)
—-
役割:光ファイバー信号(アナログ)を、デジタル信号に変換してルータへ渡す中継機器
amazonで製品名を検索すると、法人向けスイッチやルータ/ファイヤウォールがどんなものかイメージが掴める。
main.rsとlib.rsの分割
lib.rs と main.rs の両方があると、Rust は自動的にlib.rs をライブラリとしてビルドする仕組みとなっている。
lib.rs
pub fn greet(name: &str) -> String {
format!("Hello, {}!", name)
}
main.rs
use app::greet;
fn main() {
let name = "Alice";
println!("{}", greet(name));
}
Compiling app v0.1.0 (/home/vagrant/dev/work/rust/app)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 2.45s
Running `target/debug/app`
Hello, Alice!
なるほど、lib.rs はRust関連の書籍を見るとよく出てきますが、ようやく意味がわかりました。
Rustでデータベースを設計しよう9(テストケース)
#[cfg(test)]
mod tests {
use super::*;
use std::collections::HashMap;
fn create_test_table() -> Table {
let mut schema = HashMap::new();
let mut order = vec![];
let columns = vec![
("id", ColumnType::Integer, Constraint::PrimaryKey),
("name", ColumnType::Text, Constraint::None),
("age", ColumnType::Integer, Constraint::None),
];
for(i, (name, col_type, constraint)) in columns.into_iter().enumerate(){
schema.insert(
name.to_string(),
ColumnSchema {
order: i,
column_type: col_type,
constraint,
},
);
order.push(name.to_string());
}
Table {
name: "users".to_string(),
columns: Columns { schema, order },
rows: vec![],
}
}
#[test]
fn test_insert_and_find() {
let mut table = create_test_table();
let result = table.insert_row(vec![
Value::Integer(1),
Value::Text("Alice".to_string()),
Value::Integer(30),
]);
assert!(result.is_ok());
let results = table.find_rows_by_column_value("id", &Value::Integer(1));
assert_eq!(results.len(), 1);
assert_eq!(results[0][1], Value::Text("Alice".to_string()));
}
#[test]
fn test_update_by_condition() {
let mut table = create_test_table();
table.insert_row(vec![
Value::Integer(2),
Value::Text("Bob".to_string()),
Value::Integer(25),
]).unwrap();
let condition = Condition::Equals("id".to_string(), Value::Integer(2));
let updated = table.update_by_condition("name", Value::Text("Carol".to_string()), Some(condition)).unwrap();
assert_eq!(updated, 1);
let updated_rows = table.find_rows_by_column_value("id", &Value::Integer(2));
assert_eq!(updated_rows[0][1], Value::Text("Carol".to_string()));
}
#[test]
fn test_delete_by_condition() {
let mut table = create_test_table();
table.insert_row(vec![
Value::Integer(3),
Value::Text("David".to_string()),
Value::Integer(40),
]).unwrap();
let condition = Condition::Equals("id".to_string(), Value::Integer(3));
let deleted = table.delete_by_condition(Some(condition)).unwrap();
assert_eq!(deleted, 1);
let rows = table.find_rows_by_column_value("id", &Value::Integer(3));
assert_eq!(rows.len(), 0);
}
#[test]
fn test_unique_violation() {
let mut table = create_test_table();
table.insert_row(vec![
Value::Integer(4),
Value::Text("Eve".to_string()),
Value::Integer(50),
]).unwrap();
let result = table.insert_row(vec![
Value::Integer(4),
Value::Text("Eve2".to_string()),
Value::Integer(60),
]);
assert!(result.is_err());
assert!(result.unwrap_err().contains("Duplicate primary key"));
}
}
Finished `test` profile [unoptimized + debuginfo] target(s) in 4.35s
Running unittests src/main.rs (target/debug/deps/rds-a17132f561100387)
running 4 tests
test tests::test_insert_and_find … ok
test tests::test_delete_by_condition … ok
test tests::test_unique_violation … ok
test tests::test_update_by_condition … ok
test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
プロジェクトを lib.rs + main.rs に分けたい。
Rustでデータベースを設計しよう8(create tableのパーサ)
use regex::Regex;
fn main() {
let text = "CREATE TABLE users (
id integer,
name text,
age integer,
);";
println!("{}", text);
let table_re = Regex::new(r"(?i)create\s+table\s+([a-zA-Z_][a-zA-Z0-9_]*)\s*\((?s)(.*?)\)").unwrap();
if let Some(caps) = table_re.captures(text) {
let table_name = &caps[1];
let columns_str = &caps[2];
println!("table name: {}", table_name);
let column_re = Regex::new(r"(?i)([a-zA-Z_][a-zA-Z0-9_]*)\s+([a-zA-Z0-9()]+)").unwrap();
for line in columns_str.lines() {
if let Some(col_caps) = column_re.captures(line.trim()) {
let column_name = &col_caps[1];
let column_type = &col_caps[2];
println!(" column name: {}, type: {}", column_name, column_type);
}
}
} else {
println!("CREATE TABLE 文ではありません");
}
}
CREATE TABLE users (
id integer,
name text,
age integer,
);
table name: users
column name: id, type: integer
column name: name, type: text
column name: age, type: integer
これにprimary keyなどのconstrainも追加したい…
fn main() {
let text = "CREATE TABLE users (
id integer primarykey,
name text not null,
age integer
);";
println!("{}", text);
let table_re = Regex::new(r"(?is)create\s+table\s+([a-zA-Z_][a-zA-Z0-9_]*)\s*\((.*?)\)").unwrap();
if let Some(caps) = table_re.captures(text) {
let table_name = &caps[1];
let columns_str = &caps[2];
println!("table name: {}", table_name);
let column_re = Regex::new(r"(?i)^\s*([a-zA-Z_][a-zA-Z0-9_]*)\s+([a-zA-Z0-9()]+)(?:\s+(.*))?[,]?$").unwrap();
for line in columns_str.lines() {
let line = line.trim();
if line.is_empty() {
continue;
}
if let Some(col_caps) = column_re.captures(line) {
let column_name = &col_caps[1];
let column_type = &col_caps[2];
let constraint = col_caps.get(3).map_or("", |m| m.as_str()).trim();
println!(" column name: {}, type: {}, constraint: {}", column_name, column_type, if constraint.is_empty() { "None" } else { constraint });
} else {
println!(" ignored row: {}", line);
}
}
} else {
println!("CREATE TABLE 文ではありません");
}
}
CREATE TABLE users (
id integer primarykey,
name text not null,
age integer
);
table name: users
column name: id, type: integer, constraint: primarykey,
column name: name, type: text, constraint: not null,
column name: age, type: integer, constraint: None