SlideShare a Scribd company logo
1 of 58
WebAssembly text
format
で画像処理を書くぞ
2018.3.8 @UIT#2
@kawasako3
かわさこ
LINE株式会社 UIT室
Front-end Standardization チーム
開発者がLINE Platformならではの問題や手間を意識せずに
シームレスに開発を行える環境を社内外に提供すること
要するに 開発基盤づくりとか イベント企画とか
去年まではNEWSサービス開発やっていた
趣味はボードゲームとか
#divisionfm
@kitak氏とpodcastをゆるゆるやっています
今日のお題
…の前に
WebAssembly text format っ
て何?
wasmってなんかEmscriptenとかでC言語からコンパイルするんじゃないの?
人間がWebAssemblyを読んだり編集するための
wasmバイナリ形式のテキスト表現
例えば関数はこんな風に書ける
(func (param i32) (param i32) (result i32) …)
clang > wasm binary > wast の変換も可能
きっとすごいはやいんだろうな (想像)
普段のWeb開発では使わないけど ブラウザで画像とか映像処理したら楽しそう
改めて今日のお題
PSなしで背景付きの画像を
透過したい
というのが
意外と面倒くさい
単色塗りつぶし
まあこうなる
近い色を塗りつぶし
さっきよりはきれい
境界をぼかす
きれい
ちゃんとやると
結構色々やらないといけない
自動選択ツールっぽいものを
Webで実装するぞ
(せっかくだからWebAssemblyを使ってみよう)
画像データのおさらい
[255, 255, 255, 255, 0, 0, 0, 255, ..]
1px #ffffff 透明度100% 1px #000000 透明度100%
画像データは一次元配列で表せる (Uint8ClampedArray)
1byte毎にピクセルのRGBA情報が入っている
画像データのおさらい
■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■
Width * 4 (1px 4byte)
H
18番目
0番目
横幅18pxの画像データ
隣接ピクセルだけを
どう処理するか
Flood-fill
ペイントのバケツツール等で
使われているアルゴリズム
Flood-fill
選択されたピクセル■から処理を始める
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
境界線
Flood-fill
隣り合うピクセル■が同一色であるかどうか調べる
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
Flood-fill
同色だったピクセルを起点に同じ処理を繰り返す
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
Flood-fill
違う色のピクセル□はそれ以上処理しない
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
Flood-fill
繰り返せる限り処理する
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
Flood-fill
繰り返せる限り処理する
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
Flood-fill
繰り返せる限り処理する
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
Flood-fill
塗りつぶし完了
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
とりあえずJSで書く
愚直に書くとこうなる 再帰的に処理する
–Google Chrome
“Uncaught RangeError: Maximum call stack size
exceeded”
640*480の画像でも
最大307200回ループする
Flood-fill take2
周囲のピクセル■■■■をQueueに詰める
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
Queue: ■■■■
Flood-fill take2
Queueからひとつだけ■取り出して処理する
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
Queue: ■■■
Flood-fill take2
Queueに周囲のピクセル■■■を格納する
Queue: ■■■■■■
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
Flood-fill take2
Queue: ■■■■■
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
■■■■■■■■■■■□■■■■■■
Queueからひとつだけ■取り出して処理する
わかったこと
あっ すごいはやい
WebAssembly text
format
で画像処理を書くぞ
2018.3.8 @UIT#2
企画倒れ
うるせえ
オーバーエンジニアリング
だ
オラァ!セイヤ!!
(気合いで書いた)
• 直接扱えるデータは64bitまでの数値だけ
• ADD, SUB, MUL, DIV とbit演算で頑張る
• メモリは線形メモリひとつで頑張る
• wat2wasmでコンパイルして頑張る
文法はたぶんここを見て頑張るしかない
https://github.com/WebAssembly/spec/blob/master/interpreter/README.md#s-expression-syntax
抑えておきたいところ
Wast文法をちょっと解説
(スタックマシンについて)
これはどちらも return a + b;
Wast文法をちょっと解説
(local変数について)
var i = 1
Wast文法をちょっと解説
(if文について)
if (1 > 0) { ... } else { ... }
Wast文法をちょっと解説
(loop文について)
for (var i = 0; i < len; i++) { ... }
br_ifはifを満たせばbreakするという意味なので
jsと逆になるところに注意
Arrayを扱うには?
WebAssembly.Memoryを利用する
JSからはTypedArrayとして見えるので
普通に操作できる
Arrayを扱うには?
Wasm側からメモリの0番目に読み書きする場合
それはそうと
結局どうだったのか
おー すごいはやい
大きな画像でやると顕著
wasm: 299ms - js: 909ms
応用してみる
リアルタイム画像処理デモ
• JS思ったよりはやい
• Wastを書くのはそこまで大変じゃない
• 適材適所 純粋な計算処理はJSより3倍早い
• 色々できることはありそう!アイデアがあ
れば懇親会で是非話しましょう!
もっと詳しく知りたければMDNがおすすめ
結論
ありがとうございました!

