Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Web-based Data Visualization
with Rust and WebAssembly

Yosuke Onoue
October 26, 2019

Web-based Data Visualization
with Rust and WebAssembly

Rust.Tokyo 2019の登壇資料です。
https://rust.tokyo/

Webベースのデータビジュアライゼーションの需要は高まっていますが、大量のデータをWebブラウザ上で処理するためにはパフォーマンス上の課題が発生します。そのようなWebでのパフォーマンス上の課題を解決するために、WebAssemblyと呼ばれるWebブラウザ上で実行可能なバイナリフォーマット言語が新たに整備されてきました。WebAssemblyはRustによって公式にサポートされているため、Rustの表現力とパフォーマンスの恩恵を受けながらWebAssemblyを用いた開発を行うことができます。本セッションでは、WebAssemblyの概要やRustによるWebAssembly開発の方法、RustとWebAssemblyの今後の展望をネットワークビジュアライゼーションでの事例を混じえてご紹介します。

Yosuke Onoue

October 26, 2019
Tweet

More Decks by Yosuke Onoue

Other Decks in Programming

Transcript

  1. "CPVU.F w ඌ্༸հ :PTVLF0OPVF  w ೔ຊେֶจཧֶ෦৘ใՊֶՊ।ڭत
 "TTPDJBUF1SPGFTTPS 
 %FQBSUNFOUPG*OGPSNBUJPO4DJFODF

    
 $PMMFHFPG)VNBOJUJFTBOE4DJFODFT 
 /JIPO6OJWFSTJUZ w גࣜձࣾఇࠃσʔλόϯΫ٬һݚڀһ
 7JTJUJOH3FTFBSDIFS 
 5FJLPLV%BUBCBOL -5% w *OUFSFTUT*OGPSNBUJPO7JTVBMJ[BUJPO 8FC5FDIOPMPHJFT IUUQTUXJUUFSDPN@MJLS 'PMMPX.F IUUQTWETMBCKQ
  2. 7JTVBM"OBMZUJDT 7" &SB w 4UBUJDWJTVBMJ[BUJPO JOBOBSSPXTFOTF  w 4UBUJDBMMZXSJUFTJNBHFTPSWJEFPpMFT w

    0GUFOUBLFTBMPOHUJNF w 7JTVBM"OBMZTJT w )VNBODFOUFSFE w 7JTVBMBOEJOUFSBDUJWFBOBMZUJDBMSFBTPOJOH w 8JEFSBOHFVTFSTGSPNOPOFYQFSUUPFYQFSU
  3. 3FRVJSFNFOUTGPS8FCCBTFE7" w 3FOEFSJOH1FSGPSNBODF w '14 NTQFSGSBNF  w $PNQVUBUJPOBM1FSGPSNBODF w

    $PNQVUBUJPOBMMZFYQFOTJWFBMHPSJUINT
 FH%JNFOTJPOBMSFEVDUJPO DPNQVUBUJPOBMHFPNFUSZ w 3FBMUJNFSFTQPOTFUPVTFSPQFSBUJPOT NT  w #BDLHSPVOEFYFDVUJPOGPSMPOHSVOOJOHSPVUJOF
  4. )/BUTVLBXB 4*TIJOP :0OPVF ,,ZPEB 40OBNJ BOE,,PZBNBEB l&YQMPSBUJWF7JTVBMJ[BUJPOGPS1IFOPUZQJD(FOPUZQJD /FUXPSL zJO*O1SPDPG*&&&7*4 1PTUFS

    4VQQPSUFECZ+45$3&45(SBOU/VNCFS+1.+$3 *NQMFNFOUBUJPOPG1IF(F/FU w 'SBNFXPSL7VFKT w 3FOEFSJOH8FC(- w /FUXPSL-BZPVU
 3VTUBOE8FC"TTFNCMZ
  5. (FUUJOH4UBSUFEXJUIXBTNCJOEHFO w <XBTN@CJOEHFO>"UUSJCVUFT w SFBEPOMZ DPOTUSVDUPS 
 KT@OBNF HFUUFSTFUUFS FUD

    w &YQPSUJOHGVODUJPOTBOE DMBTTFTUP+BWB4DSJQU 1 use wasm_bindgen::prelude::*; 2 3 #[wasm_bindgen] 4 pub fn twice(x: f64) -> f64 { 5 2. * x 6 } 7 8 #[wasm_bindgen] 9 pub struct Counter { 10 #[wasm_bindgen(readonly)] 11 pub value: usize, 12 } 13 14 #[wasm_bindgen] 15 impl Counter { 16 #[wasm_bindgen(constructor)] 17 pub fn new() -> Counter { 18 Counter { value: 0 } 19 } 20 21 pub fn increment(&mut self) { 22 self.value += 1; 23 } 24 } 1 import { twice, Counter } from 'examples' 2 3 console.log(twice(1.23)) 4 5 const counter = new Counter() 6 console.log(counter.value) 7 counter.increment() 8 console.log(counter.value) *O+BWB4DSJQU
  6. #VJMEBOE1VCMJTI w #VJMEXJUIXBTNQBDL w 1VCMJTIOQNQBDLBHFT w %FWFMPQBQQMJDBUJPOTXJUIXFCQBDL w 'JSTUDMBTTTVQQPSUGPS8FC"TTFNCMZ w

    DSFBUFXBTNBQQGPS+BWB4DSJQUCFHJOOFST
 IUUQTHJUIVCDPNSVTUXBTNDSFBUFXBTNBQQ $ wasm-pack build $ wasm-pack publish
  7. &SSPS)BOEMJOH w &SSXJMMCFDPOWFSUFEBTB+BWB4DSJQUFYDFQUJPO 1 import { causeError } from 'examples'

    2 3 causeError() *O+BWB4DSJQU 1 use wasm_bindgen::prelude::*; 2 3 #[wasm_bindgen(js_name=causeError)] 4 pub fn cause_error() -> Result<(), JsValue> { 5 Err("some error occured!".into()) 6 } *O3VTU
  8. 5FTUJOH w 5FTUBTOBUJWF3VTUDPEF DBOOPUUFTUXBTNTQFDJpDMPHJD  w 3VOOJOHUFTUTPOCSPXTFSTVTJOHXBTNQBDL w )FBEMFTTTVQQPSU $

    wasm-pack test --chrome 1 #![cfg(target_arch = "wasm32")] 2 3 extern crate wasm_bindgen_test; 4 use examples::*; 5 use wasm_bindgen_test::*; 6 7 wasm_bindgen_test_configure!(run_in_browser); 8 9 #[wasm_bindgen_test] 10 fn test_twice() { 11 assert_eq!(twice(1.), 2.); 12 }
  9. 8JUIPVUXFCQBDL w 8JUIPVUJNQPSUJOHXBTNpMF w 4VQQPSUFEUBSHFUT
 CVOEMFS EFGBVMU OPEFKT XFC OPNPEVMFT

    w .BOVBMJOJUJBMJ[BUJPO w %FNPIUUQTDPEFQFOJPMJLSQFOP+1KX3 $ wasm-pack build --target web
  10. 'VUVSF4QFDGPS1BSBMMFM$PNQVUBUJPO w 5ISFBET w 1UISFBETMJLF w 4IBSFENFNPSZ w "UPNJDPQFSBUJPOT w

    'JYFEXJEUIBOE-POH4*.% w 'JYFEXJEUI4*.%CJU4*.%PQFSBUJPOT w -POH4*.% CJU4*.%PQFSBUJPOT