「JSConf JP(Day1)」に参加してきました

  • JSConf JPに参加してきました。
  • 1日目の参加メモです

jsconf.jp

タイムテーブル

時間 タイトル 発表者
13:00- Opening talk yosuke furukawa
13:30- The State of JavaScript Raphaël Benitte and Sacha Greif
14:15- 「繋がり」の可視化 Nadieh Bremer
WebAuthnで実現する安全・快適なログイン Eiji Kitamura / えーじ
JavaScript AST プログラミング: 入門とその1歩先へ Takuto Wada
14:45- オープンソース」の定義 Henry Zhu
覚醒するアクセシビリティ Lena Morita
4年分のプロシージャルなJS Andy Hall
15:30- Building and Deploying for the Modern Web with JAMstack Guillermo Rauch
Wrap-up: High Performance JavaScript Sho Miyamoto
JS開発者のためのSEOテクニック Martin Splitt
16:00- Write What Not How Jorge Bucaran
How to Boost Your Code with WebAssembly FUJI Goro / @gfx
Playing Pokémon Together with Node.js Samuel Agnew
16:45- Deno - JavaScript の新たな道筋 Kitson Kelly
Streams APIをちゃんと理解する 加藤 健志
You might also like... Maria Clara
17:15- Headers for Hackers Andrew Betts
Make it Declarative with React Toru Kobayashi
Web Accessibilityのすゝめ Nazanin Delam
18:45- 予測的 Prefetching によるパフォーマンス改善 Praveen Yedidi
18:55- Web Components era phase 2 Yoshiki Shibukawa
19:05- Cache Me If You Can Maxi Ferreira
19:15- Node.js でつくる Node.js - WASM/WASI ミニミニコンパイラー がねこまさし
19:25- React アプリのライセンス違反について dynamis

The State of JavaScript

  • Raphaël Benitte
  • Sacha Greif

JavaScriptの歴史

stateofjs.com

stateofcss.com

ES2019

  • Array.flat()
  • Object.formEntries()
  • Optional Catch Binding

フレームワーク

  • React
    • 使ってる人多いしそのほとんどがまた使いたいと言ってる
  • Vue
    • Reactよりは少ないけどのびてる
  • Svelte
    • 使ってる人は少ないけど学んでみたいという人は多い
  • Gatsby
    • 横ばい
  • Next.js
    • のびてる
  • ホスティングサービスも充実してきている
    • Netlify
    • Now
  • TypeScriptは60%くらいの人が使っている

WebAuthnで実現する安全・快適なログイン

  • Eiji Kitamuraさん

パスワードの問題点

  • Weak
  • Forgotten
  • Reused
  • Stolen

パスワードどうやって盗まれるか

ハックされる確率

  • キーロガーだと通常の40倍
  • フィッシングだと500倍
    • パスワード以外の情報もとられているケースが多いから
  • 被害の80%がフィッシング

パスワードが盗まれないようにする対策

  • 2段階認証
  • ワンタイムパスワード
    • SMS
    • フィッシングには弱い
    • 短時間有効なパスワードでもその場で送られたら意味がない
  • そこでWebAuthn

WebAuthn

  • これまでよりも強力なブラウザの認証
    • EdgeもFFも対応
    • Safariは部分的(でも時期に対応するだろう)
  • ハードウェアの鍵を使う(Authenticator)
  • 公開鍵暗号を活用した方式
  • Authenticatorにキーペアを作らせる
    • 公開鍵をサービスに送ってRegistrationする
  • 秘密鍵で署名をしてそれをサービスに送る
    • サービスは公開鍵で検証
    • 同じハードウェアを持っている人であると証明できる
  • 鍵はWebサイトのオリジンと紐付いて生成される
    • フィッシングに強い
    • たとえ盗んでも成功しない

二要素認証

  • ハードウェアをもっているという認証 + 記憶による認証
    • 多要素と多段階は違う
    • 記憶、所持、生体といった要素を複数組み合わせるのが多要素認証
  • セキュリティキー
    • PCに接続するとブラウザにポップアップ出る
    • ジェスチャーをすると署名を生成して送ってくれる
    • 名前をつけて登録する
      • キーをなくしてしまったら消せるように
    • SMS Codeも強いけどセキュリティキーの方が強固
  • 署名をサーバに送って登録されているものと同一であることを確認する
    • このサーバをFIDOサーバと呼ぶ

Authenticator

Roaming Authenticator

  • Authenticatorの1つにセキュリティキーがある
    • U2FかFIDO2に対応しているAuthenticatorであれば間違いない
  • R持ち運びできるからoaming Authenticatorと呼ばれる

Platform Authenticator

  • バイスに埋まってるから専用のものを買わせる必要がない
  • 指紋認証などで使うことも多いけど端末のロックNoなども同等の扱い
  • Local User Verification(LUV)
    • ローカルで生体と所持の二要素認証する
    • スマホで生体認証とかするとこれが実現できる
    • 生体情報はデバイスにしかないから安心(だからLocal User Verification)
      • つまり新しいデバイスに替えたら再登録が必要

再認証(Re-authentication)

  • お金を払う手前とかで再度認証させるやつとか
    • ログインしてる状態でもう一度認証を求めるやつ
  • Pixel4の顔認証はまだ使えないけどChrome79から使える

参考

  • https:/goo.gle/FIDO
  • WebAuthnのコードラボもある