More Related Content

What's hot

はじめてのUser-Agent文字列
はじめてのUser-Agent文字列はじめてのUser-Agent文字列
はじめてのUser-Agent文字列Kenta USAMI
 
WordPress 環境の構築について考えてみた
WordPress 環境の構築について考えてみたWordPress 環境の構築について考えてみた
WordPress 環境の構築について考えてみたTadashi Miyazato
 
X pages day発表_20141118 final
X pages day発表_20141118 finalX pages day発表_20141118 final
X pages day発表_20141118 finalFumiko Yamamoto
 
a-sap10「モジュールIDを理解する」
a-sap10「モジュールIDを理解する」a-sap10「モジュールIDを理解する」
a-sap10「モジュールIDを理解する」Seiko Kuchida
 
XpagesDay 2014 [A-2] スタンダードクライアントで xpages を使ってみよう
XpagesDay 2014 [A-2] スタンダードクライアントで xpages を使ってみようXpagesDay 2014 [A-2] スタンダードクライアントで xpages を使ってみよう
XpagesDay 2014 [A-2] スタンダードクライアントで xpages を使ってみようTakeshi Yoshida
 
Hands on PhotoBlog App with WordPress REST API and App Inventor
Hands on PhotoBlog App with WordPress REST API and App InventorHands on PhotoBlog App with WordPress REST API and App Inventor
Hands on PhotoBlog App with WordPress REST API and App InventorHong Chen
 
C# CloudScript Azure Functions との連携
C# CloudScript Azure Functions との連携C# CloudScript Azure Functions との連携
C# CloudScript Azure Functions との連携YutoNishine
 
WordPress アカンパターン
WordPress アカンパターンWordPress アカンパターン
WordPress アカンパターンKazue Igarashi
 
株式会社インタースペース 沖本様 登壇資料
株式会社インタースペース 沖本様 登壇資料株式会社インタースペース 沖本様 登壇資料
株式会社インタースペース 沖本様 登壇資料leverages_event
 
はじめての ASP.NET MVC
はじめての ASP.NET MVCはじめての ASP.NET MVC
はじめての ASP.NET MVCjz5 MATSUE
 
AWS で VDI / DaaS っぽいものを作ってみた
AWS で VDI / DaaS っぽいものを作ってみたAWS で VDI / DaaS っぽいものを作ってみた
AWS で VDI / DaaS っぽいものを作ってみたHideaki Aoyagi
 
XPagesDay 2014 - What's new in XPages NOW!
XPagesDay 2014 - What's new in XPages NOW!XPagesDay 2014 - What's new in XPages NOW!
XPagesDay 2014 - What's new in XPages NOW!Atsushi Sato
 
キャッチアップJavaScriptビルド - ビルドから見るJSの今/2016春
キャッチアップJavaScriptビルド -ビルドから見るJSの今/2016春キャッチアップJavaScriptビルド -ビルドから見るJSの今/2016春
キャッチアップJavaScriptビルド - ビルドから見るJSの今/2016春Kondo Hitoshi
 
Vagrantと網元で開発環境を作ってみよう
Vagrantと網元で開発環境を作ってみようVagrantと網元で開発環境を作ってみよう
Vagrantと網元で開発環境を作ってみようTakuma Morikawa
 
仮想マシンを使った開発環境の簡単共有方法
仮想マシンを使った開発環境の簡単共有方法 仮想マシンを使った開発環境の簡単共有方法
仮想マシンを使った開発環境の簡単共有方法 Hideo Takahashi
 
a-blog cmsのインポート機能を使いこなす
a-blog cmsのインポート機能を使いこなすa-blog cmsのインポート機能を使いこなす
a-blog cmsのインポート機能を使いこなすSeiko Kuchida
 
Aspnet mvc 6の今を紹介
Aspnet mvc 6の今を紹介Aspnet mvc 6の今を紹介
Aspnet mvc 6の今を紹介Makoto Nishimura
 
