diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..73008fa
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,5 @@
+*/*-lock.json
+*/node_modules
+*.sqlite
+*.lock
+*target
diff --git a/docker/PixelStreamingInfrastructure/Public/player.html b/docker/PixelStreamingInfrastructure/Public/player.html
new file mode 100644
index 0000000..59b073e
--- /dev/null
+++ b/docker/PixelStreamingInfrastructure/Public/player.html
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Pixel Streaming
+
+
+
+
+
+
+
+
+
diff --git a/docker/python-oauth-web-app/Dockerfile b/docker/python-oauth-web-app/Dockerfile
new file mode 100644
index 0000000..86e031f
--- /dev/null
+++ b/docker/python-oauth-web-app/Dockerfile
@@ -0,0 +1,7 @@
+FROM syui/aios
+
+WORKDIR /app
+COPY . .
+RUN pacman -Syu rye --noconfirm
+RUN rye sync
+#CMD ["rye", "run", "flask", "run"]
diff --git a/docker/python-oauth-web-app/compose.yml b/docker/python-oauth-web-app/compose.yml
new file mode 100644
index 0000000..58fa04b
--- /dev/null
+++ b/docker/python-oauth-web-app/compose.yml
@@ -0,0 +1,10 @@
+services:
+ web:
+ build: .
+ env_file:
+ - ./.env
+ ports:
+ - "5000:5000"
+ volumes:
+ - ./demo.sqlite:/app/demo.sqlite
+ command: rye run flask run
diff --git a/docker/python-oauth-web-app/templates/base.html b/docker/python-oauth-web-app/templates/base.html
new file mode 100644
index 0000000..08c0a6f
--- /dev/null
+++ b/docker/python-oauth-web-app/templates/base.html
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+ atproto OAuth Web Service Example
+
+
+
+
+ {% if g.user %}
+ {% endif %}
+
+
+
+
+
+ {% for message in get_flashed_messages() %}
+ {{ message }}
+ {% endfor %}
+ {% block content %}{% endblock %}
+
+
+
+
diff --git a/docker/python-oauth-web-app/templates/home.html b/docker/python-oauth-web-app/templates/home.html
new file mode 100644
index 0000000..80ced36
--- /dev/null
+++ b/docker/python-oauth-web-app/templates/home.html
@@ -0,0 +1,15 @@
+{% extends 'base.html' %}
+{% block content %}
+{% if g.user %}
+
+
+
+@{{ g.user['handle'] }}
+
+
+
+
+{% else %}
+Login to get started!
+{% endif %}
+{% endblock %}
diff --git a/docker/restreamer/compose.yaml b/docker/restreamer/compose.yaml
new file mode 100644
index 0000000..3639ad8
--- /dev/null
+++ b/docker/restreamer/compose.yaml
@@ -0,0 +1,13 @@
+services:
+
+ restreamer:
+ image: datarhei/restreamer
+ #image: datarhei/restreamer:cuda-latest
+ ports:
+ - 8080:8080
+ - 1935:1935
+ - 6000:6000/udp
+ restart: always
+ volumes:
+ - ./data/config:/core/config
+ - ./data/data:/core/data
diff --git a/docker/rust-bbs/Cargo.toml b/docker/rust-bbs/Cargo.toml
new file mode 100644
index 0000000..b950790
--- /dev/null
+++ b/docker/rust-bbs/Cargo.toml
@@ -0,0 +1,11 @@
+[package]
+name = "rust-bbs"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
+actix-web = "4.0"
+url = "2.3.1"
+rusqlite = { version = "0.28", features = ["bundled"] }
+serde = { version = "1.0", features = ["derive"] }
+askama = "*"
diff --git a/docker/rust-bbs/Dockerfile b/docker/rust-bbs/Dockerfile
new file mode 100644
index 0000000..910bd0b
--- /dev/null
+++ b/docker/rust-bbs/Dockerfile
@@ -0,0 +1,7 @@
+FROM syui/aios
+
+WORKDIR /app
+COPY . .
+RUN cargo build --release
+COPY ./templates /templates
+CMD ["/app/target/release/rust-bbs"]
diff --git a/docker/rust-bbs/compose.yml b/docker/rust-bbs/compose.yml
new file mode 100644
index 0000000..3b65404
--- /dev/null
+++ b/docker/rust-bbs/compose.yml
@@ -0,0 +1,7 @@
+services:
+ web:
+ build: .
+ ports:
+ - "8782:8782"
+ volumes:
+ - ./sqlite.db:/app/sqlite.db
diff --git a/docker/rust-bbs/src/main.rs b/docker/rust-bbs/src/main.rs
new file mode 100644
index 0000000..3ac4d66
--- /dev/null
+++ b/docker/rust-bbs/src/main.rs
@@ -0,0 +1,127 @@
+use askama::Template;
+use serde::{Deserialize, Serialize};
+use rusqlite::{Connection, Result as SqliteResult};
+use actix_web::{web, App, HttpServer, HttpResponse, Responder, HttpRequest, Error};
+use actix_web::error::{ErrorInternalServerError};
+
+use std::fmt;
+impl fmt::Display for Post {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ write!(f, "@{} {}", self.handle.as_deref().unwrap_or("anonymous"), self.content)
+ }
+}
+
+#[derive(Deserialize, Default)]
+struct QueryParams {
+ handle: Option,
+}
+#[derive(Serialize, Deserialize)]
+struct Post {
+ id: i32,
+ handle: Option,
+ content: String,
+}
+
+#[derive(Template)]
+#[template(path = "index.html")]
+struct IndexTemplate {
+ posts: Vec,
+}
+
+#[derive(Template)]
+#[template(path = "post.html")]
+struct PostTemplate {}
+
+fn init_db() -> SqliteResult<()> {
+ let conn = Connection::open("sqlite.db")?;
+ conn.execute(
+ "CREATE TABLE IF NOT EXISTS posts (
+ id INTEGER PRIMARY KEY,
+ handle TEXT NOT NULL,
+ content TEXT NOT NULL
+ )",
+ [],
+ )?;
+ Ok(())
+}
+
+async fn index() -> impl Responder {
+ let conn = Connection::open("sqlite.db").unwrap();
+ let mut stmt = conn.prepare("SELECT id, handle, content FROM posts ORDER BY id DESC").unwrap();
+ let posts = stmt.query_map([], |row| {
+ Ok(Post {
+ id: row.get(0)?,
+ handle: row.get(1)?,
+ content: row.get(2)?,
+ })
+ }).unwrap().filter_map(Result::ok).collect::>();
+
+ let template = IndexTemplate { posts };
+ HttpResponse::Ok().body(template.render().unwrap())
+}
+
+async fn post_form() -> impl Responder {
+ let template = PostTemplate {};
+ HttpResponse::Ok().body(template.render().unwrap())
+}
+
+#[derive(Deserialize)]
+struct FormData {
+ handle: String,
+ content: String,
+}
+
+async fn submit_post(
+ req: HttpRequest,
+ form: web::Form
+) -> Result {
+ let query = web::Query::::from_query(req.query_string())
+ .unwrap_or_else(|_| web::Query(QueryParams { handle: None }));
+ //let handle = query.handle.clone().filter(|h| !h.is_empty());
+ //println!("Debug: Extracted handle: {:?}", handle);
+ let handle = if !form.handle.is_empty() {
+ form.handle.clone()
+ } else {
+ query.handle.clone().unwrap_or_default()
+ };
+
+ println!("Debug: Using handle: {:?}", handle);
+
+ let conn = Connection::open("sqlite.db")
+ .map_err(|_| ErrorInternalServerError("Database connection failed"))?;
+ let result = conn.execute(
+ "INSERT INTO posts (handle, content) VALUES (?1, ?2)",
+ &[&form.handle, &form.content],
+ );
+ match result {
+ Ok(_) => {
+ let redirect_url = if !handle.is_empty() {
+ format!("/?handle={}", handle)
+ } else {
+ "/".to_string()
+ };
+ Ok(HttpResponse::SeeOther()
+ .append_header(("Location",
+ redirect_url))
+ .finish())
+ },
+
+ //Ok(_) => Ok(web::Redirect::to("/").see_other()),
+ Err(_) => Err(ErrorInternalServerError("Failed to insert post")),
+ }
+}
+
+#[actix_web::main]
+async fn main() -> std::io::Result<()> {
+ init_db().unwrap();
+
+ HttpServer::new(|| {
+ App::new()
+ .route("/", web::get().to(index))
+ .route("/post", web::get().to(post_form))
+ .route("/submit", web::post().to(submit_post))
+ })
+ .bind("0.0.0.0:8782")?
+ .run()
+ .await
+}
diff --git a/docker/rust-bbs/templates/index.html b/docker/rust-bbs/templates/index.html
new file mode 100644
index 0000000..fbe4b49
--- /dev/null
+++ b/docker/rust-bbs/templates/index.html
@@ -0,0 +1,67 @@
+
+
+
+ Simple BBS
+
+
+
+ {% for post in posts %}
+ - {{ post }}
+ {% endfor %}
+
+
+
+
+
+
+
+
+
diff --git a/docker/rust-bbs/templates/post.html b/docker/rust-bbs/templates/post.html
new file mode 100644
index 0000000..0246b13
--- /dev/null
+++ b/docker/rust-bbs/templates/post.html
@@ -0,0 +1,14 @@
+
+
+
+ New Post
+
+
+ New Post
+
+
+
diff --git a/issue/screenshots/issue-9-0001.png b/issue/screenshots/issue-9-0001.png
new file mode 100755
index 0000000..08389bc
Binary files /dev/null and b/issue/screenshots/issue-9-0001.png differ
diff --git a/issue/screenshots/issue-9-0002.png b/issue/screenshots/issue-9-0002.png
new file mode 100755
index 0000000..e87c6b9
Binary files /dev/null and b/issue/screenshots/issue-9-0002.png differ
diff --git a/issue/screenshots/issue-9-0003.png b/issue/screenshots/issue-9-0003.png
new file mode 100755
index 0000000..1539db6
Binary files /dev/null and b/issue/screenshots/issue-9-0003.png differ
diff --git a/issue/screenshots/issue-9-0004.png b/issue/screenshots/issue-9-0004.png
new file mode 100755
index 0000000..7bb0701
Binary files /dev/null and b/issue/screenshots/issue-9-0004.png differ
diff --git a/plugins/vmc4ue/VMC4UEBlueprintFunctionLibrary.cpp.patch b/plugins/vmc4ue/VMC4UEBlueprintFunctionLibrary.cpp.patch
new file mode 100644
index 0000000..4d89ecd
--- /dev/null
+++ b/plugins/vmc4ue/VMC4UEBlueprintFunctionLibrary.cpp.patch
@@ -0,0 +1,56 @@
+--- ./VMC4UE/VMC4UE/Source/VMC4UE/Source/VMC4UEBlueprintFunctionLibrary.cpp
++++ ./VMC4UEBlueprintFunctionLibrary.cpp
+@@ -119,27 +119,29 @@ UVMC4UEStreamingSkeletalMeshTransform* UVMC4UEBlueprin
+ {
+ return nullptr;
+ }
+-
++
++ UVMC4UEStreamingSkeletalMeshTransform* StreamingSkeletalMeshTransform = nullptr;
++
++ // Try to get existing transform
+ {
+- // Get
+ FRWScopeLock RWScopeLock(OSCManager->RWLock, FRWScopeLockType::SLT_ReadOnly);
+- auto StreamingSkeletalMeshTransform = OSCManager->StreamingSkeletalMeshTransformMap.Find(Port);
+- if (StreamingSkeletalMeshTransform != nullptr)
++ auto FoundTransform = OSCManager->StreamingSkeletalMeshTransformMap.Find(Port);
++ if (FoundTransform != nullptr)
+ {
+- return *StreamingSkeletalMeshTransform;
++ return *FoundTransform;
+ }
+ }
++
++ // Create new transform if not found
+ {
+- // Create
+ FRWScopeLock RWScopeLock(OSCManager->RWLock, FRWScopeLockType::SLT_Write);
+- auto StreamingSkeletalMeshTransform = OSCManager->StreamingSkeletalMeshTransformMap.Find(Port);
+- if (StreamingSkeletalMeshTransform != nullptr)
++ auto FoundTransform = OSCManager->StreamingSkeletalMeshTransformMap.Find(Port);
++ if (FoundTransform != nullptr)
+ {
+- return *StreamingSkeletalMeshTransform;
++ return *FoundTransform;
+ }
+- UVMC4UEStreamingSkeletalMeshTransform* NewStreamingSkeletalMeshTransform = NewObject();
+
+- //FRWScopeLock RWScopeLock2(NewStreamingSkeletalMeshTransform->RWLock, FRWScopeLockType::SLT_Write);
++ UVMC4UEStreamingSkeletalMeshTransform* NewStreamingSkeletalMeshTransform = NewObject();
+ OSCManager->StreamingSkeletalMeshTransformMap.Emplace(Port, NewStreamingSkeletalMeshTransform);
+
+ // Bind Port
+@@ -149,9 +151,10 @@ UVMC4UEStreamingSkeletalMeshTransform* UVMC4UEBlueprin
+
+ OSCManager->OscReceivers.Emplace(OscReceiver);
+
+- return NewStreamingSkeletalMeshTransform;
++ StreamingSkeletalMeshTransform = NewStreamingSkeletalMeshTransform;
+ }
+- return nullptr;
++
++ return StreamingSkeletalMeshTransform;
+ }
+
+ void UVMC4UEBlueprintFunctionLibrary::RefreshConnection(float Seconds)
diff --git a/plugins/vmc4ue/VMC4UEBoneMappingAssetFactory.cpp.patch b/plugins/vmc4ue/VMC4UEBoneMappingAssetFactory.cpp.patch
new file mode 100644
index 0000000..2020e39
--- /dev/null
+++ b/plugins/vmc4ue/VMC4UEBoneMappingAssetFactory.cpp.patch
@@ -0,0 +1,25 @@
+--- ./VMC4UE/Source/VMC4UEEd/Source/VMC4UEBoneMappingAssetFactory.cpp
++++ ./VMC4UEBoneMappingAssetFactory.cpp
+@@ -5,6 +5,8 @@
+ #include "../../VMC4UE/Include/VMC4UEStreamingData.h"
+ #include "Dom/JsonObject.h"
+ #include "JsonObjectConverter.h"
++#include "UObject/ConstructorHelpers.h"
++#include "UObject/UObjectGlobals.h"
+
+ UVMC4UEBoneMappingAssetFactory::UVMC4UEBoneMappingAssetFactory(const FObjectInitializer &ObjectInitializer)
+ : Super(ObjectInitializer)
+@@ -26,11 +28,12 @@
+ return UVMC4UEVRMMapping::StaticClass();
+ }
+
++
+ UObject *UVMC4UEBoneMappingAssetFactory::FactoryCreateText(UClass *InClass, UObject *InParent, FName InName, EObjectFlags Flags, UObject *Context, const TCHAR *Type, const TCHAR *&Buffer, const TCHAR *BuferEnd, FFeedbackContext *Warn)
+ {
+ FString TextData = FString(Buffer);
+
+- UVMC4UEVRMMapping *NewAsset = CastChecked(StaticConstructObject_Internal(InClass, InParent, InName, Flags));
++ UVMC4UEVRMMapping* NewAsset = NewObject(InParent, InClass, InName, Flags);
+ if (!IsValid(NewAsset))
+ {
+ return nullptr;
diff --git a/plugins/vmc4ue/readme.md b/plugins/vmc4ue/readme.md
new file mode 100644
index 0000000..b0ad812
--- /dev/null
+++ b/plugins/vmc4ue/readme.md
@@ -0,0 +1,23 @@
+vmc4ue patch rebuild for `ue5.4`
+
+- https://github.com/HAL9HARUKU/VMC4UE
+- https://github.com/HAL9HARUKU/ueOSC
+- https://github.com/HAL9HARUKU/VRMMapExporter
+- https://github.com/vrm-c/UniVRM
+
+[unity](https://unity.com/)で`VRMMapExporter`から`$model.vrmmap`を作る。ABPで読み込む。
+
+`VMC4UE`は`$project.sln`を生成して`visual studio solution`でrebuildする。
+
+ただし、この方法で表情を動かすことはできない。
+
+```sh
+$ git clone https://github.com/HAL9HARUKU/VMC4UE
+$ cd VMC4UE
+$ git reset --hard b5a6cf96e5928551d8e3e20b74705e3e8f22a1df
+$ cd ..
+
+# example
+$ patch -u ./VMC4UE/VMC4UE/Source/VMC4UE/Source/VMC4UEBlueprintFunctionLibrary.cpp < VMC4UEBlueprintFunctionLibrary.cpp.patch
+$ patch -u ./VMC4UE/VMC4UE/Source/VMC4UEEd/Source/VMC4UEBoneMappingAssetFactory.cpp < VMC4UEBoneMappingAssetFactory.cpp.patch
+```
diff --git a/readme.md b/readme.md
index 3e4d6ff..3174ea3 100644
--- a/readme.md
+++ b/readme.md
@@ -1,41 +1,20 @@
# yui
-- pixel streaming : https://ue.syui.ai
- support : `windows 64bit`
-|title|推奨スペック|
+|title|spec|
|---|---|
|cpu|AMD Ryzen 7 5700X|
|memory|32GB / DDR4-3200 DIMM (PC4-25600)|
|gpu|GeForce RTX 4060Ti 8GB|
|storage|1TB M.2 NVMe SSD|
-ハイスペックなパソコンが必要です。
-
-## help
-
-web板は同じ画面と操作が共有されています。他の人がログインしてプレイしているときは邪魔しないようにしましょう。
-
-## download & start
-
-ダウンロードは数時間かかります。
-
-```sh
-# ダウンロード
-$ git clone https://git.syui.ai/ai/ue
-$ cd ue
-
-# 解凍
-$ aunpack yui.zip
-
-# 実行
-$ ./Windows/yui.exe
-```
-
## log
|version|commit|
|---|---|
-|v0.1 β|世界を作っているところ|
-|v0.2 β|物語を作った。webに対応|
+|v0.1 β|world create|
+|v0.2 β|support web|
+|v0.3 β|support vmc|
+
diff --git a/slidev/.gitignore b/slidev/.gitignore
new file mode 100644
index 0000000..52f2323
--- /dev/null
+++ b/slidev/.gitignore
@@ -0,0 +1,7 @@
+node_modules
+.DS_Store
+dist
+*.local
+.vite-inspect
+.remote-assets
+components.d.ts
diff --git a/slidev/.npmrc b/slidev/.npmrc
new file mode 100644
index 0000000..05932b8
--- /dev/null
+++ b/slidev/.npmrc
@@ -0,0 +1,3 @@
+# for pnpm
+shamefully-hoist=true
+auto-install-peers=true
diff --git a/slidev/README.md b/slidev/README.md
new file mode 100644
index 0000000..0b3e721
--- /dev/null
+++ b/slidev/README.md
@@ -0,0 +1,15 @@
+# Welcome to [Slidev](https://github.com/slidevjs/slidev)!
+
+To start the slide show:
+
+- `npm install`
+- `npm run dev`
+- visit
+
+Edit the [slides.md](./slides.md) to see the changes.
+
+Learn more about Slidev at the [documentation](https://sli.dev/).
+
+```sh
+$ slidev build --base /slide
+```
diff --git a/slidev/components/Counter.vue b/slidev/components/Counter.vue
new file mode 100644
index 0000000..eaa6a79
--- /dev/null
+++ b/slidev/components/Counter.vue
@@ -0,0 +1,37 @@
+
+
+
+
+
+ {{ counter }}
+
+
+
diff --git a/slidev/netlify.toml b/slidev/netlify.toml
new file mode 100644
index 0000000..9f91d0e
--- /dev/null
+++ b/slidev/netlify.toml
@@ -0,0 +1,16 @@
+[build]
+publish = "dist"
+command = "npm run build"
+
+[build.environment]
+NODE_VERSION = "20"
+
+[[redirects]]
+from = "/.well-known/*"
+to = "/.well-known/:splat"
+status = 200
+
+[[redirects]]
+from = "/*"
+to = "/index.html"
+status = 200
diff --git a/slidev/package.json b/slidev/package.json
new file mode 100644
index 0000000..e069d20
--- /dev/null
+++ b/slidev/package.json
@@ -0,0 +1,17 @@
+{
+ "name": "slidev",
+ "type": "module",
+ "private": true,
+ "scripts": {
+ "build": "slidev build",
+ "dev": "slidev --open",
+ "export": "slidev export"
+ },
+ "dependencies": {
+ "@slidev/cli": "^0.49.29",
+ "@slidev/theme-default": "latest",
+ "@slidev/theme-seriph": "latest",
+ "slidev-theme-eloc": "^1.0.2",
+ "vue": "^3.4.38"
+ }
+}
diff --git a/slidev/pages/imported-slides.md b/slidev/pages/imported-slides.md
new file mode 100644
index 0000000..3fff217
--- /dev/null
+++ b/slidev/pages/imported-slides.md
@@ -0,0 +1,27 @@
+# Imported Slides
+
+You can split your slides.md into multiple files and organize them as you want using the `src` attribute.
+
+#### `slides.md`
+
+```markdown
+# Page 1
+
+Page 2 from main entry.
+
+---
+
+## src: ./subpage.md
+```
+
+
+
+#### `subpage.md`
+
+```markdown
+# Page 2
+
+Page 2 from another file.
+```
+
+[Learn more](https://sli.dev/guide/syntax.html#importing-slides)
diff --git a/slidev/slides.md b/slidev/slides.md
new file mode 100644
index 0000000..8ce5869
--- /dev/null
+++ b/slidev/slides.md
@@ -0,0 +1,135 @@
+---
+theme: eloc
+class: text-center
+highlighter: shiki
+lineNumbers: false
+info: |
+ ## Slidev Starter Template
+ Presentation slides for developers.
+
+ Learn more at [Sli.dev](https://sli.dev)
+drawings:
+ persist: false
+transition: slide-left
+title: Unreal Engine 5.5 | aiue
+---
+
+# `aiue`
+
+物語は空と海に囲まれた西の都(みやこ)からはじまる...
+
+---
+
+## 配信で使える最新技術の紹介
+
+### `unreal engine`
+
+- vrm4u, vmc, livelink, streaming
+- chatgpt, atproto
+- `ai` + `ue`
+
+---
+
+## `unreal engine`
+
+- ue 5.5.0p
+- ue 5.4.4
+
+---
+
+## `vrm4u`
+
+キャラクターを表示しよう
+
+---
+
+`vmc`と`livelink`で体の動きを反映
+
+- vmcはABP
+- livelinkはCBP
+
+---
+
+## `web browser`
+
+WBPからwebを使おう
+
+---
+
+- widget3dをworldに表示させると画質が悪いので`EngineMaterials/Widget3DPassThrough`以外のmaterialを使います
+
+
+
+https://blueprintue.com/blueprint/-49_059w/
+
+---
+
+## `pixel streaming`
+
+webでゲーム配信や操作ができる
+
+```sh
+$ git clone https://github.com/EpicGamesExt/PixelStreamingInfrastructure
+$ cd ./PixelStreamingInfrastructure/SignallingWebServer/platform_scripts/cmd/
+$ ./Start_SignallingServer_nopublic.ps1
+```
+
+---
+
+## `atproto`
+
+blueskyが使っているprotocol
+
+---
+
+## `game animation sample`
+
+キャラクターの基本操作をカスタマイズ
+
+---
+
+## `city sample`
+
+人や車が動く最先端の街
+
+---
+
+## `ultra dynamic sky`
+
+- `sky atmoshpere` + `volumetric cloud`
+
+---
+
+## `whisper` + `chatgpt` + `elevenlabs`
+
+キャラ設定と会話
+
+- whisper : RuntimeSpeechRecognizer
+
+---
+
+```sh
+# perplexity.ai
+$ curl -X POST "https://api.elevenlabs.io/v1/text-to-speech/VOICE_ID" \
+ -H "xi-api-key: YOUR_API_KEY" \
+ -H "Content-Type: application/json" \
+ -d '{
+ "text": "Hello world!",
+ "model_id": "eleven_monolingual_v1",
+ "voice_settings": {
+ "stability": 0.5,
+ "similarity_boost": 0.5
+ }
+ }' \
+ --output output.mp3
+```
+
+---
+
+@syui.ai
+
+
+
+
diff --git a/slidev/snippets/external.ts b/slidev/snippets/external.ts
new file mode 100644
index 0000000..40c109b
--- /dev/null
+++ b/slidev/snippets/external.ts
@@ -0,0 +1,12 @@
+/* eslint-disable no-console */
+
+// #region snippet
+// Inside ./snippets/external.ts
+export function emptyArray(length: number) {
+ return Array.from({ length })
+}
+// #endregion snippet
+
+export function sayHello() {
+ console.log('Hello from snippets/external.ts')
+}
diff --git a/slidev/vercel.json b/slidev/vercel.json
new file mode 100644
index 0000000..9276941
--- /dev/null
+++ b/slidev/vercel.json
@@ -0,0 +1,7 @@
+{
+ "rewrites": [
+ { "source": "/(.*)", "destination": "/index.html" }
+ ],
+ "buildCommand": "npm run build",
+ "outputDirectory": "dist"
+}
diff --git a/texture/T__02.PNG b/texture/T__02.PNG
new file mode 100644
index 0000000..8b0898c
Binary files /dev/null and b/texture/T__02.PNG differ
diff --git a/verse/bgm/aiend.mp3 b/verse/bgm/aiend.mp3
new file mode 100644
index 0000000..ece695a
Binary files /dev/null and b/verse/bgm/aiend.mp3 differ
diff --git a/verse/bgm/aiend.wav b/verse/bgm/aiend.wav
new file mode 100644
index 0000000..83fc495
Binary files /dev/null and b/verse/bgm/aiend.wav differ
diff --git a/verse/bgm/aihouse.mp3 b/verse/bgm/aihouse.mp3
new file mode 100644
index 0000000..3b9d68f
Binary files /dev/null and b/verse/bgm/aihouse.mp3 differ
diff --git a/verse/bgm/aihouse.wav b/verse/bgm/aihouse.wav
new file mode 100644
index 0000000..c5fd910
Binary files /dev/null and b/verse/bgm/aihouse.wav differ
diff --git a/verse/bgm/aiverse.mp3 b/verse/bgm/aiverse.mp3
new file mode 100644
index 0000000..1b6a4a6
Binary files /dev/null and b/verse/bgm/aiverse.mp3 differ
diff --git a/verse/bgm/aiverse.wav b/verse/bgm/aiverse.wav
new file mode 100644
index 0000000..f41c4d0
Binary files /dev/null and b/verse/bgm/aiverse.wav differ
diff --git a/verse/bgm/test.wav b/verse/bgm/test.wav
new file mode 100644
index 0000000..608b2ec
Binary files /dev/null and b/verse/bgm/test.wav differ
diff --git a/verse/img/aiverse.png b/verse/img/aiverse.png
new file mode 100644
index 0000000..66c406b
Binary files /dev/null and b/verse/img/aiverse.png differ
diff --git a/verse/img/ep.mdp b/verse/img/ep.mdp
new file mode 100644
index 0000000..639d781
Binary files /dev/null and b/verse/img/ep.mdp differ
diff --git a/verse/img/ep.png b/verse/img/ep.png
new file mode 100644
index 0000000..7ac4fcb
Binary files /dev/null and b/verse/img/ep.png differ
diff --git a/verse/img/fly.gif b/verse/img/fly.gif
new file mode 100644
index 0000000..ccf7223
Binary files /dev/null and b/verse/img/fly.gif differ
diff --git a/verse/img/mode_ai.png b/verse/img/mode_ai.png
new file mode 100644
index 0000000..fb31001
Binary files /dev/null and b/verse/img/mode_ai.png differ
diff --git a/verse/img/mode_normal.png b/verse/img/mode_normal.png
new file mode 100644
index 0000000..48cd30c
Binary files /dev/null and b/verse/img/mode_normal.png differ
diff --git a/verse/img/pomudachi.gif b/verse/img/pomudachi.gif
new file mode 100644
index 0000000..536dc5c
Binary files /dev/null and b/verse/img/pomudachi.gif differ
diff --git a/verse/img/recoder.gif b/verse/img/recoder.gif
new file mode 100644
index 0000000..e42f23a
Binary files /dev/null and b/verse/img/recoder.gif differ
diff --git a/verse/img/shinryu.png b/verse/img/shinryu.png
new file mode 100644
index 0000000..96e8ef8
Binary files /dev/null and b/verse/img/shinryu.png differ
diff --git a/verse/img/ue.mdp b/verse/img/ue.mdp
new file mode 100644
index 0000000..1279f06
Binary files /dev/null and b/verse/img/ue.mdp differ
diff --git a/verse/img/ue.png b/verse/img/ue.png
new file mode 100644
index 0000000..732f45f
Binary files /dev/null and b/verse/img/ue.png differ
diff --git a/verse/img/wa.png b/verse/img/wa.png
new file mode 100644
index 0000000..a271d61
Binary files /dev/null and b/verse/img/wa.png differ
diff --git a/verse/img/wall.png b/verse/img/wall.png
new file mode 100644
index 0000000..4a8e57e
Binary files /dev/null and b/verse/img/wall.png differ
diff --git a/verse/md/ep.md b/verse/md/ep.md
new file mode 100644
index 0000000..3b95d7d
--- /dev/null
+++ b/verse/md/ep.md
@@ -0,0 +1,16 @@
+# syui・ai
+
+(シュイ・アイ)
+
+THE FUZZY ONE
+
+|title|body|
+|---|---|
+|nickname|syai|
+|age|∞|
+|height|123cm|
+|birthday|1/23|
+|lang|ja & en|
+|text|「hello ai !」 一つの言葉しか覚えられない。自分やリスナーのことをアイと呼ぶ。世界を作るのが趣味。普段は地球を歩き回っている。|
+|en|"Hello Ai!" I can only remember one word. I call myself and my listeners Ai. My hobby is creating worlds. I usually walk around the Earth.|
+
diff --git a/verse/md/ue.md b/verse/md/ue.md
new file mode 100644
index 0000000..cdc4253
--- /dev/null
+++ b/verse/md/ue.md
@@ -0,0 +1,54 @@
+# Unreal Engine 5.4 | 初めてのゲーム制作、世界を作る
+
+## vrm4u
+
+キャラクターを表示しよう。
+
+## game animation sample
+
+今後はこの形式が基本になりそう。
+
+## city sample
+
+最初に難易度と負荷を高くする。
+
+## sky atmoshpere + volumetric cloud
+
+`dynamic volumetric sky -> ultra dynamic sky`
+
+## whisper + chatgpt + elevenlabs
+
+- whisper : RuntimeSpeechRecognizer
+
+```sh
+# perplexity.ai
+$ curl https://api.openai.com/v1/chat/completions \
+ -H "Content-Type: application/json" \
+ -H "Authorization: Bearer YOUR_API_KEY" \
+ -d '{
+ "model": "gpt-4o-mini",
+ "messages": [{"role": "user", "content": "Your question here"}],
+ "temperature": 0.7
+ }'
+```
+
+```sh
+# perplexity.ai
+$ curl -X POST "https://api.elevenlabs.io/v1/text-to-speech/VOICE_ID" \
+ -H "xi-api-key: YOUR_API_KEY" \
+ -H "Content-Type: application/json" \
+ -d '{
+ "text": "Hello world!",
+ "model_id": "eleven_monolingual_v1",
+ "voice_settings": {
+ "stability": 0.5,
+ "similarity_boost": 0.5
+ }
+ }' \
+ --output output.mp3
+```
+
+## ue vs unity
+
+ueは手順通りやっても動くことは稀。つまり、動かない。そのため情報も少ない。unityがおすすめ。
+
diff --git a/verse/music/aidream.mp3 b/verse/music/aidream.mp3
new file mode 100644
index 0000000..d6263dd
Binary files /dev/null and b/verse/music/aidream.mp3 differ
diff --git a/verse/music/aimoon.mp3 b/verse/music/aimoon.mp3
new file mode 100644
index 0000000..4078d8e
Binary files /dev/null and b/verse/music/aimoon.mp3 differ
diff --git a/verse/music/aimoon.wav b/verse/music/aimoon.wav
new file mode 100644
index 0000000..1966eb1
Binary files /dev/null and b/verse/music/aimoon.wav differ
diff --git a/verse/music/aipalette.mp3 b/verse/music/aipalette.mp3
new file mode 100644
index 0000000..9ed42d8
Binary files /dev/null and b/verse/music/aipalette.mp3 differ
diff --git a/verse/readme.md b/verse/readme.md
new file mode 100644
index 0000000..9ede601
--- /dev/null
+++ b/verse/readme.md
@@ -0,0 +1,26 @@
+# aiverse
+
+aiverse project.
+
+- https://youtube.com/@syai
+
+## AI
+
+```json
+{
+ "music": "https://suno.com/@syui",
+ "anime": "https://domoai.app",
+ "3d": "https://tripo3d.ai"
+}
+```
+
+## ref
+
+- [octoverse](https://octoverse.github.com/)
+- [hololive](https://hololive.hololivepro.com/talents?gp=myth)
+
+##
+
+character, lyrics, composition, illustrations, game production, modeling, etc.
+
+© syui
diff --git a/verse/video/op.mp4 b/verse/video/op.mp4
new file mode 100644
index 0000000..f394cdc
Binary files /dev/null and b/verse/video/op.mp4 differ
diff --git a/verse/video/opload.mp4 b/verse/video/opload.mp4
new file mode 100644
index 0000000..97ba933
Binary files /dev/null and b/verse/video/opload.mp4 differ