Closed16
Remix + Rust/wasm-bindgenのテンプレートを作りたい話
Remixイケてるので作るぜ
vite-plugin-wasmが必要っぽい。
これで何とかなる。
作るものはこれ。
セルオートマトンなんだけど、Adobe Flashがサポート終了したので動かせない。
これを動くようにしたい。
ルールは次っぽい。
- セルには0から9の10パターンの数字が入る
- 自身のセルの左上、真上、右上を参照し、その合計に対して新たな値をテーブルから引く
top level await対応のためにビルドをesnextに変更。
vite-plugin-wasmも当てるとこうなる。
ビルド通るかはチェックしたほうがいいね。
import { vitePlugin as remix } from "@remix-run/dev";
import { defineConfig } from "vite";
import tsconfigPaths from "vite-tsconfig-paths";
import wasm from "vite-plugin-wasm";
declare module "@remix-run/node" {
interface Future {
v3_singleFetch: true;
}
}
export default defineConfig({
plugins: [
remix({
future: {
v3_fetcherPersist: true,
v3_relativeSplatPath: true,
v3_throwAbortReason: true,
v3_singleFetch: true,
v3_lazyRouteDiscovery: true,
},
}),
tsconfigPaths(),
wasm()
],
build: {
target: "esnext"
}
});
本来はバックエンドを持たないアプリなのでviteのみでやるべきものではある。
フルスタックアプリ&モノレポのデプロイは初めてなので悩む。
コールドスタートは気にしないのでFaaSでもいいが、Lambdaアダプターをかませるのが面倒。
AWS AppRunnerは常に一つはインスタンスが建ってしまうのでGCP Cloud Runかな。
いや、GCPはプロジェクトを建てることがもう面倒なんよな。
最小サイズでAppRunnerを作ってみる。
ローカルでnpm run buildしたものをコンテナにコピーする、いわゆるローカルビルドが楽だな。
プロダクトではGithub Actionsを使ったほうがいいけど、npm linkで開発したものをそのまま出荷できるお手軽感がいい。
FROM node:20
WORKDIR /app
COPY ./frontend .
RUN npm install
EXPOSE 3000
CMD [ "npx", "remix-serve", "build/server/index.js" ]
npm run buildするの忘れそーーーーだけどnpm run deployのスクリプトに仕込めばいいか。
肝心のwasm部分。
wasm自体早いとはいえrgba_buffer.extendをループするのは遅いかもしれない。
#[wasm_bindgen]
pub fn get_image(gene: Vec<i32>, seed: Vec<i32>, w: i32, h: i32) -> Vec<u8> {
let width = w as usize;
let height = h as usize;
let mut buffer: Vec<i32> = vec![0; width * height];
buffer[0..width].copy_from_slice(&seed);
for y in 0..height {
for x in 0..width {
if y == 0 {
continue;
}
let left = (x + width - 1) % width;
let right = (x + 1) % width;
let top_row = (y - 1) * width;
let left_top = buffer[top_row + left];
let top = buffer[top_row + x];
let right_top = buffer[top_row + right];
let sum = left_top + top + right_top;
println!("{}, {}, {}", top, right_top, left_top);
let new_value = gene[sum as usize];
buffer[y * width + x] = new_value;
}
}
let mut rgba_buffer: VecDeque<u8> = VecDeque::new();
for x in buffer {
rgba_buffer.extend([(x * 25) as u8, (x * 25) as u8, (x * 25) as u8, 255]);
}
rgba_buffer.into()
}
普通に動くね
11-16-2024 11:15:25 AM [remix-serve] http://localhost:3000 (http://169.254.172.2:3000)
11-16-2024 11:21:13 AM GET / 200 - - 111.276 ms
11-16-2024 11:22:01 AM [remix-serve] http://localhost:3000 (http://169.254.172.2:3000)
11-16-2024 11:24:51 AM GET / 200 - - 70.478 ms
11-16-2024 11:24:51 AM GET / 200 - - 97.391 ms
11-16-2024 11:24:51 AM GET / 200 - - 8.069 ms
11-16-2024 11:29:07 AM GET / 200 - - 6.590 ms
11-16-2024 11:31:52 AM npm error path /app
11-16-2024 11:31:52 AM npm error command failed
11-16-2024 11:31:52 AM npm error signal SIGTERM
11-16-2024 11:31:52 AM npm error command sh -c remix-serve build/server/index.js
11-16-2024 11:31:52 AM npm error A complete log of this run can be found in: /root/.npm/_logs/2024-11-16T02_15_18_988Z-debug-0.log
11-16-2024 11:35:09 AM GET / 200 - - 6.428 ms
11-16-2024 11:35:28 AM GET / 200 - - 5.209 ms
11-16-2024 11:36:02 AM [remix-serve] http://localhost:3000 (http://169.254.172.2:3000)
11-16-2024 11:40:57 AM GET / 200 - - 61.392 ms
11-16-2024 11:41:01 AM GET / 200 - - 5.750 ms
11-16-2024 11:46:02 AM npm error path /app
11-16-2024 11:46:02 AM npm error command failed
11-16-2024 11:46:02 AM npm error signal SIGTERM
11-16-2024 11:46:02 AM npm error command sh -c remix-serve build/server/index.js
11-16-2024 11:46:02 AM npm error A complete log of this run can be found in: /root/.npm/_logs/2024-11-16T02_21_55_437Z-debug-0.log
11-16-2024 12:33:54 PM GET / 200 - - 4.288 ms
11-16-2024 12:34:00 PM GET / 200 - - 4.566 ms
11-16-2024 12:35:41 PM GET / 200 - - 4.340 ms
11-16-2024 12:35:46 PM GET / 200 - - 4.662 ms
11-16-2024 12:35:51 PM GET / 200 - - 3.208 ms
11-16-2024 12:36:02 PM GET / 200 - - 3.521 ms
11-16-2024 12:37:17 PM GET / 200 - - 3.675 ms
11-16-2024 12:38:05 PM GET / 200 - - 4.400 ms
11-16-2024 12:44:07 PM GET / 200 - - 3.267 ms
11-16-2024 01:19:30 PM GET / 200 - - 3.189 ms
11-16-2024 01:30:17 PM GET / 200 - - 2.947 ms
11-16-2024 03:13:09 PM GET / 200 - - 3.804 ms
計算結果も正しいはず
本当はnpmにパッケージを公開したほうが楽なんだろうか。でもソース公開はなんか恥ずかしいね。
さすがにこのタイプの計算はwasmが早いはず。
レスポンスは早ければ早いほどいい。
このスクラップは5日前にクローズされました