XPagesDay 2014【B 1】最新のモバイル ui を瞬時に作成 〜x controlsのご紹介〜
XPagesDay 2014【B 1】最新のモバイル ui を瞬時に作成 〜x controlsのご紹介〜XPagesDay 2014【B 1】最新のモバイル ui を瞬時に作成 〜x controlsのご紹介〜
XPagesDay 2014【B 1】最新のモバイル ui を瞬時に作成 〜x controlsのご紹介〜Mitsuru Katoh
 

What's hot (20)

はじめてのUser-Agent文字列
はじめてのUser-Agent文字列はじめてのUser-Agent文字列
はじめてのUser-Agent文字列
 
WordPress 環境の構築について考えてみた
WordPress 環境の構築について考えてみたWordPress 環境の構築について考えてみた
WordPress 環境の構築について考えてみた
 
X pages day発表_20141118 final
X pages day発表_20141118 finalX pages day発表_20141118 final
X pages day発表_20141118 final
 
a-sap10「モジュールIDを理解する」
a-sap10「モジュールIDを理解する」a-sap10「モジュールIDを理解する」
a-sap10「モジュールIDを理解する」
 
XpagesDay 2014 [A-2] スタンダードクライアントで xpages を使ってみよう
XpagesDay 2014 [A-2] スタンダードクライアントで xpages を使ってみようXpagesDay 2014 [A-2] スタンダードクライアントで xpages を使ってみよう
XpagesDay 2014 [A-2] スタンダードクライアントで xpages を使ってみよう
 
後期講座05
後期講座05後期講座05
後期講座05
 
Hands on PhotoBlog App with WordPress REST API and App Inventor
Hands on PhotoBlog App with WordPress REST API and App InventorHands on PhotoBlog App with WordPress REST API and App Inventor
Hands on PhotoBlog App with WordPress REST API and App Inventor
 
C# CloudScript Azure Functions との連携
C# CloudScript Azure Functions との連携C# CloudScript Azure Functions との連携
C# CloudScript Azure Functions との連携
 
WordPress アカンパターン
WordPress アカンパターンWordPress アカンパターン
WordPress アカンパターン
 
株式会社インタースペース 沖本様 登壇資料
株式会社インタースペース 沖本様 登壇資料株式会社インタースペース 沖本様 登壇資料
株式会社インタースペース 沖本様 登壇資料
 
はじめての ASP.NET MVC
はじめての ASP.NET MVCはじめての ASP.NET MVC
はじめての ASP.NET MVC
 
AWS で VDI / DaaS っぽいものを作ってみた
AWS で VDI / DaaS っぽいものを作ってみたAWS で VDI / DaaS っぽいものを作ってみた
AWS で VDI / DaaS っぽいものを作ってみた
 
XPagesDay 2014 - What's new in XPages NOW!
XPagesDay 2014 - What's new in XPages NOW!XPagesDay 2014 - What's new in XPages NOW!
XPagesDay 2014 - What's new in XPages NOW!
 
キャッチアップJavaScriptビルド - ビルドから見るJSの今/2016春
キャッチアップJavaScriptビルド -ビルドから見るJSの今/2016春キャッチアップJavaScriptビルド -ビルドから見るJSの今/2016春
キャッチアップJavaScriptビルド - ビルドから見るJSの今/2016春
 
Vagrantと網元で開発環境を作ってみよう
Vagrantと網元で開発環境を作ってみようVagrantと網元で開発環境を作ってみよう
Vagrantと網元で開発環境を作ってみよう
 
仮想マシンを使った開発環境の簡単共有方法
仮想マシンを使った開発環境の簡単共有方法 仮想マシンを使った開発環境の簡単共有方法
仮想マシンを使った開発環境の簡単共有方法
 
VIOPS10: DMM.comのインフラのこれから
VIOPS10: DMM.comのインフラのこれからVIOPS10: DMM.comのインフラのこれから
VIOPS10: DMM.comのインフラのこれから
 
a-blog cmsのインポート機能を使いこなす
a-blog cmsのインポート機能を使いこなすa-blog cmsのインポート機能を使いこなす
a-blog cmsのインポート機能を使いこなす
 
Aspnet mvc 6の今を紹介
Aspnet mvc 6の今を紹介Aspnet mvc 6の今を紹介
Aspnet mvc 6の今を紹介
 
