766 Views
April 09, 25
スライド概要
株式会社MIERUNE所属 主にアプリケーションのフロントエンド開発をしています
Tauri2.0 のバックエンド DB に DuckDB を使う @northprint / MIERUNE 1 / 15
はじめに アドベントカレンダーの延長 Qiita 記事 Web だけでは手元の GeoJSON を扱うのが難しかった ローカルの GeoJSON を雑に調べられるツールを作ってみた 2 / 15
なぜ Tauri? Web アプリの制約 ローカルファイルの扱いがうまくいかなかった 雑に使えるツールが欲しかった Tauri ならできるかも? Rust + WebView 構成 軽量・高速なネイティブアプリが作れる 3 / 15
とりあえず作ってみた GeoJSON を開くものを作るところからスタート どうせなら DuckDB を使っての永続保存もやってみよう 4 / 15
しかし挫折 DuckDB を使って保存しようとしたらクラッシュ (おそらく Rust の DuckDB ラッパー周りの問題) 原因は深追いせず、AI に回避策を尋ねた 5 / 15
回避策(AI の提案) 1. GeoJSON データを受け取る 2. SQLite に一時保存 3. SQLite → DuckDB へ読み込み 4. DuckDB で空間処理(重心計算) 5. SQLite 一時ファイルを削除(本来ここはいらない) 6 / 15
得られた知見 現段階で Tauri 2.0 で DB 永続化をするなら SQLite が無難 DuckDB はインメモリで使うのが安全かも 高速で軽く、空間処理もできる 7 / 15
Rust のコマンド定義(参考)
#[tauri::command]
fn greet(name: String) -> String {
format!("Hello, {}! You've been greeted from Rust!", name)
}
fn main() {
tauri::Builder::default()
.invoke_handler(tauri::generate_handler![
greet
])
.run(tauri::generate_context!())
.expect("error while running tauri application");
}
8 / 15
フロントエンドから呼び出す(参考)
import { invoke } from "@tauri-apps/api/tauri";
async function callGreet() {
try {
const result = await invoke("greet", { name: "World" });
console.log(result);
} catch (error) {
console.error("Greeting failed:", error);
}
}
invoke()
で Rust 関数を非同期呼び出し
9 / 15
DuckDB で重心計算(参考) WITH geoms AS (SELECT ST_GeomFromGeoJSON(geom) AS geom FROM temp_geom), collected AS (SELECT ST_Collect(ARRAY_AGG(geom)) AS collected_geom FROM geoms), centroid AS (SELECT ST_Centroid(collected_geom) AS point FROM collected) SELECT ST_X(point) as lon, ST_Y(point) as lat FROM centroid GeoJSON → geometry → 重心までを SQL で 10 / 15
SQL の処理詳細(参考) 1. GeoJSON 文字列を geometry に変換 ST_GeomFromGeoJSON(geom) 2. geometry をまとめる ARRAY_AGG() → ST_Collect() 3. 重心を求める ST_Centroid() 4. 緯度経度に展開 ST_X(), ST_Y() 11 / 15
AI の働きが面白かった話 上記 SQL がエラーになったとき AI が平均を取る重心ロジックをフォールバック 関数として勝手に書いた たまに意外なアルゴリズムが返ってくるのが面白い 12 / 15
実演デモ 実際に動作している様子を紹介します ソースコード公開しました! 13 / 15
感想・まとめ DuckDB は手軽で便利 バックエンドで起きたエラーは画面に出すなど工夫が必要 Rust は AI 任せでもある程度までは OK 14 / 15
今後やってみたいこと DuckDB インメモリ専用運用への移行 Shapefile など対応 GeoJSON 編集・出力の実装(実はあったのだけど、コードが酷くて一回全部消 した) 自動アップデートやビルド改善 15 / 15