覚醒するアクセシビリティ

アクセシビリティ

  • 蔑ろにされることが多い
    • 不便と思う人を低く見積もりすぎ
    • 誰でも使えるようになることのよさを知らない
  • 障害者/健常者という区別がよくない
    • 環境や状況によって不便に感じることは誰でも起こりうる

Webにおけるアクセシビリティ

  • Webは世界中どこからでもアクセスできる
    • ブラウザの拡張などでカスタマイズできる

広義のアクセシビリティ

Wrap-up: High Performance JavaScript

  • Sho Miyamotoさん

intro

Layers

  • JavaScriptのレイヤー
    • Product
    • Runtime
      • Node
      • ブラウザ
      • Electron
    • Engine
  • JavaScriptの実装
    • サーバサイド
    • クライアントサイド

RuntimeとEngine

  • RuntimeとEngineどう違うか
    • Engine
      • parser/compile/execute
      • JIT/VM
    • Runtime
      • Engineが埋め込まれている
      • プラットフォームそれぞれのGlobalObjectを持っている
      • EventLoopをオーバーライドしてる

Optimization

  • 最適化
    • Product-level
      • memo化
      • キャッシュ
    • Runtime-level
      • 非同期
    • Engine-level
      • インラインキャッシュ
  • 効果
    • Product > Runtime > Engine
  • Micro Optimizationをするな
    • 自分でやらなくてもエンジンがやってくれる

Optimization

Server Side runtime

  • Node.js
  • イベントループ
    • 処理に時間のかかる動機処理があるとループをとめてしまう
    • 非同期でできるものはそうした方がよい
  • StreamAPI
    • Fileの読み出しとかを効率的に行える
    • Streamでないと情報を全てメモリにおいてそれを扱ってとなってしまって効率悪い

Client Side Runtime

  • ブラウザでJSが動くまで
    • fetch -> load -> parse -> compile -> execute
  • できるだけCodeCachingを使う
    • 次使う時にcompile済みになってるようにする
    • 頻繁に使われるものはServiceWorkerでcacheするといい
  • ESModules
    • ブラウザ上でimport/export
    • Preloading scripts
      • 実行はしないけどparseとcompileをしておいてくれる
  • idling
    • Idle Until Urgent
    • requestIdleCallbackを使うとCPUとかが暇な時に実行してくれる

Engine

  • V8
    • たくさん使われた処理ははやくとれるようにとか最適化してくれる
  • Inline Cache
    • Objectにどんな情報があるかを予め用意しておく?
    • ヒットしたらはやい

How to Boost Your Code with WebAssembly

  • FUJI Goroさん

WebAssemblyとは

  • ブラウザに搭載するバイトコードとその処理系仕様
  • JVMに近いけどランタイムはない

WebAssembly前夜

  • EmscriptenによってC/C++をJSにコンパイルすることができていた(2012)
    • ただし動作が非常に遅い
  • WebAssemblyに仕様議論開始(2015)
  • ブラウザにMVPレベルのサポート完了(2017)

WebAssemblyの価値

  • ブラウザにおいてはJSとできることは同じ
  • JSよりも速い
    • それが圧倒的価値
    • JSだと遅くて現実的でないことが可能になる
  • Cよりは数倍遅い
    • 安全性のために未定義動作(UB)をなくしてるから
    • この安全性が大きな利点

WebAssemblyのサポート状況

  • IE11以外は使える
    • 9割くらいのシェアのブラウザで使える

WebAssemblyの事例

  • eBayの事例
    • バーコードスキャナ

tech.ebayinc.com

言語ごとの速度イメージ

  • 1倍: C, C++, Rust
  • 3倍: Java, C#, Go, Swift
  • 5倍: JS(V8), Dart
  • 50倍: Ruby, Python, Perl, PHP
  • WebAssembly
    • WasmをV8で動かすと5倍の中では速い方

Streams APIをちゃんと理解する

  • 加藤 健志さん

StreamAPI

  • Readable Stream
  • Transform Stream
  • Writable Stream

Readable Stream

  • 読み込み可能なストリーム
  • データを分割して少しずつ読み込むことができる
  • fetchAPIのレスポンスのbodyは実はReadableStream

Writable Stream

  • 書込み可能なストリーム
  • pipeTo()を使うとReadableStreemのデータをそのままWritableStremに書き込める
  • 書き込み時にPromiseを返すと解決するまで待つので順序を保証できる
  • 分割されたデータを1つずつ順番に書き込むことができる

Transform Stream

  • 変換ストリーム
  • WritableStreamに書き込まれたデータをTransformStreamで変換してReadableStreamで読み込む
  • ReadableStreamからpipeThrough()でTransfirmStreamに渡してpipeTo()でWritableStreamに書き込める

バックプレッシャー

  • キューに空きがなくなったら通知して止めてもらう
  • Underlying Source
    • Push Source
      • 自発的にenqueueする
    • Pull Source
      • リクエストに応じてenqueueする
  • QueuingStrategy
    • highWaterMark
      • キャパシティを設定する
    • size(chunk)
      • 何をもってキューのサイズを決めるか

Streamsの今後

  • 5Gが来る
    • これまでボトルネックとされていたことが改善される
    • 大容量のファイルを配信できるようになる github.com

      - クライアントがボトルネックになる
          - Streamが役立つ!
      

Live Demo