XPagesDay 2014【B 1】最新のモバイル ui を瞬時に作成 〜x controlsのご紹介〜
XPagesDay 2014【B 1】最新のモバイル ui を瞬時に作成 〜x controlsのご紹介〜XPagesDay 2014【B 1】最新のモバイル ui を瞬時に作成 〜x controlsのご紹介〜
XPagesDay 2014【B 1】最新のモバイル ui を瞬時に作成 〜x controlsのご紹介〜
 

Similar to WebAssembly text format で画像処理を書くぞ

Microsoft loves PHP WebMatrix + Windows Azure
Microsoft loves PHP WebMatrix + Windows AzureMicrosoft loves PHP WebMatrix + Windows Azure
Microsoft loves PHP WebMatrix + Windows AzureTakeshi Shinmura
 
Asp.netとbluemixで遊んでみたお話
Asp.netとbluemixで遊んでみたお話Asp.netとbluemixで遊んでみたお話
Asp.netとbluemixで遊んでみたお話Kazunori Hamamoto
 
Computer Vision と Translator Text API 使ってみた
Computer Vision と Translator Text API 使ってみたComputer Vision と Translator Text API 使ってみた
Computer Vision と Translator Text API 使ってみたYoshito Tabuchi
 
サーバーサイド技術者不足に効くChef
サーバーサイド技術者不足に効くChefサーバーサイド技術者不足に効くChef
サーバーサイド技術者不足に効くChefMaho Takara
 
とあるメーカーのRedmine活用事例
とあるメーカーのRedmine活用事例とあるメーカーのRedmine活用事例
とあるメーカーのRedmine活用事例Shinji Tamura
 
Xamarin de:code セッション:Windows Phone / iOS / Android アプリ同時開発のススメ
Xamarin de:code セッション:Windows Phone / iOS / Android アプリ同時開発のススメXamarin de:code セッション:Windows Phone / iOS / Android アプリ同時開発のススメ
Xamarin de:code セッション:Windows Phone / iOS / Android アプリ同時開発のススメYoshito Tabuchi
 
.NET の過去、現在、そして未来
.NET の過去、現在、そして未来.NET の過去、現在、そして未来
.NET の過去、現在、そして未来Akira Inoue
 
【XP祭り2010】 ライトニングトークス 「マイクロソフトとアジャイル
【XP祭り2010】 ライトニングトークス 「マイクロソフトとアジャイル【XP祭り2010】 ライトニングトークス 「マイクロソフトとアジャイル
【XP祭り2010】 ライトニングトークス 「マイクロソフトとアジャイル智治 長沢
 
かんたんCMS Picoについて
かんたんCMS PicoについてかんたんCMS Picoについて
かんたんCMS Picoについて高見 知英
 
クラウドAPIを利用した開発について ~ セルフポータル、ストレージサービス、Infrastructure as a code ~
クラウドAPIを利用した開発について ~ セルフポータル、ストレージサービス、Infrastructure as a code ~クラウドAPIを利用した開発について ~ セルフポータル、ストレージサービス、Infrastructure as a code ~
クラウドAPIを利用した開発について ~ セルフポータル、ストレージサービス、Infrastructure as a code ~Kimihiko Kitase
 
初めてのWebプログラミング講座
初めてのWebプログラミング講座初めてのWebプログラミング講座
初めてのWebプログラミング講座DIVE INTO CODE Corp.
 
MTセミナー2011/2/21 アイデアマンズ株式会社
MTセミナー2011/2/21 アイデアマンズ株式会社MTセミナー2011/2/21 アイデアマンズ株式会社
MTセミナー2011/2/21 アイデアマンズ株式会社Kunihiko Miyanaga
 
baserCMSのstripe連携プラグインを作った話
baserCMSのstripe連携プラグインを作った話baserCMSのstripe連携プラグインを作った話
baserCMSのstripe連携プラグインを作った話Tatsuhiko Uchiba
 
イノベート・ハブ九州 Bluemix勉強会(第2回)
イノベート・ハブ九州 Bluemix勉強会(第2回)イノベート・ハブ九州 Bluemix勉強会(第2回)
イノベート・ハブ九州 Bluemix勉強会(第2回)Atsumori Sasaki
 
2017年のセキュリティ 傾向と対策講座
2017年のセキュリティ 傾向と対策講座2017年のセキュリティ 傾向と対策講座
2017年のセキュリティ 傾向と対策講座NHN テコラス株式会社
 
ネットワーク分散型フレームワークConView
ネットワーク分散型フレームワークConViewネットワーク分散型フレームワークConView
ネットワーク分散型フレームワークConViewRakuten Group, Inc.
 
マークアップエンジニアと情報アーキテクチャ
マークアップエンジニアと情報アーキテクチャマークアップエンジニアと情報アーキテクチャ
マークアップエンジニアと情報アーキテクチャ力也 伊原
 

Similar to WebAssembly text format で画像処理を書くぞ (20)

20021007
2002100720021007
20021007
 
Microsoft loves PHP WebMatrix + Windows Azure
Microsoft loves PHP WebMatrix + Windows AzureMicrosoft loves PHP WebMatrix + Windows Azure
Microsoft loves PHP WebMatrix + Windows Azure
 
My portfolio
My portfolioMy portfolio
My portfolio
 
Asp.netとbluemixで遊んでみたお話
Asp.netとbluemixで遊んでみたお話Asp.netとbluemixで遊んでみたお話
Asp.netとbluemixで遊んでみたお話
 
Computer Vision と Translator Text API 使ってみた
Computer Vision と Translator Text API 使ってみたComputer Vision と Translator Text API 使ってみた
Computer Vision と Translator Text API 使ってみた
 
サーバーサイド技術者不足に効くChef
サーバーサイド技術者不足に効くChefサーバーサイド技術者不足に効くChef
サーバーサイド技術者不足に効くChef
 
とあるメーカーのRedmine活用事例
とあるメーカーのRedmine活用事例とあるメーカーのRedmine活用事例
とあるメーカーのRedmine活用事例
 
Xamarin de:code セッション:Windows Phone / iOS / Android アプリ同時開発のススメ
Xamarin de:code セッション:Windows Phone / iOS / Android アプリ同時開発のススメXamarin de:code セッション:Windows Phone / iOS / Android アプリ同時開発のススメ
Xamarin de:code セッション:Windows Phone / iOS / Android アプリ同時開発のススメ
 
.NET の過去、現在、そして未来
.NET の過去、現在、そして未来.NET の過去、現在、そして未来
.NET の過去、現在、そして未来
 
【XP祭り2010】 ライトニングトークス 「マイクロソフトとアジャイル
【XP祭り2010】 ライトニングトークス 「マイクロソフトとアジャイル【XP祭り2010】 ライトニングトークス 「マイクロソフトとアジャイル
【XP祭り2010】 ライトニングトークス 「マイクロソフトとアジャイル
 
かんたんCMS Picoについて
かんたんCMS PicoについてかんたんCMS Picoについて
かんたんCMS Picoについて
 
20010127
2001012720010127
20010127
 
クラウドAPIを利用した開発について ~ セルフポータル、ストレージサービス、Infrastructure as a code ~
クラウドAPIを利用した開発について ~ セルフポータル、ストレージサービス、Infrastructure as a code ~クラウドAPIを利用した開発について ~ セルフポータル、ストレージサービス、Infrastructure as a code ~
クラウドAPIを利用した開発について ~ セルフポータル、ストレージサービス、Infrastructure as a code ~
 
初めてのWebプログラミング講座
初めてのWebプログラミング講座初めてのWebプログラミング講座
初めてのWebプログラミング講座
 
MTセミナー2011/2/21 アイデアマンズ株式会社
MTセミナー2011/2/21 アイデアマンズ株式会社MTセミナー2011/2/21 アイデアマンズ株式会社
MTセミナー2011/2/21 アイデアマンズ株式会社
 
baserCMSのstripe連携プラグインを作った話
baserCMSのstripe連携プラグインを作った話baserCMSのstripe連携プラグインを作った話
baserCMSのstripe連携プラグインを作った話
 
イノベート・ハブ九州 Bluemix勉強会(第2回)
イノベート・ハブ九州 Bluemix勉強会(第2回)イノベート・ハブ九州 Bluemix勉強会(第2回)
イノベート・ハブ九州 Bluemix勉強会(第2回)
 
2017年のセキュリティ 傾向と対策講座
2017年のセキュリティ 傾向と対策講座2017年のセキュリティ 傾向と対策講座
2017年のセキュリティ 傾向と対策講座
 
ネットワーク分散型フレームワークConView
ネットワーク分散型フレームワークConViewネットワーク分散型フレームワークConView
ネットワーク分散型フレームワークConView
 
マークアップエンジニアと情報アーキテクチャ
マークアップエンジニアと情報アーキテクチャマークアップエンジニアと情報アーキテクチャ
マークアップエンジニアと情報アーキテクチャ
 

WebAssembly text format で画像処理を書くぞ